emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[ELPA-diffs] ELPA branch, externals/w3, created. efd1e1253639f07dd04ef8b


From: Stefan Monnier
Subject: [ELPA-diffs] ELPA branch, externals/w3, created. efd1e1253639f07dd04ef8b84c14afc74c419cb5
Date: Sat, 24 Aug 2013 18:19:46 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "ELPA".

The branch, externals/w3 has been created
        at  efd1e1253639f07dd04ef8b84c14afc74c419cb5 (commit)

- Log -----------------------------------------------------------------
commit efd1e1253639f07dd04ef8b84c14afc74c419cb5
Author: Stefan Monnier <address@hidden>
Date:   Sat Aug 24 14:18:29 2013 -0400

    Massage for ELPA; try to fix compiler warnings.

diff --git a/.gitignore b/.gitignore
index 0941190..159fb02 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,4 @@
-Makefile
-w3-cfg.el
-w3-auto.el
-custom-load.el
-auto-autoloads.el
+*-autoloads.el
+*-pkg.el
+*~
 *.elc
-config.log
-config.cache
-config.status
diff --git a/ChangeLog.1 b/ChangeLog.1
index 331ad92..85e6747 100644
--- a/ChangeLog.1
+++ b/ChangeLog.1
@@ -2627,7 +2627,7 @@ Thu Mar 20 23:44:50 1997  Greg Stark  <address@hidden>
   (w3-horizontal-rule-char): New inline function 
   (w3-setup-terminal-chars): Set up all of these and make using graphic
   characters work on XEmacs using text properties (and optionally use text
-  properties on FSF Emacs too). 
+  properties on Emacs too). 
   (w3-table-hack-borders): Remove, obsoleted by w3-setup-terminal-chars
   (w3-table-unhack-borders): don't have to fiddle with
   w3-horizontal-rule-char any more.
diff --git a/ChangeLog.2 b/ChangeLog.2
index 7565780..45a6e54 100644
--- a/ChangeLog.2
+++ b/ChangeLog.2
@@ -459,14 +459,14 @@ the first one it finds.
 
 Wed May  1 21:36:37 1996  William Perry  <address@hidden>
 
-* w3-e19.el: fixed mouse waggling under fsf
+* w3-e19.el: fixed mouse waggling under Emacs
 
 * w3-vars.el: Added default for w3-source-file-hook ... automatically goes into
 html-mode (should probably do font-lock as well to get netscap'y look)
 
 * w3-draw.el: Fixed <body> tags yet again... god am I stupid
 
-* w3-e19.el: Fixed mouse movement under FSF
+* w3-e19.el: Fixed mouse movement under Emacs
 
 
 * w3.el: auto-autoload w3-do-setup
@@ -519,7 +519,7 @@ Sat Apr 27 04:31:57 1996  William Perry  <address@hidden>
 * w3-auto.el: autoload widget-forward/backward
 
 * widget-edit.el: Fix for file widget
-use 'keymap property when in xemacs, 'local-map when in fsf
+use 'keymap property when in xemacs, 'local-map when in Emacs
 
 * w3-menu.el:
 Don't put the toggle toolbar menu item up in Emacs or a XEmacs with no
@@ -781,7 +781,7 @@ Wed Mar  6 01:52:32 1996  William Perry  <address@hidden>
 
 
 * w3-imap.el:
-Fixed problem with button2 usage in w3-imap.el when compiling with FSFMacs
+Fixed problem with button2 usage in w3-imap.el when compiling with Emacs
 
 Fri Feb 23 01:58:21 1996  William Perry  <address@hidden>
 
@@ -827,7 +827,7 @@ Sat Feb 17 23:50:00 1996  William Perry  <address@hidden>
 
 
 * w3-menu.el:
-Now explicitly require easymenu for FSF19 - some older versions don't
+Now explicitly require easymenu for Emacs-19 - some older versions don't
 autoload it.  *sigh*
 
 Fri Feb 16 21:39:19 1996  William Perry  <address@hidden>
@@ -2257,7 +2257,7 @@ Thu Jun 15 23:42:26 1995  William Perry  <address@hidden>
 * w3-xemac.el: Don't call device-type with an argument.
 
 * w3-beta.el, w3-draw.el:
-Fixed a few problems with compatibility with FSF19 in X mode
+Fixed a few problems with compatibility with Emacs-19 in X mode
 
 
 * dist.Makefile: Added urlauth to makefile
@@ -2360,7 +2360,7 @@ Deal gracefully with markers passed into w3-add-zone (for 
WinEmacs)
 
 
 * w3-draw.el:
-Fixed stupid FSF 19 lossage where x-color-defined-p signals an error
+Fixed stupid Emacs 19 lossage where x-color-defined-p signals an error
 in a tty instead of failing gracefully.  Robustness?  Whassat?
 
 
@@ -2983,7 +2983,7 @@ Thu Apr 13 21:12:33 1995  William Perry  <address@hidden>
 
 * w3-style.el: w3-blend-colors now works in XEmacs 19.12
 
-* w3-style.el: Added function w3-blend-colors (FSF Emacs-19 specific)
+* w3-style.el: Added function w3-blend-colors (Emacs-19 specific)
 
 * w3-parse.el:
 Make sure to clear the minibuffer when done parsing - otherwise it
@@ -3341,7 +3341,7 @@ Tue Mar 14 16:04:04 1995  William Perry  <address@hidden>
 Mon Mar 13 05:51:41 1995  William Perry  <address@hidden>
 
 * w3-beta.el, w3-draw.el, w3-e19.el, w3-mac.el, w3-next.el, w3-old.el, 
w3-vars.el, w3-xemac.el:
-Lots and lots of doc fixes to meet FSF/GNU guidelines.
+Lots and lots of doc fixes to meet GNU guidelines.
 
 * w3-parse.el, w3.el, w3-e19.el, w3-draw.el: Few doc string fixes
 
@@ -3667,9 +3667,9 @@ Sun Jan 29 22:15:48 1995  William Perry  <address@hidden>
 Added new variable w3-right-justify-address to control whether
 text within an <address> tag is right justified.  Defaults to t.
 
-* w3-vars.el: Few new variables for fsf19
+* w3-vars.el: Few new variables for Emacs-19
 
-* w3.el: Removed special cases for fsf19 to use the old lmenu package.
+* w3.el: Removed special cases for Emacs-19 to use the old lmenu package.
 
 * w3-e19.el: No longer needs the lmenu package.
 
@@ -4467,7 +4467,7 @@ url-file-attributes, even if we had the image loaded. 
(with
 url-be-anal-about-file-attributes == t, it would do a HEAD, which was
 stupid)
 
-* w3.el: Fixed forms doubling problem in FSF emacs 19 when doing a reset.
+* w3.el: Fixed forms doubling problem in Emacs 19 when doing a reset.
 
 * w3-vars.el, w3.el:
 New variable w3-track-last-buffer.  If non-nil, M-x w3 will take you
@@ -5033,7 +5033,7 @@ completion-ignore-case to t
 
 Thu Jun  9 12:51:03 1994  William Perry  <address@hidden>
 
-* w3-e19.el: Activated the Help menu in FSF v19 again.
+* w3-e19.el: Activated the Help menu in Emacs v19 again.
 
 Wed Jun  8 01:20:36 1994  William Perry  <address@hidden>
 
@@ -5666,7 +5666,7 @@ Sun Apr 10 21:51:40 1994  William Perry  <address@hidden>
 * w3.el: No longer send the SUBMIT button when submitting forms
 
 * w3.el: New code to parse the Mosaic documents.menu file to add user-specified
-menus in lucid/FSF19
+menus in lucid/Emacs19
 
 
 Sat Apr  9 20:49:30 1994  William Perry  <address@hidden>
@@ -7044,7 +7044,7 @@ Fri Nov 26 03:52:19 1993  William M. Perry  
(address@hidden)
   wasn't one by default.
 * w3-emacs19.el: Added a few patches from Jin S Choi (address@hidden).
   Mostly fixed the hotlist menu updating code, as well as a few cosmetic
-  changes to the FSF19 menus.
+  changes to the Emacs-19 menus.
 * w3-epoch.el: Added a few patches from Henry Rowley <address@hidden> to
   fix a few functions that assumed epoch was compiled with
   add-graphic-zone.
@@ -7605,7 +7605,7 @@ Wed Sep  8 11:58:21 1993  William M. Perry  
(address@hidden)
   Will toy with it later.
 
 Tue Sep  7 07:13:36 1993  William M. Perry  (address@hidden)
-* w3-forms.el: added a (delete-overlay zone) if running FSF19 so that not
+* w3-forms.el: added a (delete-overlay zone) if running Emacs-19 so that not
   all edits are sent when you submit a form.
 * w3-forms.el: now, if a checkbox's VALUE/DEFAULT field is empty, it is
   sent as name=PRIMED, ala xmosaic.
diff --git a/ChangeLog.3 b/ChangeLog.3
deleted file mode 100644
index 7565780..0000000
--- a/ChangeLog.3
+++ /dev/null
@@ -1,8487 +0,0 @@
-Thu Jun  6 15:03:15 1996  William Perry  <address@hidden>
-
-
-* w3-auto.el: Added autoload for w3-show-dvi
-
-* w3-latex.el: w3-parse-tree-to-latex now takes optional URL argument.
-<pre> and <xmp> text now work correctly.
-Added a known-bugs section.
-Added a variable for whether to print hyperlinks as footnotes or not.
-
-
-* w3-annotat.el, w3-e19.el, w3-forms.el, w3-hot.el, w3-prefs.el, w3-xemac.el, 
w3.el:
-Replaced w3-insert w/insert - no longer needed
-
-* w3-latex.el: Added footnotes for hypertext links
-
-Wed Jun  5 20:18:36 1996  William Perry  <address@hidden>
-
-* w3-latex.el:
-Changed some things to be more like w3-draw in how it gets formatting
-informatino for each chunk
-
-* w3.el:
-Merged in new latex printing code from Stephen Peters <address@hidden>
-
-* w3-print.el: Stephen Peters <address@hidden>
-
-* w3-auto.el:
-Merged in new latex printing code from Stephen Peters <address@hidden>
-
-* w3-latex.el: Initial revision
-
-* w3-parse.el: patch from jbw for eveil <! comment syntax
-
-Mon Jun  3 20:43:37 1996  William Perry  <address@hidden>
-
-* w3-parse.el, w3-vars.el:
-added flag for whether to honor netscape style <! > comments.
-
-
-* w3-parse.el, w3-vars.el: Added alt text capabilities to w3-graphic-entities
-
-* w3-menu.el: Toggling menubar from Emacs->W3 works again
-
-* w3.el: w3-map-links works again, so does w3-complete-link
-
-* w3-e19.el, w3-xemac.el: removed old def. of w3-map-links
-
-* w3-draw.el: fixed url expansion
-
-* w3-forms.el:
-More fixes for netscape compatibility with single-text entry form
-submissions
-
-* w3-speak.el:
-Added a few patches from Raman (folding-mode stuff) and definition of
-advice for w3-scroll-up
-
-* w3-prefs.el:
-Got rid of some compiler warnings about free variables, and removed
-some bogus variables that I can get elsewhere now
-(w3-preferences-numglyphs)
-
-* w3-prefs.el: Added hooks for setting up the prefs buffer, and ok/cancel/reset
-hooks.  Fixed saving of proxy information
-
-* descrip.mms: Updated VMS MMS file
-
-* dist.Makefile: Added w3-prefs to the distribution
-
-Sun Jun  2 20:09:22 1996  William Perry  <address@hidden>
-
-* w3-draw.el: a few more emacspeak extensions
-
-
-* w3-e19.el: Fixed compile-time errors re: w3-form-element-* functions
-
-* w3-draw.el: fixed bug in w3-valid-voice-p
-
-
-* w3-speak.el: fixed some compiler warnings
-
-
-* dist.Makefile: Added w3-speak.el to the distribution
-
-* w3-speak.el:
-Move some functionality of the w3-fetch defadvice into a w3-mode-hook
-that is automatically added by w3-speak-use-voice-locking
-
-* w3-speak.el: Wow, I think it will work
-
-* w3-draw.el: reimplemented w3-echo-link
-
-* w3.el: fixed problem of not resetting the user's value of url-be-asynchronous
-in the new version of w3-download-url
-
-* w3.el: Made w3-download-url asynchronous by default, and make sure it asks
-for the filename before it starts the download.
-
-Sat Jun  1 20:04:22 1996  William Perry  <address@hidden>
-
-* w3.el: Fixed w3-download-url
-
-* w3-parse.el: Fixed graphic entities to use normal entity expansion instead of
-'STARTTAG - see commentary in the code for why exactly.
-
-* w3.el: Fixed w3-mail-document-author to do the right thing for 'made' links
-again.  Now searches for mail(to|server) links first.  If none found,
-takes the first 'made' link and fetches that.  If one found, fetch it.
-If more than one mail(to|server) link is found, present the user with
-a list and let them choose.
-
-* w3-speak.el: Initial revision
-
-Fri May 31 21:34:19 1996  William Perry  <address@hidden>
-
-* w3-draw.el, w3-style.el: Basic support for emacspeak out of the box
-
-* w3.el: Fixed typo in w3-popup-info
-
-* w3-parse.el: Fixed bug in graphic entity creation
-
-* w3.el: Added new function w3-describe-entities that lists all the entities
-currently defined.
-
-* w3-parse.el: Added in new definitions for graphic entities - they live again!
-
-* w3-vars.el: Added in new definitions for graphic entities
-
-
-Thu May 30 17:32:36 1996  William Perry  <address@hidden>
-
-
-* w3-prefs.el:
-Changed to only using one buffer instead of two stacked buffers - was
-too big a pain in the ass to navigate w/o the mouse.
-
-* w3-forms.el: fixed form submission changes
-
-* w3-draw.el:
-Supports target'ed windows to some extent (external, _blank, _top)
-
-* w3.el: delete-other-windows in w3-fetch-other-frame
-
-* w3-draw.el:
-the hyperlnk widgets now keep _all_ attributes that are specified on a
-link in them as widget properties.  This will eventually allow us to
-do targetted windows, etc.
-
-
-* w3-prefs.el: protect against errors in widget-forward
-
-* w3-prefs.el:
-Ok, cancel, and save buttons work.  Proxy configuration screen is
-complete.  Old window configuration restored when exiting.  Now
-selects the prefs window after choosing something from the toolbar
-
-* w3-sysdp.el: Added symbol-value-in-buffer
-
-
-* w3-draw.el, w3-forms.el: Single-entry form auto-submission now works again
-
-* w3-sysdp.el: Added insert-file-contents-literally function
-
-Wed May 29 21:52:40 1996  William Perry  <address@hidden>
-
-* w3-prefs.el: proxy panel sort of works
-
-* w3-print.el: Few patches to the latex printing by Stephen Peters
-<address@hidden>
-
-* w3-mouse.el: w3-follow-inlined-image works again
-
-* w3-draw.el:
-Fixed problem with paragraph filling screwups after <xmp></xmp> sections
-
-* w3-vars.el:
-new keybinding for return so that return doesn't self-insert when not
-on a hyperlink
-
-
-* font.el: don't error out on bad rgb color values
-
-* font.el: Don't error out if you cannot find the rgb.txt file
-
-* w3-parse.el:
-Supports stupid address@hidden netscape-style <! > `comments'.  What complete
-and utter horseshit.
-
-* w3-draw.el: fixed read-only errors once and for all. :)
-
-* w3-e19.el: removed old bogus definition of w3-follow-inlined-image-mouse
-
-
-* w3-prefs.el: progress
-
-* w3.el: Now correctly looks for 'stylesheet' in w3-configuration-directory.
-Avoid infinite recursion if url-be-asynch == t when
-w3-find-default-stylesheets is called
-
-* w3.el: fix for http 0.9 servers and asynchronous transfers
-
-* w3-widget.el:
-Actually added w3-image-widget-callback so 'href images work right
-
-Tue May 28 22:35:46 1996  William Perry  <address@hidden>
-
-* w3-prefs.el: Initial revision
-
-
-* w3-menu.el: Put the correct Emacs/XEmacs in the menubar toggle
-
-* w3-draw.el:
-fixed problems with badly specifid colors in netscape-crap <body> attributes
-
-* w3-forms.el: <input type=image> works minimally
-
-* w3-forms.el:
-Fixed a problem with option lists in forms.  The forms validator is cool
-
-* w3.el: previewing buffers now works much _MUCH_ better
-
-* w3.el: Added stub for w3-find-file, a more intuitive name for w3-open-local
-
-* w3-draw.el: Link-echoing now works
-
-* widget.el, widget-edit.el:
-Changed widget-forward to honor a new :help-echo property
-
-
-* widget-edit.el:
-Fix for widget-forward when widgets are _RIGHT_ on top of each other
-
-* w3.el: Fixed stupid problem on my part
-
-* w3-draw.el:
-Fix problem with <pre> segments from Mac-based web servers (^M only, no ^J)
-
-* w3.el: Don't do set-auto-mode under mule, as it wigs out with null filenames
-
-* w3.el: Fixes for www: hrefs
-
-* w3.el: Fix for file information & last-modified
-
-Mon May 27 23:08:26 1996  William Perry  <address@hidden>
-
-* w3-draw.el: problem in 19.30
-
-* w3-forms.el:
-Fixed problem with 'submit' button on forms _always_ being sent to the
-server - overanxious with making sure everything had a 'name' field at
-widget creation time.  Gack.
-
-* w3-xemac.el:
-Beginnings of a mode-motion-handler to do spiffy handling of client
-side imagemaps, etc.
-
-
-Sun May 26 01:17:31 1996  William Perry  <address@hidden>
-
-* images.el: removed duplicate converter
-
-Fri May 24 18:19:16 1996  William Perry  <address@hidden>
-
-* w3-draw.el: file: urls for images work now
-
-* w3.el: Fixed missing paren in configuration-file warning code
-
-* w3.el: New version of w3-version from "Robert J. Chassell"
-<address@hidden> that will let you do C-u M-x w3-version to insert
-the version information into the buffer at point.
-
-* w3.el, w3-hot.el, w3-forms.el, w3-emulate.el, w3-annotat.el:
-No longer use mm-insert-file-contents lossage
-
-* images.el: Added p[np]m<->ps converters
-
-
-* w3-widget.el: No more newlines after images w/alt text & no hyperlink
-
-* w3.el: Moved where w3-default-configuration gets loaded so that you can set
-some variables in it and have them honored by the rest of w3-do-setup
-
-Thu May 23 16:08:23 1996  William Perry  <address@hidden>
-
-
-* w3-draw.el:
-Now only grabs images with the same URL/SRC once per page, instead of
-starting up multiple transfers for the same one.  Yeah.
-
-* w3-menu.el: context-sensitive menus now work again on images
-
-* w3-sysdp.el: synching up with XEmacs 19.14's version
-
-* w3-sysdp.el: Added lots more device functions
-
-Wed May 22 17:08:21 1996  William Perry  <address@hidden>
-
-
-* w3-widget.el: Now checks for invalid glyphs before removing the textual
-representation from the buffer.
-
-* w3.el: Removed w3-beta from the distribution - functionality moved elsewhere
-
-* w3-widget.el:
-Better handling of images that are hyperlinks that have no 'alt' text.
-
-* w3-draw.el:
-Some stuff from the old w3-beta, image fixes, initial color of html page 
should be better.
-
-
-* dist.Makefile:
-Removed w3-beta from the distribution - functionality moved elsewhere
-
-* w3-emulate.el: Moved w3-read-netscape-config into w3-emulate
-
-* w3-widget.el: Few screwups w/markers fixed
-
-Tue May 21 05:31:56 1996  William Perry  <address@hidden>
-
-* w3-draw.el, w3-forms.el, w3.el: Some XEmacs 20.0 MULE changes
-
-* w3-xem20.el: Initial revision
-
-
-Mon May 20 16:17:37 1996  William Perry  <address@hidden>
-
-* w3-draw.el: Asynch image loading works!
-
-* w3-widget.el: Put a help-echo property on the image extent when necessary
-
-* w3-imap.el: Removed lots of stuff into the new image widget
-
-* w3-widget.el:
-Make sure you always use a marker for the 'where' of an image widget
-
-* w3.el: w3-my-safe-copy-face is now a little more paranoid so that it will not
-bomb on TTYs
-
-Sat May 18 22:44:53 1996  William Perry  <address@hidden>
-
-* widget-edit.el: some text property munging for XEmacs
-
-* w3-widget.el: Yet more bug fixes for ye olde image widget
-
-* w3-widget.el:
-reorded some checks in the image widget callback so that client side
-imagemaps got done correctly.
-
-* w3-draw.el:
-Fixed bug in the use of the new image widget when it was _not_ used
-like <a href=foo>test<img src=blah>test</a>
-
-* w3-forms.el: Support <input type=button> ala netscape
-
-* w3-forms.el: Give default labels to submit and reset buttons
-
-
-Fri May 17 19:52:49 1996  William Perry  <address@hidden>
-
-* w3-draw.el: Now uses the new image widget
-
-* w3-widget.el: Various fixes
-
-* dist.Makefile: Added w3-widget to the distribution
-
-* w3-forms.el:
-Fixed radio button formatting problems (similar to choice options)
-
-* w3-menu.el:
-Don't put the hide location and hide statusbar menu entries in under
-Emacs 19 just yet.
-
-* w3-imap.el: Few fixes for Emacs 19 in tty mode
-
-* w3-forms.el:
-Option lists now no longer insert a newline unconditionally.  Ack.
-
-* w3-draw.el: inhibit-read-only for some Emacs 19 lossage
-
-Thu May 16 16:15:01 1996  William Perry  <address@hidden>
-
-* w3-menu.el: Better fix for XEmacs w/no menus
-
-* w3-mouse.el:
-Do not use button keysyms if no X support is compiled in (button1, etc)
-
-* w3-xemac.el:
-Don't make toolbar buttons if not (featurep 'toolbar).  Don't add our
-help stuff to the help menu unless (featurep 'menubar)
-
-* w3-menu.el:
-Don't install menus under XEmacs unless (featurep 'menubar), otherwise it will 
bomb on a TTY-only XEmacs.
-
-Tue May 14 16:32:16 1996  William Perry  <address@hidden>
-
-* w3-widget.el: Initial revision
-
-* font.el: Strikethru stuff works again.
-
-* default.css: added some netscapisms in the default stylesheets
-
-* w3-style.el: Added a require 'cl for 'case' handling
-
-* w3-parse.el: Added 'strike' tag to %font in the DTD ala HTML 3.2
-
-Mon May 13 20:56:52 1996  William Perry  <address@hidden>
-
-* dist.Makefile: Removed w3.ad from the distribution, as it is no longer used.
-
-Fri May 10 16:28:13 1996  William Perry  <address@hidden>
-
-
-* w3-imap.el: Now displays client-side imagemaps pretty sweetly under Emacs 19
-(drop-down list of destinations)... Whoo hoo!
-
-
-* default.css: few changes to default stylesheet - nothing major
-
-
-* w3-draw.el: fixed problem in w3-decode-area-coords
-
-Thu May  9 13:46:42 1996  William Perry  <address@hidden>
-
-
-Wed May  8 17:52:10 1996  William Perry  <address@hidden>
-
-* w3.el: Avoid creating bad html in w3-document-information
-
-
-Tue May  7 16:06:20 1996  William Perry  <address@hidden>
-
-
-* w3-vars.el: New keybinding C-A-t for listing open network transfers
-
-
-* w3-draw.el, w3-forms.el, w3-parse.el: Support <keygen> tags in the parser
-
-Mon May  6 18:03:06 1996  William Perry  <address@hidden>
-
-* images.el: fixed image converter for tiff->pnm and pnm->tiff.  Also added
-converter for JBIG (?!) image type
-
-* w3-forms.el:
-Fall back to using old-style looking stuff for text entry areas - some
-HTML was truly confusing where the widget ended and began.  Gack.
-
-Thu May  2 16:24:12 1996  William Perry  <address@hidden>
-
-
-* dist.Makefile: now installs default.css
-
-* w3-imap.el:
-image order fixed on pages with consecutive images with no text in between.
-
-* w3.el: Now looks in the data-directory and data-directory/w3/ subdir for
-stylesheet files.  Now looks for several stylesheet files, not just
-the first one it finds.
-
-Wed May  1 21:36:37 1996  William Perry  <address@hidden>
-
-* w3-e19.el: fixed mouse waggling under fsf
-
-* w3-vars.el: Added default for w3-source-file-hook ... automatically goes into
-html-mode (should probably do font-lock as well to get netscap'y look)
-
-* w3-draw.el: Fixed <body> tags yet again... god am I stupid
-
-* w3-e19.el: Fixed mouse movement under FSF
-
-
-* w3.el: auto-autoload w3-do-setup
-
-* w3-vars.el: changed w3-documentation-root
-
-* w3-menu.el, w3-xemac.el, w3-toolbar.el, w3-mouse.el:
-
-* w3-menu.el:
-Now use w3-default-configuration-file for saving options from the menubar
-
-* w3-auto.el: removed a few autoloads due to the forms revamping
-
-* docomp.el: few more stub variables
-
-* w3-vars.el: More forms fixes
-
-* w3.el: Some jka-compr fixes
-
-* w3-style.el: removed annoying 'applying style hints' messages
-
-* w3-draw.el: Fixed the handling of default attributes on <body> tag for text
-coloring, etc.  Wasn't using the new syntax the stylesheet parser was
-expecting.
-
-* w3-hot.el, w3-menu.el: In XEmacs, changed the hotlist menu constructor to use
-w3-html-bookmarks instead of adding a separate menu item for it.
-Consitent with how it has to be done under Emacs19
-
-
-Tue Apr 30 20:45:20 1996  William Perry  <address@hidden>
-
-* w3-mouse.el: In netscape emulation mode, emulate the mouse bindings as well.
-
-* font.el:
-Now takes care of setting a display-table on the face for smallcaps and bigcaps
-
-* w3-forms.el: more fixes
-
-* w3-sysdp.el: Added definition of alist-to-plist
-
-* w3-draw.el: fixed some <select> issues
-
-* w3-forms.el: New round of cleanup of the forms code continues
-
-Sat Apr 27 04:31:57 1996  William Perry  <address@hidden>
-
-* widget-edit.el: fixed typo in the 'sexp' widget
-
-* w3-auto.el: autoload widget-forward/backward
-
-* widget-edit.el: Fix for file widget
-use 'keymap property when in xemacs, 'local-map when in fsf
-
-* w3-menu.el:
-Don't put the toggle toolbar menu item up in Emacs or a XEmacs with no
-toolbar support
-
-* w3-draw.el: More efficient handling of end of hyperlink
-
-* w3-beta.el: w3 buffers are no longer read only
-
-* w3-forms.el, w3.el, w3-mouse.el:
-Make middle-mouse-button run w3-widget-button-click, that will not
-call widget-button-click if there is no widget under the event - this
-avoids being able to paste into the buffer, etc.  Gack!
-
-
-* w3-vars.el:
-no longer show the read-only/modified status in the modeline for w3 buffers
-
-* w3-vars.el: Yet more key shuffling for the widget stuff
-
-Fri Apr 26 23:09:10 1996  William Perry  <address@hidden>
-
-* widget-edit.el, widget.el: Initial revision
-
-* w3-forms.el:
-Only set the face of a form element if one has been explicitly defined
-
-* w3-imap.el:
-Removing alt text from the buffer when loading images works again... yahhh
-
-* w3.el, w3-forms.el, w3-auto.el, w3-e19.el, w3-menu.el:
-Fixed the 'links' menu for both XEmacs and Emacs
-
-* w3-keyword.el:
-elc files should now be portable between XEmacs and Emacs again... as
-long as you don't use the byte-compile-dynamic stuff.
-
-* w3-draw.el:
-Fixed problem of w3-handle-hyperlink-end being a little too aggressive
-about putting the highlight and link properties on empty <a> tags.
-
-Thu Apr 25 19:08:45 1996  William Perry  <address@hidden>
-
-
-* w3-xemac.el, w3-vars.el, w3-style.el, w3-menu.el, w3-imap.el, w3-forms.el, 
w3-e19.el, w3-draw.el, w3.el:
-Lots and lots of changes...
-- config files are now all in ~/.w3/, ala netscape
-- everything is now done via the excellent 'widget' package and text
-  properties... most of the code in w3-e19 and w3-xemac is now gone
-- 90% of the forms code is gone, subsumed by widget
-- some stylesheet changes for the latest CSS level 1 draft
-- general cleanup of lots of other code
-- many changes all over the place to deal with the new widget package
-  and text-property representation
-
-* w3-auto.el: more autoloads
-
-
-* w3-hot.el: New way of extracting the default title of a link under point
-
-* w3-beta.el: No longer call w3-mule-attribute-zones
-
-
-* w3-emulate.el: No more special casing of keysyms based on emacs version...
-
-* w3-toolbar.el: Changed the default toolbar type to 'both
-
-
-* dist.Makefile: added w3-mouse.el to the distribution
-
-* w3-mouse.el: Initial revision
-
-* w3-menu.el:
-Moved new, unified version of context sensitive menu code into w3-menu
-
-
-* w3-mule.el: Removed lots of old crap
-
-
-* w3-keyword.el: Initial revision
-
-* font.el:
-Now tags colors that are actually vectors as [rgb #r #g #b] instead of
-just [#r #g #b]
-
-Mon Apr 22 16:48:31 1996  William Perry  <address@hidden>
-
-* docomp.el: Added bogus def of has-modeline-p to shut up emacs-19
-
-* w3-auto.el: renamed w3-annotate.el to w3-annotat.el
-
-
-Fri Apr 19 20:40:46 1996  William Perry  <address@hidden>
-
-* w3-auto.el: Added autoloads for widget package
-
-Thu Apr 18 12:57:47 1996  William Perry  <address@hidden>
-
-
-Wed Apr 17 13:35:41 1996  William Perry  <address@hidden>
-
-* w3-e19.el:
-Don't send the truncated URL that is used for displaying menus to the
-actual function.  D'oh!
-
-Tue Apr 16 17:37:59 1996  William Perry  <address@hidden>
-
-* w3-merge.el: Initial revision
-
-Mon Apr 15 21:24:04 1996  William Perry  <address@hidden>
-
-
-* w3-draw.el: Use temporary faces in XEmacs, so people don't puke when they do
-edit-faces and see all the crappy face names.
-
-Sat Apr 13 01:07:49 1996  William Perry  <address@hidden>
-
-* w3.el: New function w3-popup-image-info that displays info about an image ala
-netscape 2.x
-
-* w3-menu.el:
-slight re-ordering of the options menu.  Can now turn off the modeline
-and minibuffer
-
-* w3-e19.el, w3-xemac.el:
-When the menubar is turned off, add a turn menubar back on option to
-all context sensitive menus
-
-* w3-vars.el: Shortened the context-sensitive menu over hyperlinks
-
-Fri Apr 12 03:51:20 1996  William Perry  <address@hidden>
-
-
-Thu Apr 11 17:43:48 1996  William Perry  <address@hidden>
-
-* w3-draw.el: Now handles set-cookie commands from <meta> tags
-
-Wed Apr 10 14:30:19 1996  William Perry  <address@hidden>
-
-
-* w3-vars.el, w3-draw.el, w3.el:
-Set the variable list-buffers-directory appropriately to show the URL
-for all the various W3 buffers via list-buffers.
-
-Tue Apr  9 20:52:52 1996  William Perry  <address@hidden>
-
-* w3-e19.el:
-url-truncate-url-for-viewing can now take an optional width parameter.
-If an unknown URL type is found, put quotes around it in the error
-message so that its easier to know what exactly wasn't recognized.
-
-
-* w3-parse.el: Various patches from jbw.
-1. Parser-side fix for <XMP> duplication.
-2. Percentages would get way out of wack on large files
-
-Mon Apr  8 22:40:47 1996  William Perry  <address@hidden>
-
-* w3-draw.el: fixed problem in w3-decode-area-coords that would mess up on some
-client side imagemaps (namely www.excite.com)
-
-Wed Apr  3 15:45:43 1996  William Perry  <address@hidden>
-
-* images.el: more tcsh crap... please make it stop.
-
-* w3.el: Added new w3-fetch-other-window command
-
-Tue Apr  2 17:16:23 1996  William Perry  <address@hidden>
-
-* w3-sysdp.el: Some extent functions for emacs19
-
-* w3-imap.el: Client-side image mapping polygons work now.
-
-* images.el: Hopefully final fix for csh/tcsh
-
-Mon Apr  1 18:58:49 1996  William Perry  <address@hidden>
-
-
-* images.el: fixes for csh/tcsh shells, yet _AGAIN_!
-
-
-* w3-menu.el: Can now toggle the menubars from the options menu
-
-Thu Mar 28 20:04:03 1996  William Perry  <address@hidden>
-
-
-* docomp.el: fix for emacs 19.28 griping because of those address@hidden@ 
defsubsts.
-If you ar eusing 19.28, please please upgrade.
-
-* w3-menu.el: New 'style' menu item to control the IE 3.0 compatiblitiy parsing
-
-
-* w3-style.el:
-now :normal: or :default: in a stylesheet end a device-specific section
-
-* w3-style.el:
-CSS now handles C++ style // comments like the unreleased IE 3.0 with
-stylesheets.  Oh, the joy of compatibility!
-
-Wed Mar 27 19:44:12 1996  William Perry  <address@hidden>
-
-* images.el:
-Possible fix for image loading problems seen when people have csh or
-tcsh as their default shell.  Good lord, are these people insane?  See
-http://www.cs.ruu.nl/wais/html/na-faq/unix-faq-shell-csh-whynot.html
-for details.
-
-* w3-forms.el:
-fixed problem with some forms that don't deal well with following the
address@hidden@ing spec for application/x-www-form-urlencoded.  Now does not
-escape the _ character. address@hidden@address@hidden@#%!~@ - wow, its lucky we
-passed the CDA or someone might have gotten offended here.
-
-* w3-draw.el:
-now handles xmp slightly differently - waiting for patches from jbw
-for the parser end of the fix.
-
-* w3-style.el:
-You can now have emacsen specific sections of a CSS stylesheet by
-using the device-specific stuff.  Use :emacs: or :xemacs: as the
-device type and away you go.
-
-Tue Mar 26 21:14:19 1996  William Perry  <address@hidden>
-
-
-* w3-e19.el: Fixed the 'submit form to nil' bug in mouse movement
-
-
-* w3.el, w3-hot.el: HTML bookmark parsing now actually works.
-
-Mon Mar 25 14:53:56 1996  William Perry  <address@hidden>
-
-* w3-sysdp.el, w3-about.el:
-Changed some pointers to ben wing and pearl software.
-
-Wed Mar 20 15:50:50 1996  William Perry  <address@hidden>
-
-
-* w3.el:
-Prefix arg to w3-quit now kills all w3 buffers, not just the current one.
-
-* w3-draw.el: fixed a problem with ^M in <XMP> and <PRE> sections
-
-* w3-imap.el: protect against passing invalid data to make-glyph
-
-Sun Mar 17 23:20:14 1996  William Perry  <address@hidden>
-
-
-Tue Mar 12 18:23:12 1996  William Perry  <address@hidden>
-
-* w3-draw.el: Stubs for math mode
-
-Sat Mar  9 17:47:21 1996  William Perry  <address@hidden>
-
-* w3-toolbar.el:
-Should now work correctly with no toolbar support compiled into XEmacs.
-
-Wed Mar  6 01:52:32 1996  William Perry  <address@hidden>
-
-
-* w3-imap.el:
-Fixed problem with button2 usage in w3-imap.el when compiling with FSFMacs
-
-Fri Feb 23 01:58:21 1996  William Perry  <address@hidden>
-
-
-Wed Feb 21 17:06:00 1996  William Perry  <address@hidden>
-
-* w3-draw.el:
-Now outputs a warning when it runs into a table, just so people know
-its not my fault if it looks like crap. :)
-
-* w3.el: Now uses the real add-minor-mode
-
-* w3-sysdp.el: Added stub for add-minor-mode
-
-* w3.el: Now set buffer-file-truename and buffer-file-name to nil when sourcing
-a document.
-
-* w3-draw.el, w3-sysdp.el:
-Few fixes for #%!@ damn emacsen that don't sanely deal with make-face et. al
-on a TTY interface.
-
-
-Tue Feb 20 14:12:27 1996  William Perry  <address@hidden>
-
-
-Mon Feb 19 15:13:55 1996  William Perry  <address@hidden>
-
-* w3-e19.el:
-Changed binding of mouse-2 to 'ignore instead of 'undefined - more polite.
-
-Sun Feb 18 19:11:45 1996  William Perry  <address@hidden>
-
-* RelNotes2.3: Initial revision
-
-Sat Feb 17 23:50:00 1996  William Perry  <address@hidden>
-
-* w3.el: fixed loading of default stylesheet stuff.  gack.
-
-* w3-auto.el: fixed autoloading of css parser
-
-
-* w3.txi: manual formatting changes - wheee.
-
-
-* w3-menu.el:
-Now explicitly require easymenu for FSF19 - some older versions don't
-autoload it.  *sigh*
-
-Fri Feb 16 21:39:19 1996  William Perry  <address@hidden>
-
-
-Thu Feb 15 22:56:04 1996  William Perry  <address@hidden>
-
-* w3.el: w3-fetch now defaults to http://www. if you are not in a w3 buffer
-
-* w3-menu.el: Added menu item for incremental display
-
-Mon Feb  5 17:01:39 1996  William Perry  <address@hidden>
-
-* w3-draw.el:
-Fixed bug in the <font> handling if all you are doing is setting a color
-
-Tue Jan 30 15:16:43 1996  William Perry  <address@hidden>
-
-* w3.txi: Added section on emulation.  Updated copyright info and dates.
-
-Sun Jan 28 06:17:55 1996  William Perry  <address@hidden>
-
-* w3-menu.el: Fleshed out the doc string of w3-use-menus some more.
-
-Sat Jan 27 18:59:57 1996  William Perry  <address@hidden>
-
-* w3-style.el: Made more of the functions names be saner... don't pollute the
-namespace for when we support more stylesheet notations.  Need to
-extrapolate it some more and have a registry of acceptable notations.
-
-Fri Jan 26 18:40:42 1996  William Perry  <address@hidden>
-
-* w3-xemac.el: No longer adds WWW options submenu to the main options menu
-
-
-* w3.el, w3-xemac.el:
-Lots of changes for new client-side imagemap support and cleanup of old code.
-
-
-* w3-menu.el: New `style' menu
-
-* w3-imap.el:
-Lots of changes for new client-side imagemap support and cleanup of old code.
-
-* w3-emulate.el:
-Added keybindings for left & right arrow keys under netscape emulation.
-
-* w3-draw.el:
-Lots of changes for new client-side imagemap support and cleanup of old code.
-Removed inlined mpeg code, waiting for XEmacs 19.15 to support it again.
-
-* descrip.mms: Updated the VMS makefile for the new files
-
-* dist.Makefile: Added w3-menu.el to the distribution
-
-Thu Jan 25 17:51:39 1996  William Perry  <address@hidden>
-
-* w3-xemac.el:
-Moved over to new, more robust menu specifications - mainly stolen from VM.
-
-* w3.el, w3-vars.el, w3-emulate.el:
-Moved w3-search-* functions out of w3-emulate.el into w3.el where they belong.
-Moved some variables out as well.
-
-* w3-e19.el: Removed w3-emacs19-hack-faces-p support.
-Moved over to new, more robust menu specifications - mainly stolen from VM.
-
-* w3-menu.el:
-Menus now appear to work under both emacs19 and XEmacs.  Fixed problem
-where 'Search Again' was always available, even if no search had been
-done yet.
-
-
-* w3-menu.el: Initial revision
-
-Tue Jan 23 18:05:08 1996  William Perry  <address@hidden>
-
-* font.el: Fixed problem with latest XEmacs 19.14 beta
-
-
-* w3-emulate.el:
-lynx/netscape emulation now uses new w3-search-forward function
-
-* w3-toolbar.el: Toolbar now uses new w3-search-forward function
-
-* w3-imap.el: Work around small bug in the 19.14 beta byte compiler
-
-* w3.el: Don't choke and die if you can't find ange-ftp
-
-Mon Jan 22 16:15:42 1996  William Perry  <address@hidden>
-
-* dist.Makefile: Added w3-emulate.el to distribution
-
-* w3.el, w3-vars.el: Moved the emulation stuff into a separate file
-
-* w3-emulate.el: Initial revision
-
-Sun Jan 21 19:16:33 1996  William Perry  <address@hidden>
-
-
-* dist.Makefile: Added w3-imap.el to the distribution
-
-Sun Jan 14 01:00:30 1996  William Perry  <address@hidden>
-
-* w3.txi: updated w3.org mailing list addresses
-
-* w3.txi: Added section on reporting bugs... needs finishing
-
-Sat Jan 13 08:30:06 1996  William Perry  <address@hidden>
-
-
-Fri Jan 12 19:42:17 1996  William Perry  <address@hidden>
-
-* w3-parse.el: Added parsing stuff for client-side imagemaps
-
-* w3-draw.el, w3-vars.el, w3-imap.el:
-Client-side imagemaps parse correctly now, and the data is stored.
-
-* w3-e19.el:
-Make the options button look a little more like a button under emacs 19
-
-* w3.txi: Combined some of the indices to make it easier to find stuff.
-
-* w3-imap.el: Fixed macros x-coord and y-coord
-
-* w3-imap.el:
-Added definitions for point-in-rectangle|circle functions, and stub
-for point-in-polygon function
-
-* w3-imap.el: Initial revision
-
-Wed Jan 10 13:32:30 1996  William Perry  <address@hidden>
-
-* w3.el: Renamed w3-store-in-x-clipboard to w3-store-in-clipboard
-
-* w3-xemac.el: New version of w3-store-in-clipboard
-
-* w3-e19.el: Renamed w3-store-in-x-clipboard to w3-store-in-clipboard
-
-* w3-e19.el: w3-store-in-x-clipboard now uses x-select-text instead of
-x-set-selection, which is more correct as a good X citizen I guess.
-
-Sun Jan  7 17:03:38 1996  William Perry  <address@hidden>
-
-* w3.el: only check current-prefix-arg if interactive-p.  Otherwise we hose up
-things in ffap.el and probably lots of other things nobody has found
-yet.
-
-Wed Jan  3 19:47:47 1996  William Perry  <address@hidden>
-
-* w3-vars.el, w3.el:
-New netscape emulation minor mode that sets up a lot of keybindings.
-
-* font.el: Made set-face-background|foreground|font interactive again.
-
-* docomp.el: Now adds urldir to the load path
-
-* dist.Makefile: Now copies the THIS-IS-VERSION-* files when installing
-
-* docomp.el:
-Now adds URLDIR to load-path instead of unconditionally using ../url
-
-* dist.Makefile:
-Now puts URLDIR in the environment of the compiling emacsen so that
-docomp.el can get at it.
-
-Tue Jan  2 17:52:14 1996  William Perry  <address@hidden>
-
-* w3.el: Renamed a few things from style-sheet to stylesheet, to be consistent
-
-
-Wed Dec 20 18:21:29 1995  William Perry  <address@hidden>
-
-* w3-hot.el: Removed compile-time warnings
-
-* dist.Makefile: removed w3-srch.el from distribution
-
-* w3-hot.el:
-Basic handling of html hotlists... converts into XEmacs-style menu currently
-
-* w3-beta.el: Added definition of w3-normalize-spaces
-
-* font.el: Definition of define-new-mask macro should now work on older emacs
-19.2x that don't understand native backquoting.
-
-* w3-parse.el:
-No longer throw up a warning for <hr> in <pre> - it really is legal HTML 2.0
-
-* w3-xemac.el: Now stores the parse _tree_ in w3-current-parse.
-Modified the view-parse-tree menu item to show this (not just 
w3-last-parse-tree
-
-* w3-parse.el:
-Made w3-display-parse-tree able to take a parse tree as an argument
-
-* w3-beta.el:
-Make w3-refresh-buffer signal an error for now - not yet reimplemented.
-
-
-* w3-vars.el: Added entities
-     (sim         . 126)
-    (le          . "<=")
-    (agr         . "alpha")
-    (rdquo       . "''")
-    (ldquo       . "``")
-
-
-* w3-parse.el: Now allows <hr> inside of <pre>
-
-Tue Dec 19 22:21:15 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Fixed textarea default input handling
-
-* w3-vars.el, w3-parse.el: Added variable w3-maximum-line-length
-
-Mon Dec 18 22:30:38 1995  William Perry  <address@hidden>
-
-* w3.el: Offer to save to disk if an external viewer fails
-
-* w3.el: If w3-fetch is given a prefix arg, dump to disk.
-
-* w3.el:
-Now defaults to using ~/.netscape/preferences instead of ~/.MCOM-preferences
-
-Sun Dec 17 21:26:41 1995  William Perry  <address@hidden>
-
-
-* w3-draw.el, w3-vars.el, w3.txi:
-Changed w3-link-delimiter-info to w3-link-info-display-function
-
-Sat Dec 16 17:23:39 1995  William Perry  <address@hidden>
-
-* font.el: fixed typo in tty-font-create-plist
-
-* font.el: Fixed stupid mistake in font-tty-find-closest-color
-
-Thu Dec 14 22:34:32 1995  William Perry  <address@hidden>
-
-* font.el: Now uses linethru if on XEmacs
-
-* default.css: Moved to new CSS comment syntax
-Added new stuff for TTYs
-
-
-Wed Dec 13 15:49:44 1995  William Perry  <address@hidden>
-
-* w3-xemac.el: Removed a bunch of old code for XEmacs <= 19.13
-
-* w3-xemac.el: Now registers all netpbm utilities by default
-
-* font.el: Added a few new bitmasks (overline linethrough)
-
-* w3-style.el:
-Now handles the new CSS style syntax - will they every address@hidden decide
-on one and stick with it?!!?!?
-
-
-Tue Dec 12 22:53:43 1995  William Perry  <address@hidden>
-
-* w3.el: fixed problem in w3-insert-entities-in-string under XEmacs
-
-
-* w3-forms.el: Few form fixes
-
-* w3-vars.el: Modified the default stylesheet
-
-
-* font.el: Bold now works on ttys
-
-* w3-sysdp.el:
-Added stubs for make-face set-face-foreground and set-face-background
-for non-X emacsen
-
-
-Mon Dec 11 22:52:38 1995  William Perry  <address@hidden>
-
-* font.el: Some emacs19 patches
-
-* font.el: Changed all the style stuff to use bitmasks for speed.
-More TTY changes
-If no size specified for font, defaults to size of default font for device.
-If no family specified  for font, defaults to family of default font for 
device.
-
-* w3-style.el: All stylesheet stuff now uses the new font package
-
-Sun Dec 10 17:55:13 1995  William Perry  <address@hidden>
-
-* font.el: Some of the font stuff now works on TTYs (bold/dim/etc)
-
-* w3-sysdp.el: Added stubs for face-property and set-face-property
-
-* w3-parse.el: Added wired
-
-Sat Dec  9 23:36:21 1995  William Perry  <address@hidden>
-
-* font.el:
-Added definition of x-font-regexp for emacs19 that has everything font.el
-needs in it.
-
-Fri Dec  8 18:05:48 1995  William Perry  <address@hidden>
-
-
-* w3-draw.el:
-Better handling of links - now keeps _all_ links with the same rel or rev
-
-* w3.el: New presentation of document information
-
-
-* w3-xemac.el, images.el: Can now compile under Emacs19
-
-Wed Dec  6 14:37:12 1995  William Perry  <address@hidden>
-
-* w3-vars.el, w3.el: Now comes with a global fallback stylesheet
-
-
-* w3-style.el: No longer make '/' a 'string' type in the syntax-table - it was
-screwing up non-quoted URLs big time.
-
-* font.el: If running under emacs19, always condition-case where we do a
-set-face-font, since it handles different fonts badly right now.
-
-Tue Dec  5 22:29:28 1995  William Perry  <address@hidden>
-
-* w3-vars.el:
-New image/hyperlink/default context-sensitive menus.  Can now have a
-'%s' in the w3-graphlink and w3-hyperlink-menu entries that will be
-replaced by the URL under point
-
-* w3-xemac.el: Now merges context-sensitive menus when appropriate
-
-* w3-vars.el: Added image mapping for image/png to 'png
-
-* images.el: Modified the pnm and ppm to gif converters to actually work now.
-
-* images.el: Added converters for PNG
-
-Mon Dec  4 19:22:26 1995  William Perry  <address@hidden>
-
-
-* w3-xemac.el: XBM images now work again - gross
-
-
-* w3-parse.el:
-defvar of w3-sgml-md-syntax-table no longer uses an eval-when-compile
-form, since this makes MULE and XEmacs 20.0 croak, and makes the .elc
-files non-portable, now that Emacs 19.30 uses a separate data type for
-them.
-
-* default.css: More fun stylesheet things
-
-* w3.el: When dumping to disk, only send "*/*" in the acceptheader
-
-* w3-vars.el: Now uses the new 'images' package for image conversion.
-
-* w3-xemac.el: Now uses the new 'images' package for image conversion.
-Removed some stuff for old lemacsen
-
-
-* images.el: Wow, it works
-
-* new.el: Now handles pre-formatted sections correctly
-
-* font.el: Default to 12pt font
-
-
-Sat Dec  2 16:55:58 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Applied some patches from joe wells.
-
-* w3-parse.el: Applied some patches from joe wells.
-1. Added error transitions to infer <TBODY>, <TR>, and <TD> when seeing
-   bad stuff inside a TABLE.  A lot of people write shit like this:
-   <TABLE> Text to be centered in a pretty frame in Netscape </TABLE>
-2. Took out a particular error transition for P start tags in the state
-   transition table that was leading to horrible handling of some bad
-   HTML I was seeing.  I had thought this transition would improve
-   handling of bad HTML, but I hadn't seen this particular kind of bad
-   HTML.
-3. Fixed a use of w3-invalid-sgml-chars (that didn't work at all) and
-   fixed its documentation string.
-
-Fri Dec  1 16:25:58 1995  William Perry  <address@hidden>
-
-* images.el: Initial revision
-
-Thu Nov 30 14:33:14 1995  William Perry  <address@hidden>
-
-
-Wed Nov 29 15:06:58 1995  William Perry  <address@hidden>
-
-* w3-sysdp.el: Define x-font-regexp-foundry-and-family for Emacs 19
-
-* dist.Makefile:
-No longer compile w3-sysdp.el - was causing problems in emacs 19.29/19.30
-
-* w3-auto.el: Added autoload for w3-form-format-unknown
-
-Tue Nov 28 16:33:12 1995  William Perry  <address@hidden>
-
-* w3-toolbar.el: Finally fixed nil specifier problem in w3-toggle-toolbar
-
-
-* font.el: Added a new generic font family 'elfin'.  New keyword :oblique.  New
-function font-create-object that converts a window-system-dependent
-font specification into our internal representation
-
-* new.el: Shit, it works!
-
-* w3-style.el: Now intern's the 'break' items, for faster comparison later.
-
-Mon Nov 27 22:21:04 1995  William Perry  <address@hidden>
-
-
-Sun Nov 26 01:31:44 1995  William Perry  <address@hidden>
-
-
-Sat Nov 25 04:47:31 1995  William Perry  <address@hidden>
-
-* new.el: Initial revision
-
-Fri Nov 24 22:53:55 1995  William Perry  <address@hidden>
-
-* w3.txi: Lots of changes and restructuring
-
-* w3.txi:
-Documented the recent keymap changes for history/annotation/hotlist actions
-
-* w3-vars.el: Moved history commands onto their own keymap
-
-* w3-vars.el:
-Moved all hotlist and annotation functions into their own keymap 'h'
-and 'a' respectively.  Comments on the new keybindings are welcome.
-
-* w3-style.el:
-font-size-index now scales by 1.44 instead of 1.2, as CSSv5 recommends
-
-Thu Nov 23 22:33:22 1995  William Perry  <address@hidden>
-
-
-* default.css: Few piddly changes
-
-* w3.txi: Lots of documentation changes.  Thanks to jon konrath
-
-* w3-style.el: Fixed typo in w3-style-font-size-for-index
-
-* w3-draw.el: Can now handle <font color=xxx>
-
-* w3-style.el: The output device specific stuff works now
-
-* w3-draw.el:
-Fixed conversion of netscape <body> attributes into a CSS stylesheet
-
-Wed Nov 22 16:49:32 1995  William Perry  <address@hidden>
-
-* w3-style.el: Now correctly parses the ":foo:" stuff in CSS to handle multiple
-media. Doesn't actually do anything with it yet, but at least it
-doesn't make the thing choke and die any more.
-
-Tue Nov 21 16:33:37 1995  William Perry  <address@hidden>
-
-* default.css: Various tweaks and changes to the default stylesheet
-
-* w3-style.el: Removed old cssv3 stuff - is now completely cssv5
-Added correct handling of comments
-
-* w3-draw.el: Setting default background works again
-
-* w3-xemac.el:
-Added a debugging menu for right now to show the last parse tree and the
-current stylesheet.
-
-* font.el: Few changes to not always default to 'medium' font weight, for those
-fonts that don't have one.
-
-Mon Nov 20 14:14:06 1995  William Perry  <address@hidden>
-
-* w3-about.el: Converted about:style to CSSv5
-
-* w3.txi: Started revamping some sections
-
-Sun Nov 19 22:13:17 1995  William Perry  <address@hidden>
-
-
-* w3-e19.el: Fixed w3-overlays-at
-
-
-* w3-beta.el, w3-draw.el, w3-e19.el, w3-forms.el:
-Everything and its grandmother now uses a default stylesheet - no more
-Xresources!
-
-* w3-mule.el: Fixed a few MULE bugs
-
-* w3-style.el:
-w3-generate-stylesheet-faces does not actually create any of the faces
-now - delays that until they are actually needed/used in
-w3-face-for-element
-
-* w3-vars.el:
-Everything and its grandmother now uses a default stylesheet - no more
-Xresources!
-
-* w3.el: Everything and its grandmother now uses a default stylesheet - no more
-Xresources!
-Much faster version of w3-insert-entities-in-string.
-Now binds require-final-newline to nil when saving a binary file.
-Fixed a few MULE bugs with coding systems and www: URLs
-Fixed reading of initial stylesheet.
-
-* w3-xemac.el:
-Everything and its grandmother now uses a default stylesheet - no more
-Xresources!
-
-* w3-auto.el: Now autoloads w3-generate-stylesheet-faces
-
-* docomp.el: Moved some variable stubs around
-
-* w3-parse.el: Several patches from jbw to the new parser
-
-Sat Nov 18 02:54:18 1995  William Perry  <address@hidden>
-
-
-* w3-vars.el: Fixed typo in one of the new defvars
-
-* w3-vars.el: Changed the format of w3-list-chars-assoc and w3-style-tags-assoc
-
-* w3-draw.el: Removed conversion of old style entity stuff
-
-* w3-vars.el: Moved w3-html-entities variable
-
-* w3.el: Now correctly generates stylesheet faces for the user stylesheet.
-w3-insert-entities-in-string should now be more efficient.
-
-* w3-parse.el: Moved w3-html-entities variable
-
-Fri Nov 17 18:42:54 1995  William Perry  <address@hidden>
-
-* w3-auto.el: Added autoload for w3-parse-arena-stylesheet
-
-* w3.el: Fixed hashtable stuff under XEmacs - the key of a hashtable must be
-able to compare with 'eq', not 'equal', so had to change it to use
-symbols instead of the url string.
-
-* w3-beta.el:
-No longer bind pop-up-windows to nil through all of w3-prepare-buffer
-
-* dist.Makefile:
-Now requires that the URL package be installed before continuing
-
-* w3-parse.el: Added the 'label' tag.
-
-* w3-draw.el: Fixed dumb mistake in the handling of
-w3-visited-node-style/w3-node-style for links under a window system.
-
-* w3-forms.el: Removed old bogus code
-
-
-* w3-parse.el: Fixed bug in the new entity expansion
-
-* w3-style.el:
-Fixed a problem with the font-weight keyword in style specs.  Now
-stores the font specification in the stylesheet as well
-
-* w3.el: No longer unconditionally load w3-sysdp.el
-
-* w3-draw.el: Fixed some spacing problems
-
-* w3-parse.el: Various patches from jbw
-
-Thu Nov 16 18:52:56 1995  William Perry  <address@hidden>
-
-* w3-parse.el: Added in the emacs-w3 easter eggs to the DTD
-
-* w3-parse.el: Allow '_' in attribute names
-
-Wed Nov 15 23:10:23 1995  William Perry  <address@hidden>
-
-* w3-draw.el:
-Fixed list items with new implied paragraph breaks immediately after
-
-* w3-draw.el: Fixed the yogsothoth handling
-
-* w3-xemac.el: Fixed image loading problem
-
-* w3-parse.el:
-Fixed w3-sgml-name-to-string to be a macro instead of a true function.
-Since it was wrapped within an eval-when-compile, all calls to it
-later on would be fucked due to an undefined function
-
-* w3-draw.el: Removed some dead code
-
-* font.el:
-Can now correctly combine any number of fonts with font-combine-fonts
-
-* w3-draw.el:
-Fixed problem with not swallowing newlines when necessary due to new parser
-
-
-* w3-forms.el: Moved lots of stuff out into new auxiliary files
-
-* w3-auto.el: Initial revision
-
-* w3.el: Moved lots of stuff out into new auxiliary files
-
-* w3-annotat.el: Initial revision
-
-* w3-hot.el: Removed the old, unused air mosaic hotlist parser
-
-
-* w3-parse.el, w3-draw.el:
-Make a display-table for use globally for things in the windows character set
-
-* w3-parse.el: The whole new parser from joe wells.  M-x amen
-
-* w3-draw.el: Few changes for the new parser
-
-Mon Nov 13 15:56:58 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Fixed the <font size=+x> handling
-
-* w3-draw.el:
-Implemented messaging the 'title' of a link instead of just the naked URL
-Now honors the nasty netscapism 'seqnum' attribute on <li> tags
-
-* w3-vars.el, w3-xemac.el, w3-e19.el:
-Implemented messaging the 'title' of a link instead of just the naked URL
-
-* w3-toolbar.el: Activated the w3-toolbar-stop-icon stuff
-
-Fri Nov 10 17:30:43 1995  William Perry  <address@hidden>
-
-* w3.el:
-Fixed problem with application/x-www-form-urlencoding of names of form fields
-
-Thu Nov  9 20:56:02 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Few fixes for ordered lists in alpha and roman style
-
-* w3.el: Catch malformed www: URLs
-
-Fri Nov  3 21:34:35 1995  William Perry  <address@hidden>
-
-
-* w3-style.el, w3-draw.el:
-Can now specify alignment and textalignment in stylesheets for <hr>
-
-Thu Nov  2 22:25:50 1995  William Perry  <address@hidden>
-
-* w3-style.el:
-Fixed problem in stylesheet parser calling (char-after) at point-max
-
-
-* w3-hot.el: Now requires w3-vars, so that w3-setup-done is bound.
-
-Wed Nov  1 15:39:06 1995  William Perry  <address@hidden>
-
-* w3.el: More work on allowing the user to do a completing-read on the
-annotations of a buffer to delete one.  Fixed a few potential screwups
-in the annotations code with regard to improperly entity-ized strings.
-no longer refetches a text/plain document from the server when you do
-a document-source on it.
-
-* w3-hot.el:
-Don't leave backup copies of w3-hotlist-file or url-global-history-file
-
-Tue Oct 31 06:20:43 1995  William Perry  <address@hidden>
-
-* w3-draw.el:
-Fixed stupid problem introduced when changing w3-set-fill-prefix-length to 
defsubst instead of defmacro
-
-* w3-draw.el, w3-e19.el, w3-vars.el, w3-xemac.el, w3.el:
-Now handles empty containers with name/id attributes
-
-* w3-beta.el: Different formatting for annotations
-
-* w3.el: Base of allowing the user to choose what annotation to delete when
-w3-delete-personal-annotation is called from a non-PAN
-
-* w3-parse.el, w3-beta.el, w3-vars.el, w3-draw.el: Few performance tweaks
-
-
-Sun Oct 29 02:14:10 1995  William Perry  <address@hidden>
-
-* w3-hot.el, w3.el:
-Removed old HTML <div1> so that the new display engine doesn't gripe
-
-* w3-vars.el, w3.el: Made w3-source-document honor w3-reuse-buffers.  Also made
-w3-reuse-buffers default to `reuse'
-
-* w3-draw.el: Fixed the form handling for isindex fields.
-
-* w3-draw.el: Include a working version of center-line for emacs 19.29
-
-* dist.Makefile: Now uses an implicit target.
-
-Sat Oct 28 04:16:16 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Fixed stupid typos
-
-* w3-e19.el, w3-xemac.el:
-Now signals an error in w3-find-specific-link if the #link could not
-be found
-
-* w3.el: w3-show-history-list now works again
-
-
-* w3-draw.el: Fixed the <option value=xxx> handling
-
-* w3-draw.el: Make headers nuke <p> alignments on the stack
-
-
-* w3-parse.el: No longer swallows all the trailing '>' after a tag.  So
-<h1>>>>>></h1> will show up correctly.  Hmmmm... is this right?
-Comments anyone?
-
-* w3-draw.el:
-first paragraph breaks within a list item are now filled correctly
-
-
-Fri Oct 27 13:41:16 1995  William Perry  <address@hidden>
-
-
-* w3-style.el:
-Now correctly keeps track of the tags that something applies-to -
-correct handling of context and new level 2 attribute references
-instead of the old naive way.
-
-* w3-style.el: Now implements @import for stylesheets ala CSS v4
-
-Thu Oct 26 15:11:29 1995  William Perry  <address@hidden>
-
-* font.el: Fixed problem in Emacs 19.29 with the font-set-face-font stuff -
-copy-face sends us in the internal vector instead of the face symbol.
-Bleah!
-
-Wed Oct 25 22:35:42 1995  William Perry  <address@hidden>
-
-* w3.el: Fixed following a link to a fragment "#foo" does not add that URL to
-url-global-history-completion-list (and thus it will not be shown as a
-link that has been followed) if the base URL is already in a buffer.
-
-* default.css: Updated to new (unreleased) CSS v5 specification
-
-* font.el: Removed some old function definitions that are no longer used.
-
-* w3-draw.el:
-Will now create the face storage variables if make-face is not bound.
-Was causing some of the stuff later on in the display engine to crap
-out and die.
-
-Tue Oct 24 16:42:24 1995  William Perry  <address@hidden>
-
-* w3-draw.el, w3-style.el: More CSS hacks
-
-* w3-style.el: Some CSS v5 stuff
-
-* font.el: Added definition of font-warn
-
-* w3-style.el: No longer get everything set to a nil/nil/nil/nil font
-
-Mon Oct 23 23:49:51 1995  William Perry  <address@hidden>
-
-* w3-draw.el:
-Now honors the special `link' and `visited' classes for anchor tags
-
-
-* w3-style.el: Now honors old back.color syntax
-
-* w3.el: Now honors the $html-source CSS special
-
-Thu Oct 19 21:12:50 1995  William Perry  <address@hidden>
-
-
-Wed Oct 18 22:20:59 1995  William Perry  <address@hidden>
-
-* w3-draw.el: few formatting tweaks.
-
-* w3-style.el: Few various tweaks for font-style
-
-
-Tue Oct 17 21:47:49 1995  William Perry  <address@hidden>
-
-* w3-xemac.el, w3-e19.el: Fixed form entries
-
-
-Mon Oct 16 20:35:42 1995  William Perry  <address@hidden>
-
-
-* w3.el: Fixed applicatin/x-www-form-urlencoded crap
-
-* font.el:
-Don't die if the set-face-xxxx functions are undefined when font.el[c]
-is loaded
-
-Sun Oct 15 23:33:49 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Fixed handling of add.before and add-after
-
-* w3-style.el: Don't bomb out on ttys
-
-* w3-parse.el: Patch from jbw to handle more bad HTML
-
-* w3-parse.el:
-Correct handling of things like &quot; in an attribute/value pair
-
-
-* w3-beta.el: Better handling of personal annotations
-
-* w3-draw.el:
-Fixed fig and ol handling to be consistent with the new symbol-based
-argument lists
-
-* w3-parse.el:
-Moved default parameters for ol into w3-draw where they belong, courtesy of jbw
-
-* w3.el: Patches for personal annotations by jbw
-
-
-* w3.el: fixed some fuckups in the history list
-
-
-* w3.el: Check return value of url-get-url-at-point in w3-follow-url-at-point
-before passing to w3-fetch.
-
-* w3-vars.el: Fixed documentation for w3-header-chars-assoc
-
-Thu Oct 12 13:59:58 1995  William Perry  <address@hidden>
-
-* w3-e19.el: Implemented w3-active-link-color for emacs 19
-
-Tue Oct 10 16:17:52 1995  William Perry  <address@hidden>
-
-* w3-style.el: Some more CSS v4 stuff
-
-* w3-draw.el, w3-xemac.el, w3-vars.el: Now has w3-active-node-style
-
-
-Mon Oct  9 02:59:55 1995  William Perry  <address@hidden>
-
-* w3-about.el: Updated the about stylesheet to the new v4 syntax
-
-* default.css: Updated the default stylesheet to the new v4 syntax
-
-Sun Oct  8 23:48:10 1995  William Perry  <address@hidden>
-
-* w3-style.el:
-Now keeps track of address@hidden' directives - still need to actually do
-something sensible with them though.
-
-* w3-style.el:
-Now understands CSS v4 syntax.  Can handle either v3 or v4, based upon
-some state in the parser.
-
-
-Mon Oct  2 18:07:36 1995  William Perry  <address@hidden>
-
-* w3-vars.el: Removed some epoch stuff
-
-
-* w3-draw.el, w3-about.el, w3-vars.el, w3.el: Removed some epoch stuff
-
-
-Sun Oct  1 17:34:43 1995  William Perry  <address@hidden>
-
-
-Thu Sep 28 13:25:59 1995  William Perry  <address@hidden>
-
-* w3-e19.el:
-Disabled w3-shuffle-history-menu for now, since it cannot copy with
-url-history-list being a hashtable.
-
-* w3-xemac.el: The url-history-list is now really a hashtable
-
-* w3-beta.el, w3.el:
-Fixed a few problems in the hotlist and history handling where it was
-not escaping URLs correctly of < > &, etc.
-
-
-Wed Sep 27 21:44:58 1995  William Perry  <address@hidden>
-
-* font.el: Don't make the rgb.txt buffer visible to the user.
-
-
-Tue Sep 26 14:59:14 1995  William Perry  <address@hidden>
-
-* RelNotes: Initial revision
-
-Mon Sep 25 21:59:10 1995  William Perry  <address@hidden>
-
-
-* w3-xemac.el: No longer tries to auto-detect giftopnm or giftoppm
-
-
-* w3-style.el: Only create font objects when necessary
-
-* w3-style.el, w3-draw.el: New stylesheet mechanism
-
-
-* font.el: Added lots of color stuff
-
-Sun Sep 24 17:13:14 1995  William Perry  <address@hidden>
-
-* w3-sysdp.el: Added def of find-face
-
-* font.el: Various tweaks
-
-Sat Sep 23 04:04:14 1995  William Perry  <address@hidden>
-
-* w3-draw.el, w3-xemac.el, descrip.mms, dist.Makefile:
-
-* w3-toolbar.el: Moved all the toolbar specific stuff out into its own file
-
-
-* w3-toolbar.el: Initial revision
-
-Fri Sep 22 15:08:48 1995  William Perry  <address@hidden>
-
-
-Thu Sep 21 17:21:24 1995  William Perry  <address@hidden>
-
-
-Wed Sep 20 14:07:46 1995  William Perry  <address@hidden>
-
-
-* w3-hash.el: Initial revision
-
-Tue Sep 19 13:48:09 1995  William Perry  <address@hidden>
-
-* w3.el: Fixed fill out forms
-
-Mon Sep 18 18:13:14 1995  William Perry  <address@hidden>
-
-
-* w3.el: A few fixes for w3-url-completion-function to make sure
-url-global-history-hash-table is really a hashtable
-
-
-Sun Sep 17 18:04:25 1995  William Perry  <address@hidden>
-
-
-* w3-parse.el: fixed typo
-
-* w3-parse.el: Avoid lots of string-creation in w3-parse-args
-
-* w3.el: Use all-completions directly in emacs-19 in w3-url-completion-function
-for raw speed.
-
-* w3-draw.el: Fixed some _STUPID_ problems
-
-
-* w3-sysdp.el:
-make-hashtable now finds the next highest prime for the initial size.
-
-* w3-draw.el:
-Everything from w3-parse-args is now a symbol, so that the faster assq
-can be used when retrieving.  It is possible something was missed -
-keep an eye out for things getting fucked.
-
-
-* w3-vars.el, w3-draw.el:
-Now caches whether a URL has been visited or not between calls to
-w3-handle-hype and w3-handle-hyperlink-end, for speed
-
-* w3.el: Changes to w3-url-completion-function to handle the new internal
-representation of the global history.  Performance might suffer here
-(in XEmacs), but the majority of people don't ever notice the url
-completion anyway. :)
-
-* w3-sysdp.el: Added def of clrhash
-
-
-* w3-sysdp.el: Added hashtable functions
-
-Sat Sep 16 01:37:54 1995  William Perry  <address@hidden>
-
-* w3.el: Some MULE stuff
-
-* w3-beta.el: Fixed bug in finding #xxx links
-
-* w3-draw.el:
-Catch error in centering a horizontal rule due to brokenness in emacs 19.29
-
-
-* w3-vars.el, w3-parse.el, w3-draw.el:
-Lots of performance tweaks from address@hidden (Joe Wells)
-
-Mon Sep 11 14:32:40 1995  William Perry  <address@hidden>
-
-
-Sun Sep 10 23:26:47 1995  William Perry  <address@hidden>
-
-* w3-sysdp.el: Added defvar for x-library-search-path
-
-Sat Sep  9 03:17:37 1995  William Perry  <address@hidden>
-
-* w3-xemac.el: Added options menu item for honroing stylesheets
-
-
-Wed Sep  6 15:12:24 1995  William Perry  <address@hidden>
-
-
-Tue Sep  5 17:41:31 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Fixed stupid problem with new def of w3-warn
-
-Mon Sep  4 18:10:03 1995  William Perry  <address@hidden>
-
-
-* w3-vars.el: Added SGI rgb inlined image converter
-
-* w3-parse.el:
-Fixed problem where something like <a href=^M "foo" would use the ^M
-as the href value.  Bleah!
-
-
-* w3-beta.el: Integrated new version of w3-prepare-buffer from Shuji NARAZAKI
-<address@hidden> that gets rid of the horrid
-'asynchronous retrieval finishes when in minibuffer' lossage.  Yeah!
-
-* w3.el: Redirects should now no longer screw up the history list.
-
-
-Sun Sep  3 21:53:09 1995  William Perry  <address@hidden>
-
-* w3.el: Only do the absolute minimum setup necessary in
-w3-read-url-with-default - this yields faster response time upon first
-starting up via w3-fetch.  Uses custom completion routine to only do
-the url setup routines when the user requests completion on a URL.
-
-* w3-sysdp.el: fixed typo in device-mm-width
-
-Fri Sep  1 02:47:29 1995  William Perry  <address@hidden>
-
-* w3.el: Treat bogus METHODs on forms like GET, but still put up a warning
-buffer
-
-
-Thu Aug 31 23:59:33 1995  William Perry  <address@hidden>
-
-
-* default.css: Initial revision
-
-
-* w3-draw.el: Put in special test for CR or LF in name of a input field so that
-spaces would not be inserted and screw up cgi scripts that aren't
-expecting it.
-
-* w3-xemac.el: Fixed various toolbar problems
-
-Wed Aug 30 20:36:17 1995  William Perry  <address@hidden>
-
-* w3.el: Incorrectly 'typed' input types now default to `text'
-
-
-* w3.el: Applied patch from address@hidden (Joe Wells) for the extremely
-annoying ` Wrong type argument: overlayp, (w3form (("enctype"
-. "application/x- ...' stuff.
-
-Mon Aug 28 21:15:50 1995  William Perry  <address@hidden>
-
-
-* xbm-button.el: Initial revision
-
-
-* w3-xemac.el: Now uses xbm-button-create when necessary
-
-* w3-xemac.el: Fixed save options bug
-
-
-* w3-draw.el: Fixed bug where 'plain' lists would not be indented at all.
-
-
-* font.el: Initial revision
-
-Sun Aug 27 01:10:25 1995  William Perry  <address@hidden>
-
-
-Sat Aug 26 06:21:20 1995  William Perry  <address@hidden>
-
-* w3-sysdp.el: Added split-string
-
-Fri Aug 25 18:56:55 1995  William Perry  <address@hidden>
-
-* w3-sysdp.el: Added definition of try-font-name
-
-
-* w3-style.el, w3-xemac.el, w3-vars.el, w3-e19.el, w3-draw.el:
-Can now specify the default face in style sheets
-
-
-Thu Aug 24 19:08:16 1995  William Perry  <address@hidden>
-
-* w3-draw.el:
-Changed w3-munge-color-XXX to strip spaces out of color names passed
-in.
-
-* w3-style.el: Some fixes for the arena 0.97 type style sheets
-
-Mon Aug 21 21:12:22 1995  William Perry  <address@hidden>
-
-
-* w3-style.el: Style sheet stuff now more up-to-snuff with CSS v3.  Also now
-normalizes all colors to their RGB tuples, so that faces can be shared
-between stylesheets that refer to them by different names (#FFF ->
-black -> #FFFFFF -> etc)
-
-
-Sun Aug 20 23:34:37 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Fixed typo
-
-
-* w3-util.el: Added doc strings for the w3-hyperlink-element-xxxx functions
-
-* w3-util.el: Added a provide statement
-
-* w3-util.el: Initial revision
-
-* w3.el: New version of w3|url-warn
-
-* w3-draw.el, w3-e19.el, w3-epoch.el, w3-parse.el, w3-style.el, w3-xemac.el, 
w3.el:
-Use new warnings facility.  Reimplemented most of w3-debug-html
-
-* w3.el, w3-draw.el: Now stores the ID attribute of input elements
-
-
-* w3-parse.el: Nuke entities inside of a <textarea>
-
-* w3-parse.el, w3-draw.el:
-Don't parse any markup that occurs inside of a <TEXTAREA>
-
-* w3-vars.el:
-Removed textarea and textargs from w3-state-vector and 
w3-state-locator-variable
-
-* w3-draw.el: Fixed O-T-M-P error
-
-* w3-draw.el: Background bitmaps working again
-
-* w3-about.el: fixed typo
-
-
-Sat Aug 19 23:39:01 1995  William Perry  <address@hidden>
-
-* w3.el: Made the netpbm stuff come after the loading of the emacs-specific
-file, and now checks to see if w3-insert-graphic is bound before doing
-any of its checking, so that Emacs 19 etc users won't get the warning.
-Also now checks for either pbmtoxbm or ppmtoxbm, since NETPBM doesn't
-have ppmtoxpm
-
-* docomp.el: Added stub for emx-binary-mode
-
-Fri Aug 18 15:28:14 1995  William Perry  <address@hidden>
-
-* w3-xemac.el: Hack to let old xpm icons work for now
-
-Thu Aug 17 23:46:58 1995  William Perry  <address@hidden>
-
-* w3-vars.el, w3-draw.el: Basic support for raman's <label> stuff for forms
-
-* w3.el: Fixed typo in w3-batch-fetch
-
-Mon Aug 14 15:00:37 1995  William Perry  <address@hidden>
-
-* w3.el, w3-xemac.el, w3-draw.el: Can now specify width and height on mpegs
-
-* w3-xemac.el: Use new version of xpm-button.el
-
-* xpm-button.el: New version from kyle
-
-* w3.el: Fixed typo in warning about netpbm utilities
-
-Sun Aug 13 17:50:20 1995  William Perry  <address@hidden>
-
-* xpm-button.el: Made it so it doesn't bomb out on a tty
-
-* dist.Makefile: added xpm-button to the distribution
-
-* xpm-button.el: Initial revision
-
-* w3-style.el: fixed a few typos
-
-
-* w3-xemac.el:
-Now uses the xpm-button program to make textual toolbar icons when necessary
-
-Sat Aug 12 02:33:49 1995  William Perry  <address@hidden>
-
-* w3-about.el: Added about:license and about:warranty URL nodes
-
-* w3-draw.el: Catch errors when making w3-graphic-face
-
-* w3.el: Changed the behaviour of url-keep-history - the history list is only
-saved to disk if this is eq to `t'.  Setting it to anything else
-(usually a number) will keep the list in memory so that
-w3-show-history-list can still work.
-
-* w3.el: Don't add the initial page to the history list, so hitting 'B' in the
-first W3 buffer won't take you out of any w3-mode buffers.
-
-* w3-beta.el, w3-hot.el, w3-style.el, w3.el:
-Always set coding-system to *noconv* in MULE when inserting file contents
-
-Fri Aug 11 13:43:14 1995  William Perry  <address@hidden>
-
-* w3-beta.el, w3-draw.el:
-Moved w3-show-invisible-href into w3-draw to avoid invalid macro stuff
-
-* w3-parse.el, w3-draw.el: Don't swallow spaces after <XMP>
-
-
-* w3-xemac.el:
-New function w3-start-image-cache-timer that will time out all images
-after 5 minutes and cause a garbage-collect so that the pixmaps get
-returned to the windowing system.  This function will get smarter
-soon.
-
-* w3-xemac.el:
-New variable w3-toolbar-type to control waht the toolbar looks like.
-Can be 'pictures' 'text' or 'both' for icons only, text only, or
-captioned icons repsectively.
-
-Thu Aug 10 23:15:44 1995  William Perry  <address@hidden>
-
-* w3.el: Put up a big ugly warning if cannot find any of the netpbm utilities
-at startup
-
-
-* w3-draw.el:
-The size of a <SELECT> area is now defined by the maximum of all the
-lengths of the displayed strings or the SIZE attribute.
-
-* w3-draw.el: No longer picks up the last item of a <SELECT> form area when no
-<OPTION DEFAULT> is present
-
-* w3-xemac.el: Asynch during images should be correctly turned off now
-
-Sun Aug  6 15:58:35 1995  William Perry  <address@hidden>
-
-
-Sat Aug  5 06:11:02 1995  William Perry  <address@hidden>
-
-* w3.el, w3-vars.el: New binding of space to w3-scroll-up
-
-
-* w3.el, w3-draw.el, w3-beta.el, w3-vars.el: More stuff from the MULE folks
-
-
-* w3-xemac.el: Added separators between toolbar buttons
-
-Sat Jul 29 19:13:33 1995  William Perry  <address@hidden>
-
-
-Sat Jul 22 02:51:16 1995  William Perry  <address@hidden>
-
-* w3-e19.el:
-Don't choke if w3-mode-go-menu is not a keymap in w3-create-hotlist-menu
-
-Fri Jul 21 13:44:30 1995  William Perry  <address@hidden>
-
-* w3-parse.el:
-Added let bninding around the call to sera-to-fidel-marker to bind
-sera-being-called-by-w3 so that all is well with the world when using
-it with mule 2.2.3 for ethiopic text
-
-Thu Jul 20 04:06:34 1995  William Perry  <address@hidden>
-
-* w3.el: Fixed doc string for w3-open-local - also added autoloads for the
-w3-maybe-follow-* functions
-
-Tue Jul 18 13:24:39 1995  William Perry  <address@hidden>
-
-* w3-beta.el, w3-hot.el:
-Moved all the hotlist stuff out into w3-hot.el, in preparation for writing
-more robust hotlist handling (HTML files, etc, as hotlists).
-
-Mon Jul 17 14:05:31 1995  William Perry  <address@hidden>
-
-* w3-draw.el: <HR> handling now inserts fill-prefix/etc if in lists.
-
-Wed Jul 12 12:42:03 1995  William Perry  <address@hidden>
-
-* w3-xemac.el:
-Patch from chuck to use XBM version of toolbar icons if XPM support
-not available.
-
-Tue Jul 11 00:01:49 1995  William Perry  <address@hidden>
-
-
-Mon Jul  3 15:28:33 1995  William Perry  <address@hidden>
-
-* w3-draw.el:
-Fixed problem with multiple <textarea> tags would 'merge' the default
-contents.  Blah.
-
-
-* w3-draw.el:
-Fixed a slight formatting problem for <select multiple> lists when
-within a centered area - looked like crap.
-
-* w3-draw.el: Don't load background images if w3-delay-image-loads=nil
-
-Sun Jul  2 03:35:07 1995  William Perry  <address@hidden>
-
-* dist.Makefile: Added new target for w3-hot.elc
-
-* w3.el: Extracted hotlist functions into w3-hot.el
-
-* w3-hot.el: Initial revision
-
-* w3-vars.el, w3.el: Changed *-hooks to be *-hook'
-
-Sat Jul  1 17:14:23 1995  William Perry  <address@hidden>
-
-* w3-mule.el: Fixed problem in w3-convert-code-for-mule
-
-Thu Jun 29 16:27:33 1995  William Perry  <address@hidden>
-
-* dist.Makefile: Few more tweaks to the makefile
-
-* dist.Makefile: Now tries to create INFODIR if it doesn't exist
-
-* w3-e19.el, w3-mule.el, w3-vars.el, w3.el:
-Various patches from  Katsumi Yamaoka <address@hidden> Katsumi Yamaoka 
<address@hidden> for MULE stuff
-]
-
-* w3.el: Fixed a hidden forms problem.
-
-Tue Jun 27 04:17:59 1995  William Perry  <address@hidden>
-
-
-Mon Jun 26 02:29:33 1995  William Perry  <address@hidden>
-
-* w3-wemac.el, w3-xemac.el, w3-e19.el: Fixed problem pointing to w3_toc.html
-
-Sun Jun 25 22:28:28 1995  William Perry  <address@hidden>
-
-* w3-e19.el: Fixed problem in 19.29 where there were two help menus.
-
-
-* w3-sysdp.el: Some more device-* functions
-
-* w3-sysdp.el: More NS problems resolved
-
-* w3-xemac.el: Removed autoload for Info-goto-node
-
-* w3-sysdp.el: Fixed problem in w3-device-class on NeXTstep
-
-* w3-draw.el: Fixed problem in w3-get-resource on NeXTstep
-
-* w3-beta.el, w3-draw.el, w3-epoch.el, w3-mule.el, w3-srch.el, w3-style.el, 
w3-sysdp.el, w3-xemac.el, w3.el:
-Continue movement to using w3-sysdp.el defined functions instead of
-url-* funcs
-
-* dist.Makefile: Removed extraneous w3-sysdp.el from SOURCES macro
-
-Wed Jun 21 20:04:44 1995  William Perry  <address@hidden>
-
-* w3-xemac.el: Few changes for 19.12
-
-* w3-draw.el: New version of w3-pause for XEmacs
-
-* w3-draw.el: Fixed blinking
-
-Tue Jun 20 14:10:49 1995  William Perry  <address@hidden>
-
-* w3-parse.el: <listing> now works.
-
-* w3-draw.el: Fixed <secret> handlig ng when not in XEmacs 19.12
-
-Mon Jun 19 15:12:18 1995  William Perry  <address@hidden>
-
-
-* w3-sysdp.el: Fixed problem in device-class with arg not being optional
-
-Sun Jun 18 21:41:36 1995  William Perry  <address@hidden>
-
-* w3-sysdp.el:
-Fixed bug in emacs-19 version of device-class on non-color displays
-
-* w3-sysdp.el: Rewrote device-class
-Added device-pixel-width and device-pixel-height
-
-* w3-xemac.el: New function w3-ensure-toolbar-visible
-
-
-* w3-draw.el: Moved valid-color-name-p definition over into w3-sysdp.el
-
-Sat Jun 17 17:50:44 1995  William Perry  <address@hidden>
-
-* docomp.el: More toolbar stuff
-
-* docomp.el: Removed lots of stuff that isn't necessary now that we are using
-w3-sysdp.el all over the place
-
-* w3-sysdp.el: Few more bugfixes
-
-
-* w3-sysdp.el: Fixes for nextstep
-
-* w3-sysdp.el:
-Fixed definition of device-class so that it won't choke and die under
-NeXTstep.
-
-* w3-draw.el:
-If w3-delimit-links is non-nil, put delimiters around submit/reset
-form areas.
-
-* w3-xemac.el, w3-e19.el:
-New options in menu to control honoring of refresh headers and color requests
-
-Fri Jun 16 21:52:39 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Now honors multiple <title></title> crap like netscape.
-
-* w3.el: Fixed handling of refresh header if url-honor-refresh-requests == 'ask
-
-* w3.el: Ask the user before submitting a bug.
-
-* w3-sysdp.el: Removed scrollbar functions.
-
-Thu Jun 15 23:42:26 1995  William Perry  <address@hidden>
-
-* dist.Makefile: Always use @echo so it doesn't show up twice.
-
-
-* w3-xemac.el: More <link>-controlled toolbar stuff
-
-
-* w3-xemac.el: Don't call device-type with an argument.
-
-* w3-beta.el, w3-draw.el:
-Fixed a few problems with compatibility with FSF19 in X mode
-
-
-* dist.Makefile: Added urlauth to makefile
-
-* w3-epoch.el: Fixed problem in w3-map-links
-
-
-Wed Jun 14 23:38:46 1995  William Perry  <address@hidden>
-
-
-* w3.el: Removed a few things that are now in w3-sysdp.el
-
-* w3-sysdp.el:
-Changed sysdep-defalias to make sure that 'def' is fboundp if its a
-symbol, so that bogus defs of make-frame, etc, are not created in
-emacs18
-
-* w3.el: Few things to get a nice clean compile using w3-sysdp
-
-* w3-xemac.el:
-Removed loading of w3-sysdp, since it is loaded for everything now.
-
-* w3-sysdp.el: More functions added
-
-* w3-print.el, w3-epoch.el, w3-emacs.el, w3-e19.el, w3-draw.el:
-Few things to get a nice clean compile using w3-sysdp
-
-* docomp.el: Now loads w3-sysdp during compilation
-
-* w3-xemac.el: Stubs for <LINK> specific toolbar stuff.
-
-* w3-parse.el: Rewrote w3-can-safely-ignore as a macro
-
-Tue Jun 13 15:38:32 1995  William Perry  <address@hidden>
-
-
-* w3-xemac.el:
-Moved some stuff over into w3-sysdp.el for a truly clean compile.
-Fixed the new 'privacy' menu item
-
-* w3.el: Added back in text/plain encoder for forms
-
-* w3-xemac.el:
-make sure that when we add our options/help menus to the menubar, we
-do it to the global menubar, not just the current one, which could be
-anything, but usually GNUS or VM if not the default.
-
-* w3-xemac.el: Fixed w3-x-poup-menu bug.
-
-* w3-xemac.el:
-Fixed problem skip was having at http://www.calendars.com/concerts/
-
-Mon Jun 12 20:32:04 1995  William Perry  <address@hidden>
-
-* w3-wemac.el: Added back in crufty old menu definitions for use in WinEmacs
-
-* w3-xemac.el: New 'save options' item
-
-
-* descrip.mms, dist.Makefile, w3.el:
-Added back in the requiring of w3-wemac - just too much different
-stuff between it and even 19.10.
-
-* w3-xemac.el:
-Check for what type of menu we are displaying in w3-sensitize menu, or
-some weird stuff could happen (like adding 'go' and 'view' menus to
-the 'Emacs' type menubar.
-
-* w3-xemac.el: Reordered some functions to avoid warnings in byte compiler
-
-* w3-xemac.el:
-Added a button ala VM to swap between the global menubar and the W3 one.
-
-* w3.txi: Added stub for VMS section of documentation
-
-* w3.el: Various patches from Richard Levitte <address@hidden>.
-(w3-do-setup): expand VMS Mosaic files correctly.
-
-* docomp.el: Various patches from Richard Levitte <address@hidden>.
-start with inserting the current directory into load-path.
-(hack-dot-emacs): remove the two first items from
-command-line-args-left.  Otherwise, Emacs tries to work on them when
-hack-dot-emacs is done.
-
-* descrip.mms:
-Added the VMS build file from Richard Levitte <address@hidden>
-
-* descrip.mms: Initial revision
-
-Sun Jun 11 22:50:50 1995  William Perry  <address@hidden>
-
-
-* w3.txi:
-Added in section on disk caching, filled out the Digest authentication
-mechanism and SSL sections as well.  Only things left to do are the
-sections on non-unix platforms.
-
-* w3-xemac.el:
-Deal gracefully with markers passed into w3-add-zone (for WinEmacs)
-
-
-* w3-draw.el:
-Fixed stupid FSF 19 lossage where x-color-defined-p signals an error
-in a tty instead of failing gracefully.  Robustness?  Whassat?
-
-
-* w3-draw.el:
-Fixed problem in w3-handle-paragraph where re-search-forward could signal an 
error because 'NOERROR' was not t.
-
-* w3.el: Fixed w3-find-this-file
-
-Sat Jun 10 23:19:30 1995  William Perry  <address@hidden>
-
-* w3.el: Fixed stupid screwup
-
-* w3.el: Run the value of a submit button through url-hexify-string
-
-* w3-vars.el, w3-draw.el:
-Renamed w3-user-colors-take-preference -> w3-user-colors-take-precedence
-
-* w3-draw.el, w3.el: IMAGE inputs in forms now work (sortof)
-
-Fri Jun  9 15:01:05 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Fixed problem with unterminated <a> refs.
-
-Thu Jun  8 14:44:35 1995  William Perry  <address@hidden>
-
-
-* w3-draw.el: Fixed plaintext handling.
-
-Mon Jun  5 15:12:17 1995  William Perry  <address@hidden>
-
-* w3-e19.el: Added color printing toggle to emacs19 menus
-
-* w3-xemac.el: Added color printing toggle to xemacs menus
-
-* w3.el: After reading a form entry area, make sure we mark the buffer as not
-modified.
-
-
-* w3-draw.el:
-fixed w3-handle-paragraph to handle weird circumstances where it could
-try to make-string with a negative first arg.
-
-* w3.el: Patches from address@hidden for his local file handling
-stuff
-
-Sun Jun  4 20:58:40 1995  William Perry  <address@hidden>
-
-
-Sat Jun  3 17:07:32 1995  William Perry  <address@hidden>
-
-* dist.Makefile:
-Patch from Skip Montanaro <address@hidden> to make sure we delete
-old copies of the .el and info files, since they are read only by
-default, and this would cause the installation to fail.
-
-* w3-xemac.el:
-Make sure we don't try to set the X selection from a tty only xemacs -
-it signals a wrong-device-type error.
-
-
-Fri Jun  2 13:58:01 1995  William Perry  <address@hidden>
-
-* w3-beta.el:
-Removed dependence on url-grok-url from the netscape cache importing
-
-Tue May 30 16:29:16 1995  William Perry  <address@hidden>
-
-* w3-draw.el:
-Now recognizes <link rel="style"> as well as <link rel="stylesheet">
-
-* w3.el: Fixed bug in w3-hotlist-delete that would choke and die on items named
-'hotlist' - fixed the regular expression it was working with.
-
-
-* w3.el: Few fixes
-
-
-* w3-draw.el: Nuke all faces when leaving a <pre> segment
-
-
-Mon May 29 18:24:04 1995  William Perry  <address@hidden>
-
-
-* w3-style.el, w3-print.el, w3-parse.el, w3-e19.el, w3-beta.el, w3-about.el, 
w3.el, w3-draw.el:
-Removed lots of function documentation and left it as comments.  These
-functions are not meant to be seen by everyone, and this saves space
-in the .elc files.
-
-* w3.el: Made w3-save-binary-file default to a sane filename
-
-
-* w3-10646.el:
-Removed bogus copyright, added back in the real one from Erik Naggum.
-gotta hate cut & paste
-
-* w3-xemac.el:
-Make sure the links menu is broken up when using the filter method in 19.12
-
-
-* w3.el, w3-xemac.el, w3-epoch.el, w3-draw.el:
-Now deals with the removal of url-parse-relative-link
-
-Sun May 28 22:28:55 1995  William Perry  <address@hidden>
-
-
-* w3.el, w3-about.el: Use the new url-register-protocol interface
-
-* w3-vars.el: Fixed w3-modeline-format to look nicer
-
-
-Sat May 27 22:00:15 1995  William Perry  <address@hidden>
-
-* dist.Makefile: Removed w3-wemac from the distribution and makefile rules
-
-* w3.el: No longer require w3-wemac if running under windows - the standard
-w3-xemac package should handle it now.
-
-* w3-vars.el, w3.el:
-New variable w3-modeline-format that controls the modeline look when
-in w3-mode buffers.
-
-* w3-vars.el: Removed crufty old menu definitions
-
-* w3-draw.el:
-The new color-frobbing stuff works in older versions of lemacs/xemacs
-
-* w3-xemac.el: First pass at a merger of w3-wemac.el and w3-xemac.el
-
-
-* w3-xemac.el:
-Add the options and help menus to the main menubar in all versions of
-xemacs
-
-Fri May 26 23:42:29 1995  William Perry  <address@hidden>
-
-* w3-xemac.el: More patches from chuck for the next great xemacs beta
-
-* w3-style.el, w3-draw.el:
-Avoid calling of set-face-xxx functions directly, use 'apply' to avoid
-Emacs-19 lossage of defsubsts that makes .elc files non-portable to
-XEmacs.
-
-* w3-draw.el: Honor the <base> tag stuff when doing forms.
-
-* w3-vars.el: Few fixes for the latest beta of XEmacs 19.12
-
-Thu May 25 19:44:48 1995  William Perry  <address@hidden>
-
-* w3-draw.el:
-The body color handling stuff now deals gracefully with bad colors
-
-* w3.el: Few fixes for VRML
-
-* w3-style.el: Can now compile under Emacs 18 again.
-
-Wed May 24 13:47:17 1995  William Perry  <address@hidden>
-
-* w3-e19.el: Rearranged some of the menus to be like the XEmacs counterparts
-
-Tue May 23 14:30:05 1995  William Perry  <address@hidden>
-
-* w3-xemac.el: More renamings for XEmacs 19.12
-
-Mon May 22 12:20:36 1995  William Perry  <address@hidden>
-
-* w3-xemac.el, w3-e19.el:
-Renamed url-automatic-cacheing -> url-automatic-caching
-
-* w3-xemac.el: Removed call to bogus exit-emacs func.
-
-Wed May 17 16:20:46 1995  William Perry  <address@hidden>
-
-* w3-xemac.el: Support the newer way of doing toolbars in XEmacs 19.12
-
-* w3-xemac.el: Patch from chuck for latest XEmacs 19.12 toolbar stuff
-
-
-Tue May 16 20:18:40 1995  William Perry  <address@hidden>
-
-* w3.el: VRML stuff
-
-
-Mon May 15 03:38:36 1995  William Perry  <address@hidden>
-
-* w3.el: If no last-modified, don't try to refetch the head info if not in file
-or ftp mode.
-
-
-* w3-style.el:
-New w3-spatial-to-canonical function that can convert something like
-1in or 12pt to a pixel-based representation.
-
-* w3-xemac.el: Changed menus when under Lemacs 19.10 look just like 19.12
-
-Sun May 14 17:37:35 1995  William Perry  <address@hidden>
-
-* w3-draw.el:
-Fixed problem with <p align="xxx"> .... <p> not properly terminating
-the alignment
-
-
-* w3-about.el: hehe
-
-* w3.el: Better cleanup of the temp directory.
-
-
-Sat May 13 21:03:14 1995  William Perry  <address@hidden>
-
-
-* w3-draw.el: Finished up cookie interface
-
-* w3-draw.el:
-Stub for interface to the cookie() function of emacs from within an HTML
-document.
-
-* w3-about.el: New stylesheet for about: pages
-
-* w3.el: Make w3-reload-document not recenter the window
-
-* w3-draw.el: Fixed isindex handling for prompt=xxx and action=xxx
-
-* w3-draw.el:
-Make sure the emphasis on quotes (<q></q>) includes _both_ quote chars.
-
-* w3-e19.el:
-Don't blindly set the mouse-face on anything with 'w3 in the property
-list.  would cause things like <a name=xxx> to highlight.
-
-
-* w3-xemac.el: XEmacs 19.12 tweaks
-
-* w3-about.el:
-New authors page that doesn't crap out in XEmacs 19.11 / Lemacs 19.10
-
-* w3-xemac.el: Few more tweaks to the menus
-
-* docomp.el: More garbage for a clean compile
-
-* w3-xemac.el, w3-draw.el, w3.el: Few fixes for the latest beta of XEmacs 19.12
-
-Thu May 11 16:32:17 1995  William Perry  <address@hidden>
-
-
-* w3-xemac.el: Added buffers menu to w3 menu
-
-Wed May 10 22:19:25 1995  William Perry  <address@hidden>
-
-* w3-xemac.el:
-Don't set up the toolbar if w3-toolbar-orientation is not 'top 'left
-'right or 'bottom.  Don't set the menubar for the w3 buffer if there
-is no default one.  Copy the options menu into the main options menu
-if in XEmacs 19.12
-
-* w3-xemac.el: Fixed images in 19.12
-
-* w3.txi: Lots of changes
-
-* w3.el: Added some stuff from the texinfo docs
-
-Tue May  9 16:43:46 1995  William Perry  <address@hidden>
-
-
-Mon May  8 21:45:28 1995  William Perry  <address@hidden>
-
-* w3-emacs.el:
-Fix from Michael Welsh Duggan <address@hidden> for w3-back-link
-in emacs 18
-
-* dist.Makefile: Added ssl.el file
-
-* w3-draw.el:
-Fixed problem with <br> in indented areas inserting the indentation twice
-
-* docomp.el: Turn off new emacs19 dynamic loading gunk
-
-Sun May  7 23:33:18 1995  William Perry  <address@hidden>
-
-
-* w3-style.el: Few fixed for XEmacs 19.12
-
-* w3-style.el: More style hackings
-
-* w3-parse.el:
-Gracefully handles stuff like '< ' in a document - this should be
-shown.  Screw document authors that do stuff like '< a' - its wrong.
-
-* w3.el: Make w3-mark-link-as-followed be a no-op if w3-emacs19-hack-faces-p is
-non-nil, otherwise weird things happen with too many spaces inserted
-in the buffer, and there was really no difference between the two
-renderings in that nasty mode anyway.
-
-* w3-xemac.el: Fixed typo in spiffy new menus for xemacs 19.12
-
-* w3.el: Let w3-notify-when-ready deal gracefully with a null argument
-
-* w3-draw.el: Make </pre> without matching <pre> act like <p>
-
-* w3-draw.el: Added the <flame> tag
-
-* RelNotes2.2: Initial revision
-
-* w3-draw.el: Only set w3-last-tag if non-text
-
-* w3-draw.el: Reverted to old <dt> handling - looks better.
-
-* w3-about.el: Removed a few dependencies on the old 'b64-xxxx' functions
-
-* w3-style.el:
-New stylesheet parser - can handle the new grammar agreed upon by
-H&kon and I.
-
-* dist.Makefile: Added new base64 package
-
-Sat May  6 21:46:21 1995  William Perry  <address@hidden>
-
-
-* w3-xemac.el: Now puts help-echo property on images that are links
-
-* w3.el: Now includes a mime-version header for mailed documents
-
-
-* w3-emacs.el: New version of w3-forward-link and w3-back-link that skip over
-'w3-graphic zones.
-
-* w3-draw.el: <tab id=xxx> and <tab to=xxx> work now
-
-* w3.el: Fixed problem with command-line-args-left being unbound when not in
-startup phase
-
-
-* w3-draw.el: New way to handle secrets fixed in old versions of emacs.
-Default background pixmap to nil
-
-* w3-about.el: New text for easter egg tag #1
-
-* w3-xemac.el: Image-type selector menu is back.
-
-
-* w3-xemac.el:
-Changed mouse activation for image links to button2 to be consistent
-
-* w3.txi: Few spelling changes
-
-Fri May  5 23:05:39 1995  William Perry  <address@hidden>
-
-* w3.el: Can now do:
-emacs -f w3-fetch [url]
-
-* w3.el: Can now have 'PUT' as the method for a form.
-
-* w3-xemac.el: Return the bitmap
-
-* w3-draw.el: Now handles the 'background' bitmap tag of netscape
-
-* w3-vars.el, w3-draw.el: Few changes to make the 'secret' tag work better.
-
-
-* w3-xemac.el: Reordering of defvars to make sure we can get a clean compile
-
-* w3-xemac.el: Use glyph-width if its available.
-
-
-* w3-draw.el: Netscape body tags would choke emacs18
-
-* w3.el: Do w3-setup in w3-batch-fetch
-
-
-* w3.el:
-w3-save-as can now take an optional argument to tell it what to save as
-
-Thu May  4 23:58:53 1995  William Perry  <address@hidden>
-
-* w3-xemac.el: Cool new menus for XEmacs
-
-* w3-draw.el: Fixed bug in handling of multiple <dt> elements before a <dd>
-
-Mon May  1 20:10:36 1995  William Perry  <address@hidden>
-
-* w3-e19.el, w3-vars.el: Use the new about: pages
-
-* w3-draw.el: Fixed <link rel="stylesheet" href="xxxx"> handling
-
-* w3-style.el: fixed style handling from a URL/href
-
-Sun Apr 30 20:57:17 1995  William Perry  <address@hidden>
-
-
-* w3-xemac.el: New glyph interface for XEmacs 19.12
-
-* w3-about.el: More about: docs.
-
-* w3-epoch.el, w3-draw.el: More fixes for epoch
-
-* w3.el: Fixed links of just images in XEmacs
-
-Sat Apr 29 22:25:33 1995  William Perry  <address@hidden>
-
-* docomp.el, w3-epoch.el, w3-draw.el: More epoch fixes
-
-* w3-draw.el: The netscape background/foreground body colors work in epoch now.
-
-* w3-epoch.el: All the face stuff now works in epoch again.
-
-* w3-parse.el: Use w3-10646 if available
-
-
-* w3-10646.el: New keywords
-
-* w3-10646.el: Initial revision
-
-Fri Apr 28 22:52:46 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Implemented teh 'add.before' and 'add.after' stylesheet mechanism
-
-* w3.el: Fixed case where return would pop up an x-menu in emacs19
-
-* w3-style.el: Fixed problem with leading whitespace
-
-* w3.el: Added about URL handling
-
-* w3-draw.el: Fix to jnetscape body tags
-
-* w3-about.el: Initial revision
-
-
-Thu Apr 27 01:40:39 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Few updates for XEmacs 19.12
-
-Wed Apr 26 17:59:03 1995  William Perry  <address@hidden>
-
-
-Tue Apr 25 22:15:55 1995  William Perry  <address@hidden>
-
-* w3.el: w3-in-assoc now silently skips nonstrings in the car
-
-* w3-draw.el: Can now use regexps in stylesheets (h[1-6], etc)
-
-* w3-style.el: Added DSSSL-lite parser
-
-
-* w3-draw.el: Now handle <link rel=stylesheet href=xxxx>
-
-* w3-style.el: Modify the accept headers when retrieving a URL for a stylesheet
-
-Mon Apr 24 07:52:37 1995  William Perry  <address@hidden>
-
-* w3-print.el: Wrap w3-convert-html-to-latex in case-fold-search == t
-
-* w3-vars.el: Added w3-node-style and w3-visited-node-style to the persistent
-variables list - this is necessary for letting
-w3-mark-link-as-followed to work with the netscape body tags.
-
-* w3-vars.el: Make w3-node-style and w3-visited-node-style buffer-local, or the
-netscape tags on <body> screw up subsequent documents!
-
-* w3-parse.el: Removed a condition-case in w3-nuke-entities-in-region
-
-* w3-xemac.el: Few more toolbar fixes.
-Fixed autoload for Info-goto-node
-
-Sun Apr 23 22:01:08 1995  William Perry  <address@hidden>
-
-* w3.el: Fixed w3-backward-in-history
-
-* w3-style.el:
-New function w3-create-x-font to create a font based on the family,
-style, and size.
-
-* w3-xemac.el:
-New variable w3-toolbar-orientation to control what side of the frame
-the toolbar appears on.
-
-* w3-draw.el: New way of getting info from stylesheets to synch up with the new
-stuff from H&kon.
-
-* w3-xemac.el: Added button for hotlists in the toolbar
-
-* w3-xemac.el: Various and sundry toolbar stuff.
-
-* dist.Makefile: Now makes the install directory if it doesn't exist.
-
-* w3-draw.el: <blink> now works on tty's in XEmacs.
-Scaling of fonts in a tty-only XEmacs works also.
-
-Sat Apr 22 13:42:25 1995  William Perry  <address@hidden>
-
-* w3-print.el, w3.el, w3.txi: Changed references to info.cern.ch to w3.org
-
-
-Fri Apr 21 19:34:47 1995  William Perry  <address@hidden>
-
-* w3.el: Removed a few old variables
-
-* w3-draw.el:
-Don't set attributes on default face if they are nil - bad things man.
-
-* w3-epoch.el, w3-e19.el, w3-wemac.el: Removed a few old variables
-
-* w3-xemac.el:
-Finally fixed problem in lemacs/xemacs form entry where every once in
-a while it would choke with a 'wrong-type-argument stringp (wierd
-list)' error.
-
-* w3-draw.el: Fixed problem with the <body> attributes when in Emacs 19
-
-* w3-vars.el, w3-draw.el:
-New variable w3-user-colors-take-preference to control whether the
-netscape tags on <body> are honored or not.
-
-* w3-xemac.el: Provide a definition of add-submenu for older XEmacsen
-
-* w3.el, w3-vars.el: Removed a few old variables
-
-* w3-draw.el: Now honor the netscape attributes on <body>
-
-* w3-vars.el: Added keybinding for w3-mail-document-author
-
-* w3-beta.el: Reimplemented the w3-show-headers stuff.
-
-Thu Apr 20 20:23:06 1995  William Perry  <address@hidden>
-
-* w3.el: w3-document-information now looks much prettier
-
-* w3.el: Fixed w3-mail-to-author and Renamed it to w3-mail-document-author to
-avoid confusion about what 'author' we are mailing to - the documents,
-or Emacs-w3's
-
-
-* w3.el: Revamped the forward and backward history handling
-
-* w3-draw.el: Got <p nowrap> working
-
-Wed Apr 19 17:01:58 1995  William Perry  <address@hidden>
-
-
-* clean-cache: Initial revision
-
-* w3.el: Revamped how <link> is handled.  Added printing of <link> data in
-w3-document-information
-
-* w3-draw.el:
-Revamped how <link> is handled.  Fixed a bug in meta handling - was
-not downcasing the http-equiv, so it could not always find an old
-value in url-current-mime-headers to replace.
-
-* w3-vars.el: changed w3-list-chars-assoc to use symbols instead of strings
-
-* w3.txi: Documented change in w3-list-chars-assoc
-
-* w3-draw.el: Converting w3-list-chars-assoc won't die if you do it twice
-
-* w3-sysdp.el: Updated to latest version from XEmacs
-
-* w3-sysdp.el: Removed keywords
-
-Sun Apr 16 22:41:11 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Fixed problem in w3-handle-emphasis-end
-
-* w3-draw.el: Added code to fixup spaces are . and !
-
-* w3-beta.el: Now parses out the link commands in the mime headers
-
-* w3.el: Issue an error if they chose a link type (rel or rev) that the
-document did not contain when in w3-use-links
-
-* w3-style.el:
-Make the buffer not modified before killing it when parsing a style sheet
-
-* w3.el: Fixed parsing of default stylesheet
-
-* w3.el: Fix for form field reversals in submissions
-
-Sat Apr 15 23:33:36 1995  William Perry  <address@hidden>
-
-* w3-beta.el: Can now import netscape bookmark files
-
-* w3-draw.el:
-Now handles <q></q> differently - inserts "" around the material, and
-you can specify the start and end quotes in stylesheets with:
-q: startquote=``
-q: endquote=''
-
-* w3-draw.el:
-Was not expanding relative URLs before checking whether they had been
-visited with w3-delimit-links non-nil.  This would lead to weird
-looking links like [[something}} - not very pretty.
-
-* w3-vars.el, w3.el: Now reads in a default stylesheet for the user if
-w3-default-stylesheet is non-nil.  This can be a URL.
-
-
-* w3.el: Made w3-pass-to-viewer be more like man when in asynchronous mode.
-
-* w3-vars.el: New variable w3-notify
-
-* w3-parse.el:
-Fixed problem in pre/xmp handling where it would choke if there were
-extra endtags and swallow-newlines went negative.
-
-Fri Apr 14 23:52:51 1995  William Perry  <address@hidden>
-
-* w3.el, w3-xemac.el, w3-wemac.el, w3-vars.el, w3-style.el, w3-srch.el, 
w3-print.el, w3-parse.el, w3-next.el, w3-mule.el, w3-mac.el, w3-epoch.el, 
w3-emacs.el, w3-e19.el, w3-draw.el, w3-beta.el:
-Changed keywords
-
-* w3-vars.el: removed old variable w3-global-history-completion-list
-
-
-* w3-draw.el: No inherent maxlength on <textarea> fields
-
-* w3.el: Added alias for w3-popup-info
-
-* w3.el: Always goto (point-min) in w3-document-information and w3-popup-info
-
-* w3-vars.el: Added keybindings for w3-document-information and w3-popup-info
-
-Thu Apr 13 21:12:33 1995  William Perry  <address@hidden>
-
-
-* w3-style.el: w3-blend-colors now works in XEmacs 19.12
-
-* w3-style.el: Added function w3-blend-colors (FSF Emacs-19 specific)
-
-* w3-parse.el:
-Make sure to clear the minibuffer when done parsing - otherwise it
-could leave a 'Parsed x of y (zz%)' message, which can make people
-think it is hung.
-
-* w3-draw.el, w3.el: Fixed <link> handling
-
-Wed Apr 12 03:24:02 1995  William Perry  <address@hidden>
-
-* w3-draw.el:
-Fixed a few problems with stylesheets losing the alignment info from
-headers too soon.
-
-* w3-draw.el:
-<p></p>, <div></div>, and <note></note> can all specify the face to
-use for an element via the 'class' attribute.
-
-* w3-draw.el: Fixed a bug in using the 'class' attribute to add faces to text.
-Would forget what tag would end the current face, so faces went on
-forever.  Ugh!
-
-* w3-draw.el: The 'class' attribute can now be used to add faces to text.
-
-* w3-style.el: Changed how style sheet faces are regenerated.  Now stores the
-face-name as an item in w3-current-stylehseet (assoc "face" ...) to
-get it.
-
-Tue Apr 11 23:11:58 1995  William Perry  <address@hidden>
-
-* w3-sysdp.el: Added some more stuff from chuck
-
-* w3-draw.el: Fixed popping the alignment from an address tag if
-w3-right-justify-address is non-nil
-
-* w3-draw.el: Redid w3-get-default-style-info macro
-
-
-Mon Apr 10 22:46:14 1995  William Perry  <address@hidden>
-
-
-* w3-draw.el: Added thge marca sound for <hype> tag.
-
-* w3-draw.el: Now honors the 'class' attribute on any style-sheetable tag
-
-* w3-style.el:
-Few tweaks to how the style sheet is stored, to make using the 'class'
-attribute on tags quicker (stores an intern'd symbol and a string in
-the list)
-
-* w3.el: Fixed problem where inlined images on the local disk could get trashed
-because buffer-file-name was not nil in the buffer.
-
-
-* w3-draw.el: Fixed <font size=-x> handling
-
-* w3-parse.el: Call sera-to-fidel-marker if in mule.
-
-Sun Apr  9 18:37:24 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Fixed <div> </div> handling
-
-* w3-draw.el:
-Use copy-tree on w3-use-stylesheet so we don't side-effect the original list
-
-
-* w3-xemac.el: Added in the code to create the toolbar.
-
-* w3-beta.el: Fixed the importing of netscape cache files
-
-
-* w3-draw.el:
-Changed w3-push-alignment to be a little smarter - if align is null,
-don't bother pushing it on the stack.
-
-* w3-parse.el:
-Fixed a spacing problem that would show up when doing progressive
-rendering but not a w3-refresh-buffer.  Ugh.
-
-
-Sat Apr  8 23:34:06 1995  William Perry  <address@hidden>
-
-* w3.el: Made w3-generate-error check the contents of the ' *url-error*' buffer
-and use it as part of the error message.
-
-* w3-draw.el:
-Got rid of bad use of concat in w3-handle-font, and better handling of
-the font scaling.
-
-Fri Apr  7 22:59:07 1995  William Perry  <address@hidden>
-
-
-* w3-e19.el: Remove the files menu in emacs 19.29
-
-* w3.el: Fixed problem in mule with w3-save-binary-file
-
-* dist.Makefile: Added -no-site-file to BATCHFLAGS
-
-* dist.Makefile: More renaming for DOS lossage
-
-Wed Apr  5 19:59:33 1995  William Perry  <address@hidden>
-
-* w3.el: Fixed w3-fetch for working in buffers with no default url... d'ohhh
-
-
-* w3-draw.el:
-Fixed screwup in w3-handle-p that would push an alignment onto the
-stack twice for headers
-
-* w3.el: w3-fetch now has a 'silent' default - it doesn't insert the default as
-the default option - it checks if the user presses return, and uses
-the default if they did.
-
-* w3-draw.el: Now uses a stack of alignments, and honors the <div></div> tag.
-
-Tue Apr  4 17:29:32 1995  William Perry  <address@hidden>
-
-* dist.Makefile: Makefile now works in Windows and NT
-
-* w3.el: Removed anonymous lambda from w3-hotlist-apropos
-
-* w3.txi: Fixed typo in texinfo node
-
-Mon Apr  3 23:03:19 1995  William Perry  <address@hidden>
-
-
-* hype.au: Initial revision
-
-Sun Apr  2 20:17:02 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Fixed <meta> handling
-
-* w3.el: Fixed w3-popup-info
-
-
-* w3.txi: Basic documentation of the style sheet mechanism
-
-* w3-draw.el:
-Fixed the align=indent problem where first line of the indented region
-was not indented.
-
-* dist.Makefile: Renamed w3.texinfo to w3.txi, for 8.3 losingness
-
-
-* w3.txi: Removed all the 'WORK' areas except for the non-unix systems nodes.
-Put out a call for assistance to w3-beta and gnu-emacs-help for these
-areas.
-
-Tue Mar 28 23:36:30 1995  William Perry  <address@hidden>
-
-* w3.el: Fixed a few more concat'ing integer problems
-
-* w3-draw.el: Can now specify OL styles in stylesheets.
-
-
-* w3.el:
-Added w3-hotlist-apropos function from address@hidden (Michelangelo Grigni)
-
-* w3-xemac.el, w3-e19.el: Fixed concat'ing of ints
-
-Mon Mar 27 22:05:19 1995  William Perry  <address@hidden>
-
-* w3.el: Now requires w3-print
-
-* w3-draw.el: Only mangle headers if w3-delimit-emphasis is non-nil
-
-
-Sun Mar 26 19:50:16 1995  William Perry  <address@hidden>
-
-
-* dist.Makefile: Removed w3-main from the distribution - renamed to w3
-
-* w3.el: Moved w3-upcase-region into w3-draw.
-Now requires w3-style and all the new dipslay engine chunks.
-
-* w3-draw.el:
-Now initializes the current stylesheet to the user stylesheet before
-any drawing starts.
-
-* w3-vars.el:
-Made w3-header-chars-assoc work with the new display engine (mostly),
-and added a few more things to the state variables.
-
-* w3-style.el:
-Can now do font scaling in style sheets.  smarter about font.type.
-Only thing left is font.family
-
-
-* docomp.el: More var decls.
-
-* w3-wemac.el: Fixed w3-mouse-handler for windows
-
-* w3-draw.el:
-Make all face storage variables buffer-local for style-sheet stuff.
-
-* w3-style.el: Now handles fonts/colors in style sheets - whooo hooo!
-
-Sat Mar 25 23:38:49 1995  William Perry  <address@hidden>
-
-* w3-vars.el: Renamed w3-state-garbage-variable
-
-* w3-draw.el:
-Now uses style sheets to find alignment and width for the various tags
-before falling back on its defaults.
-
-
-* w3-parse.el:
-Fix for stupid people who don't use &amp; instead of & in the middle
-of a doc.
-
-
-* w3-xemac.el: Added w3-center-spaces and w3-right-spaces for
-centering/right-justifying pixmaps
-
-* w3-xemac.el, w3-sysdp.el:
-A few new functions for the latest and greatest beta
-
-* w3-vars.el: Changed a few of the menu names
-
-* w3-style.el: Now actually parses and stores the style sheet information
-
-* w3-draw.el: Handle case where tag is a list
-
-Fri Mar 24 14:36:09 1995  William Perry  <address@hidden>
-
-* w3-xemac.el: Now uses device-type for XEmacs 19.12
-
-Wed Mar 22 21:14:30 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Fixed a few spacing problems
-
-* w3-e19.el:
-Fixed w3-forward-link for links that were right up on top of each other.
-
-* w3-parse.el:
-Fixed screwup with unterminated quoted chars in attribute/value pairs
-
-
-* dist.Makefile: Removed w3-old
-
-* w3-draw.el: Fixed stupid typo when checking for faces.  d'ohhhh!
-
-Mon Mar 20 23:23:34 1995  William Perry  <address@hidden>
-
-* w3-xemac.el: Fixed problem with w3-extend-zone and detached extents
-
-* w3-draw.el: <option selected> now works again
-
-
-* w3-xemac.el:
-Set the help-echo property when showing form elements if possible.
-
-* w3-vars.el, w3-beta.el, w3-draw.el:
-Redid how state is kept - now uses a vector, which should be faster,
-and is able to be buffer-local.
-
-* w3-parse.el:
-w3-nuke-entities-in-region should no longer choke in odd circumstances
-with just '&' in a document.
-
-* dist.Makefile: Removed w3-forms - it has been assimilated
-
-* dist.Makefile: Added a few new dependencies
-
-
-* w3-draw.el: Added message when scaling fonts, just to keep the user informed
-
-* w3-wemac.el, w3-xemac.el, w3-e19.el:
-When moving the mouse over a submit button in a form, shows where the
-form will be submitted.
-
-* w3-draw.el: Fixed emacs-18 lossage in skip-chars-backward
-
-* w3-draw.el: Another fix to make sure <li><p> construct doesn't look like crap
-
-* w3-draw.el:
-Split the handling of the refresh header out into its own function so
-that it can be used from the drawing/parsing code for META commands
-
-Sun Mar 19 02:12:24 1995  William Perry  <address@hidden>
-
-* w3-parse.el: Fixed problem with window focus.
-
-* w3.el: Few fixes for passing to viewers
-
-* w3-parse.el: Set fill-column in w3-preparse-document
-
-Sat Mar 18 23:47:37 1995  William Perry  <address@hidden>
-
-* w3-parse.el: If parsing, do incremental display as well
-
-* w3-draw.el: Removed ugly hacks from w3-pause for emacs19 - just too ugly.
-
-
-* dist.Makefile, docomp.el:
-Take LISPDIR on the command line for hack-emacs-file
-
-* dist.Makefile: Removed EMACSTEMPLATE
-
-* dist.Makefile, docomp.el: hack-dot-emacs now takes a command line argument
-
-* w3-draw.el: links in tty mode won't show [[/{{
-
-* w3-vars.el: All graphical entities now have textual alternativs
-
-* w3-draw.el: Added graphic entities back in.
-
-* w3-draw.el: Able to embed a few more types
-
-* w3-parse.el, w3-draw.el: Added the base functionality for the embed tag
-
-Fri Mar 17 15:44:16 1995  William Perry  <address@hidden>
-
-* dist.Makefile: Removed some old targets, added new ones for new files
-
-* w3-style.el: Initial revision
-
-
-* w3-parse.el: Special handling for the <style> argument.
-
-* w3-vars.el, w3-draw.el: Moved variables into w3-vars.el
-
-* w3-parse.el, w3-draw.el: Basis for the <style></style> notation done
-
-Thu Mar 16 19:44:12 1995  William Perry  <address@hidden>
-
-* w3-draw.el:
-Fixed scaling of fonts, now handles cryptopt blocks for secure-http
-
-
-* w3-draw.el:
-Now no whitespace between link delimiters and the actual text of the link
-
-
-* dist.Makefile: Added md5 target
-
-* w3-parse.el, w3-draw.el, w3-beta.el:
-Now draws each signel item as it is parsed..
-
-Wed Mar 15 23:27:55 1995  William Perry  <address@hidden>
-
-
-* w3.el: Fixed a problem in w3-pass-to-viewer
-
-* w3-draw.el:
-Fixed problem with headers being hosed because of new way to do faces.
-
-* w3-draw.el, w3-xemac.el: Imagemaps work now
-
-Tue Mar 14 16:04:04 1995  William Perry  <address@hidden>
-
-
-* w3-draw.el: A few general performance increases
-
-Mon Mar 13 05:51:41 1995  William Perry  <address@hidden>
-
-* w3-beta.el, w3-draw.el, w3-e19.el, w3-mac.el, w3-next.el, w3-old.el, 
w3-vars.el, w3-xemac.el:
-Lots and lots of doc fixes to meet FSF/GNU guidelines.
-
-* w3-parse.el, w3.el, w3-e19.el, w3-draw.el: Few doc string fixes
-
-
-* w3-vars.el, w3.el:
-Now guess the value of w3-color-use-reducing based on values of
-x-display-visual-class and x-display-planes.
-
-* w3-draw.el:
-Fixed problem with indenting being lost in a list item after a sublist
-terminates.
-
-* w3-draw.el: Redid some of the font stuff.
-
-Sun Mar 12 17:31:59 1995  William Perry  <address@hidden>
-
-
-* w3-draw.el: Some basic table-drawing support put in.
-
-* w3-tables.el: Initial revision
-
-* w3.txi: Use active voice in keybinding descriptions.
-
-Sat Mar 11 22:20:21 1995  William Perry  <address@hidden>
-
-* w3-draw.el: More state kept - ugh.
-
-* w3-forms.el:
-Removed dependence on STREAM being defined - will make going totally asynch 
much easier
-
-* w3-vars.el, w3-parse.el, w3.el, w3-emacs.el: Removed 'backslashitis'
-
-* w3-e19.el: Removed a few unused variables
-
-* w3-draw.el: Optimized face stuff.
-
-* w3-beta.el: Removed 'backslashitis'
-
-* w3-vars.el, w3-e19.el: Change to the popup menu
-
-* w3-draw.el: Few fixes for blinking and wired text
-
-Fri Mar 10 23:18:30 1995  William Perry  <address@hidden>
-
-* w3-draw.el, w3-xemac.el: Fixed images as linkx
-
-
-* w3-draw.el: Fixed <br> in <dl> after a <dt> being indented too far
-
-* w3-draw.el: Fixed <br> in <ol> not being indented enough
-
-* w3-old.el: Now provides itself
-
-* w3-draw.el: New variable to turn off incremental display.
-
-* w3-draw.el: Does not display <certs> elements now.
-
-Thu Mar  9 20:35:12 1995  William Perry  <address@hidden>
-
-* w3-xemac.el, w3-epoch.el, w3-e19.el:
-Don't make so many faces if using the new display engine - we don't
-need any of the w3-xxxx-style ones.
-
-* w3-beta.el:
-Nuke w3-delayed-images and w3-delayed-movies in w3-refresh-buffer, or
-multiple images would get loaded!
-
-* w3-draw.el: Avoid calling w3-pause as often - speeds up redisplay a lot.
-
-* dist.Makefile:
-No longer byte-compile w3-sysdp - was causing too many problems.
-
-* w3-beta.el:
-No longer (goto-char (point-min)) in w3-show-buffer so that movement
-done while drawing is still honored.
-
-* w3-draw.el: Added a save-excursion around the last handle-paragraph so that
-movement done while drawing is still honored.
-
-* w3-xemac.el:
-Use copy-tree when available for menu copying - much more reliable
-
-* w3-mac.el: Added a provide for w3-mac
-
-* w3-xemac.el: Fixed problem with extents becoming detached in 19.12
-
-* w3-forms.el: Few forms fixes.
-
-* w3-beta.el: Added w3-install-latest from address@hidden
-
-* w3-beta.el: Fixed MCOM->netscape stuff.
-
-* w3-forms.el: Fixed misplaced parentheses
-
-Mon Mar  6 23:29:59 1995  William Perry  <address@hidden>
-
-
-Sat Mar  4 15:33:08 1995  William Perry  <address@hidden>
-
-* w3-draw.el:
-Now handles images like in the old display engine if not in XEmacs/Lucid
-
-* w3-e19.el: Only create air hotlist menu if w3-air-hotlists is non-nil
-
-Fri Mar  3 16:01:38 1995  William Perry  <address@hidden>
-
-
-Thu Mar  2 15:50:57 1995  William Perry  <address@hidden>
-
-* w3.el: Run w3-add-hotlist-menu first time a hotlist is loaded in.
-
-* w3-e19.el: Let w3-add-hotlist-menu run even if not in w3-mode
-
-Wed Mar  1 16:22:46 1995  William Perry  <address@hidden>
-
-* w3-sysdp.el: Removed function call causing problems
-
-* w3-xemac.el: Don't load pictures if current frame is on a tty
-
-* w3-draw.el: Added back in a call to mule-attribute-zones
-
-* w3-parse.el:
-Don't nuke the windows chars for quote and trademark when in MULE
-
-Sun Feb 26 19:17:38 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Removed message about 'unknown tag <%s> skipped' - was causing
-confusion for some people.
-
-
-* W3.ad: Initial revision
-
-Sat Feb 25 23:53:08 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Fixed incremental display in emacs 18.xx
-
-* w3-draw.el: Fixed paragraph spacing problem.
-
-* dist.Makefile: Made beta display engine the default.
-
-* w3.el: Removed LCD archive entry, moved into w3.el
-
-* w3-wemac.el: Various fixes for new display engine into WinEmacs
-
-* w3-vars.el: Don't die if cannot load 'annotations'
-
-* w3-sysdp.el:
-Removed anonymous lambda without 'function' wrapper for WinEmacs and
-early versoins of lucid emacs.
-
-* w3-srch.el: Provide w3-srch
-
-* w3.el: Changed _W3 on dos machines to W3.INI
-New function w3-force-reload-document to reload even if in standalone mode
-Added a default for w3-complete-link
-Provide w3-main
-
-* w3-draw.el:
-Defvard w3-last-fill-pos and w3-last-tag to better facilitate drawing
-in 2 buffers at once.
-Fixes for messed up percentages in WinEmacs/XEmacs < 19.12
-Fixed <br> and <p> in blockquotes and align=indent
-
-Mon Feb 20 04:54:30 1995  William Perry  <address@hidden>
-
-* w3.el, w3-vars.el: Removed w3-color-planes and w3-color-display variables.
-
-* w3-vars.el, w3.el: New variables w3-netscape-configuration-file and
-w3-use-netscape-configuration-file, for whether to parse and honor the
-options in a Netscape/X style configuration file.
-
-Sun Feb 19 22:27:00 1995  William Perry  <address@hidden>
-
-* w3-xemac.el: Don't change menubar if current-menubar is nil.
-
-* w3.el: Now shows whether you are using the beta version in the bug reports
-
-
-* w3-draw.el, w3-parse.el, w3-print.el, w3.el:
-Removed references to w3-working-buffer
-
-Sat Feb 18 19:51:53 1995  William Perry  <address@hidden>
-
-* docomp.el: Reworked the autoloads/defvars
-
-* dist.Makefile: Removed w3-lemac.el
-
-* w3.el, w3-draw.el, w3-vars.el:
-Removed variable w3-running-lemacs, since w3 now uses sysdep.el for
-[XL]emacs, so there is no distinction between lemacs and xemacs
-
-* w3-e19.el: Fixed problem with unquoted lambda in w3-e19-options-menu
-
-* w3-xemac.el:
-This version should theoretically work with lemacs and xemacs both
-
-* w3-draw.el: Fixed incremental display in xemacs.
-
-* w3-sysdp.el: Initial revision
-
-Thu Feb 16 15:58:44 1995  William Perry  <address@hidden>
-
-* w3.el: Changed messaging of viewer - would barf on undefined escape sequences
-in crufty mailcap-related stuff.
-
-Sun Feb 12 23:09:40 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Better event handling while drawing HTML
-
-* w3-beta.el: Fixed personal annotations.
-
-* w3-draw.el: Removed proclaim-inline calls.
-
-
-* w3.txi: Added docs for new 'label' and 'textalign' attributes of <hr>
-
-* w3-e19.el:
-Fixed problem in emacs 19 with mouse-selecting a link would sometimes
-say there was not a link, but selecting it with 'return' would work.
-Now both work.
-
-* w3-parse.el: fixed problems with entity-resolution in attribute values.
-
-* w3-draw.el:
-More spacing stuff, added 'label' and 'textalign' attributes to <hr>
-
-* w3-forms.el: Remove spaces at beginning of options.
-
-Sat Feb 11 22:10:46 1995  William Perry  <address@hidden>
-
-* w3-draw.el:
-Removed dependence on 'stream' from title handling.  This will make it
-easier to do totally streamed drawing, RSN.
-
-* w3-draw.el: Fixed more spacing problems.
-
-* w3-parse.el, w3-draw.el:
-Fixed various spacing bugs - seem to be all gone now!!!!
-
-* w3-vars.el: New function to read a netscape-style configuration file.
-
-* w3-parse.el: w3-nuke-entities-in-region can now accept null args.
-
-
-* w3-beta.el: New function to read a netscape-style configuration file.
-
-Fri Feb 10 06:19:26 1995  William Perry  <address@hidden>
-
-
-Tue Feb  7 15:51:23 1995  William Perry  <address@hidden>
-
-* w3-e19.el:
-Removed the file-name-handler-alist, to put it in url.el where it belongs.
-
-* w3.el:
-Finding the source of a url that is already in a buffer should work now.
-
-* w3-draw.el, w3-beta.el:
-Now will always get a 'completed' message when drawing/imaging.
-
-Mon Feb  6 02:13:31 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Fix for emacs 18
-
-* w3-forms.el, w3-parse.el:
-Optimized the calling of w3-nuke-entities-in-region.  Parsing _much_
-faster, drawing only slightly slower, so its a win.
-
-* w3-draw.el: Semi-incremental display now works in all emacsen, and recognizes
-scroll-up and C-c to interrupt.
-
-* w3-draw.el: Fixed plaintext handling.
-
-Sun Feb  5 23:41:28 1995  William Perry  <address@hidden>
-
-
-* w3-e19.el, w3-vars.el: Fixed view menu.
-
-* w3-vars.el, w3.el:
-Let w3-color-filter be a string, for people brave enough to want to
-set it themselves.
-
-* w3-epoch.el: Now works with new display engine.
-
-* w3-draw.el: Few problems for epoch fixed, <br> in <dl> looks right now.
-
-* w3-draw.el: Reimplemented w3-link-delimiter-info
-
-* w3-draw.el: Re-implemented the 'linkname value of w3-delimit-emphasis
-
-
-* dist.Makefile:
-Removed hack to change w3.texinfo on the fly when creating info file.
-
-Sat Feb  4 18:11:14 1995  William Perry  <address@hidden>
-
-* w3.el: Removed setting of default-directory because it causes call-process to
-die a hideous death and not let you do anything like M-| lpr in the
-source buffers.
-
-
-* w3.el: Replaced w3-confirmation-func with url-confirmation-func
-
-Fri Feb  3 13:42:35 1995  William Perry  <address@hidden>
-
-* w3-draw.el:
-fixed insertion of w3-link-end-delimiter - was always inserting the
-'not visited' part.c
-
-Tue Jan 31 20:45:19 1995  William Perry  <address@hidden>
-
-* w3-e19.el: Right-mouse-menu now works
-
-Mon Jan 30 04:52:26 1995  William Perry  <address@hidden>
-
-* w3.txi: Added non-unix OS sections.  Need to flesh them out more.
-
-Sun Jan 29 22:15:48 1995  William Perry  <address@hidden>
-
-* w3-vars.el: Added w3-style-tags-assoc
-
-* w3-draw.el, w3-vars.el:
-Added new variable w3-right-justify-address to control whether
-text within an <address> tag is right justified.  Defaults to t.
-
-* w3-vars.el: Few new variables for fsf19
-
-* w3.el: Removed special cases for fsf19 to use the old lmenu package.
-
-* w3-e19.el: No longer needs the lmenu package.
-
-* w3-draw.el: Fixed typo
-
-* w3-epoch.el: Made all arguments to w3-make-face optional.
-
-* w3-draw.el: Few more fixes for epoch.  No longer have to remove \n\n, so
-incremental display looks better.  w3-delimit-emphasis now works in
-the new display engine.
-
-
-* w3.txi: Lots of cleanup work, addition of netscape extensions, new HTML 3.0
-stuff, variable name changes, xresource changes, all for the new
-display engine.
-
-Sat Jan 28 23:07:36 1995  William Perry  <address@hidden>
-
-* w3.el: Deal with url-get-url-at-point possibly returning nil.
-
-* w3-epoch.el: Got rid of error in new display engine.
-
-* w3-draw.el: w3-draw.el will now compile with emacs 18 again - the incremental
-display was messing it up.
-
-* w3-beta.el, w3-draw.el, w3-e19.el, w3-emacs.el, w3-epoch.el, w3-forms.el, 
w3-lemac.el, w3-mac.el, w3-mule.el, w3-next.el, w3-old.el, w3-parse.el, 
w3-print.el, w3-srch.el, w3-vars.el, w3-wemac.el, w3-xemac.el, w3.el:
-Added headers for finder package
-
-* w3-draw.el: Make sure w3-link-end-delimiter is never on a line by itself
-
-Thu Jan 26 04:56:42 1995  William Perry  <address@hidden>
-
-* w3-vars.el:
-moved w3-mule-retrieval-coding-system to url-mule-retrieval-coding-system
-
-Wed Jan 25 15:38:50 1995  William Perry  <address@hidden>
-
-* w3-beta.el:
-Added definition for (abs x) if none exists (for emacs 18, epoch, compat.)
-
-Mon Jan 23 03:32:40 1995  William Perry  <address@hidden>
-
-* w3.txi: Removed w3-bad-server-alist
-
-Sun Jan 22 21:53:19 1995  William Perry  <address@hidden>
-
-
-* w3-draw.el: Fixed space problems, hopefully for good.
-
-* w3-e19.el: New options item for relying solely on the cache
-
-Sat Jan 21 20:27:22 1995  William Perry  <address@hidden>
-
-* w3.el: Fixed problem where default-directory would sometimes be set to nil -
-bad things man!
-
-* w3-beta.el: replaced all occurances of htmlplus with html
-
-* w3-draw.el:
-Fixed problem with plaintext and embed.  <lit> now acts like <pre>,
-but with no mono-spaced font.  Fixed problem with null titles (empty
-string invalid for buffer name error).  <blink> works on xemacs 19.12
-in tty mode.  Small problem with <pre> segments with whitespace at
-beginning fixed.  A few small hacks to handle some pythia markup.
-
-* w3-e19.el:
-Protect against copying menu-bar-help-menu if in tty mode.  Also no
-longer disable the edit menu when in w3-mode.
-
-* w3-parse.el:
-Fixed problem with plaintext and embed.  <lit> now acts like <pre>,
-but with no mono-spaced font.
-
-* w3.el: replaced all occurances of htmlplus with html
-
-Wed Jan 18 02:31:59 1995  William Perry  <address@hidden>
-
-* w3-parse.el:
-fixed bug in w3-nuke-entities-in-region if nonterminated entity was
-last thing in a buffer (ie: &lt[EOB]);
-
-* w3.el: Remove duplicate links from links-alist when doing a completing-read
-on the links.
-
-Tue Jan 17 13:18:13 1995  William Perry  <address@hidden>
-
-* dist.Makefile: Make install should now copy w3.elc to the dest. directory
-
-Mon Jan 16 03:52:57 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Better handling of faces.
-
-* w3.el: Implemented <input type=file>
-
-Sat Jan 14 22:40:58 1995  William Perry  <address@hidden>
-
-* w3-parse.el: More spacing taken care of
-
-* w3-draw.el: Few fixes to <pre></pre> presentation
-
-Thu Jan 12 15:39:37 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Fixed formatting problem with <dd>
-
-Mon Jan  9 23:20:05 1995  William Perry  <address@hidden>
-
-* w3-print.el: Few fixes for ps-print 1.6 and 1.10
-
-* w3-parse.el: Recognizes the <embed> tag and treats it like XMP for parsing.
-
-
-Sun Jan  8 19:07:28 1995  William Perry  <address@hidden>
-
-* w3-draw.el, w3-emacs.el, w3-parse.el:
-Various changes to make the new display engine work under emacs 18.xx
-
-* docomp.el: more defvars for cleaner compile
-
-* w3-draw.el: Fixed more of the spacing problems
-
-* w3-e19.el:
-Fixed some of the spacing problems when using w3-emacs19-hack-faces-p
-
-* w3.el: Added w3-follow-url-at-point-other-frame
-
-Sat Jan  7 20:29:06 1995  William Perry  <address@hidden>
-
-* w3-parse.el:
-Fix for odd problem where an entity at the very end of a line (or
-flush against the next tag) would get left out of the parse structure.
-Ugh!
-
-* w3.el: Added new variable url-inhibit-uncompression for use when dumping to
-disk - very wasteful to uncompress it, store it in a buffer, then
-recompress when it got written out to disk.  Also changed the file:
-and ftp: handling to use copy-file when w3-dump-to-disk is bound and
-non-nil, so we can hopefully get asynchronous dumping-to-disk done.
-
-* w3-draw.el: More fixes for funky spacing
-
-* w3-old.el, w3-parse.el:
-Remove \r's in <pre> and <xmp> segments, for ugly DOSisms.
-
-Fri Jan  6 18:31:07 1995  William Perry  <address@hidden>
-
-* w3-draw.el, w3-parse.el:
-Can now change the index of an ordered list item (<li value=xxx>0
-
-* w3-print.el:
-w3-print-with-ps-print now works with ps-print 1.6, and uses the headers, etc.
-
-* w3-draw.el, w3-e19.el: Fixed links menu in v19
-Few drawing fixes
-
-Thu Jan  5 20:50:06 1995  William Perry  <address@hidden>
-
-* w3-draw.el: Now does 'lazy' creation of faces... this reduces the memory
-requirements when in X, since a lot of the faces will probably never
-be used.
-
-* w3-parse.el: Fixed weird spacing problem after <font> tags finally.
-
-* w3.el: Make sure that facep is defined in all versions of emacs
-
-* w3-vars.el:
-Changed the mail and print menus to be pull-right for xemacs/lemacs
-
-* w3-e19.el:
-Fixed the links menu to gracefully do nothing if there are no links on
-the page (was giving an 'Empty menu' error)
-
-Mon Jan  2 21:51:34 1995  William Perry  <address@hidden>
-
-* w3-e19.el: changed default of the mouse-face for links
-
-* w3.el: Removed extraneous newline from mail headers
-
-
-* w3-e19.el, w3.el:
-w3-mail-current-document can now take an optional 'format' parameter
-so that the mail menus can be pull-right.  Spiffy, eh?  Also now
-sticks in content-type and content-transfer-encoding headers.
-
-* w3-print.el:
-w3-print-this-url can now take an optional 'format' parameter so that
-the print menus can be pull-right.  Spiffy, eh?
-
-* w3-draw.el: Quicker way of right-justifying something.
-
-* w3.el, w3-beta.el, w3-print.el:
-Moved all the printing code into w3-print.el, and added the postscript
-option.  Changed the makefile to concatenate all the appropriate files
-for the beta or old version, sort of like VM.
-
-
-* w3-draw.el:
-Added <menu> and <dir> tags back in, as well as a few hacks to make
-Jamie Z.'s page look prettier. :)
-
-* w3-beta.el: Fixed importing of netscape cache
-
-* w3-beta.el: Added w3-import-netscape-cache, to convert a netscape-style cache
-directory to the emacs-w3 style.
-
-Sun Jan  1 09:59:25 1995  William Perry  <address@hidden>
-
-* w3-vars.el: Made w3-e19-links-menu buffer-local
-
-* w3-e19.el: Reinstituted the 'Links' submenu.
-
-
-Sat Dec 31 07:13:21 1994  William Perry  <address@hidden>
-
-* w3-parse.el: Various cleanups
-
-* w3.el: w3-mail-to-author now checks for the 'Reply-To' header of an HTTP/1.0
-response before checking the 'link' tags.
-
-Fri Dec 30 17:04:45 1994  William Perry  <address@hidden>
-
-* w3-old.el: Removed use of w3-last to avoid having to use cl.
-
-* w3.el: Added checks to see if url-view-url returned nil instead of file:nil
-Removed definition of w3-last
-
-* w3-draw.el: Fixed <secret> tag.
-
-Thu Dec 29 16:03:40 1994  William Perry  <address@hidden>
-
-* w3-parse.el:
-Added more stuff to get rid of windows-specific character references.
-
-* w3.el, w3-old.el: Moved defadvice stuff to w3-old
-
-* w3-e19.el:
-Totally reworked the menus as emacs19 keymaps.  This speeds them up.
-Also added routines to add AIR Mosaic hotlists to the menus
-automatically.  Works well.  First time through causes a bit of a
-slowdown for lots of hotlists, but this is emacs' problem since it
-needs to scan all the keymaps to create the menu.
-
-* w3-draw.el:
-New variable w3-indent-level to control how many spaces to indent list
-items, blockquotes, etc.  This is necessary so that the user doesn't
-have to change tab-width or tab-stop-list to change this formatting
-(so <pre> segments that use tabs will still be formatted correctly).
-
-Also made </pre> close out all character-level formatting attributes
-ala Arena.
-
-<pre> will also cause a paragraph break - chunks of text before a
-<pre> segment weren't getting filled correctly.
-
-Made <dt> tags cause a paragraph break.  Formatting now looks better,
-and beginning of <dl> list is separated better from the rest of the
-document.
-
-Fixed problem with w3-list-chars-assoc causing an error with the new
-display engine.
-
-Fixed problem where &gt; followed immediately by another tag wasn't
-showing up in the new display.
-
-* w3-beta.el: Added parser for AIR Mosaic style hotlists.
-
-Tue Dec 27 21:24:37 1994  William Perry  <address@hidden>
-
-
-* w3-beta.el, w3-e19.el:
-Added a dropdown history list that shows the last 5 homepages visited
-under the 'Go' menu
-
-* w3.el: Changed the viewer handling so that temp files have a correct filename
-extension (for broken things like Frame that won't read in a file
-without the 'correct' file extension).
-
-Mon Dec 26 18:18:43 1994  William Perry  <address@hidden>
-
-
-* w3-beta.el:
-(New display engine) Fixed bug in the new personal annotations code
-that ws not closing the list.
-
-* w3-forms.el:
-(New display engine) Fixed bug in <select> handling where it would
-never find the correct name.  Also put back in support for <select
-multiple>.
-
-
-* w3-vars.el: Added in all the rest of the entities
-
-* w3-vars.el:
-Fixed problem where reloading of a page would set the 'Referer' field
-of an HTTP/1.0 request to the url of the page being loaded.
-
-
-* w3.el: Changed gopher searches and ask block submissions to use the enctyp
-attribute like other types of searching.  More extensible/easier to
-maintain.
-
-* w3-draw.el, w3-beta.el:
-Personal annotations now work in the new display engine.  Visible
-headers will work soon also.
-
-* w3-beta.el, w3-draw.el, w3-e19.el, w3-emacs.el, w3-epoch.el, w3-forms.el, 
w3-lemac.el, w3-mac.el, w3-mule.el, w3-next.el, w3-old.el, w3-parse.el, 
w3-srch.el, w3-vars.el, w3-wemac.el, w3-xemac.el, w3.el:
-Updated copyright notices for 1995
-
-Sun Dec 25 22:30:16 1994  William Perry  <address@hidden>
-
-* dist.Makefile:
-Renamed w3.el to w3-main.el and create w3.elc from w3-main.elc and
-either w3-beta.elc or w3-old.elc
-
-
-* w3-e19.el, w3-lemac.el, w3-wemac.el, w3-xemac.el, w3.el: More menu changes
-
-* w3-print.el: Initial revision
-
-* w3-beta.el: Changed w3-face-type to return 'both if a face is bold and italic
-
-
-* w3-beta.el: Initial revision
-
-* w3-parse.el, w3-forms.el, w3-draw.el:
-Added provide statements for easier loading
-
-* w3.el: Moved loads of old code into w3-old.el
-
-* dist.Makefile: Added new targets beta and old.
-
-* w3-old.el: Initial revision
-
-* w3-draw.el: Made new display engine honor the w3-list-chars-assoc header.
-
-* w3-vars.el: Moved some old vars out to w3-old.el
-
-Sat Dec 24 20:41:46 1994  William Perry  <address@hidden>
-
-* w3-e19.el: Fixed w3-mouse-handler to work with the new display engine.
-
-Fri Dec 23 22:40:38 1994  William Perry  <address@hidden>
-
-* w3-forms.el, w3.el: Added in handler for <input type=range size="min,max">
-
-
-* w3-draw.el: Added function comments.
-
-* w3-draw.el:
-Rearranged the file a lot, and added support for the named BASE tags
-from HTML 3.0 - pretty cool stuff. :)
-
-Thu Dec 22 23:53:59 1994  William Perry  <address@hidden>
-
-
-* w3-draw.el: Various fixes to the parser to deal with bad html.  Automatically
-include the alt tag for an image if it is a link target, regardless of
-the setting of w3-auto-image-alt.
-
-* w3-parse.el: Various fixes to the parser to deal with bad html
-
-Mon Dec 19 00:30:38 1994  William Perry  <address@hidden>
-
-
-* w3-e19.el: Added 'xterms' as a terminal type.
-
-* w3.el: Changed w3-submit-bug to only send truly useful info.
-
-Sun Dec 18 23:42:30 1994  William Perry  <address@hidden>
-
-* docomp.el: Stifle more warnings in new xemacs
-
-* w3-vars.el, w3.el, w3-draw.el:
-Changed the behavior of w3-auto-image-alt so that it could be a string
-for 'format'.
-
-* docomp.el: Stifle more warnings
-
-* w3-parse.el, w3-draw.el:
-Changed w3-handle-unknown-tag to check if 'w3-handle-<tag>' is
-defined, and if so, to record that function as the handle for that
-tag.  This will cut down on maintenance of the top block of code that
-just does a lot of (put 'w3-formatters 'xxxx 'w3-handle-xxxx).  XMP
-sections will now also work correctly.
-
-* w3-parse.el:
-Now deals with comments properly, and can handle the old (broken)
-comments of Mosaic/X
-
-Fri Dec 16 19:23:35 1994  William Perry  <address@hidden>
-
-* w3-e19.el: More fixes to w3-forward-link
-
-* w3-draw.el: Fixed a few things with faces
-
-Thu Dec 15 23:08:54 1994  William Perry  <address@hidden>
-
-* w3-e19.el: Fixed w3-forward-link to work better with the new display engine.
-
-Wed Dec 14 17:55:30 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed a few problems with forms and the new display engine.
-
-* w3-xemac.el: Name changes (screen->frame)
-
-Tue Dec 13 17:56:45 1994  William Perry  <address@hidden>
-
-* w3-draw.el: Added a few optimizations for the <blink> tag.
-
-* w3-draw.el: Added in creation of 'underline' face if it is not defined.
-
-* w3-forms.el, w3.el:
-Changed the maxlength to being unlimited if unspecified, to conform to
-the new HTML 2.0 spec.
-
-* w3.el: Fixed bug in w3-document-informatino where it was relying on
-url-current-mime-headers when it wasn't guaranteed to be the same.
-
-Mon Dec 12 23:22:21 1994  William Perry  <address@hidden>
-
-* w3-vars.el, w3.el: Added function w3-document-information
-
-* w3-vars.el, w3-wemac.el, w3-xemac.el, w3-e19.el, w3-lemac.el:
-Added new 'view' menu.
-
-* w3.txi: Removed hook for gnus-article-prepare-hook - was corrupting uuencoded
-articles.
-
-
-* w3-xemac.el, w3-lemac.el:
-Fixed problem with image menus if graphic was a link
-
-* w3-epoch.el, w3-lemac.el, w3-xemac.el:
-More stuff to deal with changed names, and crypt++/jka-compr
-
-* w3.el: Fixed big problem in reset buttons on forms.
-
-* w3.el: Now supports the 'action', 'src', and 'prompt' attributes on the
-isindex element.  (new display engine only)
-
-* w3-draw.el: Now supports the 'action', 'src', and 'prompt' attributes on the
-isindex element.
-
-* w3-vars.el: Changed lots of the version variables so that they don't rely on
-having the RCS headers in them.
-
-* w3.el: Changed w3-mode so that if it is called interactively it will act like
-w3-preview-this-buffer.
-
-* w3.el: Changed w3-source-document so that it can reuse source buffers if the
-users wants to.
-
-Sun Dec 11 08:41:52 1994  William Perry  <address@hidden>
-
-
-* w3-draw.el:
-Added in code to scale fonts for <h[1-6]> so they are bigger, etc, if in 
XEmacs/Lemacs
-
-* w3.el: Few changes for asynch mode.
-
-
-Sat Dec 10 01:07:05 1994  William Perry  <address@hidden>
-
-* w3-xemac.el:
-Added some stuff to optimize the echoing of the URL in the minibuffer
-(not so many calls to mode-motion-hook, all done in the mouse-handler
-by using the 'help-echo property).  Is smart enough to notice if
-'help-echo is not defined and still use the old way if necessary.
-Also changed the image code so that it sets the 'detachable property
-so that images won't get nuked if the text they are attached to is
-deleted.
-
-Fri Dec  9 22:34:04 1994  William Perry  <address@hidden>
-
-* w3-draw.el: Few tweaks
-
-* w3-forms.el:
-Fixed problem with other markup (especially other form info) within a <select>.
-
-* w3-parse.el: Added status messages to parsing.
-
-* docomp.el: More vars to get rid of warnings.
-
-Thu Dec  8 21:16:09 1994  William Perry  <address@hidden>
-
-* w3-draw.el: Added in lots of the 'top ten' html tags. :)
-
-* w3-draw.el: Added <blink> stuff, and rewrote the init-state function.
-
-* w3-vars.el: Added w3-do-blinking to control whether <blink> </blink> works
-
-* w3-draw.el: Handle pinhead
-
-Wed Dec  7 15:47:47 1994  William Perry  <address@hidden>
-
-* w3.el: Fixes to wais stuff
-
-* w3-draw.el: Added indenting for blockquote tags.
-
-* w3-epoch.el, w3-wemac.el, w3-lemac.el, w3-xemac.el, w3-emacs.el, w3-e19.el:
-Let w3-back-link and w3-forward-link accept negative arguments and
-call each other if they get one.
-
-Tue Dec  6 22:16:34 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed typo in docs.
-
-* w3.el:
-Fixed w3-source-document so it will issue an error if done in a non-w3 buffer.
-
-* w3-vars.el: Fixed typo in docs.
-
-* w3.el: Patch from Michael Erns (address@hidden) to make
-w3-complete-link act like w3-follow-link when no menu item is
-specified.  That makes it act more like Info mode, and so is more
-intuitive to users used to it.
-
-* w3.el: Now set default-directory when sourcing a document
-
-* w3-forms.el: Added error checking to the <textarea> handling to deal with
-non-terminated textareas.
-
-* w3-forms.el:
-Added error checking to all the forms code to make sure you are within
-a <form> before doing anything.
-
-* w3-draw.el: Added support for the 'fig tag.
-
-* w3-draw.el: Changed how the <title> tag is handled.
-
-
-* w3-draw.el: Added SPRY align tag.
-
-* w3-forms.el: Trimmed lots of crap that is duplicated from w3.el
-
-* w3-draw.el:
-<pre> and <xmp> segments within a list item will now be indented correctly.
-
-* w3-draw.el: Fixed list filling after headers and br's
-
-* w3-draw.el: Few changes to the <hr> handling
-
-* w3.el, w3-draw.el:
-New variable w3-auto-image-alt that controls whether emacs-w3 will
-automatically generate the 'alt' text on an image where it was not
-specified.
-
-
-Mon Dec  5 23:54:51 1994  William Perry  <address@hidden>
-
-
-* w3-draw.el, w3-e19.el, w3-parse.el:
-Misc Changes to get around idiotic font tag
-
-
-* w3-draw.el: Center tag will now override header/paragraph stuff.
-
-* w3-draw.el: More image work.
-
-* w3-parse.el: Fixed problem if a tag was flush against a newline.
-
-* w3-vars.el: Added jpegs as a default inlined image type.
-
-* w3-xemac.el, w3-lemac.el: fixed problem with new parser and xemacs/lemacs
-
-* w3-parse.el: Fixed problem with entities.
-
-* w3-e19.el, w3-srch.el: more name changes
-
-* w3.el: Fixed problem if w3-default-homepage was nil.
-
-* w3-draw.el: <link> tags now work correctly.
-
-Sat Dec  3 23:05:24 1994  William Perry  <address@hidden>
-
-* w3-parse.el: Problem with entities lt and gt fixed a little.
-
-* w3.el: More naming changes.
-
-* w3-draw.el: <select> and <option> tags now work correctly.
-
-* w3-emacs.el: Added a few checks in for the amiga 18.5x emacs.
-
-* w3-forms.el: <select> and <option> tags now work correctly.
-
-* w3-draw.el: Added support for the 'note' tag.
-
-Fri Dec  2 18:05:31 1994  William Perry  <address@hidden>
-
-* w3.el:
-Fixed bug in w3-view-this-url that would message 'nil' in the minibuffer.
-
-* w3-draw.el: Now remembers "id" and "name" attributes on any tag.
-
-* w3-draw.el: Various fixes to painting.
-
-* w3-draw.el, w3-epoch.el, w3-forms.el, w3-parse.el, w3-srch.el:
-More name changes, handling or PRE/XMP
-
-* w3.el: Fixed problem in w3-fetch if url-request-method was nil.
-
-* w3-draw.el: Now correctly handles pre,/pre,xmp,and /xmp
-
-Thu Dec  1 17:21:34 1994  William Perry  <address@hidden>
-
-* w3-draw.el: Added new tags
-
-Wed Nov 30 18:48:41 1994  William Perry  <address@hidden>
-
-* w3-e19.el: Added vt300 to the hack-faces stuff.
-
-Mon Nov 28 17:11:38 1994  William Perry  <address@hidden>
-
-* w3-epoch.el, w3-lemac.el: More misc. name changes
-
-Wed Nov 23 21:12:59 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed problem when posting to a form, w3-reuse-buffers would reuse the
-'source' of the form.  Ugh.
-
-Tue Nov 22 15:37:02 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed problem in 'isindex' forms processing.
-
-Sun Nov 20 04:44:42 1994  William Perry  <address@hidden>
-
-* w3-draw.el, w3-forms.el, w3-mule.el, w3-vars.el, w3-xemac.el, w3.el:
-Lots of name changes from w3-* to use the native url-* functions
-
-Fri Nov 18 22:46:59 1994  William Perry  <address@hidden>
-
-* w3-vars.el: Added binding of Shift-tab for w3-back-link
-
-Thu Nov 17 20:52:03 1994  William Perry  <address@hidden>
-
-* w3-mule.el: Fixes for mule 2.1 from Shin-ya Sato <address@hidden>
-
-Mon Nov 14 17:02:29 1994  William Perry  <address@hidden>
-
-* w3-new.el: Initial revision
-
-Tue Nov  8 17:57:57 1994  William Perry  <address@hidden>
-
-
-* w3.el: Fixed handling of base tag
-
-Mon Nov  7 22:09:35 1994  William Perry  <address@hidden>
-
-* w3-draw.el: Correctly reset the state when going into w3-draw-html
-
-* w3-parse.el: Misc. fixes
-
-Sun Nov  6 07:19:52 1994  William Perry  <address@hidden>
-
-* w3-draw.el: Relative links work correctly now
-
-* w3-draw.el, w3-forms.el, w3-parse.el: Initial revision
-
-Fri Nov  4 22:43:44 1994  William Perry  <address@hidden>
-
-* w3.el: Support for STYLE attribute on ordered lists.  Supports i, I, a, A.
-Also still supports the HTML+ 'ROMAN' attribute.  Supports the VALUE
-attribute on the LI tag to change the value of a list item and all
-following items.
-
-* w3.el: Changed the advice for w3-*-link to use deactivate-mark if it is
-bound.  This gets rid of the problem of w3-*-link highlighting the
-region if in emacs-19 and in transient-mark-mode.
-
-Thu Nov  3 23:50:47 1994  William Perry  <address@hidden>
-
-* w3-epoch.el, w3-lemac.el, w3-xemac.el:
-Only send Accept: lines for the inlined images we accept when
-transferring an image
-
-Wed Nov  2 00:47:38 1994  William Perry  <address@hidden>
-
-* w3.el: Let the variable shell-file-name take precedence over environment
-variables and guessing
-
-* w3-e19.el, w3-vars.el:
-Added w3-echo-link to control what is displayed in the minibuffer in
-emacs-19.  'url, 'text, or nil.
-
-* w3.el: Added encoding type of application/ramp to forms
-
-Tue Nov  1 18:36:08 1994  William Perry  <address@hidden>
-
-
-* w3-vars.el: Removed definition of w3-using-proxy
-
-* w3.el:
-Fixed w3-find-this-file to work correctly for users other than anonymous
-
-* w3.el: Fixed problem where sentences ending with ! or ? had the ! or ? eaten.
-
-* w3.el: Added check for checkboxes/radio boxes that are turned off.
-
-Mon Oct 31 23:16:04 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed a stupid bug in the ....-other-frame
-
-* w3-e19.el: Changed binding from [shift mouse-2] to [S-mouse-2] -ugh
-
-* w3.el: Added functions w3-follow-link-other-frame and w3-fetch-other-frame
-
-* w3-lemac.el, w3-xemac.el, w3-e19.el:
-Added shift-middle-button default binding to be follow-link in other frame.
-
-Fri Oct 28 22:42:10 1994  William Perry  <address@hidden>
-
-* w3-vars.el: Can now pass parameters to url-current-callback-func
-
-Thu Oct 27 19:14:08 1994  William Perry  <address@hidden>
-
-* w3.el: Strip spaces off of the title after truncating it to 50 characters.
-
-Wed Oct 26 15:41:14 1994  William Perry  <address@hidden>
-
-* w3-vars.el: A few changes to how the entities are interpreted
-
-* w3.el: Now correctly strips off spaces from the front of a URL
-when in w3-fetch
-
-Tue Oct 25 17:28:43 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed <option value=xxx> handling for multiple selection lists.
-
-* w3.el: Fixed handling of the SIZE attribute of a SELECT tag.  Select MULTIPLE
-will now also allow different OPTION tags to have the SELECTED
-attribute.  Changed w3-insert-entities-in-string to use
-w3-html-entities, so it gets all the entities, not just the 6 or 7
-that were hardcoded in.
-
-Wed Oct 12 16:22:05 1994  William Perry  <address@hidden>
-
-
-Tue Oct 11 23:11:34 1994  William Perry  <address@hidden>
-
-* w3.el: More spacing at end of sentences hacks for ? and !
-
-* w3-vars.el: No longer rebind C-k - bad thing.
-
-* w3.el: Don't double-space after Prof.
-
-Tue Oct  4 01:17:33 1994  William Perry  <address@hidden>
-
-
-* w3.el, w3-vars.el:
-Changed w3-reuse-buffers to accept 'yes/no 'reuse/reload and 'always/never
-
-Mon Oct  3 14:04:15 1994  William Perry  <address@hidden>
-
-* w3-vars.el, w3.el:
-Patch for the inlined image processing for the buggy current release
-of ppmdither and viewing black and white gifs.  Also added comments to all
-the html entities in w3-html-entities.
-
-Fri Sep 30 21:28:54 1994  William Perry  <address@hidden>
-
-* w3.el:
-Fixed problem with paragraph just after an <hr> not being filled correctly.
-
-* w3-vars.el: Added more HTML entities
-
-Thu Sep 29 20:13:53 1994  William Perry  <address@hidden>
-
-* w3.el: Removed problem with first header having a blank line in it.
-
-* w3-e19.el, w3-emacs.el, w3-mule.el, w3-vars.el, w3.el:
-Lots of patches from Shin-ya Sato <address@hidden> to make
-w3 work with mule 2.0
-
-Tue Sep 27 23:58:36 1994  William Perry  <address@hidden>
-
-* w3.el: Now sends the NAME and VALUE of submit buttons if the submit button
-has a NAME.
-
-
-Mon Sep 26 18:51:52 1994  William Perry  <address@hidden>
-
-* w3.el: Change to w3-form-encode-multipart/x-www-form-data to include the
-content-length of each item
-
-Fri Sep 23 16:14:50 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed problem in w3-backward-in-history       when no back link was 
found.
-
-* w3-vars.el:
-Fixed setting of w3-running-FSF19 to take into account XEmacs 19.12
-
-Thu Sep 22 23:24:48 1994  William Perry  <address@hidden>
-
-* w3-lemac.el: Fixed problem in w3-insert-graphic where it would always do a
-url-file-attributes, even if we had the image loaded. (with
-url-be-anal-about-file-attributes == t, it would do a HEAD, which was
-stupid)
-
-* w3.el: Fixed forms doubling problem in FSF emacs 19 when doing a reset.
-
-* w3-vars.el, w3.el:
-New variable w3-track-last-buffer.  If non-nil, M-x w3 will take you
-to the last w3 buffer you fetched, instead of loading your home page.
-If the last buffer has been killed, then it acts normally and loads
-the home page.
-
-* w3.el: Changed w3-submit-bug
-
-
-* w3.el: patch from address@hidden to fix reporter problems in
-emacs 19.xx
-
-Wed Sep 21 17:25:16 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed small bug in DL handling when no <dt> items present
-
-
-* w3.el: Fixed problem in w3-pass-to-viewer if "/" is the filename, would get
-"" as the buffer-name, which would choke.
-
-* w3.el:
-Fixed bug in w3-delimit-emphasis w/headers that had spaces/newlines in them
-
-Tue Sep 20 18:04:03 1994  William Perry  <address@hidden>
-
-
-* w3.el:
-Fixed handling of blockquote's so they have a <p> at the beginning and end.
-
-
-Sun Sep 18 20:15:42 1994  William Perry  <address@hidden>
-
-* w3.txi: Few minor changes
-
-* w3.el: Changed w3-upcase-region so that it will take care of entities in the
-region.  ie: &auml; -> &Auml;, etc.
-
-* w3-e19.el:
-Fixed problem where the URL was not shown in the minibuffer if you hit
-'f' from a point in the document that was not a link.
-
-Fri Sep 16 17:18:03 1994  William Perry  <address@hidden>
-
-* w3-mac.el, w3.el: Lots of little fixes
-
-* w3-vars.el: Removed the old, redundant w3-gateway-x variables
-
-* w3-hypb.el: Removed all the code, since Hyperbole 3.12 handles it for you.
-
-Thu Sep  8 15:54:36 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed problem where the o/*/etc at the front of <dt> items would be
-upper-cased sometimes
-
-* w3.el: Started using reporter.el instead of rolling my own error logging
-routines.
-
-* w3-e19.el: w3-emacs19-unhack-faces now turns w3-delimit-emphasis and
-w3-delimit-links on.
-
-* w3-e19.el:
-w3-forward-link and w3-backward-link now ignore links without href's
-
-* w3.el: w3-complete-link now ignores links without href's
-
-* w3-vars.el, w3.el:
-Added new variable w3-source-file-hooks that is run after sourcing a document.
-
-* w3.el: Fixed problem with not quoting an align attribute when filling in
-defaults in w3-fix-paragraphs-in-region
-
-* w3.el: Fixed formatting problem with <dl>s finally
-
-Wed Sep  7 23:22:21 1994  William Perry  <address@hidden>
-
-
-* w3.el: Patch for not putting 2 spaces after Mr/Ms/Mrs.
-
-* w3-e19.el, w3.el:
-Lots of fixes brought about by Axel Boldt <address@hidden>
-
-
-* w3.el: Fixed problem in w3-finish-text-entry when deleting the sole window
-
-* w3-e19.el, w3-lemac.el, w3-wemac.el, w3-xemac.el, w3.el:
-Fix from address@hidden for converting newlines in
-menu entries/completions on links to spaces.
-
-
-* w3.el: Fixed dl attribute munging in w3-fixup-bad-html
-
-* w3-e19.el, w3-mule.el, w3.el: Misc. changes for Mule 2.0
-
-Tue Sep  6 21:07:16 1994  William Perry  <address@hidden>
-
-* w3-e19.el, w3-emacs.el, w3-epoch.el, w3-lemac.el, w3-xemac.el:
-Got rid of code to not interfere with hyperboles mouse-bindings, since
-it has changed to only use shift-clicks
-
-Sat Sep  3 21:50:09 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed problem where if url-be-asynchronous was non-nil,
-w3-show-history and w3-show-hotlist would fail.
-
-Fri Sep  2 18:42:25 1994  William Perry  <address@hidden>
-
-* w3.el: url-buffer-visiting now strips off the #xxx links.
-If reusing a buffer, the #xxx works will now work also.
-
-* w3-vars.el: Used real symbol for (TM) (&trade;)
-
-Sun Aug 28 22:41:15 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed problem with <dl> lists when there were no <dt> items.
-
-* w3.el: Fixed bug where hotlist urls were getting hexified too often
-
-
-Thu Aug 25 17:15:52 1994  William Perry  <address@hidden>
-
-* w3.txi: Few fixes to @cindex areas
-
-Tue Aug 23 12:30:18 1994  William Perry  <address@hidden>
-
-* w3.el: Added code to automatically call w3-update-hotlist-menu after all
-hotlist modification functions
-
-Mon Aug 22 02:30:51 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed problem with the new w3-fix-unknown-tags
-
-Sun Aug 21 23:34:49 1994  William Perry  <address@hidden>
-
-* w3.el: The isindex tag can now have an action=xxx specifier.  Works the same
-as link rel=index
-
-* w3.el: Don't include the [[ and ]] in w3-complete-link
-
-
-* w3-vars.el, w3.el:
-Added a 'debug' mode.  If w3-debug-html is non-nil, then display
-all semi-buggy html with error messages in a separate buffer
-that is displayed at the end of the parse.
-
-* w3-lemac.el, w3-vars.el, w3-wemac.el, w3.el:
-Added w3-xemac.el for the upcoming XEmacs 19.12 release
-
-* w3-xemac.el: Initial revision
-
-* dist.Makefile: Added w3-xemac.el
-
-
-* w3-vars.el: Changed how w3-version-number is created.
-
-* w3.txi: Added section on inlined images/mpegs
-
-* w3.el: w3-goto-last-buffer now works if w3-be-asynchronous == t
-
-* w3.el, w3-e19.el:
-Fixed emacs-19 forms problem - overlays would run together and mess up
-form entry.  Also fixed problem in the highlighting of links.
-
-Sat Aug 20 22:21:06 1994  William Perry  <address@hidden>
-
-
-* w3.txi, w3.el: Lots of changes suggested by Axel Boldt.
-
-* w3-e19.el: w3-forward-link and w3-back-link will show the link under point
-
-Thu Aug 18 12:56:43 1994  William Perry  <address@hidden>
-
-
-* w3-e19.el, w3-mac.el, w3.el: removed need for w3-quotify-percent hack
-
-Mon Aug 15 03:57:29 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed multipart viewer
-
-Sun Aug 14 22:50:31 1994  William Perry  <address@hidden>
-
-* w3.el: Made w3-popup-info interactive
-
-* w3-hypb.el: More error checking in hwww:start.
-
-* w3-vars.el: Added view source to the hyperlink-menu
-
-* w3-wemac.el, w3.el: More fixes to work under DOS/Windows
-
-
-* w3.el: Fixed x-www-form-urlencoded encoding.  Was stripping off the first
-character sometimes when it shouldn't have been.
-
-* w3-vars.el: Removed  bogus definition of w3-directory-format
-
-* w3-lemac.el, w3-e19.el:
-Fixed w3-mouse-handler so it doesn't need to muck with the % signs anymore.
-
-* w3-lemac.el, w3-e19.el: New links menu constructor
-
-* w3.el: Default URL for w3-fetch is now smarter.
-
-* w3.el: Fixed w3-complete-link so that it will not show extraneous markup in
-the completing-read
-
-* w3-srch.el, w3-lemac.el, w3-wemac.el, w3-epoch.el, w3-emacs.el, w3-e19.el:
-New w3-map-links - now passes the start and end positions to the
-appropriate function
-
-
-* w3.el: Forms fix for MAXSIZE, message when storing into the kill ring so the
-user has some sort of feedback, <P ID=xxx> works now.
-
-* w3-vars.el: New hotlist key bindings.
-
-Fri Aug 12 13:26:02 1994  William Perry  <address@hidden>
-
-* w3-lemac.el: Removed the * .5 so w3-lemac.el can compile under emacs 18
-
-* w3.el: Few fixes for using under windows.
-
-* w3.el: Fixed problem with directory-files with no <title> causing
-rename-buffer to fail.
-
-Thu Aug 11 13:56:35 1994  William Perry  <address@hidden>
-
-* w3.txi: Changes to the VM/Rmail nodes.
-
-* w3.el: Fixed dumbass problem in both types of forms submission that would
-always submit every checkbox and every radio button, regardless of its
-checked state.
-
-Wed Aug 10 13:51:18 1994  William Perry  <address@hidden>
-
-
-Tue Aug  9 03:39:45 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed problem with cleaning up of w3-temporary-directory and
-url-temporary-directory
-
-* w3-e19.el: Fixed a few problems with the loading of lmenu.
-
-Mon Aug  8 12:59:14 1994  William Perry  <address@hidden>
-
-* w3-e19.el: Made binding of track-mouse buffer-local
-
-Sat Aug  6 16:32:18 1994  William Perry  <address@hidden>
-
-
-* dist.Makefile:
-Removed viewers.el from the dist, since it has been moved into mm.el
-
-* w3-wemac.el, w3-lemac.el:
-New url-flush-cache function to remove all entries from the cache.
-Menu item in lemacs/wemacs for it.
-
-* w3.el: Fixed problem if </title> is malformed/nonexistent.
-
-* w3.el: Fixed problem with some </pre> markup sometimes leaving a trailing >
-in the parsed code.
-
-* w3.el: Fixed problem with mac web pages that use ^M instead of ^J as the
-newline char.
-
-Wed Aug  3 04:15:06 1994  William Perry  <address@hidden>
-
-
-* w3-vars.el, w3.el: Moved setting of w3-documents-menu-file,
-w3-personal-annotation-directory, and w3-hotlist-file into
-w3-do-setup, since they used expand-file-name and ~/, it would mess up
-if you dumped w3 with emacs.
-
-* w3-wemac.el:
-Do correct setting of the address@hidden up .mosaic-xxx-xxx filenames when in 
windows.
-
-* w3-wemac.el:
-Fix the setting of the mailcap/mime-types file list so that it won't
-choke on invalid filenames in windows.  Also do smart-checking of the
-TEMP environment variable if w3-temporary-directory or
-url-temporary-directory doesn't exist.
-
-* w3-lemac.el, w3.el:
-Fixed a problem in w3-kill-emacs-func when w3-temporary-directory
-didn't exist.  Also moved some stuff from w3-do-setup to
-w3-setup-version-specifics (mostly lemacs image stuff, etc)
-
-* w3.el: Load w3-wemac if running WinEmacs
-
-* w3.el: Highlighting of links is back...
-
-* w3-wemac.el: Initial revision
-
-Mon Aug  1 13:32:35 1994  William Perry  <address@hidden>
-
-* dist.Makefile:
-Removed sample-mailcap from distribution - everything is defaulted in
-lisp now.
-
-
-Sun Jul 31 23:53:36 1994  William Perry  <address@hidden>
-
-* w3.el: Accept --!> as the ending of an SGML comment.  UGH!
-
-
-* w3.el: Now sends off the value parameter of an <option> tag in a form.
-
-
-* w3.el: Use error in w3-save-url if there is no URL.  Moved loading of ~/.w3
-higher in w3-do-setup.
-
-* w3.txi: Fixed lots of grammatical mistakes, all stuff now uses the present
-tense instead of "will", and no more first-person crap.  Email
-addresses are handled in a standard way.
-
-* w3.el: Added support for the multipart/x-www-form-data enctype.  Also
-revamped forms support to be easily expandable for the enctype
-attribute.  Just need to have a function named
-w3-form-encode-<content-type> defined.  If this returns a cons pair,
-then the car is used as the "separator=xxx" chunk in the content-type,
-and the cdr is the body of the request.  If it returns a string, it
-just sends that as the body of the message.
-
-
-* w3.el, w3-vars.el: Rewrote the popup-info functions
-
-
-Sat Jul 30 22:55:31 1994  William Perry  <address@hidden>
-
-* w3-e19.el:
-Will no highlight the region that matches the ID of a #XXX search in a document
-
-
-Fri Jul 29 04:33:03 1994  William Perry  <address@hidden>
-
-* w3.txi: Few typos
-
-* w3.el, w3.txi:
-Misc. patches from address@hidden - doc/info fixes
-
-Thu Jul 28 13:52:49 1994  William Perry  <address@hidden>
-
-* w3.el: Rewrote DL handling
-
-Tue Jul 26 13:39:24 1994  William Perry  <address@hidden>
-
-
-* w3.el: Fixed dumb mistake in w3-personal-annotation-finish where I didn't
-insert the actual text of the annotation before finishing up.
-
-Mon Jul 25 14:04:09 1994  William Perry  <address@hidden>
-
-* add-to-dot-emacs: Added a few new autoloads
-
-
-* w3.txi: Fixed a few typos.
-
-* w3.el: Fixed problem with the rel=useindex support.
-
-* w3.el: Fixed small formatting problem with w3-delimit-links = 'linkname
-
-Sun Jul 24 20:19:18 1994  William Perry  <address@hidden>
-
-
-* w3-lemac.el:
-Several ugly hacks to get the image menus to work for images that
-downloaded successfully.
-
-* w3-lemac.el: New link and graphic specific menus enabled.
-
-* w3-vars.el: The popup menu has been trimmed down.
-
-
-* w3.el: A few changes for the new hyperlink-specific menus
-
-* w3-e19.el: Rewrote w3-forward-link - should not get stuck on links anymore
-
-* w3-e19.el: Implemented popup-menus on a linktype basis.  Can change the popup
-menu that shows up when you right-click on a hyperlink or an image.
-Default menus include viewing headers, dumping to disk, mailing,
-printing, and copying the url.
-
-* w3-vars.el, w3.el:
-New personal annotation entry code.  Uses a minor mode, and you can
-specify what major mode is used.  Set the variable w3-annotation-mode
-to the name of the major mode.  If set to nil, it will use
-default-major-mode.
-
-* w3-e19.el, w3-emacs.el, w3-epoch.el, w3-hypb.el, w3-lemac.el, w3-mac.el, 
w3-mule.el, w3-next.el, w3-vars.el, w3.el:
-Changed all references to address@hidden to use w3-bug-address
-instead.  Changed all copyright notices to use my new email address
-also.
-
-
-* w3.txi:
-Lots of changes to variable names, some new sections.  Should be about
-90% up-to-date now.
-
-
-* w3-vars.el: Removed definition of w3-passwd-entry-func - obsolete.
-
-
-* w3.el: Moved running of w3-mode-hooks to be after the resetting of
-w3-persistent-variables.
-
-
-* w3.el: Added in support for using <link rel=useindex href=xxx> for searching
-instead of the <ISINDEX> tag.  <ISINDEX> is still supported.
-
-Sat Jul 23 21:26:57 1994  William Perry  <address@hidden>
-
-* w3-e19.el: Rewrote the options menu
-
-* w3-e19.el: Removed image options from emacs 19 menubar
-
-
-* w3.el: Fixed problem with nested style tags.
-
-* w3-lemac.el: Fixed problem with images not appearing
-
-* w3.el: Fixed problem with first lines not being wrapped if no
-header/paragraph tags before them in the document.  Also added support
-for broken base tags - seems like some people are using <base=url>
-instead of <base href=url>
-
-
-* w3.el: PRE segments now get correctly put in the w3-tt-style face.
-
-Fri Jul 22 03:59:40 1994  William Perry  <address@hidden>
-
-
-Thu Jul 21 04:46:03 1994  William Perry  <address@hidden>
-
-* w3.el: Changed behavior of w3-show-headers.  If 't', then show all headers.
-Fixed bug in w3-in-assoc if there was a blank entry in the alist.
-
-* w3.el: Patch from address@hidden for not putting nil in the
-kill ring with w3-save-url.
-
-Sun Jul 17 17:17:19 1994  William Perry  <address@hidden>
-
-
-* w3-vars.el: New variable w3-dump-to-disk that will automatically download
-retrieved files to disk.
-
-* w3-lemac.el: Added 'dump to disk' item in options->www menu
-
-* w3-lemac.el: Added option for color filtering to the options->www menu
-
-* w3-lemac.el: Only read in the url-file-attributes of an image if
-w3-image-size-restriction is non-nil and a number.
-
-Sat Jul 16 18:55:24 1994  William Perry  <address@hidden>
-
-
-* w3.el: With prefix-arg, w3-fetch will default to the URL of link under point
-if any, otherwise default to current documents url if in w3-mode,
-otherwise default to url-get-url-at-point
-
-* w3.el: With prefix-arg, w3-follow-link will dump the file straight to disk
-
-Fri Jul 15 14:42:39 1994  William Perry  <address@hidden>
-
-* w3.el: Automatically switch to using giftoppm if giftopnm is not found on the
-system.
-
-
-Tue Jul 12 04:38:47 1994  William Perry  <address@hidden>
-
-
-Mon Jul 11 05:28:40 1994  William Perry  <address@hidden>
-
-* w3.el: w3-version now returns all the version #s of URL, WWW, and MM
-
-
-Sun Jul 10 19:14:06 1994  William Perry  <address@hidden>
-
-* w3.el: Only use w3-default-style in epoch
-
-
-* w3.el, w3-vars.el: w3-show-headers now takes regexps instead of exact matches
-
-Fri Jul  8 01:49:25 1994  William Perry  <address@hidden>
-
-
-Wed Jul  6 13:56:47 1994  William Perry  <address@hidden>
-
-* w3.el: Patches to make the history work again, as well as keep w3
-from trying to re-select deleted buffers
-
-Tue Jul  5 07:38:00 1994  William Perry  <address@hidden>
-
-* w3.el: No longer delete the zone when making an ALT tag hot, since there
-could have been other text in the link
-
-* w3.el:
-If an IMG is within a <A> tag, then the alt tag will be a hyperlink also.
-
-* w3.el: Fixed finding of url#xxx links from w3-fetch
-
-Mon Jul  4 23:48:07 1994  William Perry  <address@hidden>
-
-* w3.el: Forms submissions can now have ? embedded in them, for recursive
-creation of subsequent forms.
-
-
-* w3.el: Fixed formatting problems with nested lists, etc.
-
-* w3-vars.el: Removed C-q binding
-
-* w3-e19.el: Automatically turn on track-mouse if w3-track-mouse is non-nil.
-
-* w3.el: Various patches from Alastair Burt
-
-* w3-lemac.el: Create w3-superscript-style correctly
-
-Sun Jul  3 05:05:43 1994  William Perry  <address@hidden>
-
-
-* w3.el: Fixed a problem with fetching of #xxx links.
-
-* w3.el: Applied patch from Darrell Kindred <address@hidden> that
-fixed quite a few problems in the news handling.  Should be
-a lot faster now.
-
-* w3.txi: Fixed a few problems in the VM, RMAIL, and GNUS sections
-
-Sat Jul  2 18:31:50 1994  William Perry  <address@hidden>
-
-* w3-vars.el: Removed bogus entry in w3-persistent-variables
-
-* w3.el: Fixed storing of w3-current-last-buffer and w3-goto-last-buffer
-
-Thu Jun 30 23:39:02 1994  William Perry  <address@hidden>
-
-* w3-vars.el:
-Changed definition of w3-running-lemacs to take WinEmacs into account.
-
-* w3-lemac.el:
-Changed references to string-to-number to string-to-int for older
-lemacs versions
-
-Wed Jun 29 05:24:53 1994  William Perry  <address@hidden>
-
-* w3-lemac.el, w3-e19.el:
-Added an option for local cacheing of files to the Options menu
-
-Mon Jun 27 15:03:12 1994  William Perry  <address@hidden>
-
-* w3-e19.el:
-Added check for whether menu-bar-help-menu was bound before defining
-keys in it
-
-Tue Jun 14 12:25:09 1994  William Perry  <address@hidden>
-
-* w3-e19.el: Fixed problem with the menu
-
-Mon Jun 13 14:13:56 1994  William Perry  <address@hidden>
-
-* w3.el: Made sure everywhere w3 does a completing-read binds
-completion-ignore-case to t
-
-* w3.el: Few fixes from using url-maybe-relative
-
-Thu Jun  9 12:51:03 1994  William Perry  <address@hidden>
-
-* w3-e19.el: Activated the Help menu in FSF v19 again.
-
-Wed Jun  8 01:20:36 1994  William Perry  <address@hidden>
-
-
-Tue Jun  7 20:08:20 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed problem with empty titles.
-
-* w3-lemac.el:
-Fixed references to w3-use-hypertext-gopher and w3-directory-format variables
-
-* w3.el: Hacked up w3-submit-bug to be able to use mh-smail
-
-
-* w3.el: Changed the color-reducing process to be optional
-
-Mon Jun  6 19:56:46 1994  William Perry  <address@hidden>
-
-* w3-vars.el: More HTML+ latin1 entities
-
-Sun May 29 02:26:30 1994  William Perry  <address@hidden>
-
-* w3-vars.el: More HTML+ entities
-
-Sat May 28 14:14:19 1994  William Perry  <address@hidden>
-
-* w3-e19.el:
-Fixed problem with w3-back-link.  Could not go back to the only link
-in a buffer if you were past its endpoint
-
-* w3.el: w3-preview-buffer should work again, along with
-w3-show-hotlist/history-list, etc.
-
-* w3-vars.el: Yet more HTML+ entities.  Only 22 left to figure out.
-
-* w3-vars.el: Added more of the HTML+ entities
-
-Fri May 27 19:54:49 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed a problem with PRE fixing
-
-Sat May 21 10:23:16 1994  William Perry  <address@hidden>
-
-
-* w3.el: Fixed the URL completion
-
-* w3.el: Fixed a problem with the <embed> tag and the url package
-
-
-* w3-e19.el, w3-emacs.el, w3-epoch.el, w3-lemac.el, w3-mac.el, w3-mule.el, 
w3-srch.el, w3-vars.el, w3.el:
-Lots and lots of changes to use the new url.el package
-
-Fri May 20 16:20:59 1994  William Perry  <address@hidden>
-
-* w3-lemac.el: Fixed problem where graphic entities were disappearing
-
-Thu May 19 12:18:41 1994  William Perry  <address@hidden>
-
-* w3.txi: Fixed a few bad pointers
-
-* add-to-dot-emacs: Initial revision
-
-
-* w3-lemac.el:
-Moved back in the old code for w3-insert, w3-fix-extent-endpoints to
-get around bug in lucid emacs 19.10 with 'start-open and 'end-open
-extent properties.
-
-Wed May 18 20:30:24 1994  William Perry  <address@hidden>
-
-
-* w3.el: Now can have a max # of password entry attempts before bombing out and
-displaying the error message from the server.  w3-max-password-attempts
-
-
-* w3.el: Fixed problem in w3-mail-document-under-point
-
-
-* dist.Makefile: The great name change to 8.3 compatible
-
-
-* w3.el: Fixed problem in file/ftp handling if there was no file in the url
-(ftp://host.domain), etc.
-
-* w3-e19.el: Provide w3-e19
-
-* w3.txi: Added chapter/example for interfacing with RMAIL
-
-* w3-lemac.el:
-Added definition of emacs-major-version and emacs-minor-version if
-they aren't already defined.  Use this to merge w3-lemacs.el and
-w3-old-lemacs.el
-
-* w3-vars.el: Removed references to w3-running-old-lemacs
-
-
-Tue May 17 23:30:23 1994  William Perry  <address@hidden>
-
-
-* w3.el: Honor the new nametemplate mailcap clause
-
-* w3-e19.el, w3-lemac.el, w3-vars.el, w3.el:
-Removed the annotations menu.  moved to one entry in the main WWW menu
-Cleaned up some of the annotation code.
-
-* w3-e19.el:
-Only allow use of overlays in emacs19, due to some bugfixes in 19.23
-
-* w3-lemac.el: Disabled graphics in lemacs 19.9, since I switched to using
-annotations, and they don't exist in 19.9
-
-Mon May 16 20:49:09 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed problem with an old mm-mime-viewer call that didn't get fixed,
-and a work around for the autoloading of ange-ftp in emacs19
-
-* w3.el: Change to w3-grok-file-href to check for whether a file exists, even
-if a // is in the string (for something like file://usr/local/ blah
-blah blah.  Thanks to David Hughes for the patch.
-
-* w3.el: Removed group annotation code.
-Sped up the removal of whitespace by using subst-char-in-region
-instead of replace-regexp .
-
-* w3-lemac.el:
-Changed the options menu -> delay by image type to be actual toggle items.
-
-
-* w3.el: Removed klunky caching strategy.
-w3-current-mime-viewer now holds the complete information returned by
-mm-mime-info.
-The viewer code now only shows the output of commands if it gets any.
-No more prompting or setting of w3-always-show-output is necessary.
-
-* w3-vars.el: Removed obsolete w3-always-show-output
-
-Sun May 15 19:23:57 1994  William Perry  <address@hidden>
-
-* dist.Makefile: Now distribute mm.el
-
-
-* w3-lemac.el:
-Now add options menu before the Save Options menu in lemacs 19.10
-
-
-* w3.el: Switched to using my new mm.el package for mime stuff.
-
-* w3-vars.el: Removed old w3-xxx vars related to mailcap and mimetype parsing.
-
-* w3-mac.el: The Macintosh menus now work.
-
-Fri May 13 20:45:39 1994  William Perry  <address@hidden>
-
-* w3-vars.el: Added ` to the syntax table as a quote operator
-
-* w3-vars.el: Switched from giftoppm to giftopnm
-
-* w3.el: Changed the x-exec handling so that it can't mess up the
-process-environment by accident (thanks to Jamie Zawinski) for the
-info.  Also changed it so that the environment is only messed with if
-the executable is actually found somewhere in w3-local-exec-path.
-Save a few conses and string creations.
-
-Thu May 12 18:11:51 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed a few problems in the cleanup of unrecognized tags, as well as
-header handling.
-
-* w3-lemac.el: Fixed a few image-related quirks.
-
-
-* w3-lemac.el: Removed cursor changing code.
-
-
-* w3.el: Forgot to (widen) after the new MIME parasing code.
-
-
-* w3.el: Rewrote w3-parse-mime-headers to extract its information from the
-buffer instead of doing lots of work on strings/etc.  Also rewrote
-part of the guessing of mime-types when no content-type explicitly
-given.
-
-* w3.el: The no_proxy environment variable can now hold a unix-shell-type
-comma-separated list of wildcards, and it will be transformed into a
-real regular expression.
-
-* w3.el: Will now send Pragma: no-cache when doing a reload. . .
-Also now supports the no_proxy environment variable.
-
-* w3.el:
-Fixed a few places where w3-insert-graphic was still called the old way.
-Also fixed problem where local images weren't being converted correctly.
-
-* w3-lemac.el, w3.el: Fixed various compilation errors
-
-* w3-lemac.el:
-Basis for ismap image clicking enabled.  Sends off quite the wrong
-area (x,y relative to emacs frame, not the image).  Should be trivial
-to fix with a few additions to the C code.
-
-
-* w3.el:
-Seem to have fixed the problem of inlined images not being used as links.
-
-
-* w3-lemac.el:
-w3-find-specific-link will now highlight the correct extent until
-input is available.
-
-* w3.el: Finally really fixed the bug in the infinite recursion when building
-lists.  Problem was with unterminated lists.
-
-* w3.el: Following a named link (#XXX) will now push the mark so you can get
-back to it with C-u C-space
-
-Wed May 11 22:35:33 1994  William Perry  <address@hidden>
-
-
-* w3.el: Fixed problem of remote files being formatted incorrectly.
-w3-buffer-is-hypertext was not always returning the correct value.
-
-
-* w3.el: Links within headers should look better now.
-
-* w3-e19.el: New versions of the overlay-specific functions, plus changed the
-default under emacs19 to be using overlays.
-
-* w3-e19.el: Few patches for highlighting headers.
-
-* w3.el: No longer assume temporary files go in /tmp... now uses
-w3-temporary-directory and expand-file-name for all temporary file
-creations
-
-
-* w3.el: Patches from Bob Weiner to get asynchronous retrieval through a 'host
-gateway working.
-
-* w3.el:
-Hopefully fixed the not-guessing-if-a-buffer-is-html bug for remote file access
-
-* w3.el: Fixed problem in w3-follow-link with NAMEd links with no href.
-
-* w3.el: Fixed problem with infinite recursion during list building.
-
-* w3-vars.el:
-w3-mime-viewers has been trimmed down a lot, will depend on the users
-mailcap much more.
-
-* dist.Makefile: Can now 'make mailcap'
-
-* w3.el: w3-parse-mailcap can now take a URL.
-
-* w3.el: Killing of HTML comments will now make sure there is whitespace where
-the comment used to be. ie: (some text<!-- ack -->more text ==> some
-text more text)
-
-* w3.el: Fixed problem where text immediately after a </pre> tag but before a
-<p> tag weren't filled correctly.
-
-* w3.el: Changed w3-mailcap-entry-passes-test to check for the common "test -n
-$DISPLAY" cases and handle them automatically in elisp instead of
-shelling out to check the return status.
-
-* w3.el: Changed all after-hook-function references to be after-hook-functions,
-and use add-hook instead of explicit setq's
-
-* w3.el: The mailcap parsing routine now honors the 'test' clause
-
-* w3.el: fixed problem in w3-parse-args
-
-Tue May 10 23:56:29 1994  William Perry  <address@hidden>
-
-* w3-lemac.el: Few changes to the extent handling code.  No more hacks for
-w3-fix-extent-endpoints or w3-insert
-
-* w3.txi: Few bug fixes to the docs.
-
-Mon May  9 20:41:03 1994  William Perry  <address@hidden>
-
-* w3-lemac.el:
-If an image is more than 1/2 the size of the current screen, it will
-be moved down onto a line by itself.
-
-* w3.el: Fixed bug in title handling if there was an end tag like <title >
-
-* w3-lemac.el:
-Workaround for bug in lucid emacs where deleting text in map-extents
-would do _very_ bad things.  Loading inlined images/mpegs would
-sometimes cause it to crash.
-
-* w3-lemac.el: More changes to the image handling
-
-Sun May  8 17:46:14 1994  William Perry  <address@hidden>
-
-* w3-lemac.el: Changed to using annotations for inlined images
-
-Sat May  7 16:22:58 1994  William Perry  <address@hidden>
-
-
-* w3.el: Changed w3-file-attributes to not use HTTP/1.0 to HEAD a file unless
-w3-be-anal-about-file-attributes is non-nil
-
-* w3-lemac.el:
-Can now filter inlined image loads based on MIME type and/or file size.
-
-Thu May  5 16:26:19 1994  William Perry  <address@hidden>
-
-* w3-lemac.el: New submenu for lemacs - restrict image loads by type.
-
-* w3.el: Fixed problem in the after-change-function yet again.
-
-
-* w3.el: Few changes to the after-change-function handling, as well as changes
-to the mpeg loading code
-
-* w3-lemac.el:
-New menu items for showing inlined mpegs or not, as well as functions
-to load single and multiple delayed mpegs.
-
-* w3-vars.el: New variable w3-delay-mpeg-loads
-
-* w3-e19.el:
-Builtin support for mouse-movement keys, if 19.23 ever works with them...
-
-Tue May  3 20:25:40 1994  William Perry  <address@hidden>
-
-* w3-lemac.el, w3-vars.el, w3.el:
-Lucid emacs 19.10 or higher can now display inlined mpegs by default.
-Use <embed src="url of mpeg to play" type="video/mpeg"> to try it out.
-
-Mon May  2 22:02:21 1994  William Perry  <address@hidden>
-
-* w3.txi:
-Added in documentation of the emacs19 faces hacking for dumb terminals
-
-* w3-lemac.el: Applied patch by Alastair Burt to fix dumb typo on my part.
-
-* w3.el: Few changes to the 'host gateway code
-
-* w3-e19.el: Fixed problem in w3-find-specific-link in emacs19
-
-* w3.el: Changed w3-parse-args to extract the information out f the original
-buffer instead of wasting 2 or 3 string/buffer creations
-
-* w3-vars.el: Changes to the w3-parse-args-syntax-table
-
-Sun May  1 22:58:34 1994  William Perry  <address@hidden>
-
-* w3.el:
-Fixed problem in w3-after-change-function and escaping % from w3-lazy-message
-
-Fri Apr 29 21:48:26 1994  William Perry  <address@hidden>
-
-* w3-vars.el: New variables for keeping track of status messages better
-
-* w3.el: New way of doing the HTTP transfer status messages.  Now uses the
-after-change-function if available.  This way even asynchronous
-transfers get the good XXX of YYY (ZZ%) transfer messages.  Also now
-support the Status: header, which will be shown instead of the normal
-XXX bytes message.
-
-* w3-vars.el: More HTML+ entities
-
-Thu Apr 28 14:51:32 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed a few problems with the x-exec stuff.
-
-* w3-emacs.el: Fixed problem in v18 mouse support
-
-Wed Apr 27 16:14:01 1994  William Perry  <address@hidden>
-
-* w3-vars.el:
-New variables w3-mime-editors, w3-mime-bitmaps, w3-mime-composers, and
-w3-mime-printers that are initialized from the entries in the mailcap
-file
-
-* w3.el: Rewrote w3-parse-mailcap so that it keeps a _LOT_ more information
-from the mailcap file, including composers, editors, labels, and
-bitmaps.
-
-* w3-e19.el: Few changes to the options and popup menus
-
-* w3-lemac.el: New options menu for new lemacs
-
-* w3-vars.el: Revamped the main menu and popup menus to be shorter
-
-* w3-lemac.el:
-Changed w3-zone-at and w3-zone-data to use new 'w3delayed for delayed images.
-
-* w3.el: Reworked who delayed image processing works.  You can now click on a
-delayed image and it will load just that image.  Similar to how the
-Mosaic clients work.  Also, the ALT tag is inserted if available.  It
-is deleted from the buffer when the image is loaded.
-
-Tue Apr 26 21:33:26 1994  William Perry  <address@hidden>
-
-
-Mon Apr 25 21:16:33 1994  William Perry  <address@hidden>
-
-* w3-lemac.el:
-Should have fixed the ugly interaction between emacs-vers.el and lemacs 19.9
-
-* w3.el: Fixed problem in w3-fix-unknown-tags
-
-Sun Apr 24 19:30:51 1994  William Perry  <address@hidden>
-
-* w3.el:
-A few fixes to the native wais handling - still a little broken though.
-
-* w3-vars.el:
-Changed the help on xxxx menu item to fetch the .html files instead of
-the ones with no extensions - our server sends text/plain with no
-extension - ugh
-
-
-Sat Apr 23 18:57:30 1994  William Perry  <address@hidden>
-
-
-* w3.el: Fixed a problem in w3-parse-relative-link that would cause #X links to
-be doubled to #X#X
-
-* w3-e19.el:
-Can now choose whether you want to use overlays or text properties for
-keeping track of the internal w3 information.  Try
-(put 'w3-emacs19 'use-overlays t) in your .emacs to try it out.
-
-Fri Apr 22 14:53:15 1994  William Perry  <address@hidden>
-
-* w3-e19.el: Removed ugly emacs 19.23 hack that could mess up buffers
-
-* w3.el: Added a function to generate a FORM for posting/mailing a reply to a
-newsgroup.
-
-* w3-lemac.el: Added w3-view-ppm to view p[bp]m files in an xwindow glyph
-
-Thu Apr 21 20:37:24 1994  William Perry  <address@hidden>
-
-* w3-vars.el: Redid the help menu
-
-* w3-lemac.el:
-Changed button binding and menu stuff to conform to new lucid emacs style
-
-* w3.el: Changed w3-prepare-buffer to return the title of the document
-
-Tue Apr 19 23:17:48 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed up w3-parse-args so that it can deal with no trailing " or ' on
-an attribute that started with one.
-
-* w3-lemac.el: Fixed a few of the w3-toggle-xxxx
-
-* w3.el: Made epoch use the old V18-style kill-emacs-hook
-
-* w3.el: Fixed problem with headers having the last char moved down onto a new
-line when using w3-emacs19-hack-faces-p
-
-
-* w3.el: Try using .newsrc-SERVERNAME before just plain old .newsrc.
-
-* docomp.el: More defvar's
-
-* w3.el:
-Backed out one optimization of w3-parse-args that caused emacs19 to barf.
-
-* w3.el: w3-news-server now consults gnus-default-nntp-server,
-gnus-nntp-server, and nntp-server-name if they're bound and non-nil
-and != "".
-
-* w3-e19.el:
-Use glyphs in the display table so that emacs doesn't get as confused
-about the cursor position when using w3-emacs19-hack-faces-p
-
-
-* w3.el: Moved the finding of #xxx links after the loading of images, just in
-case point gets confused.  If no #xxx link, make sure to go to
-(point-min)
-
-Mon Apr 18 23:40:19 1994  William Perry  <address@hidden>
-
-* w3.el:
-Optimized w3-parse-args some more.  Thanks to address@hidden for the input
-
-* w3.el: Fixed problems with ../ as the first part of a relative url
-
-* w3-lemac.el:
-Wrapped the new definition of the options menu in a check for the
-latest version of lemacs
-
-* w3-lemac.el:
-Changed the menus to use the new 19.10 method of menus so that it uses
-Toggle buttons, etc.
-
-* w3.el: Finished implementing the SRC attribute for SUBMIT buttons
-
-* w3-e19.el: Added a hack-vt102 function
-
-* w3.el: New w3-parse-args
-
-
-* w3.el: Added support for a SRC attribute to the submit button
-
-Sun Apr 17 22:28:08 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed error message in w3-hotlist-add-entry, and added function
-w3-hotlist-refresh.
-
-* w3.txi: New hotlist func
-
-Fri Apr 15 21:25:21 1994  William Perry  <address@hidden>
-
-
-* w3-vars.el: Removed some obsolete variables
-
-* w3.el: Fixed the history mechanisms
-
-
-* w3-vars.el: Moved defvar of w3-emacs19-hack-faces-p into main variables file.
-Also moved the default setting of w3-delimit-emphasis and
-w3-delimit-links into w3-do-setup so they will be set correctly if
-dumped with emacs.
-
-
-* w3-e19.el: Can now hack faces for xterm and linux console
-
-* w3.el: Added in support for user:address@hidden ftp URLs
-
-
-* w3-e19.el: Fixed problems in w3-mouse-handler
-
-* w3-e19.el: If you are using VT100's and emacs 19.22, you CAN GET BOLD AND
-UNDERLINED text now.  Please try setting the variable
-w3-emacs19-hack-faces-p to non-nil.  To get rid of it, use M-x
-w3-emacs19-unhack-vt100
-
-
-* w3.el:
-Fixed bug in w3-parse-relative-link that could cause major problems with
-~ and w3-current-file = nil.
-
-Thu Apr 14 22:28:06 1994  William Perry  <address@hidden>
-
-* w3-lemac.el:
-Removed colorize-pixmap call since lemacs takes care of that now.
-
-* w3.el: Fixed problem in w3-search where it did not nuke the last search term
-from the url before appending the latest search string.
-
-* w3.el: the x-exec URL handler will now make sure that all returned messages
-are HTTP/1.0 messages, using the return value of call-process-region
-to get the HTTP/1.0 return status code if one is not explicitly given
-by the script.
-
-* w3.el: Include definition of emacs19-ism 'setenv' for old versions of emacs.
-This function is required to use the x-exec URL.
-
-* w3.el: Fixed some odd formatting of <hr>
-
-
-* w3.el: Added support for the x-exec url
-
-Wed Apr 13 21:58:09 1994  William Perry  <address@hidden>
-
-
-* w3.el: Fixed problem in w3-fix-proxy
-
-* w3-e19.el:
-Fixed a problem with emacs 19.23 and the previous-single-property-change
-
-* w3-lemac.el: Fixed w3-insert to deal with extent-start > extent-end
-
-* w3.el: Fixed the proxy support so that w3-view-url will show the url of the
-proxy'd document, not the entiry 'proxyservice''realurl' garbage
-
-* w3.el: Fixed w3-parse-args yet again...
-
-* w3.el: Few fixes to the newsrc parsing (unbound variables from cut&paste)
-
-* w3.el: Lots more news work.  Now supports parsing the newsrc and only showing
-unread articles in newsgroups, as well as displaying a list of all the
-newsgroups (distinguishes subscribed and unsubscribed groups).
-
-* w3.el: Added links to post to the newsgroup and reply to the author in news
-handling
-
-* w3-vars.el: Added newspost to the list of allowable link types
-
-* w3.el: w3-view-url now works with news: urls
-w3-parse-relative-link now works with news: urls
-w3-format-whole-newsgroup now spits out valid HTML+, and better looking too
-w3-format-news now spits out valid HTML+, looks like GNUS under lucid
-
-Tue Apr 12 08:01:20 1994  William Perry  <address@hidden>
-
-* w3.el: Fixed problem where using a gateway could screw up the recognition of
-an http/1.0 response
-
-* w3-e19.el, w3-emacs.el, w3-epoch.el, w3-lemac.el:
-Changed w3-forward-link and w3-back-link to take a prefix-arg for
-how many links to go forward.
-
-* w3.el:
-Fixed a bug in w3-parse-relative-link that would expand ~/ when it shouldn't
-
-Mon Apr 11 23:27:43 1994  William Perry  <address@hidden>
-
-* w3.el: Revamped w3-create-multipart-request to only use valid separator chars
-
-
-* w3.el: Fixed problem in w3-parse-docs-menu.  Added code to create a MIME
-multi-part request.
-
-* w3.el: Fixed problem in w3-form-encode for name=isindex when it wasn't the
-only entry area in the form (a submit button, etc)
-
-* w3.el: fixed problem in list-expansion
-
-* w3.el: Fixed problem in w3-parse-args if something was (read) as a number
-instead of a string.
-
-* w3.el: Fixed a problem in w3-parse-args with emacs19
-
-Sun Apr 10 21:51:40 1994  William Perry  <address@hidden>
-
-* w3-e19.el: w3-add-zone now uses the mouse-face property in emacs 19.23
-
-* w3-e19.el: Fixed various problems related to lmenu in emacs 19.23
-
-* w3.el: Fix to the mosaic docs-menu parsing
-
-* w3.el: No longer send the SUBMIT button when submitting forms
-
-* w3.el: New code to parse the Mosaic documents.menu file to add user-specified
-menus in lucid/FSF19
-
-
-Sat Apr  9 20:49:30 1994  William Perry  <address@hidden>
-
-* w3.el: Rewrote the SGML-comment killing code... should work better now.  Not
-sure if it is still compatible with the Mosaic way of killing
-comments, but Mosaic is broken in that regard, so I don't really
-care. :)
-
-* w3.el: w3-show-hotlist will show the hotlist entries in the same order that
-they were stored, instead of the old reverse-order behavior.  Also
-changed some of the automatically generated HTML to be strictly
-correct HTML+.
-
-* w3-vars.el:
-Also removed www.cis.ohio-state.edu from the bad-server-list... is now
-an HTTP/1.0 server
-
-* w3-vars.el:
-Removed cs.indiana.edu from the w3-bad-server-list, as we have finally
-upgraded to plexus.
-
-* w3.el: w3-submit-bug now sends me the URL of the current buffer (if any)
-
-* w3.el: Fixed a problem with file:./foo being interpreted wrong.
-
-* w3.el: Rewrote w3-basepath and w3-parse-relative-link to use
-expand-file-name, file-name-nondirectory, and file-name-directory.
-More reliable than the old regular expressions
-
-
-* w3.txi: Fixed more texinfo bugs.
-
-* w3-srch.el: Few tweaks in searching.
-
-* w3.el: Another bugfix to w3-parse-args
-
-* w3.el: Generate errors for non-existent local files now
-
-Fri Apr  8 23:10:20 1994  William Perry  <address@hidden>
-
-* w3-vars.el: Fixed all the missing HTML entities, and fixed several others.
-
-* w3.el: Fixed problem in w3-insert-entities-in-string using &nsp; instead of
-&ensp;
-
-* w3.el: Added a 'binary' option to w3-save-as
-
-* w3.el: New w3-parse-args
-
-
-* w3.txi: Wrote the PGP/PEM doc. (well, borrowed them from address@hidden).
-
-* w3.txi: Wrote the using with vm and using with gnus nodes.
-
-* w3.el: Added an autoload for w3-follow-link
-
-* w3.txi: Fixed a few reference problems.
-
-* w3.txi: Lots of variable definitions added.
-
-Thu Apr  7 22:32:06 1994  William Perry  <address@hidden>
-
-* w3.txi: Actually wrote the gateway/firewall documentation.
-
-* w3-e19.el: Fix-extent-endpoints will now work better.
-
-* w3.el: Fixed a problem with w3-create-mime-request and interaction with the
-CMU-BEAK server
-
-* w3.el: Fixed w3-parse-args for good I hope... now infers missing "s
-
-* w3.txi: Fixed some validation errors
-
-* w3.el: Ignore case in completing-read in w3-use-links
-
-<hr> parsing should now be more robust.  Paragraph filling after the
-<hr> will no longer be hosed.
-
-* w3.el: More work on w3-parse-args - think I got it right this time.
-
-* w3.txi: Fixed problem with setting the info filename
-
-* w3.txi: Fixed a few heirarchy bugs
-
-* w3.el: Rewrote w3-insert-entities-in-string to use mapconcat - quicker/more
-efficient than lots of string-matches and substrings, especially for
-small strings.
-
-Fixed problem in w3-parse-args that would swallow multiple spaces,
-even from quoted attributes (ALT=" " => ALT=" ")
-
-* w3-vars.el: Added &lt back into the w3-html-entities list.
-
-* w3.el: Fixed bug in the single-form-entry-in-a-form submission.  Was only
-sending the form value, not the name/value pair.
-
-Reworded the 'fixing bad html' messages to be 'checking for bad html'
-so that it wouldn't confuse people and make them log a bug.
-
-* w3.el: New way to retrieve wais doc-ids... doesn't work all the time
-  though - why not?
-* w3.el: Removed the call to dps-display-color-cells, as it causes a
-  coredump in all the versions I have ever tried on the NeXT.
-* w3-lemacs.el: Fixed problem with quoting percents in w3-track-mouse.
-
-Thu Mar  3 18:57:03 1994  William M. Perry  (address@hidden)
-* w3.el: Fixed problem in new header handling.
-* w3.el: w3-file-attributes will no longer choke if given a null argument.
-* w3-search.el: Remove all '#XXXX' references from URLs, so it is easier
-  to tell if we have visited them before
-* w3-vars.el: Changed w3-header-chars-assoc to use characters instead of
-  strings, and use make-string to make the header delimiters the same size
-  as the header.  This can still mess up on headers with inlined images,
-  but all in all it looks much better.  Thanks to Jared Rhine for the
-  suggestion.
-* w3.el: Changed lots of functions to use mapcar instead of while loops -
-  sould be slightly faster.
-* w3.el: Added hook to kill-emacs-hook to write out the global history if
-  necessary.  Also rewrote part of w3-write-global-history 
-
-Wed Mar  2 21:57:44 1994  William M. Perry  (address@hidden)
-* w3.el: Fixed problem with w3-file-attributes and non-existend
-  local/remote files.
-* dist.Makefile: Added mac and searching files to the distribution.
-* w3.el: w3-retrieve now updates w3-global-history-completion-list
-* w3.el: w3-fetch now does a completing read so that you can have
-  completion based on your .mosaic-global-history file.
-* w3-search.el: w3-do-search can now take an optional BASE argument, that
-  is the url to start searching from.  The search function also now checks
-  to see if there is a buffer visiting a url in the queue before
-  retrieving it.
-* w3.el: w3-save-as now uses w3-current-source if possible.  Saves time on
-  retrieval.
-* w3-vars.el: Fixed menu entry for 'View Source' that was still calling
-  old function names.
-* w3-lemacs.el: If w3-track-mouse is non-nil, and w3-link-cursor is
-  defined, change the mouse cursor to w3-link-cursor when over a link.
-  w3-link-cursor defaults to "hand2".  w3-link-cursor is set up in
-  w3-do-setup only if w3-link-cursor is a string, so the user can set it
-  to a pixmap in their .emacs file if they wish.
-* w3.el: <BR>s in lists now handled better.
-* w3.el: The new graphic entity support now honors the
-  w3-delay-image-loads variable
-
-Tue Mar  1 23:55:50 1994  William M. Perry  (address@hidden)
-* w3-lemacs.el, w3-epoch.el: Added binding of w3-source to 't' so that
-  w3-retrieve will always grab a buffer for retrieving inlined images
-* w3-search.el: Miscellaneous fixes...
-* w3.el: More changes to w3-file-attributes to compensate for HTTP/1.0
-  servers that don't implement HEAD
-* w3.el: Fixed error in determining if a URL exists or not in
-  w3-file-attributes
-* w3.el: w3-file-attributes won't send a HEAD request to a known
-  non-http/1.0 server
-* w3-search.el: Can now specify the search term as a function, and it will
-  be funcall'd with the URL as an argument.  RESTRICTION can be either a
-  regular expression or a function name - if string-match or funcall
-  against the URL fails, don't insert it into the queue.  Also now smarter
-  about not visiting the same URL multiple times.
-* w3.el: Fixed a dumb mistake in w3-file-attributes
-* w3-search.el: The searching functions work now.  Takes a regular
-  expression and a max-hops argument.  Returns a list of URLs that the
-  regular expression was found in.
-* w3-emacs19.el: Fixed problem with radio buttons/checkboxes at the end of
-  lines in emacs19
-* w3.el: Don't send the referer: field if using as a home-page or manually
-  requested URL
-
-Mon Feb 28 22:12:18 1994  William M. Perry  (address@hidden)
-* w3-emacs19.el, w3-lemacs.el, w3-old-lemacs.el, w3-vars.el: Removed
-  redundant definitions of w3-XXXX-menu.  w3-options-menu is still in each
-  file, since new lucid emacs has some extra features I can use in it.
-* w3.el: Will no longer copy local files into a buffer, then into /tmp
-  when passing to an external viewer - creates a symbolic link instead.
-
-Mon Feb 28 03:24:33 1994  William M. Perry  (address@hidden)
-* Release of v2.0.22
-* w3.texinfo: Description of new proxy services.
-* w3.el: Fixed problem in w3-fix-ampersands
-
-Sun Feb 27 23:37:53 1994  William M. Perry  (address@hidden)
-* w3-vars.el: Fixed un-escaped "s in defvar for w3-proxy-services
-* w3.el: Changed gopher/ftp/file directory handling to use the new
-  graphical entities instead of IMG
-* w3-vars.el: New variable w3-graphics-entities-alist holds an assoc list
-  of entities and the names of bitmaps to replace them with.
-  w3-icon-directory is appended to the front of each filename
-  automatically.
-  New variable w3-gopher-icons which holds the new graphic entity
-  references to describe each type of object.
-* w3.el: Tweaks to wais code... seems to be working now.
-* w3.el: Fixed stupid problem in the basic authorization code where I
-  wasn't setting the variable in a while loop to (cdr var)
-* w3.el: Added in proxy gateway support as put forth by Lou Montulli and
-  others.  Uses the new ACCESS_proxy environment variables.
-* w3.el: Multiline text entry boxes now reset correctly when
-  w3-revert-form is called
-* w3.el: Single input-area forms now submit themselves after you enter the
-  data.  No need for a submit button.
-* w3.el: Fixed error in w3-http, where it was sending the output of
-  w3-view-this-url instead of w3-view-url to w3-create-mime-request.
-  Referer: fields will work better now.
-  Basic authorization will now work with inheritance from protected
-  directories. (/foo/bar/baz.html is protected, then so is
-  /foo/bar/quuux.html, as is /foo/bar/baz/temp.html, etc)
-* w3.el: Wais support seems to be working...
-* w3.el: More fixes to the wais searching functions.
-
-Sat Feb 26 20:44:39 1994  William M. Perry  (address@hidden)
-* w3.el: Changed w3-prepare-buffer to take an optional argument,
-  no-display, which if t will keep it from renaming the buffer and
-  displaying it.
-* w3-vars.el: Added &lt and &gt to the list of entities, even though they
-  are wrong, since so many people seem to be using them.
-* w3.el: Strip out port numbers in ftp requests.
-* w3-lemacs.el: Spaces are now inserted after a graphic in lucid, and the
-  graphic extent is only on that one space.
-* w3-emacs19.el, w3-lemacs.el, w3-old-lemacs.el: Changed w3-zone-at to
-  return the extent, not the data.
-* w3.el: Better cleaning of telnet buffers before parsing.
-* w3.el: Fully implemented the Referer: field.  Also, w3-mime-response-p
-  should be a little more robust.  Should also kill an http request when
-  using the gateway support.
-* w3-vars.el: New variable w3-telnet-header-regexp that takes the place of
-  w3-telnet-header-length.  Addition of dvi, tex, and texinfo files to the
-  w3-mime-extensions list.
-* w3.el: Few changes to w3-format-directory in case file-attributes
-  returns nil
-* w3-emacs.el: w3-map-links will actually work in emacs 18 now.
-
-Fri Feb 25 23:17:51 1994  William M. Perry  (address@hidden)
-* w3-lemacs.el: Another dumb mistake in w3-zone-at
-* w3-emacs.el, w3-emacs19.el, w3-lemacs.el, w3-old-lemacs.el, w3.el: Fixed
-  dumb mistakes in w3-zone-at and the newly rewritten commands
-* w3.el: Fixed a few typos in w3-source-document
-* w3-emacs.el, w3-emacs19.el, w3-epoch.el, w3-lemacs.el, w3-old-lemacs.el,
-  w3.el: Rewrote w3-load-delayed-images, w3-view-this-url, and
-  w3-follow-link to use the generic w3-zone-at/w3-zone-data functions, so
-  they won't have to be in the emacs-specific files anymore.  Much easier
-  to maintain them this way.
-* w3-emacs.el, w3-emacs19.el, w3-epoch.el, w3-lemacs.el, w3-old-lemacs.el,
-  w3.el: Removed all emacs-specific versions of w3-complete-link, and put
-  w3-complete-link into w3.el and have it use the new w3-map-links.
-  Easier to maintain.
-* w3-emacs.el, w3-emacs19.el, w3-lemacs.el, w3-old-lemacs.el: New function
-  w3-map-links that calls a specified function on all the links in a
-  certain buffer.
-* w3-mac.el: Basic support for Macintosh menus... wrote a function to use
-  the lucid style menu descriptions.
-* w3-lemacs.el: Fixed problem with bad add-menu structure when the Options
-  menu already exists.
-
-Thu Feb 24 22:37:32 1994  William M. Perry  (address@hidden)
-* w3.texinfo: New chapter on future directions
-* w3-epoch.el: Fixed epoch graphics handling so it won't get a buffer
-  read-only-error, and also won't always look in w3-working-buffer, in
-  case the buffer has been renamed by the time it gets called.
-* w3.el: Renamed several functions so that it will be easier for new users
-  to do command completion (all hotlist stuff is w3-hotlist-XXX, etc).
-  Also several new functions to operate on the url the cursor is on
-  (w3-mail-document-under-point, w3-source-document-at-point, others).
-* w3-vars.el: Changed lots of keybindings.  General rule is now that
-  lowercase keys act on the current URL, and uppercase works on the url
-  under point. Major changes:
-  s -> document source, NOT SEARCH
-  M-s -> search document
-  p -> print document, NOT back link
-  Q -> w3-leave-buffer
-* w3.el: Rewrote w3-store-in-cache so that it stores info on disk instead
-  of in memory - can have a larger cache this way and not use up all your
-  memory.
-* w3-lemacs.el: New function w3-write-zones that creates lisp expressions
-  that restores extents when it is eval'd.
-
-Wed Feb 23 03:50:06 1994  William M. Perry  (address@hidden)
-* w3.el: A few more changes to the wais code
-* w3.el: More refinements to the WAIS code... now outputs URLs that are
-  like lynx/Mosaic, and also compatible with the WAIS gateway that NCSA
-  provides.
-
-Tue Feb 22 23:39:43 1994  William M. Perry  (address@hidden)
-* w3-old-lemacs.el: Fixed a few nesting errors in w3-view-this-url
-* w3-emacs19.el: Few fixes to file-name-handler stuff
-* w3.el: WAIS handling can now output an html document of a search.
-  Outputs the score and the file name.  Also function to retrieve a
-  document given its doc-id.
-* w3-emacs19.el: Patch for setting up the file-name-handler-alist from
-  address@hidden
-* w3.el: New function to parse out the .mosaic-global-history file and
-  store it in an assoc list for use in completion.
-* w3-mac.el: Initial revision
-* w3.el: More changes to the wais handling code.
-* w3-vars.el: New variable w3-waisq-prog that controls where the waisq
-  executable is looked for.
-* w3.el: Small change to w3-convert-html-to-latex to have slightly better
-  stripping of unknown tags.
-  Skeleton of wais support - requires waisq from Thinking Machines Corp's
-  wais8-5b1.
-
-Mon Feb 21 17:36:25 1994  William M. Perry  (address@hidden)
-* w3.el: New function w3-quotify-attributes to try and fix bad html docs.
-* w3.el: Added a few changes to convert-html-to-latex to honor
-  w3-latex-docstyle, and also allows inlining of postscript images.
-  Thanks to address@hidden (Benno Blumenthal) for the
-  batches.
-
-* w3-vars.el: New variable w3-latex-docstyle that controls what
-  documentstyle a latex document has.  Useful for going into two-column
-  mode or doublesided, etc.
-* w3-lemacs.el: Changed w3-back-link to go to 1+ the extent start position
-  to get around (extent-at) bug
-* w3-vars.el: Added www to the nonrelative link regular expression so that
-  links of that type will be parsed correctly.  New variable
-  w3-current-source holds the HTML source of a document.
-* w3.el: Most of the automatically generated html can now be referenced
-  with URLs like WWW://type/data.  Errors are generated this way, and you
-  can get the source for things like hotlists, history lists, help items,
-  etc.
-  Now stores the complete source of a document in a buffer-local variable,
-  so printing/mailing HTML and/or LaTeX is _MUCH_ faster, as is getting
-  the documents source - never any need to refetch it.  w3-reload-document
-  still does a fresh fetch though.
-* w3-emacs.el: w3-next-zone and w3-previous-zone now skip 'w3graphic zones
-* w3.el: Fixed small bug in re-insertion of SELECT menu items.  Stuck too
-  many spaces at the end of it.
-* w3-emacs.el: Make sure that x-popup-menu is bound before fset'ing
-  w3-x-popup-menu to it when in emacs 18
-
-Fri Feb 18 02:50:42 1994  William M. Perry  (address@hidden)
-* w3.el: Fixed problem in the textarea handling... misplaced a )...
-
-Thu Feb 17 19:38:50 1994  William M. Perry  (address@hidden)
-* w3.el: Fixed problem with w3-quotify-percents and null arguments...
-* w3-emacs.el, w3-emacs19.el, w3-lemacs.el, w3-old-lemacs.el, w3.el: Use
-  w3-quotify-percents in the (format ...) command in w3-view-this-url and
-  w3-view-url so that form queries don't mess up the format command` and
-  make it think it needs more arguments.
-* w3-emacs.el: Use insert-before markes in emacs 18
-* w3.el: Append fill-prefix to the paragraph parsing code.
-
-Wed Feb 16 21:47:33 1994  William M. Perry  (address@hidden)
-* w3-emacs19.el: Fixed dumb mistake in the setting up of
-  file-name-handler-alist... losing because of a misplaced ')'.  Gotta
-  love lisp :)
-* w3.el: Lots more file-ish type functions that will work with URLs.
-  w3-directory-p, real file-attributes, and stubs for more.
-* w3-emacs19.el: Redid the file-name-handler functions.  Stole
-  layout/ideas from the ange-ftp stuff from v19.
-* w3.el: Will check if running on a mono display and do dithering if it
-  is. Fixed problem with <LINK> parsing where it would delete too many
-  chars. Fixed problem with queries in w3-form-encode... too many &'s
-  Few more NeXTstep changes.
-* w3-lemacs.el: Lemacs menu's should no longer nuke people's Options menu
-  if it already exists.  Will add a submenu called 'WWW' to the
-  already-existing menu.
-* w3-emacs19.el: Added file-name-handler-alist support for emacs 19.
-  Works for find-file-other-window, find-file-other-screen, file-exists-p,
-  file-readable-p, file-executable-p, file-attributes, and
-  file-directory-p.
-* w3.el: Added new functions w3-file-size and w3-file-exists.
-* w3-emacs19.el: A few changes for NeXTstep emacs 19.  Menus now work,
-  storing URLS into the kill ring/NeXT clipboard, and loading of lmenu if
-  in dps. Still no [x|dps]-popup-menu though.
-
-Tue Feb 15 03:42:45 1994  William M. Perry  (address@hidden)
-* w3.el: Fixed w3-form-encode so that it actually returns the correct
-  query string if in a gopher or isindex form area...
-
-Mon Feb 14 19:12:31 1994  William M. Perry  (address@hidden)
-* w3.el: Multiline text area entry should now work in emacs 18 (put the
-  w3-do-text-entry outside of the save-excursion)
-* w3.el: Make w3-prepare-buffer mark the buffer as not modified.
-* w3-lemacs.el: Change w3-insert to insert-before-markers so that inlined
-  images will show up in the right place more often.
-
-Sat Feb 12 03:15:46 1994  William M. Perry  (address@hidden)
-* w3.el: Fixed a read-only buffer problem when fetching images...
-* w3-lemacs.el: New version of w3-track-mouse that doesn't need to move
-  (point) in the buffer... should be faster.
-
-Thu Feb 10 21:47:56 1994  William M. Perry  (address@hidden)
-* w3.el: Moved the image parsing until after everything else has been
-  parsed... this should fix everyones problems with inlined images
-  disappearing sometimes - they were attached to parts of the buffer that
-  was removed by other parsing routines.
-* dist.Makefile: The making of w3.info now changes the setfilename
-  directive in w3.texinfo to point to INFODIR.
-* w3-lemacs.el: Set end-open and start-open extent properties if setting
-  up a form.
-* w3.el: Fixed a type in one of the mule/forms patches.
-* w3-mule.el, w3-vars.el, w3.el: Miscellaneous fixes from Shin-ya Sato
-  <address@hidden> that make forms work much better in Mule.
-
-Wed Feb  9 23:37:11 1994  William M. Perry  (address@hidden)
-* w3-lemacs.el: Don't mess with graphic extents in w3-fix-extent-endpoints
-* w3-epoch.el, w3-lemacs.el, w3-vars.el, w3.el: More error checking in the
-  image code
-* w3.el: Fixed typo in w3-fetch-with-pgp...
-* w3.el: Slightly more intelligent way of doing w3-form-encode.
-
-Mon Feb  7 03:31:17 1994  William M. Perry  (address@hidden)
-* w3.texinfo: miscellaneous fixes/grammatical fixups
-* w3-epoch.el, w3-lemacs.el: Removed stupid message about possibly failing
-  to load an image because of the color map.
-
-Sun Feb  6 19:24:27 1994  William M. Perry  (address@hidden)
-* w3-vars.el: Changed w3-default-homepage to be defvar'd to nil, so that
-  w3-do-setup will grab the WWW_HOME variable if it can.
-* w3.texinfo: Fixed a few stupid bugs in @node structures that occurred
-  because I removed a node.
-* w3.el: Fix entity references in <TITLE> of documents.
-
-Sat Feb  5 02:55:05 1994  William M. Perry  (address@hidden)
-* Version 2.0 released.
-* w3.el: w3-public-key-exists will actually work now.
-* w3.el: Moved the w3-handle-graphics call within the let binding of
-  w3-handle-base, so that inlined images will work with <BASE> tags.  This
-  also fixes the problem of not being able to select the link an image is
-  covering with an ALT tag.
-* w3.el: Renamed w3-lemacs-19.8 to w3-old-lemacs because of problems with
-  v18 byte compiler.
-
-Fri Feb  4 17:11:03 1994  William M. Perry  (address@hidden)
-* w3-vars.el: Change w3-running-lemacs and w3-running-new-lucid to be
-  w3-running-old-lemacs and w3-running-lemacs, respectively.
-* w3-epoch.el, w3-lemacs.el, w3-vars.el, w3.el: Revamped some of the
-  w3-insert-graphic code so the conversion functions can be shared between
-  epoch & lucid.  Also added in code so that people with only XBM support
-  can use the inlined image code.
-* w3.el: Added functions to grab the servers public key from finger
-  information if possible when using PGP and PEM encryption
-* w3-html+.el: Much better table parsing routines - still not finished yet.
-
-Thu Feb  3 22:17:19 1994  William M. Perry  (address@hidden)
-* w3.el: Allow ~s in urls in w3-get-url-at-point
-* w3.el: Moved just the variable definitions to an outside file to ease
-  byte-compiling.  No longer loads whole w3.el just to get variable
-  definitions
-* w3.el: Moved w3-load-flavors into w3-do-setup
-
-Wed Feb  2 22:41:48 1994  William M. Perry  (address@hidden)
-* w3.el: w3-make-sequence now returns the sequence in ascending order.
-* w3.el: Changed the nntp/flee handling in w3-nntp-stat-newsgroup so that
-  it won't hang indefinitely.
-* w3.el: Made a few changes to the require functions so that mailcrypt and
-  nntp are not required until absolutely necessary.
-* w3-hyperbole.el: New version from address@hidden
-* w3-mule.el: Changed w3-grok-gopher-url to w3-grok-gopher-href
-* w3-docomp.el, w3-new-lucid.el: More compiler warnings fixed
-
-Tue Feb  1 21:47:04 1994  William M. Perry  (address@hidden)
-* w3.el: Fixed a few problems in w3-grok-http-href
-* w3.el: Support for the <BASE> tag.  New w3-grok-*-href functions that
-  can be used anywhere and return lists of server/port/file/etc.
-
-Mon Jan 31 22:32:52 1994  William M. Perry  (address@hidden)
-* w3-new-lucid.el: Fixed a free variable reference in w3-insert-graphics
-* w3-emacs.el, w3-emacs19.el, w3-epoch.el, w3-lucid.el, w3-new-lucid.el,
-  w3-next.el, w3.el: Moved some version-specific stuff out of the
-  definition of w3-mode and into the function w3-mode-version-specifics in
-  the w3-*.el files.
-* w3.el: Set w3-delimit-emphasis and w3-delimit-links to nil when doing
-  batch fetches.
-* w3.el: Mailing and batch-fetching now insert a <BASE> tag if
-  sending/saving the raw HTML.
-* w3.el: Fixed a few typos in w3-tn3270
-* w3-emacs19.el: Fixed a misplaced ( so that w3-follow-inlined-image works
-  in emacs19
-* w3.el: Added more descriptive function documentation to the autoloaded
-  functions.
-* w3.el: New variable w3-use-transparent.  If t, then it will use
-  transparent.el to do telnet/tn3270 links.  This is automatically set to
-  nil if you are in lucid emacs, epoch, or in a windowing system.
-* w3-mule.el: Added function w3-m2psbuffer that will print a buffer as
-  postscript in mule.
-* Renamed w3.texi to w3.texinfo
-* w3.el: Replaced <= with equal in case file size is nil...
-
-Sun Jan 30 18:40:16 1994  William M. Perry  (address@hidden)
-* w3.el: Added support for PGP and PEM encryption of requests.  Requires
-  the excellent mailcrypt.el by Jin S Choi (address@hidden)
-* w3.el: Added autoloads for 'gopher-dispatch-object and 'html-mode if
-  they didn't already exist.  Also added a patch from Jamie Zawinski that
-  fixes the ###autoload statements used by autoload.el
-* w3.texi: Now creates .info files just fine from makeinfo.
-
-Sat Jan 29 23:35:59 1994  William M. Perry  (address@hidden)
-* w3-emacs19.el, w3-epoch.el, w3-lucid.el, w3-new-lucid.el, w3.el: Added
-  an (fset 'w3-insert 'insert) to all but the epoch file, and used the
-  w3-insert written by Henry A. Rowley that will keep the zones intact.
-  Replaced all occurences of (insert) with (w3-insert)
-* w3-epoch.el: Getting the resource for underlining should work now.
-* w3.el: w3-add-document-to-hotlist now checks to see if the current
-  document is already in the hotlist.  If it is, it signals an error.
-* w3-new-lucid.el: Fixed problem in converting xbitmaps - left out a ' in
-  the sed command
-* w3-epoch.el, w3-new-lucid.el, w3.el: Changed how the
-  w3-graphic-converter-alist is specified.  Must now leave off the
-  ppmtoxpm command, and leave a stray '| ' at the en end of the
-  conversion.  The contents of the variable w3-ppmtoxpm-command are
-  appended to this string.
-* w3.el: Added a w3-convert-code-for-mule call in w3-sentinel if
-  w3-be-asynchronous is t.
-* w3-new-lucid.el: Several changes suggested by Jamie Zawinski
-  (address@hidden) More errror checking for the image loading, and display
-  a buffer describing each error in a buffer after parsing the buffer.
-  Also, if the image load fails, put a 'w3graphic zone over the [alt] tag.
-* w3.el: Several changes suggested by Jamie Zawinski (address@hidden) The
-  small extent made for graphics has the 'w3graphic property, so using
-  w3-follow-inlined-image on it will retrieve the full picture (for things
-  like lucid where it gets clipped to the line height).  No longer shows
-  'read 1 byte' messages - will only show a message when it has acually
-  received some info.
-* w3.el: Removed assumption that /usr/lib/X11/rgb.txt exists when using
-  ppmtoxpm
-
-Fri Jan 28 13:39:11 1994  William M. Perry  (address@hidden)
-* w3.el: Applied patch from address@hidden (Dong Liu) that fixed
-  a stupid problem with the w3-use-starting-points function.
-
-Wed Jan 26 23:36:02 1994  William M. Perry  (address@hidden)
-* w3-new-lucid.el: Changed w3-add-zone to always set end-open and
-  start-open - need more data for bug fixes.
-* w3-new-lucid.el: Added patch from Alastair Burt <address@hidden> to
-  fix not being able to get past graphic extents in 19.9
-* w3.el: The w3-nonrelative-link regexp now includes wais link types.
-* w3-emacs.el: Added a patch from address@hidden that fixed yet another dumb
-  mistake on my part in the emacs 18 w3-follow-link function.
-* w3.el: Basics of w3-pem-auth for the new httpd pgp/pem security
-* w3.texi: Documentation mime-types parsing, and viewer specifications.
-* w3.el: Viewers can now be lists, in which case it will be passed thru
-  'eval'.
-
-Tue Jan 25 20:33:15 1994  William M. Perry  (address@hidden)
-* w3-emacs.el: Fix from address@hidden for a problem in w3-follow-link for
-  emacs 18
-* w3-new-lucid.el: The problem with coredumps with lots of empty links in
-  lemacs 19.9 should (hopefully) be fixed.
-* w3.el: Added wais gateway support - not sure if it  works, but I get the
-  same results as I do with Mosaic, so good enough.
-* w3.el: Asynchronous retrieval over http works again.
-* w3-new-lucid.el, w3-epoch.el: Made sure w3-insert-graphic retrieved
-  graphics synchronously.
-
-Mon Jan 24 23:30:40 1994  William M. Perry  (address@hidden)
-* w3.el: Added w3-use-starting-documents and w3-show-starting-documents
-  that display the contents of the hotlist-type w3-starting-documents
-  variable.
-* w3.el: Added function w3-insert-formatted-url... inserts a formatted <A
-  HREF...></A> construct in a buffer.  Url is the url of the current
-  buffer (or link under point with prefix arg), text of the link defaults
-  to the title of the buffer or the text of the link under cursor.  Buffer
-  to insert into is prompted for.
-* w3-emacs19.el, w3-epoch.el, w3-lucid.el, w3-new-lucid.el: Added function
-  w3-zone-at that returns the zone at the position passed to the function
-  (can be point or marker).
-* w3.el: Changed the inlined images to have the highlight attribute if
-  possible.
-* w3-emacs.el, w3-emacs19.el, w3-new-lucid.el, w3.el: Rewrote lots of
-  functions so that inlined images are stored in their own zone, and
-  control-middle-mouse-button or M-x w3-follow-inlined-image will fetch
-  the inlined image and send it to an external viewer. w3-follow-link will
-  also get an inlined image if it cannot find a hyperlink or a form entry
-  area under cursor.
-* w3-emacs.el: Added w3-zone-eq for emacs 18 so that radio buttons will
-  work.
-* w3.el: Changed w3-handle-graphics so that if w3-delay-image-loads is t,
-  use a marker instead of an absolute (point) reference.
-* w3-new-lucid.el: Fixed a problem in the delayed image loading - would
-  always try to find w3-working-buffer, which would (should) not exist
-  when doing a delayed load.
-* w3-new-lucid.el: Added missing interactive spec to
-  w3-load-delayed-images
-* w3-new-lucid.el: Added function w3-load-delayed-images, and activated
-  the delay image load menu choice, added load delayed images menu choice.
-* w3.el: A few changes to the gopher support - should recognize gopher
-  directories more reliably.
-* dist.Makefile: Fixed distribution makefile to use the new system of 1
-  large file.
-* w3.el: Fixed problem with radio buttons - if more than one was set due
-  to bad use of the CHECKED argument, then it would not let you turn one
-  of them off.
-
-Sat Jan 22 12:36:28 1994  William M. Perry  (address@hidden)
-* w3.el: Fixed problem where unknown tags in a <PRE> or <XMP> segment were
-  getting nuked - bad when trying to show source code with < and > in them
-  - large chunks would disappear.  Thanks to Magnus Y Alvestad
-  <address@hidden> for noticing the problem.
-
-Fri Jan 21 20:52:24 1994  William M. Perry  (address@hidden)
-* w3.el: Merged most of the files into one large one.
-* w3.el: Parse out mime-types file if it exists at startup.
-* w3-epoch.el: Changed epoch to use the class name Emacs instead of emacs.
-* w3.texi: Fixed dumb mistake in documentation about w3-mode-hooks and
-  list indentation
-* w3.el: Keep/restore tab-stop-list when going into w3-mode
-* w3-new-lucid.el, w3-lucid.el, w3-emacs19.el: Renamed a few menu items,
-  and activated 'forward' and 'back' buttons.
-
-Thu Jan 20 23:27:31 1994  William M. Perry  (address@hidden)
-* w3-epoch.el: No longer remove numbers and periods from zones in
-  w3-fix-extent-endpoints
-* dist.Makefile: Fixed the 'make install' target.
-
-Thu Jan 20 15:55:04 1994  William M. Perry  (address@hidden)
-* w3-parse.el: Did a bit of cleaning up in the parsing code -
-  obsolete/short functions removed or merged.
-
-Wed Jan 19 20:15:14 1994  William M. Perry  (address@hidden)
-* w3.el: Added version # of efs/ange-ftp to the bug report template.
-* w3-new-lucid.el: Took out deletion of region when conversion of pixmaps
-  failed . . . don't need it in lucid
-* w3-new-lucid.el: Put in quick hack to go to 1+ extent-start-position to
-  get around bug in lemacs 19.9
-* w3-new-lucid.el, w3-epoch.el: Changes to the graphics code to work with
-  the new w3-request-* variables
-* w3-forms.el, w3-mime.el, w3-misc.el, w3-url.el, w3-vars.el: Using new
-  variables to control extra headers in MIME requests, as well as
-  specifying methods/data.
-
-Tue Jan 18 15:13:33 1994  William M. Perry  (address@hidden)
-* w3-mime.el: Changed mailcap parsing to strip out leading/trailing spaces
-* w3-forms.el: Changed w3-form-encode to check if the query is empty
-  before doing a substring.  Thanks to Michael Jankowski for noticing the
-  problem
-* w3-forms.el: Applied patch from Michael Jankowski to fix a problem in
-  w3-finish-text-entry in emacs 19 - tried to change text properties in a
-  read-only buffer
-* w3-misc.el, w3-mule.el, w3-url.el, w3-viewers.el: Miscellaneous patches
-  by Shin-ya Sato <address@hidden> for MULE support
-* w3-lucid.el, w3-new-lucid.el: Removed reference to 'value' from
-  w3-x-popup-menu - might not always be bound.
-* w3-url.el: Changed newsgroup handling yet again - can now work with
-  either Flee's nntp or the original nntp.el by Umeda.  No longer
-  require's gnus.
-* w3-new-lucid.el: Wrapped the make-pixmap call in a condition-case for
-  safety.
-* w3-epoch.el: Changed w3-insert-graphic to insert a '^' to attach the
-  graphic to.
-* w3-new-lucid.el: Changed w3-insert-graphic to create a larger extent
-  instead of using '^' - looks much better now.
-* w3-parse.el: Changed w3-handle-graphics to not insert a '^' for each
-  graphic - leave that up to w3-insert-graphic if it needs it.
-
-Mon Jan 17 22:32:40 1994  William M. Perry  (address@hidden)
-* w3-vars.el: Added image/x-xbitmap to the list of graphics converters.
-* w3-lists.el, w3-parse.el: Changed handling of <LI SRC> to only check if
-  w3-insert-graphic is defined, not hardcoded just for epoch.
-* w3-url.el: Directory listings in local file and ftp access now have
-  icons.
-* w3-epoch.el: Cacheing of images will now only store the image once, not
-  once for every time it is used.
-* w3-new-lucid.el: Graphics work now - image/xbm's are translated into the
-  foreground and background color of the 'default face.
-* w3-gopher.el: Gopher handling now spits out icons with appropriate ALT
-  refs.
-* w3-epoch.el: w3-insert-graphic is now only defined if epoch was compiled
-  with graphic zone support.
-
-Sat Jan 15 20:20:59 1994  William M. Perry  (address@hidden)
-* w3-gopher.el: Added patch to w3-grok-gopher-link from Alastair Burt.
-  Also added support for gopher urls with searches embedded in them
-  (Mosaic-style searches with '?' instead of tab.
-* w3.el: Added printing of whether you are in Mule, and the window system
-  andd window system version in w3-submit-bug.
-
-Fri Jan 14 22:37:42 1994  William M. Perry  (address@hidden)
-* w3-mime.el: Fixed authentication - was looking for the wrong header.
-  Also added support for using the URI: field instead of the Location:
-  field to get in sync with the latest HTTP/1.0 specification.
-* w3-lists.el: Few more message->w3-lazy-message conversion
-
-Thu Jan 13 23:15:36 1994  William M. Perry  (address@hidden)
-* w3-gopher.el: Added patches to w3-gopher.el from Alastair Burt
-  <address@hidden> that fixed a few problems.
-* w3-mule.el, w3-url.el: Miscellaneous mule enhancements
-
-Wed Jan 12 19:41:05 1994  William M. Perry  (address@hidden)
-* w3-new-lucid.el: Fixed problem with my misunderstanding of the 'end-open
-  and 'start-open extent properties.
-* w3-lucid.el, w3-new-lucid.el: Added patch by Alastair Burt
-  <address@hidden> that changes w3-x-popup-menu to do a
-  completing-read if the last event was not a button/menu event.
-* w3-viewers.el: Fixed w3-save-binary-file
-* w3-mime.el: Changed w3-parse-mailcap to use new variable
-  w3-mime-mailcap-overrides.  If t, then entries in the users mailcap file
-  will replace the defaults in w3-mime-viewers.
-* w3-misc.el: Changed w3-upcase-region so that it will not touch entity
-  declarations either.
-
-Mon Jan 10 22:43:51 1994  William M. Perry  (address@hidden)
-* w3-parse.el: REL and REV attributes of links can now be comma-separated
-  lists.
-* w3-parse.el: Fixed broken regular expression in <LINK> parsing
-* w3-lists.el: Fixed problem of paragraphs within lists having the
-  highlighting stripped from the first character.
-* w3-parse.el, w3-url.el: Changed most of the unimportant 'message's to
-  use w3-lazy-message instead.
-* w3-url.el: Added variable w3-show-status.  If nil, no messages will be
-  shown in the modeline showing where the current retrieval/parse is at.
-* w3-parse.el: Added patch by Rainer Pruy
-  <address@hidden> that shows the SRC attribute of
-  IMG tags if no ALT tag is given.
-* w3-emacs.el: Added mouse support for emacs 18
-
-Sat Jan  8 20:32:46 1994  William M. Perry  (address@hidden)
-* w3-url.el: more support for bad HTTP: links
-* w3-misc.el, w3-mule.el, w3-viewers.el: Applied a patch from Shin-ya Sato
-  <address@hidden> that keeps MULE from encoding binary data it
-  receives from subprocesses, etc.
-* w3.el: Added tab-width to the list of variables saved in w3-mode.
-* w3-gopher.el: CSO searching now works.
-* w3-vars.el: Changed default value of w3-delimit-emphasis to take MULE
-  into account.
-* w3-url.el: Added function w3-build-url that will build a URL in stages.
-  Not used anywhere yet.  Thanks to T.V. Raman for suggesting it.
-* w3-gopher.el: Fixed gopher support for using gateways.  Won't give
-  errors at top and bottom of buffer.
-* w3-misc.el: Changed w3-hexify-string so that it won't hex slashes in the
-  string.
-* w3.el: Another check for efs-auto added
-
-Fri Jan  7 23:53:19 1994  William M. Perry  (address@hidden)
-* w3.el: Changed checking of efs/ange-ftp to also check for efs-auto
-  before loading ange-ftp.
-* w3-emacs19.el, w3-lucid.el, w3-new-lucid.el: Changed menu handling to
-  ignore links with nil HREFs when making the 'links...' menu.
-* w3-gopher.el: Changed w3-convert-ask-to-form for better handling of
-  SELECT boxes that have no choices.
-* w3.el: Added w3-leave-buffer.  Does a bury-buffer on the current buffer
-  instead of killing it.
-* w3-mime.el: Fixed problem where using telnet in a subprocess would chop
-  off lots of front of incoming data.  Bad kill-line in
-  w3-is-mime-response.
-* w3-misc.el, w3-url.el, w3-viewers.el: Changed all yes-or-no-p/y-or-n-p
-  functions to use the function specified by w3-confirmation-func
-
-Thu Jan  6 23:58:37 1994  William M. Perry  (address@hidden)
-* w3-gopher.el: Changed gopher parsing routines to print the type of the
-  link in the listing.  The text describing the link is configurable by
-  the variable w3-gopher-labels.
-* w3-gopher.el: More tweaks for more mosaic-like behavior
-* w3-parse.el: Searchable gopher objects no longer become inlined forms -
-  selecting them creates the form, as in Mosaic.
-* w3-gopher.el, w3-url.el: Switched gopher handling to use Mosaic's type
-  of double-typing.  This makes it much easier to get searching done right
-  (whether it needs a 7/ or not, etc).
-
-Wed Jan  5 14:15:02 1994  William M. Perry  (address@hidden)
-* w3-typecheck.el: Use new variable w3-passwd-entry-func instead of
-  hard-coding ange-ftp-read-passwd.
-* w3.el: Reworked some of w3-do-setup, and added comments
-* w3.el: Changed to only require 'ange-ftp if not using efs.
-* w3-lists.el: Did some work on the DL handling
-* w3-url.el: Directory formatting routine will now include last file
-  modification date and size if possible.  If not date data is returned by
-  file-attributes, or current-time-string does not take a parameter, then
-  no date is shown.  Size is usually shown (almost always if you use EFS
-  instead of ange-ftp)
-* w3.texi: Round and round he texinfo's, where he stops, noone knows.
-
-Tue Jan  4 23:00:35 1994  William M. Perry  (address@hidden)
-* w3-gopher.el: Fixed problem in handling of gopher text files . . . were
-  always being parsed as HTML.
-* w3-forms.el: Fixed dumb problem in encoding a gopher+ ASK form.
-* w3.texi: Initial revision
-
-Mon Jan  3 19:06:17 1994  William M. Perry  (address@hidden)
-* All files: Updated copyright notices
-* w3-lists.el: UL and OL lists can now have <LI ALT="some text" SRC="some
-  image">
-* w3-misc.el: Renamed w3-rassq-with-equal to w3-rassoc
-* w3-emacs.el, w3-emacs19.el: Fixed stupid problem where I was trying to
-  call the x-store-cut-buffer function even if not in X
-
-Sun Jan  2 22:47:02 1994  William M. Perry  (address@hidden)
-* w3-misc.el: Added a function to break up a menu description into smaller
-  chunks and submenus.
-* w3-gopher.el: Now smarter about when to parse out a gopher object as a
-  directory listing
-* w3-emacs19.el, w3-lucid.el, w3-new-lucid.el, w3-emacs.el, w3-epoch.el:
-  Added function w3-store-in-x-clipboard
-* w3.el: w3-save-url will now copy the url into the X clipboard
-* w3.el: Added autoloads that autoload.el can understand.
-* w3-forms.el: Forms links will now highlight when the mouse moves over
-  them in lucid emacs (and any other flavor that eventually supports them
-  in its version of w3-add-zone)
-* w3-gopher.el: Fixed dumb problem where parts of the gopher+ selector
-  string were being left in w3-current-file, so things like w3-view-url,
-  etc were getting the wrong information.
-* w3-gopher.el: Fixed stupid problem where I didn't convert the gopher
-  selector strings into url encoding before creating the <A> tags in
-  w3-format-gopher-link.  This caused gopher links with spaces/tabs/etc to
-  not be parsed correctly.  Thanks to John Ladwig <address@hidden>
-  for noticing the problem.
-
-Sat Jan  1 20:08:19 1994  William M. Perry  (address@hidden)
-* w3-parse.el: Added support for showing some of the HTTP/1.0 headers in a
-  buffer. Controlled by the new variable w3-show-headers.  Should be a
-  list of HTTP/1.0 headers (all lowercase) to include at the end of the
-  buffer. If nil, nothing will be shown.  Thanks to Jared Rhine for
-  suggesting it.
-* w3-gopher.el: Removed multiple definitions of w3-parse-gopher, and
-  revamped the handling of gopher titles. 
-* w3-misc.el: Changed w3-batch-fetch to be more robust - is now able to
-  retrieve any type of information, and the user can specify whether they
-  want formatted text, raw HTML, or transfer in binary mode.
-* w3-parse.el: Changed the fill-column and <HR> calculation routines to
-  honor the new variable w3-strict-width.
-* w3-misc.el: Removed some useless variables from w3-get-url-at-point in
-  the eternal quest for less compilation warnings.
-* w3-misc.el: Fixed problem in w3-strip-leading-spaces and
-  w3-eat-trailing-space
-* w3-parse.el: The link building code will now remove all entity
-  references in the link text before storing it in the zone - this means
-  that the menu building code and w3-complete-link will no longer have
-  unresolved entities in them looking nasty.
-* w3-misc.el: Added function w3-fix-entities-in-string.  Takes any string
-  and removes all entity references within it, and replaces it with normal
-  text (uses the w3-html-entities assoc list).
-* w3-new-lucid.el, w3-lucid.el: Added function w3-x-popup-dialog
-
-Fri Dec 31 21:45:04 1993  William M. Perry  (address@hidden)
-* w3-new-lucid.el, w3-lucid.el: Fixed problem in w3-fix-extent-endpoints
-* w3-misc.el: Fixed problem in w3-eat-trailing-space that would always
-  remove one too many spaces.
-* w3-mosaic.el: Added function w3-rename-hotlist-entry to give a new title
-  to an item in your hotlist.  Will not let you use a title that is
-  already a member of the hotlist.
-* w3-emacs19.el, w3-lucid.el, w3-new-lucid.el: Added a few options to the
-  navigation menu
-* w3-url.el: Added a patch from Fran Litterio <address@hidden> that
-  adds variable w3-reuse-buffers.  Also changed the buffer reusing code
-  will skip over w3-working-buffer in its search for a matching url.
-* w3-url.el: Fixed problem in passing things off to gopher-mode with blank
-  selector strings - was not defining a good type (type was set to 0
-  instead of ?1).
-* w3-url.el: Fixed typo in gopher handling
-* w3-gopher.el: Added % retrieved messages when retrieving a gopher+
-  object, fixed problem in gopher parsing for emacs 19.
-
-Thu Dec 30 23:58:19 1993  William M. Perry  (address@hidden)
-* w3-gopher.el: Fixed dumb problem in gopher formatting - didn't check if
-  the selector string was longer than 1 character before trying to extract
-  the first char.
-* w3-misc.el: Fixed major problems with w3-strip-leading-spaces and
-  w3-eat-trailing-space again.
-* w3-forms.el: Added support for submitting gopher+ ASK blocks
-* w3-url.el: Changed gopher support/url parsing routines to handle gopher+
-  and gopher ASK blocks without warping the URLs too much.
-* w3-gopher.el: Added in gopher+ support
-* w3.el: Fixed viewing of gopher links for new storage format.
-* w3-gopher.el, w3-url.el: Revamping gopher
-* w3-vars.el: Added variable w3-gopher-to-mime
-* w3-vars.el: Added variable w3-gopher-types
-
-Thu Dec 30 13:57:53 1993  William M. Perry  (address@hidden)
-* Added support for Mule (Multi-Lingual Emacs), mainly highlighting of
-  links.  Thanks to address@hidden for the patches.
-* w3-next.el: Added provide 'w3-next
-* w3-parse.el: Might have fixed the over-run into other words/spaces
-  in link highlighting.
-
-Wed Dec 29 23:33:07 1993  William M. Perry  (address@hidden)
-* w3-misc.el: Added function w3-fetch-url-at-point... thanks to Torre
-  J. Wenaus <address@hidden> for the code.
-* w3-parse.el: Back to using window-width as starting point for
-  w3-right-border.
-* w3-vars.el: Removed variable w3-hypertext-extns
-* w3-mosaic.el:  Removed support for adding old gopher-mode pages to
-  the hotlist.  Trying to get people to use hypertext-gopher-mode.
-* w3-next.el: Initial revision
-* w3-gopher+.el: Added new function w3-convert-ask-to-form that
-  converts a Gopher+ ASK block into an HTML form.
-* w3-forms.el: Value and default value are now reset for each SELECT
-  area in forms.
-* w3-vars.el: Changed default gopher handling to be in hypertext.
-
-Tue Dec 28 17:41:51 1993  William M. Perry  (address@hidden)
-* w3-url.el: Can now handle http:/somefile - it will substitute the
-  server and port of the current document to make a complete url.
-* w3-forms.el: Names in INPUT tags can be empty
-* w3-auth.el, w3-emacs.el, w3-emacs19.el, w3-epoch.el, w3-forms.el,
-  w3-lists.el, w3-mime.el, w3-misc.el, w3-parse.el, w3-typecheck.el,
-  w3-url.el, w3-vars.el, w3.el: Removed lots of references to bound
-  but unreferenced variables.
-* w3-misc.el, w3-url.el, w3-vars.el, w3.el: Added new variables
-  w3-mail-command and w3-mail-other-window-command. These variables
-  will control what functions are called when w3 needs to send mail.
-  W3 tries w3-mail-other-window-command only if w3-mutable-windows is
-  t, then w3-mail-command if this function is not bound.  Then goes to
-  mail-other-window, then just to mail.
-
-Fri Dec 24 03:21:58 1993  William M. Perry  (address@hidden)
-* w3-url.el: Formatting directories now gives a progress indicator in
-  % of files converted to hypertext listing.
-* w3-url.el: Added code to check for whether a file is a symbolic
-  link.  If it is, then put in an arrow and the name of the link (like
-  ls -l).
-
-Thu Dec 23 18:53:54 1993  William M. Perry  (address@hidden)
-* w3-epoch.el, w3-misc.el, w3-parse.el, w3-typecheck.el, w3-vars.el:
-  Replaced long regular expressions for checking whether a URL is
-  relative  or not with a variable w3-nonrelative-link to save
-  space/typing, and it will be easier to change in the future.
-* w3-misc.el: Added function w3-batch-fetch to retrieve all the urls
-  passed to it on the command line and save them as text files.
-  Thanks to Jared Rhine for suggesting it.
-* w3-parse.el: Removed use of screen-width/window-width when computing
-  fill column.  Uses old value of fill-column.
-* w3-mosaic.el: Fixed problem in new personal annotation parsing code
-  that would barf if you didn't have any personal annotations.
-
-Thu Dec 23 16:28:22 1993  William M. Perry  (address@hidden)
-* w3-mosaic.el: Made lots of changes to the personal annotation
-  handling.  Deletion will work properly now (won't mess up the
-  internal representation of the annotations), support for the real
-  Mosaic annotation format (more than one annotation on a url yields
-  only one line in the annotation LOG file), figures out the highest
-  annotation number instead of using the last line in the file +1.
-* w3-emacs.el: Added definition of w3-create-faces.
-* w3-gopher+.el: Initial revision
-* w3-gopher.el: Fixed quite a few problems with gopher support.
-
-Tue Dec 21 06:47:50 1993  William M. Perry  (address@hidden)
-* w3-parse.el: Fixed idiotic problem where no PRE segments were being
-  rendered.  *sigh*
-
-Sat Dec 18 15:03:59 1993  William M. Perry  (address@hidden)
-* w3-url.el, w3-gopher.el, w3-forms.el: Added support for searching in
-  gopher.  Transforms into a special type of form, like <ISINDEX>
-  tags.  Only works if retrieved from a gopher listing right now.
-* w3-vars.el: Changed default viewer for text/plain to be w3-mode
-* w3-parse.el: Fixed problem with recursive filling of paragraphs - if
-  there were too many <PRE> segments, then it would die from recursing
-  too much. Thanks to Tom Tromey <address@hidden> for pointing
-  out the problem.
-
-Fri Dec 17 23:01:57 1993  William M. Perry  (address@hidden)
-* w3-url.el: Changed the display of XX of YY bytes transferred in
-  HTTP/1.0 responses to be optional.  Would mess some people up that
-  are behind gateways using telnet, etc.  Variable is
-  w3-show-http2-transfer.
-* w3-lists.el: Added support for <LI SRC="blahblahblah"> for list
-  items with icons, etc.
-* w3-epoch.el:  Rewrote the resource fetching routines to me
-  consistent with emacs 19 and lucid emacs.
-* w3-lucid.el, w3-emacs19.el, w3-epoch.el, w3-new-lucid.el: Moved all
-  face creation stuff into w3-create-faces.
-* w3-vars.el: Fixed typo in w3-graphic-converter-alist
-* w3-vars.el: Added keybindings > & < to go to end/beginning of
-  document.  Added functions w3-end-of-document and
-  w3-start-of-document to go the end and beginning of a document
-  respectively.
-* w3-forms.el: Fixed a problem in the new text area support.
-* w3-forms.el, w3-typecheck.el: Reworked quite a bit of stuff to get
-  forms submissions working correctly. You no longer have to keep
-  buffers around until you submit the form, and the default text (or
-  the current value of the button) is inserted each time you edit the
-  form area.
-* w3-mime.el:  Changed w3-parse-mime-viewers to split the Accept:
-  string onto one or more lines as appropriate, as the NCSA server
-  doesn't seem to like the long Accept: line when POSTing a form.
-* w3.el: Merged in support for NeXT emacs from Laurent Dami
-  <address@hidden> (emacs 18.58 on NeXTstep)
-* w3-emacs.el, w3-emacs19.el, w3-epoch.el, w3-lucid.el,
-  w3-new-lucid.el: Added function w3-setup-version-specifics that will
-  do any required fiddling for each version of emacs.
-
-Thu Dec 16 23:22:08 1993  William M. Perry  (address@hidden)
-* w3-new-lucid.el: Fixed problem with w3-fix-extent-endpoints failing
-  when an extent was completey spaces/newlines
-* w3-forms.el: Changed regular expressions to allow one or more =
-  signs in name/value tags.
-* w3-forms.el: Made input tags with NAME of isindex do an automatic
-  submission, ala Mosaic, and address@hidden's suggestion on
-  www-talk that browsers should standardize on this hack.
-* w3-parse.el: Changed form-based searching to use an input tag of
-  NAME isindex like Mosaic.
-* w3-parse.el: Fixed error in new header routines. Would bomb if a
-  header was not terminated correctly.
-* w3-parse.el: No longer remove tabs at the beginning of the buffer -
-  was messing up lists.  Still removes spaces/newlines
-* w3-forms.el, w3-parse.el: Added real support for TEXTAREA tags, and
-  wrap TEXTAREA input tags in PRE segments.
-* w3-forms.el: Fixed bad regular expression in forms mode that would
-  cause tags with VALUE="" to be drawn wrong.
-* w3-newparse.el, w3-url.el: Use new function w3-lazy-message instead
-  of message.  Will not update the modeline if called more than once a
-  second.  Thanks to Jamie Zawinski <address@hidden> for the patches.
-* w3-viewers.el: Starting viewers no longer starts an interactive
-  shell & exec.  Thanks to Jamie Zawinski for showing me that it was a
-  dumb thing to do :)
-* w3-new-lucid.el: Initial revision
-* w3-vars.el, w3.el, w3-lists.el: Changed occurences of w3-running-era
-  to w3-running-new-lucid
-* w3.el: Moved creation of w3-mime-accept-string into w3-do-setup
-* w3-epoch.el: Fixed problem in epoch form entry.
-* w3-forms.el: Changed assignment to free variable method in w3-handle-forms.
-* w3-forms.el: Fixed the revert button bugs in emacs 19.
-* w3-emacs19.el: changed w3-delete-zone to use remove-text-properties
-  instead of putting nil text properties.
-* w3-emacs19.el: Changed w3-delete-zone to remove the face and
-  mouse-face properties. 
-
-Wed Dec 15 22:56:43 1993  William M. Perry  (address@hidden)
-* w3-lists.el: Added a 't' to calls to replace-match so that the case
-  is preserved.
-* w3-vars.el: Added variable w3-list-chars-assoc for specifying what
-  characters to insert at the front of lists.
-* w3-lists.el: Can now control what characters are inserted at the
-  front of a list. See w3-list-chars-assoc for details.
-
-Wed Dec 15 20:41:02 1993  William M. Perry  (address@hidden)
-* Version 1.7.14
-* w3-forms.el: Fixed problem with resetting popdown menus to the
-  defaults.
-* w3-epoch.el: Rewrote w3-fix-extent-endpoints to remove
-  newlines/whitespace from front of zones also, as well as numbers &
-  periods.  This will fix lists, but might mess up real links once in a
-  while.  Oh well, epoch won't be around much longer anyway.
-* w3-mosaic.el: Fixed bug in w3-write-global-history where 'nil' in
-  the history would cause it to choke.  Thanks to address@hidden
-  for noticing the problem.
-* w3-emacs.el: Changed the w3-fix-extent-endpoints to remove
-  newlines/whitespace from the front of zones also.
-* w3-lists.el: Changed the list handling code to use
-  insert-before-markers if using emacs 18.  This keeps the
-  indentation/numbering to not become part of the zones.
-* w3-emacs19.el: Fixed a few errors with the new forms/link movement
-  code
-* w3-emacs19.el: Changed w3-follow-link to not die on links with no
-  data.
-* w3-emacs19.el: Changed w3-forward-link and w3-back-link to honor
-  forms entry areas.
-* w3-vars.el: Changed definition of w3-header-char-assoc to use BR correctly
-* w3-parse.el: <BR> tags are rendered a little better now - no extra
-  spaces from the fill-region will make them look odd.
-  
-Tue Dec 14 21:41:29 1993  William M. Perry  (address@hidden)
-* w3-url.el: Added checking to w3-fetch to see if a buffer visiting a
-  URL already exists before fetching it.  Offers to reuse the old one if
-  found.
-* w3.el: Changed w3-save-url to be more consistent with the other
-  commands that muck with URLs.  C-k grabs the current URL into the kill
-  ring, and C-k with a prefix arg grabs the URL under pt into the kill
-  ring.  Thanks to Jared Rhine for pointing out the inconsistency.
-* w3-mosaic.el: Added function w3-append-hotlist.  This will append a
-  hotlist to the one currently in memory.
-* w3-parse.el: Fixed problem where <P> breaks after a header item were
-  not being erased.
-* w3-misc.el: Added function w3-upcase-region that will convert a
-  region of text to uppercase, but ignore any text in it that is between
-  < and >.  This will stop it from changing the links references within
-  <A> tags.
-* w3-vars.el: Changed the header assoc list to use w3-upcase-region
-  instead of upcase region.  Was causing links in headers to point to
-  the wrong files.
-* w3-era.el, w3-lucid.el: Added patch from Alastair Burt that fixes a
-  few problems in the lucid menu handling code (malformed, plus trims
-  the menu items to w3-lucid-max-item-size so that they don't shoot off
-  the sides of your screen.
-* w3-url.el: Added a space at the end of the prompt in w3-open-local
-* w3.el: Changed w3-reload-document so that it remembers where you
-  were in the buffer and repositions you there.
-* w3-mime.el: Changed the format of w3-mime-accept-string so that it
-  can be used in other places.
-* w3-misc.el: Added functions w3-forward-in-history and
-  w3-backward-in-history.  This will first try to find the actual buffer
-  recorded in the history list, then any buffer with the same URL, then
-  goes to point in those buffers.
-* w3-vars.el: Added new variable w3-current-next-link and
-  w3-current-last-link that are buffer-local.  These store the history
-  information for this buffer.
-* w3.el: Changed a few functions to use the new history mechanism
-* w3-url.el: Modified w3-fetch to store history items in the new
-  variables
-  
-Mon Dec 13 23:39:20 1993  William M. Perry  (address@hidden)
-* w3-emacs.el: Finished function w3-fix-extent-endpoints, but need to
-  do something about the markers moving in front of list items.
-  w3-fix-extent-startpoints or something similar.
-* w3-lucid.el: Added missing function 'w3-delete-zone Fixed menu
-  generation error
-* w3-misc.el: Changed w3-maybe-relative and a few other functions to
-  take an optional 'DATA' parameter for using the POST command,etc.
-* w3-forms.el: Fixed a few problems with non-POSTing forms submissions
-* w3-parse.el: Removed code to eat newlines/whitespace at the
-  beginning/end of links.  Was causing errors if links were within PRE
-  segmens (actually, only if a link was the last thing in a PRE segment,
-  and it had whitespace after it, and before the </PRE>
-* w3-forms.el: Fixed problem with forms <SELECTION MULTIPLE> support.
-  Wasn't giving the fake checkboxes any 'value's, so it was reported as
-  'ON' to the server, not the name of what was selected.  Also fixed a
-  problem where the option variable in SELECTION handling wasn't being
-  set to nil each time, so each successive SELECTION tag would get more
-  and more choices.
-* w3-parse.el: Added call to function w3-fix-extent-endpoints.  Should
-  fix the problem with forms eating newlines/spaces at the end of form
-  entry areas when new data is entere.
-* w3-forms.el: Fixed problem in forms submission.  Would die if the
-  first item in a form was a SELECTION - it was not storing the
-  method/actionurl if it was.
-
-Sun Dec 12 20:54:44 1993  William M. Perry  (address@hidden)
-* w3-epoch.el: Added function w3-fix-extent-endpoints
-* w3-emacs.el, w3-emacs19.el, w3-era.el, w3-lucid.el: Added new
-  function w3-fix-extent-endpoints.  Makes extents smaller if they have
-  newlines/whitespace at the end.  This will keep the forms support from
-  killing newlines whenever you do a form entry.
-* w3-cache.el: Added code to store stuff in cache as compressed
-  (gzipped) data.
-* w3-url.el: HTTP links like http://cs.indiana.edu are now recognized
-  (no longer needs the trailing '/'
-* w3-lists.el: Fixed problem where alternating <P> tags would
-  disappear within lists.  Over-aggressive regular expression.
-* w3-url.el: Changed the handling of content-length - using
-  w3-parse-mime-headers was causing an infinite loop in redirection.
-* w3-mime.el: Fixed a few problems in the redirection handling because
-  of switching to lower-case headers in w3-current-mime-headers.
-* w3-url.el: Added support for using the content-length header in
-  HTTP/1.0 responses to show how big the file is in the minibuffer.
-* w3-mime.el: Changed the MIME parsing routines to save the header
-  fields in lowercase.
-* w3-emacs.el: Fixed dumb problem in w3-complete-link for emacs 18.
-  Left out a call to w3-zone-data.
-* w3-url.el, w3-forms.el: Replaced use of member with w3-member.
-* w3-forms.el: Fixed error in regular expression where buttons with
-  spaces in their VALUE fields would not be rendered.
-* w3-viewers.el: New way to specify whether to view process output or
-  not.  w3-working-buffer is always destroyed if a viewer is invoked.
-* w3-vars.el: Added variable w3-always-show-output.
-* w3-vars.el: Changed def. of &yuml; to be ?\377 instead of the actual
-  character 377.  Was causing problems with CVS.
-* w3-parse.el: Whitespace at the beginning of buffers will now be
-  erased.  Headers will now be a little more intelligent about how they
-  do line/paragraph breaks.  Headers can now be shown on text terminals
-  by the variable w3-header-chars-assoc.  Thanks to Jared Rhine for the
-  suggestion.
-* w3-parse.el: Added support for user-customizable text before and
-  after headers
-* w3-misc.el: Changed w3-eat-trailing-spaces and
-  w3-strip-leading-spaces to get ride of newlines too.
-* w3-vars.el: Added the variable w3-header-chars-assoc to have
-  formatting of headers on dumb terminals.
-
-Fri Dec 10 21:14:07 1993  William M. Perry  (address@hidden)
-* w3-lists.el: Fixed bug where lowercase list tags (ol instead of OL)
-  would cause an infinite loop if there were within another list.  Left
-  out an (upcase (..))
-  
-Thu Dec  9 23:24:10 1993  William M. Perry  (address@hidden)
-* w3-forms.el: Changed the handling of MULITPLE selections in option
-  lists to be a <UL> of the options, all checkboxes with the same name.
-
-Wed Dec  8 22:46:07 1993  William M. Perry  (address@hidden)
-* w3-lists.el: Fixed a bug where PRE segments within lists would be
-  ignored and filled.
-* w3-forms.el: Added support for the SEVERAL/MULTIPLE attribute on the
-  SELECT input tag.  Rendered as a preformatted list of checkboxes.
-* w3-misc.el: Added function w3-eat-trailing-space
-* w3-mime.el: Fixed a dumb problem where I forgot a "%s" in a format
-  string and so wasn't sending any data during a POST forms submission
-* w3-forms.el: Added support for POST submission of forms
-* w3-mime.el: Added a 'data' field to the w3-create-mime-request
-  function.  This will make it easy to implement post in a more
-  generalized way later.
-* w3-url.el: Added ability to send arbitrary data down through
-  w3-fetch, w3-retrieve, and w3-http.  Useful for POST method.
-* w3-emacs19.el: Removed patch for double-skipping of links in early
-  versions of emacs.  People using < 19.21 should upgrade.
-* w3-lists.el: Nested lists should now be a little quicker.  Also
-  fixed the problem where paragraphs within lists would have an extra
-  space at the beginning of the first line.
-* w3-forms.el: Changed w3-do-form-entry to do w3-delete-zone before
-  deleting the text contained by the zone.  Previous behavior would make
-  emacs19 bomb with an error.
-* w3-typecheck.el: Changed the option reading so that it checks
-  whether w3-x-popup-menu returns a cons pair or a plain string and acts
-  accordingly.
-* w3-docomp.el: Added lots of autoloads to get rid of compilation errors
-* w3-mime.el: Changed the header parsing to get _ALL_ the headers and
-  store them in an assoc list instead of just getting the 3 or 4 I need
-  now.  Will make it easier to expand on later when the HTTP/1.0 spec
-  grows.
-* w3-vars.el: New variable w3-current-mime-headers, which is an assoc
-  list of MIME headers for each document.
-* w3-url.el: Changed w3-retrieve so that if a response it not an
-  HTTP/1.0 response, add its name to w3-bad-server-list if it is not
-  already a 'member'.
-* w3-mime.el: Added support for the new '204 NoResponse' HTTP/1.0
-  response.  No new document is displayed.
-
-Tue Dec  7 21:09:21 1993  William M. Perry  (address@hidden)
-* w3-forms.el: Some revisions to try and make the radio button
-  toggling faster.  Will now only change the radio button(s) that are
-  set to be off, and the one that is supposed to be on, on.
-* w3-lucid.el, w3-epoch.el, w3-era.el, w3-emacs19.el: Added function
-  w3-zone-eq
-* w3-era.el: Fixed typo in w3-zone-data that was causing forms to
-  screw up.
-* w3-forms.el, w3-newparse.el: Use 'intern' instead of read
-* w3-emacs19.el: Removed the local-map from the text properties.  Put
-  it in the distribution by mistake.
-* w3-emacs19.el: applied patch from <address@hidden> to fix
-  skipping 2 links when going backwards.
-* w3-html+.el: Fixed a missing ) or two
-* w3-cache.el: Initial revision
-* w3-vars.el: Added variables for document caching.
-* w3-html+.el: Trying to get tables working better
-
-Mon Dec  6 23:04:01 1993  William M. Perry  (address@hidden)
-* w3-era.el: Fixed dumb error where w3-follow-link would try to fetch
-  the text of the link, not the url of the link.
-* w3-emacs19.el: Fixed a few things with the new text properties
-  support.
-* w3-forms.el: Removed reference to free variable prompt in
-  w3-do-form-entry.  Cut & pasted a few too many lines.
-* w3-forms.el: Changed all the form handling routines that reformatted
-  the buffer to use w3-form-format-<input-tag-type> instead of reusing
-  the code.  Was causing some inconsistent redraws.  Thanks to Arup
-  Mukherjee <address@hidden> for noticing the problem.
-* w3-parse.el: Styles will now work again in epoch.  Needed to
-  re-apply a patch that got lost in a hard drive crash.  Thanks to Henry
-  A. Rowley <address@hidden> for the patch.
-* w3-emacs19.el: Fixed problem in the making of menus.  Had a (list
-  ...) that included the 'displayable' option in the menu vectors.
-  Thanks to Jorge Sousa Pinto <address@hidden> for noticing the
-  problem.
-* w3-emacs19.el: Fixed a cut&paste error - multiply defined functions
-  and a lot of typos in w3-complete-link
-* w3-misc.el: Added function w3-strip-leading-spaces
-* w3-era.el: Changed the w3-complete-link routine to strip spaces from
-  the front of links so that all of them will be visible.
-* w3-lucid.el, w3-epoch.el, w3-emacs19.el, w3-emacs.el: Changed the
-  w3-complete-link routine to strip spaces from the front of links so
-  that all of them will be visible.
-* w3-vars.el: A few revisions to the default settings of
-  w3-style-chars-assoc
-* w3-vars.el: Added the variables w3-style-chars-assoc and
-  w3-delimit-emphasis for doing text-based markup.
-* w3-parse.el: Added the ability to have characters that define the
-  start and end of a region of formatting (ie: * surrounds bold text, _
-  surrounds underlined text, etc).  Controlled by w3-style-chars-assoc
-  and w3-delimit-emphasis variables.  Thanks to Jared Rhine for
-  suggesting it.
-
-Sun Dec  5 21:38:23 1993  William M. Perry  (address@hidden)
-* w3-url.el: fixed typo in w3-open-local-internal.
-* w3-url.el: Disabled use of w3-be-asynchronous for now
-* w3-era.el: Enabling/disabling of Era menus now cleaner than in lucid
-* w3.el: Menus will now be created when running in Era
-* w3-vars.el: Added face-specific stuff for Era, and modified the
-  default value of w3-delimit-links to take the w3-running-era variable
-  into account.
-* w3-vars.el: Better checking of the various w3-running-* variables.
-  I long for the day when they will all merge. :)
-* w3-era.el: Added support for 'viewing' a form entry area with
-  w3-view-this-url Will message the name and type of the form entry
-  area, but returns nil if called with no-show 't'.
-* w3-era.el: More changes to be era-specific
-* w3-era.el: Basic switch to era-specific functions from the lucid
-  cust. file
-* w3-epoch.el: Added alias w3-delete-zone (to epoch::delete-zone)
-* w3-emacs19.el: Added function w3-delete-zone
-* w3-forms.el: Use function w3-delete-zone instead of a large (cond
-  (...)) for using delete-zone, etc.  Easier to add support for new
-  flavors of emacs.
-* w3-vars.el: Added the variable w3-running-era
-* w3.el: Added loading of specific routines for 'era' - the
-  epoch/lucid merge
-* w3-era.el: Initial revision
-* w3-emacs19.el: Fixed a problem in w3-only-links that would return
-  the wrong position if the link was only one character long.
-* w3-misc.el: Added the function w3-reload-all-files.  This will
-  remove all the 'features' 'provided by w3, and then do a (require 'w3)
-  so that the files will all be reloaded.
-* w3-mime.el: Changed the w3-is-mime-response function so that it will
-  remove the HTTP/1.0 request if it has been echoed to the screen,
-  either by telnet or by the tcp.el emulation package.  Thanks to
-  everyone who reported the bug.
-* w3-parse.el: Moved handling of telnet header lines into
-  w3-is-mime-response
-* w3-emacs19.el: Believe I have fixed the w3-complete-links to work
-  with the new use of text properties instead of overlays.  This should
-  fix the problem of the links menu not showing up in X also.  Thanks to
-  T V Raman <address@hidden> for noticing it was broken.
-* w3-mime.el: Framework for '204 No Response' put in
-* w3-auth.el: Removed function w3-encode-password, and put the code
-  into the actual w3-basic-auth, since future versions will probably use
-  different encodings for the username/password pair.
-
-Sat Dec  4 12:54:43 1993  William M. Perry  (address@hidden)
-* w3-forms.el (w3-handle-selections): Added <OPTION SELECTED> support.
-  Thanks to Darrell Kindred for telling me to do it.
-* w3-mime.el (w3-parse-mime-headers): Fixed a problem where redirection of
-  URLS would lose the content-type and other headers of the URL it was
-  redirected to.  Thanks to Jared Rhine for noticing the problem.
-* w3-forms.el (w3-do-form-entry): Fixed a problem where form submission
-  buffers would not stay on top of the buffer stack.  Moved the submit
-  code outside the save-excursion.  Thanks to Darrell Kindred for the
-  suggestion on how to fix it.
-* w3-lists.el (w3-fill-paragraphs-in-list): Dumb problem with too many
-  newlines in paragraphs within lists.  Thanks to Jared Rhine for noticing
-  the problem.
-* w3-parse.el (w3-fix-paragraphs): Fixed a problem where paragraphs before
-  the last <HR> in a buffer were not filled.  Thanks to Jared Rhine and
-  Darrell Kindred for fixes.
-* w3-typecheck.el (w3-read-correct-format): Added a default type checker
-  for unknown tag types.
-* w3-emacs19.el (w3-follow-link): This no longer signals an error if there
-  is no link under point.
-* w3-mime.el (w3-parse-mime-headers): Changed the regexp to extract the
-  Location header from an HTTP/1.0 response so that newlines are stripped
-  from it correctly.  Thanks to Darrell Kindred for sending me the patch.
-* w3-misc.el (w3-open-stream): Added a pause in when connections failed.
-  Thanks to Jost Krieger <address@hidden> for
-  suggesting it.
-* w3-emacs.el (w3-add-zone): Fixed a problem in normal emacs where
-  highlighted text <CODE>TEXT</CODE> would be interpreted as a link.
-  Thanks to T V Raman <address@hidden> for noticing the problem.
-* w3-vars.el (w3-mime-extensions): Changed the default MIME content type
-  to be text/html so that pages like http://cs.indiana.edu/ will be
-  formatted when they don't have a file extension.
-* w3-forms.el: Applied a path from Darrell Kindred that fixed some very
-  odd radio button behavior.
-* w3-forms.el: Believe I have fixed the problem in lucid emacs where
-  choosing a form entry box would eat the character immediately after the
-  input tag.
-* w3-forms.el: Fixed a regexp that would gobble newlines/paragraph breaks
-  after an input tag.  Thanks to Skip Montanaro
-  <address@hidden> for noticing the problem.
-* w3-lists.el: Dumb error in a regexp that would make all <DL> lists
-  disappear was fixed.
-* w3-lists.el: Added roman numeral handing to ordered lists.  Thanks to
-  Tom Loos (address@hidden) for explaining the algorithm and writing
-  some C code I could translate into lisp.
-
-Fri Dec  3 12:04:18 1993  William M. Perry  (address@hidden)
-* w3-lucid.el: Fixed stupid problem where going backwards by 1 link always
-  took you to the first link of a buffer.   Mispaced ) in
-  w3-previous-extent. 
-* w3-emacs19.el: Changed everything to use text-properties instead of
-  overlays.
-* w3-emacs19.el (w3-add-zone): Added preliminary support for just typing
-  into the emacs19 forms.  Will talk to jwz about adding this
-  functionality to lucid emacs.
-
-Wed Dec  1 08:05:02 1993  William M. Perry  (address@hidden)
-* w3-newparse.el: Created this file - has new parsing routines.  Very
-  experimental.  Don't use unless you want it to choke, and then figure
-  out why it choked. :)
-
-Fri Nov 26 03:52:19 1993  William M. Perry  (address@hidden)
-* w3-forms.el: Changed the forms handling routines so that it handles
-  METHOD, ACTION, and ENCTYPE attributes of the <FORM> tag.  METHOD and
-  ENCTYPE aren't used yet.  Thanks to Darrell Kindred for noticing the
-  problem.
-* w3-parse.el: Fixed a formatting problem with the ISINDEX forms
-  replacements.  Was doing a fixed-case replace.  Thanks to Jared Rhine
-  <address@hidden> for noticing the problem.
-* w3-parse.el: Fixed a formatting error with <BR> tags - sometimes spaces
-  were left at the beginning of the continued line.  Thanks to Erich
-  Schneider  <address@hidden> for noticing the problem.
-* w3-misc.el (w3-lookup-style): Fixed dumb bug where I was not
-  de-referencing the variables to the actual #<style> value in epoch.
-  Thanks to Paul Furnanz <address@hidden> for the initial fix.
-  I generalized it a little.
-* w3-parse.el: Added a check to make sure that long URLs don't show up as
-  extremely long buffer names.  Thanks to Heiko Muenkel
-  <address@hidden> for noticing the problem.
-* w3-lucid.el: Added a patch from Sjoerd Mullender
-  <address@hidden> to add a menu bar to lucid emacs if there
-  wasn't one by default.
-* w3-emacs19.el: Added a few patches from Jin S Choi (address@hidden).
-  Mostly fixed the hotlist menu updating code, as well as a few cosmetic
-  changes to the FSF19 menus.
-* w3-epoch.el: Added a few patches from Henry Rowley <address@hidden> to
-  fix a few functions that assumed epoch was compiled with
-  add-graphic-zone.
-* w3-lists.el (w3-fill-paragraphs-in-list): Fixed a stupid bug where the
-  first letter of every paragraph would be removed when filling.  Thanks
-  to Arup Mukherjee <address@hidden> for noticing the problem, and Darrell
-  Kindred for the fix.
-
-Tue Nov 16 10:55:56 1993  William M. Perry  (address@hidden)
-* Makefile (install): Fixed problem where I was only copying W3FILES to
-  the install directory, and should have used W3FILES and W3BINS.
-* w3-forms.el: Stupid problem where I was always trying to call
-  w3-form-format-unknown.  Simple 'not' around a statement to fix.
-* w3-forms.el: Yet another stupid typo - w3-format-unkown instead of
-  w3-format-unknown.  Thanks to Dan Sullivan
-  <address@hidden> for the fix.
-
-Mon Nov 15 21:02:50 1993  William M. Perry  (address@hidden)
-* Various small changes (wrote over the new ChangeLog when doing a restore
-  of some files).
-* w3-vars.el: Changed the order of w3-html-entities so that &amp; is at
-  the end.  This was causing the entities later in the list to be messed
-  up if they occurred in the same document.
-* w3-lucid.el: Changed the w3-extent-at, w3-find-specific-link, and
-  w3-next-extent to not use a free variable.  Thanks to Jamie Zawinksi
-  <address@hidden> for the patch.  Dumb oversite on my part.
-* w3-forms.el: Made the forms formatting very extensible.  The formatting
-  function is determined by reading in lisp expression from a formatted
-  string.  w3-form-format-<type> will now be called and expected to return
-  a string to use as the prompt.
-* w3-emacs19.el: Fixed dumb problem where emacs19 on a tty would not be
-  able to find a list of links in the current document for
-  w3-complete-link.
-* w3-lists.el: Fixed the filling of paragraphs within lists.  No longer
-  inserts too many newlines.
-* Fixed a few problems where w3-do-setup was not being called correctly at
-  startup.  This would result in an error about w3-style-regexp being nil.
-* w3-mosaic.el: Fixed a problem with the hotlist handling code.  Mistake
-  in a regular expression.  Thanks to Jin S Choi (address@hidden) for
-  reporting the problem and sending a fix.
-
-Fri Nov 12 07:31:36 1993  William M. Perry  (address@hidden)
-* w3.el: The mailcap entries are now parsed at startup.
-* Made changes to several files so that the new NeXTstep port of emacs 19
-  will use faces, and not think its on a dumb terminal.  Mostly involved
-  changing a bunch of (eq window-system 'x) to an or (eq window-system
-  'dps).  While I was at it I also changed the statements so that the
-  Presentation Manager port of emacs 19 under OS/2 will use faces, etc.
-
-Thu Nov 11 07:20:13 1993  William M. Perry  (address@hidden)
-* Realized I should get sick more often - I seem to get more done. :)
-* w3-vars.el: Added the ABSTRACT, QUOTE, and BYLINE tags to the list of
-  emphasis tags.
-* w3-parse.el (w3-handle-notes): Added support for the HTML+ NOTE tags.
-  Handles any role, and also honors the SRC= for the warning image.
-* w3-parse.el (w3-handle-footnotes): Added support for the HTML+ footnote
-  and margin-note tags.  Handles as links to footnotes at the end of the
-  document. 
-* w3-parse.el (w3-fix-render-hints): Added support for the HTML+ RENDER
-  tag to extend the set of logical emphasis roles on a per-document basis.
-* w3-parse.el: Changed the emphasis handling to be more extensible.  New
-  variables w3-style-assoc and w3-style-regexp.  w3-style-assoc maps tags
-  onto style names.
-* w3-parse.el: Added ability to have IDS within headers.   This is in
-  conformance with the HTML+ specification.
-* w3-lists.el: Added ability to have IDs within <P> tags.  This is in
-  conformance with the HTML+ specification.
-* w3-lists.el: Added function w3-fill-paragraphs-in-list.  This will fill
-  all paragraphs within any type of list.  This allows for <P> elements
-  within lists without odd looking results.
-* w3-forms.el (w3-split): Changed this so that it no longer puts strings
-  with only spaces and tabs in the assoc list that is returned.  This
-  error caused every popup FORM item to have a blank line at the end.
-* Added new variable w3-default-action.  This specifies the lisp function
-  to run instead of w3-prepare-buffer when W3 can't figure out the MIME
-  type by looking at the file extension.  (Things like .README or .patch
-  would be parsed as HTML - not good).  Thanks to Alastair Burt
-  <address@hidden> for noticing the problem.
-
-Wed Nov 10 08:02:31 1993  William M. Perry  (address@hidden)
-* General cleanup, better documentation in all files.  Trying to merge
-  files so that there are fewer dependencies between files.  Thank
-  goodness for the optimizing byte compiler and call-trees. :)
-* w3-parse.el: Removed the handling of <EM> tags.  No longer part of the
-  HTML+ specification.
-* w3-vars.el: Excercise in anal-retentiveness. :)  Organized and
-  alphabetized all the variables and added to quite a few documentation
-  strings.  Yeah yeah yeah, but it needed it! :)
-* w3-vars.el: Added a few more new keybindings from Tom Tromey
-  <address@hidden>.
-* w3-misc.el (w3-maybe-eval): Added new MIME type application/emacs-lisp
-  along with a viewer that asks whether to evaluate it after viewing it.
-* w3-url.el (w3-open-local): Made this a stub to call w3-fetch with file:
-  prepended to the filename you type in.  w3-open-local-internal now does
-  all the work.  Thanks to Bill Benedetto <address@hidden> for
-  noticing it was bombing out when called non-interactively.
-* w3-url.el (w3-news): Added the ability to specify a news server in the
-  news url in the proposed news://server:port/article|newsgroup method.
-* w3-typecheck.el (w3-optionp): Changed this to correctly handle when you
-  don't select anything from the menu.  Would mess up the page and remove
-  the link before dying on an error.  Thanks to Jin S. Choi <address@hidden>
-  for noticing the problem.
-
-Tue Nov  9 14:59:59 1993  William M. Perry  (address@hidden)
-* w3-url.el (w3-file): Added proper handling of ftp://address@hidden commands.
-* w3-forms.el (w3-revert-form): Fixed this function so it will work if
-  there are pull-down lists in the form.  Also changed the forms parsing
-  code to use the first item in a list as the default.
-* w3-forms.el (w3-submit-form): TEXTAREA's will now be submitted
-  correctly.  The buffer containing the information you typed in must not
-  be killed though.  I need to find a better way to store it.  Maybe a new
-  major mode?  But then how to relay the info back to the w3-typecheck
-  function as the value?
-
-Mon Nov  8 13:05:29 1993  William M. Perry  (address@hidden)
-* Added function w3-complete-link to do a completing-read on all the links
-  in a buffer.  Should work in all emacsen.
-* Changed printing, saving, and mailing of documents so that you can
-  print/mail/save LaTeX, formatted text, or HTML source.
-* w3-url.el, w3-gopher.el: Changed the reading.... messages to display the
-  actual number of bytes retrieved.
-
-Sun Nov  7 11:37:53 1993  William M. Perry  (address@hidden)
-* w3-url.el (w3-http): Fixed a problem where fetching something that had a
-  viewer associated with it when the connection was down or the file was
-  not found would still drop you into the viewer... often with odd
-  results.
-* w3-lucid.el: Fixed a few bugs in the new lucid menus - was adding a nil
-  menu item (buffers with no links, no hotlist in memory, etc).  Caused
-  system crashes on linux, headaches on other operating systems.  Thanks
-  to Alastair Burt <address@hidden> and Arup Mukherjee
-  <address@hidden> for noticing the problem and for the initial
-  patches.
-* w3-mosaic.el: Think I fixed a problem with the hotlist parsing code.
-  Thanks to Jin S. Choi <address@hidden> for noticing the problem.
-
-Wed Nov  3 21:35:44 1993  William M. Perry  (address@hidden)
-* w3-lucid.el: Completely reworked the menu setup.  Several different
-  menus, mirroring the setup of Xmosaic.
-* w3-vars.el: Assigned a few new keybindings to make w3 a little closer to
-  info mode.  Also redefined the M-C-v and M-b keys to use the C-c prefix
-  as they should.
-
-Mon Nov  1 09:42:18 1993  William M. Perry  (address@hidden)
-* w3-parse.el (w3-build-links-list): Changed this so that it no longer
-  puts the delimiters around links with no HREFs. Thanks to Ivan Herman
-  <address@hidden> for noticing that it was still broken.
-* w3-epoch.el (w3-insert-graphic): Changed this function to redirect
-  the output into the file instead of outputting it to STDOUT and then
-  saving it in a buffer and then writing the buffer.  Faster,
-  especially for large files, and don't have to worry about how many
-  lines to delete at the top of the buffer.
-
-Sun Oct 31 10:31:04 1993  William M. Perry  (address@hidden)
-* w3-parse.el (w3-build-links-list): Think I've fixed the problem of
-  links in headers being formatted with newlines.
-* w3.el (w3-parse-relative-link): Fixed a problem where links of the
-  type "#something" would retrieve the current directory.  Stupid
-  mistake.  Thanks to address@hidden for noticing it.
-* w3-forms.el: Fixed quite a few problems with the Emacs 18 support.
-  Problem was with using markers as start and end positions to
-  creating new zones - they got set to nil when the whole region was
-  deleted, so subsequent delete-regions failed.  This also caused a
-  problem when trying to use the submit or reset buttons.
-* w3-typecheck.el (w3-read-correct-format): Fixed a problem with the
-  pulldown menu support in emacs 18.  The last-input-event variable
-  doesn't exist, so wrapped its use in an if boundp ..., etc.
-* w3-gopher.el (w3-do-gopher): Fixed problem where links like
-  gopher://somesite/11/etc/etc/ would not get parsed - was seeing 11
-  and thinking it wasn't a directory.
-* w3-url.el (w3-gopher): Fixed a problem where a match-beginning got
-  lost because of a misplaced w3-unhex-string.  Thanks to   Arup
-  Mukherjee <address@hidden> for noticing the problem.
-* w3-emacs.el: Changed the forward and backward link handling code so
-  that it will skip white space at the beginning of a link.  Thanks to
-  Arup Mukherjee <address@hidden> for noticing the problem.
-* w3-parse.el (w3-handle-comments): Fixed this function to handle either
-  comments written according to the HTML spec (with a trailing -->) or the
-  Xmosaic-handled way (with no --).  Thanks to Darrell Kindred
-  <address@hidden> for noticing the problem.
-* w3-mosaic.el (w3-parse-hotlist): Applied a patch by Arup Mukherjee
-  <address@hidden> and Darrell Kindred <address@hidden> to fix
-  an annoying problem where the first page you retrieved in a w3 session
-  would not be shown, and the buffer you started out in would be put into
-  w3-mode.
-
-Sat Oct 30 13:38:43 1993  William M. Perry  (address@hidden)
-* w3-misc.el (w3-preview-this-buffer): Fixed this so that it does a
-  buffer-file-name instead of just buffer-name so that it will be able
-  to reload documents correctly.
-* w3-epoch.el: Fixed stupid problem in w3-follow-link where it called
-  w3-do-form-entry with the arguments in the wrong order.
-* w3-emacs19.el: Removed requirement of cl.  Took up lots of space - was
-  old anyway.  'last' is no longer needed.
-* Applied patches to Makefile from Jamie Zawinskie <address@hidden> so it
-  will compile in a better way.
-* Added full GNU copyleft notice to all the source files so that it can be
-  distributed with Lucid Emacs.  Also changed lots of functions to make the
-  files compile with fewer warnings about unbound variables.
-
-Wed Oct 27 07:10:56 1993  William M. Perry  (address@hidden)
-* w3-forms.el (w3-handle-selections): Added this function to handle the
-  new <SELECT> tag in HTML+.  Supercedes the TYPE="OPTION" tag.  This also
-  handles the scrolling list boxes and multiple pick lists.  Multiple pick
-  lists don't work correctly yet though.
-* w3-mime.el (w3-parse-mailcap): New function to parse the .mailcap file
-  used by Mosaic/metamail/etc.  Appends it to the w3-mime-viewers assoct
-  list - format is preserved correctly.  If the MIME type is already in
-  the assoc list, then it is skipped.
-
-Tue Oct 26 08:39:23 1993  William M. Perry  (address@hidden)
-* w3-epoch.el (w3-follow-link): Fixed a problem where w3-follow-link
-  would not work correctly - needed to wrap the 't' start of an if
-  statement with a progn.
-* w3-epoch.el (w3-create-hrule): Created this function to generate a
-  pixmap the size of the current window width to use for horizontal
-  rules.  Also changed the parser to use add-graphic-zone if it is in
-  epoch and it finds an <HR>, otherwise it will use the dashes.
-
-Mon Oct 25 17:15:05 1993  William M. Perry  (address@hidden)
-* w3-vars.el (w3-mime-extensions): Added _LOTS_ more MIME types +
-  descriptions of _ALL_ of them.
-* w3-lucid.el (w3-mouse-handler): Changed this to use the new function
-  w3-link-info.  Is a little easier to use.
-* w3-misc.el (w3-link-info): New function to give an intelligent guess of
-  what the link is pointing to.  ie: 'A hypertext file on the local file
-  system' or 'A newsgroup (comp.infosystems.www) from NNTP server
-  usenet.ucs.indiana.edu'
-* w3-url.el (w3-open-local): Fixed a problem where opening a local file as
-  ~/..../fname.html would cause an error if you had a relative reference
-  past the ~/ point.  Thanks to Benjamin Pierce <address@hidden> for
-  noticing the problem.
-* w3.el (w3-search): Changed this function to make sure that only 1 '?' is
-  appeneded to the url when searching.  Thanks to Arup Mukherjee
-  <address@hidden> for noticing the problem.
-
-Sat Oct 23 10:25:32 1993  William M. Perry  (address@hidden)
-* w3-epoch.el: Fixed w3-follow-link so it will work again - was
-  messing up once in a while because of the new code to let images be
-  used as links.
-* w3-epoch.el: Using images as links should work now.  Need to have it
-  check for failure of reading the XPM and use the ALT attribute if it
-  does.
-* w3-url.el (w3-format-news): Fixed this function so that it will no
-  longer call w3-sentinel on its own.  Also changed it so that the <TITLE>
-  is set to the subject, not the newsgroup name.
-* w3-epoch.el: redid the image code to limit the images to 40 colors.
-  This allows more images to be read in before the conversions start
-  failing.  Can change this arbitrary limit by changing the argument
-  to ppmquant in w3-graphic-converter-alist.
-* w3-misc.el (w3-hexify-string): Fixed this function - it would mess
-  up when sending hex codes < F.  (ie: %F instead of %0F).
-
-Fri Oct 22 12:37:26 1993  William M. Perry  (address@hidden)
-* w3-url.el: Removed all the references to &optional source in all the
-  different retrieval areas (w3-http, w3-file, w3-gopher, etc).  This will
-  all be handled in w3-build-continuation from now on.  Also changed it so
-  that printing/sourcing a document doesn't explicitly set the w3-source
-  variable or w3-print-next, it just wraps the calls to w3-sentinel in a
-  let statement.
-* w3-url.el (w3-http): Changed w3-http to insert an error message into
-  w3-working-buffer if it couldn't connect to the server.  Thanks to 
-  Bengt Andersson <address@hidden> for noticing the problem.
-
-Thu Oct 21 06:31:09 1993  William M. Perry  (address@hidden)
-* w3-mime.el (w3-parse-mime-headers): Changed the detection of circular
-  redirection to insert a warning at the end of whatever it did retrieve
-  instead of signalling an error.  This way people will know who to
-  contact for the problem.
-* w3-epoch.el (w3-insert-graphic): Added support for ALIGN attribute
-  of the IMG tag.
-* w3-parse.el (w3-fix-paragraphs-in-region): Fixed stupid problem where
-  ordered lists would not be filled correctly if unordered lists were
-  positioned before them in the buffer.  Thanks to Bengt Andersson
-  <address@hidden> for noticing the problem.
-
-Wed Oct 20 11:35:40 1993  William M. Perry  (address@hidden)
-* w3-auth.el (w3-basic-auth): Fixed a stupid problem in a regular
-  expression that caused it to only do access-authorization lookups on the
-  first part of the path.  Now passes all cern tests successfully.  On to
-  pubkey!
-* w3-mime.el (w3-create-mime-request): Took out all the \r's.  Was
-  screwing up Cern's experimental authorization server.
-* w3-forms.el: Fixed problem in the handling of TEXT input tags when the
-  initial value was longer than the visible size. Also fixed problem where
-  typing in a password longer than the visible size caused an error.
-* w3-url.el (w3-open-local): Changed this function to call w3-sentinel
-  if it was called interactively.  This way 'o' in a w3 buffer still
-  works.
-* w3-epoch.el (w3-insert-graphic): Completely rewrote this function.
-  It should be able to get graphics over any type of protocol (it
-  goes thru w3-retrieve).  w3-graphic-converter-alist also now goes by
-  MIME types.
-
-Tue Oct 19 10:12:49 1993  William M. Perry  (address@hidden)
-* w3-misc.el (w3-use-links): New function to do a completing read on the
-  <LINK> tags in the current document.  No keybinding yet.
-* w3-misc.el (w3-mail-to-author): New function to send mail to the author
-  of a document.  Uses the <LINK> tag with REV=made if any is found.
-* w3-parse.el: Added storage of the <LINK> attributes.  w3-mail-to-author
-  will send mail to the author if the 'made' LINK is found.
-* w3-url.el (w3-fetch): Added in check to see if w3-working-buffer exists
-  before calling w3-sentinel.  Would give error "No such buffer  *W3*" if
-  you followed a telnet/tn3270/rlogin link.
-* w3-gopher.el: Changed the hypertext gopher support to just return raw
-  HTML like all the other functions now.
-* w3.el (w3-parse-relative-link): Changed w3-relative-link to just call
-  w3-fetch on the results of this function so I could use it in
-  w3-parse-mime-headers for redirection.
-* w3-url.el (w3-retrieve): Moved everything from w3-fetch into this
-  function.  It just returns the name of the buffer the raw HTML is put
-  into - no processing is done.  w3-fetch is now just a call to this
-  function and then w3-sentinel.  HTTP/1.0 redirection and authorization
-  are handled before exiting.
-* w3-auth.el: Added an optional argument to the w3-XXX-auth functions.  If
-  third argument OVERWRITE is non-nil, and a password is found, it is
-  ignored and a new user/pass combination are prompted for.
-
-Mon Oct 18 08:38:00 1993  William M. Perry  (address@hidden)
-* w3-parse.el (w3-prepare-buffer): Moved the call to w3-handle-forms to be
-  after w3-restore-pre so that forms inside <PRE> segments would turn out
-  right.  Not part of the spec, but useful.  Thanks to Rob Tillotson
-  <address@hidden> for noticing the problem and suggesting the
-  fix.
-* w3-auth.el (w3-b64-encoding): Actually wrote the base 64 encoding
-  function in lisp.  Much faster than using the subprocess.
-* w3-lucid.el (x-popup-menu): Added this function to do a blocking popup
-  menu.  Thanks to Jamie Zawinski (address@hidden) for telling me where to
-  look - its a hacked up version of yes-or-no-p-dialog-box from
-  prim/menubar.el.
-* w3-mime.el (w3-create-mime-request): Added in checking for authorization
-  into the MIME request.  If a match is found using w3-basic-auth, then a
-  new line is added with the encoded password.
-* w3-auth.el (w3-basic-auth): This now takes an optional parameter PROMPT,
-  that if non-nil and a server and/or directory is not found in the list,
-  then the user is prompted for a username/password.  If nil, it just
-  returns nil if not user/pass found.
-* w3-auth.el (w3-encode-password): Due to some problems with numbers
-  getting too large when doing base64 encoding, have reworked this
-  function to call a program in a subprocess.  Program is specified by the
-  variable w3-b64-encoder, and defaults to b64encode, from
-  ftp://cs.utk.edu/pub/MIME/b64encode.c.
-
-Sun Oct 17 10:21:06 1993  William M. Perry  (address@hidden)
-* w3-auth.el (w3-encode-password): I think this does base64 encoding
-  correctly now.  Have to test it more though.
-* w3-auth.el: Started work on 'Basic' authentication.  Not working yet,
-  but storage of servers/usernames/passwords/paths works.  Subdirectories
-  of 'protected' directories will find the username/password for the
-  parent directory, as per the specification (/foo/bar/baz.html will
-  locate the password entered before for /foo/test.html or / if any were
-  entered).
-* w3-mime.el (w3-parse-mime-headers): Added error checking into the server
-  redirection to see if something points to itself.
-* w3-typecheck.el (w3-floatp): Fixed regular expression problem where
-  floating point numbers would not be parsed correctly.
-* w3-typecheck.el (w3-urlp): Wrote this function to do basic typechecking
-  of URLS that are input into a <FORM>.
-* w3-mime.el (w3-parse-mime-headers): Added support for server-side
-  redirection (301, 302) and the Method: header also (303).
-* w3-forms.el (w3-set-radio-button): First pass at doing Radio buttons the
-  correct way.  Works (to a point) - it doesn't delete one of the zones
-  after changing their values though.  Not sure why.
-
-Sat Oct 16 14:55:39 1993  William M. Perry  (address@hidden)
-* w3-forms.el: Added support for PASSWORD input tag.  Will use
-  ange-ftp-read-passwd and display '*****' as the value.
-* w3-forms.el: Added support for OPTIONS INPUT tag.  If in Xwindows and
-  able to use x-popup-menu it will pop up a menu.  If not in Xwindows,
-  will use a completing read of the possible options.
-
-Fri Oct 15 16:15:59 1993  William M. Perry  (address@hidden)
-* w3-parse.el (w3-nuke-unsupported): Changed this so that it will support
-  the ALT tag in IMG statements.
-* w3-gopher.el: Changed the gopher handling so that it will pass
-  everything but directories off to the main viewer-handling procedures.
-
-Thu Oct 14 18:26:55 1993  William M. Perry  (address@hidden)
-* w3.el (w3-save-url): Fixed problem in w3-save-url where the text was
-  saved in the kill-ring, but the kill-ring-yank-pointer was not updated.
-  Thanks to Bengt Andersson <address@hidden> for noticing
-  it.
-* w3.el (w3-quit): Fixed a problem where quitting from links would take
-  you back one level of buffers too far.  Thanks to Bill Benedetto
-  <address@hidden> for noticing it.
-
-Wed Oct 13 07:10:04 1993  William M. Perry  (address@hidden)
-* w3.el (w3-quit): Added the variable w3-keep-old-buffers.  If t, old w3
-  buffers are kept.  If nil, w3 buffers are deleted after you follow a
-  link from them.  Need to work on getting the parent of a w3 buffer now
-  though.
-* w3-lucid.el (w3-extent-at): Fixed problem where Lucid would not realize
-  that you were on a link if it was at the first character.
-* w3-url.el (w3-build-continuation): Fixed problem where a file with no
-  MIME viewer would die - just a misplaced set of parentheses.
-* w3-parse.el (w3-check-index): Changed this function so it only inserts
-  the <FORM> tags if protocol is HTTP.
-
-Mon Oct 11 07:19:59 1993  William M. Perry  (address@hidden)
-* w3-parse.el (w3-prepare-buffer): Ordered lists will now have their
-  numbers aligned correctly.
-* w3-misc.el (w3-fix-fake-urls): This function will turn 'fake' urls like
-  ftp://somesite/some/file/ into real links like <A
-  HREF="ftp://somesite/some/file/";> - the text of the link is the text it
-  replaces.  Will be useful for mail/news reading hooks.
-
-Sat Oct  9 08:14:45 1993  William M. Perry  (address@hidden)
-* w3.el (w3-quit): fixed a problem where quitting from a 'previewed'
-  buffer would signal an error.
-* w3-parse.el (w3-prepare-buffer): Fixed this so that <PLAINTEXT> can
-  appear anywhere in a buffer, and will be treated appropriately.  Thanks
-  to Darrell Kindred (address@hidden) for noticing the problem.
-
-Fri Oct  8 08:51:37 1993  William M. Perry  (address@hidden)
-* Changed all the (set buffer " *W3*") to now use the variable
-  w3-work-buffer instead - this will allow me to have multiple receives
-  going at the same time.  Also allow me to parse out different buffers
-  for urls and not have to copy back and forth to " *W3*". Not fully
-  implemented yet.
-
-Tue Oct  5 11:56:30 1993  William M. Perry  (address@hidden)
-* w3-misc.el (w3-in-assoc): Changed this funcion so that it returns the
-  first match.  Was messing up on some of the wildcards in the default
-  MIME viewers.
-* w3-viewers.el: Several bugfixese/enhancements to the MIME viewer
-  handling.  Everything (including printing, sourcing, and presentation of
-  hypertext) is now handled by the MIME viewers.
-* w3.el: Will now load the file "~/.w3" if it exists.  Will let you store
-  all your w3 variables in the same place.  Only loaded after all the
-  different modules.
-* w3-viewers.el, w3-url.el: Changed the viewer handling to be by MIME
-  content-types all the time.  A new variable, w3-mime-extensions,
-  controls how file extensions are mapped onto MIME content-types.
-  Inspired by the way MacMosaic handles its viewers.  Should be easier to
-  maintain just one viewer list.
-
-Mon Oct  4 06:19:10 1993  William M. Perry  (address@hidden)
-* w3-viewers.el: Changed the viewing to ask if you wish to view the output
-  of the process.  Generates unique buffer names, etc.  Thanks to T.V.
-  Raman <address@hidden> for suggesting it.
-* w3-viewers.el: Moved all the external/internal viewer handling into this
-  file.
-* w3.el (w3-quit): Fixed problem where w3 would signal an error when you
-  quit and the buffer that preceded it has been killed.  Just goes to the
-  next buffer now.  Thanks to Bengt Andersson
-  <address@hidden> for noticing it.
-* w3-lucid.el: Applied patch from Darrell Kindred
-  <address@hidden> which fixed a problem with finding tags of
-  hyperlinks when it had other attributes (<ADDRESS>,<B>, etc) as well.
-
-Fri Oct  1 06:29:37 1993  William M. Perry  (address@hidden)
-* w3-parse.el (w3-fix-paragraphs-in-region):  Added support for the <HR>
-  tag (horizontal rule).
-* w3-mime.el (w3-mime-viewer): Fixed a problem where this returned a cons
-  where it should have returned a string.  Thanks to Bengt Andersson
-  <address@hidden> for noticing it (yet again).
-
-* w3-gopher.el: Fixed a few problems with searching
-* w3-url.el: removed newlines from regexps - were messing up <PRE>
-  segments.
-* w3-url.el: changed mailto to include the url that it was sent from.
-
-Mon Sep 27 13:57:34 1993  William M. Perry  (address@hidden)
-* w3-typecheck.el (w3-intp): Changed the function to check whether an
-  integer was valid.  Would mess up in emacs19, where 12.5 is a good
-  parameter to string-to-int.
-
-Sat Sep 25 06:48:55 1993  William M. Perry  (address@hidden)
-* w3-typecheck.el: Added this file to control typechecking of forms entry
-  fields.  Checks dates, ints, floats, urls, and text.
-* w3-forms.el (w3-do-form-entry): changed so that it will use the new
-  typechecking functions.
-
-Fri Sep 24 14:01:54 1993  William M. Perry  (address@hidden)
-* w3-lucid.el: completely rewrote the forward and backward link movement.
-  Works a lot better now.
-
-Thu Sep 23 11:36:35 1993  William M. Perry  (address@hidden)
-* w3-parse.el (w3-prepare-buffer): fixed <TITLE> handling so it takes out
-  leading and trailing spaces/tabs.  Could make it difficult to find a
-  buffer when the name began with a space.
-* w3-parse.el (w3-build-links-list): Fixed problem where link names would
-  be too long (would include part of the HREF) when the HREF was not
-  quoted.  Thanks to Dong-Ping Deng (address@hidden) for noticing
-  it.
-
-Wed Sep 22 10:49:37 1993  William M. Perry  (address@hidden)
-* w3-misc.el (w3-maybe-relative): Fixed stupid bug where I didn't add the
-  new tn3270 link type to a few regular expressions.
-
-Tue Sep 21 10:51:09 1993  William M. Perry  (address@hidden)
-* w3-url.el: Added support for tn3270://... links.  Thanks to T V Raman
-  <address@hidden> for noticing its lack.
-* w3-parse.el (w3-check-index): Added variable w3-use-forms-index.  If
-  non-nil, will replace <ISINDEX> tags with a very short <FORM> for
-  searching.  Default is t, like Xmosaic.
-* w3-vars.el: Added more styles for the <EM> tag.
-
-Mon Sep 20 07:02:28 1993  William M. Perry  (address@hidden)
-* w3-emacs19.el (w3-find-specific-link): Emacs19 can now find #identifier
-  marks in documents.
-* w3-gopher.el (w3-gopher-retrieve): Fixed a problem with gopher sending
-  more than one character 'description' to the server.  Would result in
-  'Can't open 1/whatever' in some cases.
-* w3-misc.el (w3-show-hotlist): Added this function to show the hotlist in
-  a hypertext form.  Thanks to Stephen Simpson (address@hidden) for
-  suggesting it.
-* w3-forms.el: Added in support for emacs 18
-* w3-emacs.el: Added in support for deleting an arbitrary zone.  This
-  was needed to make forms support work correctly.
-* w3-vars.el (w3-be-asynchronous): added this variable to control whether
-  documents would be retrieved in a non-blocking way over HTTP.
-
-Sun Sep 19 14:15:39 1993  William M. Perry  (address@hidden)
-* w3-parse.el (w3-handle-em-tags): Fixed problem where emacs18 would
-  die on handling any <EM> tag.  Thanks to address@hidden
-  (Michael Richardson) for pointing it out.
-* w3-mime.el (w3-mime-viewer): Fixed problem with the viewer finder - was
-  trying to do a car of a string Keith Waclena
-  <address@hidden> for sending me the fix.
-
-Fri Sep 17 09:23:08 1993  William M. Perry  (address@hidden)
-* w3-mosaic.el: fixed problem where deleting or adding hotlist entries
-  would not update the menubar.  Thanks to address@hidden for noticing the
-  problem.
-
-Mon Sep 13 06:40:35 1993  William M. Perry  (address@hidden)
-* Added the <REMOVED> and <ADDED> tags (both as containers and roles of
-  the <EM> tag.
-* w3-parse.el: took out the conversion of IMG tags to hyperlinks - was
-  messing up when links were nested - need to work on it.
-* w3-lists.el (w3-build-table): tables should now handle <DD> with no
-  matching <DT> a little better.  Don't know why people bother writing
-  HTML this bad, but oh well.
-* w3-mime.el (w3-parse-mime-headers): Had a problem parsing out the mime
-  headers if there wasn't a crlf at each endline, which broke parsing
-  NCSA's new 1.0 server.  Fixed now.
-
-Fri Sep 10 05:52:06 1993  William M. Perry  (address@hidden)
-* w3-emacs19.el: took out blank definition of w3-submit-form that
-  would screw up submitting forms.  (Emacs19.el got loaded after
-  w3-forms.el so would have a blank definition)
-
-Thu Sep  9 07:57:58 1993  William M. Perry  (address@hidden)
-* w3-parse.el: Added support for <SP> (nonbreaking spaces), and <BR>
-  (force line breaks), and <EM> tags - the EM tags don't allow multiple
-  tags right now (ala <EM B I> </EM>, but nesting of <EM> tags works.)
-
-Wed Sep  8 11:58:21 1993  William M. Perry  (address@hidden)
-* w3-url.el (w3-build-continuation): the fetching of grouop annotations
-  has been removed, as the experiment at NCSA has ended.
-* w3-forms.el (w3-revert-form): finished this function - now works
-  correctly. 
-* Added code to all emacs-specific files to call w3-do-form-entry if
-  w3-follow-link is called on a zone that is tagged with 'w3form.
-* I have serious doubts whether the form support will work in emacs18 - I
-  need to write a delete-zone function for it, but that might be a bear.
-  Will toy with it later.
-
-Tue Sep  7 07:13:36 1993  William M. Perry  (address@hidden)
-* w3-forms.el: added a (delete-overlay zone) if running FSF19 so that not
-  all edits are sent when you submit a form.
-* w3-forms.el: now, if a checkbox's VALUE/DEFAULT field is empty, it is
-  sent as name=PRIMED, ala xmosaic.
-* w3-forms.el: fixed bug where the maxlength would be set to 20 instead of
-  unlimited if it was not specified.  (Actually, its set to 10,000 but I
-  think that should be enough for a while. :)
-
-Mon Sep  6 08:59:43 1993  William M. Perry  (address@hidden)
-* w3-forms.el: Eureka!  They actually work now.  Successfully submits to
-  the NCSA server/demo pages.  Still a little kludgey, but cleaning it up
-  should be too difficult.
-* w3-forms.el: forms now keyed by number so it will be easier to submit
-  them back to the server.  Also changed the submit and reset buttons to
-  take their button labels from the VALUE tag as xmosaic does.
-
-Sun Sep  5 09:17:42 1993  William M. Perry  (address@hidden)
-* w3-forms.el: more work on forms support - can now click on check boxes
-  and enter text in the entry areas.
-* w3-forms.el: added support for the parsing of forms
-
-Sat Sep  4 11:06:12 1993  William M. Perry  (address@hidden)
-* w3-mime.el: Fixed a problem where mime viewers would not work correctly
-  - tried to do a car() on a string.
-* w3-mosaic.el (w3-add-document-to-hotlist): fixed a bug in the creation
-  of gopher hotlist entries.  Thanks to Erik Ostrom
-  (address@hidden) for noticing and patching it.
-* w3-gopher.el: more work on trying to get searching to work - almost
-  there. 
-
-Wed Sep  1 09:17:00 1993  William M. Perry  (address@hidden)
-* w3-gopher.el: Did quite a bit of work on the gopher support.  Lots of
-  ideas, some code from the original gopher.el, but this keeps it in
-  hypertext - can print, get the document source, add to hotlist, etc.
-  Searching still does not work.
-
-Tue Aug 31 10:03:04 1993  William M. Perry  (address@hidden)
-* w3-misc.el: Changed the viewer handling so that it creates unique
-  filenames - if you viewed several things at once, it would write over
-  the old file, and kill the old viewers.  Also fixed problem where it
-  wouldn't delete the w3-tmp file when it was done viewing.
-
-Mon Aug 30 10:19:07 1993  William M. Perry  (address@hidden)
-* w3-url.el (w3-gopher): added variable w3-use-hypertext-gopher.  If 't'
-  use the gopher interface I just wrote, or use Scott Snyder's gopher
-  mode.  (The gopher mode is a slightly more complete, but mine preserves
-  the hypertext feel)
-* w3-gopher.el: added this file - rolled my own gopher interface this
-  afternoon.  Needs more work, but seems functional.
-* w3-misc.el: changed the viewer handling so that it handles the viewers
-  asynchronously again.
-
-Fri Aug 27 07:06:39 1993  William M. Perry  (address@hidden)
-* w3-parse.el (w3-handle-address): address handling handles newlines
-  before and after ADDRESS tags better - so multiple ADDRESS tags
-  following each other don't have more than one newline, etc.
-
-Thu Aug 26 14:49:28 1993  William M. Perry  (address@hidden)
-* w3-parse.el (w3-fix-paragraphs-in-region): fixed problem where the
-  fleading spaces/tabs of a line in a PRE or XMP segment would get
-  nuked.  Thanks to Bob Olson (address@hidden) for noticing it.
-
-Tue Aug 24 22:49:38 1993  William M. Perry  (address@hidden)
-* w3-epoch.el: fixed a typo - left out a " in a defvar which caused the
-  compiles to fail.  Thanks to Andrew Violette (address@hidden) for
-  noticing it. 
-
-Mon Aug 23 07:12:05 1993  William M. Perry  (address@hidden)
-* w3-misc.el (w3-lookup-style): Fixed stupid mistake where emacs19
-  wouldn't return any styles from this function
-* w3-parse.el: Fixed a problem where it would not fill paragraphs
-  correctly after the last PRE segment of the text.
-* w3-parse.el: Made the parser a lot less destructive (not as many
-  delete-regions) - this should make it handle overlapping formatting
-  better in most cases.  And maybe a little faster, since it doesn't have
-  to create as many strings and do as many re-insertions.
-
-Sun Aug 22 09:25:14 1993  William M. Perry  (address@hidden)
-* w3-emacs19.el: rewrote w3-view-this-url and w3-follow-link so that they
-  won't sometimes choke on links at the end of bold/italic/whatever zones.
-* w3-url.el (w3-http): now prints outi ts reading status (Reading.....)
-* w3-lucid.el: Took out the copying of a non-existent 'underline face. 
-
-Wed Aug 18 06:27:12 1993  William M. Perry  (address@hidden)
-* w3-mosaic.el (w3-write-global-history): fixed this so it actually works
-  again - forgot to change it when I changed the format of w3-history-list
-  to be an assoc list.
-
-Tue Aug 17 18:01:00 1993  William M. Perry  (address@hidden)
-* w3-mosaic.el (w3-fetch-annotations): Fixe problem where the annotation
-  fetch would die if the server couldn't be contacted.
-
-Mon Aug 16 17:04:23 1993  William M. Perry  (address@hidden)
-* w3-emacs19.el: took out the xresource reading - will depend on
-  emacs*w3-XXX-style.AttributeFont like the lucid emacs stuff.
-* w3-lucid.el, w3-emacs19.el: changed these so that if the newly created
-  faces aren't set up in the xdefaults, it will copy the appropriate face
-  (header-style copies 'bold-italic, etc).  Thanks Michael J. Lamoureux
-  (address@hidden)
-
-Sun Aug 15 09:22:52 1993  William M. Perry  (address@hidden)
-* w3-url.el: Added #linkname finding for local files and ftp html files.
-* w3.latex: added a section on going through firewalls/telnet, and using
-  the new tcp.c and tcp.el package.
-* w3.el: Changed the w3-help function to make sure a function is defined
-  before checking for documentation strings, etc.  Also changed it so that
-  it puts it in a hypertext buffer.  This opens up the idea of putting
-  links in the documentation strings. :)
-* Made tcp.c and tcp.el part of the 'extras' distribution.
-* w3-mosaic.el: Fixed problem where it would try to send the annotation
-  request to a string if w3-open-stream failed.
-* w3-misc.el: changed the telnet handling so that it will return 'nil' if
-  telnet could not connect to the remote host.
-* w3-vars.el (w3-color-display): this will now be set correctly in emacs19
-  - had spelled a function name wrong.
-* w3-url.el: Change w3-open-local and w3-file to respect new variable
-  w3-directory-format, which tells it whether to have a hypertext
-  directory listing, or just pass off to dired.
-
-Fri Aug 13 07:50:50 1993  William M. Perry  (address@hidden)
-* w3-mosaic.el: Fixed problem with not killing the "Process *anno*
-  finished" in http bufffers.
-* w3-lists.el: Fixed bug where w3-sublists-exist would bomb in epoch.
-  Epoch's re-search-forward returns t or nil, not the point of the
-  match like lucid/emac18/emacs19.  Several people pointed it out.
-
-Thu Aug 12 17:51:09 1993  William M. Perry  (address@hidden)
-* w3-misc.el (w3-pass-to-viewer): Fixed problem where this would not
-  display a picture if you were in Xwindows - flaw in a logical statement.
-  Thanks to Phil Kime (address@hidden) for noticing it.
-* w3-parse.el (w3-build-links-list): Added a few patches from Erik Ostrom
-  (fiicmds04.tu-graz.ac.at) - fixes bug with only recognizing NAMEd hrefs
-  when the NAMEs are quoted, and botching of relative #links.
-* w3-url.el: changed w3-http and w3-gopher to check the port # - if it is
-  in w3-bad-port-list, ask for confirmation before opening the connection.
-
-Tue Aug 10 13:07:04 1993  William M. Perry  (address@hidden)
-* New variable w3-bad-server-list, that is a list of HTTP/0.9 servers that
-  can barf on HTTP/1.0 requests.  Generally just servers that have a
-  decent amount of lag from your site (or that completely barf on
-  HTTP/1.0, like the TeXinfo gateway at ohio-state).
-* w3-mime.el: changed w3-create-mime-request to check w3-bad-server-list
-  for the current server and the value of w3-use-http2.  If both are
-  false, then generate an HTTP/1.0 request, otherwise HTTP/0.9
-* w3-url.el: changed w3-http to always use w3-create-mime-request.
-
-Mon Aug  9 08:52:10 1993  William M. Perry  (address@hidden)
-* w3.el: Added w3-documents-menu, an assoc list of titls and urls to turn
-  into a menu if you are in lemacs or emacs19.  Add support for running it
-  on dumb terminals via completing-read later.
-* w3.el: Ripped out all the variable definitions into w3-vars.el
-* w3-mime.el: fixed quite a few problems with w3-create-mime-request
-* w3-misc.el: think I finally got the truncated pages problem fixed.
-  (yeah, right :)
-* w3.el: Added code from Erik Ostrom (address@hidden) to
-  patch gopher-mode to throw you back into w3 when encountering a WWW link
-  in gopher.  Hopefully these will make it back into the main gopher.el.
-* w3-emacs19.el (w3-back-link): Added fix from Erik Ostrom
-  (address@hidden) so it won't give you an error in files
-  with only 1 link when you try to move backward.
-* w3-epoch.el: fixed a typo where you wouldn't be able to retrieve
-  images over http.
-
-Sun Aug  8 13:56:11 1993  William M. Perry  (address@hidden)
-* w3-url.el: added support for file://localhost urls.  Thanks to
-  address@hidden for pointing out that they didn't work
-* w3-emacs.el: took out the searching forward for '[' in the
-  goto-start-of-zone routine.  Would fail if w3-delimit-links was nil.
-  Thanks to address@hidden for pointing it out.
-* Revamped w3-url.el, w3-mosaic.el, and w3-misc.el to get the telnet
-  support working better.  No more mucking around with filters, etc.
-* w3-parse.el (w3-build-links-list): Changed the link routine so that it
-  will default to putting the end of a link at the end of the current line
-  if none is found normally.
-* w3-url.el: Local directories are now put into a hypertext buffer, and
-  parsed by w3.  Not sure if I should leave it this way or not.
-
-Sat Aug  7 03:28:58 1993  William M. Perry  (address@hidden)
-* w3-lists.el (w3-build-table): Changed it so you don't need to have a
-  DT in a DL list.
-* w3-mime.el (w3-mime-viewer): fixed this function to actually work! :)
-  (Was returning a list of the viewer, had to add a (car).)
-* Applied several patches from Jin S Choi (address@hidden), fixing
-  several stupid mistakes I had made. :)  Including, too many ')' in
-  emacs19, bad font setting in emacs19, noticed truncated pages via http2,
-  underlining of headings is off by default now.
-* w3-url.el: no longer print out "Reading..." when receiving documents -
-  would sometimes scramble the document.
-* w3-misc.el: w3-open-stream no longer errors when it can't connect to a
-  server - this would cause w3 to bomb if the annotation server were down.
-  Thanks to Jin S Choi (address@hidden) for noticing it.
-* w3-misc.el: w3-send-string should be a little better about not sending
-  mulitple lines to the server now, especially in emacs19 & epoch(?) where
-  accept-process-output accepts a timeout.
-
-Fri Aug  6 14:45:20 1993  William M. Perry  (address@hidden)
-* w3-url.el: changed the gopher handling to pass off everything to gopher
-  mode, so it can now handle gifs, images, etc.
-* w3-lists.el: Made DL be compact by default until I get the code to
-  change it based on DL COMPACT working right.
-* w3.el: removed the w3-useful-documents function - not really worth
-  having.
-* w3-lists.el: Totally rewrote the main loop so its not recursive, and
-  doesn't use save-restriction.  Much faster now.  Also truly fixed
-  problem with not nesting correctly.
-* w3-html+.el: a few tweaks, not ready for prime time yet though. 
-
-Thu Aug  5 08:22:16 1993  William M. Perry  (address@hidden)
-* w3-parse.el: Fixed bug in w3-fix-paragraphs that would cause it to loop
-  indefinitely if there were more than 2 PRE sections in a document.
-* w3-misc.el: Will now print out "Reading....." when receiving input.
-* w3-misc.el: w3-open-stream will now try to open the stream
-  w3-connection-retries times until it receives a valid connection.
-
-Wed Aug  4 08:49:44 1993  William M. Perry  (address@hidden)
-* w3-html+.el: can now include links as data table elements.  Don't wrap
-  stuff onto next lines yet though.
-
-Tue Aug  3 00:39:50 1993  William M. Perry  (address@hidden)
-* w3-lists.el: nested lists don't indent too far now.  Normal lists are
-  only indented 1 tab.
-* w3-html+.el: started work on this file to contain experimental HTML+
-  parsing routines.  Will probably eventually rewrite most of the parser.
-  Mostly support for tables in right now.  Will release soon.
-
-Mon Aug  2 09:21:23 1993  William M. Perry  (address@hidden)
-* w3-parse.el: Added support for arbitrary tags (!ENTITY ...), and
-  support for endash and emdash entities.
-* w3-parse.el: Fixed problem where links with no HREF field would bomb out
-  the parser (trying to string-match on nil).
-
-Thu Jul 29 10:35:06 1993  William M. Perry  (address@hidden)
-* w3-lists.el: found major bug with nesting multiple ULs inside of an
-  OL  Seems to be fixed now though.
-
-Wed Jul 28 08:29:31 1993  William M. Perry  (address@hidden)
-* w3.latex: revamped this so I can now use the latex2html perl script by N
-  F Drakos (address@hidden).  This will (almost) guarantee that the
-  online documentation is as up-to-date as the latex files.
-* w3-parse.el: Will now be able to find titles that don't have TITLE and
-  /TITLE on the same line.
-* w3-parse.el: Now stores the full url in each link's data zone - this
-  will allow print-url-under-point to work, and will make it easier to
-  write something that prints out a string of html documents.
-* w3-lists.el: Added this file.  Contains new functions to do better
-  nesting of lists.  Shouldn't hang emacs, but if it does, let me know
-  right away and I'll try to fix it.  Works great on the NCSA demo
-  document - and it has DLs inside ULs inside DLs inside ULs, so I figured
-  it was a good torture test for it. :)
-* w3-mosaic.el: changed the hotlist parsing code to remove empty lines so
-  you won't get a document type of ^Jhttp: if there are spurious blank
-  lines in the hotlist file.
-
-Mon Jul 26 09:45:34 1993  William M. Perry  (address@hidden)
-* w3-emacs19.el: Fixed forward and backward link movement.
-* w3-parse.el: Now transforms IMG ... tags into HREFs.
-
-Sun Jul 25 15:00:43 1993  William M. Perry  (address@hidden)
-* w3-misc.el: added function w3-find-this-file, which will do a find file
-  on the current w3 documents source (if in FTP or local file mode).  Will
-  be able to do it over HTTP when HTTP/1.0 becomes supported.  Thanks to
-  Heiko Muenkel (address@hidden) for suggesting it.
-* w3-misc.el (w3-send-string): Added a sit-for statement so it will wait
-  for process output - if the process is closed, then don't send any more
-  lines of the request.  This seems to have stopped the truncation of
-  pages.
-
-Fri Jul 23 07:23:05 1993  William M. Perry  (address@hidden)
-* w3.el: Added patches by address@hidden  Fixed a problem with a
-  non-existent gopher directory in w3-interesting-docs, and a typo.
-* w3-url.el (w3-unhex): Added patches by address@hidden  This
-  should give the correct values now.  Was off by 6.
-
-Thu Jul 22 12:05:17 1993  William M. Perry  (address@hidden) 
-* w3.el: Added new variable w3-use-http2.  If 't', w3 will use the
-  HTTP/1.0 support that for some reason truncates pages.  Default is t
-* Makefile: fixed stupid mistake where I left out a ${LISPDIR} so it
-  always tried to install in the root directory (/)
-
-Tue Jul 20 11:52:33 1993  William M. Perry  (address@hidden)
-* w3-parse.el (w3-fix-paragraphs): This function now respects PRE and XMP
-  segments and won't fill paragraphs in them.
-
-Mon Jul 19 09:22:17 1993  William M. Perry  (address@hidden)
-* w3-parse.el (w3-build-links-list): Fixed a problem where the text from
-  the last link would be used if there was a newline before the closing
-  /A in a link.  Also fixed several places where a link listing would
-  inherit items from the last link if they weren't defined (METHOD, URN,
-  etc)
-
-Sat Jul 17 11:36:31 1993  William M. Perry  (address@hidden)
-* Started work on adding NeXT mouse support in w3-emacs.el
-* Disabled the HTTP/1.0 support - was truncating pages for some reason.
-* w3-mosaic.el (w3-grok-annotation-format): Won't bomb if one of the
-  PAN-###.html files doesn't exist.
-
-Fri Jul 16 07:32:54 1993  William M. Perry  (address@hidden)
-* w3-mosaic.el (w3-do-personal-annotation): this will now correctly create
-  the LOG file in the personal annotation directory if it doesn't exist.
-* w3-parse.el (w3-prepare-buffer): Wrapped all the parsing stuff in a 
-  (let ((case-fold-search t)) ,,,) so that lowercase tags will be
-  recognized correctly.  Thanks to address@hidden for noticing it
-  still messed up on lowercase tags.
-
-Thu Jul 15 11:11:34 1993  William M. Perry  (address@hidden)
-* w3-docomp.el (compile-w3): Added w3-mime.el to the list of files to
-  compile. 
-* w3.el: Added lines to make w3-current-mime-* buffer local 
-* w3-parse.el (w3-prepare-buffer): Added variable w3-right-border to
-  control indentation on the right hand side of the buffer.  (Thanks to
-  Nathan Torkington (address@hidden) for suggesting it.
-* w3-misc.el (w3-basepath): This will no longer bomb if you are in a
-  scratch buffer (Thanks to Nathan Torkington
-  (address@hidden) for reporting it.
-* Release Version .9b
-* w3.el (w3-viewer-alist): The command to execute should now include a
-  '%s' wherever you want a filename to appear.  
-* Should now send all the right headers to a server, and act correctly.
-  (Won't bomb if server doesn't send make a MIME-ified document)
-* w3-mime.el: Can now create a valid HTRQ, parse a document's response
-  headers, and figure out if a document is a MIME-ified response.
-* w3-mime.el: First crack at making w3 mime compliant.
-
-Wed Jul 14 03:42:08 1993  William M. Perry  (address@hidden)
-* w3.el (w3-useful-documents): Added an 'interesting-docs' assoc list.
-  Similar to Xmosaics 'Documents' menu - just interesting interfaces that
-  are in the web.
-* w3-parse.el (w3-prepare-buffer): Took the file viewing code out of this
-  function - should never be evaluated.
-* w3.el (w3-viewer-assoc-list): No longer automatically append
-  auto-mode-alist to this - will mess up finding of hypertext files if you
-  have html-mode in your list.
-* w3-url.el: several changes to this file to actually make the external
-  viewers actually work again.
-
-Tue Jul 13 12:36:34 1993  William M. Perry  (address@hidden)
-* w3-url.el (w3-telnet): Changed this to use terminal-emulator instead of
-  transparent-window, since it won't work in emacs19 or lucid.
-* w3-url.el (w3-file): Will now correctly remember the name of the last
-  buffer when retrieving files via ftp.  Thanks to Dong-Ping Deng
-  (address@hidden) for noticing it didn't.
-* w3-mosaic.el (w3-parse-personal-annotations): no longer bombs if the
-  annotation directory doesn't exist.  Thanks to Heiko Muenkel
-  (address@hidden) for noticing.
-* w3-parse.el (w3-build-table): Building of definitions list is forgiving
-  if there is no DD.
-
-Mon Jul 12 07:08:38 1993  William M. Perry  (address@hidden)
-* w3.el: changed add-hook to use w3-member.  Thanks to Larry Masinter
-  (address@hidden) for suggesting it.
-* w3-parse.el & w3.el: fixed the run-hooks calls so they will actually
-  work.  Thanks to Larry Masinter (address@hidden) for pointing
-  out my mistake.
-* Makefile: fixed a few problems - thanks to address@hidden
-  for pointing them out. (Things like not compiling hyperbole, can now
-  configure what file to update the autloads and stuff in.)
-* w3-parse.el (w3-balance-XXX): fixed stupid mistake where I didn't remove
-  calls to string-to-int after redefining another function.
-* w3-misc.el (w3-count-occurences): added this function so "XX matches"
-  does not flash in the minibuffer when balancing PRE and XMP segments.
-  Directly from the emacs19 how-many function, but with no message at the
-  end.
-* w3-url.el (w3-mailto): changed syntax of mailto support to be
-  mailto:any-address-compliant-with-rfc822.  It just pops up a mail buffer
-  and sticks the rest of the url after mailto: in the To: line.  mailto
-  also now honors the variable w3-mutable-windows.
-* w3-parse.el (w3-balance-xmp): added this function to balance XMP
-  segments just like PRE segments.
-
-Sun Jul 11 08:08:44 1993  William M. Perry  (address@hidden)
-* w3-print.el (w3-convert-latex-to-html): added this function to convert
-  LaTeX documents to HTML.  Not sure why - was just bored. :)
-* w3-url.el (w3-mailto): added this function to support a new link type.
-  mailto://host/user will create a mail buffer and mail to address@hidden  The
-  syntax for this may change since it is not standard.
-* w3-parse.el (w3-build-table): fixed problem for when there was no
-  corresponding DD for a DT in a definition list.  A few documents at
-  CERN are like this.
-
-Sat Jul 10 08:55:35 1993  William M. Perry  (address@hidden)
-* w3.latex: did lots of work updating the documentation.
-* w3-emacs19.el (w3-emacs19-setup-faces): made function w3-try-make-XXX so
-  that w3 will still load and run, even if you use a font like '6x13' that
-  it can't make bold or italic.
-* w3-parse.el: PRE and ADDRESS tags now look a little better.
-* w3-mosaic.el: changed the annotation functions to set the
-  w3-current-annotation _AFTER_ calling html-mode, which will nuke all
-  buffer-local variables.
-* w3-mosaic.el (w3-add-personal-annotation): Now supports adding personal
-  annotations.
-* w3-mosaic.el (w3-add-group-annotation): now inserts /PRE as the first
-  line so that you can use all the formatting characteristics of HTML.
-  
-Fri Jul  9 07:31:20 1993  William M. Perry  (address@hidden)
-* w3-mosaic.el (w3-delete-personal-annotation): delete the current
-  annotation from your personal directory.
-* w3-mosaic.el (w3-fetch-personal-annotations): fixed dumb mistake in
-  formatting the url of each annotation.
-* w3-parse.el (w3-prepare-buffer): Will now check for any personal
-  annotations and put them at the end of the buffer (after group
-  annotations, if any).
-* w3-mosaic.el: added functions for reading the personal annotations from
-  w3-personal-annotation-directory.  No support for addition or deletion
-  of personal annotations yet.
-* w3.el (w3-mode.el): Delete group annotation option is only available in
-  lucid when user is in an annotation.
-* w3-[lucid|emacs19].el: changed menus to include deleting and adding
-  group|personal annotations
-* w3-mosaic.el: started working on adding personal annotation support.
-
-Thu Jul  8 15:32:45 1993  William M. Perry  (address@hidden)
-* w3-mosaic.el (w3-add-group-annotation): changed this so that it will
-  load up html-mode and have C-c C-c send the annotation.
-* w3-mosaic.el: Annotations are now fetched if w3-group-annotation-server
-  is defined.
-* w3-mosaic.el: Annotations can now be deleted - no key binding yet.
-* w3-mosaic.el: Annotations can now be added.  No key binding yet
-  
-Wed Jul  7 13:16:21 1993  William M. Perry  (address@hidden)
-* w3-emacs19.el (w3-back-link): Fixed w3-back-link so that the cursor will
-  be at the beginning of the link.
-* w3-emacs19.el: changed all the functions to use native emacs19 overlay
-  functions, instead of hacked up lucid-like syntax.  (Menus are still
-  done in lucid-style though)
-
-Tue Jul  6 12:41:03 1993  William M. Perry  (address@hidden)
-* w3-mosaic.el: Started work on w3-add-annotation and w3-fetch-annotations
-  to implement the NCSA group annotation facilities.  Don't work right now
-  - not sure why.  Need good docs (which don't exist) for the server. :)
-* w3.el (w3-view-url): Fixed problem where this function would put too
-  many '/' in the url.
-* w3-emacs19.el: Made a few changes to forward and backward movement among
-  links.  Still a few bugs, but can now find links in headers.
-
-Mon Jun 28 12:46:09 1993  William M. Perry  (address@hidden)
-* Added the variables w3-link-start-delimiter and
-  w3-link-end-delimiter so you don't have to edit the code to surround
-  links with something other than '[[' and ']]'.  Thanks to Andrew
-  Violett (address@hidden) for suggesting this.
-
-Sun Jun 27 14:54:50 1993  William M. Perry  (address@hidden)
-* w3-parse.el (w3-balance-pre): added this function to insert missing
-  /PRE tags.  Several documents on info.cern.ch leave these out and
-  cause the browser to crash (args out of range -5,1 or some such).
-* w3.el (w3-quit): Fixed bug if running in emacs19 without X, would cause
-  terminal to lock up indefinitely.
-* w3.el: w3-view-url now takes optional argument no-show.  If you pass it
-  an argument from a lisp function, it will return the current url without
-  message'ing it in the minibuffer.
-* w3-(lucid|emacs|emacs19|epoch).el: w3-view-this-url now acts the same as
-  w3-view url (doesn't flash the url in the minibuffer).
-* w3-(lucid|emacs19).el: Added some items to the menu, and a separator
-  between the links lists and the normal commands.
-
-Sat Jun 26 11:47:52 1993  William M. Perry  (address@hidden)
-* w3-emacs19.el: slight modifications.  Nothing really noticeable.
-* w3-print.el (w3-print-this-url): fixed this so ftp files will print
-  correctly.  Also had to change w3-file.
-
-Thu Jun 24 09:02:23 1993  William M. Perry  (address@hidden)
-* w3-url.el (w3-parse-buffer): Check to see if a url is already in the
-  history list before storing.  (Also check for bogus ones like
-  file:historylist.
-* w3-misc.el (w3-show-history-list): Added this function to show the
-  history list to the user in hypertext form.  I just use w3-history list
-  and make a hypertext buffer of it on the fly.  Thanks to Matthew Newhook
-  (address@hidden) for suggesting it.
-* w3-url.el: no longer store the URL in the history list here.  Do it in
-  w3-parse-buffer so I can store the TITLE of the document also.
-
-Tue Jun 22 10:18:54 1993  William M. Perry  (address@hidden)
-* w3.el (w3-document-source): Fixed stupid problem where I put http in
-  twice when building url of current document.  Thanks to Denys Duchier
-  (address@hidden) for noticing/fixing it.
-
-Mon Jun 21 12:38:23 1993  William M. Perry  (address@hidden)
-* w3-url.el (w3-telnet): Will actually work now.  Was bombing when the url
-  was not of the form address@hidden:port.  Would try to extract the
-  username, even though it wouldn't exist.  Thanks to Phil Molloy
-  (address@hidden) for noticing it.
-* w3-parse.el (w3-build-links-list): Fixed a problem where a newline right
-  after after the > in a url would cause the text of the link not to show
-  up.  Thanks to Dirk Husemann (address@hidden)
-  for the code to fix it (slightly modified).
-* w3.el (w3-doc-variables): Moved a paren in w3-doc-variables so that
-  w3-xterm will be documented.  Thanks to Denys Duchier
-  (address@hidden) for noticing.
-* w3-misc.el (w3-uncompress): Changed this so it actually works.  Was
-  passing a list instead of the cdr to the shell-command.  Thanks to
-  Phil Molloy (address@hidden) for noticing.
-
-Sun Jun 20 08:14:28 1993  William M. Perry  (address@hidden)
-* w3.el: Added function to store the current URL in the kill ring.  Thanks
-  to Mark Eichin (address@hidden) for the idea/code.
-* w3.el: Changed w3-help so that it will work under emacs 19.
-* w3-emacs19.el: only require lmenu & lucid when in X, otherwise emacs
-  compiled without X will die.  Thanks to Erik Ostrom
-  (address@hidden) for noticing it.
-* w3.el: only call w3-build-menu if in emacs19 & in x . . .
-* w3.el: Changed searching code so that it replaces all spaces with '+'.
-  Was causing some servers to time out if it didn't.  Thanks to Jin S Choi
-  (address@hidden) for pointing this out.
-* w3-parse.el: added a check in w3-fix-paragraphs and
-  w3-build-ordered-lists to see if emacs19 is running.  If so, add an
-  extra newline, since v19 seems to fill paragraphs differently than the
-  other flavors.
-* w3-emacs.el: added (defvar w3-default-style nil), so the code that hides
-  HREF's with no links won't barf.
-* w3-emacs19.el: changed 1 line defuns to defsubst, since function calls
-  are expensive.
-* w3-emacs19.el: Finding of #linknum should work now . . . no map-extents
-  in the lucid emulation package - will probably write one later.
-* w3-emacs19.el: Wrapped all the font stuff in an (if (eq window-system 'x)
-  so it wouldn't barf if emacs19 was loaded while emacs was on a dumb
-  terminal.
-* w3.el: added variable w3-running-FSF19, and have it load w3-emacs19.el
-  if set to t.  (Determined by emacs-version > 19, and not running lucid)
-
-Sat Jun 19 16:09:28 1993  William M. Perry  (address@hidden)
-* w3-emacs19.el: Changed bindings on the mouse buttons to react to a
-  mouse-up event instead of the mouse-down event, because it would try to
-  paste into the buffer on the mouse-up.  Bleah. :)
-* w3-url.el: Modified the ftp: support so that it will parse out html
-  files, and will also be able to follow relative links within ftp'd html
-  docs.
-
-Sat Jun 19 10:01:45 1993  William M. Perry  (address@hidden)
-* Fix stupid bugs in Makefile from where I delete some things when
-  it was on my linux box
-* Support for some ISO chars by Ulrich Pfeifer 
-  (address@hidden).
-
-Fri Jun 18 13:03:12 1993  William M. Perry  (address@hidden)
-* Release v.5b
-
-Thu Jun 17 14:58:32 1993  William M. Perry  (address@hidden)
-* Better emacs 19 support from address@hidden
-* URLS that are just for reference (no HREF, but has a title) are no longer
-  highlighted, so people won't be tempted to click on them.  Thanks to
-  Erik Ostrom (address@hidden) for pointing this out.
-
-Fri Jun 11 12:14:47 1993  William M. Perry  (address@hidden)
-* Fixed problem with PRE handling - would fill paragraphs and replace
-  spaces.  Stupid misplacement of a 't'.
-* Added .gz extension for gzip to w3-uncompressor-alist
-* Trial run of emacs 19 support for fonts, etc from Jin S Choi
-  (address@hidden).  Not sure everything works yet.
-
-Mon Jun  7 12:42:48 1993  William M. Perry  (address@hidden)
-* Fixed printing from local files.
-* Added variables w3-telnet-prog and w3-telnet-header-length, for using
-  things like telnet+term from linux.
-
-Thu Jun  3 13:34:48 1993  William M. Perry  (address@hidden)
-* Fixed problems with gopher, and unhexing of escaped characters.  Thanks
-  to Larry Masinter (address@hidden) for the patches.
-* Beginning of emacs-19 support - not functional yet though.  Feel free to
-  fix it. :)
-* More stuff with w3-continuation, etc, etc.
-* Added (require 'nntp)
-
-Fri May 28 14:06:27 1993  William M. Perry  (address@hidden)
-* Fixed w3-print.
-
-Mon May 17 12:55:45 1993  William M. Perry  (address@hidden)
-* Can now specify uncompressors in an assoc list
-* Added better handling of stringing things along (ie: uncompress,
-  convert, then print, etc etc)
-
-Fri May  7 08:52:30 1993  William M. Perry  (address@hidden)
-* Release .31b
-* Fixed major problem with w3-fetch.  Would bomb with stringp = nil if
-  done interactively.
-
-Mon May  3 08:16:35 1993  William M. Perry  (address@hidden)
-* Can now print the url under point - no key binding yet.
-* Added the ability to store a gopher link into the hotlist - thanks
-  to scott snyder (address@hidden) for patching gopher-mode to
-  support this.  No key binding yet.
-* Added the 'links' menu back into lucid emacs.
-
-Fri Apr 30 11:56:57 1993  William M. Perry  (address@hidden)
-* Fixed a problem with viewing local files with w3-viewer-alist
-
-Thu Apr 29 11:43:13 1993  William M. Perry  (address@hidden)
-* w3-fetch now defaults to the url of the current document if the
-  document you invoke it from is in w3-mode.
-* Added ability to find links of just #link - doesn't need to reload
-  the whole document.
-* Applied several patches fro Alastair Burt (address@hidden)
-  * Better updating of menu bar in Lucid
-  * Updates the interal w3-hotlist when you delete a hotlist entry
-  * Problem with the w3-viewer-alist - it tried to play
-    Something.Thesaurus
-* Fixed problems with w3-graphics-converter-alist, and lots of
-  problems with the w3-hypertext-extns.
-* Fixed problem with finding files for dired-mode - would still try to
-  do the viewing, etc.
-
-Wed Apr 28 07:23:56 1993  William M. Perry  (address@hidden)
-* Fixed problem with dired-ing remote ftp files.  Removed lots of
-  useless if file-directory-p [...], and just did a find-file - let
-  ange-ftp and dired take care of it - they know how better.
-* Fixed problem where w3-epoch-frob-resources would not set the
-  defaults if no Xresources were specified - thanks to Luis Miguel
-  Silveira (address@hidden) for noticing it.
-* Changed the w3-delimit-links variable so that you can specify
-  'linkname as its value, and have the old style "Link text
-  here[link#here]" style of showing links.  Nil shows nothing,
-  non-nil, non-linkname shows [[ & ]] around link text.
-
-Tue Apr 27 15:37:18 1993  William M. Perry  (address@hidden)
-* Fixed problem in gopher handling - if no port was specified, it
-  would get completely confused.
-
-Mon Apr 26 17:06:33 1993  William M. Perry  (address@hidden)
-* v.2b
-* Fixed problem with putting remote dirs into dired-mode with a bad
-  default-filename.  Thanks to Larry Masinter
-  (address@hidden) for noticing, and for the fix.
-* Added newest nntp.el to the extras tar file
-* Fixed problem where w3-current-last-buffer was not set correctly
-  when reading news.
-* Added support for news: links - single articles as well as whole
-  groups are supported.
-
-Sun Apr 25 15:36:55 1993  William M. Perry  (address@hidden)
-* Fixed recursive make install bug - thanks to Larry Masinter
-  (address@hidden) for noticing it.
-* Fixed problem with no default gopher object type.  Thanks to Larry
-  Masinter (address@hidden) for noticing it.
-* Fixed problem with no default gopher port.
-* Fixed the auto-documenter so that it would insert "M-x funcname"
-  if no bindings were found in the keymap. Thanks to Larry Masinter
-  (address@hidden) for noticing it.
-* Fixed problem with w3-file not passing to a viewer correctly.
-
-Thu Apr 22 13:22:53 1993  William M. Perry  (address@hidden)
-* Fixed the handling of URL#link finding . . . depends on which
-  emacs you are using, due to the weirdness of zones, etc, in each.
-* Split the files up again.  Figure with >2000 lines, it should be
-  done. :)
-* No longer need w3-links-list - store all relevant information in the
-  data segment of a zone.  Changed every function to use this new
-  structure.
-
-Wed Apr 21 08:24:35 1993  William M. Perry  (address@hidden)
-* Added variables w3-use-html2latex, w3-html2latex-prog, and
-  w3-html2latex-args.  If w3-use-html2latex is non-nil, then
-  w3-html2latex-prog is called in a subprocess with the flags defined
-  by w3-html2latex-args, with the html source as standard input.
-  Default is to do my (bad) regular expression matching to convert.
-
-Tue Apr 20 08:51:19 1993  William M. Perry  (address@hidden)
-* Can now specify regular expressions as the car of
-  w3-viewer-assoc-list 
-* fixed problem where epoch would not defvar the styles - just moved
-  them out of w3-epoch-frob-resources, and it works.  Weird.
-* Fixed several bugs in the w3-convert-html-to-latex function - now
-  handles addresses and &amp; correctly.
-* Fixed yet another dumb bug in the insertion of PLAINTEXT in
-  non-hypertext documents.
-* Added w3-member, instead of builtin (or predefined) member, since
-  some definitions don't use equal for comparison like they are
-  supposed to.
-
-Mon Apr 19 07:48:56 1993  William M. Perry  (address@hidden)
-* v.1b
-* Added LaTeXing of w3 documents, and automatic printing.  Just an
-  edit of the sed script to be a lot of replace-regexps, then a shell
-  command to latex a temp file and print it out.
-* Added w3-goto-last-buffer, which will take you to the last buffer
-  you visited before (kind of like gopher-mode).  Changed w3-quit to
-  use this also.
-* Fixed a bug in w3-reload-document that would make it bomb on local
-  file reloads.
-* Better nesting of lists.
-
-Sun Apr 18 13:50:38 1993  William M. Perry  (address@hidden)
-* Added variable w3-mutable-windows - if t, w3 pops up buffers in
-  another window.
-* Added a default-style for w3 buffers
-
-Wed Apr 14 10:18:01 1993  William M. Perry  (address@hidden)
-* Fixed several problems with the epcoh Xresources reading code
-* Added global history, for compatability with xmosaic
-* Added deletion of hotlist entries
-* Changed w3-viewer-alist to automatically include the auto-mode-alist
-* Viewers can now include lisp calls (ie: ("txt" . view-mode)) to put
-  in files.
-* file:// links will now put directories in dired-mode.  Thanks to
-  address@hidden for the fixes.
-* Finally fixed relative-links - .. & . are removed correctly
-* Fixed relative links for graphics also.
-
-Tue Apr 13 08:30:58 1993  William M. Perry  (address@hidden)
-* Added support for reading Xdefaults within Epoch.
-* v.04b
-* Fixed graphic support to work over http links (Epoch Only)
-* Fixed graphic support so it will figure out if the conversion failed
-  or not - warning message if it did.
-  
-Mon Apr 12 07:35:40 1993  William M. Perry  (address@hidden)
-* v.03b
-* Fixed lemacs support so it doesn't nuke your xdefaults.  Also fixed
-  the passing of face-objects, since they are screen-specific, and
-  therefore a Bad Thing.  Thanks to Jamie Zawinski (address@hidden)
-* Changed menu code so that it put the link # in there also.  Helpful
-  for when the links are unnamed, or named 'here' or 'this'.  Thanks
-  to Jamie Zawinski (address@hidden) for saying the menus were hosed.
-
-Sun Apr 11 16:30:44 1993  William M. Perry  (address@hidden)
-* Fixed graphics support for epoch - would only do 1 image per page.
-* Fixed a few typos - thanks to address@hidden
-
-Fri Apr  9 00:18:47 1993  William M. Perry  (address@hidden)
-* Added graphics support for epoch (doesn't work over http, pretty
-  much hardwired for me right now - commented out in the release)
-* v.02b
-* Several bug fixes (link finding, name fixing, others) - thanks to
-  address@hidden for the fixes.
-* Added address@hidden's zone-imitation functions for normal emacs.
-  Also wrote corresponding forward&back link code.  I wrote the forward&
-  back code for epoch&lemacs.
-
-Thu Apr  8 13:23:27 1993  William M. Perry  (address@hidden)
-* Fixed being able to jump forward over non-links in []s. Thanks to
-  address@hidden
-* Fixed telnet handling - thanks to address@hidden for noticing
-  it and for a preliminary fix.  Refined his fix.  Problem was that
-  telnet wasn't getting enough time to start before I sent it a
-  command.
-* Fixed a few regular expressions - thanks to address@hidden
-* Fixed bug in w3-add-document-hotlist which caused an error if the
-  hotlist file didn't already exist.  Thanks to address@hidden
-  for noticing it.
-
-Wed Apr  7 00:08:53 1993  William M. Perry  (address@hidden)
-* Split the files into 4 different files for easier editing.
-* Modified Makefile to work with the new file structure.
-* Fixed a problem with the links code that cropped up with blank HREFS
-* HREFs of the form .....#link will now go to 'link' within the target
-  document.
-* v.01beta - fourth release
-* Can now type #### RETURN to go the the ###th link in the current buffer.
-* Fixed a bug in XMP handling
-* Fixed bugs in the logical/physical styles in definition lists
-* Improved indentation of all lists
-* Wrapped (require 'ange-ftp) in a (not noninteractive) so it wouldn't
-  screw up the compiles.
-* Fixed a few problems in the Makefile
-* Revamped the way it looks for links in dumb emacs mode.  (Actually,
-  all I did was add a .* to the beginning and a parenthesized part of
-  the regexp - real rough. :)
-* Added support for physical and logical styles.  Looks great in lucid,
-  not so hot in epoch (had to use colors, not actual styles).  Suggestions
-  welcome.
-
-Tue Apr  6 21:14:14 1993  William M. Perry  (address@hidden)
-* Supports nested definition lists (only 1 deep, and only in ordered lists)
-* Now supports nested lists (only 1 deep, and only inside ordered lists)
-
-Mon Apr  5 13:34:00 1993  William M. Perry  (address@hidden)
-* v.008beta - third release
-* Fixed ADDRESS support
-* Added auto-documentation features.
-* Added ordered list support - does not support nested lists at all yet.
-* Added automatic bug submission
-* Added popup-menu for lucid emacs
-* Added support for links nested in headers.
-* v.007beta - second release
-* Revamped local files - now use file:/ instead of nonstandard local:/
-* Added better handling of definition lists.  (No support for Compact
-  ones now though)
-
-Fri Apr  2 10:28:08 1993  William M. Perry  (address@hidden)
-* Definition lists now keep their zones/extents so they are highlighted
-  correctly. 
-* Fixed bug in PRE handling - left out a (goto-char (point-min))
-
-Wed Mar 31 08:51:04 1993  William M. Perry  (address@hidden)
-* Did work on resolving ./ & ../ links (only works for one level right
-  now.  Will work on getting it recursive later.
-* Changed data field in extents/zones to be (w3 . type) so I
-  wouldn't grab a wrong item.
-* Fixed a bug in title handling.  Left something out of an if
-  statement and it would try to delete a region that (probably) didn't
-  exist.
-* Fixed bug in w3-follow-link (added a ':' to end of regexp).  Would
-  cause it to screw up on a url like http.html.  Thanks to Erik Ostrom
-  (address@hidden)
-* Changed requires to autoloads where possible
-* Wrapped require of transparent.el so it won't get loaded if in X
-* Fixed bug in lemacs mouse links.
-* Applied numerous patches from address@hidden & address@hidden to fix
-  compilation problems with lemacs & epoch.
-
-Tue Mar 30 15:05:01 1993  William M. Perry  (address@hidden)
-* Added mouse support for following links in epoch & lucid emacs
-  Store the link # in the data segment of the zone.  If mouse is
-  clicked in a zone, extract the data, assoc it with w3-links-list and
-  call w3-follow-link with it.  Hacky but works. :)
-* Added (provide 'w3) for easier loading, etc.
-* Fixed problems with epoch highlihting
-* Fixed makefile problem (some files left out)
-
-Sun Mar 28 13:04:12 1993  William M. Perry  (address@hidden)
-* Added auto-viewing of ps/gif/jpg/etc files
-* Added uncompression and gunzipping auto-recognition
-
-Sat Mar 27 12:32:54 1993  William M. Perry  (address@hidden)
-* v.004beta - first release
-* Few changes to the parser
-* Fixed PRE Handling so it parses out urls inside.
-* Added handling of &#XXX to insert ascii value of XXX.
-
-Fri Mar 26 11:27:52 1993  William M. Perry  (address@hidden)
-* Completed document source command.
-* Changed it so it won't barf if you try to fetch the same document twice.
-* Added w3-reload-document to reload the current file.
-
-Wed Mar 24 16:37:22 1993  William M. Perry  (address@hidden)
-* v.003beta - put on ftp archive
-* Added support for the xmosaic style of hotlist.  Goto and add are
-  supported.
-* Changed searching a little
-* Fixed bug in XMP/PRE handling that reinserted everything in all caps.
-  Was very annoying.
-* Added lemacs menu of hotlist items.
-
-Tue Mar 23 08:46:12 1993  William M. Perry  (address@hidden)
-* v.002beta - put on ftp archive
-* Added menus to the lucid emacs code.  Looks a little weird when
-  links are named 'here', but not bad.
-* Added to the searching code
-* Fixed bug in renumbering system (forgot to increment bogus-num)
-* Completely rewrote the parser (yet again).  Finally got the HTML
-  specs, so it now handles every item possible (hopefully).
-* Added support for small things like DL COMPACT, PLAINTEXT, PRE.
-* Added code to delete outdated information (HEADER, BODY, etc)
-* Added w3-preview-this-buffer, which feeds the current buffer into
-  the w3-preprocessor and spits out a formatted buffer.  I use this
-  mainly to see if I can break anything, but might be useful when
-  writing real html documents.
-* Added code to delete useless (to us) HTML headers (NEXTID, etc)
-* Added support for index searching.  Mode line is changed to reflect
-  this.  Need to use something more noticeable though.
-  
-Mon Mar 22 07:43:10 1993  William M. Perry  (address@hidden)
-* Broke highlighting in definition lists.  Not sure how to get around
-  this and still have the DLs formatted correctly.
-* Little tweaks
-* Cleaned up ^Ms that appeared sometimes
-* Added a default port for http links (http://moose/info instead of
-  http://moose:80/info)
-
-Sun Mar 21 13:44:02 1993  William M. Perry  (address@hidden)
-* Forgot to include Menu and DL lists, added them.
-* Added support for embedded plain text (XMP directive)
-* Added 'cacheing' of old info - just made variables buffer-local, and
-  save them before kill-all-local-variables, then restore.  Need to figure
-  out some way to kill old buffers (only keep last 5, etc)  
-* Fine tuned local file support
-* Added ftp support - just a link to ange-ftp
-* Fixed unNAMEd links yet again - should work better
-* Added support for lucid emacs & epoch (highlight links, headers,etc)
-  Borrowed code from html-mode.el by address@hidden
-* "Fixed" unNAME'd links.  Big Kludge. Needs work.
-
-Sat Mar 20 14:10:12 1993  William M. Perry  (address@hidden)
-* v.001beta
-* Complete rewrite of the parsing code.  Still not pretty, but much
-  faster, better paragraph filling.
-* Defined w3-mode
-* Forward and backward searching for links - still needs lots of work
-
-Fri Mar 19 08:00:03 1993  William M. Perry  (address@hidden)
-* v.000alpha
-* Support for gopher, telnet, http, and local file access
-* First attempt
diff --git a/HOWTO b/HOWTO
deleted file mode 100644
index 1de9f1e..0000000
--- a/HOWTO
+++ /dev/null
@@ -1,153 +0,0 @@
-How to build GNU Emacs W3 mode
-------------------------------
-
-    Robert J. Chassell, address@hidden
-    12 Aug 1997
-
-This is brief description of how to build a beta test version of GNU
-Emacs W3 mode.  Eventually, this note will be replaced by proper
-documentation in the W3 Info file.
-
-Here is one way to build version 3.0.99; you can adapt this to however
-you want to build W3:
-
-Untar the beta test file, in a directory above the one in which you want to
-place the sources:
-
-   $ cd /usr/local/src
-   $ tar xvzf w3-3.0.99.tar.gz
-
-Then cd into the w3-3.0.99 directory.
-
-In that directory, at your prompt, type this:
-
-   $ ./configure --help
-
-This documents how `configure' works; `configure' creates Makefiles
-for you.
-
-Then type a command such as this:
-
-   $ ./configure --with-emacs --prefix=/usr/local/src/w3-3.0.99  
--exec-prefix=/usr/local/src/w3-3.0.99
-
-In this example, the byte compiled files will go into the same directories
-as their sources.  You can put them elsewhere, but this is a simple
-clean way to create a test version.
-
-There was a bug in the Makefiles for 3.0.99 (this is what beta test
-software is to find): the name for the Emacs executable was set to `t'
-rather than to `emacs'; I changed that by hand.
-
-Then build the byte compiled files:
-
-   $ make w3
-
-(Well, I do this in Emacs with the `M-x compile' command, and I invoke:
-    date; make w3; date
-with `date' commands sandwiching the meat.  This way I can see how
-long the compile takes.  Now up to 16 minutes.)
-
-You will note I did give the `make all' command.  That not only
-bytecompiles W3 mode, but creates the Info and DVI files; however,
-Wm. Perry thoughtfully includes the Info in the ...texi/ directory
-anyhow, so you don't need to create them again; and I don't bother to
-recreate DVI files to print out except occasionally.  If you do want
-all your documentation, type `make all' instead of `make w3'.
-
-Link the location of your .elc files to /usr/local/src/w3/ so you
-don't have to change old habits:
-
-  $ cd /usr/local/src
-  $ ln -s /usr/local/src/w3-3.0.99/lisp w3
-
-I am basing this suggestion on the presumption that sometime in your
-past, you set the load-path in your .emacs file to a w3 directory,
-using an expression like this:
-
-    ;; set load-path
-    (setq load-path (cons "/usr/local/src/w3" load-path))
-
-By linking the directory with the byte-compiled files to this
-directory, you can always start W3 mode by typing `M-x w3'.
-
-Also, since the `configure' commands I suggested leave the existing
-(or place any new) Info files in the `/usr/local/src/w3-3.0.99/texi/'
-directory, you should also link the texi/ directory appropriately:
-
-  $ cd /usr/local/src
-  $ ln -s /usr/local/src/w3-3.0.99/texi w3-info
-
-Also, be sure to set the name of the menu appropriately in your
-/usr/info/dir file, like this:
-
-    * W3: (/usr/local/src/w3-info/w3.info).  Emacs W3 mode, a Web browser
-
-Now, type `M-x w3' inside of Emacs and W3 mode should start.
-
-                         -------------
-
-There is a bug in W3 version 3.0.99, in that it does not respond to
-the `w3-default-stylesheet' variable which the documentation says you
-can set in your .emacs file, with a command such as:
-
-;; Specify my own stylesheet
-(setq w3-default-stylesheet "~bob/.w3.sty")
-
-So, instead, put your own stylesheet where W3 can find it, such as in:
-
-    /usr/lib/emacs/w3/stylesheet
-
-Otherwise, you will see a warning like this:
-
-    (style/warning) No stylesheets found!  Check configuration! DANGER DANGER!
-    Emacs-W3 checked for its stylesheet in the following places
-    and did not find one.  ...
-
-You can create your won stylesheet by basing it on `default.css' which
-comes with the distribution.
-
-                         -------------
-
-Once you have started W3 mode, you can submit bugs by typing `w'
-(w3-submit-bug) in a W3 mode buffer.
-
-That is how I sent this file to William Perry .... I saw a lack in the
-documentation (I am continuously forgetting how to build a new version
-of W3 so I figured I ought to do something about it.)
-
-                         -------------
-
-Incidentally, rather than download a complete tar.gz file, you can of
-download diff files, patch a previous distribution, and byte-recompile
-the directory.  This is usually quicker than downloading the whole
-half-magabyte tar.gz file and byte compiling it.  
-
-Using ange-ftp, the diffs are in:
-
-    /address@hidden:/pub/elisp/w3/.betas/diffs
-
-Or you can do as I described here.
-
--------------------
-The widgets are a set of files to which your `--with-emacs' option to
-`./configure' should point.  They are in the emacs-20/lisp/ directory,
-called `widget.el' and the like.  Also, `custom.el' is there.
-
-If you think that you are configuring correctly, but W3 still does not
-build, check to ensure you are removing your old `config.*' files
-before running your `./config' command.
-
-The files to be removed are:
-
-    config.cache
-    config.log
-    config.status
-
-Use `make distclean' to remove them.  (Incidentally, the `clean-cache'
-script is for cleaning your cache of old URLs, not for configuration.)
-
-The build sequence is:
-
-    make distclean
-    ./configure --with-emacs=/usr/local/src/emacs-20.2/src/emacs-20.2.1 
--prefix=/usr/local/src/w3-3.0.107 
-    make w3
diff --git a/INSTALL b/INSTALL
deleted file mode 100644
index 2179376..0000000
--- a/INSTALL
+++ /dev/null
@@ -1,99 +0,0 @@
-Emacs/W3 Installation Guide
-Copyright (c) 1997 Free Software Foundation, Inc.
-
-   Permission is granted to anyone to make or distribute verbatim copies
-   of this document as received, in any medium, provided that the
-   copyright notice and permission notice are preserved,
-   and that the distributor grants the recipient permission
-   for further redistribution as permitted by this notice.
-
-   Permission is granted to distribute modified versions
-   of this document, or of portions of it,
-   under the above conditions, provided also that they
-   carry prominent notices stating who last changed them,
-   and that any new or changed statements about the activities
-   of the Free Software Foundation are approved by the Foundation.
-
-
-BUILDING AND INSTALLATION
-
-(This is for a Unix or Unix-like system.  For Windows NT or Windows
-95, see the file README.NT.)
-
-This version requires either Emacs 20.3 or later (but 20.3 is known to
-be quite buggy) or XEmacs 20.4 or later.  If you're using a version
-without Gnus 5.8 or later, get a more recent distribution from
-gnus.org.
-
-1) Make sure your system has enough memory to run Emacs, plus about 1
-megabyte to spare.
-
-Building Emacs/W3 requires about 2.8 Mb of disk space (including the
-sources).  Once installed, Emacs/W3 occupies about 2 Mb in the file
-system where it is installed.
-
-2) To build Emacs/W3, you must configure a few simple items.  Emacs/W3 
-uses the GNU 'autoconf' program for meta-configuration.  You should be 
-able to run the program `configure' as follows:
-
-   ./configure [--OPTION[=VALUE]] ...
-
-If you wish to build with a specific version of Emacs, specify
-`--with-emacs=VARIANT'.  If you wish to build with a specific version
-of XEmacs, specify `--with-xemacs=VARIANT'.  If you omit these
-options, `configure' will try to figure out what flavor of Emacs to
-use.  It will honor the `EMACS' environment variable if it is set,
-otherwise it will check for `xemacs' and `emacs' in your path.
-
-If you had to install Gnus in a non-standard place, specify
-`--with-gnus=DIR'.  If you omit this option, `configure' will try to
-figure out where an acceptable version of Gnus is installed.
-
-If you prefer not to use the GNU `makeinfo' program if it is
-available, specify `--with-makeinfo=no'.  This will cause the info
-files to be built using Emacs.
-
-The `--prefix=PREFIXDIR' option specifies where the installation process
-should put Emacs/W3 and its data files.  This defaults to `/usr/local'.
-- Lisp files go in PREFIXDIR/share/emacs/site-lisp
-  (unless the `--with-lispdir' option says otherwise).
-- The architecture-independent files go in PREFIXDIR/share/emacs/w3
-  (unless the `--datadir' option says otherwise).
-
-`configure' doesn't do any compilation or installation itself.  It
-just creates the files that influence those things:
-`./Makefile', `texi/Makefile', and `lisp/Makefile'.
-
-When it is done, `configure' prints a description of what it did and
-creates a shell script `config.status' which, when run, recreates the
-same configuration.  If `configure' exits with an error after
-disturbing the status quo, it removes `config.status'.  `configure'
-also creates a file `config.cache' that saves the results of its tests
-to make reconfiguring faster, and a file `config.log' containing
-compiler output (useful mainly for debugging `configure').  You can
-give `configure' the option `--cache-file=FILE' to use the results of
-the tests in FILE instead of `config.cache'.  Set FILE to `/dev/null'
-to disable caching, for debugging `configure'.
-
-3) Run `make' in the top directory of the Emacs/W3 distribution to
-finish building Emacs/W3 in the standard way.  You can "install" the
-package with `make install'.  By default, Emacs/W3's files are
-installed in the following directories:
-
-`/usr/local/share/emacs/site-lisp' holds the Emacs/W3 lisp code.
-
-`/usr/local/share/emacs/w3' holds any data files for Emacs/W3,
-               including `stylesheet' which controls all default
-               formatting settings.
-
-`/usr/local/info' holds the on-line documentation for Emacs/W3, known
-               as "info files."
-
-4) Check the file `dir' in your site's info directory (usually
-/usr/local/info) to make sure that it has a menu entry for the
-Emacs/W3 info files.
-
-5) You are done!  You can remove object files from the build directory 
-by typing `make clean'.  To also remove the files that `configure'
-created (so you can compile Emacs/W3 for a different configuration),
-type `make distclean'.
diff --git a/README.NT b/README.NT
deleted file mode 100644
index d24ff82..0000000
--- a/README.NT
+++ /dev/null
@@ -1,60 +0,0 @@
-Emacs/W3 Installation Guide (Windows 95/NT Version)
-Copyright (c) 1998 Free Software Foundation, Inc.
-
-   Permission is granted to anyone to make or distribute verbatim copies
-   of this document as received, in any medium, provided that the
-   copyright notice and permission notice are preserved,
-   and that the distributor grants the recipient permission
-   for further redistribution as permitted by this notice.
-
-   Permission is granted to distribute modified versions
-   of this document, or of portions of it,
-   under the above conditions, provided also that they
-   carry prominent notices stating who last changed them,
-   and that any new or changed statements about the activities
-   of the Free Software Foundation are approved by the Foundation.
-
-
-ADDITIONAL DISTRIBUTION FILES
-
-* custom.tar.gz
-
-For older versions of Emacs (pre-20.x), you will need the latest and
-greatest versions of the custom and widget libraries.  This is
-distributed in a separate tar file to save users time in downloading,
-and to ease maintenance of the libraries.
-
-
-BUILDING AND INSTALLATION
-
-(This is for a Windows 95 or NT system.  For Unix or Unix-like
-systems, see the file INSTALL.  For VMS systems, see the file
-README.VMS)
-
-1) Make sure your system has enough memory to run Emacs, plus about 1
-megabyte to spare.
-
-Building Emacs/W3 requires about 2.8 Mb of disk space (including the
-sources).  Once installed, Emacs/W3 occupies about 2 Mb in the file
-system where it is installed.
-
-2) You must tell Emacs/W3 where to find the custom/widget packages
-that you have installed if you are running Emacs 19.
-
-This is done with the WIDGETDIR environment variable.  Set this to the
-directory where the lisp files are, ie:
-
-set WIDGETDIR=c:\users\blort\lisp\custom
-
-3) Run `build.bat' in the top directory of the Emacs/W3 distribution
-to finish building Emacs/W3 in the standard way.
-
-4) Add the Emacs/W3 lisp directory to your load-path.  Add the
-following line to your .emacs file.
-
-(setq load-path (cons "c:/path/to/w3-x.y.z/lisp" load-path))
-(require 'w3-auto)
-
-4) Check the file `dir' in your site's info directory (usually
-/usr/local/info) to make sure that it has a menu entry for the
-Emacs/W3 info files.
diff --git a/README.VMS b/README.VMS
deleted file mode 100644
index 0fd0c0c..0000000
--- a/README.VMS
+++ /dev/null
@@ -1 +0,0 @@
-Put VMS installation notes in here.
diff --git a/build-dist b/build-dist
deleted file mode 100755
index e700407..0000000
--- a/build-dist
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/bin/sh
-
-while [ $# != 0 ]; do
-  switch="$1"
-  shift
-  case "$switch" in
-    --*=*)
-      opt=`echo '' ${switch} | sed -e 's:^ ::' -e 's:^-*\([^=]*\)=.*$:\1:'`
-      val=`echo '' ${switch} | sed -e 's:^ ::' -e 's:^-*[^=]*=\(.*\)$:\1:'`
-      ;;
-    --*)
-      opt=`echo '' ${switch} | sed -e 's:^ ::' -e 's:^-*\(.*\)$:\1:'`
-      val='yes'
-      ;;
-  esac
-  ARGS="${ARGS} --${opt}='${val}'"
-  case "${opt}" in
-    *) eval "${opt}='${val}'";;
-  esac
-done
-
-if [ -z "${version}" ]; then
-   exit
-fi
-
-CVSROOT=:pserver:address@hidden:/gd/gnu/cvsroot
-export CVSROOT
-
-( cd .    ; cvs admin -s"p${version}" README )
-( cd lisp ; cvs admin -s"p${version}" w3-vars.el )
-( cd texi ; cvs admin -s"v${version}" w3.txi )
-( cd texi ; cvs admin -s"v${version}" w3-faq.txi )
-
-cd /usr/tmp/
-rm -fr w3
-cvs export -f -D now -kv w3
-cd w3
-autoconf
-rm -f lisp/auto-autoloads.el lisp/custom-load.el
-./configure --with-xemacs --with-custom=`pwd`/lisp
-make realversion
-cd
-rm -fr /usr/tmp/w3
-TAG=v`echo ${version} | tr . -`
-cvs rtag ${TAG} w3
diff --git a/build.bat b/build.bat
deleted file mode 100644
index bdad66d..0000000
--- a/build.bat
+++ /dev/null
@@ -1,30 +0,0 @@
address@hidden off
-
-set FALLBACKEMACSDIR=c:\emacs
-
-REM This allows the user to specify the emacs root on the command
-REM line.
-set COMMANDLINEGIVEN=yes
-if "%1" == "" set COMMANDLINEGIVEN=no
-if "%COMMANDLINEGIVEN%" == "yes" set EMACSDIR=%1
-
-REM If no emacs directory is set in the default environment, use our
-REM fallback.
-if "%EMACSDIR%" == "" echo EMACSDIR not set!  Using %FALLBACKEMACSDIR% as a 
default...
-if "%EMACSDIR%" == "" set EMACSDIR=%FALLBACKEMACSDIR%
-
-set EMACS=%EMACSDIR%\bin\emacs.exe
-set WIDGETDIR=%EMACSDIR%\lisp
-set GNUSDIR=%EMACSDIR%\lisp
-
-cd lisp
-copy w3-cfg.nt w3-cfg.el
-%EMACS% -batch -q -l ./docomp.el -f emacs-batch-build-autoloads . 
auto-autoloads.el
-%EMACS% -batch -q -l ./docomp.el -f emacs-batch-build-custom-load .
-%EMACS% -batch -q -l ./docomp.el -f compile-it
-cd ..
-
-cd texi
-%EMACS% -batch -q -no-site-file w3-faq.txi -l texinfmt -f 
texinfo-format-buffer -f save-buffer
-%EMACS% -batch -q -no-site-file w3.txi -l texinfmt -f texinfo-format-buffer -f 
save-buffer
-cd ..
diff --git a/configure b/configure
deleted file mode 100755
index 70414ec..0000000
--- a/configure
+++ /dev/null
@@ -1,1418 +0,0 @@
-#! /bin/sh
-
-# Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.13 
-# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
-#
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-
-# Defaults:
-ac_help=
-ac_default_prefix=/usr/local
-# Any additions from configure.in:
-ac_help="$ac_help
---with-xemacs             Use XEmacs to build"
-ac_help="$ac_help
---with-emacs              Use Emacs to build"
-ac_help="$ac_help
---with-makeinfo           Specify how to build info files"
-ac_help="$ac_help
---enable-site-install     Perform a sitewide installation"
-ac_help="$ac_help
---with-package-dir        Configure as a XEmacs package in directory"
-ac_help="$ac_help
---with-lispdir            Where to install lisp files"
-ac_help="$ac_help
---with-gnus               Specify where to find the gnus package"
-ac_help="$ac_help
---with-url                Specify where to find the URL package"
-
-# Initialize some variables set by options.
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-build=NONE
-cache_file=./config.cache
-exec_prefix=NONE
-host=NONE
-no_create=
-nonopt=NONE
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-target=NONE
-verbose=
-x_includes=NONE
-x_libraries=NONE
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datadir='${prefix}/share'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-libdir='${exec_prefix}/lib'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-infodir='${prefix}/info'
-mandir='${prefix}/man'
-
-# Initialize some other variables.
-subdirs=
-MFLAGS= MAKEFLAGS=
-SHELL=${CONFIG_SHELL-/bin/sh}
-# Maximum number of lines to put in a shell here document.
-ac_max_here_lines=12
-
-ac_prev=
-for ac_option
-do
-
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval "$ac_prev=\$ac_option"
-    ac_prev=
-    continue
-  fi
-
-  case "$ac_option" in
-  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
-  *) ac_optarg= ;;
-  esac
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case "$ac_option" in
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir="$ac_optarg" ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build="$ac_optarg" ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file="$ac_optarg" ;;
-
-  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
-  | --da=*)
-    datadir="$ac_optarg" ;;
-
-  -disable-* | --disable-*)
-    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
-      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 
1; }
-    fi
-    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
-    eval "enable_${ac_feature}=no" ;;
-
-  -enable-* | --enable-*)
-    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
-      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 
1; }
-    fi
-    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
-    case "$ac_option" in
-      *=*) ;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "enable_${ac_feature}='$ac_optarg'" ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix="$ac_optarg" ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he)
-    # Omit some internal or obsolete options to make the list less imposing.
-    # This message is too long to be a string in the A/UX 3.1 sh.
-    cat << EOF
-Usage: configure [options] [host]
-Options: [defaults in brackets after descriptions]
-Configuration:
-  --cache-file=FILE       cache test results in FILE
-  --help                  print this message
-  --no-create             do not create output files
-  --quiet, --silent       do not print \`checking...' messages
-  --version               print the version of autoconf that created configure
-Directory and file names:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-                          [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-                          [same as prefix]
-  --bindir=DIR            user executables in DIR [EPREFIX/bin]
-  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
-  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
-  --datadir=DIR           read-only architecture-independent data in DIR
-                          [PREFIX/share]
-  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
-  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
-                          [PREFIX/com]
-  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
-  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
-  --includedir=DIR        C header files in DIR [PREFIX/include]
-  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
-  --infodir=DIR           info documentation in DIR [PREFIX/info]
-  --mandir=DIR            man documentation in DIR [PREFIX/man]
-  --srcdir=DIR            find the sources in DIR [configure dir or ..]
-  --program-prefix=PREFIX prepend PREFIX to installed program names
-  --program-suffix=SUFFIX append SUFFIX to installed program names
-  --program-transform-name=PROGRAM
-                          run sed PROGRAM on installed program names
-EOF
-    cat << EOF
-Host type:
-  --build=BUILD           configure for building on BUILD [BUILD=HOST]
-  --host=HOST             configure for HOST [guessed]
-  --target=TARGET         configure for TARGET [TARGET=HOST]
-Features and packages:
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --x-includes=DIR        X include files are in DIR
-  --x-libraries=DIR       X library files are in DIR
-EOF
-    if test -n "$ac_help"; then
-      echo "--enable and --with options recognized:$ac_help"
-    fi
-    exit 0 ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host="$ac_optarg" ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir="$ac_optarg" ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir="$ac_optarg" ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir="$ac_optarg" ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir="$ac_optarg" ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst \
-  | --locals | --local | --loca | --loc | --lo)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
-  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
-    localstatedir="$ac_optarg" ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir="$ac_optarg" ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir="$ac_optarg" ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix="$ac_optarg" ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix="$ac_optarg" ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix="$ac_optarg" ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name="$ac_optarg" ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir="$ac_optarg" ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir="$ac_optarg" ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site="$ac_optarg" ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir="$ac_optarg" ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir="$ac_optarg" ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target="$ac_optarg" ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers)
-    echo "configure generated by autoconf version 2.13"
-    exit 0 ;;
-
-  -with-* | --with-*)
-    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
-      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 
1; }
-    fi
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    case "$ac_option" in
-      *=*) ;;
-      *) ac_optarg=yes ;;
-    esac
-    eval "with_${ac_package}='$ac_optarg'" ;;
-
-  -without-* | --without-*)
-    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
-    # Reject names that are not valid shell variable names.
-    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
-      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 
1; }
-    fi
-    ac_package=`echo $ac_package| sed 's/-/_/g'`
-    eval "with_${ac_package}=no" ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes="$ac_optarg" ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries="$ac_optarg" ;;
-
-  -*) { echo "configure: error: $ac_option: invalid option; use --help to show 
usage" 1>&2; exit 1; }
-    ;;
-
-  *)
-    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
-      echo "configure: warning: $ac_option: invalid host type" 1>&2
-    fi
-    if test "x$nonopt" != xNONE; then
-      { echo "configure: error: can only configure for one host and one target 
at a time" 1>&2; exit 1; }
-    fi
-    nonopt="$ac_option"
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  { echo "configure: error: missing argument to --`echo $ac_prev | sed 
's/_/-/g'`" 1>&2; exit 1; }
-fi
-
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 
2 15
-
-# File descriptor usage:
-# 0 standard input
-# 1 file creation
-# 2 errors and warnings
-# 3 some systems may open it to /dev/tty
-# 4 used on the Kubota Titan
-# 6 checking for... messages and results
-# 5 compiler messages saved in config.log
-if test "$silent" = yes; then
-  exec 6>/dev/null
-else
-  exec 6>&1
-fi
-exec 5>./config.log
-
-echo "\
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-" 1>&5
-
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Also quote any args containing shell metacharacters.
-ac_configure_args=
-for ac_arg
-do
-  case "$ac_arg" in
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c) ;;
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
-  *" "*|*"     "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
-  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
-  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
-  esac
-done
-
-# NLS nuisances.
-# Only set these to C if already set.  These must not be set unconditionally
-# because not all systems understand e.g. LANG=C (notably SCO).
-# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
-# Non-C LC_CTYPE values break the ctype check.
-if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
-if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
-if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
-if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo > confdefs.h
-
-# A filename unique to this package, relative to the directory that
-# configure is in, which we can look for to find out if srcdir is correct.
-ac_unique_file=configure.in
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then its parent.
-  ac_prog=$0
-  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
-  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
-  srcdir=$ac_confdir
-  if test ! -r $srcdir/$ac_unique_file; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r $srcdir/$ac_unique_file; then
-  if test "$ac_srcdir_defaulted" = yes; then
-    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; 
exit 1; }
-  else
-    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
-  fi
-fi
-srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
-
-# Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
-  if test "x$prefix" != xNONE; then
-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
-  else
-    CONFIG_SITE="$ac_default_prefix/share/config.site 
$ac_default_prefix/etc/config.site"
-  fi
-fi
-for ac_site_file in $CONFIG_SITE; do
-  if test -r "$ac_site_file"; then
-    echo "loading site script $ac_site_file"
-    . "$ac_site_file"
-  fi
-done
-
-if test -r "$cache_file"; then
-  echo "loading cache $cache_file"
-  . $cache_file
-else
-  echo "creating cache $cache_file"
-  > $cache_file
-fi
-
-ac_ext=c
-# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS 
conftest.$ac_ext $LIBS 1>&5'
-cross_compiling=$ac_cv_prog_cc_cross
-
-ac_exeext=
-ac_objext=o
-if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
-  # Stardent Vistra SVR4 grep lacks -e, says address@hidden
-  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
-    ac_n= ac_c='
-' ac_t='       '
-  else
-    ac_n=-n ac_c= ac_t=
-  fi
-else
-  ac_n= ac_c='\c' ac_t=
-fi
-
-
-
-
-
-ac_aux_dir=
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
-  if test -f $ac_dir/install-sh; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install-sh -c"
-    break
-  elif test -f $ac_dir/install.sh; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install.sh -c"
-    break
-  fi
-done
-if test -z "$ac_aux_dir"; then
-  { echo "configure: error: can not find install-sh or install.sh in $srcdir 
$srcdir/.. $srcdir/../.." 1>&2; exit 1; }
-fi
-ac_config_guess=$ac_aux_dir/config.guess
-ac_config_sub=$ac_aux_dir/config.sub
-ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
-
-# Find a good install program.  We prefer a C program (faster),
-# so one script is as good as another.  But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# ./install, which can be erroneously created by make from ./install.sh.
-echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:575: checking for a BSD compatible install" >&5
-if test -z "$INSTALL"; then
-
-  IFS="${IFS=  }"; ac_save_IFS="$IFS"; IFS=":"
-  for ac_dir in $PATH; do
-    # Account for people who put trailing slashes in PATH elements.
-    case "$ac_dir/" in
-    
/|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
-    *)
-      # OSF1 and SCO ODT 3.0 have their own names for install.
-      # Don't use installbsd from OSF since it installs stuff as root
-      # by default.
-      for ac_prog in ginstall scoinst install; do
-        if test -f $ac_dir/$ac_prog; then
-         if test $ac_prog = install &&
-            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
-           # AIX install.  It has an incompatible calling convention.
-           :
-         else
-           ac_cv_path_install="$ac_dir/$ac_prog -c"
-           break 2
-         fi
-       fi
-      done
-      ;;
-    esac
-  done
-  IFS="$ac_save_IFS"
-
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL="$ac_cv_path_install"
-  else
-    # As a last resort, use the slow shell script.  We don't cache a
-    # path for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the path is relative.
-    INSTALL="$ac_install_sh"
-  fi
-fi
-echo "$ac_t""$INSTALL" 1>&6
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-
-if test "${EMACS}" = "t"; then
-   EMACS=""
-fi
-
-# Check whether --with-xemacs or --without-xemacs was given.
-if test "${with_xemacs+set}" = set; then
-  withval="$with_xemacs"
-   if test "${withval}" = "yes"; then EMACS=xemacs; else EMACS=${withval}; fi 
-fi
-
-# Check whether --with-emacs or --without-emacs was given.
-if test "${with_emacs+set}" = set; then
-  withval="$with_emacs"
-   if test "${withval}" = "yes"; then EMACS=emacs; else EMACS=${withval}; fi 
-fi
-
-# Check whether --with-makeinfo or --without-makeinfo was given.
-if test "${with_makeinfo+set}" = set; then
-  withval="$with_makeinfo"
-   MAKEINFO="$withval" 
-fi
-
-# Check whether --enable-site-install or --disable-site-install was given.
-if test "${enable_site_install+set}" = set; then
-  enableval="$enable_site_install"
-   DOTEMACS='$(prefix)/share/emacs/site-lisp/default.el' 
-else
-   DOTEMACS=`( cd ; pwd)`/.emacs 
-fi
-
-
-# Extract the first word of "texi2html", so it can be a program name with args.
-set dummy texi2html; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:659: checking for $ac_word" >&5
-
-if test -n "$TEXI2HTML"; then
-  ac_cv_prog_TEXI2HTML="$TEXI2HTML" # Let the user override the test.
-else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_prog_TEXI2HTML="texi2html"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_prog_TEXI2HTML" && ac_cv_prog_TEXI2HTML="echo Cannot create 
html version of"
-fi
-TEXI2HTML="$ac_cv_prog_TEXI2HTML"
-if test -n "$TEXI2HTML"; then
-  echo "$ac_t""$TEXI2HTML" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-# Extract the first word of "xemacs", so it can be a program name with args.
-set dummy xemacs; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:686: checking for $ac_word" >&5
-
-if test -n "$EMACS"; then
-  ac_cv_prog_EMACS="$EMACS" # Let the user override the test.
-else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_prog_EMACS="xemacs"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_prog_EMACS" && ac_cv_prog_EMACS="emacs"
-fi
-EMACS="$ac_cv_prog_EMACS"
-if test -n "$EMACS"; then
-  echo "$ac_t""$EMACS" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-# Extract the first word of "makeinfo", so it can be a program name with args.
-set dummy makeinfo; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:713: checking for $ac_word" >&5
-
-if test -n "$MAKEINFO"; then
-  ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test.
-else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_prog_MAKEINFO="makeinfo"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_prog_MAKEINFO" && ac_cv_prog_MAKEINFO="\$(EMACS) -batch -q 
-l texinfmt -f batch-texinfo-format"
-fi
-MAKEINFO="$ac_cv_prog_MAKEINFO"
-if test -n "$MAKEINFO"; then
-  echo "$ac_t""$MAKEINFO" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-# Extract the first word of "install-info", so it can be a program name with 
args.
-set dummy install-info; ac_word=$2
-echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:740: checking for $ac_word" >&5
-
-if test -n "$INSTALLINFO"; then
-  ac_cv_prog_INSTALLINFO="$INSTALLINFO" # Let the user override the test.
-else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
-  ac_dummy="$PATH"
-  for ac_dir in $ac_dummy; do
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$ac_word; then
-      ac_cv_prog_INSTALLINFO="install-info"
-      break
-    fi
-  done
-  IFS="$ac_save_ifs"
-  test -z "$ac_cv_prog_INSTALLINFO" && ac_cv_prog_INSTALLINFO="true"
-fi
-INSTALLINFO="$ac_cv_prog_INSTALLINFO"
-if test -n "$INSTALLINFO"; then
-  echo "$ac_t""$INSTALLINFO" 1>&6
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-
-
-# Check whether --with-package-dir or --without-package-dir was given.
-if test "${with_package_dir+set}" = set; then
-  withval="$with_package_dir"
-   EMACS_PACKAGE_DIR="${withval}"
-fi
-
-if test -n "$EMACS_PACKAGE_DIR"; then
-  if test "$prefix" != "NONE"; then
-       { echo "configure: error: --with-package-dir and --prefix are mutually 
exclusive" 1>&2; exit 1; }
-  fi
-    prefix=$EMACS_PACKAGE_DIR
-  datadir='$(prefix)/etc/w3'
-  infodir='$(prefix)/info'
-  lispdir='$(prefix)/lisp/w3'
-fi
-
-
-
-  
-  echo $ac_n "checking if $EMACS is really XEmacs""... $ac_c" 1>&6
-echo "configure:786: checking if $EMACS is really XEmacs" >&5
-  
-elisp="(if (string-match \"XEmacs\" emacs-version) \"yes\" \"no\") "
-if test -z ""noecho""; then
-       echo $ac_n "checking for xemacsp""... $ac_c" 1>&6
-echo "configure:791: checking for xemacsp" >&5
-fi
-
-
-       OUTPUT=./conftest-$$
-       echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if 
(stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1  
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
-       retval=`cat ${OUTPUT}`
-       echo "=> ${retval}" >& 5 2>&1
-       rm -f ${OUTPUT}
-       EMACS_cv_SYS_xemacsp=$retval
-
-
-xemacsp=${EMACS_cv_SYS_xemacsp}
-if test -z ""noecho""; then
-       echo "$ac_t""$xemacsp" 1>&6
-fi
-
-  XEMACS=${EMACS_cv_SYS_xemacsp}
-  EMACS_FLAVOR=emacs
-  if test "$XEMACS" = "yes"; then
-     EMACS_FLAVOR=xemacs
-  fi
-  echo "$ac_t""$XEMACS" 1>&6
-  
-  
-
-  if test "$prefix" = "NONE"; then
-       echo $ac_n "checking prefix for your Emacs""... $ac_c" 1>&6
-echo "configure:820: checking prefix for your Emacs" >&5
-       
-elisp="(expand-file-name \"..\" invocation-directory)"
-if test -z ""noecho""; then
-       echo $ac_n "checking for prefix""... $ac_c" 1>&6
-echo "configure:825: checking for prefix" >&5
-fi
-
-
-       OUTPUT=./conftest-$$
-       echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if 
(stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1  
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
-       retval=`cat ${OUTPUT}`
-       echo "=> ${retval}" >& 5 2>&1
-       rm -f ${OUTPUT}
-       EMACS_cv_SYS_prefix=$retval
-
-
-prefix=${EMACS_cv_SYS_prefix}
-if test -z ""noecho""; then
-       echo "$ac_t""$prefix" 1>&6
-fi
-
-       prefix=${EMACS_cv_SYS_prefix}
-       echo "$ac_t""$prefix" 1>&6
-  fi
-  # Check whether --with-lispdir or --without-lispdir was given.
-if test "${with_lispdir+set}" = set; then
-  withval="$with_lispdir"
-  lispdir=${withval}
-fi
-
-  echo $ac_n "checking where .elc files should go""... $ac_c" 1>&6
-echo "configure:853: checking where .elc files should go" >&5
-  if test -z "$lispdir"; then
-        theprefix=$prefix
-    if test "x$theprefix" = "xNONE"; then
-       theprefix=$ac_default_prefix
-    fi
-    lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp"
-    for thedir in share lib; do
-       potential=
-       if test -d ${theprefix}/${thedir}/${EMACS_FLAVOR}/site-lisp; then
-          lispdir="\$(prefix)/${thedir}/${EMACS_FLAVOR}/site-lisp"
-          break
-       fi
-    done
-  fi
-  echo "$ac_t""$lispdir" 1>&6
-  
-
-
-
-echo $ac_n "checking for emacs version""... $ac_c" 1>&6
-echo "configure:874: checking for emacs version" >&5
-
-elisp="(and (boundp 'emacs-major-version) (format \"%d.%d\" 
emacs-major-version emacs-minor-version))"
-if test -z ""noecho""; then
-       echo $ac_n "checking for version""... $ac_c" 1>&6
-echo "configure:879: checking for version" >&5
-fi
-
-
-       OUTPUT=./conftest-$$
-       echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if 
(stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1  
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
-       retval=`cat ${OUTPUT}`
-       echo "=> ${retval}" >& 5 2>&1
-       rm -f ${OUTPUT}
-       EMACS_cv_SYS_version=$retval
-
-
-version=${EMACS_cv_SYS_version}
-if test -z ""noecho""; then
-       echo "$ac_t""$version" 1>&6
-fi
-
-
-EMACS_VERSION=${EMACS_cv_SYS_version}
-
-echo "$ac_t""${EMACS_VERSION}" 1>&6
-
-
-echo $ac_n "checking for recent gnus version""... $ac_c" 1>&6
-echo "configure:904: checking for recent gnus version" >&5
-
-
-
-if test -z ""noecho""; then
-       echo $ac_n "checking for mm-get-content-id in mm_decode""... $ac_c" 1>&6
-echo "configure:910: checking for mm-get-content-id in mm_decode" >&5
-fi
-library=`echo mm_decode | tr _ -`
-
-elisp="(progn (fmakunbound 'mm-get-content-id) (condition-case nil (progn 
(require '$library) (fboundp 'mm-get-content-id)) (error (prog1 nil (message 
\"$library not found\")))))"
-if test -z ""noecho""; then
-       echo $ac_n "checking for mm_decode""... $ac_c" 1>&6
-echo "configure:917: checking for mm_decode" >&5
-fi
-
-
-       OUTPUT=./conftest-$$
-       echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if 
(stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1  
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
-       retval=`cat ${OUTPUT}`
-       echo "=> ${retval}" >& 5 2>&1
-       rm -f ${OUTPUT}
-       EMACS_cv_SYS_mm_decode=$retval
-
-
-mm_decode=${EMACS_cv_SYS_mm_decode}
-if test -z ""noecho""; then
-       echo "$ac_t""$mm_decode" 1>&6
-fi
-
-if test "${EMACS_cv_SYS_mm_decode}" = "nil"; then
-       EMACS_cv_SYS_mm_decode=no
-fi
-if test "${EMACS_cv_SYS_mm_decode}" = "t"; then
-       EMACS_cv_SYS_mm_decode=yes
-fi
-HAVE_mm_decode=${EMACS_cv_SYS_mm_decode}
-
-if test -z ""noecho""; then
-       echo "$ac_t""$HAVE_mm_decode" 1>&6
-fi
-
-if test "${HAVE_mm_decode}" = "yes"; then
-       EMACS_cv_ACCEPTABLE_GNUS=yes
-else
-       EMACS_cv_ACCEPTABLE_GNUS=no
-fi
-
-if test "${EMACS_cv_ACCEPTABLE_GNUS}" = "yes"; then
-       
-elisp="(file-name-directory (locate-library \"mm-decode\"))"
-if test -z ""noecho""; then
-       echo $ac_n "checking for gnus_dir""... $ac_c" 1>&6
-echo "configure:958: checking for gnus_dir" >&5
-fi
-
-
-       OUTPUT=./conftest-$$
-       echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if 
(stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1  
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
-       retval=`cat ${OUTPUT}`
-       echo "=> ${retval}" >& 5 2>&1
-       rm -f ${OUTPUT}
-       EMACS_cv_SYS_gnus_dir=$retval
-
-
-gnus_dir=${EMACS_cv_SYS_gnus_dir}
-if test -z ""noecho""; then
-       echo "$ac_t""$gnus_dir" 1>&6
-fi
-
-       EMACS_cv_ACCEPTABLE_GNUS=$EMACS_cv_SYS_gnus_dir
-fi
-
-
-   # Check whether --with-gnus or --without-gnus was given.
-if test "${with_gnus+set}" = set; then
-  withval="$with_gnus"
-   EMACS_cv_ACCEPTABLE_GNUS=`( cd $withval && pwd || echo "$withval" ) 2> 
/dev/null` 
-fi
-
-   GNUS=${EMACS_cv_ACCEPTABLE_GNUS}
-   
-   echo "$ac_t"""${GNUS}"" 1>&6
-
-
-echo $ac_n "checking for recent URL version""... $ac_c" 1>&6
-echo "configure:992: checking for recent URL version" >&5
-
-
-
-if test -z ""noecho""; then
-       echo $ac_n "checking for url-scheme-get-property in url_methods""... 
$ac_c" 1>&6
-echo "configure:998: checking for url-scheme-get-property in url_methods" >&5
-fi
-library=`echo url_methods | tr _ -`
-
-elisp="(progn (fmakunbound 'url-scheme-get-property) (condition-case nil 
(progn (require '$library) (fboundp 'url-scheme-get-property)) (error (prog1 
nil (message \"$library not found\")))))"
-if test -z ""noecho""; then
-       echo $ac_n "checking for url_methods""... $ac_c" 1>&6
-echo "configure:1005: checking for url_methods" >&5
-fi
-
-
-       OUTPUT=./conftest-$$
-       echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if 
(stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1  
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
-       retval=`cat ${OUTPUT}`
-       echo "=> ${retval}" >& 5 2>&1
-       rm -f ${OUTPUT}
-       EMACS_cv_SYS_url_methods=$retval
-
-
-url_methods=${EMACS_cv_SYS_url_methods}
-if test -z ""noecho""; then
-       echo "$ac_t""$url_methods" 1>&6
-fi
-
-if test "${EMACS_cv_SYS_url_methods}" = "nil"; then
-       EMACS_cv_SYS_url_methods=no
-fi
-if test "${EMACS_cv_SYS_url_methods}" = "t"; then
-       EMACS_cv_SYS_url_methods=yes
-fi
-HAVE_url_methods=${EMACS_cv_SYS_url_methods}
-
-if test -z ""noecho""; then
-       echo "$ac_t""$HAVE_url_methods" 1>&6
-fi
-
-if test "${HAVE_url_methods}" = "yes"; then
-       EMACS_cv_ACCEPTABLE_URL=yes
-else
-       EMACS_cv_ACCEPTABLE_URL=no
-fi
-
-if test "${EMACS_cv_ACCEPTABLE_URL}" = "yes"; then
-       
-elisp="(file-name-directory (locate-library \"url-methods\"))"
-if test -z ""noecho""; then
-       echo $ac_n "checking for url_dir""... $ac_c" 1>&6
-echo "configure:1046: checking for url_dir" >&5
-fi
-
-
-       OUTPUT=./conftest-$$
-       echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if 
(stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1  
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
-       retval=`cat ${OUTPUT}`
-       echo "=> ${retval}" >& 5 2>&1
-       rm -f ${OUTPUT}
-       EMACS_cv_SYS_url_dir=$retval
-
-
-url_dir=${EMACS_cv_SYS_url_dir}
-if test -z ""noecho""; then
-       echo "$ac_t""$url_dir" 1>&6
-fi
-
-       EMACS_cv_ACCEPTABLE_URL=$EMACS_cv_SYS_url_dir
-fi
-
-
-   # Check whether --with-url or --without-url was given.
-if test "${with_url+set}" = set; then
-  withval="$with_url"
-   EMACS_cv_ACCEPTABLE_URL=`( cd $withval && pwd || echo "$withval" ) 2> 
/dev/null` 
-fi
-
-   URL=${EMACS_cv_ACCEPTABLE_URL}
-   
-   echo "$ac_t"""${URL}"" 1>&6
-
-
-echo $ac_n "checking how to rebuild custom autoloads""... $ac_c" 1>&6
-echo "configure:1080: checking how to rebuild custom autoloads" >&5
-
-
-
-if test -z ""noecho""; then
-       echo $ac_n "checking for Custom-make-dependencies in cus_dep""... 
$ac_c" 1>&6
-echo "configure:1086: checking for Custom-make-dependencies in cus_dep" >&5
-fi
-library=`echo cus_dep | tr _ -`
-
-elisp="(progn (fmakunbound 'Custom-make-dependencies) (condition-case nil 
(progn (require '$library) (fboundp 'Custom-make-dependencies)) (error (prog1 
nil (message \"$library not found\")))))"
-if test -z ""noecho""; then
-       echo $ac_n "checking for cus_dep""... $ac_c" 1>&6
-echo "configure:1093: checking for cus_dep" >&5
-fi
-
-
-       OUTPUT=./conftest-$$
-       echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if 
(stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1  
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
-       retval=`cat ${OUTPUT}`
-       echo "=> ${retval}" >& 5 2>&1
-       rm -f ${OUTPUT}
-       EMACS_cv_SYS_cus_dep=$retval
-
-
-cus_dep=${EMACS_cv_SYS_cus_dep}
-if test -z ""noecho""; then
-       echo "$ac_t""$cus_dep" 1>&6
-fi
-
-if test "${EMACS_cv_SYS_cus_dep}" = "nil"; then
-       EMACS_cv_SYS_cus_dep=no
-fi
-if test "${EMACS_cv_SYS_cus_dep}" = "t"; then
-       EMACS_cv_SYS_cus_dep=yes
-fi
-HAVE_cus_dep=${EMACS_cv_SYS_cus_dep}
-
-if test -z ""noecho""; then
-       echo "$ac_t""$HAVE_cus_dep" 1>&6
-fi
-
-EMACS_cv_REBUILD_CUSTOMLOADS=${HAVE_cus_dep}
-
-
-if test "${EMACS_cv_REBUILD_CUSTOMLOADS}" != "no"; then
-   REBUILD_CUSTOMLOADS='$(EMACS) $(BATCHFLAGS) -l cus-dep -f 
Custom-make-dependencies $(srcdir)'
-else
-   REBUILD_CUSTOMLOADS='$(EMACS) $(BATCHFLAGS) $(DEPS) -f 
emacs-batch-build-custom-load $(srcdir)'
-fi
-echo "$ac_t"""${REBUILD_CUSTOMLOADS}"" 1>&6
-
-
-
-if test "${URL}" = "no"; then
-   { echo "configure: error: "Could not find URL package.  Please use the 
--with-url=DIRECTORY flag."" 1>&2; exit 1; }
-fi
-
-if test "${GNUS}" = "no"; then
-   { echo "configure: error: "Could not find Gnus package.  Please use the 
--with-gnus=DIRECTORY flag."" 1>&2; exit 1; }
-fi
-
-if test "${MAKEINFO}" = "no"; then
-   MAKEINFO='$(EMACS) -batch -q -l texinfmt -f batch-texinfo-format'
-fi
-
-if test "${TEXI2HTML}" = "texi2html"; then
-   TEXI2HTML_FLAGS="-menu -glossary -number -split_node"
-fi
-
-
-
-
-
-
-
-
-
-
-if test "${GNUS}" != "no"; then
-CIDFILE=url-cid.el
-
-fi
-
-trap '' 1 2 15
-
-trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 
2 15
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-# Any assignment to VPATH causes Sun make to only execute
-# the first set of double-colon rules, so remove it if not needed.
-# If there is a colon in the path, we need to keep it.
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[        ]*VPATH[        ]*=[^:]*$/d'
-fi
-
-trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
-
-# Transform confdefs.h into DEFS.
-# Protect against shell expansion while executing Makefile rules.
-# Protect against Makefile macro expansion.
-cat > conftest.defs <<\EOF
-s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
-s%[    `~#$^&*(){}\\|;'"<>?]%\\&%g
-s%\[%\\&%g
-s%\]%\\&%g
-s%\$%$$%g
-EOF
-DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
-rm -f conftest.defs
-
-
-# Without the "./", some shells look in PATH for config.status.
-: ${CONFIG_STATUS=./config.status}
-
-echo creating $CONFIG_STATUS
-rm -f $CONFIG_STATUS
-cat > $CONFIG_STATUS <<EOF
-#! /bin/sh
-# Generated automatically by configure.
-# Run this file to recreate the current configuration.
-# This directory was configured as follows,
-# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-#
-# $0 $ac_configure_args
-#
-# Compiler output produced by configure, useful for debugging
-# configure, is in ./config.log if it exists.
-
-ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
-for ac_option
-do
-  case "\$ac_option" in
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create 
--no-recursion"
-    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create 
--no-recursion ;;
-  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
-    echo "$CONFIG_STATUS generated by autoconf version 2.13"
-    exit 0 ;;
-  -help | --help | --hel | --he | --h)
-    echo "\$ac_cs_usage"; exit 0 ;;
-  *) echo "\$ac_cs_usage"; exit 1 ;;
-  esac
-done
-
-ac_given_srcdir=$srcdir
-ac_given_INSTALL="$INSTALL"
-
-trap 'rm -fr `echo "Makefile
-         etc/Makefile
-         texi/Makefile
-         lisp/Makefile
-         lisp/w3-cfg.el
-         " | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
-EOF
-cat >> $CONFIG_STATUS <<EOF
-
-# Protect against being on the right side of a sed subst in config.status.
-sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
- s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
-$ac_vpsub
-$extrasub
address@hidden@%$SHELL%g
address@hidden@%$CFLAGS%g
address@hidden@%$CPPFLAGS%g
address@hidden@%$CXXFLAGS%g
address@hidden@%$FFLAGS%g
address@hidden@%$DEFS%g
address@hidden@%$LDFLAGS%g
address@hidden@%$LIBS%g
address@hidden@%$exec_prefix%g
address@hidden@%$prefix%g
address@hidden@%$program_transform_name%g
address@hidden@%$bindir%g
address@hidden@%$sbindir%g
address@hidden@%$libexecdir%g
address@hidden@%$datadir%g
address@hidden@%$sysconfdir%g
address@hidden@%$sharedstatedir%g
address@hidden@%$localstatedir%g
address@hidden@%$libdir%g
address@hidden@%$includedir%g
address@hidden@%$oldincludedir%g
address@hidden@%$infodir%g
address@hidden@%$mandir%g
address@hidden@%$INSTALL_PROGRAM%g
address@hidden@%$INSTALL_SCRIPT%g
address@hidden@%$INSTALL_DATA%g
address@hidden@%$TEXI2HTML%g
address@hidden@%$EMACS%g
address@hidden@%$MAKEINFO%g
address@hidden@%$INSTALLINFO%g
address@hidden@%$EMACS_PACKAGE_DIR%g
address@hidden@%$XEMACS%g
address@hidden@%$EMACS_FLAVOR%g
address@hidden@%$lispdir%g
address@hidden@%$EMACS_VERSION%g
address@hidden@%$HAVE_mm_decode%g
address@hidden@%$GNUS%g
address@hidden@%$HAVE_url_methods%g
address@hidden@%$URL%g
address@hidden@%$HAVE_cus_dep%g
address@hidden@%$REBUILD_CUSTOMLOADS%g
address@hidden@%$INSTALL%g
address@hidden@%$DOTEMACS%g
address@hidden@%$TEXI2HTML_FLAGS%g
address@hidden@%$CIDFILE%g
-
-CEOF
-EOF
-
-cat >> $CONFIG_STATUS <<\EOF
-
-# Split the substitutions into bite-sized pieces for seds with
-# small command number limits, like on Digital OSF/1 and HP-UX.
-ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
-ac_file=1 # Number of current file.
-ac_beg=1 # First line for current file.
-ac_end=$ac_max_sed_cmds # Line after last line for current file.
-ac_more_lines=:
-ac_sed_cmds=""
-while $ac_more_lines; do
-  if test $ac_beg -gt 1; then
-    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
-  else
-    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
-  fi
-  if test ! -s conftest.s$ac_file; then
-    ac_more_lines=false
-    rm -f conftest.s$ac_file
-  else
-    if test -z "$ac_sed_cmds"; then
-      ac_sed_cmds="sed -f conftest.s$ac_file"
-    else
-      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
-    fi
-    ac_file=`expr $ac_file + 1`
-    ac_beg=$ac_end
-    ac_end=`expr $ac_end + $ac_max_sed_cmds`
-  fi
-done
-if test -z "$ac_sed_cmds"; then
-  ac_sed_cmds=cat
-fi
-EOF
-
-cat >> $CONFIG_STATUS <<EOF
-
-CONFIG_FILES=\${CONFIG_FILES-"Makefile
-         etc/Makefile
-         texi/Makefile
-         lisp/Makefile
-         lisp/w3-cfg.el
-         "}
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
-  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
-  case "$ac_file" in
-  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
-       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
-  *) ac_file_in="${ac_file}.in" ;;
-  esac
-
-  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
-
-  # Remove last slash and all that follows it.  Not all systems have dirname.
-  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
-  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
-    # The file is in a subdirectory.
-    test ! -d "$ac_dir" && mkdir "$ac_dir"
-    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
-    # A "../" for each directory in $ac_dir_suffix.
-    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
-  else
-    ac_dir_suffix= ac_dots=
-  fi
-
-  case "$ac_given_srcdir" in
-  .)  srcdir=.
-      if test -z "$ac_dots"; then top_srcdir=.
-      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
-  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
-  *) # Relative path.
-    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
-    top_srcdir="$ac_dots$ac_given_srcdir" ;;
-  esac
-
-  case "$ac_given_INSTALL" in
-  [/$]*) INSTALL="$ac_given_INSTALL" ;;
-  *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
-  esac
-
-  echo creating "$ac_file"
-  rm -f "$ac_file"
-  configure_input="Generated automatically from `echo $ac_file_in|sed 
's%.*/%%'` by configure."
-  case "$ac_file" in
-  *Makefile*) ac_comsub="1i\\
-# $configure_input" ;;
-  *) ac_comsub= ;;
-  esac
-
-  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% 
$ac_given_srcdir/%g"`
-  sed -e "$ac_comsub
address@hidden@%$configure_input%g
address@hidden@%$srcdir%g
address@hidden@%$top_srcdir%g
address@hidden@%$INSTALL%g
-" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
-fi; done
-rm -f conftest.s*
-
-EOF
-cat >> $CONFIG_STATUS <<EOF
-
-EOF
-cat >> $CONFIG_STATUS <<\EOF
-
-exit 0
-EOF
-chmod +x $CONFIG_STATUS
-rm -fr confdefs* $ac_clean_files
-test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
-
-
-echo "$ac_t""" "" 1>&6
-echo "$ac_t"""Sucessfully configured Emacs/W3"" 1>&6
-if test -n "$EMACS_PACKAGE_DIR"; then
-   echo "$ac_t"""Using package root:                ${EMACS_PACKAGE_DIR}"" 1>&6
-fi
-echo "$ac_t"""Using custom package installed in: ${CUSTOM}"" 1>&6
-echo "$ac_t"""Emacs/W3 will be compiled with:    ${EMACS}"" 1>&6
-echo "$ac_t""" "" 1>&6
-echo "$ac_t"""To finish building Emacs/W3 type \'make\' now."" 1>&6
-echo "$ac_t"""To install Emacs/W3 type \'make install\'."" 1>&6
-echo "$ac_t"""To create autoloads in \'${DOTEMACS}\' type \'make dotemacs\'"" 
1>&6
diff --git a/configure.in b/configure.in
deleted file mode 100644
index d632b94..0000000
--- a/configure.in
+++ /dev/null
@@ -1,88 +0,0 @@
-AC_INIT(configure.in)
-AC_PREREQ(2.4)
-
-dnl Disable cache files:
-dnl This is controversial, but I am convinced this is the right way to go,
-dnl at least by default.  Otherwise there are too many surprises.
-define([AC_CACHE_LOAD], )dnl
-define([AC_CACHE_SAVE], )dnl
-define([AC_CACHE_VAL], [
-$2
-])dnl
-
-AC_PROG_INSTALL
-
-dnl
-dnl Apparently, if you run a shell window in Emacs, it sets the EMACS
-dnl environment variable to 't'.  Lets undo the damage.
-dnl
-if test "${EMACS}" = "t"; then
-   EMACS=""
-fi
-
-AC_ARG_WITH(xemacs,           --with-xemacs             Use XEmacs to build, [ 
if test "${withval}" = "yes"; then EMACS=xemacs; else EMACS=${withval}; fi ])
-AC_ARG_WITH(emacs,            --with-emacs              Use Emacs to build, [ 
if test "${withval}" = "yes"; then EMACS=emacs; else EMACS=${withval}; fi ])
-AC_ARG_WITH(makeinfo,         --with-makeinfo           Specify how to build 
info files, [ MAKEINFO="$withval" ])
-AC_ARG_ENABLE(site-install,   --enable-site-install     Perform a sitewide 
installation, [ DOTEMACS='$(prefix)/share/emacs/site-lisp/default.el' ], [ 
DOTEMACS=`( cd ; pwd)`/.emacs ])
-
-AC_CHECK_PROG(TEXI2HTML, texi2html, texi2html, echo Cannot create html version 
of)
-AC_CHECK_PROG(EMACS, xemacs, xemacs, emacs)
-AC_CHECK_PROG(MAKEINFO, makeinfo, makeinfo, \$(EMACS) -batch -q -l texinfmt -f 
batch-texinfo-format)
-AC_CHECK_PROG(INSTALLINFO, install-info, install-info, true)
-
-AC_EMACS_PACKAGES
-AC_PATH_LISPDIR
-
-AC_EMACS_VERSION
-AC_CHECK_GNUS
-AC_CHECK_URL
-AC_CHECK_CUSTOMLOADS
-
-if test "${URL}" = "no"; then
-   AC_MSG_ERROR("Could not find URL package.  Please use the 
--with-url=DIRECTORY flag.")
-fi
-
-if test "${GNUS}" = "no"; then
-   AC_MSG_ERROR("Could not find Gnus package.  Please use the 
--with-gnus=DIRECTORY flag.")
-fi
-
-if test "${MAKEINFO}" = "no"; then
-   MAKEINFO='$(EMACS) -batch -q -l texinfmt -f batch-texinfo-format'
-fi
-
-if test "${TEXI2HTML}" = "texi2html"; then
-   TEXI2HTML_FLAGS="-menu -glossary -number -split_node"
-fi
-
-AC_SUBST(EMACS_PACKAGE_DIR)
-AC_SUBST(MAKEINFO)
-AC_SUBST(EMACS)
-AC_SUBST(INSTALL)
-AC_SUBST(INSTALLINFO)
-AC_SUBST(DOTEMACS)
-AC_SUBST(TEXI2HTML)
-AC_SUBST(TEXI2HTML_FLAGS)
-
-if test "${GNUS}" != "no"; then
-CIDFILE=url-cid.el
-AC_SUBST(CIDFILE)
-fi
-
-AC_OUTPUT(Makefile
-         etc/Makefile
-         texi/Makefile
-         lisp/Makefile
-         lisp/w3-cfg.el
-         )
-
-AC_MSG_RESULT(" ")
-AC_MSG_RESULT("Sucessfully configured Emacs/W3")
-if test -n "$EMACS_PACKAGE_DIR"; then
-   AC_MSG_RESULT("Using package root:                ${EMACS_PACKAGE_DIR}")
-fi
-AC_MSG_RESULT("Using custom package installed in: ${CUSTOM}")
-AC_MSG_RESULT("Emacs/W3 will be compiled with:    ${EMACS}")
-AC_MSG_RESULT(" ")
-AC_MSG_RESULT("To finish building Emacs/W3 type \'make\' now.")
-AC_MSG_RESULT("To install Emacs/W3 type \'make install\'.")
-AC_MSG_RESULT("To create autoloads in \'${DOTEMACS}\' type \'make dotemacs\'")
diff --git a/css.el b/css.el
index 5e87560..f848c82 100644
--- a/css.el
+++ b/css.el
@@ -1,31 +1,29 @@
-;;; css.el -- Cascading Style Sheet parser
+;;; css.el --- Cascading Style Sheet parser
+
+;; Copyright (c) 1996-2001, 2007, 2013 Free Software Foundation, Inc.
+
 ;; Author: $Author: legoscia $
 ;; Created: $Date: 2007/11/15 12:28:29 $
-;; Version: $Revision: 1.12 $
 ;; Keywords: 
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996, 97, 98, 1999, 2000, 2001, 2007 Free Software 
Foundation, Inc.
-;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
 
 (eval-and-compile
   (require 'cl)
@@ -34,14 +32,14 @@
 (autoload 'url-insert-file-contents "url-handlers")
 (autoload 'url-view-url "url-util")
 
-(if (not (fboundp 'frame-char-height))
+(if (eval-when-compile (not (fboundp 'frame-char-height)))
     (defun frame-char-height (&optional frame)
       "Height in pixels of a line in the font in frame FRAME.
 If FRAME is omitted, the selected frame is used.
 For a terminal frame, the value is always 1."
       (font-height (face-font 'default frame))))
 
-(if (not (fboundp 'frame-char-width))
+(if (eval-when-compile (not (fboundp 'frame-char-width)))
     (defun frame-char-width (&optional frame)
       "Width in pixels of characters in the font in frame FRAME.
 If FRAME is omitted, the selected frame is used.
@@ -176,11 +174,9 @@ For a terminal screen, the value is always 1."
 (put 'border 'css-shorthand t)
 (put 'list-style 'css-shorthand t)
 
-(mapcar
- (lambda (entry)
-   (put (aref entry 0) 'css-inherit (aref entry 1))
-   (put (aref entry 0) 'css-type    (aref entry 2)))
- css-properties)
+(dolist (entry css-properties)
+  (put (aref entry 0) 'css-inherit (aref entry 1))
+  (put (aref entry 0) 'css-type    (aref entry 2)))
 
 (defconst css-weights
   '(nil                                        ;never used
@@ -196,25 +192,23 @@ For a terminal screen, the value is always 1."
   "List of CSS font weights.")
 
 (defvar css-syntax-table
-  (copy-syntax-table emacs-lisp-mode-syntax-table)
+  (let ((st (copy-syntax-table emacs-lisp-mode-syntax-table)))
+    (modify-syntax-entry ?' "\"" st)
+    (modify-syntax-entry ?` "\"" st)
+    (modify-syntax-entry ?{ "(" st)
+    (modify-syntax-entry ?} ")" st)
+    st)
   "The syntax table for parsing stylesheets")
 
-(modify-syntax-entry ?' "\"" css-syntax-table)
-(modify-syntax-entry ?` "\"" css-syntax-table)
-(modify-syntax-entry ?{ "(" css-syntax-table)
-(modify-syntax-entry ?} ")" css-syntax-table)
-
-(eval-when-compile
-  (defvar css-scratch-val nil)
-  (defvar css-scratch-id nil)
-  (defvar css-scratch-class nil)
-  (defvar css-scratch-possibles nil)
-  (defvar css-scratch-current nil)
-  (defvar css-scratch-classes nil)
-  (defvar css-scratch-class-match nil)
-  (defvar css-scratch-current-rule nil)
-  (defvar css-scratch-current-value nil)
-  )
+(defvar css-scratch-val)
+(defvar css-scratch-id)
+(defvar css-scratch-class)
+(defvar css-scratch-possibles)
+(defvar css-scratch-current)
+(defvar css-scratch-classes)
+(defvar css-scratch-class-match)
+(defvar css-scratch-current-rule)
+(defvar css-scratch-current-value)
 
 (defsubst css-replace-regexp (regexp to-string)
   (goto-char (point-min))
@@ -253,11 +247,10 @@ For a terminal screen, the value is always 1."
       (setq rule (cdr rule)))
     matched))
 
-(defsubst css-get-internal (tag args)
-  (declare (special tag sheet element-stack default))
+(defsubst css-get-internal (tag args sheet element-stack)
   (setq css-scratch-id (or (cdr-safe (assq 'id args))
                           (cdr-safe (assq 'name args)))
-       css-scratch-class (or (cdr-safe (assq 'class args)) t)  
+       css-scratch-class (or (cdr-safe (assq 'class args)) t)
        css-scratch-possibles (gethash tag sheet))
   (while css-scratch-possibles
     (setq css-scratch-current (car css-scratch-possibles)
@@ -298,14 +291,14 @@ For a terminal screen, the value is always 1."
 
   ;; check for things without the class
   (if (listp css-scratch-class)
-      (css-get-internal tag nil))
+      (css-get-internal tag nil sheet element-stack))
 
   ;; check for global class values
-  (css-get-internal '*document args)
+  (css-get-internal '*document args sheet element-stack)
 
   ;; Now check for things with the class - they will be stuck on the front
   ;; of the list, which will mean we do the right thing
-  (css-get-internal tag args)
+  (css-get-internal tag args sheet element-stack)
 
   ;; Defaults are up to the calling application to provide
   css-scratch-val)
@@ -394,13 +387,6 @@ For a terminal screen, the value is always 1."
          (push (cons 'font-family (css-expand-value 'string-list family)) 
retval))
       retval)))
 
-(if (not (fboundp 'frame-char-height))
-    (defun frame-char-height (&optional frame)
-      "Height in pixels of a line in the font in frame FRAME.
-If FRAME is omitted, the selected frame is used.
-For a terminal frame, the value is always 1."
-      (font-height (face-font 'default frame))))
-
 (defun css-expand-length (spec &optional height)
   (cond
    ((not (stringp spec)) spec)
@@ -409,13 +395,13 @@ For a terminal frame, the value is always 1."
         (fboundp 'frame-char-height))
     ;; A percentage
     ;; XXX: should be relative to encosing element
-    (setq spec (/ (string-to-int (match-string 1 spec)) 100.0))
+    (setq spec (/ (string-to-number (match-string 1 spec)) 100.0))
     (if height
        (round (* (frame-char-height) spec))
       (max 0 (round (* (frame-char-width) spec)))))
    ((string-match "\\([+-]?\\([0-9]+\\|[0-9]*\\.[0-9]+\\)\\)%" spec)
     ;; No frame-char-width/height
-    (setq spec (/ (string-to-int (match-string 1 spec)) 100.0))
+    (setq spec (/ (string-to-number (match-string 1 spec)) 100.0))
     (if height
        (max 0 (round (* (/ (frame-pixel-height) (frame-height)) spec)))
       (max 0 (round (* (/ (frame-pixel-width) (frame-width)) spec)))))
@@ -460,7 +446,7 @@ For a terminal frame, the value is always 1."
                        "\\|") "\\)$")))
 
 (defun css-expand-color (color)
-  (condition-case e
+  (condition-case _
       (cond
        ((string-match "^\\(transparent\\|none\\)$" color)
        (setq color nil))
@@ -492,9 +478,9 @@ For a terminal frame, the value is always 1."
        ;; rgb(r,g,b) 0 - 255, cutting off at 255
        (setq color (vector
                     'rgb
-                    (min (string-to-int (match-string 1 color)) 255)
-                    (min (string-to-int (match-string 2 color)) 255)
-                    (min (string-to-int (match-string 3 color)) 255))))
+                    (min (string-to-number (match-string 1 color)) 255)
+                    (min (string-to-number (match-string 2 color)) 255)
+                    (min (string-to-number (match-string 3 color)) 255))))
        ((string-match "^rgb *( *\\([0-9]+\\) *%[, ]+\\([0-9]+\\) *%[, 
]+\\([0-9]+\\) *% *) *$" color)
        ;; rgb(r%,g%,b%) 0 - 100%, cutting off at 100%
        (let ((r (min (string-to-number (match-string 1 color)) 100.0))
@@ -510,11 +496,14 @@ For a terminal frame, the value is always 1."
        )
        )
     (error
-     (w3-warn 'css (format "Couldn't interpret color value %s" color))
+     (display-warning 'css (format "Couldn't interpret color value %s" color))
      (setq color nil)))
   color
   )
 
+(defvar css--url)
+(defvar css--purl)
+
 (defun css-expand-value (type value)
   (if value
       (case type
@@ -528,7 +517,6 @@ For a terminal frame, the value is always 1."
        (color                          ; CSS, Section 6.3
         (setq value (css-expand-color value)))
        (url                            ; CSS, Section 6.4
-        (declare (special url purl))
         ;; Potentially remove url(...) from around the URL
         (if (string-match "url *(\\([^ )]+\\) *)" value)
             (setq value (match-string 1 value)))
@@ -538,7 +526,7 @@ For a terminal frame, the value is always 1."
         ;; Nuke whitespace
         (if (string-match " *\\([^ ]+\\) *" value)
             (setq value (match-string 1 value)))
-        (setq value (url-expand-file-name value (or url purl))))
+        (setq value (url-expand-file-name value (or css--url css--purl))))
        (angle                          ; ACSS, Section 2.2.1
         )
        (time                           ; ACSS, Section 2.2.2
@@ -731,23 +719,23 @@ For a terminal frame, the value is always 1."
        (save-excursion
          (insert data)))))
 
+(defvar url-mime-accept-string)
+(defvar url-current-object)
+
 (defun css-handle-import (data)
-  (declare (special url-current-object))
-  (let (url purl)
-    (setq purl url-current-object)
-    (setq url (css-expand-value 'url data))
+  (let ((purl url-current-object)       ;FIXME: Should this be css--purl?
+        (url (css-expand-value 'url data)))
     (and url
-        (let ((url-mime-accept-string "text/css ; level=2")
-              (sheet nil))
-          (save-excursion
-            (set-buffer (generate-new-buffer " *styleimport*"))
-            ;; ftp/file URLs can signal an error.
-            (ignore-errors
-              (url-insert-file-contents url))
-            (css-clean-buffer)
-            (setq sheet (buffer-string))
-            (set-buffer-modified-p nil)
-            (kill-buffer (current-buffer)))
+        (let* ((url-mime-accept-string "text/css ; level=2")
+                (sheet
+                 (with-current-buffer (generate-new-buffer " *styleimport*")
+                   ;; ftp/file URLs can signal an error.
+                   (ignore-errors
+                     (url-insert-file-contents url))
+                   (css-clean-buffer)
+                   (prog1 (buffer-string)
+                     (set-buffer-modified-p nil)
+                     (kill-buffer (current-buffer))))))
           (insert sheet)))))
 
 (defun css-clean-buffer ()
@@ -767,59 +755,47 @@ For a terminal frame, the value is always 1."
   (css-replace-regexp "[ \t\r]+$" "")  ; Nuke whitespace at end of line
   (goto-char (point-min)))
 
-(if (featurep 'xemacs)
-    (defun css-color-light-p (color-or-face)
-      (let (face color)
-       (cond
-        ((or (facep color-or-face)
-             (and (symbolp color-or-face)
-                  (find-face color-or-face)))
-         (setq color (specifier-instance (face-background color-or-face))))
-        ((color-instance-p color-or-face)
-         (setq color color-or-face))
-        ((color-specifier-p color-or-face)
-         (setq color (specifier-instance color-or-face)))
-        ((stringp color-or-face)
-         (setq color (make-color-instance color-or-face)))
-        (t (signal 'wrong-type-argument 'color-or-face-p)))
-       (if color
-           (not (< (apply '+ (color-instance-rgb-components color))
-                   (/ (apply '+ (color-instance-rgb-components
-                                 (make-color-instance "white"))) 3)))
-         t)))
-  (defun css-color-values (color)
-    (cond
-     ((fboundp 'display-color-p)
-      (color-values color))
-     ((eq window-system 'x)
-      (x-color-values color))
-     ((eq window-system 'pm)
-      (pm-color-values color))
-     ((eq window-system 'ns)
-      (ns-color-values color))
-     (t nil)))
-  (defun css-color-light-p (color-or-face)
-    (let (colors)
-      (cond
-       ((null window-system)
-       nil)
-       ((facep color-or-face)
-       (setq color-or-face (face-background color-or-face))
-       (if (null color-or-face)
-           (setq color-or-face (cdr-safe
-                                (assq 'background-color (frame-parameters)))))
-       (setq colors (css-color-values color-or-face)))
-       ((stringp color-or-face)
-       (setq colors (css-color-values color-or-face)))
-       ((font-rgb-color-p color-or-face)
-       (setq colors (list (font-rgb-color-red color-or-face)
-                          (font-rgb-color-green color-or-face)
-                          (font-rgb-color-blue color-or-face))))
-       (t
-       (signal 'wrong-type-argument 'color-or-face-p)))
-      (not (< (apply '+ colors)
-             (/ (apply '+ (css-color-values "white")) 3)))))
-  )
+(defalias 'css-color-light-p
+  (if (featurep 'xemacs)
+      (lambda (color-or-face)
+        (let (color)
+          (cond
+           ((or (facep color-or-face)
+                (and (symbolp color-or-face)
+                     (find-face color-or-face)))
+            (setq color (specifier-instance (face-background color-or-face))))
+           ((color-instance-p color-or-face)
+            (setq color color-or-face))
+           ((color-specifier-p color-or-face)
+            (setq color (specifier-instance color-or-face)))
+           ((stringp color-or-face)
+            (setq color (make-color-instance color-or-face)))
+           (t (signal 'wrong-type-argument 'color-or-face-p)))
+          (if color
+              (not (< (apply '+ (color-instance-rgb-components color))
+                      (/ (apply '+ (color-instance-rgb-components
+                                    (make-color-instance "white"))) 3)))
+            t)))
+
+    (lambda (color-or-face)
+      (let ((colors
+             (cond
+              ((null window-system)
+               nil)
+              ((facep color-or-face)
+               (color-values (or (face-background color-or-face)
+                                 (frame-parameter nil 'background-color))))
+              ((stringp color-or-face)
+               (color-values color-or-face))
+              ((font-rgb-color-p color-or-face)
+               (list (font-rgb-color-red color-or-face)
+                     (font-rgb-color-green color-or-face)
+                     (font-rgb-color-blue color-or-face)))
+              (t
+               (signal 'wrong-type-argument 'color-or-face-p)))))
+        (not (< (apply '+ colors)
+                (/ (apply '+ (color-values "white")) 3)))))
+    ))
 
 (defun css-active-device-types (&optional device)
   (let ((types (list 'all
@@ -879,7 +855,7 @@ For a terminal frame, the value is always 1."
   ;; a = # of ID attributes in the selector
   ;; b = # of class attributes in the selector
   ;; c = # of tag names in the selector
-  (let ((a 0) (b 0) (c 0) cur tmp)
+  (let ((a 0) (b 0) (c 0) tmp)
     (if (not (listp (car rule)))
        (css-rule-specificity-internal rule)
       (setq c (length rule))
@@ -897,8 +873,7 @@ For a terminal frame, the value is always 1."
        (puthash k (copy-tree v) new))) sheet)
     new))
 
-(defsubst css-store-rule (attrs applies-to)
-  (declare (special sheet))
+(defsubst css-store-rule (attrs applies-to sheet)
   (let (rules cur tag node)
     (while applies-to
       (setq cur (pop applies-to)
@@ -924,25 +899,20 @@ For a terminal frame, the value is always 1."
   )
 
 (defun css-parse (url &optional string inherit)
-  (declare (special url-current-object))
-  (let (
+  (let ((css--url url)
        (url-mime-accept-string
         "text/css ; level=2")
        (save-pos nil)
        (applies-to nil)                ; List of tags to apply style to
        (attrs nil)                     ; List of name/value pairs
-       (att nil)
-       (cur nil)
-       (val nil)
        (device-type nil)
-       (purl (url-view-url t))
+       (css--purl (url-view-url t))
        (pobj url-current-object)
        (active-device-types (css-active-device-types (selected-device)))
        (sheet inherit))
     (if (not sheet)
        (setq sheet (make-hash-table :size 13 :test 'eq)))
-    (save-excursion
-      (set-buffer (generate-new-buffer " *style*"))
+    (with-current-buffer (generate-new-buffer " *style*")
       (setq url-current-object pobj)
       (set-syntax-table css-syntax-table)
       (erase-buffer)
@@ -1027,7 +997,7 @@ For a terminal frame, the value is always 1."
              nil
            (setq attrs (css-parse-args (1+ save-pos) (point)))
            (skip-chars-forward "}\r\n")
-           (css-store-rule attrs applies-to))
+           (css-store-rule attrs applies-to sheet))
          )
         )
        (skip-chars-forward " \t\r\n"))
@@ -1062,34 +1032,32 @@ For a terminal frame, the value is always 1."
            "# This is a mixture of the default stylesheet and any\n"
            "# styles specified by the document.  The rules are in no\n"
            "# particular order.\n\n")
-    (let (tmp cur goal-col)
+    (let (tmp cur)
       (maphash
-       (function
-       (lambda (k v)
-         (while v
-           (setq cur (pop v))
-           (insert (css-rule-name (car cur)))
-           (insert " { ")
-           (setq goal-col (point))
-           (insert "\n")
-           ;; Display the rules
-           (setq tmp (cdr cur))
-           (let (prop val)
-             (while tmp
-               (setq prop (caar tmp)
-                     val (cdar tmp)
-                     tmp (cdr tmp))
-               (case (get prop 'css-type)
-                 (symbol-list
-                  (setq val (mapconcat 'symbol-name val ",")))
-                 (weight
-                  (setq val (substring (symbol-name val) 1 nil)))
-                 (otherwise
-                  nil)
-                 )
-               (insert (format "  %s: %s;\n" prop val))))
-           (insert "}\n\n");
-           )))
+       (lambda (_k v)
+         (while v
+           (setq cur (pop v))
+           (insert (css-rule-name (car cur)))
+           (insert " { ")
+           (insert "\n")
+           ;; Display the rules
+           (setq tmp (cdr cur))
+           (let (prop val)
+             (while tmp
+               (setq prop (caar tmp)
+                     val (cdar tmp)
+                     tmp (cdr tmp))
+               (case (get prop 'css-type)
+                 (symbol-list
+                  (setq val (mapconcat 'symbol-name val ",")))
+                 (weight
+                  (setq val (substring (symbol-name val) 1 nil)))
+                 (otherwise
+                  nil)
+                 )
+               (insert (format "  %s: %s;\n" prop val))))
+           (insert "}\n\n")             ;
+           ))
        sheet))))
 
 (provide 'css)
diff --git a/descrip.mms b/descrip.mms
deleted file mode 100644
index 8f5d53b..0000000
--- a/descrip.mms
+++ /dev/null
@@ -1,71 +0,0 @@
-# This file kindly written by Richard Levitte - GNU on VMS hacker
-#                                               <address@hidden>
-#
-# Hacked upon by Bill Perry <address@hidden>, whose VMS experiences
-# are a thing of the past.  Let me know if this works or not.
-
-# where the w3 lisp files should go
-prefix  = gnu_root
-lispdir = $(prefix):[emacs.site-lisp]
-confdir = $(prefix):[emacs.w3]
-
-DOTEMACS= $(prefix):[lib.emacs.site-lisp]default.el
-SUBDIRS =lisp texi etc
-
-RM        = delete
-MKDIR    = create/dir
-ECHO      = write sys$output
-
-.PHONY: $(SUBDIRS) dotemacs
-
-all:   w3 info
-
-w3 fast:
-       set def [.lisp]
-       mms $@
-       set def [-]
-
-html info dvi:
-       set def [.texi]
-       mms $@
-       set def [-]
-
-install: all dotemacs
-        set def [.lisp]
-        mms install
-        set def [-.texi]
-        mms install
-        set def [-.etc]
-        mms install
-        set def [-]
-
-distclean: clean
-        set def [.lisp]
-        mms distclean
-        set def [-.texi]
-        mms distclean
-        set def [-.etc]
-        mms distclean
-        set def [-]
-        $(RM) config.* Makefile
-
-clean:
-        set def [.lisp]
-        mms clean
-        set def [-.texi]
-        mms clean
-        set def [-.etc]
-        mms clean
-        set def [-]
-
-dotemacs:
-       @if (grep ";;; Emacs/W3 Configuration" $(DOTEMACS) 2>&1) >/dev/null; 
then \
-               echo Emacs/W3 setup already exists in $(DOTEMACS);      \
-       else                                                            \
-               test -d `dirname $(DOTEMACS)` || mkdir -p `dirname 
$(DOTEMACS)`; \
-               (echo >> $(DOTEMACS)); \
-               (echo ";;; Emacs/W3 Configuration" >> $(DOTEMACS)); \
-               (echo "(setq load-path (cons \"$(lispdir)\" load-path))" >> 
$(DOTEMACS)); \
-               (echo "(require 'w3-autoloads \"w3/auto-autoloads\")" >> 
$(DOTEMACS)); \
-               echo "Added Emacs/W3 setup to $(DOTEMACS)"; \
-       fi
diff --git a/devices.el b/devices.el
index 72d842d..44da60a 100644
--- a/devices.el
+++ b/devices.el
@@ -1,36 +1,36 @@
-;;; devices.el -- XEmacs device API emulation
+;;; devices.el --- XEmacs device API emulation
+
+;; Copyright (c) 1996-1999, 2013 Free Software Foundation, Inc.
+
 ;; Author: $Author: wmperry $
 ;; Created: $Date: 2002/02/01 17:42:48 $
-;; Version: $Revision: 1.4 $
 ;; Keywords: 
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
 
 ;; This is a complete implementation of all the device-* functions found in
 ;; XEmacs 19.14.  A 'device' for Emacs 19 is just a frame, from which we can
 ;; determine the connection to an X display, etc.
 
+;;; Code:
+
 (eval-when-compile
   (require 'cl)
   (when (featurep 'xemacs)
diff --git a/docomp.el b/docomp.el
deleted file mode 100644
index 1fbab63..0000000
--- a/docomp.el
+++ /dev/null
@@ -1,88 +0,0 @@
-;;; First things first - if they do not have the WIDGETDIR environment
-;;; variable set, choke, scream, and die.
-(require 'cl)
-
-(setq srcdir (or (getenv "W3SRCDIR") "."))
-
-(push srcdir load-path)
-(push (or (getenv "GNUSDIR") (expand-file-name "../../gnus/lisp/" srcdir))
-      load-path)
-(push (or (getenv "URLDIR") (expand-file-name "../../url/lisp/" srcdir))
-      load-path)
-
-(setq max-specpdl-size (* 1000 max-specpdl-size)
-      max-lisp-eval-depth (* 1000 max-lisp-eval-depth))
-
-;; If we are building w3 in a different directory than the source
-;; directory, we must read *.el from source directory and write *.elc
-;; into the building directory.  For that, we define this function
-;; before loading bytecomp.  Bytecomp doesn't overwrite this function.
-(defun byte-compile-dest-file (filename)
-  "Convert an Emacs Lisp source file name to a compiled file name.
- In addition, remove directory name part from FILENAME."
-  (setq filename (byte-compiler-base-file-name filename))
-  (setq filename (file-name-sans-versions filename))
-  (setq filename (file-name-nondirectory filename))
-  (if (memq system-type '(win32 w32 mswindows windows-nt))
-      (setq filename (downcase filename)))
-  (cond ((eq system-type 'vax-vms)
-        (concat (substring filename 0 (string-match ";" filename)) "c"))
-       ((string-match emacs-lisp-file-regexp filename)
-        (concat (substring filename 0 (match-beginning 0)) ".elc"))
-       (t (concat filename ".elc"))))
-
-(require 'bytecomp)
-
-;; Emacs 19 byte compiler complains about too much stuff by default.
-;; Turn off most of the warnings here.
-(setq byte-compile-warnings nil
-      byte-optimize t)
-
-(defun compile-it ()
-  (let ((files (directory-files "." t ".*.[eE][lL]$" nil)))
-    (while files
-      (if (and (not (file-directory-p (car files)))
-              (not (string-match "w3-sysdp.el$" (car files))))
-         (byte-compile-file (car files)))
-      (setq files (cdr files)))))
-
-(defun emacs-build-autoloads (dir autofile)
-  (require 'autoload)
-  (let ((files (directory-files dir t ".*.[eE][lL]$" nil)))
-    (save-excursion
-      (find-file autofile)
-      (erase-buffer)
-      (mapcar 'generate-file-autoloads files)
-      (goto-char (point-max))
-      (insert "\n(provide 'w3-autoloads)\n")
-      (save-buffer)
-      (kill-buffer (current-buffer))))
-
-  ;; Now we need to munge that file to deal with
-  (find-file "w3-auto.el")
-  (erase-buffer)
-  (insert-file-contents autofile)
-  (goto-char (point-min))
-  (while (re-search-forward "w3-autoloads" nil t)
-      (replace-match "w3-auto"))
-  (save-buffer)
-  (kill-buffer (current-buffer))
-  (kill-emacs))
-
-(defun emacs-batch-build-autoloads ()
-  (emacs-build-autoloads (nth 0 command-line-args-left)
-                        (nth 1 command-line-args-left)))
-
-(defun emacs-build-custom-load (dir)
-  (let ((foundit t))
-    (save-excursion
-      (condition-case ()
-         (load-library "cus-dep")
-       (error (setq foundit nil)))
-      (if foundit
-         (let ((command-line-args-left (list dir)))
-           (custom-make-dependencies))
-       (write-region "\n" nil "cus-load.el")))))
-
-(defun emacs-batch-build-custom-load ()
-  (emacs-build-custom-load (car command-line-args-left)))
diff --git a/etc/Makefile.in b/etc/Makefile.in
deleted file mode 100644
index 7e95cf9..0000000
--- a/etc/Makefile.in
+++ /dev/null
@@ -1,42 +0,0 @@
-srcdir  = @srcdir@
-prefix  = @prefix@
-datadir = @datadir@
-top_srcdir = @top_srcdir@
-
-EMACS     = @EMACS@
-INSTALL   = @INSTALL@
-RM        = rm -f
-
-TARGETS = default.css
-
-all:
-
-install:
-       ( if [ ! -d $(datadir) ]; then mkdir -p $(datadir); fi )
-       for x in $(TARGETS); do                                 \
-               if [ -f $$x ]; then                             \
-                       $(INSTALL) $$x $(datadir);              \
-               else                                            \
-                       $(INSTALL) $(srcdir)/$$x $(datadir);    \
-               fi                                              \
-       done
-
-distclean: clean
-       $(RM) Makefile
-
-clean:
-       $(RM) *.orig *.rej *~
-
-version: $(TARGETS) descrip.mms clean 
-       test -d $(DIRNAME)/etc || mkdir -p $(DIRNAME)/etc
-       for x in $(TARGETS) Makefile.in; do $(INSTALL) -m 644 $$x 
$(DIRNAME)/etc; done
-
-# Automatic makefile rebuilding, etc.
-Makefile: $(srcdir)/Makefile.in ../config.status
-       ( cd .. ; CONFIG_FILES=etc/Makefile ./config.status )
-
-$(top_srcdir)/configure: $(top_srcdir)/configure.in $(top_srcdir)/aclocal.m4
-       cd $(top_srcdir) && autoreconf
-
-../config.status: $(top_srcdir)/configure
-       cd .. && ./config.status --recheck
diff --git a/etc/descrip.mms b/etc/descrip.mms
deleted file mode 100644
index 980c39d..0000000
--- a/etc/descrip.mms
+++ /dev/null
@@ -1,25 +0,0 @@
-# where the w3 lisp files should go
-prefix  = gnu_root
-datadir = $(prefix):[lib]
-confdir = $(prefix):[lib.emacs.w3]
-
-ECHO       = write sys$output
-RM         = delete
-MKDIR      = create/dir
-
-############## no user servicable parts beyond this point ###################
-TARGETS = default.css
-
-all: $(TARGETS)
-
-install:
-       if f$parse("$(confir)") .eqs. "" then $(MKDIR) $(confdir)
-       copy/log *.info* $(confdir)
-       - purge/log $(confdir)
-
-distclean: clean
-       $(RM) Makefile
-
-clean:
-       $(RM) *.dvi *.info* *.html
-
diff --git a/font.el b/font.el
index 08df0b1..11e47a4 100644
--- a/font.el
+++ b/font.el
@@ -1,30 +1,29 @@
 ;;; font.el --- New font model
 
+;; Copyright (c) 1996-2001, 2013 Free Software Foundation, Inc.
+
 ;; Author: wmperry
 ;; Maintainer: Bill Perry <address@hidden>
 ;; Created: $Date: 2008/02/04 06:29:13 $
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1995, 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996, 97, 98, 99, 2000, 2001 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
 
 (eval-when-compile (require 'cl))
 (require 'devices)
@@ -227,9 +226,11 @@ These are for use in the `weight' field of an X font 
string.")
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Utility functions
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar font-func)
+
 (defun set-font-style-by-keywords (fontobj styles)
   (make-local-variable 'font-func)
-  (declare (special font-func))
   (if (listp styles)
       (while styles
        (setq font-func (car-safe (cdr-safe (assq (car styles) 
font-style-keywords)))
@@ -542,9 +543,10 @@ These are for use in the `weight' field of an X font 
string.")
          (font-set-font-encoding retval (match-string 2 fontname)))
        retval))))
 
+(defvar device-fonts-cache)
+
 (defun x-font-families-for-device (&optional device no-resetp)
   (ignore-errors (require 'x-font-menu))
-  (declare (special device-fonts-cache))
   (or device (setq device (selected-device)))
   (if (boundp 'device-fonts-cache)
       (let ((menu (or (cdr-safe (assq device device-fonts-cache)))))
@@ -676,14 +678,14 @@ These are for use in the `weight' field of an X font 
string.")
 ;;; The window-system dependent code (mswindows-style)
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-;;; mswindows fonts look like:
-;;;    fontname[:[weight][ style][:pointsize[:effects]]][:charset]
-;;; A minimal mswindows font spec looks like:
-;;;    Courier New
-;;; A maximal mswindows font spec looks like:
-;;;    Courier New:Bold Italic:10:underline strikeout:western
-;;; Missing parts of the font spec should be filled in with these values:
-;;;    Courier New:Regular:10::western
+;; mswindows fonts look like:
+;;     fontname[:[weight][ style][:pointsize[:effects]]][:charset]
+;; A minimal mswindows font spec looks like:
+;;     Courier New
+;; A maximal mswindows font spec looks like:
+;;     Courier New:Bold Italic:10:underline strikeout:western
+;; Missing parts of the font spec should be filled in with these values:
+;;     Courier New:Regular:10::western
 ;;  "^[a-zA-Z ]+:[a-zA-Z ]*:[0-9]+:[a-zA-Z ]*:[a-zA-Z 0-9]*$"
 (defvar font-mswindows-font-regexp
   (let
@@ -864,45 +866,68 @@ These are for use in the `weight' field of an MS-Windows 
font string.")
 ;;; can deal with either syntax.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; ###autoload
-(defun font-set-face-font (&optional face font &rest args)
-  (cond
-   ((and (vectorp font) (= (length font) 12))
-    (let ((font-name (font-create-name font)))
-      (set-face-property face 'font-specification font)
+(defalias 'font-set-face-font
+  (if (featurep 'xemacs)
+      (lambda (&optional face font &rest args)
+        (cond
+         ((and (vectorp font) (= (length font) 12))
+          (let ((font-name (font-create-name font)))
+            (set-face-property face 'font-specification font)
+            (cond
+             ((null font-name)         ; No matching font!
+              nil)
+             ((listp font-name)                ; For TTYs
+              (let (cur)
+                (while font-name
+                  (setq cur (car font-name)
+                        font-name (cdr font-name))
+                  (apply 'set-face-property face (car cur) (cdr cur) args))))
+             ((featurep 'xemacs)
+              (apply 'set-face-font face font-name args)
+              (apply 'set-face-underline-p face (font-underline-p font) args)
+              (if (and (or (font-smallcaps-p font) (font-bigcaps-p font))
+                       (fboundp 'set-face-display-table))
+                  (apply 'set-face-display-table
+                         face font-caps-display-table args))
+              (apply 'set-face-property face 'strikethru (or
+                                                          (font-linethrough-p 
font)
+                                                          (font-strikethru-p 
font))
+                     args))
+             (t
+              (condition-case nil
+                  (apply 'set-face-font face font-name args)
+                (error
+                 (let ((args (car-safe args)))
+                   (and (or (font-bold-p font)
+                            (memq (font-weight font) '(:bold :demi-bold)))
+                        (make-face-bold face args t))
+                   (and (font-italic-p font) (make-face-italic face args t)))))
+              (apply 'set-face-underline-p face (font-underline-p font) 
args)))))
+         (t
+          ;; Let the original set-face-font signal any errors
+          (set-face-property face 'font-specification nil)
+          (apply 'set-face-font face font args))))
+    
+    ;; GNU Emacs.
+    (lambda (&optional face font &rest args)
       (cond
-       ((null font-name)               ; No matching font!
-       nil)
-       ((listp font-name)              ; For TTYs
-       (let (cur)
-         (while font-name
-           (setq cur (car font-name)
-                 font-name (cdr font-name))
-           (apply 'set-face-property face (car cur) (cdr cur) args))))
-       ((featurep 'xemacs)
-       (apply 'set-face-font face font-name args)
-       (apply 'set-face-underline-p face (font-underline-p font) args)
-       (if (and (or (font-smallcaps-p font) (font-bigcaps-p font))
-                (fboundp 'set-face-display-table))
-           (apply 'set-face-display-table
-                  face font-caps-display-table args))
-       (apply 'set-face-property face 'strikethru (or
-                                                   (font-linethrough-p font)
-                                                   (font-strikethru-p font))
-              args))
+       ((and (vectorp font) (= (length font) 12))
+        (set-face-property face 'font-specification font)
+        (set-face-attribute
+         face nil
+         :underline (font-underline-p font)
+         :weight (or (cdr-safe (assoc (font-weight font)
+                                      font-emacs21-weight-mappings))
+                     'normal))
+        (if (font-find-available-family font)
+            (set-face-attribute :family (font-find-available-family font)))
+        (if (and (font-size font)
+                 (/= 0 (font-size font)))
+            (set-face-attribute face nil
+                                :height (* 10 (font-spatial-to-canonical 
(font-size font))))))
        (t
-       (condition-case nil
-           (apply 'set-face-font face font-name args)
-         (error
-          (let ((args (car-safe args)))
-            (and (or (font-bold-p font)
-                     (memq (font-weight font) '(:bold :demi-bold)))
-                 (make-face-bold face args t))
-            (and (font-italic-p font) (make-face-italic face args t)))))
-       (apply 'set-face-underline-p face (font-underline-p font) args)))))
-   (t
-    ;; Let the original set-face-font signal any errors
-    (set-face-property face 'font-specification nil)
-    (apply 'set-face-font face font args))))
+        (set-face-property face 'font-specification nil)
+        (apply 'set-face-font face font args))))))
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -939,29 +964,6 @@ These are for use in the `weight' field of an MS-Windows 
font string.")
              done (try-font-name font-name device))))
     (and done cur-family)))
 
-(defun font-set-face-font-emacs21 (&optional face font &rest args)
-  (cond
-   ((and (vectorp font) (= (length font) 12))
-    (set-face-property face 'font-specification font)
-    (set-face-attribute
-     face nil
-     :underline (font-underline-p font)
-     :weight (or (cdr-safe (assoc (font-weight font)
-                                 font-emacs21-weight-mappings))
-                'normal))
-    (if (font-find-available-family font)
-       (set-face-attribute :family (font-find-available-family font)))
-    (if (and (font-size font)
-            (/= 0 (font-size font)))
-       (set-face-attribute face nil
-                           :height (* 10 (font-spatial-to-canonical (font-size 
font))))))
-   (t
-    (set-face-property face 'font-specification nil)
-    (apply 'set-face-font face font args))))
-
-(if (and (not (featurep 'xemacs))
-        (>= emacs-major-version 21))
-    (defalias 'font-set-face-font 'font-set-face-font-emacs21))
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/images.el b/images.el
index 83892b7..44df078 100644
--- a/images.el
+++ b/images.el
@@ -1,30 +1,27 @@
 ;;; images.el --- Automatic image converters
+
+;; Copyright (c) 1996-1999, 2007, 2013 Free Software Foundation Inc.
+
 ;; Author: $Author: legoscia $
 ;; Created: $Date: 2007/11/15 12:22:34 $
-;; Version: $Revision: 1.6 $
 ;; Keywords: images
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996 - 1999, 2007 Free Software Foundation Inc.
-;;; Copyright (c) 1995 - 1996 by William M. Perry <address@hidden>
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
 
 (defvar image-temp-stack nil "Do no touch - internal storage.")
 (defvar image-converters nil "Storage for the image converters.")
@@ -138,20 +135,20 @@ to a suitable internal image format will be carried out."
             (chain (cdr-safe winner))
             )
        (if chain
-           (save-excursion
-             (set-buffer (generate-new-buffer " *image-conversion*"))
+           (with-current-buffer (generate-new-buffer " *image-conversion*")
              (erase-buffer)
+              (set-buffer-multibyte nil)
              (insert data)
              (while chain
                (cond
                 ((stringp (car chain))
-                 (let ((file-coding-system 'binary))
-                   (call-process-region
-                    (point-min) (point-max)
-                    shell-file-name t
-                    (list (current-buffer) nil)
-                    shell-command-switch
-                    (car chain))))
+                  (call-process-region
+                   (point-min) (point-max)
+                   shell-file-name t
+                   (list (current-buffer) nil)
+                   ;; FIXME: Shouldn't there be a nil before this arg?
+                   shell-command-switch
+                   (car chain)))
                 ((and (symbolp (car chain)) (fboundp (car chain)))
                  (funcall (car chain) (point-min) (point-max))))
                (setq chain (cdr chain)))
diff --git a/install-sh b/install-sh
deleted file mode 100755
index ab74c88..0000000
--- a/install-sh
+++ /dev/null
@@ -1,238 +0,0 @@
-#!/bin/sh
-#
-# install - install a program, script, or datafile
-# This comes from X11R5.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-#
-
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
-
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
-
-tranformbasename=""
-transform_arg=""
-instcmd="$mvprog"
-chmodcmd="$chmodprog 0755"
-chowncmd=""
-chgrpcmd=""
-stripcmd=""
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=""
-dst=""
-dir_arg=""
-
-while [ x"$1" != x ]; do
-    case $1 in
-       -c) instcmd="$cpprog"
-           shift
-           continue;;
-
-       -d) dir_arg=true
-           shift
-           continue;;
-
-       -m) chmodcmd="$chmodprog $2"
-           shift
-           shift
-           continue;;
-
-       -o) chowncmd="$chownprog $2"
-           shift
-           shift
-           continue;;
-
-       -g) chgrpcmd="$chgrpprog $2"
-           shift
-           shift
-           continue;;
-
-       -s) stripcmd="$stripprog"
-           shift
-           continue;;
-
-       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
-           shift
-           continue;;
-
-       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
-           shift
-           continue;;
-
-       *)  if [ x"$src" = x ]
-           then
-               src=$1
-           else
-               # this colon is to work around a 386BSD /bin/sh bug
-               :
-               dst=$1
-           fi
-           shift
-           continue;;
-    esac
-done
-
-if [ x"$src" = x ]
-then
-       echo "install:  no input file specified"
-       exit 1
-else
-       true
-fi
-
-if [ x"$dir_arg" != x ]; then
-       dst=$src
-       src=""
-       
-       if [ -d $dst ]; then
-               instcmd=:
-       else
-               instcmd=mkdir
-       fi
-else
-
-# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
-# might cause directories to be created, which would be especially bad 
-# if $src (and thus $dsttmp) contains '*'.
-
-       if [ -f $src -o -d $src ]
-       then
-               true
-       else
-               echo "install:  $src does not exist"
-               exit 1
-       fi
-       
-       if [ x"$dst" = x ]
-       then
-               echo "install:  no destination specified"
-               exit 1
-       else
-               true
-       fi
-
-# If destination is a directory, append the input filename; if your system
-# does not like double slashes in filenames, you may need to add some logic
-
-       if [ -d $dst ]
-       then
-               dst="$dst"/`basename $src`
-       else
-               true
-       fi
-fi
-
-## this sed command emulates the dirname command
-dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
-
-# Make sure that the destination directory exists.
-#  this part is taken from Noah Friedman's mkinstalldirs script
-
-# Skip lots of stat calls in the usual case.
-if [ ! -d "$dstdir" ]; then
-defaultIFS='   
-'
-IFS="${IFS-${defaultIFS}}"
-
-oIFS="${IFS}"
-# Some sh's can't handle IFS=/ for some reason.
-IFS='%'
-set - `echo ${dstdir} | sed -e 's@/@address@hidden' -e 'address@hidden@/@'`
-IFS="${oIFS}"
-
-pathcomp=''
-
-while [ $# -ne 0 ] ; do
-       pathcomp="${pathcomp}${1}"
-       shift
-
-       if [ ! -d "${pathcomp}" ] ;
-        then
-               $mkdirprog "${pathcomp}"
-       else
-               true
-       fi
-
-       pathcomp="${pathcomp}/"
-done
-fi
-
-if [ x"$dir_arg" != x ]
-then
-       $doit $instcmd $dst &&
-
-       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
-       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
-       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
-       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
-else
-
-# If we're going to rename the final executable, determine the name now.
-
-       if [ x"$transformarg" = x ] 
-       then
-               dstfile=`basename $dst`
-       else
-               dstfile=`basename $dst $transformbasename | 
-                       sed $transformarg`$transformbasename
-       fi
-
-# don't allow the sed command to completely eliminate the filename
-
-       if [ x"$dstfile" = x ] 
-       then
-               dstfile=`basename $dst`
-       else
-               true
-       fi
-
-# Make a temp file name in the proper directory.
-
-       dsttmp=$dstdir/#inst.$$#
-
-# Move or copy the file name to the temp name
-
-       $doit $instcmd $src $dsttmp &&
-
-       trap "rm -f ${dsttmp}" 0 &&
-
-# and set any options; do chmod last to preserve setuid bits
-
-# If any of these fail, we abort the whole thing.  If we want to
-# ignore errors from any of these, just make sure not to ignore
-# errors from the above "$doit $instcmd $src $dsttmp" command.
-
-       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
-       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
-       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
-       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
-
-# Now rename the file to the real destination.
-
-       $doit $rmcmd -f $dstdir/$dstfile &&
-       $doit $mvcmd $dsttmp $dstdir/$dstfile 
-
-fi &&
-
-
-exit 0
diff --git a/ssl.el b/ssl.el
index 67e2f75..93c6f16 100644
--- a/ssl.el
+++ b/ssl.el
@@ -1,29 +1,29 @@
-;;; ssl.el,v --- ssl functions for Emacsen without them builtin
+;;; ssl.el,v --- SSL functions for Emacsen without them builtin
+
+;; Copyright (c) 1996-2001, 2008, 2013 Free Software Foundation, Inc.
+
 ;; Author: William M. Perry <address@hidden>
 ;; $Revision: 1.5 $
 ;; Keywords: comm
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996, 97, 98, 99, 2001, 2008 Free Software Foundation, Inc.
-;;; Copyright (c) 1995, 1996 by William M. Perry <address@hidden>
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
 
 (eval-when-compile (require 'cl))
 (require 'url)                         ; for `url-configuration-directory'
@@ -79,14 +79,14 @@ This means a directory of pem encoded certificates with 
hash symlinks."
   '("s_client"
     "-quiet"
     "-host" host
-    "-port" service
+    "-port" port
     "-verify" (int-to-string ssl-certificate-verification-policy)
     "-CApath" ssl-certificate-directory
     )
   "*Arguments that should be passed to the program `ssl-program-name'.
 This should be used if your SSL program needs command line switches to
 specify any behaviour (certificate file locations, etc).
-The special symbols 'host and 'port may be used in the list of arguments
+The special symbols `host' and `port' may be used in the list of arguments
 and will be replaced with the hostname and service/port that will be connected
 to."
   :group 'ssl
@@ -111,8 +111,7 @@ Maybe a way of passing a file should be implemented."
                             (base64-encode-string der)
                             "\n-----END CERTIFICATE-----\n"))
        (exit-code 0))
-    (save-excursion
-      (set-buffer (get-buffer-create " *openssl*"))
+    (with-current-buffer (get-buffer-create " *openssl*")
       (erase-buffer)
       (insert certificate)
       (setq exit-code
@@ -209,10 +208,13 @@ Third arg is name of the host to connect to, or its IP 
address.
 Fourth arg SERVICE is name of the service desired, or an integer
 specifying a port number to connect to."
   (if (integerp service) (setq service (int-to-string service)))
+  (defvar port) (defvar host) (defvar service)
   (let* ((process-connection-type nil)
+         (host host)
+         (service service)
         (port service)
-        (proc (eval `(start-process name buffer ,@(ssl-get-command)))))
-    (process-kill-without-query proc)
+        (proc (eval `(start-process ',name ',buffer ,@(ssl-get-command)))))
+    (set-process-query-on-exit-flag proc nil)
     proc))
 
 (provide 'ssl)
diff --git a/url-hotlist.el b/url-hotlist.el
index 4a9ab06..936e362 100644
--- a/url-hotlist.el
+++ b/url-hotlist.el
@@ -1,29 +1,29 @@
 ;;; url-hotlist.el --- URL interface to bookmarks
+
+;; Copyright (c) 1999, 2013 Free Software Foundation, Inc.
+
 ;; Author: $Author: wmperry $
 ;; Created: $Date: 1999/12/05 08:35:52 $
-;; Version: $Revision: 1.1 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
 
 (require 'url-util)
 (require 'url-parse)
@@ -40,7 +40,7 @@
    (t
     ;; A submenu
     (insert " <dl>\n   <dt><b>" (car node) "</b>\n")
-    (mapc 'url-hotlist-html-generator (cdr node))
+    (mapc #'url-hotlist-html-generator (cdr node))
     (insert " </dl>\n"))))
 
 (defun url-hotlist (url)
@@ -52,8 +52,7 @@
        (setq action (substring action 0 (match-beginning 0))
              query-args (url-parse-query-string (substring (url-filename url) 
(match-end 0)) t)))
     (setq func (intern (downcase (format "url-hotlist-%s" action))))
-    (save-excursion
-      (set-buffer (generate-new-buffer " *w3-hotlist-url*"))
+    (with-current-buffer (generate-new-buffer " *w3-hotlist-url*")
       (insert "Content-type: text/html\n\n")
       (if (fboundp func)
          (funcall func query-args)
@@ -69,20 +68,19 @@
                "</html>\n"))
       (current-buffer))))
 
-(defun url-hotlist-view (query-args)
+(defun url-hotlist-view (_query-args)
   (insert "<html>\n"
          " <head>\n"
          "  <title>Hotlist View</title>\n"
          " </head>\n"
          " <body>\n")
-  (mapc 'url-hotlist-html-generator w3-hotlist)
+  (mapc #'url-hotlist-html-generator w3-hotlist)
   (insert " </body>\n"
          "</html>\n"))  
 
 (defun url-hotlist-search (query-args)
   (let ((regexp (cdr-safe (assoc "regexp" query-args)))
-       (hot-alist (w3-hot-convert-to-alist w3-hotlist))
-       (matches nil))
+       (hot-alist (w3-hot-convert-to-alist w3-hotlist)))
     (insert "<html>\n"
            " <head>\n"
            "  <title>Hotlist search results</title>\n"
@@ -90,14 +88,15 @@
            " <body>\n")
     (if (not regexp)
        (insert "  <h3>Malformed search URL</h3>\n")
-      (insert "  <p>Search results for:<br> <tt>" (mapconcat 'identity regexp 
"<br>\n")
+      (insert "  <p>Search results for:<br> <tt>"
+              (mapconcat #'identity regexp "<br>\n")
              "</tt></h3>\n"
              "  <ul>\n")
-      (mapc (lambda (node)
-             (mapc (lambda (r)
-                     (if (string-match r (car node))
-                         (insert (format "   <li> <a href=\"%s\">%s</a>\n" 
(cdr node) (car node))))) regexp))
-           hot-alist)
+      (dolist (node hot-alist)
+        (dolist (r regexp)
+          (if (string-match r (car node))
+              (insert (format "   <li> <a href=\"%s\">%s</a>\n"
+                              (cdr node) (car node))))))
       (insert "  </ul>\n"))
     (insert " </body>\n"
            "</html>\n")))
diff --git a/vmsloadup.el b/vmsloadup.el
deleted file mode 100644
index 6537ea7..0000000
--- a/vmsloadup.el
+++ /dev/null
@@ -1,3 +0,0 @@
-(load "./docomp.el")
-(load "./w3-vars.el")
-(load "./url.el")
diff --git a/w3-cfg.el.in b/w3-cfg.el.in
deleted file mode 100644
index 52c20d4..0000000
--- a/w3-cfg.el.in
+++ /dev/null
@@ -1,57 +0,0 @@
-;;; w3-cfg.el --- Configuration info from Emacs/W3
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:12 $
-;; Version: $Revision: 1.1 $
-;; Keywords: hypermedia
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defconst w3-configuration-data
-  '(
-    (srcdir              . "@srcdir@")
-    (datadir             . "@datadir@")
-    (prefix              . "@prefix@")
-    (infodir             . "@infodir@")
-    (lispdir             . "@lispdir@")
-    (EMACS               . "@EMACS@")
-    (CUSTOM              . "@CUSTOM@")
-    (EMACS_FLAVOR        . "@EMACS_FLAVOR@")
-    (EMACS_VERSION       . "@EMACS_VERSION@")
-    (EMACS_PACKAGE_DIR   . "@EMACS_PACKAGE_DIR@")
-    (XEMACS              . "@XEMACS@")
-    )
-  "Emacs/W3 configuration data.
-This data is from the configuration step in building Emacs/W3, and
-the data may not accurately reflect your current environment.")
-
-(defun w3-configuration-data (option &optional default)
-  (let ((info (or (cdr-safe (assq option w3-configuration-data)) default)))
-    (if (not (stringp info))
-       (setq info (eval info)))
-    (while (string-match "\\$[({]\\([^{(]+\\)[})]" info)
-      (setq info (concat (substring info 0 (match-beginning 0))
-                        (w3-configuration-data (intern (match-string 1 info))
-                                               "")
-                        (substring info (match-end 0)))))
-    info))
-    
-(provide 'w3-cfg)
diff --git a/w3-cfg.nt b/w3-cfg.nt
deleted file mode 100644
index 30d1a4c..0000000
--- a/w3-cfg.nt
+++ /dev/null
@@ -1,59 +0,0 @@
-;;; w3-cfg.el --- Configuration info from Emacs/W3
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:12 $
-;; Version: $Revision: 1.1 $
-;; Keywords: hypermedia
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defconst w3-configuration-data
-  '(
-    (srcdir              . ".")
-    (datadir             . data-directory)
-    (prefix              . (expand-file-name (if w3-running-xemacs
-                                                "../../../"
-                                              "../../../../") data-directory))
-    (infodir             . "${prefix}info")
-    (lispdir             . "$(prefix)share/emacs/site-lisp")
-    (EMACS               . "emacs")
-    (EMACS_FLAVOR        . "emacs")
-    (CUSTOM              . (file-name-directory (locate-library "widget")))
-    (EMACS_VERSION       . (format "%d.%d" emacs-major-version 
emacs-minor-version))
-    (EMACS_PACKAGE_DIR   . "")
-    (XEMACS              . (if w3-running-xemacs "yes" "no"))
-    )
-  "Emacs/W3 configuration data.
-This data is from the configuration step in building Emacs/W3, and
-the data may not accurately reflect your current environment.")
-
-(defun w3-configuration-data (option &optional default)
-  (let ((info (or (cdr-safe (assq option w3-configuration-data)) default)))
-    (if (not (stringp info))
-       (setq info (eval info)))
-    (while (string-match "\\$[({]\\([^{(]+\\)[})]" info)
-      (setq info (concat (substring info 0 (match-beginning 0))
-                        (w3-configuration-data (intern (match-string 1 info))
-                                               "")
-                        (substring info (match-end 0)))))
-    info))
-    
-(provide 'w3-cfg)
diff --git a/w3-cus.el b/w3-cus.el
index 989d48f..0ec1b10 100644
--- a/w3-cus.el
+++ b/w3-cus.el
@@ -1,30 +1,29 @@
 ;;; w3-cus.el --- Customization support for Emacs-W3
+
+;; Copyright (c) 1996-1999, 2013 Free Software Foundation, Inc.
+
 ;; Author: $Author: fx $
 ;; Created: $Date: 2001/10/11 12:59:46 $
-;; Version: $Revision: 1.9 $
 ;; Keywords: comm, help, hypermedia
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
 
 (defgroup w3 '((url custom-group))
   "Emacs-W3 - the web browser of choice."
@@ -93,7 +92,7 @@ default to  the hypertext documentation for W3 at Indiana 
University."
                 (file)))
 
 (defcustom w3-hotlist-file nil
-  "*Hotlist filename.
+  "Hotlist filename.
 This should be the name of a file that is stored in either
 NCSA's Mosaic/X or Netscape/X format.  It is used to keep a listing
 of commonly accessed URL's without having to go through 20 levels of
@@ -115,7 +114,7 @@ explicit encodings for URLs."
 
 ;;; Display related variables
 (defcustom w3-display-frames t
-  "*Fetch frames - can be:
+  "Fetch frames - can be:
 nil            no frame display whatsoever
 'as-links      display frame hyperlinks, but do not fetch them
 'ask           display frame hyperlinks and ask whether to fetch them
@@ -140,7 +139,7 @@ This maps to characters to use as the bullet character."
                       (character :tag "Character"))))
 
 (defcustom w3-echo-link '(title url text name)
-  "*Whether to display the URL of a link when tabbing through links.
+  "Whether to display the URL of a link when tabbing through links.
 Value is a list of one or more of the following symbols:
 
   url    == url of the target
@@ -168,7 +167,7 @@ If nil W3 will use a terminal graphic character if 
possible."
                 (character)))
 
 (defcustom w3-force-conversion-alist nil
-  "*An alist of URL host/filename regexps and coding systems to use for them."
+  "An alist of URL host/filename regexps and coding systems to use for them."
   :group 'w3-display
   :type `(repeat (cons (string :tag "Host / filename")
                       ;; Fixme: Emacs 21 has coding-system :type.
@@ -176,19 +175,19 @@ If nil W3 will use a terminal graphic character if 
possible."
 
 ;;; these four variables control how w3-setup-terminal-chars works
 (defcustom w3-use-terminal-characters nil
-  "*Use terminal graphics characters for drawing tables and rules if 
available."
+  "Use terminal graphics characters for drawing tables and rules if available."
   :group 'w3-display
   :type 'boolean)
 
 (defcustom w3-use-terminal-characters-on-tty nil
-  "*Use terminal graphics characters for tables and rules even on a tty.
+  "Use terminal graphics characters for tables and rules even on a tty.
 This triggers display bugs on both Emacs and XEmacs.
 \(Though it's usually tolerable at least in Emacs.)"
   :group 'w3-display
   :type 'boolean)
 
 (defcustom w3-use-terminal-glyphs nil
-  "*Use glyphs if possible rather than properties for terminal graphics 
characters.
+  "Use glyphs if possible rather than properties for terminal graphics 
characters.
 
 Glyphs are probably more efficient but don't work with the most recent versions
 of XEmacs and there are some cute tricks we can play with text-properties that
@@ -201,14 +200,14 @@ work at all if we're using text-properties)."
                 (const :tag "Use Text Properties" :value nil)))
 
 (defcustom w3-use-unicode-table-characters nil
-  "*Non-nil means use Unicode box-drawing characters for tables if avilable.
+  "Non-nil means use Unicode box-drawing characters for tables if avilable.
 This only works for Emacs 21.  You might wat to turn this off if your
 Unicode font isn't available in appropriate sizes."
   :group 'w3-display
   :type 'boolean)
 
 (defcustom w3-do-incremental-display nil
-  "*Non-nil means do incremental display of pages."
+  "Non-nil means do incremental display of pages."
   :group 'w3-display
   :type 'boolean)
 
@@ -230,7 +229,7 @@ or the links menu, for instance."
 
 ;;; Parsing related variables
 (defcustom w3-debug-html nil
-  "*Non-nil means to gripe about bad HTML."
+  "Non-nil means to gripe about bad HTML."
   :group 'w3-parsing
   :type '(choice (const :tag "HTML Errors" :value t)
                 (const :tag "Errors and stylistic issues" :value style)
@@ -243,7 +242,7 @@ or the links menu, for instance."
 
 ;;; Image related variables
 (defcustom w3-auto-image-alt 'w3-default-image-alt-func
-  "*Whether to create an alt attribute for an image that is missing it.
+  "Whether to create an alt attribute for an image that is missing it.
 If nil, Emacs-W3 will not automatically create an ALT attribute.
 
 If a string, it should be a string suitable for running through format,
@@ -264,7 +263,7 @@ argument, the filename of the graphic that is not loaded."
                                         (featurep 'jpeg)
                                         (featurep 'imagick)
                                         (featurep 'png)))
-  "*Non-nil means delay loading images, not automatically retrieve them."
+  "Non-nil means delay loading images, not automatically retrieve them."
   :group 'w3-images
   :type 'boolean)
 
@@ -307,7 +306,7 @@ the first part as a submenu, followed by the rest of the 
menu."
   :type 'integer)
 
 (defcustom w3-max-menu-width 40
-  "*The maximum width of a pulldown menu choice."
+  "The maximum width of a pulldown menu choice."
   :group 'w3-menus
   :type 'integer)
 
@@ -329,12 +328,12 @@ the first part as a submenu, followed by the rest of the 
menu."
   :type 'sexp)
 
 (defcustom w3-netscape-compatible-comments nil
-  "*Whether to honor netscape-style <! > comments."
+  "Whether to honor netscape-style <! > comments."
   :group 'w3-parsing
   :type 'boolean)
 
 (defcustom w3-notify 'semibully
-  "*Selects the behavior when w3 page is ready.
+  "Selects the behavior when w3 page is ready.
 This variable may have one of the following values:
 
 newframe   -- put the w3 page in its own frame
@@ -366,7 +365,7 @@ Any other value of `w3-notify' is equivalent to `meek'."
                        :value meek)))
 
 (defcustom w3-popup-menu-on-mouse-3 t
-  "*Non-nil value means W3 should provide context-sensitive menus on mouse-3.
+  "Non-nil value means W3 should provide context-sensitive menus on mouse-3.
 A nil value means W3 should not change the binding of mouse-3."
   :group 'w3-display
   :type 'boolean)
@@ -389,38 +388,38 @@ This will also accept:
                 (const :tag "Always ask" :value ask)))
 
 (defcustom w3-right-margin 2
-  "*Default right margin for Emacs-W3 buffers.
+  "Default right margin for Emacs-W3 buffers.
 This amount is subtracted from (window-width) for each new WWW buffer
 and used as the new fill column."
   :group 'w3-display
   :type 'integer)
 
 (defcustom w3-maximum-line-length nil
-  "*Maximum length of a line.
+  "Maximum length of a line.
 If nil, then lines can extend all the way to the window margin."
   :group 'w3-display
   :type '(radio (const :tag "Use all available space" :value nil)
                (integer :tag "Limit to")))
 
 (defcustom w3-track-mouse t
-  "*Non-nil means track the mouse and message the url under the mouse."
+  "Non-nil means track the mouse and message the url under the mouse."
   :group 'w3-display
   :type 'boolean)
 
 (defcustom w3-honor-stylesheets nil
-  "*Whether to let a document specify a CSS stylesheet."
+  "Whether to let a document specify a CSS stylesheet."
   :group 'w3-display
   :type 'boolean)
 
 (defcustom w3-user-colors-take-precedence nil
-  "*Non-nil means don't let a document define certain colors itself.
+  "Non-nil means don't let a document define certain colors itself.
 Like foreground and background colors and pixmaps, color of links and
 visited links, etc."
   :group 'w3-display
   :type 'boolean)
 
 (defcustom w3-user-fonts-take-precedence nil
-  "*Non-nil means don't let a document define certain fonts.
+  "Non-nil means don't let a document define certain fonts.
 Certain fonts can cause problems under Emacs."
   :group 'w3-display
   :type 'boolean)
diff --git a/w3-dired.el b/w3-dired.el
index b56b909..1e459e1 100644
--- a/w3-dired.el
+++ b/w3-dired.el
@@ -1,37 +1,37 @@
 ;;; w3-dired.el --- W3 Dired minor mode
+
+;; Copyright (c) 1996-1999, 2007, 2013 Free Software Foundation, Inc.
+
 ;; Author: Bill Perry <address@hidden>
 ;; Created: $Date: 2007/11/15 12:22:34 $
-;; Version: $Revision: 1.5 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996 - 1999, 2007 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; This is a minor mode for invoking Emacs/W3 from a dired buffer
-;;;
-;;; To enable for all dired buffers, put this in your .emacs file:
-;;;
-;;; (add-hook 'dired-mode-hook 'turn-on-w3-dired)
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; This is a minor mode for invoking Emacs/W3 from a dired buffer
+;;
+;; To enable for all dired buffers, put this in your .emacs file:
+;;
+;; (add-hook 'dired-mode-hook 'turn-on-w3-dired)
+
+;;; Code:
 
 ;; Fixme: should we have both this and url-dired?
 
diff --git a/w3-display.el b/w3-display.el
index 851908d..03bc0ac 100644
--- a/w3-display.el
+++ b/w3-display.el
@@ -1,34 +1,33 @@
 ;;; w3-display.el --- W3 display engine
+
+;; Copyright (c) 1996, 97, 98, 99, 2000, 2001, 2007, 2008, 2013 Free Software 
Foundation, Inc.
+
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.51 $
 ;; Keywords: faces, help, hypermedia
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996, 97, 98, 99, 2000, 2001, 2007, 2008 Free Software 
Foundation, Inc.
-;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;; Code:
+
 (eval-when-compile
   (require 'cl)
-  (require 'w3-props)
-  (defvar w3-last-parse-tree))
+  (require 'w3-props))
+(defvar w3-last-parse-tree)
 (require 'css)
 (require 'font)
 (require 'url-parse)
@@ -95,60 +94,58 @@
 (w3-d-s-var-def w3-display-css-properties)
 (w3-d-s-var-def w3-display-background-properties)
 
-(eval-when-compile
-  (defmacro w3-get-attribute (attr)
-    `(cdr-safe (assq ,attr args)))
-  
-  (defmacro w3-get-face-info (info &optional other)
-    (let ((var (intern (format "w3-face-%s" info))))
-      `(push (w3-get-style-info (quote ,info) node
-                               (or (and (not w3-user-colors-take-precedence)
-                                        (cdr-safe (assq (quote ,other)
-                                                        (nth 1 node))))
-                                   (car ,var)))
-            ,var)))
-
-  (defmacro w3-pop-face-info (info)
-    (let ((var (intern (format "w3-face-%s" info))))
-      `(pop ,var)))
-
-  (defmacro w3-get-all-face-info ()
-    `(progn
-       (w3-get-face-info font-family)
-       ;; This is to handle the 'face' attribute on arbitrary elements
-       (if (cdr-safe (assq 'face (nth 1 node)))
-          (setf (car w3-face-font-family)
-                (append (car w3-face-font-family)
-                        (split-string (cdr-safe
-                                       (assq 'face (nth 1 node)))
-                                      " *, *"))))
-       (w3-get-face-info font-style)
-       (w3-get-face-info font-weight)
-       (w3-get-face-info font-variant)
-       (w3-get-face-info font-size)
-       (w3-get-face-info text-decoration)
-       (w3-get-face-info background-image)
-       (w3-get-face-info color color)
-       (w3-get-face-info background-color bgcolor)
-       (setq w3-face-font-spec (make-font
-                               :weight (car w3-face-font-weight)
-                               :family  (if (not w3-user-fonts-take-precedence)
-                                            (car w3-face-font-family))
-                               :size (car w3-face-font-size)))))
-
-  (defmacro w3-pop-all-face-info ()
-    `(progn
-       (w3-pop-face-info font-family)
-       (w3-pop-face-info font-weight)
-       (w3-pop-face-info font-variant)
-       (w3-pop-face-info font-size)
-       (w3-pop-face-info font-style)
-       (w3-pop-face-info text-decoration)
-       (w3-pop-face-info background-image)
-       (w3-pop-face-info color)
-       (w3-pop-face-info background-color)))
 
-  )
+(defmacro w3-get-attribute (attr args)
+  `(cdr-safe (assq ,attr ,args)))
+  
+(defmacro w3-get-face-info (info &optional other)
+  (let ((var (intern (format "w3-face-%s" info))))
+    `(push (w3-get-style-info (quote ,info)
+                              (or (and (not w3-user-colors-take-precedence)
+                                       (cdr-safe (assq (quote ,other)
+                                                       (nth 1 node))))
+                                  (car ,var)))
+           ,var)))
+
+(defmacro w3-pop-face-info (info)
+  (let ((var (intern (format "w3-face-%s" info))))
+    `(pop ,var)))
+
+(defmacro w3-get-all-face-info ()
+  `(progn
+     (w3-get-face-info font-family)
+     ;; This is to handle the 'face' attribute on arbitrary elements
+     (if (cdr-safe (assq 'face (nth 1 node)))
+         (setf (car w3-face-font-family)
+               (append (car w3-face-font-family)
+                       (split-string (cdr-safe
+                                      (assq 'face (nth 1 node)))
+                                     " *, *"))))
+     (w3-get-face-info font-style)
+     (w3-get-face-info font-weight)
+     (w3-get-face-info font-variant)
+     (w3-get-face-info font-size)
+     (w3-get-face-info text-decoration)
+     (w3-get-face-info background-image)
+     (w3-get-face-info color color)
+     (w3-get-face-info background-color bgcolor)
+     (setq w3-face-font-spec (make-font
+                              :weight (car w3-face-font-weight)
+                              :family  (if (not w3-user-fonts-take-precedence)
+                                           (car w3-face-font-family))
+                              :size (car w3-face-font-size)))))
+
+(defmacro w3-pop-all-face-info ()
+  `(progn
+     (w3-pop-face-info font-family)
+     (w3-pop-face-info font-weight)
+     (w3-pop-face-info font-variant)
+     (w3-pop-face-info font-size)
+     (w3-pop-face-info font-style)
+     (w3-pop-face-info text-decoration)
+     (w3-pop-face-info background-image)
+     (w3-pop-face-info color)
+     (w3-pop-face-info background-color)))
 
 (defvar w3-display-same-buffer nil)
 (defvar w3-face-cache nil  "Cache for `w3-face-for-element'.")
@@ -179,10 +176,11 @@
 
 (defvar w3-pause-keystroke nil)
 
+(defvar w3--cur-viewing-pos)
+
 (defsubst w3-pause ()
-  (declare (special cur-viewing-pos))
   (save-excursion
-    (goto-char (or cur-viewing-pos (point-min)))
+    (goto-char (or w3--cur-viewing-pos (point-min)))
     (cond
      ((featurep 'xemacs)
       (if (and (not (sit-for 0)) (input-pending-p))
@@ -201,7 +199,7 @@
                  (otherwise
                   (call-interactively w3-pause-keystroke))))
            (error nil)))))
-    (setq cur-viewing-pos (point))))
+    (setq w3--cur-viewing-pos (point))))
 
 (defmacro w3-get-pad-string (len)
   `(cond
@@ -256,18 +254,18 @@
    (t (concat (w3-decimal-to-alpha (/ n 26))
              (w3-decimal-to-alpha (% n 26))))))
 
-(defsubst w3-get-style-info (info node &optional default)
+(defsubst w3-get-style-info (info &optional default)
   (or (cdr-safe (assq info w3-display-css-properties)) default))
 
 (defun w3-decode-area-coords (str)
   (let (retval)
     (while (string-match "\\([ \t0-9]+\\),\\([ \t0-9]+\\)" str)
-      (setq retval (cons (vector (string-to-int (match-string 1 str))
-                                (string-to-int (match-string 2 str))) retval)
+      (setq retval (cons (vector (string-to-number (match-string 1 str))
+                                (string-to-number (match-string 2 str))) 
retval)
            str (substring str (match-end 0) nil)))
     (if (string-match "\\([0-9]+\\)" str)
        (setq retval (cons (vector (+ (aref (car retval) 0)
-                                     (string-to-int (match-string 1 str)))
+                                     (string-to-number (match-string 1 str)))
                                   (aref (car retval) 1)) retval)))
     (nreverse retval)))
 
@@ -287,17 +285,17 @@
     (w3-warn 'html (format "Bad color specification: %s" color))
     nil)))
 
-(defsubst w3-voice-for-element (node)
+(defsubst w3-voice-for-element ()
   (if (featurep 'emacspeak)
       (let (family gain left right pitch pitch-range stress richness voice)
-       (setq family (w3-get-style-info 'voice-family node)
-             gain (w3-get-style-info 'gain node)
-             left (w3-get-style-info 'left-volume node)
-             right (w3-get-style-info 'right-volume node)
-             pitch (w3-get-style-info 'pitch node)
-             pitch-range (w3-get-style-info 'pitch-range node)
-             stress (w3-get-style-info 'stress node)
-             richness (w3-get-style-info 'richness node))
+       (setq family (w3-get-style-info 'voice-family)
+             gain (w3-get-style-info 'gain)
+             left (w3-get-style-info 'left-volume)
+             right (w3-get-style-info 'right-volume)
+             pitch (w3-get-style-info 'pitch)
+             pitch-range (w3-get-style-info 'pitch-range)
+             stress (w3-get-style-info 'stress)
+             richness (w3-get-style-info 'richness))
        (if (or family gain left right pitch pitch-range stress richness)
            (setq voice (dtk-personality-from-speech-style
                         (make-dtk-speech-style :family (or family 'paul)
@@ -372,18 +370,15 @@
        "white"
       "black")))
 
-(defun w3-make-face-emacs19 (name &optional doc-string temporary)
-  "Defines and returns a new FACE described by DOC-STRING.
+(defalias 'w3-make-face
+  (cond
+   ((not (fboundp 'make-face)) #'ignore)
+   ((featurep 'xemacs) #'make-face)
+   (t
+    (lambda (name &optional _doc-string _temporary)
+      "Define and return a new FACE described by DOC-STRING.
 If the face already exists, it is unmodified."
-  (make-face name))
-
-(cond
- ((not (fboundp 'make-face))
-  (defalias 'w3-make-face 'ignore))
- ((featurep 'xemacs)
-  (defalias 'w3-make-face 'make-face))
- (t
-  (defalias 'w3-make-face 'w3-make-face-emacs19)))
+      (make-face name)))))
 
 (defsubst w3-face-for-element (node)
   (w3-get-all-face-info)
@@ -453,8 +448,7 @@ If the face already exists, it is unmodified."
        (> w3-last-fill-pos (point-max)))
       (if (not (eq (char-before (point)) ?\n))
          (setq n (1+ n))) ; at least put one line in
-    (let ((fill-column (max (1+ (length fill-prefix)) fill-column))
-         width)
+    (let ((fill-column (max (1+ (length fill-prefix)) fill-column)))
       (case (car w3-display-alignment-stack)
        (center
         (fill-region-as-paragraph w3-last-fill-pos (point) 'center))
@@ -512,41 +506,40 @@ If the face already exists, it is unmodified."
 (defun w3-display-get-cookie (args)
   (if (not (fboundp 'cookie))
       "Sorry, no cookies today."
-    (let* ((href (or (w3-get-attribute 'href) (w3-get-attribute 'src)))
-          (fname (or (cdr-safe (assoc href w3-cookie-cache))
-                     (url-generate-unique-filename "%s.cki")))
-          (st (or (cdr-safe (assq 'start args)) "Loading cookies..."))
-          (nd (or (cdr-safe (assq 'end args)) "Loading cookies... done.")))
-      (if (not (file-exists-p fname))
-         (save-excursion
-           (set-buffer (generate-new-buffer " *cookie*"))
-           (mm-disable-multibyte)
-           (url-insert-file-contents href)
-           (setq buffer-file-name nil)
-           (set-buffer-modified-p nil)    
-           (let ((coding-system-for-write 'binary))
-             (write-region (point-min) (point-max) fname 5))
-           (setq w3-cookie-cache (cons (cons href fname) w3-cookie-cache))))
-      (cookie fname st nd))))
+    (let* ((href (or (w3-get-attribute 'href args)
+                     (w3-get-attribute 'src args)))
+          (fname (cdr-safe (assoc href w3-cookie-cache))))
+      (unless (and fname (file-exists-p fname))
+        (setq fname (make-temp-file "" nil ".cki"))
+        (with-current-buffer (generate-new-buffer " *cookie*")
+          (mm-disable-multibyte)
+          (url-insert-file-contents href)
+          (setq buffer-file-name nil)
+          (set-buffer-modified-p nil)
+          (let ((coding-system-for-write 'binary))
+            (write-region (point-min) (point-max) fname 5))
+          (push (cons href fname) w3-cookie-cache)))
+      (let ((st (or (cdr-safe (assq 'start args)) "Loading cookies..."))
+            (nd (or (cdr-safe (assq 'end args)) "Loading cookies... done.")))
+        (cookie fname st nd)))))
 
 (defun w3-widget-buffer (widget)
-  (let ((overlay (or (widget-get widget :button-overlay)
-                    (widget-get widget :field-overlay)))
-       (extent (or (widget-get widget :button-extent)
-                   (widget-get widget :field-extent))))
-    (or (and overlay (overlay-buffer overlay))
-       (and extent (extent-buffer extent)))))
-
-(defun w3-widget-echo (widget &rest ignore)
-  (save-excursion
-    (set-buffer (or (w3-widget-buffer widget) (current-buffer)))
+  (if (featurep 'xemacs)
+      (let ((extent (or (widget-get widget :button-extent)
+                        (widget-get widget :field-extent))))
+        (and extent (extent-buffer extent)))
+    (let ((overlay (or (widget-get widget :button-overlay)
+                       (widget-get widget :field-overlay))))
+      (and overlay (overlay-buffer overlay)))))
+
+(defun w3-widget-echo (widget &rest _ignore)
+  (with-current-buffer (or (w3-widget-buffer widget) (current-buffer))
     (let* ((url (widget-get widget :href))
           (name (widget-get widget :name))
           (text (buffer-substring (widget-get widget :from)
                                   (widget-get widget :to)))
           (title (widget-get widget :title))
-          (check w3-echo-link)
-          (msg nil))
+          (check w3-echo-link))
       (if url
          (setq url (url-truncate-url-for-viewing url)))
       (if name
@@ -554,14 +547,17 @@ If the face already exists, it is unmodified."
       (if (not (listp check))
          (setq check (cons check '(title url text name))))
       (catch 'exit
-       (while check
-         (and (boundp (car check))
-              (stringp (symbol-value (car check)))
-              (> (length (symbol-value (car check))) 0)
-              (throw 'exit (symbol-value (car check))))
-         (pop check))))))
-
-(defun w3-follow-hyperlink (widget &rest ignore)
+        (dolist (sym check)
+          (let ((val (ecase sym
+                       (name name)
+                       (url url)
+                       (title title)
+                       (text text))))
+            (and (stringp val)
+                 (> (length val) 0)
+                 (throw 'exit val))))))))
+
+(defun w3-follow-hyperlink (widget &rest _ignore)
   (let* ((target (or (widget-get widget :target) w3-base-target))
         (visited (widget-get widget :visited-face))
         (href (widget-get widget :href)))
@@ -581,7 +577,7 @@ If the face already exists, it is unmodified."
       (otherwise
        (w3-fetch href target)))))
 
-(defun w3-balloon-help-callback (object &optional event)
+(defun w3-balloon-help-callback (object &optional _event)
   (let* ((widget (widget-at (extent-start-position object)))
         (href (widget-get widget :href)))
     (if href
@@ -617,7 +613,7 @@ If the face already exists, it is unmodified."
                               (incf (car w3-display-list-stack))
                             1))
                 (margin (1- (car left-margin-stack)))
-                (indent (w3-get-style-info 'text-indent node 0)))
+                (indent (w3-get-style-info 'text-indent 0)))
             (if (> indent 0)
                 (setq margin (+ margin indent))
               (setq margin (max 0 (- margin indent))))
@@ -651,7 +647,7 @@ If the face already exists, it is unmodified."
           )
          (otherwise
           (insert (w3-get-pad-string (+ (car left-margin-stack)
-                                        (w3-get-style-info 'text-indent node 
0)))))
+                                        (w3-get-style-info 'text-indent 0)))))
          )
        (point))
       (list 'start-open t
@@ -661,11 +657,11 @@ If the face already exists, it is unmodified."
 
   (defmacro w3-display-set-margins ()
     `(progn
-       (push (+ (w3-get-style-info 'margin-left node 0)
+       (push (+ (w3-get-style-info 'margin-left 0)
                (car left-margin-stack)) left-margin-stack)
        (push (-
              (car right-margin-stack)
-             (w3-get-style-info 'margin-right node 0)) right-margin-stack)
+             (w3-get-style-info 'margin-right 0)) right-margin-stack)
        (setq fill-column (car right-margin-stack))
        (w3-set-fill-prefix-length (car left-margin-stack))
        (w3-display-handle-list-type)))
@@ -683,17 +679,17 @@ If the face already exists, it is unmodified."
          (w3-display-line-break 1))
        (w3-display-set-margins)
        (push
-        (w3-get-style-info 'white-space node
+        (w3-get-style-info 'white-space
                            (car w3-display-whitespace-stack))
         w3-display-whitespace-stack)
        (push
-        (or (w3-get-attribute 'foobarblatz)
-            (w3-get-style-info 'list-style-type node
+        (or (w3-get-attribute 'foobarblatz args)
+            (w3-get-style-info 'list-style-type
                                (car w3-display-liststyle-stack)))
         w3-display-liststyle-stack)
        (push
-        (or (w3-get-attribute 'align)
-            (w3-get-style-info 'text-align node
+        (or (w3-get-attribute 'align args)
+            (w3-get-style-info 'text-align
                                (car w3-display-alignment-stack)))
         w3-display-alignment-stack)
        (and w3-do-incremental-display (w3-pause)))
@@ -701,17 +697,17 @@ If the face already exists, it is unmodified."
        (w3-display-line-break 0)
        (w3-display-set-margins)
        (push
-        (or (w3-get-attribute 'foobarblatz)
-            (w3-get-style-info 'list-style-type node
+        (or (w3-get-attribute 'foobarblatz args)
+            (w3-get-style-info 'list-style-type
                                (car w3-display-liststyle-stack)))
         w3-display-liststyle-stack)
        (push
-        (w3-get-style-info 'white-space node
+        (w3-get-style-info 'white-space
                            (car w3-display-whitespace-stack))
         w3-display-whitespace-stack)
        (push
-        (w3-get-style-info 'text-align node
-                           (or (w3-get-attribute 'align)
+        (w3-get-style-info 'text-align
+                           (or (w3-get-attribute 'align args)
                                (car w3-display-alignment-stack)))
         w3-display-alignment-stack))
        (otherwise                      ; Assume 'inline' rendering as default
@@ -745,10 +741,10 @@ If the face already exists, it is unmodified."
 
 ;; <link> handling
 (defun w3-parse-link (args)
-  (let* ((type (if (w3-get-attribute 'rel) 'rel 'rev))
-        (desc (w3-get-attribute type))
+  (let* ((type (if (w3-get-attribute 'rel args) 'rel 'rev))
+        (desc (w3-get-attribute type args))
         (dc-desc (and desc (downcase desc))) ; canonical case
-        (dest (w3-get-attribute 'href))
+        (dest (w3-get-attribute 'href args))
         (plist (w3-alist-to-plist args))
         (node-1 (assq type w3-current-links))
         (node-2 (and node-1 desc (or (assoc desc
@@ -863,7 +859,8 @@ If the face already exists, it is unmodified."
        (url-retrieve src 'w3-finalize-image-download-skip-redirects (list src 
buf 'background face)))))))
 
 (defun w3-finalize-image-download-skip-redirects (&rest args)
-  (let (redirect-url errorp)
+  (let (;; redirect-url
+        errorp)
     ;; Handle both styles of `url-retrieve' callbacks...
     (cond
      ((listp (car args))
@@ -872,14 +869,14 @@ If the face already exists, it is unmodified."
        (when (eq (car status) :error)
          (setq errorp (cadr status))
          (setq status (cddr status)))
-       (when (eq (car status) :redirect)
-         (setq redirect-url (second (car args))))
+       ;; (when (eq (car status) :redirect)
+       ;;   (setq redirect-url (second (car args))))
 
        (setq args (cdr args))))
 
      ((eq (car args) :redirect)
       ;; Pre-22 redirect.
-      (setq redirect-url (cadr args))
+      ;; (setq redirect-url (cadr args))
       (while (eq (car args) :redirect)
        (setq args (cddr args)))))
 
@@ -890,7 +887,7 @@ If the face already exists, it is unmodified."
       ;; Actually, for images we don't want to know the real URL, as the
       ;; original address is used when putting the images in the right
       ;; place.  Thus we ignore redirect-url.
-      (apply 'w3-finalize-image-download args))))
+      (apply #'w3-finalize-image-download args))))
 
 (defun w3-finalize-image-download (url buffer &optional widget face)
   (let ((glyph nil)
@@ -900,19 +897,19 @@ If the face already exists, it is unmodified."
                 (widget-get widget 'align))))
     (url-mark-buffer-as-dead (current-buffer))
     ;;(message "Enhancing image...")
-    (let ((default-enable-multibyte-characters nil))
-      (with-temp-buffer
-       (mm-insert-part handle)
-       (setq glyph 
-             (let ((type (cdr-safe (assoc (car (mm-handle-type handle))
-                                          w3-image-mappings))))
-               (if (fboundp 'image-normalize)
-                   (image-normalize type (buffer-string))
-                 (create-image (buffer-string) type 'data
-                               :ascent (case align
-                                         ((bottom nil) 100)
-                                         (center 'center)
-                                         (top 0))))))))
+    (with-temp-buffer
+      (set-buffer-multibyte nil)
+      (mm-insert-part handle)
+      (setq glyph 
+            (let ((type (cdr-safe (assoc (car (mm-handle-type handle))
+                                         w3-image-mappings))))
+              (if (fboundp 'image-normalize)
+                  (image-normalize type (buffer-string))
+                (create-image (buffer-string) type 'data
+                              :ascent (case align
+                                        ((bottom nil) 100)
+                                        (center 'center)
+                                        (top 0)))))))
     ;;(message "Enhancing image... done")
     (cond
      ((w3-image-invalid-glyph-p glyph)
@@ -921,8 +918,7 @@ If the face already exists, it is unmodified."
      ((and (featurep 'xemacs)
           (eq (aref glyph 0) 'xbm))
       (let ((temp-fname (url-generate-unique-filename "%s.xbm")))
-       (save-excursion
-         (set-buffer (generate-new-buffer " *xbm-garbage*"))
+       (with-current-buffer (generate-new-buffer " *xbm-garbage*")
          (erase-buffer)
          (insert (aref glyph 2))
          (setq glyph temp-fname)
@@ -954,15 +950,14 @@ If the face already exists, it is unmodified."
                                  (glyph-image-instance glyph)
                                  buffer))
      ((not (eq widget 'background))
-      (save-excursion
-       (set-buffer buffer)
+      (with-current-buffer buffer
        (if (eq major-mode 'w3-mode)
            (widget-value-set widget glyph)
          (setq w3-image-widgets-waiting
                (cons widget w3-image-widgets-waiting))))))))
 
 (defcustom w3-min-img-size 15
-  "*Image size under which the alt string is replaced by 
`w3-dummy-img-alt-repl'.
+  "Image size under which the alt string is replaced by 
`w3-dummy-img-alt-repl'.
 15 is a bit aggressive, 5 pixels would be safer"
   :group 'w3-images
   :type 'integer
@@ -975,78 +970,86 @@ If the face already exists, it is unmodified."
   :type 'regexp)
 
 (defcustom w3-dummy-img-alt-repl "*"
-  "*Dummy image alt string replacement."
+  "Dummy image alt string replacement."
   :group 'w3-images
   :type 'string)  
 
+(defvar w3--height)
+(defvar w3--width)
+(defvar w3--args)
+
 (defun w3-default-image-alt-func (fname)
-  ;; Assumes height/width bound by calling function
-  (declare (special height width))
-  (if (or (and (stringp height)
-              (< (string-to-int height) w3-min-img-size))
-         (and (stringp width)
-              (< (string-to-int width) w3-min-img-size))
+  ;; Assumes w3--height/width bound by calling function
+  (if (or (and (stringp w3--height)
+              (< (string-to-number w3--height) w3-min-img-size))
+         (and (stringp w3--width)
+              (< (string-to-number w3--width) w3-min-img-size))
          (string-match w3-dummy-img-re fname))
       w3-dummy-img-alt-repl
     (concat "[" (file-name-sans-extension fname) "]")))
 
-(defmacro w3-image-alt (src)
-  `(let* ((doc-alt (w3-get-attribute 'alt))
-         (alt (or (and (stringp doc-alt) (string-match "[^ \t\n]" doc-alt) 
doc-alt)
-                  (cond
-                   ((null w3-auto-image-alt) "")
-                   ((eq t w3-auto-image-alt)
-                    (concat "[IMAGE(" (w3-url-file-nondirectory src) ")] "))
-                   ((stringp w3-auto-image-alt)
-                    (format w3-auto-image-alt (w3-url-file-nondirectory src)))
-                   ((functionp w3-auto-image-alt)
-                    (funcall w3-auto-image-alt (w3-url-file-nondirectory 
src))))))
-         c)
-     (while (setq c (string-match "[\C-i\C-j\C-l\C-m]" alt))
-       (aset alt c ? ))
-     alt))
-
-(defmacro w3-handle-image ()
-  `(let* ((height (w3-get-attribute 'height))
-         (width (w3-get-attribute 'width))
-         (src (or (w3-get-attribute 'src) "Error Image"))
-         (alt (w3-image-alt src))
-         (ismap (and (assq 'ismap args) 'ismap))
-         (usemap (w3-get-attribute 'usemap))
-         (base (w3-get-attribute 'base))
-         (href (and hyperlink-info
-                    (cadr (widget-plist-member (cadr hyperlink-info) :href))))
-         (target (and hyperlink-info
-                      (cadr (widget-plist-member (cadr hyperlink-info)
-                                                 :target))))
-         (widget nil)
-         (align (or (w3-get-attribute 'align)
-                    (w3-get-style-info 'vertical-align node)))
-         (face w3-active-faces))
-     (if (assq '*table-autolayout w3-display-open-element-stack)
-        (insert alt)
-       (setq hyperimage-info
-            (list (point)
-                  (list 'image
-                        :src src       ; Where to load the image from
-                        'alt alt       ; Textual replacement
-                        'ismap ismap   ; Is it a server-side map?
-                        'usemap usemap ; Is it a client-side map?
-                        :href href     ; Hyperlink destination
-                        :target target ; target frame
-                        :button-face face ; img:link or img:visited entry in 
stylesheet
-                        'row w3-display-current-row
-                        'column w3-display-current-col
-                        'align align
-                        )))
-       (setq widget (apply (function widget-create) (cadr hyperimage-info)))
-       (widget-put widget 'buffer (current-buffer))
-       ;;(w3-maybe-start-image-download widget) ; in w3-resurrect-images
-       (if (widget-get widget :from)
-          (add-text-properties (widget-get widget :from)
-                               (widget-get widget :to)
-                               (list 'html-stack 
w3-display-open-element-stack)))
-       (goto-char (point-max)))))
+(defsubst w3-image-alt (src)
+  (let* ((doc-alt (w3-get-attribute 'alt w3--args))
+         (alt (or (and (stringp doc-alt) (string-match "[^ \t\n]" doc-alt) 
doc-alt)
+                  (cond
+                   ((null w3-auto-image-alt) "")
+                   ((eq t w3-auto-image-alt)
+                    (concat "[IMAGE(" (w3-url-file-nondirectory src) ")] "))
+                   ((stringp w3-auto-image-alt)
+                    (format w3-auto-image-alt (w3-url-file-nondirectory src)))
+                   ((functionp w3-auto-image-alt)
+                    (funcall w3-auto-image-alt (w3-url-file-nondirectory 
src))))))
+         c)
+    (while (setq c (string-match "[\C-i\C-j\C-l\C-m]" alt))
+      (aset alt c ? ))
+    alt))
+
+(defvar w3--hyperimage-info)
+(defvar w3--hyperlink-info)
+
+(defvar w3-display-current-row nil)
+(defvar w3-display-current-col nil)
+
+(defsubst w3-handle-image (args)
+  (let* ((w3--height (w3-get-attribute 'height args))
+         (w3--width (w3-get-attribute 'width args))
+         (src (or (w3-get-attribute 'src args) "Error Image"))
+         (alt (w3-image-alt src))
+         (ismap (and (assq 'ismap args) 'ismap))
+         (usemap (w3-get-attribute 'usemap args))
+         (href (and w3--hyperlink-info
+                    (cadr (widget-plist-member (cadr w3--hyperlink-info) 
:href))))
+         (target (and w3--hyperlink-info
+                      (cadr (widget-plist-member (cadr w3--hyperlink-info)
+                                                 :target))))
+         (widget nil)
+         (align (or (w3-get-attribute 'align args)
+                    (w3-get-style-info 'vertical-align)))
+         (face w3-active-faces))
+    (if (assq '*table-autolayout w3-display-open-element-stack)
+        (insert alt)
+      (setq w3--hyperimage-info
+            (list (point)
+                  (list 'image
+                        :src src       ; Where to load the image from
+                        'alt alt       ; Textual replacement
+                        'ismap ismap   ; Is it a server-side map?
+                        'usemap usemap ; Is it a client-side map?
+                        :href href     ; Hyperlink destination
+                        :target target ; target frame
+                        :button-face face ; img:link or img:visited entry in 
stylesheet
+                        'row w3-display-current-row
+                        'column w3-display-current-col
+                        'align align
+                        )))
+      (setq widget (apply (function widget-create) (cadr w3--hyperimage-info)))
+      (widget-put widget 'buffer (current-buffer))
+      ;;(w3-maybe-start-image-download widget) ; in w3-resurrect-images
+      (if (widget-get widget :from)
+          (add-text-properties (widget-get widget :from)
+                               (widget-get widget :to)
+                               (list 'html-stack 
w3-display-open-element-stack)))
+      (goto-char (point-max)))))
 
 ;; The table handling
 (eval-and-compile
@@ -1218,13 +1221,12 @@ This will only work if we used glyphs rather than text 
properties"
                 (aref w3-table-glyph-border-chars i)
                 (aref w3-table-ascii-border-chars i)))
       (setq i (1+ i)))
-    (mapcar (function (lambda (buf)
-                       (save-excursion
-                         (set-buffer buf)
-                         (if (eq major-mode 'w3-mode)
-                             (translate-region (point-min)
-                                               (point-max)
-                                               tr)))))
+    (mapcar (lambda (buf)
+              (with-current-buffer buf
+                (if (eq major-mode 'w3-mode)
+                    (translate-region (point-min)
+                                      (point-max)
+                                      tr))))
            buffs)))
 
 (defvar w3-display-table-cut-words-p nil
@@ -1234,8 +1236,6 @@ This will only work if we used glyphs rather than text 
properties"
   "*Whether to always draw table borders
 Can sometimes make the structure of a document clearer")
 
-(defvar w3-display-current-row nil)
-(defvar w3-display-current-col nil)
 (defvar w3-display-current-cell-offset 0)
 
 (defun w3-display-table-cut ()
@@ -1259,14 +1259,10 @@ Can sometimes make the structure of a document clearer")
   (save-excursion
     (let ((st (point-min))
          (nd nil)
-         (widget nil) parent
-         (to-marker nil)
-         (from-marker nil))
+         (widget nil) parent)
       (while (setq st (next-single-property-change st 'button))
        (setq nd (or (next-single-property-change st 'button) (point-max))
              widget (widget-at st)
-             to-marker (and widget (widget-get widget :to))
-             from-marker (and widget (widget-get widget :from))
              parent (and widget (widget-get widget :parent))
              )
        (if (not widget)
@@ -1284,7 +1280,6 @@ Can sometimes make the structure of a document clearer")
          (setq st (min (point-max) (1+ nd))))))))
 
 (defun w3-size-of-tree (tree minmax)
-  (declare (special args))
   (save-excursion
     (save-restriction
       (narrow-to-region (point) (point))
@@ -1298,7 +1293,7 @@ Can sometimes make the structure of a document clearer")
                                400))) 
            (fill-prefix "")
            (w3-last-fill-pos (point-min))
-           a retval
+            retval
            (w3-do-incremental-display nil)
            (hr-regexp  (concat "^"
                                (regexp-quote 
@@ -1308,7 +1303,7 @@ Can sometimes make the structure of a document clearer")
        ;;(push 'left  w3-display-alignment-stack)
        (push (if (eq minmax 'max) 'nowrap) w3-display-whitespace-stack)
        (while tree
-         (push (cons '*td args) w3-display-open-element-stack)
+         (push (cons '*td w3--args) w3-display-open-element-stack)
          (w3-display-node (pop tree)))
        (pop w3-display-whitespace-stack)
        (goto-char (point-min))
@@ -1330,7 +1325,6 @@ Can sometimes make the structure of a document clearer")
 
 (defun w3-display-table-dimensions (node)
   ;; fill-column sets maximum width
-  (declare (special args))
   (let (min-vector
        max-vector
        rows cols
@@ -1343,7 +1337,7 @@ Can sometimes make the structure of a document clearer")
              rows       (nth 3 table-info)
              cols       (nth 4 table-info))
 
-      (push (cons '*table-autolayout args) w3-display-open-element-stack)
+      (push (cons '*table-autolayout w3--args) w3-display-open-element-stack)
       (let (content
            cur
            (table-spans (list nil))    ; don't make this '(nil) 
@@ -1366,29 +1360,26 @@ Can sometimes make the structure of a document clearer")
               (setq col 0)
               (setq rows (1+ rows))
               (setq ptr table-spans)
-              (mapcar
-               (function
-                (lambda (td)
-                  (setq colspan (string-to-int (or (let ((attr (cdr-safe (assq 
'colspan (nth 1 td)))))
-                                                     (unless (zerop (length 
attr)) attr)) "1"))
-                        rowspan (string-to-int (or (let ((attr (cdr-safe (assq 
'rowspan (nth 1 td)))))
-                                                     (unless (zerop (length 
attr)) attr))"1"))
-                        min  (w3-size-of-tree  (nth 2 td) 'min)
-                        max  (w3-size-of-tree  (nth 2 td) 'max)
-                        )
-                  (while (eq (car-safe (car-safe (cdr ptr))) col)
-                    (setq col (+ col (cdr (cdr (car (cdr ptr))))))
-                    (if (= 0 (decf (car (cdr (car (cdr ptr))))))
-                        (pop (cdr ptr))
-                      (setq ptr (cdr ptr))))
-                  (push (list col colspan min max)
-                        constraints)
-                  (if (= rowspan 1) nil
-                    (push (cons col (cons (1- rowspan) colspan)) (cdr ptr))
-                    (setq ptr (cdr ptr)))
-                  (setq col (+ col colspan))
-                  ))
-               (nth 2 cur))
+              (dolist (td (nth 2 cur))
+                 (setq colspan (string-to-number (or (let ((attr (cdr-safe 
(assq 'colspan (nth 1 td)))))
+                                                       (unless (zerop (length 
attr)) attr)) "1"))
+                       rowspan (string-to-number (or (let ((attr (cdr-safe 
(assq 'rowspan (nth 1 td)))))
+                                                       (unless (zerop (length 
attr)) attr))"1"))
+                       min  (w3-size-of-tree  (nth 2 td) 'min)
+                       max  (w3-size-of-tree  (nth 2 td) 'max)
+                       )
+                 (while (eq (car-safe (car-safe (cdr ptr))) col)
+                   (setq col (+ col (cdr (cdr (car (cdr ptr))))))
+                   (if (= 0 (decf (car (cdr (car (cdr ptr))))))
+                       (pop (cdr ptr))
+                     (setq ptr (cdr ptr))))
+                 (push (list col colspan min max)
+                       constraints)
+                 (if (= rowspan 1) nil
+                   (push (cons col (cons (1- rowspan) colspan)) (cdr ptr))
+                   (setq ptr (cdr ptr)))
+                 (setq col (+ col colspan))
+                 )
               (while (cdr ptr)
                 (if (= 0 (decf (car (cdr (car (cdr ptr))))))
                     (pop (cdr ptr))
@@ -1403,57 +1394,54 @@ Can sometimes make the structure of a document clearer")
            )
          )
        (setq constraints (sort constraints
-                               (function
-                                (lambda (a b)
-                                  (< (cadr a) (cadr b)))))
+                                (lambda (a b) (< (cadr a) (cadr b))))
              min-vector (make-vector cols 0)
              max-vector (make-vector cols 0))
        (let (start end i mincellwidth maxcellwidth)
-         (mapcar (function (lambda (c)
-                             (cond ((= (cadr c) 1) 
-                                    (aset min-vector (car c) 
-                                          (max (aref min-vector (car c))
-                                               (nth 2 c)))
-                                    (aset max-vector (car c) 
-                                          (max (aref max-vector (car c))
-                                               (nth 3 c))))
-                                   (t 
-                                    (setq start (car c)
-                                          end (+ (car c) (cadr c))
-                                          mincellwidth 0
-                                          maxcellwidth 0
-                                          i start)
-                                    (while (< i end)
-                                      (setq mincellwidth (+ mincellwidth
-                                                            (aref min-vector 
i))
-                                            maxcellwidth (+
-                                                          maxcellwidth
-                                                          (aref max-vector i))
-                                            i (1+ i)))
-                                    (setq i start)
-                                    (if (= mincellwidth 0)
-                                        ;; if existing width is 0 divide evenly
-                                        (while (< i end)
-                                          (aset min-vector i
-                                                (/ (nth 2 c) (cadr c)))
-                                          (aset max-vector i
-                                                (/ (nth 3 c) (cadr c)))
-                                          (setq i (1+ i)))
-                                      ;; otherwise weight it by existing widths
-                                      (while (< i end)
-                                        (aset min-vector i
-                                              (max (aref min-vector i)
-                                                   (/ (* (nth 2 c)
-                                                         (aref min-vector i))
-                                                      mincellwidth)))
-                                        (aset max-vector i
-                                              (max (aref max-vector i)
-                                                   (/ (* (nth 3 c)
-                                                         (aref max-vector i))
-                                                      maxcellwidth)))
-                                        (setq i (1+ i))))
-                                    ))))
-                 constraints)))
+         (dolist (c constraints)
+            (cond ((= (cadr c) 1) 
+                   (aset min-vector (car c) 
+                         (max (aref min-vector (car c))
+                              (nth 2 c)))
+                   (aset max-vector (car c) 
+                         (max (aref max-vector (car c))
+                              (nth 3 c))))
+                  (t 
+                   (setq start (car c)
+                         end (+ (car c) (cadr c))
+                         mincellwidth 0
+                         maxcellwidth 0
+                         i start)
+                   (while (< i end)
+                     (setq mincellwidth (+ mincellwidth
+                                           (aref min-vector i))
+                           maxcellwidth (+
+                                         maxcellwidth
+                                         (aref max-vector i))
+                           i (1+ i)))
+                   (setq i start)
+                   (if (= mincellwidth 0)
+                       ;; if existing width is 0 divide evenly
+                       (while (< i end)
+                         (aset min-vector i
+                               (/ (nth 2 c) (cadr c)))
+                         (aset max-vector i
+                               (/ (nth 3 c) (cadr c)))
+                         (setq i (1+ i)))
+                     ;; otherwise weight it by existing widths
+                     (while (< i end)
+                       (aset min-vector i
+                             (max (aref min-vector i)
+                                  (/ (* (nth 2 c)
+                                        (aref min-vector i))
+                                     mincellwidth)))
+                       (aset max-vector i
+                             (max (aref max-vector i)
+                                  (/ (* (nth 3 c)
+                                        (aref max-vector i))
+                                     maxcellwidth)))
+                       (setq i (1+ i))))
+                   )))))
       (push (cons 'w3-table-info
                  (list min-vector max-vector rows cols))
            (cadr node))
@@ -1542,11 +1530,11 @@ Can sometimes make the structure of a document clearer")
             (border-node (cdr-safe (assq 'border args)))
             (border (or w3-display-table-force-borders
                         (and border-node (or
-                                          (/= 0 (string-to-int border-node))
+                                          (/= 0 (string-to-number border-node))
                                           (string= "border" border-node)))))
             (border-char (unless border ? ))
             (valign nil)
-            (align nil)
+            ;; (align nil)
             (content (nth 2 node))
             (avgwidth (/ (- fill-column num-cols num-cols) num-cols))
             (formatted-cols (make-vector num-cols nil))
@@ -1559,9 +1547,7 @@ Can sometimes make the structure of a document clearer")
             (table-colwidth (make-vector num-cols 0))
             (fill-prefix "")
             (height nil)
-            (cur-height nil)
             (cols nil)
-            (rows nil)
             (row 0)
             (this-rectangle nil)
             (inhibit-read-only t)
@@ -1610,9 +1596,9 @@ Can sometimes make the structure of a document clearer")
                                              w3-display-open-element-stack))
             (setq cols (nth 2 (car content))
                   valign (or (cdr-safe (assq 'valign (nth 1 (car content))))
-                             (w3-get-style-info 'vertical-align node))
-                  align  (or (cdr-safe (assq 'align  (nth 1 (car content))))
-                             (w3-get-style-info 'text-align node))
+                             (w3-get-style-info 'vertical-align))
+                  ;; align  (or (cdr-safe (assq 'align  (nth 1 (car content))))
+                  ;;            (w3-get-style-info 'text-align))
                   content (cdr content)
                   row (1+ row))
             (if (and valign (stringp valign))
@@ -1638,7 +1624,7 @@ Can sometimes make the structure of a document clearer")
                                                    w3-current-stylesheet
                                                    
w3-display-open-element-stack))
                   (push (w3-face-for-element (list tag args nil)) 
w3-active-faces)
-                  (push (w3-voice-for-element (list tag args nil)) 
w3-active-voices)
+                  (push (w3-voice-for-element) w3-active-voices)
                   (push (cons tag args) w3-display-open-element-stack)
                   (while cols
                     ;; And need to push these bogus placeholders on there
@@ -1649,16 +1635,16 @@ Can sometimes make the structure of a document clearer")
                     (let* ((node (car cols))
                            (attributes (nth 1 node))
                            (colspan-attr (cdr-safe (assq 'colspan attributes)))
-                           (colspan (string-to-int
+                           (colspan (string-to-number
                                      (or (unless (zerop (length colspan-attr))
                                            colspan-attr)
                                          "1")))
                            (rowspan-attr (cdr-safe (assq 'rowspan attributes)))
-                           (rowspan (string-to-int
+                           (rowspan (string-to-number
                                      (or (unless (zerop (length rowspan-attr))
                                            rowspan-attr)
                                          "1")))
-                           fill-column column-width
+                           fill-column
                            (fill-prefix "")
                            (w3-do-incremental-display nil)
                            (indent-tabs-mode nil)
@@ -1795,14 +1781,15 @@ Can sometimes make the structure of a document clearer")
                 (cond
                  ((= (aref prev-rowspans i) 0)
                   ;; First row, insert the top horizontal divider
-;;; Everything in this functino commented out with ;;; is done so to
-;;; borderless tables work better.  This was an attempt to not show
-;;; the 'spaces' border around the table, to save screen real estate,
-;;; but it messes up indentation on cell columns.
-;;;               (if border
+                   ;;BL Everything in this function commented out with ;;BL is
+                   ;;BL done so to borderless tables work better.  This was an
+                   ;;BL attempt to not show the 'spaces' border around the
+                   ;;BL table, to save screen real estate, but it messes up
+                   ;;BL indentation on cell columns.
+                   ;;BL(if border
                       (w3-insert-terminal-char
                        (w3-table-lookup-char t nil t nil border-char) 
-                       (aref column-dimensions i));;;)
+                       (aref column-dimensions i));;BL)
                   (setq i (1+ i)))
                  ((car (aref formatted-cols i))
                   ;; Slap in the rows
@@ -1816,11 +1803,11 @@ Can sometimes make the structure of a document clearer")
                   (setq lflag nil)
                   (setq i (+ i (max (aref table-colspans i)
                                     (aref prev-colspans  i) 1))))))
-;;;           (if (not border)
-;;;               nil
+               ;;BL (if (not border)
+               ;;BL     nil
                 (w3-insert-terminal-char
                  (w3-table-lookup-char lflag (/= row 1) nil t border-char))
-                (insert "\n"));;;)
+                (insert "\n"));;BL)
             
             ;; recalculate height (in case we've shortened a rowspanning cell)
             (setq height 0 
@@ -1954,9 +1941,9 @@ Can sometimes make the structure of a document clearer")
         (name (plist-get plist 'name))
         (value (or (plist-get plist 'value) ""))
         (size (if (plist-get plist 'size)
-                  (string-to-int (plist-get plist 'size))))
+                  (string-to-number (plist-get plist 'size))))
         (maxlength (if (plist-get plist 'maxlength)
-                       (string-to-int
+                       (string-to-number
                         (plist-get plist 'maxlength))))
         (default value)
         (checked (assq 'checked args)))
@@ -1986,7 +1973,7 @@ Format: (((image-alt row column) . offset) ...)")
 (defun w3-resurrect-images ()
   (let ((st (point-min))
        (inhibit-read-only t)
-       info nd node face widget)
+       info nd widget)
     (while st
       (if (setq info (get-text-property st 'w3-hyperimage-info))
          (progn
@@ -2042,7 +2029,7 @@ Format: (((image-alt row column) . offset) ...)")
   (let ((st (point-min))
        (nd (point-min))
        (inhibit-read-only t)
-       info node face)
+       info)
     (while st
       (if (setq info (get-text-property st 'w3-hyperlink-info))
          (progn
@@ -2082,6 +2069,10 @@ Format: (((image-alt row column) . offset) ...)")
        (push (cons 'codebase (url-view-url t)) options))
     (w3-java-run-applet options params)))
 
+(defvar filladapt-mode)
+(defvar voice-lock-mode)
+(defvar widget-push-button-gui)
+
 (defun w3-display-node (node &optional nofaces)
   (let (
        (content-stack (list (list node)))
@@ -2095,12 +2086,10 @@ Format: (((image-alt row column) . offset) ...)")
        tag
        args
        content
-       hyperlink-info
-       hyperimage-info
+       w3--hyperlink-info
+       w3--hyperimage-info
        break-style
-       cur
        id
-       class
        last-element
        )
     (while content-stack
@@ -2114,27 +2103,27 @@ Format: (((image-alt row column) . offset) ...)")
        ;; goes here.   Couldn't think of any better way to do this when we
        ;; are iterative.  *sigh*
        (a
-        (if (not hyperlink-info)
+        (if (not w3--hyperlink-info)
             nil
-          (add-text-properties (car hyperlink-info) (point)
+          (add-text-properties (car w3--hyperlink-info) (point)
                                (list
                                 'duplicable t
-                                'balloon-help 'w3-balloon-help-callback
+                                'balloon-help #'w3-balloon-help-callback
                                 'start-open t
                                 'end-open t
                                 'rear-nonsticky t
-                                'w3-hyperlink-info (cadr hyperlink-info))))
-        (setq hyperlink-info nil))
+                                'w3-hyperlink-info (cadr w3--hyperlink-info))))
+        (setq w3--hyperlink-info nil))
        (img
-        (if hyperimage-info
-            (add-text-properties (car hyperimage-info) (point)
+        (if w3--hyperimage-info
+            (add-text-properties (car w3--hyperimage-info) (point)
                                  (list
                                   'duplicable t
                                   'start-open t
                                   'end-open t
                                   'rear-nonsticky t
-                                  'w3-hyperimage-info (cadr hyperimage-info))))
-        (setq hyperimage-info nil))
+                                  'w3-hyperimage-info (cadr 
w3--hyperimage-info))))
+        (setq w3--hyperimage-info nil))
        ((ol ul dl dir menu)
         (pop w3-display-list-stack))
        (label
@@ -2161,18 +2150,18 @@ Format: (((image-alt row column) . offset) ...)")
          (setq node (pop content)
                tag (nth 0 node)
                args (nth 1 node)
-               id (or (w3-get-attribute 'name)
-                      (w3-get-attribute 'id))
+               id (or (w3-get-attribute 'name args)
+                      (w3-get-attribute 'id args))
                )
          ;; This little bit of magic takes care of inline styles.
          ;; Evil Evil Evil, but it appears to work.
-         (if (w3-get-attribute 'style)
-             (let ((unique-id (or (w3-get-attribute 'id)
+         (if (w3-get-attribute 'style args)
+             (let ((unique-id (or (w3-get-attribute 'id args)
                                   (w3-display-create-unique-id)))
                    (sheet "")
                    (class (assq 'class args)))
                (setq sheet (format "%s.%s { %s }\n" tag unique-id
-                                   (w3-get-attribute 'style)))
+                                   (w3-get-attribute 'style args)))
                (if class
                    (setcdr class (cons unique-id (cdr class)))
                  (setf (nth 1 node) (cons (cons 'class (list unique-id))
@@ -2185,9 +2174,9 @@ Format: (((image-alt row column) . offset) ...)")
                                           (nth 1 node)
                                           w3-current-stylesheet
                                           w3-display-open-element-stack))
-         (push (w3-get-style-info 'display node) break-style)
-         (push (w3-get-style-info 'insert-after node) insert-after)
-         (setq insert-before (w3-get-style-info 'insert-before node))
+         (push (w3-get-style-info 'display) break-style)
+         (push (w3-get-style-info 'insert-after) insert-after)
+         (setq insert-before (w3-get-style-info 'insert-before))
          (w3-display-handle-break)
          (if (w3-node-visible-p)
              nil
@@ -2199,7 +2188,7 @@ Format: (((image-alt row column) . offset) ...)")
          (if nofaces
              nil
            (push (w3-face-for-element node) w3-active-faces)
-           (push (w3-voice-for-element node) w3-active-voices))
+           (push (w3-voice-for-element) w3-active-voices))
          (setq insert-before nil)
          (if id
              (setq w3-id-positions (cons
@@ -2210,15 +2199,6 @@ Format: (((image-alt row column) . offset) ...)")
          (case tag
            (a                          ; Hyperlinks
             (let* (
-                   (title (w3-get-attribute 'title))
-                   (name (or (w3-get-attribute 'id)
-                             (w3-get-attribute 'name)))
-                   (btdt nil)
-                   class
-                   (before nil)
-                   (after nil)
-                   (face nil)
-                   (voice nil)
                    (st nil)
                    (old-props w3-display-css-properties)
                    (active-face nil)
@@ -2246,31 +2226,32 @@ Format: (((image-alt row column) . offset) ...)")
               (setq visited-face (w3-face-for-element (list tag munged nil)))
               (w3-pop-all-face-info)
               (setq w3-display-css-properties old-props)
-              (if (w3-get-attribute 'href)
+              (if (w3-get-attribute 'href args)
                   (setq st (point)
-                        hyperlink-info (list
-                                        st
-                                        (append
-                                         (list :args nil
-                                               :value "" :tag ""
-                                               :action 'w3-follow-hyperlink
-                                               :button-face '(nil)
-                                               :active-face active-face
-                                               :visited-face visited-face
-                                               :from (set-marker
-                                                      (make-marker) st)
-                                               :help-echo 'w3-widget-echo
-                                               :emacspeak-help 'w3-widget-echo
-                                               )
-                                         (w3-display-convert-arglist args)))))
+                        w3--hyperlink-info
+                         (list
+                          st
+                          (append
+                           (list :args nil
+                                 :value "" :tag ""
+                                 :action 'w3-follow-hyperlink
+                                 :button-face '(nil)
+                                 :active-face active-face
+                                 :visited-face visited-face
+                                 :from (set-marker
+                                        (make-marker) st)
+                                 :help-echo 'w3-widget-echo
+                                 :emacspeak-help 'w3-widget-echo
+                                 )
+                           (w3-display-convert-arglist args)))))
               (w3-handle-content node)
               )
             )
            ((ol ul dl menu)
-            (push (if (or (w3-get-attribute 'start)
-                          (w3-get-attribute 'seqnum))
-                      (1- (string-to-int (or (w3-get-attribute 'start)
-                                             (w3-get-attribute 'seqnum))))
+            (push (if (or (w3-get-attribute 'start args)
+                          (w3-get-attribute 'seqnum args))
+                      (1- (string-to-number (or (w3-get-attribute 'start args)
+                                             (w3-get-attribute 'seqnum args))))
                     0) w3-display-list-stack)
             (w3-handle-content node))
            (dir
@@ -2288,7 +2269,7 @@ Format: (((image-alt row column) . offset) ...)")
                                     (w3-display-chop-into-table node 2)))))
             (w3-handle-content node))
            (img                        ; inlined image
-            (w3-handle-image)
+             (w3-handle-image args)
             (w3-handle-empty-tag))
            (frameset
             (if w3-display-frames
@@ -2310,11 +2291,11 @@ Format: (((image-alt row column) . offset) ...)")
               (w3-handle-content node)))
            (frame
             (if w3-display-frames
-                (let* ((href (or (w3-get-attribute 'src)
-                                 (w3-get-attribute 'href)))
-                       (name (or (w3-get-attribute 'name)
-                                 (w3-get-attribute 'title)
-                                 (w3-get-attribute 'alt)
+                (let* ((href (or (w3-get-attribute 'src args)
+                                 (w3-get-attribute 'href args)))
+                       (name (or (w3-get-attribute 'name args)
+                                 (w3-get-attribute 'title args)
+                                 (w3-get-attribute 'alt args)
                                  "Unknown frame name")))
                   (push (list 'frame name href) w3-frameset-structure)
                   (w3-handle-content
@@ -2341,19 +2322,19 @@ Format: (((image-alt row column) . offset) ...)")
             (w3-handle-content node)
             )
            (hr                         ; Cause line break & insert rule
-            (let* ((perc (or (w3-get-attribute 'width)
-                             (w3-get-style-info 'width node)
+            (let* ((perc (or (w3-get-attribute 'width args)
+                             (w3-get-style-info 'width)
                              "100%"))
                    (width nil))
               (if (stringp perc)
-                  (setq perc (/ (min (string-to-int perc) 100) 100.0)
+                  (setq perc (/ (min (string-to-number perc) 100) 100.0)
                         width (truncate (* fill-column perc)))
                 (setq width perc))
               (w3-insert-terminal-char (w3-horizontal-rule-char) width)
               (w3-handle-empty-tag)))
            (map                        ; Client side imagemaps
-            (let ((name (or (w3-get-attribute 'name)
-                            (w3-get-attribute 'id)
+            (let ((name (or (w3-get-attribute 'name args)
+                            (w3-get-attribute 'id args)
                             "unnamed"))
                   (areas
                    (mapcar
@@ -2361,16 +2342,16 @@ Format: (((image-alt row column) . offset) ...)")
                      (lambda (node)
                        (let* ((args (nth 1 node))
                               (type (downcase (or
-                                               (w3-get-attribute 'shape)
+                                               (w3-get-attribute 'shape args)
                                                "rect")))
                               (coords (w3-decode-area-coords
                                        (or (cdr-safe
                                             (assq 'coords args)) "")))
-                              (alt (w3-get-attribute 'alt))
+                              (alt (w3-get-attribute 'alt args))
                               (href (if (assq 'nohref args)
                                         t
-                                      (or (w3-get-attribute 'src)
-                                          (w3-get-attribute 'href))))
+                                      (or (w3-get-attribute 'src args)
+                                          (w3-get-attribute 'href args))))
                               )
                          (vector type coords href alt))
                        )
@@ -2393,23 +2374,24 @@ Format: (((image-alt row column) . offset) ...)")
                                        (list 'td (list 'align 'right)
                                              (list
                                               (concat
-                                               (or (w3-get-attribute 'role)
+                                               (or (w3-get-attribute 'role 
args)
                                                    "CAUTION") ":")))
                                        (list 'td nil
                                              (nth 2 node)))))))))
             (w3-handle-content node)
             )
            (table
-            (w3-display-table node)
+             (let ((w3--args args))
+               (w3-display-table node))
             (setq w3-last-fill-pos (point))
             (w3-handle-empty-tag)
             )
            (isindex
-            (let ((prompt (or (w3-get-attribute 'prompt)
+            (let ((prompt (or (w3-get-attribute 'prompt args)
                               "Search on (+ separates keywords): "))
                   action node)
-              (setq action (or (w3-get-attribute 'src)
-                               (w3-get-attribute 'href)
+              (setq action (or (w3-get-attribute 'src args)
+                               (w3-get-attribute 'href args)
                                (url-view-url t)))
               (if (and prompt (string-match "[^: \t-]+$" prompt))
                   (setq prompt (concat prompt ": ")))
@@ -2431,12 +2413,12 @@ Format: (((image-alt row column) . offset) ...)")
               (setq w3-current-isindex (cons action prompt)))
             )
            ((html body)
-            (let ((fore (car (delq nil (copy-list w3-face-color))))
-                  (back (car (delq nil (copy-list w3-face-background-color))))
-                  (pixm (car (delq nil (copy-list w3-face-background-image))))
-                  (alink (w3-get-attribute 'alink))
-                  (vlink (w3-get-attribute 'vlink))
-                  (link  (w3-get-attribute 'link))
+            (let ((fore (car (remq nil w3-face-color)))
+                  (back (car (remq nil w3-face-background-color)))
+                  (pixm (car (remq nil w3-face-background-image)))
+                  (alink (w3-get-attribute 'alink args))
+                  (vlink (w3-get-attribute 'vlink args))
+                  (link  (w3-get-attribute 'link args))
                   (sheet "")
                   )
               (if link
@@ -2453,14 +2435,14 @@ Format: (((image-alt row column) . offset) ...)")
                 (if (/= (length sheet) 0)
                     (w3-handle-style (list 'data sheet
                                            'notation "text/css")))
-                (if (and (w3-get-attribute 'background)
+                (if (and (w3-get-attribute 'background args)
                          (not pixm))
                     (progn
-                      (setq pixm (w3-get-attribute 'background))
+                      (setq pixm (w3-get-attribute 'background args))
                       (setf (car w3-face-background-image) pixm)))
-                (if (and (w3-get-attribute 'text) (not fore))
+                (if (and (w3-get-attribute 'text args) (not fore))
                     (progn
-                      (setq fore (w3-fix-color (w3-get-attribute 'text)))
+                      (setq fore (w3-fix-color (w3-get-attribute 'text args)))
                       (setf (car w3-face-color) fore)))
 
                 ;; Here we do some sanity checking of the colors
@@ -2498,7 +2480,8 @@ Format: (((image-alt row column) . offset) ...)")
                       (font-set-face-background 'default back 
(current-buffer)))))
               (w3-handle-content node)))
            (*document
-            (let ((info (mapcar (lambda (x) (cons x (and (boundp x) 
(symbol-value x))))
+            (let ((info (mapcar (lambda (x)
+                                   (cons x (and (boundp x) (symbol-value x))))
                                 w3-persistent-variables)))
               (if (not w3-display-same-buffer)
                   (set-buffer (generate-new-buffer "Untitled")))
@@ -2515,14 +2498,14 @@ Format: (((image-alt row column) . offset) ...)")
                 (error (message  "W3 buffer %s is being drawn." (buffer-name 
(current-buffer)))))
 
               (buffer-disable-undo (current-buffer))
-              (mapcar (function (lambda (x)
-                                  (if (boundp (car x))
-                                      (set (car x) (cdr x))))) info)
+              (dolist (x info)
+                 (if (boundp (car x))
+                     (set (car x) (cdr x))))
               ;; ACK!  We don't like filladapt mode!
               (set (make-local-variable 'filladapt-mode) nil)
               (set (make-local-variable 'adaptive-fill-mode) nil)
               (set (make-local-variable 'voice-lock-mode) t)
-              (set (make-local-variable 'cur-viewing-pos) (point-min))
+              (set (make-local-variable 'w3--cur-viewing-pos) (point-min))
               (setq w3-current-stylesheet (css-copy-stylesheet
                                            w3-user-stylesheet)
                     w3-last-fill-pos (point)
@@ -2533,8 +2516,8 @@ Format: (((image-alt row column) . offset) ...)")
            (*invisible
             (w3-handle-empty-tag))
            (meta
-            (let ((name (w3-get-attribute 'name))
-                  (value (or (w3-get-attribute 'content) "")))
+            (let ((name (w3-get-attribute 'name args))
+                  (value (or (w3-get-attribute 'content args) "")))
               ;; http-equiv is dealt with by `w3-fetch-callback'.
               (if name
                   (setq w3-current-metainfo (cons
@@ -2562,9 +2545,7 @@ Format: (((image-alt row column) . offset) ...)")
             (w3-handle-content node))
            (form
             (setq w3-current-form-number (1+ w3-current-form-number))
-            (let* (
-                   (action (w3-get-attribute 'action))
-                   (url nil))
+            (let* ((action (w3-get-attribute 'action args)))
               (if (not action)
                   (setq args (cons (cons 'action (url-view-url t)) args)))
               (setq w3-display-form-id (cons
@@ -2764,8 +2745,7 @@ Format: (((image-alt row column) . offset) ...)")
         (w3-display-same-buffer t)
         (parse nil))
     (save-window-excursion
-      (save-excursion
-       (set-buffer (get-buffer-create " *w3-region*"))
+      (with-current-buffer (get-buffer-create " *w3-region*")
        (erase-buffer)
        (insert source)
        (setq parse (w3-parse-buffer (current-buffer))))
@@ -2831,8 +2811,7 @@ Format: (((image-alt row column) . offset) ...)")
   (let ((bufs (buffer-list))
        (found nil))
     (while (and bufs (not found))
-      (save-excursion
-       (set-buffer (car bufs))
+      (with-current-buffer (car bufs)
        (setq found (if (and
                         (not (string-match "^ " (buffer-name (car bufs))))
                         (eq major-mode 'w3-mode)
@@ -2930,13 +2909,11 @@ Format: (((image-alt row column) . offset) ...)")
                            next-frame-window (selected-window)))
                     (t
                      (w3-fetch href)))
-              (let ((buf (current-buffer))
-                    (framebuf (w3-buffer-visiting href)))
+              (let ((framebuf (w3-buffer-visiting href)))
                 (cond (framebuf
-                       (set-buffer framebuf)
-                       (setq w3-frame-name name
-                             w3-target-window-distances nil)
-                       (set-buffer buf)
+                       (with-current-buffer framebuf
+                          (setq w3-frame-name name
+                                w3-target-window-distances nil))
                        (select-window next-frame-window))))))
            ((eq (car (car structure)) 'frameset)
             (cond (inhibit-frame
diff --git a/w3-emacs.el b/w3-emacs.el
index 1491a1d..e9a85ba 100644
--- a/w3-emacs.el
+++ b/w3-emacs.el
@@ -1,13 +1,13 @@
 ;;; w3-emacs.el --- Emacs-specific functions for emacs-w3
 
-;; Copyright (c) 1997, 1998, 2001 Free Software Foundation, Inc.
+;; Copyright (c) 1997, 1998, 2001, 2013 Free Software Foundation, Inc.
 
 ;; Author: Dave Love <address@hidden>
 ;; Keywords: hypermedia
 
 ;; This file is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
+;; the Free Software Foundation; either version 3, or (at your option)
 ;; any later version.
 
 ;; This file is distributed in the hope that it will be useful,
@@ -45,17 +45,16 @@
        (cur nil))
     (while (not (eq cur first))
       (setq cur (if cur (next-window cur nil frame) first))
-      (save-excursion
-       (set-buffer (window-buffer cur))
-       (if (and (eq major-mode 'w3-mode)
+      (with-current-buffer (window-buffer cur)
+       (if (and (derived-mode-p 'w3-mode)
                 (not (eq (window-width cur) w3-emacs-window-width)))
            (w3-refresh-buffer))))))
 
+(defvar w3-face-index)
+(defvar w3-display-background-properties)
+
 (defun w3-mode-version-specifics ()
-  (declare (special w3-face-index w3-display-background-properties))
   (setq w3-emacs-window-width (window-width))
-  (if w3-track-mouse
-      (set (make-local-variable 'track-mouse) t))
   (if w3-display-background-properties
       (let ((face (w3-make-face (intern
                                 (format "w3-style-face-%05d" w3-face-index))
@@ -83,15 +82,5 @@
     (if (stringp help)
        (tooltip-show help))))
 
-(defun w3-mouse-handler (e)
-  "Function to message the url under the mouse cursor"
-  (interactive "e")
-  (let* ((pt (posn-point (event-start e)))
-        (good (eq (posn-window (event-start e)) (selected-window)))
-        (mouse-events nil))
-    (if (not (and good pt (number-or-marker-p pt)))
-       nil
-      (widget-echo-help pt))))
-
 (provide 'w3-emacs)
 ;;; w3-emacs.el ends here
diff --git a/w3-emulate.el b/w3-emulate.el
index 05a2787..41dc967 100644
--- a/w3-emulate.el
+++ b/w3-emulate.el
@@ -1,34 +1,34 @@
 ;;; w3-emulate.el --- All variable definitions for emacs-w3
+
+;; Copyright (c) 1996-1999, 2013 Free Software Foundation, Inc.
+
 ;; Author: $Author: fx $
 ;; Created: $Date: 2001/05/29 15:52:51 $
-;; Version: $Revision: 1.3 $
 ;; Keywords: comm, help, hypermedia
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; Provide emulations of various other web browsers
+
+;;; Code:
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Provide emulations of various other web browsers
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (require 'w3-vars)
 (require 'url-vars)
 
diff --git a/w3-fast-parse.el b/w3-fast-parse.el
index a8034f5..dbb2d81 100644
--- a/w3-fast-parse.el
+++ b/w3-fast-parse.el
@@ -2,11 +2,11 @@
 
 ;; Author: William M. Perry <address@hidden>
 
-;; Copyright © 2001 Free Software Foundation
+;; Copyright © 2001, 2013 Free Software Foundation
 ;; 
 ;; This program is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2 of the License, or
+;; the Free Software Foundation; either version 3 of the License, or
 ;; (at your option) any later version.
 ;; 
 ;; This program is distributed in the hope that it will be useful,
@@ -19,7 +19,12 @@
 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 ;; Boston, MA 02111-1307, USA.
 
+;;; Code:
+
 (require 'xml)
+(require 'w3-vars)
+
+(defvar w3-last-parse-tree)             ;From w3-parse.el.
 
 (defvar w3-fast-parse-tidy-program nil)
 
@@ -35,8 +40,9 @@
 (defun w3-fast-parse-find-tidy-program ()
   (w3-fast-parse-find-program "tidy" 'w3-fast-parse-tidy-program))
 
+(defvar base-object)
+
 (defun w3-fast-parse-cleanup (tree)
-  (declare (special base-object))
   (let* (node tag attrs content btdt)
     (while (setq node (car tree))
       (setq tree (cdr tree))
diff --git a/w3-forms.el b/w3-forms.el
index 12d4053..c263bc5 100644
--- a/w3-forms.el
+++ b/w3-forms.el
@@ -1,34 +1,34 @@
 ;;; w3-forms.el --- Emacs-w3 forms parsing code for new display engine
+
+;; Copyright (c) 1996-1999, 2008, 2013 Free Software Foundation, Inc.
+
 ;; Author: $Author: wmperry $
 ;; Created: $Date: 2002/10/23 03:33:41 $
-;; Version: $Revision: 1.11 $
 ;; Keywords: faces, help, comm, data, languages
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996 - 1999, 2008 Free Software Foundation, Inc.
-;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; FORMS processing for HTML
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; FORMS processing for HTML.
+
+;;; Code:
+
 (eval-when-compile
   (require 'cl))
 
@@ -169,33 +169,31 @@
                                   'end-open t
                                   'rear-nonsticky t)))))
 
+(defvar widget-push-button-gui)
+
 ;;;###autoload
 (defun w3-form-resurrect-widgets ()
   (let ((st (point-min))
        ;; FIXME! For some reason this loses on long lines right now.
        (widget-push-button-gui nil)
-       info nd node action face)
+       info nd action face)
     (while st
-      (if (setq info (get-text-property st 'w3-form-info))
-         (progn
-           (setq nd (or (next-single-property-change st 'w3-form-info)
-                        (point-max))
-                 face (cdr info)
-                 info (car info)
-                 action (w3-form-element-action info)
-                 node (assoc action w3-form-elements))
-           (goto-char st)
-           (delete-region st nd)
-           (if (not (w3-form-element-size info))
-               (w3-form-element-set-size info 20))
-           (w3-form-add-element-internal info face)
-           (setq st (next-single-property-change st 'w3-form-info)))
-       (setq st (next-single-property-change st 'w3-form-info))))))
+      (when (setq info (get-text-property st 'w3-form-info))
+        (setq nd (or (next-single-property-change st 'w3-form-info)
+                     (point-max))
+              face (cdr info)
+              info (car info)
+              action (w3-form-element-action info))
+        (goto-char st)
+        (delete-region st nd)
+        (if (not (w3-form-element-size info))
+            (w3-form-element-set-size info 20))
+        (w3-form-add-element-internal info face))
+      (setq st (next-single-property-change st 'w3-form-info)))))
 
 (defsubst w3-form-mark-widget (widget el)
   (let ((widgets (list widget))
-       (children (widget-get widget :children))
-       (parent (widget-get widget :parent)))
+       (children (widget-get widget :children)))
     (w3-form-element-set-widget el widget)
     ;; Get _all_ the children associated with this widget
     (while children
@@ -258,10 +256,9 @@
 (defvar w3-custom-options nil)
 (make-variable-buffer-local 'w3-custom-options)
 
-(defun w3-form-create-custom (el face)
+(defun w3-form-create-custom (el _face)
   (require 'cus-edit)
-  (let* ((name (w3-form-element-name el))
-        (var-name (w3-form-element-value el))
+  (let* ((var-name (w3-form-element-value el))
         (type (plist-get (w3-form-element-plist el) 'custom-type))
         (widget (widget-create (cond ((string-equal type "variable")
                                       'custom-variable)
@@ -327,7 +324,7 @@
     (if (or (not val) (string= val ""))
        (setq val "Push Me"))
     (widget-create 'push-button
-                  :notify 'ignore
+                  :notify #'ignore
                   :button-face face
                   :value-face face
                   val)))
@@ -336,7 +333,7 @@
   (widget-create 'push-button
                 :button-face face
                 :value-face face
-                :notify 'w3-form-submit/reset-callback
+                :notify #'w3-form-submit/reset-callback
                 :value (or
                         (plist-get (w3-form-element-plist el) 'alt)
                         ;; Can it have a value other than "" anyway?
@@ -356,7 +353,7 @@
                      "Submit"
                    "Reset")))
     (widget-create 'push-button
-                  :notify 'w3-form-submit/reset-callback
+                  :notify #'w3-form-submit/reset-callback
                   :button-face face val)))
 
 (defun w3-form-create-file-browser (el face)
@@ -367,7 +364,7 @@
                 :must-match t
                 :value (w3-form-element-value el)))
 
-(defun w3-form-create-keygen-list (el face)
+(defun w3-form-create-keygen-list (_el face)
   (let* ((size (apply 'max (mapcar (lambda (pair) (length (car pair)))
                                   w3-form-valid-key-sizes)))
         (options (mapcar (lambda (pair)
@@ -420,10 +417,10 @@
 ;(defun w3-form-create-multiline (el face)
 ;  (widget-create 'text :value-face face (w3-form-element-value el)))
 
-(defun w3-form-create-multiline (el face)
+(defun w3-form-create-multiline (_el face)
   (widget-create 'push-button
                 :button-face face
-                :notify 'w3-do-text-entry
+                :notify #'w3-do-text-entry
                 "Multiline text area"))
 
 (defun w3-form-create-integer (el face)
@@ -476,7 +473,7 @@
 
 (defun w3-form-default-widget-creator (el face)
   (widget-create 'link
-                :notify 'w3-form-default-button-callback
+                :notify #'w3-form-default-button-callback
                 :value-to-internal 'w3-form-default-button-update
                 :size (w3-form-element-size el)
                 :value-face face
@@ -495,20 +492,19 @@
                     (w3-form-element-size info) nil ? )))
     v))
 
-(defun w3-form-default-button-callback (widget &rest ignore)
+(defun w3-form-default-button-callback (widget &rest _ignore)
   (let* ((obj (widget-get widget :w3-form-data))
         (typ (w3-form-element-type obj))
         (def (widget-value widget))
-        (val nil)
-        )
-    (case typ
-      (password
-       (setq val (funcall url-passwd-entry-func "Password: " def)))
-      (otherwise
-       (setq val (read-string
-                 (concat (capitalize (symbol-name typ)) ": ") def))))
+        (val 
+          (case typ
+            (password
+             (read-passwd "Password: " def))
+            (otherwise
+             (read-string
+              (concat (capitalize (symbol-name typ)) ": ") def)))))
     (widget-value-set widget val))
-  (apply 'w3-form-possibly-submit widget ignore))
+  (w3-form-possibly-submit widget))
 
 ;; These properties tell the help-echo function how to summarize each
 ;; type of widget.
@@ -525,7 +521,7 @@
 (put 'password  'w3-summarize-function 'w3-form-summarize-password)
 (put 'hidden    'w3-summarize-function 'ignore)
 
-(defun w3-form-summarize-field (widget &rest ignore)
+(defun w3-form-summarize-field (widget &rest _ignore)
   "Sumarize a widget that should be a W3 form entry area.
 This can be used as the :help-echo property of all w3 form entry widgets."
   (let ((info nil)
@@ -540,8 +536,8 @@ This can be used as the :help-echo property of all w3 form 
entry widgets."
       (setq info (widget-get widget :w3-form-data)))
     (if (not info)
        (signal 'wrong-type-argument (list 'w3-form-widget widget)))
-    (setq func (or (get (w3-form-element-type info) 'w3-summarize-function)
-                  'w3-form-summarize-default)
+    (setq func (or (get (w3-form-element-type info) #'w3-summarize-function)
+                  #'w3-form-summarize-default)
          msg (and (fboundp func) (funcall func info widget)))
     ;; FIXME!  This should be removed once emacspeak is updated to
     ;; more closely follow the widget-y way of just returning the string
@@ -551,26 +547,25 @@ This can be used as the :help-echo property of all w3 
form entry widgets."
 
 (defsubst w3-form-field-label (data)
   ;;; FIXXX!!! Need to reimplement using the new forms implementation!
-  (declare (special w3-form-labels))
   (cdr-safe
    (assoc (or (plist-get (w3-form-element-plist data) 'id)
              (plist-get (w3-form-element-plist data) 'label))
          w3-form-labels)))
 
-(defun w3-form-summarize-default (data widget)
+(defun w3-form-summarize-default (data _widget)
   (let ((label (w3-form-field-label data))
        (name  (w3-form-element-name data))
        (value (widget-value (w3-form-element-widget data))))
     (format "Text field %s set to: %s" (or label (concat "called " name))
            value)))
 
-(defun w3-form-summarize-password (data widget)
+(defun w3-form-summarize-password (data _widget)
   (let ((label (w3-form-field-label data))
        (name  (w3-form-element-name data)))
     (format "Password field %s is a secret.  Shhh."
            (or label (concat "called " name)))))
 
-(defun w3-form-summarize-multiline (data widget)
+(defun w3-form-summarize-multiline (data _widget)
   (let ((name (w3-form-element-name data))
         (label (w3-form-field-label data))
         (value (w3-form-element-value data)))
@@ -578,25 +573,24 @@ This can be used as the :help-echo property of all w3 
form entry widgets."
            (or label (concat "called " name))
            value)))
 
-(defun w3-form-summarize-checkbox (data widget)
+(defun w3-form-summarize-checkbox (data _widget)
   (let ((name (w3-form-element-name data))
        (label (w3-form-field-label data))
        (checked (widget-value (w3-form-element-widget data))))
     (format "Checkbox %s is %s" (or label name) (if checked "on" "off"))))
 
-(defun w3-form-summarize-option-list (data widget)
+(defun w3-form-summarize-option-list (data _widget)
   (let ((name (w3-form-element-name data))
-       (label (w3-form-field-label data))
-       (default (w3-form-element-default-value data)))
+       (label (w3-form-field-label data)))
     (format "Option list (%s) set to: %s" (or label name)
            (widget-value (w3-form-element-widget data)))))
 
-(defun w3-form-summarize-image (data widget)
+(defun w3-form-summarize-image (data _widget)
   (let ((name (w3-form-element-name data))
        (label (w3-form-field-label data)))
     (concat "Image entry " (or label (concat "called " name)))))
 
-(defun w3-form-summarize-submit-button (data widget)
+(defun w3-form-summarize-submit-button (data _widget)
   (let*  ((type (w3-form-element-type data))
          (label (w3-form-field-label data))
          (button-text (widget-value (w3-form-element-widget data)))
@@ -617,14 +611,14 @@ This can be used as the :help-echo property of all w3 
form entry widgets."
       (format "Press this  to change radio group %s from %s to %s" (or label 
name) cur-value
              this-value))))
 
-(defun w3-form-summarize-file-browser (data widget)
+(defun w3-form-summarize-file-browser (data _widget)
   (let ((name (w3-form-element-name data))
        (label (w3-form-field-label data))
        (file (widget-value (w3-form-element-widget data))))
     (format "File entry %s pointing to: %s" (or label name) (or file
                                                                "[nothing]"))))
 
-(defun w3-form-summarize-keygen-list (data widget)
+(defun w3-form-summarize-keygen-list (data _widget)
   (format "Submitting this form will generate a %d bit key (not)"
          (widget-value (w3-form-element-widget data))))
 
@@ -638,7 +632,7 @@ This can be used as the :help-echo property of all w3 form 
entry widgets."
   ;; Return a list of data entry widgets in form number ACTN
   (cdr-safe (assoc actn w3-form-elements)))
 
-(defun w3-form-possibly-submit (widget &rest ignore)
+(defun w3-form-possibly-submit (widget &rest _ignore)
   (let* ((formobj (widget-get widget :w3-form-data))
         (ident (w3-form-element-action formobj))
         (widgets (w3-all-widgets ident))
@@ -665,7 +659,7 @@ This can be used as the :help-echo property of all w3 form 
entry widgets."
     (if (and (= text-fields 1) text-p)
        (w3-submit-form ident))))
 
-(defun w3-form-submit/reset-callback (widget &rest ignore)
+(defun w3-form-submit/reset-callback (widget &rest _ignore)
   (let* ((formobj (widget-get widget :w3-form-data))
         (w3-submit-button formobj))
     (case (w3-form-element-type formobj)
@@ -678,7 +672,7 @@ This can be used as the :help-echo property of all w3 form 
entry widgets."
        (w3-form-element-type formobj))))))
 
 ;;;###autoload
-(defun w3-do-text-entry (widget &rest ignore)
+(defun w3-do-text-entry (widget &rest _ignore)
   (let* ((data (list widget (current-buffer)))
         (formobj (widget-get widget :w3-form-data))
         (buff (get-buffer-create (format "Form Entry: %s"
@@ -796,15 +790,12 @@ This can be used as the :help-echo property of all w3 
form entry widgets."
                        (cons (w3-form-element-name formobj)
                              (w3-form-element-value formobj))))
                   (file
-                   (let ((dat nil)
-                         (fname (widget-value widget)))
-                     (save-excursion
-                       (set-buffer (get-buffer-create " *w3-temp*"))
+                   (let ((fname (widget-value widget)))
+                     (with-current-buffer (get-buffer-create " *w3-temp*")
                        (erase-buffer)
-                       (setq dat
-                             (condition-case ()
-                                 (insert-file-contents-literally fname)
-                               (error (concat "Error accessing " fname))))
+                        (condition-case ()
+                            (insert-file-contents-literally fname)
+                          (error (concat "Error accessing " fname)))
                        (cons (w3-form-element-name formobj)
                              (cons (list (cons
                                           "filename"
@@ -819,12 +810,12 @@ This can be used as the :help-echo property of all w3 
form entry widgets."
                    (condition-case ()
                        (require 'ssl)
                      (error (error "Not configured for SSL, please read the 
info pages")))
-                   (if (fboundp 'ssl-req-user-cert) nil
-                     (error "This version of SSL isn't capable of requesting 
certificates"))
-                   (let ((challenge (plist-get (w3-form-element-plist formobj) 
'challenge))
-                         (size (widget-value widget)))
-                     (cons (w3-form-element-name formobj)
-                           (ssl-req-user-cert size challenge))))
+                   (if (not (fboundp 'ssl-req-user-cert))
+                        (error "This version of SSL isn't capable of 
requesting certificates")
+                      (let ((challenge (plist-get (w3-form-element-plist 
formobj) 'challenge))
+                            (size (widget-value widget)))
+                        (cons (w3-form-element-name formobj)
+                              (ssl-req-user-cert size challenge)))))
                   ((multiline hidden)
                    (cons (w3-form-element-name formobj)
                          (w3-form-element-value formobj)))
diff --git a/w3-hot.el b/w3-hot.el
index 85f65e4..60a9491 100644
--- a/w3-hot.el
+++ b/w3-hot.el
@@ -1,40 +1,35 @@
 ;;; w3-hot.el --- Main functions for emacs-w3 on all platforms/versions
-;; Author: $Author: fx $
-;; Created: $Date: 2001/05/14 15:51:54 $
-;; Version: $Revision: 1.4 $
-;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Copyright (c) 1996 - 1999, 2013 Free Software Foundation, Inc.
+
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Structure for hotlists
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; (
-;;;  ("name of item1" . "http://foo.bar.com/";)    ;; A single item in hotlist
-;;;  ("name of item2" . (                         ;; A sublist
-;;;                      ("name of item3" . "http://www.ack.com/";)
-;;;                     ))
-;;; )  ; end of hotlist
+;; (
+;;  ("name of item1" . "http://foo.bar.com/";)    ;; A single item in hotlist
+;;  ("name of item2" . (                         ;; A sublist
+;;                      ("name of item3" . "http://www.ack.com/";)
+;;                     ))
+;; )  ; end of hotlist
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (require 'w3-vars)
 (require 'w3-parse)
@@ -52,8 +47,7 @@
   (interactive "fBookmark file: ")
   (if (not (file-readable-p fname))
       (error "Can not read %s..." fname))
-  (save-excursion
-    (set-buffer (get-buffer-create " *bookmark-work*"))
+  (with-current-buffer (get-buffer-create " *bookmark-work*")
     (erase-buffer)
     (insert-file-contents fname)
     (let* ((w3-debug-html nil)
@@ -63,37 +57,35 @@
            bkmarks (nreverse (w3-grok-html-bookmarks parse))
            w3-hotlist bkmarks))))
 
-(eval-when-compile
-  (defsubst w3-hot-push-new-menu ()
-    (declare (special cur-stack))
-    (setq cur-stack (cons (list "") cur-stack)))
+(defvar w3--cur-stack)
+
+(defsubst w3-hot-push-new-menu ()
+  (setq w3--cur-stack (cons (list "") w3--cur-stack)))
 
-  ;; This stores it in menu format
-  '(defsubst w3-hot-push-new-item (title href)
-    (declare (special cur-stack))
-    (setcar cur-stack (cons (vector title (list 'w3-fetch href) t)
-                           (car cur-stack))))
+;; This stores it in menu format
+'(defsubst w3-hot-push-new-item (title href)
+   (setcar w3--cur-stack (cons (vector title (list 'w3-fetch href) t)
+                           (car w3--cur-stack))))
+
+;; This stores it in alist format
+(defsubst w3-hot-push-new-item (title href)
+  (setcar w3--cur-stack (cons (cons title href) (car w3--cur-stack))))
+
+(defvar w3--cur-title)
+
+(defsubst w3-hot-finish-submenu ()
+  (let ((x (nreverse (car w3--cur-stack)))
+        (y (pop w3--cur-title)))
+    (while (string= y "")
+      (setq y (pop w3--cur-title)))
+    (and x (setcar x y))
+    (setq w3--cur-stack (cdr w3--cur-stack))
+    (if w3--cur-stack
+        (setcar w3--cur-stack (cons x (car w3--cur-stack)))
+      (setq w3--cur-stack (list x)))))
 
-  ;; This stores it in alist format
-  (defsubst w3-hot-push-new-item (title href)
-    (declare (special cur-stack))
-    (setcar cur-stack (cons (cons title href) (car cur-stack))))
-  
-  (defsubst w3-hot-finish-submenu ()
-    (declare (special cur-stack cur-title))
-    (let ((x (nreverse (car cur-stack)))
-         (y (pop cur-title)))
-      (while (string= y "")
-       (setq y (pop cur-title)))
-      (and x (setcar x y))
-      (setq cur-stack (cdr cur-stack))
-      (if cur-stack
-         (setcar cur-stack (cons x (car cur-stack)))
-       (setq cur-stack (list x)))))
-  )
 
 (defun w3-grok-html-bookmarks-internal (tree)
-  (declare (special cur-stack cur-title))
   (let (node tag content args)
     (while tree
       (setq node (car tree)
@@ -103,9 +95,9 @@
            content (and (listp node) (nth 2 node)))
       (cond
        ((eq tag 'hr)
-       (setq cur-title '("------")))
+       (setq w3--cur-title '("------")))
        ((eq tag 'title)
-       (setq cur-title (list (w3-normalize-spaces (car content))))
+       (setq w3--cur-title (list (w3-normalize-spaces (car content))))
        (w3-grok-html-bookmarks-internal content))
        ((memq tag '(dl ol ul))
        (w3-hot-push-new-menu)
@@ -113,8 +105,8 @@
        (w3-hot-finish-submenu))
        ((and (memq tag '(dt li p))
             (stringp (car content)))
-       (setq cur-title (cons (w3-normalize-spaces (car content))
-                             cur-title)))
+       (setq w3--cur-title (cons (w3-normalize-spaces (car content))
+                             w3--cur-title)))
        ((and (eq tag 'a)
             (stringp (car-safe content))
             (cdr-safe (assq 'href args)))
@@ -125,33 +117,34 @@
 
 (defun w3-grok-html-bookmarks (chunk)
   (let (
-       cur-title
-       cur-stack
+       w3--cur-title
+       w3--cur-stack
        )
     (w3-grok-html-bookmarks-internal chunk)
-    (reverse (car cur-stack))))
+    (reverse (car w3--cur-stack))))
 
-(defun w3-hot-convert-to-alist-mapper (node)
-  (declare (special prefix alist))
-  (cond
-   ((stringp node)
-    ;; Top-level node... ignore
-    )
-   ((stringp (cdr node))
-    ;; A real hyperlink, push it onto the alist
-    (push (cons (if prefix (concat prefix " / " (car node)) (car node)) (cdr 
node)) alist))
-   (t
-    ;; A submenu, add to prefix and recurse
-    (w3-hot-convert-to-alist-internal
-     (cdr node) (if prefix (concat prefix " / " (car node)) (car node))))))
+(defvar w3--alist)
 
 (defun w3-hot-convert-to-alist-internal (l &optional prefix)
-  (mapc 'w3-hot-convert-to-alist-mapper l))
+  (dolist (node l)
+    (cond
+     ((stringp node)
+      ;; Top-level node... ignore.
+      )
+     ((stringp (cdr node))
+      ;; A real hyperlink, push it onto the alist.
+      (push (cons (if prefix (concat prefix " / " (car node)) (car node))
+                  (cdr node))
+            w3--alist))
+     (t
+      ;; A submenu, add to prefix and recurse.
+      (w3-hot-convert-to-alist-internal
+       (cdr node) (if prefix (concat prefix " / " (car node)) (car node)))))))
 
 (defun w3-hot-convert-to-alist (l)
-  (let ((alist nil))
+  (let ((w3--alist nil))
     (w3-hot-convert-to-alist-internal l)
-    alist))
+    w3--alist))
        
 (defun w3-delete-from-alist (x alist)
   ;; Remove X from ALIST, return new alist
@@ -161,7 +154,8 @@
 (defun w3-hotlist-parse-old-mosaic-format ()
   (let (cur-link cur-alias)
     (while (re-search-forward "^\n" nil t) (replace-match ""))
-    (goto-line 3)
+    (goto-char (point-min))
+    (forward-line 2)
     (while (not (eobp))
       (re-search-forward "^[^ ]*" nil t)
       (setq cur-link (buffer-substring (match-beginning 0) (match-end 0)))
@@ -182,24 +176,22 @@
   (setq w3-hotlist nil)
   (if (not (file-exists-p fname))
       (message "%s does not exist!" fname)
-    (let* ((old-buffer (current-buffer))
-          (buffer (get-buffer-create " *HOTW3*"))
+    (let* ((buffer (get-buffer-create " *HOTW3*"))
           (case-fold-search t))
-      (set-buffer buffer)
-      (erase-buffer)
-      (insert-file-contents fname)
-      (goto-char (point-min))
-      (cond
-       ((looking-at "ncsa-xmosaic-hotlist-format-1");; Old-style NCSA Mosaic
-       (w3-hotlist-parse-old-mosaic-format))
-       ((or (looking-at "<!DOCTYPE")   ; Some HTML style, including netscape
-           (re-search-forward "<a[ \n]+href" nil t))
-       (w3-read-html-bookmarks fname))
-       (t
-       (message "Cannot determine format of hotlist file: %s" fname)))
-      (set-buffer-modified-p nil)
-      (kill-buffer buffer)
-      (set-buffer old-buffer))))
+      (with-current-buffer buffer
+        (erase-buffer)
+        (insert-file-contents fname)
+        (goto-char (point-min))
+        (cond
+         ((looking-at "ncsa-xmosaic-hotlist-format-1") ;; Old-style NCSA Mosaic
+          (w3-hotlist-parse-old-mosaic-format))
+         ((or (looking-at "<!DOCTYPE") ; Some HTML style, including netscape
+              (re-search-forward "<a[ \n]+href" nil t))
+          (w3-read-html-bookmarks fname))
+         (t
+          (message "Cannot determine format of hotlist file: %s" fname)))
+        (set-buffer-modified-p nil)
+        (kill-buffer buffer)))))
 
 ;;;###autoload
 (defun w3-use-hotlist ()
@@ -233,7 +225,7 @@ visited or interesting items you have found on the World 
Wide Web."
     (w3-hotlist-add-document pref-arg (or title url) url)))
 
 ;;;###autoload
-(defun w3-hotlist-add-document (pref-arg &optional the-title the-url)
+(defun w3-hotlist-add-document (_pref-arg &optional _the-title _the-url)
   "Add this documents url to the hotlist"
   (interactive "P")
   (error "Adding to hotlist not implemented yet."))
diff --git a/w3-hotindex.el b/w3-hotindex.el
index 1cb683f..e75e07d 100644
--- a/w3-hotindex.el
+++ b/w3-hotindex.el
@@ -1,18 +1,40 @@
 ;;; w3-hotindex.el --- Keywords for the hotlist
+
+;; Copyright (C) 2013  Free Software Foundation, Inc.
+
 ;; Author: Laurent Martelli <address@hidden>
 ;; Created: 1997/12/31
-;; Version: 0.1
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
 ;; TODO:
 ;;   patch w3-hot.el so that it removes hotindex entries.
 ;;   update w3-hotindex-key-list when removing entries.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Structure for hotindexes
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; (
-;;;  ("name of item1" "key1" "key2")
-;;; )  ; end of hotlist
-;;; Every "name of item" must be in the hotlist
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Structure for hotindexes
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; (
+;;  ("name of item1" "key1" "key2")
+;; )  ; end of hotlist
+;; Every "name of item" must be in the hotlist
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; Code:
 
 (require 'w3-vars)
 (require 'w3-hot)
@@ -150,15 +172,17 @@ Case is therefore important."
     (while index
       (if (member-nocase key (cdr (car index)))
          (progn
-           (setq result (cons (assoc-ignore-case (caar index) w3-hotlist) 
result))
+           (push (assoc-string (caar index) w3-hotlist t) result)
            (message "MATCH in %S" (car index))
-           (message "ADDING %S" (assoc-ignore-case (caar index) w3-hotlist)))
+           (message "ADDING %S" (assoc-string (caar index) w3-hotlist t)))
        (message "no match in %S" (car index)))
       (setq index (cdr index)))
     (let ((w3-hotlist result)
          (w3-reuse-buffers 'no))
       (w3-hotlist-view))))
 
+(defvar print-readably)
+
 (defun w3-hotindex-save (filename)
   "*Save the index structure in filename. If filename is nil, 
 save into w3-configuration-directory/hotindex."
@@ -166,8 +190,7 @@ save into w3-configuration-directory/hotindex."
   (let ((output-buffer 
         (find-file-noselect (or filename w3-hotindex-file)))
        output-marker)
-    (save-excursion
-      (set-buffer output-buffer)
+    (with-current-buffer output-buffer
       ;; Delete anything that is in the file
       (delete-region (point-min) (point-max))
       (setq output-marker (point-marker))
@@ -181,8 +204,7 @@ save into w3-configuration-directory/hotindex."
        (princ ")\n;; ==================\n")
        (princ ";; End of W3 HotIndex\n")))
     (set-marker output-marker nil)
-    (save-excursion
-      (set-buffer output-buffer)
+    (with-current-buffer output-buffer
       (save-buffer))
     ))
 
@@ -191,7 +213,7 @@ save into w3-configuration-directory/hotindex."
 Raises an error if some entries are unresolved."
   (let ((index w3-hotindex) unresolved)
     (while index
-      (unless (assoc-ignore-case (caar index) w3-hotlist)
+      (unless (assoc-string (caar index) w3-hotlist t)
        (setq unresolved (cons (caar index) unresolved)))
       (setq index (cdr index)))
     (if unresolved
diff --git a/w3-imap.el b/w3-imap.el
index 99948cf..8f8ae11 100644
--- a/w3-imap.el
+++ b/w3-imap.el
@@ -1,30 +1,29 @@
 ;;; w3-imap.el --- Imagemap functions
+
+;; Copyright (c) 1996-1999, 2013 Free Software Foundation, Inc.
+
 ;; Author: $Author: legoscia $
 ;; Created: $Date: 2006/10/12 21:32:16 $
-;; Version: $Revision: 1.5 $
 ;; Keywords: hypermedia
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
 
 (require 'w3-vars)
 (require 'url)
@@ -37,38 +36,38 @@
   (defmacro x-coord (pt) (list 'aref pt 0))
   (defmacro y-coord (pt) (list 'aref pt 1)))
 
-(defun w3-point-in-rect (point coord1 coord2 &rest ignore)
-  "Return t iff POINT is within a rectangle defined by COORD1 and COORD2.
-All arguments are vectors of [X Y] coordinates."
-  ;; D'uhhh, this is hard.
-  (and (>= (x-coord point) (x-coord coord1))
-       (<= (x-coord point) (x-coord coord2))
-       (>= (y-coord point) (y-coord coord1))
-       (<= (y-coord point) (y-coord coord2))))
-
-(defun w3-point-in-circle (point coord1 coord2 &rest ignore)
-  "Return t iff POINT is within a circle defined by COORD1 and COORD2.
-All arguments are vectors of [X Y] coordinates."
-  ;; D'uhhh, this is (barely) slightly harder.
-  (let (radius1 radius2)
-    (setq radius1 (+
-                  (*
-                   (- (y-coord coord1) (y-coord coord2))
-                   (- (y-coord coord1) (y-coord coord2)))
-                  (*
-                   (- (x-coord coord1) (x-coord coord2))
-                   (- (x-coord coord1) (x-coord coord2)))
-                  )
-         radius2 (+
-                  (*
-                   (- (y-coord coord1) (y-coord point))
-                   (- (y-coord coord1) (y-coord point)))
-                  (*
-                   (- (x-coord coord1) (x-coord point))
-                   (- (x-coord coord1) (x-coord point)))
-                  )
-         )
-    (<= radius2 radius1)))
+;; (defun w3-point-in-rect (point coord1 coord2 &rest _ignore)
+;;   "Return t iff POINT is within a rectangle defined by COORD1 and COORD2.
+;; All arguments are vectors of [X Y] coordinates."
+;;   ;; D'uhhh, this is hard.
+;;   (and (>= (x-coord point) (x-coord coord1))
+;;        (<= (x-coord point) (x-coord coord2))
+;;        (>= (y-coord point) (y-coord coord1))
+;;        (<= (y-coord point) (y-coord coord2))))
+
+;; (defun w3-point-in-circle (point coord1 coord2 &rest _ignore)
+;;   "Return t iff POINT is within a circle defined by COORD1 and COORD2.
+;; All arguments are vectors of [X Y] coordinates."
+;;   ;; D'uhhh, this is (barely) slightly harder.
+;;   (let (radius1 radius2)
+;;     (setq radius1 (+
+;;                (*
+;;                 (- (y-coord coord1) (y-coord coord2))
+;;                 (- (y-coord coord1) (y-coord coord2)))
+;;                (*
+;;                 (- (x-coord coord1) (x-coord coord2))
+;;                 (- (x-coord coord1) (x-coord coord2)))
+;;                )
+;;       radius2 (+
+;;                (*
+;;                 (- (y-coord coord1) (y-coord point))
+;;                 (- (y-coord coord1) (y-coord point)))
+;;                (*
+;;                 (- (x-coord coord1) (x-coord point))
+;;                 (- (x-coord coord1) (x-coord point)))
+;;                )
+;;       )
+;;     (<= radius2 radius1)))
 
 ;; A polygon is a vector
 ;; poly[0] = # of sides
@@ -170,8 +169,8 @@ vectors."
        (setq i (1+ i)))
       (= 1 (% hitcount 2)))))
 
-(defun w3-point-in-default (point &rest ignore)
-  t)
+;; (defun w3-point-in-default (_point &rest _ignore)
+;;   t)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
diff --git a/w3-java.el b/w3-java.el
index 289a978..60cb8d5 100644
--- a/w3-java.el
+++ b/w3-java.el
@@ -1,29 +1,30 @@
 ;;; w3-java.el --- Rudimentary java support
+
+;; Copyright (c) 1999, 2008, 2013 Free Software Foundation, Inc.
+
 ;; Author: $Author: fx $
 ;; Created: $Date: 2002/01/22 18:31:50 $
-;; Version: $Revision: 1.3 $
 ;; Keywords: hypermedia, scripting
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1999, 2008 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
+
 (require 'mailcap)
 (require 'url-util)                    ; for `url-generate-unique-filename'
 
@@ -33,23 +34,21 @@
   :group 'w3)
 
 (defcustom w3-java-vm-program "hotjava"
-  "*The program name of the Java virtual machine."
+  "The program name of the Java virtual machine."
   :type '(choice (string :tag "External program")
-                (function :tag "Lisp function"))
-  :group 'w3-java)
+                (function :tag "Lisp function")))
 
 (defcustom w3-java-vm-arguments '(file)
-  "*Arguments that should be passed to the program `w3-java-vm-program'.
+  "Arguments that should be passed to the program `w3-java-vm-program'.
 The special symbol 'file may be used in the list of arguments and will
 be replaced with the name of a file containing the commands to run a
 Java applet."
-  :type 'list
-  :group 'w3-java)
+  :type 'list)
 
 (defun w3-java-run-applet (options params)
-  (let ((file (url-generate-unique-filename "%s-runjava.html")))
-    (save-excursion
-      (set-buffer (get-buffer-create " *java*"))
+  (defvar file)
+  (let ((file (make-temp-file "w3-" nil "-runjava.html")))
+    (with-current-buffer (get-buffer-create " *java*")
       (erase-buffer)
       (insert "<html>\n"
              " <head>\n"
@@ -66,7 +65,10 @@ Java applet."
              "  <applet "
              (mapconcat (lambda (x) (format "%s=\"%s\"" (car x) (cdr x))) 
options " ")
              ">\n"
-             (mapconcat (lambda (x) (format "   <param name=\"%s\" 
value=\"%s\">" (car x) (cdr x))) params "\n")
+             (mapconcat (lambda (x)
+                           (format "   <param name=\"%s\" value=\"%s\">"
+                                   (car x) (cdr x)))
+                         params "\n")
              "  </applet>\n"
              " </body>\n"
              "</html>\n")
@@ -78,9 +80,9 @@ Java applet."
            (setq proc (eval
                        `(start-process name buffer w3-java-vm-program
                                        ,@w3-java-vm-arguments)))
-           (process-kill-without-query proc)
+           (set-process-query-on-exit-flag proc nil)
            proc)
        (eval `(funcall w3-java-vm-program
-                         ,@w3-java-vm-arguments))))))
+                        ,@w3-java-vm-arguments))))))
 
 (provide 'w3-java)
diff --git a/w3-keymap.el b/w3-keymap.el
index 49ac088..9c43f82 100644
--- a/w3-keymap.el
+++ b/w3-keymap.el
@@ -1,119 +1,121 @@
 ;;; w3-keymap.el --- Keybindings for Emacs/W3
+
+;; Copyright (c) 1996 - 1999, 2013 Free Software Foundation, Inc.
+
 ;; Author: $Author: fx $
 ;; Created: $Date: 2001/05/29 15:46:28 $
-;; Version: $Revision: 1.2 $
 ;; Keywords: comm, help, hypermedia
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;  Keymap definitions
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defvar w3-mode-map (make-sparse-keymap) "Keymap to use in w3-mode.")
-(suppress-keymap w3-mode-map)
-(set-keymap-parent w3-mode-map widget-keymap)
+(defvar w3-mode-map
+  (let ((map (make-sparse-keymap)))
+    (suppress-keymap map)
+    (set-keymap-parent map widget-keymap)
 
-(define-key w3-mode-map "h" (make-sparse-keymap))
-(define-key w3-mode-map "H" (make-sparse-keymap))
-(define-key w3-mode-map "a" (make-sparse-keymap))
+    (define-key map "h" (make-sparse-keymap))
+    (define-key map "H" (make-sparse-keymap))
+    (define-key map "a" (make-sparse-keymap))
 
-(define-key w3-mode-map "ha"       'w3-hotlist-apropos)
-(define-key w3-mode-map "hd"       'w3-hotlist-delete)
-(define-key w3-mode-map "hi"       'w3-hotlist-add-document)
-(define-key w3-mode-map "hv"       'w3-hotlist-view)
-(define-key w3-mode-map "hr"       'w3-hotlist-rename-entry)
-(define-key w3-mode-map "hu"       'w3-use-hotlist)
-(define-key w3-mode-map "hA"       'w3-hotlist-append)
-(define-key w3-mode-map "hI"       'w3-hotlist-add-document-at-point)
-(define-key w3-mode-map "hR"       'w3-hotlist-refresh)
+    (define-key map "ha"       'w3-hotlist-apropos)
+    (define-key map "hd"       'w3-hotlist-delete)
+    (define-key map "hi"       'w3-hotlist-add-document)
+    (define-key map "hv"       'w3-hotlist-view)
+    (define-key map "hr"       'w3-hotlist-rename-entry)
+    (define-key map "hu"       'w3-use-hotlist)
+    (define-key map "hA"       'w3-hotlist-append)
+    (define-key map "hI"       'w3-hotlist-add-document-at-point)
+    (define-key map "hR"       'w3-hotlist-refresh)
 
-(define-key w3-mode-map "x" (make-sparse-keymap))
-(define-key w3-mode-map "xa" 'w3-hotindex-add-key)
-(define-key w3-mode-map "xd" 'w3-hotindex-rm-key)
-(define-key w3-mode-map "xq" 'w3-hotindex-query)
+    (define-key map "x" (make-sparse-keymap))
+    (define-key map "xa" 'w3-hotindex-add-key)
+    (define-key map "xd" 'w3-hotindex-rm-key)
+    (define-key map "xq" 'w3-hotindex-query)
 
-(define-key w3-mode-map "HF"       'w3-history-forward)
-(define-key w3-mode-map "HB"       'w3-history-backward)
-(define-key w3-mode-map "Hv"       'w3-show-history-list)
+    (define-key map "HF"       'w3-history-forward)
+    (define-key map "HB"       'w3-history-backward)
+    (define-key map "Hv"       'w3-show-history-list)
 
-(define-key w3-mode-map " "       'w3-scroll-up)
-(define-key w3-mode-map "<"        'beginning-of-buffer)
-(define-key w3-mode-map ">"        'end-of-buffer)
-(define-key w3-mode-map "?"        'w3-help)
-(define-key w3-mode-map "B"        'w3-history-backward)
-(define-key w3-mode-map "D"        'w3-download-url-at-point)
-(define-key w3-mode-map "F"        'w3-history-forward)
-(define-key w3-mode-map "G"        'w3-show-graphics)
-(define-key w3-mode-map "I"        'w3-popup-info)
-(define-key w3-mode-map "K"        'w3-save-this-url)
-;; FIXME!
-;;(define-key w3-mode-map "P"        'w3-print-url-under-point)
-(define-key w3-mode-map "Q"        'w3-leave-buffer)
-(define-key w3-mode-map "R"        'w3-refresh-buffer)
-(define-key w3-mode-map "S"        'w3-source-document-at-point)
-(define-key w3-mode-map "U"        'w3-use-links)
-(define-key w3-mode-map "V"        'w3-view-this-url)
-(define-key w3-mode-map "\C-?"     'scroll-down)
-(define-key w3-mode-map [backspace] 'scroll-down)
-(define-key w3-mode-map "\C-c\C-b" 'w3-show-history-list)
-(define-key w3-mode-map "\C-c\C-v" 'w3-version)
-(define-key w3-mode-map "\C-o"     'w3-fetch)
-(define-key w3-mode-map "\M-M"     'w3-mail-document-under-point)
-(define-key w3-mode-map "\M-m"    'w3-mail-current-document)
-(define-key w3-mode-map "\M-s"    'w3-save-as)
-(define-key w3-mode-map "\M-\r"    'w3-follow-inlined-image)
-(define-key w3-mode-map "b"       'w3-widget-backward)
-(define-key w3-mode-map "c"        'w3-mail-document-author)
-(define-key w3-mode-map "d"        'w3-download-this-url)
-(define-key w3-mode-map "f"       'w3-widget-forward)
-(define-key w3-mode-map "g"        'w3-reload-document)
-(define-key w3-mode-map "i"        'w3-document-information)
-(define-key w3-mode-map "k"        'w3-save-url)
-(define-key w3-mode-map "l"        'w3-goto-last-buffer)
-(define-key w3-mode-map "m"        'w3-complete-link)
-(define-key w3-mode-map "n"        'w3-widget-forward)
-(define-key w3-mode-map "o"       'w3-open-local)
-(define-key w3-mode-map "p"        'w3-print-this-url)
-(define-key w3-mode-map "q"       'w3-quit)
-(define-key w3-mode-map "r"        'w3-reload-document)
-(define-key w3-mode-map "s"        'w3-source-document)
-(define-key w3-mode-map "u"        'w3-leave-buffer)
-(define-key w3-mode-map "v"       'url-view-url)
-(define-key w3-mode-map "w"        'w3-submit-bug)
+    (define-key map " "           'w3-scroll-up)
+    (define-key map "<"        'beginning-of-buffer)
+    (define-key map ">"        'end-of-buffer)
+    (define-key map "?"        'w3-help)
+    (define-key map "B"        'w3-history-backward)
+    (define-key map "D"        'w3-download-url-at-point)
+    (define-key map "F"        'w3-history-forward)
+    (define-key map "G"        'w3-show-graphics)
+    (define-key map "I"        'w3-popup-info)
+    (define-key map "K"        'w3-save-this-url)
+    ;; FIXME!
+    ;;(define-key map "P"        'w3-print-url-under-point)
+    (define-key map "Q"        'w3-leave-buffer)
+    (define-key map "R"        'w3-refresh-buffer)
+    (define-key map "S"        'w3-source-document-at-point)
+    (define-key map "U"        'w3-use-links)
+    (define-key map "V"        'w3-view-this-url)
+    (define-key map "\C-?"     'scroll-down)
+    (define-key map [backspace] 'scroll-down)
+    (define-key map "\C-c\C-b" 'w3-show-history-list)
+    (define-key map "\C-c\C-v" 'w3-version)
+    (define-key map "\C-o"     'w3-fetch)
+    (define-key map "\M-M"     'w3-mail-document-under-point)
+    (define-key map "\M-m"        'w3-mail-current-document)
+    (define-key map "\M-s"        'w3-save-as)
+    (define-key map "\M-\r"    'w3-follow-inlined-image)
+    (define-key map "b"           'w3-widget-backward)
+    (define-key map "c"        'w3-mail-document-author)
+    (define-key map "d"        'w3-download-this-url)
+    (define-key map "f"           'w3-widget-forward)
+    (define-key map "g"        'w3-reload-document)
+    (define-key map "i"        'w3-document-information)
+    (define-key map "k"        'w3-save-url)
+    (define-key map "l"        'w3-goto-last-buffer)
+    (define-key map "m"        'w3-complete-link)
+    (define-key map "n"        'w3-widget-forward)
+    (define-key map "o"           'w3-open-local)
+    (define-key map "p"        'w3-print-this-url)
+    (define-key map "q"           'w3-quit)
+    (define-key map "r"        'w3-reload-document)
+    (define-key map "s"        'w3-source-document)
+    (define-key map "u"        'w3-leave-buffer)
+    (define-key map "v"           'url-view-url)
+    (define-key map "w"        'w3-submit-bug)
 
-;; These are duplicated here instead of just inherited from widget-keymap
-;; due to some issues with Emacspeak.  FIXME.
-(define-key w3-mode-map [tab] 'w3-widget-forward)
-(define-key w3-mode-map [(shift tab)] 'w3-widget-backward)
-(define-key w3-mode-map [(meta tab)] 'w3-widget-backward)
-(define-key w3-mode-map [backtab] 'w3-widget-backward)
+    ;; These are duplicated here instead of just inherited from widget-keymap
+    ;; due to some issues with Emacspeak.  FIXME.
+    (define-key map [tab] 'w3-widget-forward)
+    (define-key map [(shift tab)] 'w3-widget-backward)
+    (define-key map [(meta tab)] 'w3-widget-backward)
+    (define-key map [backtab] 'w3-widget-backward)
 
-;; Emulate some netscape stuff by default
-(define-key w3-mode-map [(control alt t)] 'url-list-processes)
-(define-key w3-mode-map [(control meta t)] 'url-list-processes)
+    ;; Emulate some netscape stuff by default
+    (define-key map [(control alt t)] 'url-list-processes)
+    (define-key map [(control meta t)] 'url-list-processes)
 
-;; Have fun with document ordering
-(define-key w3-mode-map [(meta space)] 'w3-next-document)
-(define-key w3-mode-map [(meta delete)] 'w3-prev-document)
+    ;; Have fun with document ordering
+    (define-key map [(meta space)] 'w3-next-document)
+    (define-key map [(meta delete)] 'w3-prev-document)
+    map)
+  "Keymap to use in w3-mode.")
 
 (provide 'w3-keymap)
diff --git a/w3-latex.el b/w3-latex.el
index b141997..ae12cbb 100644
--- a/w3-latex.el
+++ b/w3-latex.el
@@ -1,45 +1,50 @@
 ;;; w3-latex.el --- Emacs-W3 printing via LaTeX
+
+;; Copyright (c) 1996-1997, 2013  Free Software Foundation, Inc.
+
 ;; Author: wmperry
 ;; Created: 1996/06/30 18:08:34
-;; Version: 1.3
 ;; Keywords: hypermedia, printing, typesetting
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996, 1997 by Stephen Peters <address@hidden>
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Elisp code to convert a W3 parse tree into a LaTeX buffer.
-;;;
-;;; Heavily hacked upon by William Perry <address@hidden> to add more
-;;; bells and whistles.
-;;;
-;;; KNOWN BUGS:
-;;; 1) This does not use stylesheets to get the formatting information
-;;; 2) This means that the new drawing routines need to be abstracted
-;;;    further so that the same main engine can be used for either
-;;;    text-output (standard stuff in w3-draw), LaTeX output (this file),
-;;;    Postscript (to-be-implemented), etc., etc.
-;;; 3) This still doesn't handle tables.
-;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; Elisp code to convert a W3 parse tree into a LaTeX buffer.
+;;
+;; Heavily hacked upon by William Perry <address@hidden> to add more
+;; bells and whistles.
+;;
+;; KNOWN BUGS:
+;; 1) This does not use stylesheets to get the formatting information
+;; 2) This means that the new drawing routines need to be abstracted
+;;    further so that the same main engine can be used for either
+;;    text-output (standard stuff in w3-draw), LaTeX output (this file),
+;;    Postscript (to-be-implemented), etc., etc.
+;; 3) This still doesn't handle tables.
+;;
+
+;;; Code:
+
 (require 'w3-cus)
 (require 'w3-print)
+(require 'w3-vars)
+(require 'url-vars)
 
 ;; Internal variables - do not touch!
 (defvar w3-latex-current-url nil "What URL we are formatting")
@@ -143,7 +148,14 @@
     (yacute . "\\'{y}")
 ;   (thorn . "")
     (yuml . "\\\"{y}"))
-  "Defines mappings between `w3-html-entities' and LaTeX characters.") 
+  "Defines mappings between `w3-html-entities' and LaTeX characters.")
+
+(defvar w3-latex-use-maketitle t)
+(defvar w3-latex-print-links t
+  "Can be nil, t, or `footnote'.")
+(defvar w3-latex-use-latex2e t)
+(defvar w3-latex-docstyle "{article}")
+(defvar w3-latex-packages nil)
 
 (defun w3-latex-replace-entities (str)
   (let ((start 0))
@@ -173,8 +185,7 @@
     (if w3-latex-verbatim
        (setq todo (append todo '(("\n" . "\\\\newline\\\\nullspace\n")
                                  (" " . "\\\\ ")))))
-    (save-excursion
-      (set-buffer (get-buffer-create " *w3-latex-munging*"))
+    (with-current-buffer (get-buffer-create " *w3-latex-munging*")
       (erase-buffer)
       (insert str)
       (while todo
@@ -185,7 +196,7 @@
       (setq str (w3-latex-replace-entities (buffer-string))))
     (insert str)))
 
-(defun w3-latex-ignore (tree)
+(defun w3-latex-ignore (_tree)
   ;;; ignores any contents of this tree.
   nil)
 
@@ -211,9 +222,9 @@
   (insert "\\end{document}\n"))
 
 (defun w3-latex-title (tree)
-  (if w3-latex-use-maketitle
-      (insert "\\title{")
-    (insert "\\section*{\\centering "))
+  (insert (if w3-latex-use-maketitle
+              "\\title{"
+            "\\section*{\\centering "))
   (w3-latex-contents tree)
   (insert "}\n")
   (if w3-latex-use-maketitle
@@ -281,7 +292,7 @@
   (w3-latex-contents tree)
   (insert "\\end{center}"))
 
-(defun w3-latex-rule (tree)
+(defun w3-latex-rule (_tree)
   ; use \par to make paragraph division clear.
   (insert "\n\\par\\noindent\\rule{\\textwidth}{.01in}\n"))
 
@@ -305,7 +316,7 @@
   (w3-latex-contents tree)
   (insert "\\end{quote}\n"))
 
-(defun w3-latex-break (tree)
+(defun w3-latex-break (_tree)
   ;; no content allowed
   (insert "\\newline "))
 
@@ -429,9 +440,10 @@
   (setq w3-latex-current-url url)
   (erase-buffer)
   (goto-char (point-min))
-  (if w3-latex-use-latex2e
-      (insert (concat "\\documentclass" w3-latex-docstyle "\n"))
-    (insert (concat "\\documentstyle" w3-latex-docstyle "\n")))
+  (insert (if w3-latex-use-latex2e
+              "\\documentclass"
+            "\\documentstyle")
+          w3-latex-docstyle "\n")
   (if (and w3-latex-use-latex2e
           w3-latex-packages)
       (insert (apply 'concat
@@ -448,14 +460,23 @@
   (w3-parse-tree-to-latex w3-current-parse)
   (save-window-excursion
     (set-buffer url-working-buffer)
-    (let ((coding-system-for-write 'binary))
+    (let ((coding-system-for-write 'binary)
+          (file (make-temp-file "w3" nil ".tex")))
       (write-region
-       (point-min) (point-max)
-       (expand-file-name "w3-tmp.latex"
-                        w3-temporary-directory) nil 5))
-    (shell-command
-     (format 
-      "(cd %s ; latex w3-tmp.latex ; latex w3-tmp.latex ; xdvi w3-tmp.dvi ; rm 
-f w3-tmp*) &"
-      w3-temporary-directory))))
+       (point-min) (point-max) file nil 5)
+      ;; FIXME: Race-condition.  We should run this in 
temporary-file-directory!
+      ;; (let ((default-directory (file-name-directory file)))
+      ;;   (call-process "latex" nil t nil (file-relative-name file))
+      ;;   (call-process "latex" nil t nil (file-relative-name file))
+      (delete-file file)
+      (error "Not implemented")
+      ;;   (call-process "xdvi" nil nil nil
+      ;;                 (replace-regexp-in-string "\\.tex\\'" ".dvi"
+      ;;                                           (file-relative-name file)))
+      ;;   (shell-command
+      ;;    (format 
+      ;;     "(cd %s ; latex w3-tmp.latex ; latex w3-tmp.latex ; xdvi 
w3-tmp.dvi ; rm -f w3-tmp*) &"
+      ;;     temporary-file-directory)))
+      )))
 
 (provide 'w3-latex)
diff --git a/w3-menu.el b/w3-menu.el
index 98e50b6..a7d55c5 100644
--- a/w3-menu.el
+++ b/w3-menu.el
@@ -1,35 +1,34 @@
 ;;; w3-menu.el --- Menu functions for emacs-w3
+
+;; Copyright (c) 1996-2001, 2007, 2013 Free Software Foundation, Inc.
+
 ;; Author: Bill Perry <address@hidden>
-;; Version: $Revision: 1.15 $
 ;; Keywords: menu, hypermedia
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996, 97, 98, 99, 2000, 2001, 2007 Free Software Foundation, 
Inc.
-;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
 
 (require 'w3-vars)
 (require 'w3-mouse)
 (eval-when-compile
-  (require 'cl)
-  (defvar w3-html-bookmarks))
+  (require 'cl))
+(defvar w3-html-bookmarks)
 (autoload 'url-truncate-url-for-viewing "url-util")
 (autoload 'w3-first-n-items "w3")
 (autoload 'w3-only-links "w3")
@@ -44,11 +43,6 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Spiffy new menus (for both Emacs and XEmacs)
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defvar w3-menu-filters-supported-p
-  (or (featurep 'xemacs)
-      (and (= emacs-major-version 20)
-                             (>= emacs-minor-version 3))
-      (>= emacs-major-version 21)))
 
 (defvar w3-menu-fsfemacs-bookmark-menu nil)
 (defvar w3-menu-fsfemacs-debug-menu nil)
@@ -131,7 +125,7 @@ on that platform."
       (list (vector item nil nil))
     (list "Ignored" (vector item nil nil))))
       
-(defun w3-menu-hotlist-constructor (menu-items)
+(defun w3-menu-hotlist-constructor (_menu-items)
   (require 'w3-hot)
   (easy-menu-define
    w3-menu-hotlist-menu nil "Emacs/W3 Dynamic menu"
@@ -147,7 +141,7 @@ on that platform."
         (or hot-menu (w3-menu-dummy-menu "No Hotlist")))))
   w3-menu-hotlist-menu)
 
-(defun w3-menu-html-links-constructor (menu-items)
+(defun w3-menu-html-links-constructor (_menu-items)
   (let ((links (mapcar 'cdr w3-current-links))
        (menu nil))
     (if links
@@ -184,7 +178,7 @@ on that platform."
                          (w3-menu-dummy-menu "None")))
     w3-menu-html-links-menu))
 
-(defun w3-menu-links-constructor (menu-items)
+(defun w3-menu-links-constructor (_menu-items)
   (let ((widgets (w3-only-links))
        widget href menu)
     (while widgets
@@ -291,7 +285,10 @@ on that platform."
     ["Formatted Text" (w3-mail-current-document nil "Formatted Text") t]
     ["PostScript" (w3-mail-current-document nil "PostScript") t]
     )
-   (if (or (featurep 'xemacs) (>= emacs-major-version 21))
+   (if (featurep 'xemacs)
+       ;; FIXME: These fancier separators were added to Emacs-21, but only
+       ;; supported in the Lucid toolkit, whereas in most other toolkits they
+       ;; are not even recognized as separators :-(
        "--:shadowDoubleEtchedIn"
      "---")
    ["Close" delete-frame (not (eq (next-frame) (selected-frame)))]
@@ -358,12 +355,8 @@ on that platform."
    ["Home" w3 w3-default-homepage]
    ["View History..." w3-show-history-list url-history-track]
    "----"
-   (if w3-menu-filters-supported-p
-       '("Links" :filter w3-menu-links-constructor)
-     ["Links..." w3-menu-e19-show-links-menu t])
-   (if w3-menu-filters-supported-p
-       '("Navigate" :filter w3-menu-html-links-constructor)
-     ["Navigate..." w3-menu-e19-show-navigate-menu t])
+   '("Links" :filter w3-menu-links-constructor)
+   '("Navigate" :filter w3-menu-html-links-constructor)
    )
   "W3 menu go list.")
 
@@ -380,9 +373,7 @@ on that platform."
    ["Remove Keyword" w3-hotindex-rm-key t]
    ["Query Keyword" w3-hotindex-query t]
    "----"
-   (if w3-menu-filters-supported-p
-       '("Bookmarks" :filter w3-menu-hotlist-constructor)
-     ["Bookmarks" w3-menu-e19-show-hotlist-menu t])
+   '("Bookmarks" :filter w3-menu-hotlist-constructor)
    )
   "W3 menu bookmark list.")
 
@@ -569,7 +560,7 @@ on that platform."
                       'go 'view 'edit 'file))))
          (while menu-list
            (if (null (car menu-list))
-               nil;; no flushright support in FSF Emacs
+               nil;; no flushright support in Emacs
              (aset vec 2 (intern (concat "w3-menu-fsfemacs-"
                                          (symbol-name
                                           (car menu-list)) "-menu")))
@@ -638,10 +629,7 @@ on that platform."
       (lookup-key w3-mode-menu-map [rootmenu])))))
 
 (defun w3-menu-install-menus ()
-  (cond ((and (= emacs-major-version 19)
-             (= emacs-minor-version 28)) ; Hey, get with the times people!!
-        nil)
-       ((consp w3-use-menus)
+  (cond ((consp w3-use-menus)
         (w3-menu-install-menubar))
        ((eq w3-use-menus 1)
         (w3-menu-install-menubar-item))
@@ -678,12 +666,13 @@ on that platform."
        (cons "[W3]" 'w3-menu-toggle-menubar)))
     (w3-menu-set-menubar-dirty-flag))))
 
+(defvar print-readably)
+
 (defun w3-menu-save-options ()
   (interactive)
   (let ((output-buffer (find-file-noselect w3-default-configuration-file))
        output-marker)
-    (save-excursion
-      (set-buffer output-buffer)
+    (with-current-buffer output-buffer
       ;;
       ;; Find and delete the previously saved data, and position to write.
       ;;
@@ -704,53 +693,50 @@ on that platform."
            (standard-output output-marker))
        (princ ";; W3 Options Settings\n")
        (princ ";; ===================\n")
-       (mapcar (function
-                (lambda (var)
-                  (princ "  ")
-                  (if (and (symbolp var) (boundp var))
-                      (prin1 (list 'setq-default var
-                                   (let ((val (symbol-value var)))
-                                     (if (or (memq val '(t nil))
-                                             (and (not (symbolp val))
-                                                  (not (listp val))))
-                                         val
-                                       (list 'quote val))))))
-                  (if var (princ "\n"))))
-               '(
-                 ps-print-color-p
-                 url-automatic-caching
-                 url-honor-refresh-requests
-                 url-privacy-level
-                 url-cookie-confirmation
-                 url-proxy-services
-                 url-standalone-mode
-                 url-use-hypertext-gopher
-                 w3-default-homepage
-                 w3-default-stylesheet
-                 w3-delay-image-loads
-                 w3-do-incremental-display
-                 w3-dump-to-disk
-                 w3-honor-stylesheets
-                 w3-image-mappings
-                 w3-load-hook
-                 w3-mode-hook
-                 w3-netscape-compatible-comments
-                 w3-preferences-cancel-hook
-                 w3-preferences-default-hook
-                 w3-preferences-ok-hook
-                 w3-preferences-setup-hook
-                 w3-source-file-hook
-                 w3-toolbar-orientation
-                 w3-toolbar-type
-                 w3-use-menus
-                 w3-user-colors-take-precedence
-                 )
-               )
+       (dolist (var 
+                 '(
+                   ps-print-color-p
+                   url-automatic-caching
+                   url-honor-refresh-requests
+                   url-privacy-level
+                   url-cookie-confirmation
+                   url-proxy-services
+                   url-standalone-mode
+                   url-use-hypertext-gopher
+                   w3-default-homepage
+                   w3-default-stylesheet
+                   w3-delay-image-loads
+                   w3-do-incremental-display
+                   w3-dump-to-disk
+                   w3-honor-stylesheets
+                   w3-image-mappings
+                   w3-load-hook
+                   w3-mode-hook
+                   w3-netscape-compatible-comments
+                   w3-preferences-cancel-hook
+                   w3-preferences-default-hook
+                   w3-preferences-ok-hook
+                   w3-preferences-setup-hook
+                   w3-source-file-hook
+                   w3-toolbar-orientation
+                   w3-toolbar-type
+                   w3-use-menus
+                   w3-user-colors-take-precedence
+                   ))
+          (princ "  ")
+          (if (and (symbolp var) (boundp var))
+              (prin1 (list 'setq-default var
+                           (let ((val (symbol-value var)))
+                             (if (or (memq val '(t nil))
+                                     (and (not (symbolp val))
+                                          (not (listp val))))
+                                 val
+                               (list 'quote val))))))
+          (if var (princ "\n")))
        (princ ";; ==========================\n")
        (princ ";; End of W3 Options Settings\n")))
     (set-marker output-marker nil)
-    (save-excursion
-      (set-buffer output-buffer)
+    (with-current-buffer output-buffer
       (save-buffer))
     ))
 
@@ -758,9 +744,9 @@ on that platform."
 ;;; Functions for emacs variations that do not support the :filter
 ;;; keyword in menu items.  All versions of XEmacs that Emacs/W3 can
 ;;; run on support this, but only really recent (20.3 or later)
-;;; versions of FSF Emacs support this.
+;;; versions of Emacs support this.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun w3-menu-e19-bogus-filter-constructor (name menu)
+(defun w3-menu-e19-bogus-filter-constructor (_name menu)
   (let ((x nil)
        (y nil))
     (setq x (x-popup-menu t menu)
@@ -768,29 +754,19 @@ on that platform."
     (if (and x y)
        (funcall y))))
   
-(defun w3-menu-e19-show-hotlist-menu ()
-  (interactive)
-  (w3-menu-e19-bogus-filter-constructor "Hotlist"
-                                       (w3-menu-hotlist-constructor nil)))
 
-(defun w3-menu-e19-show-links-menu ()
-  (interactive)
-  (w3-menu-e19-bogus-filter-constructor "Links"
-                                       (w3-menu-links-constructor nil)))
 
-(defun w3-menu-e19-show-navigate-menu ()
-  (interactive)
-  (w3-menu-e19-bogus-filter-constructor "Navigate"
-                                       (w3-menu-html-links-constructor nil)))
+
+
+
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Context-sensitive popup menu
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(if (fboundp 'event-glyph)
-    (defalias 'w3-event-glyph 'event-glyph)
-  (defalias 'w3-event-glyph 'ignore))
+(defalias 'w3-event-glyph
+  (if (fboundp 'event-glyph) #'event-glyph #'ignore))
 
-(defun w3-menu-popup-menu (e menu)
+(defun w3-menu-popup-menu (menu)
   (if (fboundp 'popup-menu)
       (popup-menu menu)
     (let ((bogus-menu nil))
@@ -812,7 +788,7 @@ on that platform."
           (imag (or (and widget (widget-get widget :src))
                     (and parent (widget-get parent :src))))
           (menu (copy-tree w3-popup-menu))
-          url val trunc-url)
+          url trunc-url)
       (if href
          (progn
            (setq url href)
@@ -843,6 +819,6 @@ on that platform."
       (if (not (w3-menubar-active))
          (setcdr menu (append (cdr menu)
                               '("---" ["Show Menubar" w3-toggle-menubar t]))))
-      (w3-menu-popup-menu e menu))))
+      (w3-menu-popup-menu menu))))
 
 (provide 'w3-menu)
diff --git a/w3-mouse.el b/w3-mouse.el
index 1757bab..c48e549 100644
--- a/w3-mouse.el
+++ b/w3-mouse.el
@@ -1,30 +1,30 @@
 ;;; w3-menu.el --- Mouse specific functions for emacs-w3
+
+;; Copyright (c) 1996 - 1999, 2013 Free Software Foundation, Inc.
+
 ;; Author: $Author: wmperry $
 ;; Created: $Date: 2000/11/15 13:58:28 $
-;; Version: $Revision: 1.3 $
 ;; Keywords: mouse, hypermedia
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
+
 (require 'w3-vars)
 
 (defun w3-follow-mouse-other-frame (e)
@@ -54,40 +54,23 @@ the mouse click, opening it in another frame."
         (w3-fetch (widget-get widget :src)))))
 
 (defvar w3-mouse-button1 (cond
-                         ((featurep 'infodock) nil)
-                         ((and w3-running-xemacs (featurep 'mouse)) 'button1)
-                         (w3-running-xemacs nil)
+                         ((featurep 'xemacs) 'button1)
                          (t 'down-mouse-1)))
 (defvar w3-mouse-button2 (cond
-                         ((featurep 'infodock) nil)
-                         ((and w3-running-xemacs (featurep 'mouse)) 'button2)
-                         (w3-running-xemacs nil)
+                         ((featurep 'xemacs) 'button2)
                          (t 'down-mouse-2)))
 (defvar w3-mouse-button3 (cond
-                         ((featurep 'infodock) nil)
-                         ((and w3-running-xemacs (featurep 'mouse)) 'button3)
-                         (w3-running-xemacs nil) 
+                         ((featurep 'xemacs) 'button3) 
                          (t 'down-mouse-3)))
 
-(if w3-mouse-button3
-    (define-key w3-mode-map (vector w3-mouse-button3) 'w3-popup-menu))
+(define-key w3-mode-map (vector w3-mouse-button3) 'w3-popup-menu)
 
-(if w3-mouse-button1
-    (define-key w3-netscape-emulation-minor-mode-map
-      (vector w3-mouse-button1) 'w3-widget-button-click))
+(define-key w3-netscape-emulation-minor-mode-map
+  (vector w3-mouse-button1) 'w3-widget-button-click)
       
-(if w3-mouse-button2
-    (progn
-      (define-key w3-mode-map (vector (list 'meta w3-mouse-button2))
-       'w3-follow-mouse-other-frame)
-      (define-key w3-netscape-emulation-minor-mode-map
-       (vector w3-mouse-button2) 'w3-follow-mouse-other-frame)))
+(define-key w3-mode-map (vector (list 'meta w3-mouse-button2))
+  'w3-follow-mouse-other-frame)
+(define-key w3-netscape-emulation-minor-mode-map
+  (vector w3-mouse-button2) 'w3-follow-mouse-other-frame)
 
-(if (not w3-running-xemacs)
-    (progn
-      (if (and w3-track-mouse (not (= 21 emacs-major-version)))
-         (define-key w3-mode-map [mouse-movement] 'w3-mouse-handler))
-      (if w3-popup-menu-on-mouse-3
-         (define-key w3-mode-map [down-mouse-3] 'w3-popup-menu))))
-  
 (provide 'w3-mouse)
diff --git a/w3-parse.el b/w3-parse.el
index 952225a..fd9c56e 100644
--- a/w3-parse.el
+++ b/w3-parse.el
@@ -1,14 +1,13 @@
 ;;; w3-parse.el --- Parse HTML and/or SGML for Emacs W3 browser
 
+;; Copyright © 1993-1997, 2013 Free Software Foundation, Inc.
+
 ;; Author: Joe Wells <address@hidden>
 ;; Created on: Sat Sep 30 17:25:40 1995
 
-;; Copyright © 1995, 1996, 1997  Joseph Brian Wells
-;; Copyright © 1993, 1994, 1995 by William M. Perry <address@hidden>
-;; 
 ;; This program is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2 of the License, or
+;; the Free Software Foundation; either version 3 of the License, or
 ;; (at your option) any later version.
 ;; 
 ;; This program is distributed in the hope that it will be useful,
@@ -21,10 +20,11 @@
 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 ;; Boston, MA 02111-1307, USA.
 
+;;; Code:
 
-;;;
-;;; Trying to make the best of an evil speed hack.
-;;;
+;;
+;; Trying to make the best of an evil speed hack.
+;;
 
 ;; Explanation:
 
@@ -61,7 +61,7 @@
 (eval-when-compile (require 'cl))
 
 (eval-when-compile
-  (defconst w3-p-s-var-list nil
+  (defvar w3-p-s-var-list nil
     "A list of the scratch variables used by functions called by
 w3-parse-buffer which it is w3-parse-buffer's responsibility to
 \"let\"-bind.")
@@ -69,51 +69,49 @@ w3-parse-buffer which it is w3-parse-buffer's 
responsibility to
   (defmacro w3-p-s-var-def (var)
     "Declare VAR as a scratch variable which w3-parse-buffer must
 \"let\"-bind."
-    `(eval-when-compile
-         (defvar ,var)
-         (or (memq ',var w3-p-s-var-list)
-             (setq w3-p-s-var-list (cons ',var w3-p-s-var-list)))))
+    (or (memq var w3-p-s-var-list)
+        (setq w3-p-s-var-list (cons var w3-p-s-var-list)))
+    `(defvar ,var))
 
   (defmacro w3-p-s-let-bindings (&rest body)
     "\"let\"-bind all of the variables in w3-p-s-var-list in BODY."
+    (declare (indent 0) (debug t))
     `(let ,w3-p-s-var-list
-         ,@body))
-  (put 'w3-p-s-let-bindings 'lisp-indent-function 0)
-  (put 'w3-p-s-let-bindings 'edebug-form-spec t)
+         ,@body)))
 
-  (defvar w3-p-d-current-element)
-  (put 'w3-p-d-current-element 'variable-documentation
-       "Information structure for the current open element.")
+(defvar w3-p-d-current-element)
+(put 'w3-p-d-current-element 'variable-documentation
+     "Information structure for the current open element.")
   
-  (defvar w3-p-d-exceptions)
-  (put 'w3-p-d-exceptions 'variable-documentation
-       "Alist specifying elements (dis)allowed because of an (ex|in)clusion
+(defvar w3-p-d-exceptions)
+(put 'w3-p-d-exceptions 'variable-documentation
+     "Alist specifying elements (dis)allowed because of an (ex|in)clusion
 exception of some containing element (not necessarily the immediately
 containing element).  Each item specifies a transition for an element
 which overrides that specified by the current element's content model.
 Each item is of the form (TAG ACTION *same ERRORP).")
   
-  (defvar w3-p-d-in-parsed-marked-section)
-  (put 'w3-p-d-in-parsed-marked-section 'variable-documentation
-       "Are we in a parsed marked section so that we have to scan for 
\"]]>\"?")
+(defvar w3-p-d-in-parsed-marked-section)
+(put 'w3-p-d-in-parsed-marked-section 'variable-documentation
+     "Are we in a parsed marked section so that we have to scan for \"]]>\"?")
 
-  (defvar w3-p-d-non-markup-chars)
-  (put 'w3-p-d-non-markup-chars 'variable-documentation
-       "The characters that do not indicate the start of markup, in the format
+(defvar w3-p-d-non-markup-chars)
+(put 'w3-p-d-non-markup-chars 'variable-documentation
+     "The characters that do not indicate the start of markup, in the format
 for an argument to skip-chars-forward.")
 
-  (defvar w3-p-d-null-end-tag-enabled)
-  (put 'w3-p-d-null-end-tag-enabled 'variable-documentation
-       "Is the null end tag (\"/\") enabled?")
+(defvar w3-p-d-null-end-tag-enabled)
+(put 'w3-p-d-null-end-tag-enabled 'variable-documentation
+     "Is the null end tag (\"/\") enabled?")
 
-  (defvar w3-p-d-open-element-stack)
-  (put 'w3-p-d-open-element-stack 'variable-documentation
-       "A stack of the currently open elements, with the innermost enclosing
+(defvar w3-p-d-open-element-stack)
+(put 'w3-p-d-open-element-stack 'variable-documentation
+     "A stack of the currently open elements, with the innermost enclosing
 element on top and the outermost on bottom.")
 
-  (defvar w3-p-d-shortrefs)
-  (put 'w3-p-d-shortrefs 'variable-documentation
-       "An alist of the magic entity reference strings in the current
+(defvar w3-p-d-shortrefs)
+(put 'w3-p-d-shortrefs 'variable-documentation
+     "An alist of the magic entity reference strings in the current
 between-tags region and their replacements.  Each item is of the format
 \(REGEXP . REPLACEMENT-STRING\).  Although in SGML shortrefs normally name
 entities whose value should be used as the replacement, we have
@@ -122,9 +120,9 @@ strings to be replaced, so they can be used with 
looking-at.  This should
 never be in an element's overrides field unless
 w3-p-d-shortref-chars is also in the field.")
   
-  (defvar w3-p-d-shortref-chars)
-  (put 'w3-p-d-shortref-chars 'variable-documentation
-       "A string of the characters which can start shortrefs in the current
+(defvar w3-p-d-shortref-chars)
+(put 'w3-p-d-shortref-chars 'variable-documentation
+     "A string of the characters which can start shortrefs in the current
 between-tags region.  This must be in a form which can be passed to
 skip-chars-forward and must contain exactly the characters which start the
 entries in w3-p-d-shortrefs.  If this variable is mentioned in the
@@ -133,18 +131,15 @@ variable w3-p-d-non-markup-chars is saved to the 
element's undo-list and
 updated at the same time.  This should never be in an element's overrides
 field unless w3-p-d-shortrefs is also in the field.")
   
-  (defvar w3-p-d-tag-name)
-  (put 'w3-p-d-tag-name 'variable-documentation
-       "Name of tag we are looking at, as an Emacs Lisp symbol.
+(defvar w3-p-d-tag-name)
+(put 'w3-p-d-tag-name 'variable-documentation
+     "Name of tag we are looking at, as an Emacs Lisp symbol.
 Only non-nil when we are looking at a tag.")
 
-  (defvar w3-p-d-end-tag-p)
-  (put 'w3-p-d-end-tag-p 'variable-documentation
-       "Is the tag we are looking at an end tag?
+(defvar w3-p-d-end-tag-p)
+(put 'w3-p-d-end-tag-p 'variable-documentation
+     "Is the tag we are looking at an end tag?
 Only non-nil when we are looking at a tag.")
-  
-  )
-
 
 ;;;
 ;;; HTML syntax error messages.
@@ -233,8 +228,7 @@ which must be a string to use as the error message."
                          (delete-char -7))))))) w3-current-badhtml))
 
 (defun w3-quote-for-string (string)
-  (save-excursion
-    (set-buffer (get-buffer-create " w3-quote-whitespace"))
+  (with-current-buffer (get-buffer-create " w3-quote-whitespace")
     (erase-buffer)
     (insert string)
     (goto-char (point-min))
@@ -295,9 +289,9 @@ come from the cp1252 character set rather than Unicode.)  
This is an
 alist indexed by numeric code.  The cdr of each element is a list of
 an ASCII substitute and the Unicode for the cp1252 character.")
 
-(eval-and-compile
+(defalias 'w3-int-to-char
   (if (fboundp 'int-to-char)            ; XEmacs
-      (defun w3-int-to-char (c)
+      (lambda (c)
         (cond
          ((characterp c)
           c)
@@ -305,7 +299,7 @@ an ASCII substitute and the Unicode for the cp1252 
character.")
           (int-to-char c))
          (t
           ?~)))
-    (defalias 'w3-int-to-char 'identity)))
+    #'identity))
 
 ;; For older Mule-UCS.  This is from Mule-UCS 0.84.
 (if (and (not (fboundp 'decode-char))
@@ -1020,13 +1014,13 @@ skip-chars-forward."
 ;;; A pseudo-DTD for HTML.
 ;;;
 
-(eval-when-compile
-  ;; This works around the following bogus compiler complaint:
-  ;;   While compiling the end of the data in file w3-parse.el:
-  ;;     ** the function w3-expand-parameters is not known to be defined.
-  ;; This is a bogus error.  Anything of this form will trigger this message:
-  ;;   (eval-when-compile (defun xyzzy () (xyzzy)))
-  (defun w3-expand-parameters (pars data) nil))
+;; (eval-when-compile
+;;   ;; This works around the following bogus compiler complaint:
+;;   ;;   While compiling the end of the data in file w3-parse.el:
+;;   ;;     ** the function w3-expand-parameters is not known to be defined.
+;;   ;; This is a bogus error.  Anything of this form will trigger this 
message:
+;;   ;;   (eval-when-compile (defun xyzzy () (xyzzy)))
+;;   (defun w3-expand-parameters (_pars _data) nil))
 
 (eval-when-compile
   (defun w3-expand-parameters (pars data)
@@ -1155,605 +1149,604 @@ skip-chars-forward."
 ;; *** Be sure to incorporate rfc1867 when attribute-checking is added.
 ;; *** Write function to check sanity of the content-model forms.
 ;; *** I18N: Add Q, BDO, SPAN
-(mapcar
- (function
-  (lambda (pair)
-    (put (car pair) 'html-element-info (cdr pair))))
- ;; The purpose of this complexity is to speed up loading by
- ;; pre-evaluating as much as possible at compile time.
- (eval-when-compile
-   (w3-unfold-dtd
-    (w3-expand-parameters
-     '(
-       (%headempty . (link base meta range))
-       (%headmisc . (script))
-       (%head-deprecated . (nextid))
-
-       ;; client-side imagemaps
-       (%imagemaps . (area map))
-       (%input.fields . (input select textarea keygen label))
-       ;; special action is taken for %text inside %body.content in the
-       ;; content model of each element.
-       (%body.content . (%heading %block style hr div address %imagemaps))
-
-       (%heading . (h1 h2 h3 h4 h5 h6))
-
-       ;; Emacs-w3 extensions
-       (%emacsw3-crud  . (pinhead flame cookie yogsothoth hype peek))
-
-       (%block . (p %list dl form %preformatted 
-                    %blockquote isindex fn table fig note
-                    multicol center %block-deprecated %block-obsoleted))
-       (%list . (ul ol))
-       (%preformatted . (pre))
-       (%blockquote . (bq))
-       (%block-deprecated . (dir menu blockquote))
-       (%block-obsoleted . (xmp listing))
+(dolist
+    (pair
+     ;; The purpose of this complexity is to speed up loading by
+     ;; pre-evaluating as much as possible at compile time.
+     (eval-when-compile
+       (w3-unfold-dtd
+        (w3-expand-parameters
+         '(
+           (%headempty . (link base meta range))
+           (%headmisc . (script))
+           (%head-deprecated . (nextid))
+
+           ;; client-side imagemaps
+           (%imagemaps . (area map))
+           (%input.fields . (input select textarea keygen label))
+           ;; special action is taken for %text inside %body.content in the
+           ;; content model of each element.
+           (%body.content . (%heading %block style hr div address %imagemaps))
+
+           (%heading . (h1 h2 h3 h4 h5 h6))
+
+           ;; Emacs-w3 extensions
+           (%emacsw3-crud  . (pinhead flame cookie yogsothoth hype peek))
+
+           (%block . (p %list dl form %preformatted 
+                        %blockquote isindex fn table fig note
+                        multicol center %block-deprecated %block-obsoleted))
+           (%list . (ul ol))
+           (%preformatted . (pre))
+           (%blockquote . (bq))
+           (%block-deprecated . (dir menu blockquote))
+           (%block-obsoleted . (xmp listing))
        
-       ;; Why is IMG in this list?
-       (%pre.exclusion . (*include img *discard tab math big small sub sup))
+           ;; Why is IMG in this list?
+           (%pre.exclusion . (*include img *discard tab math big small sub 
sup))
        
-       (%text . (*data b %notmath sub sup %emacsw3-crud %input.fields))
-       (%notmath . (%special %font %phrase %misc))
-       (%font . (i u s strike tt big small sub sup font
-                   roach secret wired)) ;; B left out for MATH
-       (%phrase . (em strong dfn code samp kbd var cite blink))
-       (%special . (a nobr img applet object font basefont br script style map 
math tab span bdo))
-       (%misc . (q lang au person acronym abbrev ins del))
+           (%text . (*data b %notmath sub sup %emacsw3-crud %input.fields))
+           (%notmath . (%special %font %phrase %misc))
+           (%font . (i u s strike tt big small sub sup font
+                       roach secret wired)) ;; B left out for MATH
+           (%phrase . (em strong dfn code samp kbd var cite blink))
+           (%special . (a nobr img applet object font basefont br script style 
map math tab span bdo))
+           (%misc . (q lang au person acronym abbrev ins del))
        
-       (%formula . (*data %math))
-       (%math . (box above below %mathvec root sqrt array sub sup
-                     %mathface))
-       (%mathvec . (vec bar dot ddot hat tilde))
-       (%mathface . (b t bt))
-
-       (%mathdelims . (over atop choose left right of))
-
-       ;; What the hell?  This takes BODYTEXT?????  No way!
-       (%bq-content-model . [(nil
-                              nil
-                              (((bodytext) *include *next))
-                              (bodytext *next))
-                             (nil
-                              nil
-                              (((credit) *include *next))
-                              nil)
-                             (nil nil nil nil)
-                             ])
-
-       ;; non-default bad HTML handling.
-       (%in-text-ignore . ((p %heading) *discard *same error))
-       )
-     '(
-       ;; A dummy element that will contain *document.
-       ((*holder)
-        (content-model . [(nil nil nil nil)]))
-       ;; The root of the parse tree.  We start with a pseudo-element
-       ;; named *document for convenience.
-       ((*document)
-        (content-model . [(nil nil (((html) *include *next)) (html *next))
-                          (nil
-                           nil
-                           nil
-                           (*include *same "after document end"))])
-        (end-tag-omissible . t))
-       ;; HTML O O (HEAD, BODY)
-       ((html)
-        (content-model . [(nil
-                           nil
-                           (((head) *include *next))
-                           (head *next))
-                          (nil
-                           nil
-                           (((body) *include *next)
-                            ;; Netscape stuff
-                            ((frameset) *include 4)
-                            )
-                           (body *next))
-                          (nil
-                           nil
-                           (((plaintext) *include *next))
-                           (*retry *next))
-                          (nil
-                           nil
-                           nil
-                           (*include *same "after BODY"))
-                          (nil
-                           nil
-                           nil
-                           (*include *same "after FRAMESET"))
-                          ])
-        (end-tag-omissible . t))
-       ((head)
-        (content-model . [((title isindex %headempty %headmisc
-                                  style %head-deprecated)
-                           nil
-                           nil
-                           ;; *** Should only close if tag can
-                           ;; legitimately follow head.  So many can that
-                           ;; I haven't bothered to enumerate them.
-                           (*close))])
-        (end-tag-omissible . t))
-       ;; SCRIPT - - (#PCDATA)
-       ((script)
-        (content-model . XCDATA         ; not official, but allows
+           (%formula . (*data %math))
+           (%math . (box above below %mathvec root sqrt array sub sup
+                         %mathface))
+           (%mathvec . (vec bar dot ddot hat tilde))
+           (%mathface . (b t bt))
+
+           (%mathdelims . (over atop choose left right of))
+
+           ;; What the hell?  This takes BODYTEXT?????  No way!
+           (%bq-content-model . [(nil
+                                  nil
+                                  (((bodytext) *include *next))
+                                  (bodytext *next))
+                                 (nil
+                                  nil
+                                  (((credit) *include *next))
+                                  nil)
+                                 (nil nil nil nil)
+                                 ])
+
+           ;; non-default bad HTML handling.
+           (%in-text-ignore . ((p %heading) *discard *same error))
+           )
+         '(
+           ;; A dummy element that will contain *document.
+           ((*holder)
+            (content-model . [(nil nil nil nil)]))
+           ;; The root of the parse tree.  We start with a pseudo-element
+           ;; named *document for convenience.
+           ((*document)
+            (content-model . [(nil nil (((html) *include *next)) (html *next))
+                              (nil
+                               nil
+                               nil
+                               (*include *same "after document end"))])
+            (end-tag-omissible . t))
+           ;; HTML O O (HEAD, BODY)
+           ((html)
+            (content-model . [(nil
+                               nil
+                               (((head) *include *next))
+                               (head *next))
+                              (nil
+                               nil
+                               (((body) *include *next)
+                                ;; Netscape stuff
+                                ((frameset) *include 4)
+                                )
+                               (body *next))
+                              (nil
+                               nil
+                               (((plaintext) *include *next))
+                               (*retry *next))
+                              (nil
+                               nil
+                               nil
+                               (*include *same "after BODY"))
+                              (nil
+                               nil
+                               nil
+                               (*include *same "after FRAMESET"))
+                              ])
+            (end-tag-omissible . t))
+           ((head)
+            (content-model . [((title isindex %headempty %headmisc
+                                      style %head-deprecated)
+                               nil
+                               nil
+                               ;; *** Should only close if tag can
+                               ;; legitimately follow head.  So many can that
+                               ;; I haven't bothered to enumerate them.
+                               (*close))])
+            (end-tag-omissible . t))
+           ;; SCRIPT - - (#PCDATA)
+           ((script)
+            (content-model . XCDATA     ; not official, but allows
                                         ; comment hiding of script, and also
                                         ; idiots that use '</' in scripts.
-                       ))
-       ;; TITLE - - (#PCDATA)
-       ((title)
-        (content-model . RCDATA         ; not official
-                       ;; [((*data) include-space nil nil)]
-                       ))
-       ;; STYLE - O (#PCDATA)
-       ;; STYLE needs to be #PCDATA to allow omitted end tag.  Bleagh.
-       ((style)
-        (content-model . CDATA)
-        (end-tag-omissible . t))
-       ((body)
-        (content-model . [((banner) nil nil (*retry *next))
-                          ((bodytext) nil nil (bodytext *next))
-                          (nil nil (((plaintext) *close)) nil)])
-        (inclusions . (spot))
-        (end-tag-omissible . t))
-       ;; Do I really want to include BODYTEXT?  It has something to do
-       ;; with mixed content screwing things up, and I don't understand
-       ;; it.  Wait!  It's used by BQ!
-       ((bodytext)
-        (content-model . [((%body.content)
-                           nil
-                           ;; Push <P> before data characters.  Non-SGML.
-                           (((%text) p)
-                            ;; Some stupid sites put meta tags in the
-                            ;; middle of their documents.  Sigh.
-                            ;; Allow it, but bitch and moan.
-                            ((meta) *include *same "not allowed here")
-                            ;; Closing when seeing CREDIT is a stupidity
-                            ;; caused by BQ's sharing of BODYTEXT.  BQ
-                            ;; should have its own BQTEXT.
-                            ((credit plaintext) *close))
-                           nil)
-                          ])
-        (end-tag-omissible . t))
-       ((div banner center multicol)
-        (content-model . [((%body.content)
-                           nil
-                           ;; Push <P> before data characters.  Non-SGML.
-                           (((%text) p))
-                           nil)]))
-       ((address)
-        (content-model . [((p)
-                           nil
-                           ;; Push <P> before data characters.  Non-SGML.
-                           (((%text) p))
-                           nil)]))
-       ((%heading)
-        (content-model . [((%text)
-                           include-space
-                           ((%in-text-ignore))
-                           nil)]))
-       ((span bdo)
-        (content-model . [((%text)
-                           include-space
-                           nil
-                           nil)])
-        )
-       ((p)
-        (content-model . [((%text)
-                           include-space
-                           nil
-                           ;; *** Should only close if tag can
-                           ;; legitimately follow P.  So many can that I
-                           ;; don't bother to enumerate here.
-                           (*close))])
-        (end-tag-omissible . t))
-       ((ul ol)
-        (content-model . [((lh)
-                           nil
-                           (((li) *include *next))
-                           (*retry *next))
-                          ((p)
-                           nil
-                           nil
-                           (*retry *next))
-                          ((li)
-                           nil
-                           ;; Push <LI> before data characters or block
-                           ;; elements.
-                           ;; Non-SGML.
-                           (;; ((p) b *same nil)
-                            ((%text %block) li *same error))
-                           nil)]))
-       ((lh)
-        (content-model . [((%text)
-                           include-space
-                           (((dd dt li) *close)
-                            (%in-text-ignore))
-                           nil)])
-        (end-tag-omissible . t))
-       ((dir menu)
-        (content-model . [((li)
-                           nil
-                           (((%text) li *same error))
-                           nil)])
-        (exclusions . (%block)))
-       ((li)
-        (content-model . [((%block)
-                           nil
-                           (((li) *close)
-                            ;; Push <P> before data characters.  Non-SGML.
-                            ((%text) p))
-                           nil)])
-        (end-tag-omissible . t)
-        ;; Better bad HTML handling.
-        ;; Technically, there are a few valid documents that this will
-        ;; hose, because you can have H1 inside FORM inside LI.  However,
-        ;; I don't think that should be allowed anyway.
-        (exclusions . (*discard "not allowed here" %heading)))
-       ((dl)
-        (content-model . [((lh)
-                           nil
-                           (((dt dd) *include *next))
-                           (*retry *next))
-                          ((dt dd)
-                           nil
-                           ;; Push <DD> before data characters or block
-                           ;; items.
-                           ;; Non-SGML.
-                           (((%text %block) dd *same error))
-                           nil)]))
-       ((dt)
-        (content-model . [((%text)
-                           include-space
-                           (((dd dt) *close)
-                            (%in-text-ignore))
-                           nil)])
-        (end-tag-omissible . t))
-       ;; DD is just like LI, but we treat it separately because it can be
-       ;; followed by a different set of elements.
-       ((dd)
-        (content-model . [((%block)
-                           nil
-                           (((dt dd) *close)
-                            ;; Push <P> before data characters.  Non-SGML.
-                            ((%text) p))
-                           nil)])
-        (end-tag-omissible . t)
-        ;; See comment with LI.
-        (exclusions . (*discard "not allowed here" %heading)))
-       ((pre)
-        (content-model . [((%text hr)
-                           include-space
-                           ((%in-text-ignore))
-                           nil)])
-        (exclusions . (%pre.exclusion)))
-       ;; BLOCKQUOTE deprecated, BQ okay
-       ((bq)
-        (content-model . %bq-content-model))
-       ((blockquote)
-        (content-model . %bq-content-model)
-        ;; BLOCKQUOTE is deprecated in favor of BQ in the HTML 3.0 DTD.
-        ;; However, BQ is not even mentioned in the HTML 2.0 DTD.  So I
-        ;; don't think we can enable this yet:
-        ;;(deprecated . t)
-        )
-       ((fn note)
-        (content-model . [((%body.content)
-                           nil
-                           ;; Push <P> before data characters.  Non-SGML.
-                           (((%text) p))
-                           nil)]))
-       ((fig)
-        (content-model . [((overlay) nil nil (*retry *next))
-                          (nil
-                           nil
-                           (((caption) *include *next))
-                           (*retry *next))
-                          (nil
-                           nil
-                           (((figtext) *include *next)
-                            ((credit) *retry *next))
-                           ;; *** Should only do this for elements that
-                           ;; can be in FIGTEXT.
-                           (figtext *next))
-                          (nil nil (((credit) *include *next)) nil)
-                          (nil nil nil nil)]))
-       ((caption credit)
-        (content-model . [((%text)
-                           nil
-                           ((%in-text-ignore))
-                           nil)]))
-       ((figtext)
-        (content-model . [((%body.content)
-                           nil
-                           ;; Push <P> before data characters.  Very non-SGML.
-                           (((%text) p)
-                            ((credit) *close))
-                           nil)])
-        (end-tag-omissible . t))
-       ((%emacsw3-crud basefont)
-        (content-model . EMPTY))
-       ;; FORM - - %body.content -(FORM) +(INPUT|KEYGEN|SELECT|TEXTAREA)
-       ((form)
-        ;; Same as BODY.  Ugh!
-        (content-model . [((%body.content %text)
-                           nil
-                           ;; Push <P> before data characters.  Non-SGML.
-                           nil
-                           nil)])
-        (exclusions . (form))
-        (inclusions . (input select textarea keygen label)))
-       ;; *** Where is the URL describing this?
-       ((label)
-        (content-model . [((%text)
-                           include-space
-                           nil
-                           nil)])
-        ;; *** These are already included, no need to repeat.
-        ;;(inclusions . (input select textarea))
-        ;; *** Is a LABEL allowed inside a LABEL?  I assume no.
-        (exclusions . (label))
-        ;; The next line just does the default so is unneeded:
-        ;;(end-tag-omissible . nil)
-        )
-       ;; SELECT - - (OPTION+) -(INPUT|KEYGEN|TEXTAREA|SELECT)>
-       ;; *** This should be -(everything).
-       ((select)
-        (content-model . [((option) nil nil nil)])
-        (exclusions . (input label select keygen textarea)))
-       ;; option - O (#PCDATA)
-       ;; needs to be #PCDATA to allow omitted end tag.
-       ((option)
-        ;; I'd like to make this RCDATA to avoid problems with inclusions
-        ;; like SPOT, but that would conflict with the omitted end-tag, I
-        ;; think.
-        (content-model . [((*data)
-                           include-space
-                           (((option) *close))
-                           nil)])
-        (end-tag-omissible . t))
-       ;; TEXTAREA - - (#PCDATA) -(INPUT|TEXTAREA|KEYGEN|SELECT)
-       ((textarea)
-        ;; Same comment as for OPTION about RCDATA.
-        (content-model . XCDATA) ;;;[((*data) include-space nil nil)])
-        (exclusions . (input select label keygen textarea)))
-       ((hr br img isindex input keygen overlay wbr spot tab
-            %headempty %mathdelims)
-        (content-model . EMPTY))
-       ((nextid)
-        (content-model . EMPTY)
-        (deprecated . t))
-       ((a)
-        (content-model . [((%text)
-                           include-space
-                           (((%heading)
-                             *include *same "deprecated inside A")
-                            ;; *** I haven't made up my mind whether this
-                            ;; is a good idea.  It can result in a lot of
-                            ;; bad formatting if the A is *never* closed.
-                            ;;((p) *discard *same error)
-                            )
-                           nil)])
-        (exclusions . (a)))
-       ((b font %font %phrase %misc nobr)
-        (content-model . [((%text)
-                           include-space
-                           ((%in-text-ignore))
-                           nil)]))
-       ((plaintext)
-        (content-model . XXCDATA)
-        (end-tag-omissible . t)
-        (deprecated . obsolete))
-       ((xmp listing)
-        (content-model . XCDATA)
-        (deprecated . obsolete))
-       ;; Latest table spec (as of Nov. 13 1995) is at:
-       ;; 
<URL:ftp://ds.internic.net/internet-drafts/draft-ietf-html-tables-03.txt>
-       ((table)
-        (content-model . [(nil
-                           nil
-                           (((caption) *include *next)
-                            ((%text) tr *same error)
-                            ((col colgroup thead tfoot tbody tr) *retry *next))
-                           (*retry *next)) ;error handling
-                          ((col colgroup)
-                           nil
-                           (((thead tfoot tbody tr) *retry *next))
-                           (*retry *next)) ;error handling
-                          (nil
-                           nil
-                           (((thead) *include *next)
-                            ((tfoot tbody tr) *retry *next))
-                           (*retry *next)) ;error handling
-                          (nil
-                           nil
-                           (((tfoot) *include *next)
-                            ((tbody tr) *retry *next))
-                           (*retry *next)) ;error handling
-                          ((tbody)
-                           nil
-                           (((tr) tbody *same)
-                            ((td th) tr *same)
-                            ;; error handling
-                            ((%body.content) tbody *same error))
-                           nil)]))
-       ((colgroup)
-        (content-model . [((col)
-                           nil
-                           (((colgroup thead tfoot tbody tr) *close))
-                           nil)])
-        (end-tag-omissible . t))
-       ((col)
-        (content-model . EMPTY))
-       ((thead)
-        (content-model . [((tr)
-                           nil
-                           (((tfoot tbody) *close)
-                            ;; error handling
-                            ((%body.content) tr *same error))
-                           nil)])
-        (end-tag-omissible . t))
-       ((tfoot tbody)
-        (content-model . [((tr)
-                           nil
-                           (((tbody) *close)
-                            ;; error handling
-                            ((td th) tr *same error)
-                            ((%body.content) tr *same error))
-                           nil)])
-        (end-tag-omissible . t))
-       ((tr)
-        (content-model . [((td th)
-                           nil
-                           (((tr tfoot tbody) *close)
-                            ;; error handling
-                            ((%body.content %text) td *same error))
-                           nil)])
-        (end-tag-omissible . t))
-       ((td th)
-        ;; Arrgh!  Another %body.content!!!  Stupid!!!
-        (content-model . [((%body.content)
-                           nil
-                           (((td th tr tfoot tbody) *close)
-                            ;; Push <P> before data characters.  Non-SGML.
-                            ((%text) p))
-                           nil)])
-        (end-tag-omissible . t))
-       ((math)
-        (content-model . [((*data) include-space nil nil)])
-        (overrides .
-                   ((w3-p-d-shortref-chars t . "\{_^")
-                    (w3-p-d-shortrefs t . (("\\^" . "<sup>")
-                                           ("_" . "<sub>")
-                                           ("{" . "<box>")))))
-        (inclusions . (%math))
-        (exclusions . (%notmath)))
-       ((sup)
-        (content-model . [((%text)
-                           include-space
-                           ((%in-text-ignore))
-                           nil)])
-        (overrides .
-                   ((w3-p-d-shortref-chars t . "\{_^")
-                    (w3-p-d-shortrefs t . (("\\^" . "</sup>")
-                                           ("_" . "<sub>")
-                                           ("{" . "<box>"))))))
-       ((sub)
-        (content-model . [((%text)
-                           include-space
-                           ((%in-text-ignore))
-                           nil)])
-        (overrides .
-                   ((w3-p-d-shortref-chars t . "\{_^")
-                    (w3-p-d-shortrefs t . (("\\^" . "<sup>")
-                                           ("_" . "</sub>")
-                                           ("{" . "<box>"))))))
-       ((box)
-        (content-model . [((%formula)
-                           include-space
-                           (((left) *include 1)
-                            ((over atop choose) *include 2)
-                            ((right) *include 3))
-                           nil)
-                          ((%formula)
-                           include-space
-                           (((over atop choose) *include 2)
-                            ((right) *include 3))
-                           nil)
-                          ((%formula)
-                           include-space
-                           (((right) *include 3))
-                           nil)
-                          ((%formula) include-space nil nil)])
-        (overrides .
-                   ((w3-p-d-shortref-chars t . "{}_^")
-                    (w3-p-d-shortrefs t . (("\\^" . "<sup>")
-                                           ("_" . "<sub>")
-                                           ("{" . "<box>")
-                                           ("}" . "</box>"))))))
-       ((above below %mathvec t bt sqrt)
-        (content-model . [((%formula) include-space nil nil)]))
-       ;; ROOT has a badly-specified content-model in HTML 3.0.
-       ((root)
-        (content-model . [((%formula)
-                           include-space
-                           (((of) *include *next))
-                           nil)
-                          ((%formula) include-space nil nil)]))
-       ((of)
-        (content-model . [((%formula) include-space nil nil)])
-        ;; There is no valid way to infer a missing end-tag for OF.  This
-        ;; is bizarre.
-        (end-tag-omissible . t))
-       ((array)
-        (content-model . [((row) nil nil nil)]))
-       ((row)
-        (content-model . [((item) nil (((row) *close)) nil)])
-        (end-tag-omissible . t))
-       ((item)
-        (content-model . [((%formula)
-                           include-space
-                           (((row item) *close))
-                           nil)])
-        (end-tag-omissible . t))
-       ;; The old parser would look for the </EMBED> end-tag and include
-       ;; the contents between <EMBED> and </EMBED> as the DATA attribute
-       ;; of the EMBED start-tag.  However, it did not require the
-       ;; </EMBED> end-tag and did nothing if it was missing.  This is
-       ;; completely impossible to specify in SGML.
-       ;;
-       ;; See
-       ;; 
<URL:http://www.eit.com/goodies/lists/www.lists/www-html.1995q3/0603.html>  
-       ;;
-       ;; Questions: Does EMBED require the end-tag?  How does NOEMBED fit
-       ;; into this?  Where can EMBED appear?
-       ;;
-       ;; Nov. 25 1995: a new spec for EMBED (also an I-D):
-       ;; <URL:http://www.cs.princeton.edu/~burchard/www/interactive/>
-       ;;
-       ;; Here is my guess how to code EMBED:
-       ((embed)
-        (content-model . [((noembed) nil nil (*close))]))
-       ((noembed)
-        (content-model . [((%body.content) ; hack hack hack
-                           nil
-                           (((%text) p))
-                           nil)]))
-       ;;
-       ;; FRAMESET is a Netscape thing.
-       ;; 
<URL:http://www.eit.com/goodies/lists/www.lists/www-html.1995q3/0588.html>
-       ((frameset)
-        (content-model . [((noframes frame frameset) nil nil nil)]))
-       ((noframes)
-        (content-model . [((%body.content)
-                           nil
-                           ;; Push <P> before data characters.  Non-SGML.
-                           (((%text) p))
-                           nil)]))
-       ((frame)
-        (content-model . EMPTY))
-       ;;
-       ;; APPLET is a Java thing.
-       ;; OBJECT is a cougar thing
-       ;; <URL:http://java.sun.com/JDK-beta/filesinkit/README>
-       ((applet object)
-        ;; I really don't want to add another ANY content-model.
-        (content-model . XINHERIT)
-        (inclusions . (param)))
-       ((param)
-        (content-model . EMPTY))
-       ;; backward compatibility with old Java.
-       ((app)
-        (content-model . EMPTY))
-       ;; Client-side image maps.
-       ;; 
<URL:ftp://ds.internic.net/internet-drafts/draft-seidman-clientsideimagemap-01.txt>
-       ;; *** The only problem is that I don't know in what elements MAP
-       ;; can appear, so none of this is reachable yet.
-       ((map)
-        (content-model . [((area) nil nil nil)]))
-       ((area)
-        (content-model . EMPTY))
-       )))))
+                           ))
+           ;; TITLE - - (#PCDATA)
+           ((title)
+            (content-model . RCDATA     ; not official
+                           ;; [((*data) include-space nil nil)]
+                           ))
+           ;; STYLE - O (#PCDATA)
+           ;; STYLE needs to be #PCDATA to allow omitted end tag.  Bleagh.
+           ((style)
+            (content-model . CDATA)
+            (end-tag-omissible . t))
+           ((body)
+            (content-model . [((banner) nil nil (*retry *next))
+                              ((bodytext) nil nil (bodytext *next))
+                              (nil nil (((plaintext) *close)) nil)])
+            (inclusions . (spot))
+            (end-tag-omissible . t))
+           ;; Do I really want to include BODYTEXT?  It has something to do
+           ;; with mixed content screwing things up, and I don't understand
+           ;; it.  Wait!  It's used by BQ!
+           ((bodytext)
+            (content-model . [((%body.content)
+                               nil
+                               ;; Push <P> before data characters.  Non-SGML.
+                               (((%text) p)
+                                ;; Some stupid sites put meta tags in the
+                                ;; middle of their documents.  Sigh.
+                                ;; Allow it, but bitch and moan.
+                                ((meta) *include *same "not allowed here")
+                                ;; Closing when seeing CREDIT is a stupidity
+                                ;; caused by BQ's sharing of BODYTEXT.  BQ
+                                ;; should have its own BQTEXT.
+                                ((credit plaintext) *close))
+                               nil)
+                              ])
+            (end-tag-omissible . t))
+           ((div banner center multicol)
+            (content-model . [((%body.content)
+                               nil
+                               ;; Push <P> before data characters.  Non-SGML.
+                               (((%text) p))
+                               nil)]))
+           ((address)
+            (content-model . [((p)
+                               nil
+                               ;; Push <P> before data characters.  Non-SGML.
+                               (((%text) p))
+                               nil)]))
+           ((%heading)
+            (content-model . [((%text)
+                               include-space
+                               ((%in-text-ignore))
+                               nil)]))
+           ((span bdo)
+            (content-model . [((%text)
+                               include-space
+                               nil
+                               nil)])
+            )
+           ((p)
+            (content-model . [((%text)
+                               include-space
+                               nil
+                               ;; *** Should only close if tag can
+                               ;; legitimately follow P.  So many can that I
+                               ;; don't bother to enumerate here.
+                               (*close))])
+            (end-tag-omissible . t))
+           ((ul ol)
+            (content-model . [((lh)
+                               nil
+                               (((li) *include *next))
+                               (*retry *next))
+                              ((p)
+                               nil
+                               nil
+                               (*retry *next))
+                              ((li)
+                               nil
+                               ;; Push <LI> before data characters or block
+                               ;; elements.
+                               ;; Non-SGML.
+                               ( ;; ((p) b *same nil)
+                                ((%text %block) li *same error))
+                               nil)]))
+           ((lh)
+            (content-model . [((%text)
+                               include-space
+                               (((dd dt li) *close)
+                                (%in-text-ignore))
+                               nil)])
+            (end-tag-omissible . t))
+           ((dir menu)
+            (content-model . [((li)
+                               nil
+                               (((%text) li *same error))
+                               nil)])
+            (exclusions . (%block)))
+           ((li)
+            (content-model . [((%block)
+                               nil
+                               (((li) *close)
+                                ;; Push <P> before data characters.  Non-SGML.
+                                ((%text) p))
+                               nil)])
+            (end-tag-omissible . t)
+            ;; Better bad HTML handling.
+            ;; Technically, there are a few valid documents that this will
+            ;; hose, because you can have H1 inside FORM inside LI.  However,
+            ;; I don't think that should be allowed anyway.
+            (exclusions . (*discard "not allowed here" %heading)))
+           ((dl)
+            (content-model . [((lh)
+                               nil
+                               (((dt dd) *include *next))
+                               (*retry *next))
+                              ((dt dd)
+                               nil
+                               ;; Push <DD> before data characters or block
+                               ;; items.
+                               ;; Non-SGML.
+                               (((%text %block) dd *same error))
+                               nil)]))
+           ((dt)
+            (content-model . [((%text)
+                               include-space
+                               (((dd dt) *close)
+                                (%in-text-ignore))
+                               nil)])
+            (end-tag-omissible . t))
+           ;; DD is just like LI, but we treat it separately because it can be
+           ;; followed by a different set of elements.
+           ((dd)
+            (content-model . [((%block)
+                               nil
+                               (((dt dd) *close)
+                                ;; Push <P> before data characters.  Non-SGML.
+                                ((%text) p))
+                               nil)])
+            (end-tag-omissible . t)
+            ;; See comment with LI.
+            (exclusions . (*discard "not allowed here" %heading)))
+           ((pre)
+            (content-model . [((%text hr)
+                               include-space
+                               ((%in-text-ignore))
+                               nil)])
+            (exclusions . (%pre.exclusion)))
+           ;; BLOCKQUOTE deprecated, BQ okay
+           ((bq)
+            (content-model . %bq-content-model))
+           ((blockquote)
+            (content-model . %bq-content-model)
+            ;; BLOCKQUOTE is deprecated in favor of BQ in the HTML 3.0 DTD.
+            ;; However, BQ is not even mentioned in the HTML 2.0 DTD.  So I
+            ;; don't think we can enable this yet:
+            ;;(deprecated . t)
+            )
+           ((fn note)
+            (content-model . [((%body.content)
+                               nil
+                               ;; Push <P> before data characters.  Non-SGML.
+                               (((%text) p))
+                               nil)]))
+           ((fig)
+            (content-model . [((overlay) nil nil (*retry *next))
+                              (nil
+                               nil
+                               (((caption) *include *next))
+                               (*retry *next))
+                              (nil
+                               nil
+                               (((figtext) *include *next)
+                                ((credit) *retry *next))
+                               ;; *** Should only do this for elements that
+                               ;; can be in FIGTEXT.
+                               (figtext *next))
+                              (nil nil (((credit) *include *next)) nil)
+                              (nil nil nil nil)]))
+           ((caption credit)
+            (content-model . [((%text)
+                               nil
+                               ((%in-text-ignore))
+                               nil)]))
+           ((figtext)
+            (content-model . [((%body.content)
+                               nil
+                               ;; Push <P> before data characters.  Very 
non-SGML.
+                               (((%text) p)
+                                ((credit) *close))
+                               nil)])
+            (end-tag-omissible . t))
+           ((%emacsw3-crud basefont)
+            (content-model . EMPTY))
+           ;; FORM - - %body.content -(FORM) +(INPUT|KEYGEN|SELECT|TEXTAREA)
+           ((form)
+            ;; Same as BODY.  Ugh!
+            (content-model . [((%body.content %text)
+                               nil
+                               ;; Push <P> before data characters.  Non-SGML.
+                               nil
+                               nil)])
+            (exclusions . (form))
+            (inclusions . (input select textarea keygen label)))
+           ;; *** Where is the URL describing this?
+           ((label)
+            (content-model . [((%text)
+                               include-space
+                               nil
+                               nil)])
+            ;; *** These are already included, no need to repeat.
+            ;;(inclusions . (input select textarea))
+            ;; *** Is a LABEL allowed inside a LABEL?  I assume no.
+            (exclusions . (label))
+            ;; The next line just does the default so is unneeded:
+            ;;(end-tag-omissible . nil)
+            )
+           ;; SELECT - - (OPTION+) -(INPUT|KEYGEN|TEXTAREA|SELECT)>
+           ;; *** This should be -(everything).
+           ((select)
+            (content-model . [((option) nil nil nil)])
+            (exclusions . (input label select keygen textarea)))
+           ;; option - O (#PCDATA)
+           ;; needs to be #PCDATA to allow omitted end tag.
+           ((option)
+            ;; I'd like to make this RCDATA to avoid problems with inclusions
+            ;; like SPOT, but that would conflict with the omitted end-tag, I
+            ;; think.
+            (content-model . [((*data)
+                               include-space
+                               (((option) *close))
+                               nil)])
+            (end-tag-omissible . t))
+           ;; TEXTAREA - - (#PCDATA) -(INPUT|TEXTAREA|KEYGEN|SELECT)
+           ((textarea)
+            ;; Same comment as for OPTION about RCDATA.
+            (content-model . XCDATA) ;;;[((*data) include-space nil nil)])
+            (exclusions . (input select label keygen textarea)))
+           ((hr br img isindex input keygen overlay wbr spot tab
+                %headempty %mathdelims)
+            (content-model . EMPTY))
+           ((nextid)
+            (content-model . EMPTY)
+            (deprecated . t))
+           ((a)
+            (content-model . [((%text)
+                               include-space
+                               (((%heading)
+                                 *include *same "deprecated inside A")
+                                ;; *** I haven't made up my mind whether this
+                                ;; is a good idea.  It can result in a lot of
+                                ;; bad formatting if the A is *never* closed.
+                                ;;((p) *discard *same error)
+                                )
+                               nil)])
+            (exclusions . (a)))
+           ((b font %font %phrase %misc nobr)
+            (content-model . [((%text)
+                               include-space
+                               ((%in-text-ignore))
+                               nil)]))
+           ((plaintext)
+            (content-model . XXCDATA)
+            (end-tag-omissible . t)
+            (deprecated . obsolete))
+           ((xmp listing)
+            (content-model . XCDATA)
+            (deprecated . obsolete))
+           ;; Latest table spec (as of Nov. 13 1995) is at:
+           ;; 
<URL:ftp://ds.internic.net/internet-drafts/draft-ietf-html-tables-03.txt>
+           ((table)
+            (content-model . [(nil
+                               nil
+                               (((caption) *include *next)
+                                ((%text) tr *same error)
+                                ((col colgroup thead tfoot tbody tr) *retry 
*next))
+                               (*retry *next)) ;error handling
+                              ((col colgroup)
+                               nil
+                               (((thead tfoot tbody tr) *retry *next))
+                               (*retry *next)) ;error handling
+                              (nil
+                               nil
+                               (((thead) *include *next)
+                                ((tfoot tbody tr) *retry *next))
+                               (*retry *next)) ;error handling
+                              (nil
+                               nil
+                               (((tfoot) *include *next)
+                                ((tbody tr) *retry *next))
+                               (*retry *next)) ;error handling
+                              ((tbody)
+                               nil
+                               (((tr) tbody *same)
+                                ((td th) tr *same)
+                                ;; error handling
+                                ((%body.content) tbody *same error))
+                               nil)]))
+           ((colgroup)
+            (content-model . [((col)
+                               nil
+                               (((colgroup thead tfoot tbody tr) *close))
+                               nil)])
+            (end-tag-omissible . t))
+           ((col)
+            (content-model . EMPTY))
+           ((thead)
+            (content-model . [((tr)
+                               nil
+                               (((tfoot tbody) *close)
+                                ;; error handling
+                                ((%body.content) tr *same error))
+                               nil)])
+            (end-tag-omissible . t))
+           ((tfoot tbody)
+            (content-model . [((tr)
+                               nil
+                               (((tbody) *close)
+                                ;; error handling
+                                ((td th) tr *same error)
+                                ((%body.content) tr *same error))
+                               nil)])
+            (end-tag-omissible . t))
+           ((tr)
+            (content-model . [((td th)
+                               nil
+                               (((tr tfoot tbody) *close)
+                                ;; error handling
+                                ((%body.content %text) td *same error))
+                               nil)])
+            (end-tag-omissible . t))
+           ((td th)
+            ;; Arrgh!  Another %body.content!!!  Stupid!!!
+            (content-model . [((%body.content)
+                               nil
+                               (((td th tr tfoot tbody) *close)
+                                ;; Push <P> before data characters.  Non-SGML.
+                                ((%text) p))
+                               nil)])
+            (end-tag-omissible . t))
+           ((math)
+            (content-model . [((*data) include-space nil nil)])
+            (overrides .
+                       ((w3-p-d-shortref-chars t . "\{_^")
+                        (w3-p-d-shortrefs t . (("\\^" . "<sup>")
+                                               ("_" . "<sub>")
+                                               ("{" . "<box>")))))
+            (inclusions . (%math))
+            (exclusions . (%notmath)))
+           ((sup)
+            (content-model . [((%text)
+                               include-space
+                               ((%in-text-ignore))
+                               nil)])
+            (overrides .
+                       ((w3-p-d-shortref-chars t . "\{_^")
+                        (w3-p-d-shortrefs t . (("\\^" . "</sup>")
+                                               ("_" . "<sub>")
+                                               ("{" . "<box>"))))))
+           ((sub)
+            (content-model . [((%text)
+                               include-space
+                               ((%in-text-ignore))
+                               nil)])
+            (overrides .
+                       ((w3-p-d-shortref-chars t . "\{_^")
+                        (w3-p-d-shortrefs t . (("\\^" . "<sup>")
+                                               ("_" . "</sub>")
+                                               ("{" . "<box>"))))))
+           ((box)
+            (content-model . [((%formula)
+                               include-space
+                               (((left) *include 1)
+                                ((over atop choose) *include 2)
+                                ((right) *include 3))
+                               nil)
+                              ((%formula)
+                               include-space
+                               (((over atop choose) *include 2)
+                                ((right) *include 3))
+                               nil)
+                              ((%formula)
+                               include-space
+                               (((right) *include 3))
+                               nil)
+                              ((%formula) include-space nil nil)])
+            (overrides .
+                       ((w3-p-d-shortref-chars t . "{}_^")
+                        (w3-p-d-shortrefs t . (("\\^" . "<sup>")
+                                               ("_" . "<sub>")
+                                               ("{" . "<box>")
+                                               ("}" . "</box>"))))))
+           ((above below %mathvec t bt sqrt)
+            (content-model . [((%formula) include-space nil nil)]))
+           ;; ROOT has a badly-specified content-model in HTML 3.0.
+           ((root)
+            (content-model . [((%formula)
+                               include-space
+                               (((of) *include *next))
+                               nil)
+                              ((%formula) include-space nil nil)]))
+           ((of)
+            (content-model . [((%formula) include-space nil nil)])
+            ;; There is no valid way to infer a missing end-tag for OF.  This
+            ;; is bizarre.
+            (end-tag-omissible . t))
+           ((array)
+            (content-model . [((row) nil nil nil)]))
+           ((row)
+            (content-model . [((item) nil (((row) *close)) nil)])
+            (end-tag-omissible . t))
+           ((item)
+            (content-model . [((%formula)
+                               include-space
+                               (((row item) *close))
+                               nil)])
+            (end-tag-omissible . t))
+           ;; The old parser would look for the </EMBED> end-tag and include
+           ;; the contents between <EMBED> and </EMBED> as the DATA attribute
+           ;; of the EMBED start-tag.  However, it did not require the
+           ;; </EMBED> end-tag and did nothing if it was missing.  This is
+           ;; completely impossible to specify in SGML.
+           ;;
+           ;; See
+           ;; 
<URL:http://www.eit.com/goodies/lists/www.lists/www-html.1995q3/0603.html>  
+           ;;
+           ;; Questions: Does EMBED require the end-tag?  How does NOEMBED fit
+           ;; into this?  Where can EMBED appear?
+           ;;
+           ;; Nov. 25 1995: a new spec for EMBED (also an I-D):
+           ;; <URL:http://www.cs.princeton.edu/~burchard/www/interactive/>
+           ;;
+           ;; Here is my guess how to code EMBED:
+           ((embed)
+            (content-model . [((noembed) nil nil (*close))]))
+           ((noembed)
+            (content-model . [((%body.content) ; hack hack hack
+                               nil
+                               (((%text) p))
+                               nil)]))
+           ;;
+           ;; FRAMESET is a Netscape thing.
+           ;; 
<URL:http://www.eit.com/goodies/lists/www.lists/www-html.1995q3/0588.html>
+           ((frameset)
+            (content-model . [((noframes frame frameset) nil nil nil)]))
+           ((noframes)
+            (content-model . [((%body.content)
+                               nil
+                               ;; Push <P> before data characters.  Non-SGML.
+                               (((%text) p))
+                               nil)]))
+           ((frame)
+            (content-model . EMPTY))
+           ;;
+           ;; APPLET is a Java thing.
+           ;; OBJECT is a cougar thing
+           ;; <URL:http://java.sun.com/JDK-beta/filesinkit/README>
+           ((applet object)
+            ;; I really don't want to add another ANY content-model.
+            (content-model . XINHERIT)
+            (inclusions . (param)))
+           ((param)
+            (content-model . EMPTY))
+           ;; backward compatibility with old Java.
+           ((app)
+            (content-model . EMPTY))
+           ;; Client-side image maps.
+           ;; 
<URL:ftp://ds.internic.net/internet-drafts/draft-seidman-clientsideimagemap-01.txt>
+           ;; *** The only problem is that I don't know in what elements MAP
+           ;; can appear, so none of this is reachable yet.
+           ((map)
+            (content-model . [((area) nil nil nil)]))
+           ((area)
+            (content-model . EMPTY))
+           )))))
+  (put (car pair) 'html-element-info (cdr pair)))
 
 
 ;;;
@@ -2015,9 +2008,8 @@ Do nothing in non-Mule or unibyte session."
              default-enable-multibyte-characters)
     (ethio-sera-to-fidel-marker)))
 
-(if (fboundp 'char-int)
-    (defalias 'w3-char-int 'char-int)
-  (defalias 'w3-char-int 'identity))
+(defalias 'w3-char-int
+  (if (fboundp 'char-int) #'char-int #'identity))
 
 ;; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 ;; %                                                    %
@@ -2031,10 +2023,7 @@ BUFF defaults to the current buffer.
 Destructively alters contents of BUFF.
 Returns a data structure containing the parsed information."
   (if (not w3-setup-done) (w3-do-setup))
-  (save-excursion
-    (if buff
-        (set-buffer buff)
-      (setq buff (current-buffer)))
+  (with-current-buffer (or buff (setq buff (current-buffer)))
     (let ((old-syntax-table (syntax-table)))
       (set-syntax-table w3-sgml-md-syntax-table)
       (buffer-disable-undo (current-buffer))
@@ -2078,7 +2067,7 @@ Returns a data structure containing the parsed 
information."
              ;; The buffer which contains the HTML we are parsing.  This
              ;; variable is used to avoid using the more expensive
              ;; save-excursion.
-             (parse-buffer (current-buffer))
+             ;; (parse-buffer (current-buffer))
          
              ;; Points to start of region of text since the previous tag.
              (between-tags-start (point-min))
@@ -2927,9 +2916,9 @@ Returns a data structure containing the parsed 
information."
 BUFF defaults to the current buffer.
 Destructively alters contents of BUFF.
 Returns a data structure containing the parsed information."
-  (if nil ;; (w3-fast-parse-find-tidy-program)
-      (fset 'w3-parse-buffer 'w3-fast-parse-buffer)
-    (fset 'w3-parse-buffer 'w3-slow-parse-buffer))
+  (fset 'w3-parse-buffer (if nil ;; (w3-fast-parse-find-tidy-program)
+                             #'w3-fast-parse-buffer
+                           #'w3-slow-parse-buffer))
   (w3-parse-buffer buff))
 
 
diff --git a/w3-print.el b/w3-print.el
index eca6016..537abaf 100644
--- a/w3-print.el
+++ b/w3-print.el
@@ -1,30 +1,32 @@
 ;;; w3-print.el --- Printing support for emacs-w3
+
+;; Copyright (c) 1996 - 1999, 2013 Free Software Foundation, Inc.
+
 ;; Author: $Author: fx $
 ;; Created: $Date: 2001/06/07 17:16:57 $
-;; Version: $Revision: 1.3 $
 ;; Keywords: faces, help, printing, hypermedia
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
+
+(require 'w3-vars)
+
 (defvar w3-postscript-print-function 'ps-print-buffer-with-faces
   "*Name of the function to use to print a buffer as PostScript.
 This should take no arguments, and act on the current buffer.
@@ -48,12 +50,10 @@ ps-spool-buffer-with-faces   - spool for later")
                      nil t))))
     (cond
      ((equal "HTML Source" format)
-      (save-excursion
-       (set-buffer (generate-new-buffer " *w3-print*"))
+      (with-current-buffer (generate-new-buffer " *w3-print*")
        (insert w3-current-source)
        (lpr-buffer)))
-     ((or (equal "Formatted Text" format)
-         (equal "" format))
+     ((member form '("Formatted Text" ""))
       (lpr-buffer))
      ((equal "PostScript" format)
       (funcall w3-postscript-print-function)))))
diff --git a/w3-props.el b/w3-props.el
index ce8a5cc..5ea56e8 100644
--- a/w3-props.el
+++ b/w3-props.el
@@ -1,32 +1,31 @@
 ;;; w3-props.el --- Additional text property stuff
+
+;; Copyright (c) 1996, 1997, 2013 Free Software Foundation, Inc.
+
 ;; Author: $Author: fx $
 ;; Created: $Date: 2001/09/09 15:33:14 $
-;; Version: $Revision: 1.2 $
 ;; Keywords: faces
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1995, 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996, 1997 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
 
-;;; Additional text property functions.
+;;; Commentary:
+
+;; Additional text property functions.
 
 ;; The following three text property functions are not generally available (and
 ;; it's not certain that they should be) so they are inlined for speed.
@@ -37,6 +36,8 @@
 ;; so, should the first or last duplicate item remain?  Or the one that was
 ;; added?  In our implementation, the first duplicate remains.
 
+;;; Code:
+
 (defsubst w3-fillin-text-property (start end setprop markprop value
                                         &optional object)
   "Fill in one property of the text from START to END.
diff --git a/w3-speak-table.el b/w3-speak-table.el
index 1b71378..98ebbe4 100644
--- a/w3-speak-table.el
+++ b/w3-speak-table.el
@@ -1,6 +1,31 @@
-;;;$Id: w3-speak-table.el,v 1.4 2001/05/25 14:05:05 wmperry Exp $
-;;;Authors: Thierry Emery <address@hidden>, T.V. Raman <address@hidden>
-;;;Description: Speak W3 tables
+;;; w3-speak-table.el --- Speak W3 tables
+
+;; Copyright (c) 2013  Free Software Foundation, Inc.
+
+;; Author: Thierry Emery <address@hidden>
+;;         T.V. Raman <address@hidden>
+
+;; This file is not part of GNU Emacs, but the same permissions apply.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
+
+(require 'w3-keymap)
+(require 'w3-vars)
 
 (eval-when-compile
   (require 'cl)
@@ -85,20 +110,20 @@ and return it as (horizontal-offset . vertical-offset)"
 (defmacro w3-table-move-within-cell (at-depth cell-info move-function)
   "Move within a cell (in a temporary buffer) and reflect the same movement
 in the containing table in the original buffer"
+  (declare (indent 2) (debug t))
   `(if (null ,cell-info)
-        (error "Not inside a W3 cell")
-       (let (table-movement)
-        (w3-within-cell ,cell-info table-info
-                        (setq table-movement
-                              (w3-table-compute-relative-movement
-                               (funcall ,move-function (1- at-depth)))))
-        (w3-table-redo-relative-movement table-movement))))
-(put 'w3-table-move-within-cell 'lisp-indent-function 2)
-(put 'w3-table-move-within-cell 'edebug-form-spec '(sexp sexp &rest form))
+       (error "Not inside a W3 cell")
+     (let (table-movement)
+       (w3-within-cell ,cell-info table-info
+                       (setq table-movement
+                             (w3-table-compute-relative-movement
+                              (funcall ,move-function (1- ,at-depth)))))
+       (w3-table-redo-relative-movement table-movement))))
 
 (defmacro w3-table-move-within-subtable (at-depth cell-info move-function)
   "Move within a subtable (in a temporary buffer) and reflect the same movement
 in the containing table in the original buffer"
+  (declare (indent 2) (debug t))
   `(if (null ,cell-info)
         (error "Not inside a W3 cell")
        (let ((subtable-info (w3-cell-info-current-subtable ,cell-info))
@@ -108,12 +133,9 @@ in the containing table in the original buffer"
           (w3-within-cell ,cell-info table-info
                           (setq table-movement
                                 (w3-table-compute-relative-movement
-                                 (funcall ,move-function (1- at-depth) 
subtable-info))))
+                                 (funcall ,move-function (1- ,at-depth) 
subtable-info))))
           (w3-table-redo-relative-movement table-movement)))))
 
-(put 'w3-table-move-within-subtable 'lisp-indent-function 2)
-(put 'w3-table-move-within-subtable 'edebug-form-spec '(sexp sexp &rest form))
-
 ;;}}}
 ;;{{{  find a table
 
@@ -219,7 +241,6 @@ If no table is found and NOERROR is nil, an error is 
signaled."
 (defun w3-table-current-column-number (&optional table-info)
   "Return spanless column number"
   (let* ((table-info (or table-info (w3-table-info 0)))
-        (start (w3-table-info-start table-info))
         (char-col (current-column))
         (num-cols (w3-table-info-columns table-info))
         (col-widths (w3-table-info-column-widths table-info))
@@ -308,7 +329,6 @@ NB: row and col start from 1
             (start (w3-table-info-start table-info))
             (table-row-heights (w3-table-info-row-heights table-info))
             (table-col-widths (w3-table-info-column-widths table-info))
-            (table-width (+ (apply '+ (map 'list '1+ table-col-widths)) 2))
             (table-row-index (1- table-row))
             (table-col-index (1- table-col))
             cell-beg
@@ -403,8 +423,7 @@ cell for a newspaper style column"
         (buffer (get-buffer-create
                  (format "Cell-%s" (buffer-name))))
         (inhibit-read-only t))
-    (save-excursion
-      (set-buffer buffer)
+    (with-current-buffer buffer
       (erase-buffer)
       (w3-mode)
       (insert contents)
@@ -595,10 +614,8 @@ Prefix arg can be used to specify the desired table 
nesting."
        (w3-table-move-within-subtable at-depth cell-info
                                       'w3-table-move-to-top-of-table-column)
       (let ((table-start nil)
-           (table-end nil)
            (column (w3-table-current-column-number table-info))
            (motion 0)
-           (top-left nil)
            (widths (w3-table-info-column-widths table-info)))
        (set-mark (point))
        (save-excursion
@@ -631,8 +648,7 @@ Prefix arg can be used to specify the desired table 
nesting."
                (error "Not inside a W3 table")
              (w3-within-cell cell-info table-info
                 'w3-table-speak-current-table-column))))
-      (let ((orig (point))
-           (table-start nil)
+      (let ((table-start nil)
            (table-end nil)
            (column (w3-table-current-column-number table-info))
            (top-left nil)
@@ -661,11 +677,11 @@ Prefix arg can be used to specify the desired table 
nesting."
 ;;}}}
 ;;{{{  bind them to useful keys
 
-;;;###autoload
+(defvar emacspeak-prefix)
 
+;;;###autoload
 (defun w3-table-setup-keys ()
   "Setup emacspeak table browsing keys in w3 mode"
-  (declare (special emacspeak-prefix w3-mode-map))
   (let ((key (make-vector 1 (aref emacspeak-prefix 0))))
     (define-key w3-mode-map ","
       'w3-table-focus-on-this-cell)
diff --git a/w3-speak.el b/w3-speak.el
index cd5f4fa..f68ce8b 100644
--- a/w3-speak.el
+++ b/w3-speak.el
@@ -1,47 +1,47 @@
-;;; w3-speak.el,v --- Emacs-W3 speech interface
+;;; w3-speak.el --- Emacs-W3 speech interface
+
+;; Copyright (c) 1997, 1998, 2013 Free Software Foundation, Inc.
+
 ;; Author: wmperry
 ;; Original author: William Perry --<address@hidden>
 ;; Cloned from emacspeak-w3.el
 ;; Created: 1996/10/16 20:56:40
-;; Version: 1.14
 ;; Keywords: hypermedia, speech
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996 by T.V. Raman (address@hidden)
-;;; Copyright (c) 1996, 1997 by William M. Perry (address@hidden)
-;;; Copyright (c) 1997, 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; A replacement module for emacspeak-w3 that uses all the new functionality
-;;; of Emacs/W3 3.0.
-;;;
-;;; This file would not be possible without the help of
-;;; T.V. Raman (address@hidden) and his continued efforts to make Emacs/W3
-;;; even remotely useful. :)
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;; This conforms to http://www4.inria.fr/speech2.html
+;; This file is not part of GNU Emacs, but the same permissions apply.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; A replacement module for emacspeak-w3 that uses all the new functionality
+;; of Emacs/W3 3.0.
+;;
+;; This file would not be possible without the help of
+;; T.V. Raman (address@hidden) and his continued efforts to make Emacs/W3
+;; even remotely useful. :)
+
+;; This conforms to http://www4.inria.fr/speech2.html
+
+;;; Code:
 
 (require 'widget)
 (require 'w3-forms)
+(require 'w3-cus)
+(require 'w3-keymap)
 (require 'advice)
 ;; This condition-case needs to be here or it completely chokes
 ;; byte-compilation for people who do not have Emacspeak installed.
@@ -52,8 +52,9 @@
       (require 'dtk-voices)
       (require 'emacspeak-speak)
       (require 'emacspeak-sounds)
-      (eval-when (compile)
-                (require 'emacspeak-fix-interactive)))
+      ;; (eval-when (compile)
+      ;;        (require 'emacspeak-fix-interactive))
+      )
   (error (message "Emacspeak not found - speech will not work.")))
 
 
@@ -124,12 +125,14 @@
     (emacspeak-auditory-icon 'close-object)
     (emacspeak-speak-mode-line)))
 
+(defvar dtk-punctuation-mode)
+(defvar voice-lock-mode)
+
 (defadvice w3-fetch (around  emacspeak  act comp )
   "First produce an auditory icon to indicate retrieval.
 After retrieval, 
-set  voice-lock-mode to t after displaying the buffer,
-and then speak the mode-line. "
-  (declare (special dtk-punctuation-mode))
+set `voice-lock-mode' to t after displaying the buffer,
+and then speak the mode-line."
   (emacspeak-auditory-icon 'select-object)
   ad-do-it)
 
@@ -139,39 +142,36 @@ and then speak the mode-line. "
   (emacspeak-auditory-icon 'open-object)
   (emacspeak-speak-mode-line))
 
-;;; This is really the only function you should need to call unless
-;;; you are adding functionality.
+;; This is really the only function you should need to call unless
+;; you are adding functionality.
 (defun w3-speak-use-voice-locking (&optional arg) 
   "Tells w3 to start using voice locking.
 This is done by setting the w3 variables so that anchors etc are not marked by
-delimiters. We then turn on voice-lock-mode. 
-Interactive prefix arg does the opposite. "
+delimiters.  We then turn on `voice-lock-mode'.
+Interactive prefix arg does the opposite."
   (interactive "P")
-  (declare (special w3-echo-link))
   (setq w3-echo-link 'text)
   (if arg
       (remove-hook 'w3-mode-hook 'w3-speak-mode-hook)
     (add-hook 'w3-mode-hook 'w3-speak-mode-hook)))
 
 (defun w3-speak-browse-page ()
-  "Browse a WWW page"
+  "Browse a WWW page."
   (interactive)
   (emacspeak-audio-annotate-paragraphs)
   (emacspeak-execute-repeatedly 'forward-paragraph))
 
-(declaim (special w3-mode-map))
 (define-key w3-mode-map "." 'w3-speak-browse-page)
 
-(defvar url-speak-last-progress-indication 0
-  "Caches when we last produced a progress auditory icon")
+(defvar w3-speak--last-progress-indication 0
+  "Caches when we last produced a progress auditory icon.")
 
 (defadvice url-lazy-message (around emacspeak pre act)
-  "Provide pleasant auditory feedback about progress"
-  (declare (special url-speak-last-progress-indication ))
+  "Provide pleasant auditory feedback about progress."
   (let ((now (nth 1 (current-time))))
     (when (> now
-            (+ 3 url-speak-last-progress-indication))
-         (setq url-speak-last-progress-indication now)
+            (+ 3 w3-speak--last-progress-indication))
+         (setq w3-speak--last-progress-indication now)
          (apply 'message (ad-get-args 0))
          (emacspeak-auditory-icon 'progress))))
 
diff --git a/w3-style.el b/w3-style.el
index 56b32ef..94f9ab5 100644
--- a/w3-style.el
+++ b/w3-style.el
@@ -1,38 +1,39 @@
 ;;; w3-style.el --- Emacs/W3 binding style sheet mechanism
+
+;; Copyright (c) 1996-1999, 2013 Free Software Foundation, Inc.
+
 ;; Author: $Author: fx $
 ;; Created: $Date: 2001/10/11 13:04:58 $
-;; Version: $Revision: 1.4 $
 ;; Keywords: faces, hypermedia
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; A style sheet mechanism for emacs-w3
+;;
+;; This will eventually be able to under DSSSL[-lite] as well as the
+;; experimental W3C mechanism
+
+;;; Code:
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; A style sheet mechanism for emacs-w3
-;;;
-;;; This will eventually be able to under DSSSL[-lite] as well as the
-;;; experimental W3C mechanism
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (require 'font)
+(require 'w3-vars)
 (eval-when-compile (require 'cl))
 (require 'css)
 
@@ -44,8 +45,6 @@
        (media (intern (downcase (or (plist-get plist 'media) "all"))))
        (type (downcase (or (plist-get plist 'notation) "text/css")))
        (stylesheet nil)
-       (defines nil)
-       (buffer nil)
        (cur-sheet w3-current-stylesheet)
        (string (plist-get plist 'data)))
     (if (not (memq media (css-active-device-types)))
diff --git a/w3-toolbar.el b/w3-toolbar.el
index bee5bce..34ccfa7 100644
--- a/w3-toolbar.el
+++ b/w3-toolbar.el
@@ -1,34 +1,36 @@
 ;;; w3-toolbar.el --- Toolbar functions for emacs-w3
+
+;; Copyright (c) 1996-1997, 2013 Free Software Foundation, Inc.
+
 ;; Author: William M. Perry <address@hidden>
 ;; Created: $Date: 2001/07/19 14:15:52 $
-;; Version: $Revision: 1.8 $
 ;; Keywords: mouse, toolbar
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1995, 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996, 1997 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Toolbar specific function for XEmacs and Emacs 21
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; Toolbar specific function for XEmacs and Emacs 21
+
+;;; Code:
+
+(require 'w3-vars)
+
 (condition-case ()
     (progn
       (require 'xpm-button)
@@ -152,19 +154,16 @@ not `none'.")
       (xbm-button-create text 0))))
 
 (defun w3-toolbar-make-text-buttons ()
-  (let ((bgcol (or (cdr-safe (assq 'background-toolbar-color
-                                  (frame-parameters)))
-                  "#befbbefbbefb")))
-    (setq w3-toolbar-back-icon (w3-make-text-toolbar-button "Back")
-         w3-toolbar-forw-icon (w3-make-text-toolbar-button "Forward")
-         w3-toolbar-home-icon (w3-make-text-toolbar-button "Home")
-         w3-toolbar-reld-icon (w3-make-text-toolbar-button "Reload")
-         w3-toolbar-hotl-icon (w3-make-text-toolbar-button "Hotlist")
-         w3-toolbar-imag-icon (w3-make-text-toolbar-button "Images")
-         w3-toolbar-open-icon (w3-make-text-toolbar-button "Open")
-         w3-toolbar-print-icon (w3-make-text-toolbar-button "Print")
-         w3-toolbar-find-icon (w3-make-text-toolbar-button "Find")
-         w3-toolbar-help-icon (w3-make-text-toolbar-button "Help!"))))
+  (setq w3-toolbar-back-icon (w3-make-text-toolbar-button "Back")
+        w3-toolbar-forw-icon (w3-make-text-toolbar-button "Forward")
+        w3-toolbar-home-icon (w3-make-text-toolbar-button "Home")
+        w3-toolbar-reld-icon (w3-make-text-toolbar-button "Reload")
+        w3-toolbar-hotl-icon (w3-make-text-toolbar-button "Hotlist")
+        w3-toolbar-imag-icon (w3-make-text-toolbar-button "Images")
+        w3-toolbar-open-icon (w3-make-text-toolbar-button "Open")
+        w3-toolbar-print-icon (w3-make-text-toolbar-button "Print")
+        w3-toolbar-find-icon (w3-make-text-toolbar-button "Find")
+        w3-toolbar-help-icon (w3-make-text-toolbar-button "Help!")))
 
 (defun w3-toolbar-make-picture-buttons ()
   (mapcar
@@ -264,91 +263,96 @@ not `none'.")
     ))
 
 (defun w3-toolbar-from-orientation (orientation)
-  (cond
-   ((eq 'default w3-toolbar-orientation) default-toolbar)
-   ((eq 'bottom w3-toolbar-orientation) bottom-toolbar)
-   ((eq 'top w3-toolbar-orientation) top-toolbar)
-   ((eq 'left w3-toolbar-orientation) left-toolbar)
-   ((eq 'right w3-toolbar-orientation) right-toolbar)))
+  (if (featurep 'xemacs)
+      (cond
+       ((eq 'default orientation) default-toolbar)
+       ((eq 'bottom orientation) bottom-toolbar)
+       ((eq 'top orientation) top-toolbar)
+       ((eq 'left orientation) left-toolbar)
+       ((eq 'right orientation) right-toolbar))
+    (error "Unimplemented")))
 
-(defun w3-toolbar-dimension-from-orientation (orientation)
-  (cond
-   ((eq 'default w3-toolbar-orientation) nil)
-   ((eq 'bottom w3-toolbar-orientation) bottom-toolbar-height)
-   ((eq 'top w3-toolbar-orientation) top-toolbar-height)
-   ((eq 'left w3-toolbar-orientation) left-toolbar-width)
-   ((eq 'right w3-toolbar-orientation) right-toolbar-width)))
-
-(defun w3-ensure-toolbar-visible (orientation)
-  ;; Make sure a certain toolbar is visible if necessary
-  ;; This can modify frame parameters, so watch out.
-  (let ((dimension (w3-toolbar-dimension-from-orientation orientation))
-       (toolbar   (w3-toolbar-from-orientation orientation))
-       (dimensions nil)
-       (widths nil)
-       (heights nil)
-       (needs nil)
-       (has nil))
-    (if (and dimension toolbar
-            (setq toolbar (specifier-instance toolbar)))
-       (progn
-         (setq dimensions (mapcar
-                           (function
-                            (lambda (glyph)
-                              (and (glyphp glyph)
-                                   (cons (glyph-width glyph)
-                                         (glyph-height glyph)))))
-                           (mapcar 'car
-                                   (delq nil
-                                         (mapcar
-                                          (function (lambda (x)
-                                                      (and x
-                                                           (symbol-value
-                                                            (aref x 0)))))
-                                          toolbar))))
-               widths (sort (mapcar 'car dimensions) '>=)
-               heights (sort (mapcar 'cdr dimensions) '>=)
-               needs (+ 7 (if (memq orientation '(top bottom))
-                             (car heights)
-                           (car widths)))
-               has (specifier-instance dimension))
-         (if (<= has needs)
-             (set-specifier dimension (cons (selected-frame) needs)))))))
+;; (defun w3-toolbar-dimension-from-orientation (orientation)
+;;   (cond
+;;    ((eq 'default w3-toolbar-orientation) nil)
+;;    ((eq 'bottom w3-toolbar-orientation) bottom-toolbar-height)
+;;    ((eq 'top w3-toolbar-orientation) top-toolbar-height)
+;;    ((eq 'left w3-toolbar-orientation) left-toolbar-width)
+;;    ((eq 'right w3-toolbar-orientation) right-toolbar-width)))
+
+;; (defun w3-ensure-toolbar-visible (orientation)
+;;   ;; Make sure a certain toolbar is visible if necessary
+;;   ;; This can modify frame parameters, so watch out.
+;;   (let ((dimension (w3-toolbar-dimension-from-orientation orientation))
+;;     (toolbar   (w3-toolbar-from-orientation orientation))
+;;     (dimensions nil)
+;;     (widths nil)
+;;     (heights nil)
+;;     (needs nil)
+;;     (has nil))
+;;     (if (and dimension toolbar
+;;          (setq toolbar (specifier-instance toolbar)))
+;;     (progn
+;;       (setq dimensions (mapcar
+;;                         (function
+;;                          (lambda (glyph)
+;;                            (and (glyphp glyph)
+;;                                 (cons (glyph-width glyph)
+;;                                       (glyph-height glyph)))))
+;;                         (mapcar 'car
+;;                                 (delq nil
+;;                                       (mapcar
+;;                                        (function (lambda (x)
+;;                                                    (and x
+;;                                                         (symbol-value
+;;                                                          (aref x 0)))))
+;;                                        toolbar))))
+;;             widths (sort (mapcar 'car dimensions) '>=)
+;;             heights (sort (mapcar 'cdr dimensions) '>=)
+;;             needs (+ 7 (if (memq orientation '(top bottom))
+;;                           (car heights)
+;;                         (car widths)))
+;;             has (specifier-instance dimension))
+;;       (if (<= has needs)
+;;           (set-specifier dimension (cons (selected-frame) needs)))))))
                             
 (defun w3-toolbar-active ()
   (interactive)
-  (let ((toolbar (w3-toolbar-from-orientation w3-toolbar-orientation)))
-    (if (and toolbar (specifier-instance toolbar))
-       t
-      nil)))
+  (if (featurep 'xemacs)
+      (let ((toolbar (w3-toolbar-from-orientation w3-toolbar-orientation)))
+        (and toolbar (specifier-instance toolbar)))
+    (error "Unimplemented")))
 
-(defun w3-toggle-link-toolbar ()
-  (interactive)
-  (require 'info)                      ; For some toolbar buttons
-  (let* ((w3-toolbar-orientation w3-link-toolbar-orientation)
-        (toolbar (w3-toolbar-from-orientation w3-toolbar-orientation)))
-    (if toolbar
-       (if (w3-toolbar-active)
-           (set-specifier toolbar (cons (current-buffer) nil))
-         (set-specifier toolbar w3-link-toolbar (current-buffer))))))
+;; (defun w3-toggle-link-toolbar ()
+;;   (interactive)
+;;   (require 'info)                   ; For some toolbar buttons
+;;   (let* ((w3-toolbar-orientation w3-link-toolbar-orientation)
+;;      (toolbar (w3-toolbar-from-orientation w3-toolbar-orientation)))
+;;     (if toolbar
+;;     (if (w3-toolbar-active)
+;;         (set-specifier toolbar (cons (current-buffer) nil))
+;;       (set-specifier toolbar w3-link-toolbar (current-buffer))))))
 
 (defun w3-toggle-toolbar ()
   (interactive)
-  (if (eq major-mode 'w3-mode)
-      (let ((toolbar (w3-toolbar-from-orientation w3-toolbar-orientation)))
-       (cond
-        ((w3-toolbar-active)
-         (set-specifier toolbar (cons (current-buffer) nil)))
-        (toolbar
-         (set-specifier toolbar (cons (current-buffer) w3-toolbar)))
-        (t
-         (setq w3-toolbar-orientation 'default
-               toolbar (w3-toolbar-from-orientation w3-toolbar-orientation))
-         (and toolbar
-              (set-specifier toolbar (cons (current-buffer) w3-toolbar))))))
-    (if (not (eq w3-toolbar-orientation 'none))
-       (setq w3-toolbar-orientation 'none)
-      (setq w3-toolbar-orientation 'default))))
+  (cond
+   ((featurep 'xemacs)
+    (if (eq major-mode 'w3-mode)
+        (let ((toolbar (w3-toolbar-from-orientation w3-toolbar-orientation)))
+          (cond
+           ((w3-toolbar-active)
+            (set-specifier toolbar (cons (current-buffer) nil)))
+           (toolbar
+            (set-specifier toolbar (cons (current-buffer) w3-toolbar)))
+           (t
+            (setq w3-toolbar-orientation 'default
+                  toolbar (w3-toolbar-from-orientation w3-toolbar-orientation))
+            (and toolbar
+                 (set-specifier toolbar (cons (current-buffer) w3-toolbar))))))
+      (setq w3-toolbar-orientation (if (not (eq w3-toolbar-orientation 'none))
+                                       'none
+                                     'default))))
+   (t (error "Unimplemented"))))
 
 (defun w3-show-info-node ()
   (interactive)
@@ -360,9 +364,11 @@ not `none'.")
                 ["PostScript" (w3-print-this-url nil "PostScript") t]
                 ["Formatted Text" (w3-print-this-url nil "Formatted Text") t]
                 ["HTML Source" (w3-print-this-url nil "HTML Source") t]
-                nil
+                "--"
                 ["Cancel" (beep) t])))
-    (popup-dialog-box descr)))
+    (if (fboundp 'popup-dialog-box)
+        (popup-dialog-box descr)
+      (popup-menu descr e))))
 
 (defvar w3-toolbar-map
   (if (and (featurep 'tool-bar)
@@ -395,16 +401,14 @@ not `none'.")
    ((featurep 'infodock)
     ;; Infodock handles toolbars differently
     nil)
-   ((featurep 'toolbar)
+   ((featurep 'xemacs)
     ;; XEmacs way of doing things
     (let ((toolbar (w3-toolbar-from-orientation w3-toolbar-orientation)))
       (if toolbar
          (set-specifier toolbar (cons (current-buffer) w3-toolbar))))
     (set-specifier toolbar-buttons-captioned-p
                   (cons (current-buffer) (eq w3-toolbar-type 'both))))
-   ((and (featurep 'tool-bar) 
-        (display-graphic-p)
-        (> (frame-parameter nil 'tool-bar-lines) 0))
+   (t
     ;; Emacs 21.x way of doing things
     (set (make-local-variable 'tool-bar-map) w3-toolbar-map))
    (t
diff --git a/w3-vars.el b/w3-vars.el
index 8d8d5c0..d516e27 100644
--- a/w3-vars.el
+++ b/w3-vars.el
@@ -1,34 +1,29 @@
 ;;; w3-vars.el,v --- All variable definitions for emacs-w3
-;; Author: $Author: fx $
-;; Created: $Date: 2001/10/01 11:42:46 $
-;; Version: $Revision: 1.8 $
-;; Keywords: comm, help, hypermedia
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996, 97, 98, 99, 2001 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Copyright (c) 1996-1999, 2001, 2013 Free Software Foundation, Inc.
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Variable definitions for w3
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; Variable definitions for W3.
+
+;;; Code:
 
 (require 'w3-cus)                      ; Grab everything that is customized
 (require 'wid-edit)                    ; For `widget-keymap'
@@ -68,12 +63,6 @@ that it allows Emacs's total memory usage to grow larger, 
which may result
 in later garbage collections taking more time.")
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Figure out what flavor of emacs we are running
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defvar w3-running-xemacs (string-match "XEmacs" emacs-version)
-  "*Got XEmacs?.")
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Store the database of HTML general entities.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Commentary on the basis of the current W3C entity list.  -- fx
@@ -409,10 +398,9 @@ returns.")
 ;;; Startup items
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (defvar w3-form-labels nil "")
-(mapcar (function
-        (lambda (var)
-          (if (boundp var)
-              (make-variable-buffer-local var)))) w3-persistent-variables)
+(dolist (var w3-persistent-variables)
+  (if (boundp var)
+      (make-variable-buffer-local var)))
 
 (make-variable-buffer-local 'w3-last-fill-pos)
 (make-variable-buffer-local 'w3-frame-name)
diff --git a/w3-widget.el b/w3-widget.el
index 2938f2b..c8444a2 100644
--- a/w3-widget.el
+++ b/w3-widget.el
@@ -1,58 +1,56 @@
 ;;; w3-widget.el --- An image widget
+
+;; Copyright (c) 1996-1997, 2001, 2013 Free Software Foundation, Inc.
+
 ;; Author: Bill Perry <address@hidden>
 ;; Created: $Date: 2002/02/01 17:42:49 $
-;; Version: $Revision: 1.8 $
 ;; Keywords: faces, images
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996, 1997, 2001 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; This is a widget that will do the best it can with an image.
-;;;
-;;; It can handle all the common occurences of images on the world wide web
-;;; 1. A plain image - displays either a glyph of the image, or the
-;;;    alternative text
-;;; 2. A hyperlinked image - an image that is also a hypertext link to
-;;;    another page.  Displays either a glyph of the image, or the
-;;;    alternative text.  When activated with the mouse or the keyboard,
-;;;    the 'href' property of the widget is retrieved.
-;;; 3. Server side imagemaps - an image that has hotzones that lead to
-;;;    different areas.  Unfortunately, we cannot tell where the links go
-;;;    from the client - all processing is done by the server.  Displays
-;;;    either a glyph of the image, or the alternative text.  When activated
-;;;    with the mouse or the keyboard, the coordinates clicked on are
-;;;    sent to the remote server as HREF?x,y.  If the link is activated
-;;;    by the keyboard, then 0,0 are sent as the coordinates.
-;;; 4. Client side imagemaps - an image that has hotzones that lead to
-;;;    different areas.  All processing is done on the client side, so
-;;;    we can actually show a decent representation on a TTY.  Displays
-;;;    either a glyph of the image, or a drop-down-list of the destinations
-;;;    These are either URLs (http://foo/...) or alternative text.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;; I don't think there's currently any way to get the pixel position
-;; of a mouse event on an Emacs 21 image, so image maps aren't going
-;; to work properly.  -- fx
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; This is a widget that will do the best it can with an image.
+;;
+;; It can handle all the common occurences of images on the world wide web
+;; 1. A plain image - displays either a glyph of the image, or the
+;;    alternative text
+;; 2. A hyperlinked image - an image that is also a hypertext link to
+;;    another page.  Displays either a glyph of the image, or the
+;;    alternative text.  When activated with the mouse or the keyboard,
+;;    the 'href' property of the widget is retrieved.
+;; 3. Server side imagemaps - an image that has hotzones that lead to
+;;    different areas.  Unfortunately, we cannot tell where the links go
+;;    from the client - all processing is done by the server.  Displays
+;;    either a glyph of the image, or the alternative text.  When activated
+;;    with the mouse or the keyboard, the coordinates clicked on are
+;;    sent to the remote server as HREF?x,y.  If the link is activated
+;;    by the keyboard, then 0,0 are sent as the coordinates.
+;; 4. Client side imagemaps - an image that has hotzones that lead to
+;;    different areas.  All processing is done on the client side, so
+;;    we can actually show a decent representation on a TTY.  Displays
+;;    either a glyph of the image, or a drop-down-list of the destinations
+;;    These are either URLs (http://foo/...) or alternative text.
+
+;; FIXME: Current Emacs do provide pixel position of a mouse event, so
+;; we should be able to make image-maps work.
+
+;;; Code:
 
 (require 'widget)
 (require 'url-util)
@@ -63,21 +61,9 @@
 (defvar widget-image-keymap (make-sparse-keymap)
   "Keymap used over glyphs in an image widget")
 
-(defconst widget-mouse-button1 nil)
-(defconst widget-mouse-button2 nil)
-(defconst widget-mouse-button3 nil)
-
-(if (featurep 'xemacs)
-    (if (featurep 'mouse)
-       (setq widget-mouse-button1 'button1
-             widget-mouse-button2 'button2
-             widget-mouse-button3 'button3)
-      (setq widget-mouse-button1 'return
-           widget-mouse-button2 'return
-           widget-mouse-button3 'return))
-  (setq widget-mouse-button1 'mouse-1
-       widget-mouse-button2 'mouse-2
-       widget-mouse-button3 'mouse-3))
+(defconst widget-mouse-button1 'mouse1)
+(defconst widget-mouse-button2 'mouse2)
+(defconst widget-mouse-button3 'mouse3)
 
 (defvar widget-image-inaudible-p nil
   "*Whether to make images inaudible or not.")
@@ -90,8 +76,8 @@
 (define-widget 'image 'default
   "A fairly complex image widget."
   :convert-widget 'widget-image-convert
-  :value-to-internal (lambda (widget value) value)
-  :value-to-external (lambda (widget value) value)
+  :value-to-internal (lambda (_widget value) value)
+  :value-to-external (lambda (_widget value) value)
   :value-set 'widget-image-value-set
   :create 'widget-image-create
   :delete 'widget-image-delete
@@ -152,7 +138,7 @@
          (setq usemap (substring usemap 1 nil)))
       (cdr-safe (assoc usemap w3-imagemaps)))))
 
-(defun widget-image-callback (widget widget-ignore &optional event)
+(defun widget-image-callback (widget _widget-ignore &optional _event)
   (if (widget-get widget :href)
       (w3-fetch (widget-get widget :href) (widget-get widget :target))))
 
@@ -176,7 +162,6 @@
        (where (or (widget-get widget 'where) (point)))
        (glyph (widget-get widget 'glyph))
        (alt (widget-get widget 'alt))
-       (align (widget-get widget 'align))
        (real-widget nil)
        (invalid-glyph nil))
     (if target (setq target (intern (downcase target))))
diff --git a/w3-xemac.el b/w3-xemac.el
index f49ac24..37f9ba2 100644
--- a/w3-xemac.el
+++ b/w3-xemac.el
@@ -1,30 +1,29 @@
 ;;; w3-xemac.el --- XEmacs specific functions for emacs-w3
+
+;; Copyright (c) 1996 - 1999, 2013 Free Software Foundation, Inc.
+
 ;; Author: $Author: legoscia $
 ;; Created: $Date: 2006/10/17 20:24:48 $
-;; Version: $Revision: 1.3 $
 ;; Keywords: faces, help, mouse, hypermedia
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
 
 (require 'w3-imap)
 (require 'images)
diff --git a/w3.el b/w3.el
index b33623d..d521dbb 100644
--- a/w3.el
+++ b/w3.el
@@ -1,47 +1,38 @@
-;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
-;; Author: $Author: legoscia $
-;; Created: $Date: 2007/11/15 12:59:53 $
-;; Version: $Revision: 1.40 $
-;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996, 97, 98, 99, 2001, 2007, 2008 Free Software Foundation, 
Inc.
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; w3.el --- Fully customizable, largely undocumented web browser for Emacs
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; This is a major mode for browsing documents written in Hypertext Markup ;;;
-;;; Language (HTML).  These documents are typicallly part of the World Wide ;;;
-;;; Web (WWW), a project to create a global information net in hypertext    ;;;
-;;; format.                                                                ;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Copyright (c) 1996-2001, 2007-2008, 2013 Free Software Foundation, Inc.
 
-(require 'w3-compat)
-(require 'w3-cfg)
+;; Author: William Perry and many more
+;; Version: 4.0.48
+;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
-(or (featurep 'efs)
-    (featurep 'efs-auto)
-    (condition-case ()
-       (require 'ange-ftp)
-      (error nil)))
+;; This file is part of GNU Emacs.
+;;
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; This is a major mode for browsing documents written in Hypertext Markup
+;; Language (HTML).  These documents are typicallly part of the World Wide
+;; Web (WWW), a project to create a global information net in hypertext
+;; format.
+
+;;; Code:
 
+(require 'w3-compat)
 (eval-when-compile (require 'cl))
 (require 'css)
 (require 'url-vars)
@@ -69,8 +60,7 @@ See the variable `w3-notify' for the different notification 
behaviors."
     ;; we must not leave a different buffer current.
     ;; We can't rely on the editor command loop to reselect
     ;; the selected window's buffer.
-    (save-excursion
-      (set-buffer buff)
+    (with-current-buffer buff
       (make-frame)))
    ((eq w3-notify 'bully)
     (pop-to-buffer buff)
@@ -215,9 +205,8 @@ variable `http-header'."
 (defun w3-nasty-disgusting-http-equiv-handling (buffer url)
   "Propagate information from <meta http-equiv...> elements to MIME headers.
 Operate on BUFFER."
-  (let (content-type end-of-headers extra-headers)
-    (save-excursion
-      (set-buffer buffer)
+  (let (content-type end-of-headers)
+    (with-current-buffer buffer
       (goto-char (point-min))
       (mail-narrow-to-head)
       (setq content-type (mail-fetch-field "content-type"))
@@ -295,17 +284,16 @@ MUST-BE-VIEWING is the current URL when the timer 
expires."
                  (setq uri (match-string 1 uri)))
              (setq uri (url-expand-file-name uri (url-view-url t)))))
        (w3-setup-reload-timer uri (url-view-url t)
-                              (string-to-int (or reload "5"))))))
+                              (string-to-number (or reload "5"))))))
 
 (defun w3-fetch-redirect-callback (&rest args)
-  (let (redirect-url errorp)
+  (let (redirect-url)
     ;; Handle both styles of `url-retrieve' callbacks...
     (cond
      ((listp (car args))
       ;; Emacs 22 style.  First argument is a list.
       (let ((status (car args)))
        (when (eq (car status) :error)
-         (setq errorp t)
          (setq status (cddr args)))
        (when (eq (car status) :redirect)
          (setq redirect-url (second (car args))))
@@ -344,8 +332,7 @@ MUST-BE-VIEWING is the current URL when the timer expires."
     (let ((handle (mm-dissect-buffer t))
          (w3-explicit-coding-system
           (or w3-explicit-coding-system
-              (w3-recall-explicit-coding-system url)))
-         (buff nil))
+              (w3-recall-explicit-coding-system url))))
       (message "Downloading of `%s' complete." url)
       (url-mark-buffer-as-dead (current-buffer))
       (unless headers
@@ -441,9 +428,7 @@ With prefix argument, use the URL of the hyperlink under 
point instead."
    ((and (interactive-p) current-prefix-arg)
     (w3-download-url url))
    (t
-    (let ((x (url-view-url t))
-         (lastbuf (current-buffer))
-         (w3-current-buffer (current-buffer))
+    (let ((w3-current-buffer (current-buffer))
          (buf (w3-buffer-visiting url)))
       (if (or (not buf)
              (cond
@@ -553,10 +538,8 @@ the cdr is the 'next' node."
            (kill-buffer (get-buffer "Document Information")))
        (w3-fetch "about:document"))
     (setq buff (or buff (current-buffer)))
-    (save-excursion
-      (set-buffer buff)
+    (with-current-buffer buff
       (let* ((url (url-view-url t))
-            (cur-links w3-current-links)
             (title (buffer-name))
             (case-fold-search t)
             (attributes (url-file-attributes url))
@@ -568,13 +551,13 @@ the cdr is the 'next' node."
             (info w3-current-metainfo)
             (links w3-current-links))
        (set-buffer (get-buffer-create url-working-buffer))
-       (setq url-current-can-be-cached nil)
+       ;; (setq url-current-can-be-cached nil)
        (erase-buffer)
        (if (consp lastmod)
            (if (equal '(0 . 0) lastmod)
                (setq lastmod nil)
              (setq lastmod (current-time-string lastmod))))
-       (setq url-current-mime-type "text/html")
+       ;; (setq url-current-mime-type "text/html")
        (insert "\
 Content-Type: text/html\n
 <html>
@@ -588,7 +571,7 @@ Content-Type: text/html\n
    <tr><td>Location:</td><td>" url "</td></tr>")
        (if size (insert "\
    <tr><td>Size:</td><td>" (url-pretty-length (if (stringp size)
-                                                 (string-to-int size)
+                                                 (string-to-number size)
                                                size)) "</td></tr>"))
        (insert "\
    <tr><td>Last Modified:</td><td>" (or lastmod "None Given") "</td></tr>\n")
@@ -692,8 +675,7 @@ With prefix arg, insert the url under point."
                        (read-string "Link text: " (buffer-name))))))
     (setq buff (read-buffer "Insert into buffer: " nil t))
     (if buff
-       (save-excursion
-         (set-buffer buff)
+       (with-current-buffer buff
          (insert str))
       (message "Cancelled."))))
 
@@ -882,7 +864,9 @@ If there is no link under point, this will try using
               "Content-type: " content-type))
     (re-search-forward mail-header-separator nil)
     (forward-char 1)
-    (if (and (boundp 'mime/editor-mode-flag) mime/editor-mode-flag)
+    (if (and (boundp 'mime/editor-mode-flag)
+             (boundp 'mime-tag-format)
+             mime/editor-mode-flag)
         (insert (format mime-tag-format content-type) "\n"))
     (save-excursion
       (insert str))
@@ -904,8 +888,7 @@ If there is no link under point, this will try using
       (let ((x (buffer-list))
            (found nil))
        (while (and x (not found))
-         (save-excursion
-           (set-buffer (car x))
+         (with-current-buffer (car x)
            (setq found (string= (url-view-url t) url))
            (if (not found) (setq x (cdr x)))))
        (cond
@@ -970,13 +953,10 @@ Do this if it is a file: or ftp: reference"
 With prefix ARG, insert URL under point"
   (interactive "P")
   (let ((thebuf (get-buffer (read-buffer "Insert into buffer: ")))
-       (oldbuf (current-buffer))
        (url (if pref-arg (w3-view-this-url t) (url-view-url t))))
     (if (and url (not (equal "Not on a link!" url)))
-       (progn
-         (set-buffer thebuf)
-         (insert url)
-         (set-buffer oldbuf))
+       (with-current-buffer thebuf
+         (insert url))
       (message "Not on a link!"))))
 
 (defun w3-in-assoc (elt list)
@@ -1046,24 +1026,25 @@ even though the MIME type is nil or listed in 
`w3-mime-list-for-code-conversion'
   (interactive)
   (w3-fetch "www://auto/history"))
 
+(defvar ps-spool-buffer-name)
+
 (defun w3-save-as (&optional type)
   "Save a document to the local disk."
   (interactive)
-  (save-excursion
-    (let* ((completion-ignore-case t)
-          (format (or type (completing-read
-                            "Format: "
-                            '(("HTML Source")
-                              ("Formatted Text")
-                              ("PostScript")
-                              ("Binary"))
-                            nil t)))
-          (fname (expand-file-name
-                  (read-file-name "File name: " default-directory)))
-          (source w3-current-source)
-          (text (buffer-string))
-          (url (url-view-url t)))
-      (set-buffer (generate-new-buffer " *w3-save-as*"))
+  (let* ((completion-ignore-case t)
+         (format (or type (completing-read
+                           "Format: "
+                           '(("HTML Source")
+                             ("Formatted Text")
+                             ("PostScript")
+                             ("Binary"))
+                           nil t)))
+         (fname (expand-file-name
+                 (read-file-name "File name: " default-directory)))
+         (source w3-current-source)
+         (text (buffer-string))
+         (url (url-view-url t)))
+    (with-current-buffer (generate-new-buffer " *w3-save-as*")
       (cond
        ((equal "Binary" format)
        (insert source))
@@ -1105,8 +1086,7 @@ even though the MIME type is nil or listed in 
`w3-mime-list-for-code-conversion'
 (defun w3-log-bad-html (type desc)
   "Log bad HTML to the buffer specified by w3-debug-buffer."
   (if w3-debug-html
-      (save-excursion
-       (set-buffer (get-buffer-create w3-debug-buffer))
+      (with-current-buffer (get-buffer-create w3-debug-buffer)
        (goto-char (point-max))
        (insert (make-string (1- (window-width)) w3-horizontal-rule-char) "\n")
        (cond
@@ -1174,11 +1154,9 @@ even though the MIME type is nil or listed in 
`w3-mime-list-for-code-conversion'
                     url-version
                     url)))
         (if (and url (string= url "file:nil")) (setq url nil))
-        (mapcar
-         (function
-          (lambda (x)
-            (if (not (and (boundp x) (symbol-value x)))
-                (setq vars (delq x vars))))) vars)
+        (dolist (x vars)
+           (if (not (and (boundp x) (symbol-value x)))
+               (setq vars (delq x vars))))
         (reporter-submit-bug-report w3-bug-address
                                     (concat "WWW v" w3-version-number " of "
                                             w3-version-date)
@@ -1443,8 +1421,7 @@ as high as possible in w3-explicit-conversion-tree"
     (let ((make-backup-files nil)
          (version-control nil)
          (require-final-newline t))
-      (save-excursion
-       (set-buffer (get-buffer-create " *w3-tmp*"))
+      (with-current-buffer (get-buffer-create " *w3-tmp*")
        (erase-buffer)
        (insert "(setq w3-explicit-conversion-tree\n      '"
                (prin1-to-string w3-explicit-conversion-tree)
@@ -1470,8 +1447,7 @@ as high as possible in w3-explicit-conversion-tree"
   (if mega
       (mapcar
        (lambda (x)
-        (save-excursion
-          (set-buffer (get-buffer x))
+        (with-current-buffer (get-buffer x)
           (if (eq major-mode 'w3-mode)
               (w3-quit nil))))
        (buffer-list))
@@ -1640,34 +1616,30 @@ No arg means whole window full.  Arg is number of lines 
to scroll."
       (setq x (cdr x))))
   (message "Cleaning up w3 temporary files... done."))
 
-(eval-and-compile
+(defalias 'w3-warn
   (cond
    ((fboundp 'display-warning)
-    (fset 'w3-warn 'display-warning))
+    #'display-warning)
    ((fboundp 'warn)
-    (defun w3-warn (class message &optional level)
+    (lambda (class message &optional level)
       (if (and (eq class 'html)
               (not w3-debug-html))
          nil
        (warn "(%s/%s) %s" class (or level 'warning) message))))
    (t
-    (defun w3-warn (class message &optional level)
+    (lambda (class message &optional level)
       (if (and (eq class 'html)
               (not w3-debug-html))
          nil
-       (save-excursion
-         (set-buffer (get-buffer-create "*W3-WARNINGS*"))
+       (with-current-buffer (get-buffer-create "*W3-WARNINGS*")
          (goto-char (point-max))
          (save-excursion
            (insert (format "(%s/%s) %s\n" class (or level 'warning) message)))
          (display-buffer (current-buffer))))))))
 
-(defun w3-map-links (function &optional buffer from to maparg)
-  "Map FUNCTION over the hypertext links which overlap region in BUFFER,
-starting at FROM and ending at TO.  FUNCTION is called with the arguments
-WIDGET and MAPARG.
-The arguments FROM, TO, MAPARG, and BUFFER default to the beginning of
-BUFFER, the end of BUFFER, nil, and (current-buffer), respectively."
+(defun w3-map-links (function &optional maparg)
+  "Map FUNCTION over the hypertext links in current buffer,
+FUNCTION is called with the arguments WIDGET and MAPARG."
   (let ((parent)
        (highly-unlikely-name-for-a-variable-holding-a-function function))
     (widget-map-buttons
@@ -1695,6 +1667,8 @@ BUFFER, the end of BUFFER, nil, and (current-buffer), 
respectively."
 (defvar w3-loaded-stylesheets nil
   "A list of all the stylesheets Emacs-W3 loaded at startup.")
 
+(defvar w3--package-directory (file-name-directory load-file-name))
+
 (defun w3-find-default-stylesheets ()
   (setq w3-loaded-stylesheets nil)
   (let* ((lightp (css-color-light-p 'default))
@@ -1707,6 +1681,7 @@ BUFFER, the end of BUFFER, nil, and (current-buffer), 
respectively."
                                         
"/this/is/a/highly/unlikely/directory/name"
                                       w3-configuration-directory))
         (directories (list
+                       (expand-file-name "etc" w3--package-directory)
                       (if (fboundp 'locate-data-directory)
                           (locate-data-directory "w3"))
                       data-directory
@@ -1714,7 +1689,6 @@ BUFFER, the end of BUFFER, nil, and (current-buffer), 
respectively."
                       (expand-file-name "../../w3" data-directory)
                       w3-lisp
                       w3-root
-                      (w3-configuration-data 'datadir)
                       (expand-file-name "w3" w3-root)
                       (expand-file-name "etc" w3-root)
                       (expand-file-name "etc/w3" w3-root)
@@ -1863,9 +1837,8 @@ Emacs."
   (message "Reimplement w3-mark-link-as-followed"))
 
 (defun w3-only-links ()
-  (let* (result temp)
-    (w3-map-links (lambda (x y)
-                   (setq result (cons x result))))
+  (let (result)
+    (w3-map-links (lambda (x _y) (push x result)))
     result))
 
 (defun w3-download-redirect-callback (&rest args)
@@ -2026,7 +1999,7 @@ With optional ARG, move across that many fields."
                          (buffer-substring-no-properties
                           (widget-get link-at-point :from)
                           (widget-get link-at-point :to)))))
-    (w3-map-links (lambda (widget arg)
+    (w3-map-links (lambda (widget _arg)
                    (if (and (widget-get widget :from)
                             (widget-get widget :to))
                        (setq links-alist (cons
@@ -2077,9 +2050,8 @@ With optional ARG, move across that many fields."
        (url (url-view-url t)))
     (if (not todo)
        (error "No HTML errors on this page!  Amazing, isn't it?"))
-    (save-excursion
-      (set-buffer
-       (get-buffer-create (concat "HTML Errors for: " (or url "???"))))
+    (with-current-buffer
+        (get-buffer-create (concat "HTML Errors for: " (or url "???")))
       (setq buffer (current-buffer))
       (erase-buffer)
       (while todo
@@ -2144,7 +2116,7 @@ Current keymap is:
 (require 'url)
 (require 'w3-parse)
 (require 'w3-display)
-(require 'w3-auto)
+;; (require 'w3-auto)
 (require 'w3-emulate)
 (require 'w3-menu)
 (require 'w3-mouse)

commit 11ce5149a82281435b2f4ccd578b82760cbf1fc8
Author: Stefan Monnier <address@hidden>
Date:   Thu Aug 22 21:45:04 2013 -0400

    Move Elisp files out of "lisp" for ELPA format

diff --git a/.cvsignore b/.gitignore
similarity index 100%
rename from .cvsignore
rename to .gitignore
diff --git a/lisp/css.el b/css.el
similarity index 100%
rename from lisp/css.el
rename to css.el
diff --git a/lisp/devices.el b/devices.el
similarity index 100%
rename from lisp/devices.el
rename to devices.el
diff --git a/lisp/docomp.el b/docomp.el
similarity index 100%
rename from lisp/docomp.el
rename to docomp.el
diff --git a/lisp/font.el b/font.el
similarity index 100%
rename from lisp/font.el
rename to font.el
diff --git a/lisp/images.el b/images.el
similarity index 100%
rename from lisp/images.el
rename to images.el
diff --git a/lisp/.cvsignore b/lisp/.cvsignore
deleted file mode 100644
index e72d50b..0000000
--- a/lisp/.cvsignore
+++ /dev/null
@@ -1,5 +0,0 @@
-Makefile
-auto-autoloads.el
-custom-load.el
-w3-auto.el
-w3-cfg.el
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
deleted file mode 100644
index 3cd9862..0000000
--- a/lisp/Makefile.in
+++ /dev/null
@@ -1,141 +0,0 @@
-# where the w3 lisp files should go
-srcdir  = @srcdir@
-prefix  = @prefix@
-datadir = @datadir@
-lispdir = @lispdir@
-top_srcdir = @top_srcdir@
-confdir = $(datadir)/emacs/w3
-
-VPATH=$(srcdir)
-
-############## no user servicable parts beyond this point ###################
-# Have to preload a few things to get a nice clean compile
-
-EMACS     = @EMACS@
-GNUSDIR   = @GNUS@
-URLDIR    = @URL@
-INSTALL   = @INSTALL@
-RM        = rm -f
-
-DEPS = -l $(srcdir)/docomp.el -l $(URLDIR)/url-vars.el -l $(srcdir)/w3-vars.el
-
-# compile with noninteractive and relatively clean environment
-BATCHFLAGS = -batch -q -no-site-file
-
-W3_SOURCES =                                                           \
-       css.el                                                          \
-       url-hotlist.el                                                  \
-       w3-cfg.el                                                       \
-       w3-compat.el                                                    \
-       w3-cus.el                                                       \
-       w3-dired.el                                                     \
-       w3-display.el                                                   \
-       w3-emacs.el                                                     \
-       w3-emulate.el                                                   \
-       w3-forms.el                                                     \
-       w3-fast-parse.el                                                \
-       w3-hot.el                                                       \
-       w3-hotindex.el                                                  \
-       w3-imap.el                                                      \
-       w3-java.el                                                      \
-       w3-keymap.el                                                    \
-       w3-menu.el                                                      \
-       w3-mouse.el                                                     \
-       w3-parse.el                                                     \
-       w3-print.el                                                     \
-       w3-props.el                                                     \
-       w3-speak-table.el                                               \
-       w3-speak.el                                                     \
-       w3-style.el                                                     \
-       w3-toolbar.el                                                   \
-       w3-vars.el                                                      \
-       w3-widget.el                                                    \
-       w3-xemac.el                                                     \
-       w3.el
-
-UTIL_SOURCES =                                                                 
\
-       devices.el font.el images.el ssl.el
-
-AUTO_SOURCES = auto-autoloads.el custom-load.el w3-auto.el w3-cfg.el
-
-W3_OBJECTS = $(W3_SOURCES:.el=.elc)
-UTIL_OBJECTS = $(UTIL_SOURCES:.el=.elc)
-AUTO_OBJECTS = $(AUTO_SOURCES:.el=.elc)
-
-# Some makes appear to choke if I try to do a substitution on a really
-# large macro like SOURCES when it included all of these, so lets combine
-# everything now that it has been appropriately munged in smaller chunks.
-ALLSOURCES = $(W3_SOURCES) $(UTIL_SOURCES) $(AUTO_SOURCES)
-ALLOBJECTS = $(W3_OBJECTS) $(UTIL_OBJECTS) $(AUTO_OBJECTS)
-
-# Warning!  Currently, the following file can _NOT_ be bytecompiled.
-EXTRAS = docomp.el
-
-.SUFFIXES: .elc .el
-
-.el,v.el:
-       co -q $<
-
-.el.elc:
-       GNUSDIR=$(GNUSDIR) URLDIR=$(URLDIR) W3SRCDIR=$(srcdir) $(EMACS) 
$(BATCHFLAGS) $(DEPS) -f batch-byte-compile $<
-
-all:   $(AUTO_SOURCES) w3
-
-w3-auto.el: auto-autoloads.el
-       GNUSDIR=$(GNUSDIR) URLDIR=$(URLDIR) W3SRCDIR=$(srcdir) $(EMACS) 
$(BATCHFLAGS) -l $(srcdir)/docomp.el -f emacs-batch-build-autoloads $(srcdir) 
auto-autoloads.el
-
-auto-autoloads.el: $(SOURCES)
-       GNUSDIR=$(GNUSDIR) URLDIR=$(URLDIR) W3SRCDIR=$(srcdir) $(EMACS) 
$(BATCHFLAGS) -l $(srcdir)/docomp.el -f emacs-batch-build-autoloads $(srcdir) 
auto-autoloads.el
-
-custom-load.el: $(SOURCES)
-       GNUSDIR=$(GNUSDIR) URLDIR=$(URLDIR) W3SRCDIR=$(srcdir) 
@REBUILD_CUSTOMLOADS@
-       if [ -f cus-load.el ]; then mv cus-load.el custom-load.el; fi
-
-w3-cfg.el: $(srcdir)/w3-cfg.el.in ../config.status
-       ( cd ../ ; CONFIG_FILES=lisp/w3-cfg.el CONFIG_HEADERS= ./config.status)
-
-w3:    $(ALLSOURCES) $(ALLOBJECTS)
-       @echo Build of w3 complete...
-
-xemacs-w3: $(ALLSOURCES) $(ALLOBJECTS)
-       @echo Build of w3 complete...
-
-fast:  $(ALLSOURCES) $(EXTRAS)
-       GNUSDIR=$(GNUSDIR) URLDIR=$(URLDIR) W3SRCDIR=$(srcdir) $(EMACS) 
$(BATCHFLAGS) $(DEPS) -f batch-byte-compile $(ALLSOURCES)
-       @echo Build of w3 complete...
-
-autoloads:
-       $(EMACS) $(BATCHFLAGS) -eval '(setq autoload-package-name "w3")' -l 
autoload -f batch-update-directory .
-
-install: all
-       @echo Installing in $(lispdir)
-       ( if [ ! -d $(lispdir) ]; then mkdir -p $(lispdir); fi )
-       for x in $(ALLSOURCES) $(EXTRAS) $(ALLOBJECTS); do              \
-               if [ -f $$x ]; then                                     \
-                       $(INSTALL) -m 644 $$x $(lispdir);               \
-               else                                                    \
-                       $(INSTALL) -m 644 $(srcdir)/$$x $(lispdir);     \
-               fi                                                      \
-       done;
-
-distclean: clean
-       $(RM) config.* Makefile w3-cfg.el w3-auto.el $(AUTO_SOURCES)
-
-clean:
-       $(RM) *.elc *~
-
-# Automatic makefile rebuilding
-Makefile: $(srcdir)/Makefile.in ../config.status
-       ( cd .. ; CONFIG_FILES=lisp/Makefile ./config.status )
-
-$(top_srcdir)/configure: $(top_srcdir)/configure.in $(top_srcdir)/aclocal.m4
-       cd $(top_srcdir) && autoreconf
-
-../config.status: $(top_srcdir)/configure
-       cd .. && ./config.status --recheck
-
-# Distribution building
-version: $(ALLSOURCES) $(EXTRAS) descrip.mms
-       test -d $(DIRNAME)/lisp || mkdir -p $(DIRNAME)/lisp
-       for x in descrip.mms $(ALLSOURCES) $(EXTRAS) w3-cfg.el.in w3-cfg.nt 
Makefile.in; do $(INSTALL) -m 644 $$x $(DIRNAME)/lisp; done
-       cd $(DIRNAME)/lisp && $(RM) $(AUTO_SOURCES)
diff --git a/lisp/descrip.mms b/lisp/descrip.mms
deleted file mode 100644
index f5b8916..0000000
--- a/lisp/descrip.mms
+++ /dev/null
@@ -1,80 +0,0 @@
-# where the w3 lisp files should go
-prefix  = gnu_root
-datadir = $(prefix):[lib]
-lispdir = $(prefix):[lib.emacs.site-lisp]
-confdir = $(prefix):[lib.emacs.w3]
-
-EMACS = emacs
-ECHO  = write sys$output
-MKDIR = create/dir
-
-############## no user servicable parts beyond this point ###################
-# Have to preload a few things to get a nice clean compile
-
-EMACS     = emacs
-WIDGETDIR = 
-
-DEPS = -l sys$disk:[]vmsloadup.el
-
-# compile with noninteractive and relatively clean environment
-BATCHFLAGS = -batch -q -no-site-file
-
-URLSOURCES = \
-       url-nfs.el url-file.el url-cookie.el url-parse.el url-irc.el    \
-       url-gopher.el url-http.el url-mail.el url-misc.el url-news.el   \
-       url-vars.el url-auth.el mm.el md5.el url-gw.el ssl.el base64.el \
-       url.el socks.el url-cache.el url-ns.el
-
-URLOBJECTS    = $(URLSOURCES:.el=.elc)
-
-SOURCES = \
-       mule-sysdp.el w3-widget.el devices.el w3-imap.el                \
-       css.el dsssl.el dsssl-flow.el font.el images.el w3-vars.el      \
-       w3-cus.el w3-style.el w3-forms.el w3-emulate.el \
-       w3-props.el w3-auto.el w3-menu.el w3-mouse.el w3-toolbar.el     \
-       w3-speak.el w3-latex.el w3-parse.el w3-display.el               \
-       w3-print.el w3-about.el w3-hot.el w3-e19.el w3-xemac.el w3.el   \
-       w3-script.el w3-jscript.el w3-elisp.el w3-e20.el                \
-       auto-autoloads.el custom-load.el w3-speak-table.el
-
-OBJECTS = $(SOURCES:.el=.elc)
-
-AUTOSOURCES = auto-autoloads.el custom-load.el w3-auto.el
-AUTOOBJECTS = $(AUTOSOURCES:.el=.elc)
-
-ALLSOURCES = $(SOURCES) $(URLSOURCES) $(AUTOSOURCES)
-ALLOBJECTS = $(OBJECTS) $(URLOBJECTS) $(AUTOOBJECTS)
-
-# Warning!  Currently, the following file can _NOT_ be bytecompiled.
-EXTRAS = w3-sysdp.el docomp.el
-
-.SUFFIXES: .elc .el
-
-.el.elc:
-       $(EMACS) $(BATCHFLAGS) $(DEPS) -f batch-byte-compile $(MMS$SOURCE)
-
-all:   w3
-
-w3:    $(SOURCES) $(EXTRAS) $(OBJECTS)
-       @echo Build of w3 complete...
-
-fast:  $(SOURCES) $(EXTRAS)
-       $(EMACS) $(BATCHFLAGS) $(DEPS) -f batch-byte-compile $(SOURCES)
-
-install: all
-       @$(ECHO) Installing in $(lispdir)
-       if f$parse("$(lispdir)") .eqs. "" then $(MKDIR) $(lispdir)
-       copy/log $(SOURCES),$(OBJECTS),$(EXTRAS) $(lispdir)
-       - purge/log $(lispdir)
-
-distclean: clean
-       $(RM) config.* Makefile
-
-clean:
-       $(RM) $(OBJECTS)
-
-w3-vars.elc: w3-cus.elc w3-vars.el
-w3-display.elc: w3-display.el css.elc font.elc w3-imap.elc
-css.elc: css.el font.elc
-w3.elc: css.elc w3-vars.elc w3.el
-dsssl.elc: dsssl.el dsssl-flow.elc
diff --git a/lisp/ssl.el b/ssl.el
similarity index 100%
rename from lisp/ssl.el
rename to ssl.el
diff --git a/lisp/url-hotlist.el b/url-hotlist.el
similarity index 100%
rename from lisp/url-hotlist.el
rename to url-hotlist.el
diff --git a/lisp/vmsloadup.el b/vmsloadup.el
similarity index 100%
rename from lisp/vmsloadup.el
rename to vmsloadup.el
diff --git a/lisp/w3-cfg.el.in b/w3-cfg.el.in
similarity index 100%
rename from lisp/w3-cfg.el.in
rename to w3-cfg.el.in
diff --git a/lisp/w3-cfg.nt b/w3-cfg.nt
similarity index 100%
rename from lisp/w3-cfg.nt
rename to w3-cfg.nt
diff --git a/lisp/w3-compat.el b/w3-compat.el
similarity index 100%
rename from lisp/w3-compat.el
rename to w3-compat.el
diff --git a/lisp/w3-cus.el b/w3-cus.el
similarity index 100%
rename from lisp/w3-cus.el
rename to w3-cus.el
diff --git a/lisp/w3-dired.el b/w3-dired.el
similarity index 100%
rename from lisp/w3-dired.el
rename to w3-dired.el
diff --git a/lisp/w3-display.el b/w3-display.el
similarity index 100%
rename from lisp/w3-display.el
rename to w3-display.el
diff --git a/lisp/w3-emacs.el b/w3-emacs.el
similarity index 100%
rename from lisp/w3-emacs.el
rename to w3-emacs.el
diff --git a/lisp/w3-emulate.el b/w3-emulate.el
similarity index 100%
rename from lisp/w3-emulate.el
rename to w3-emulate.el
diff --git a/lisp/w3-fast-parse.el b/w3-fast-parse.el
similarity index 100%
rename from lisp/w3-fast-parse.el
rename to w3-fast-parse.el
diff --git a/lisp/w3-forms.el b/w3-forms.el
similarity index 100%
rename from lisp/w3-forms.el
rename to w3-forms.el
diff --git a/lisp/w3-hot.el b/w3-hot.el
similarity index 100%
rename from lisp/w3-hot.el
rename to w3-hot.el
diff --git a/lisp/w3-hotindex.el b/w3-hotindex.el
similarity index 100%
rename from lisp/w3-hotindex.el
rename to w3-hotindex.el
diff --git a/lisp/w3-imap.el b/w3-imap.el
similarity index 100%
rename from lisp/w3-imap.el
rename to w3-imap.el
diff --git a/lisp/w3-java.el b/w3-java.el
similarity index 100%
rename from lisp/w3-java.el
rename to w3-java.el
diff --git a/lisp/w3-keymap.el b/w3-keymap.el
similarity index 100%
rename from lisp/w3-keymap.el
rename to w3-keymap.el
diff --git a/lisp/w3-latex.el b/w3-latex.el
similarity index 100%
rename from lisp/w3-latex.el
rename to w3-latex.el
diff --git a/lisp/w3-menu.el b/w3-menu.el
similarity index 100%
rename from lisp/w3-menu.el
rename to w3-menu.el
diff --git a/lisp/w3-mouse.el b/w3-mouse.el
similarity index 100%
rename from lisp/w3-mouse.el
rename to w3-mouse.el
diff --git a/lisp/w3-parse.el b/w3-parse.el
similarity index 100%
rename from lisp/w3-parse.el
rename to w3-parse.el
diff --git a/lisp/w3-print.el b/w3-print.el
similarity index 100%
rename from lisp/w3-print.el
rename to w3-print.el
diff --git a/lisp/w3-props.el b/w3-props.el
similarity index 100%
rename from lisp/w3-props.el
rename to w3-props.el
diff --git a/lisp/w3-speak-table.el b/w3-speak-table.el
similarity index 100%
rename from lisp/w3-speak-table.el
rename to w3-speak-table.el
diff --git a/lisp/w3-speak.el b/w3-speak.el
similarity index 100%
rename from lisp/w3-speak.el
rename to w3-speak.el
diff --git a/lisp/w3-style.el b/w3-style.el
similarity index 100%
rename from lisp/w3-style.el
rename to w3-style.el
diff --git a/lisp/w3-toolbar.el b/w3-toolbar.el
similarity index 100%
rename from lisp/w3-toolbar.el
rename to w3-toolbar.el
diff --git a/lisp/w3-vars.el b/w3-vars.el
similarity index 100%
rename from lisp/w3-vars.el
rename to w3-vars.el
diff --git a/lisp/w3-widget.el b/w3-widget.el
similarity index 100%
rename from lisp/w3-widget.el
rename to w3-widget.el
diff --git a/lisp/w3-xemac.el b/w3-xemac.el
similarity index 100%
rename from lisp/w3-xemac.el
rename to w3-xemac.el
diff --git a/lisp/w3.el b/w3.el
similarity index 100%
rename from lisp/w3.el
rename to w3.el

commit 4cd82a5d4502374d8021b6e1c01236d1778f1fab
Author: Magnus Henoch <address@hidden>
Date:   Tue May 20 17:28:01 2008 +0200

    2008-05-20  Magnus Henoch  <address@hidden>
    
        * lisp/w3.el (w3-do-setup): Change homepage link.

diff --git a/ChangeLog b/ChangeLog
index 9ff349c..e1d60c3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2008-05-20  Magnus Henoch  <address@hidden>
+
+       * lisp/w3.el (w3-do-setup): Change homepage link.
+
 2008-03-26  Magnus Henoch  <address@hidden>
 
        * lisp/w3.el (w3-fetch-callback): Don't disable multibyte.
diff --git a/lisp/w3.el b/lisp/w3.el
index 8db15d5..b33623d 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1850,11 +1850,11 @@ Emacs."
     (or w3-hotlist (w3-parse-hotlist))
 
     ;; Set the default home page, honoring their defaults, then the
-    ;; standard WWW_HOME, then default to the documentation @ IU
+    ;; standard WWW_HOME, then default to the documentation @ gnu.org
     (or w3-default-homepage
        (setq w3-default-homepage
              (or (getenv "WWW_HOME")
-                 "http://www.cs.indiana.edu/elisp/w3/docs.html";)))
+                 "http://www.gnu.org/software/w3/";)))
 
     (run-hooks 'w3-load-hook)))
 

commit 4fe95e5078c6f369d0e8eec551f4573475626e98
Author: Magnus Henoch <address@hidden>
Date:   Wed Mar 26 00:10:25 2008 +0100

    2008-03-26  Magnus Henoch  <address@hidden>
    
        * lisp/w3.el (w3-fetch-callback): Don't disable multibyte.
        (w3-decode-charset): Don't reenable multibyte.

diff --git a/ChangeLog b/ChangeLog
index d8901cc..9ff349c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-03-26  Magnus Henoch  <address@hidden>
+
+       * lisp/w3.el (w3-fetch-callback): Don't disable multibyte.
+       (w3-decode-charset): Don't reenable multibyte.
+
 2008-03-10  Magnus Henoch  <address@hidden>
 
        * lisp/w3-display.el (w3-display-table): Guard against empty
diff --git a/lisp/w3.el b/lisp/w3.el
index a23131f..8db15d5 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -5,7 +5,7 @@
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996, 97, 98, 99, 2001, 2007 Free Software Foundation, Inc.
+;;; Copyright (c) 1996, 97, 98, 99, 2001, 2007, 2008 Free Software Foundation, 
Inc.
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
 ;;;
 ;;; This file is part of GNU Emacs.
@@ -188,8 +188,7 @@ Return the coding system used for the decoding."
        (mm-decode-coding-region (point-min) (point-max) coding-system)
        ;; Potentially useful is the buffer's going to be saved, and
        ;; for the mode-line indication.
-       (set-buffer-file-coding-system coding-system))
-      (mm-enable-multibyte))
+       (set-buffer-file-coding-system coding-system)))
     coding-system))
 
 (defvar http-header)                   ; dynamically bound below
@@ -360,7 +359,6 @@ MUST-BE-VIEWING is the current URL when the timer expires."
            (equal (mm-handle-media-type handle) "application/xhtml+xml"))
        ;; Special case text/html if it comes through w3-fetch
        (set-buffer (generate-new-buffer " *w3-html*"))
-       (mm-disable-multibyte)
        (mm-insert-part handle)
        (w3-decode-charset handle)
        (setq url-current-object (url-generic-parse-url url))

commit 634c8c5f42ab5a9f845e62a9983b7a52c0c1522d
Author: Magnus Henoch <address@hidden>
Date:   Mon Mar 10 21:07:19 2008 +0100

    * lisp/w3-display.el (w3-display-table-dimensions): Guard against
    empty colspan and rowspan elements.

diff --git a/ChangeLog b/ChangeLog
index 715aa4a..d8901cc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,7 @@
 
        * lisp/w3-display.el (w3-display-table): Guard against empty
        colspan and rowspan elements.
+       (w3-display-table-dimensions): Ditto.
 
 2008-03-01  Magnus Henoch  <address@hidden>
 
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 2b3f21b..851908d 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1369,8 +1369,10 @@ Can sometimes make the structure of a document clearer")
               (mapcar
                (function
                 (lambda (td)
-                  (setq colspan (string-to-int (or (cdr-safe (assq 'colspan 
(nth 1 td))) "1"))
-                        rowspan (string-to-int (or (cdr-safe (assq 'rowspan 
(nth 1 td))) "1"))
+                  (setq colspan (string-to-int (or (let ((attr (cdr-safe (assq 
'colspan (nth 1 td)))))
+                                                     (unless (zerop (length 
attr)) attr)) "1"))
+                        rowspan (string-to-int (or (let ((attr (cdr-safe (assq 
'rowspan (nth 1 td)))))
+                                                     (unless (zerop (length 
attr)) attr))"1"))
                         min  (w3-size-of-tree  (nth 2 td) 'min)
                         max  (w3-size-of-tree  (nth 2 td) 'max)
                         )

commit 2c671b3c0bb15c5a3e4c8024d6c1c2975b0233dd
Author: Magnus Henoch <address@hidden>
Date:   Mon Mar 10 20:42:05 2008 +0100

    * lisp/w3-display.el (w3-display-table): Guard against empty
    colspan and rowspan elements.

diff --git a/ChangeLog b/ChangeLog
index 9e72aa6..715aa4a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-03-10  Magnus Henoch  <address@hidden>
+
+       * lisp/w3-display.el (w3-display-table): Guard against empty
+       colspan and rowspan elements.
+
 2008-03-01  Magnus Henoch  <address@hidden>
 
        * lisp/w3-speak-table.el: Modernize backquotes.
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 97c5b3c..2b3f21b 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -4,7 +4,7 @@
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996, 97, 98, 99, 2000, 2001, 2007 Free Software Foundation, 
Inc.
+;;; Copyright (c) 1996, 97, 98, 99, 2000, 2001, 2007, 2008 Free Software 
Foundation, Inc.
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;
@@ -1646,11 +1646,15 @@ Can sometimes make the structure of a document clearer")
                     (push nil w3-active-voices)
                     (let* ((node (car cols))
                            (attributes (nth 1 node))
+                           (colspan-attr (cdr-safe (assq 'colspan attributes)))
                            (colspan (string-to-int
-                                     (or (cdr-safe (assq 'colspan attributes))
+                                     (or (unless (zerop (length colspan-attr))
+                                           colspan-attr)
                                          "1")))
+                           (rowspan-attr (cdr-safe (assq 'rowspan attributes)))
                            (rowspan (string-to-int
-                                     (or (cdr-safe (assq 'rowspan attributes))
+                                     (or (unless (zerop (length rowspan-attr))
+                                           rowspan-attr)
                                          "1")))
                            fill-column column-width
                            (fill-prefix "")

commit dd86362358344046f091601d510935dc8c638636
Author: Magnus Henoch <address@hidden>
Date:   Sat Mar 1 20:34:57 2008 +0100

        * lisp/w3-speak-table.el: Modernize backquotes.
    
        * lisp/w3-parse.el: Modernize backquotes.
    
        * lisp/w3-java.el: Modernize backquotes.
    
        * lisp/w3-forms.el: Modernize backquotes.

diff --git a/ChangeLog b/ChangeLog
index 3d98803..9e72aa6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2008-03-01  Magnus Henoch  <address@hidden>
 
+       * lisp/w3-speak-table.el: Modernize backquotes.
+
+       * lisp/w3-parse.el: Modernize backquotes.
+
+       * lisp/w3-java.el: Modernize backquotes.
+
+       * lisp/w3-forms.el: Modernize backquotes.
+
        * lisp/Makefile.in (UTIL_SOURCES): Remove base64.el, md5.el,
        socks.el
 
diff --git a/lisp/w3-forms.el b/lisp/w3-forms.el
index db05cc6..12d4053 100644
--- a/lisp/w3-forms.el
+++ b/lisp/w3-forms.el
@@ -5,8 +5,8 @@
 ;; Keywords: faces, help, comm, data, languages
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 - 1999, 2008 Free Software Foundation, Inc.
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -407,7 +407,7 @@
                           (list 'choice-item
                                 :format "%[%t%]"
                                 :emacspeak-help 'w3-form-summarize-field
-                                :menu-tag-get (` (lambda (zed) (, (car x))))
+                                :menu-tag-get `(lambda (zed) ,(car x))
                                 :tag (truncate-string-to-width (car x)
                                                                size nil ? )
                                 :button-face face
diff --git a/lisp/w3-java.el b/lisp/w3-java.el
index 78ffb28..289a978 100644
--- a/lisp/w3-java.el
+++ b/lisp/w3-java.el
@@ -5,7 +5,7 @@
 ;; Keywords: hypermedia, scripting
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1999 Free Software Foundation, Inc.
+;;; Copyright (c) 1999, 2008 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -76,12 +76,11 @@ Java applet."
          (let ((process-connection-type nil)
                (proc nil))
            (setq proc (eval
-                       (`
-                        (start-process name buffer w3-java-vm-program
-                                       (,@ w3-java-vm-arguments)))))
+                       `(start-process name buffer w3-java-vm-program
+                                       ,@w3-java-vm-arguments)))
            (process-kill-without-query proc)
            proc)
-       (eval (` (funcall w3-java-vm-program
-                         (,@ w3-java-vm-arguments))))))))
+       (eval `(funcall w3-java-vm-program
+                         ,@w3-java-vm-arguments))))))
 
 (provide 'w3-java)
diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index 6bc1b5b..952225a 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -69,15 +69,15 @@ w3-parse-buffer which it is w3-parse-buffer's 
responsibility to
   (defmacro w3-p-s-var-def (var)
     "Declare VAR as a scratch variable which w3-parse-buffer must
 \"let\"-bind."
-    (` (eval-when-compile
-         (defvar (, var))
-         (or (memq '(, var) w3-p-s-var-list)
-             (setq w3-p-s-var-list (cons '(, var) w3-p-s-var-list))))))
+    `(eval-when-compile
+         (defvar ,var)
+         (or (memq ',var w3-p-s-var-list)
+             (setq w3-p-s-var-list (cons ',var w3-p-s-var-list)))))
 
   (defmacro w3-p-s-let-bindings (&rest body)
     "\"let\"-bind all of the variables in w3-p-s-var-list in BODY."
-    (` (let (, w3-p-s-var-list)
-         (,@ body))))
+    `(let ,w3-p-s-var-list
+         ,@body))
   (put 'w3-p-s-let-bindings 'lisp-indent-function 0)
   (put 'w3-p-s-let-bindings 'edebug-form-spec t)
 
@@ -193,15 +193,15 @@ which must be a string to use as the error message."
                         'w3-debug-html))
       (if mandatory-if
           (setq condition
-                (` (or (, mandatory-if)
-                       (, condition)))))
-      (` (if (, condition)
-             (let ((message (progn (,@ body))))
+                `(or ,mandatory-if
+                       ,condition)))
+      `(if ,condition
+             (let ((message (progn ,@body)))
                (if message
                    (w3-debug-html-aux message
-                                      (,@ (if nocontext
+                                      ,@(if nocontext
                                               (list outer nocontext)
-                                            (if outer '(t)))))))))))
+                                            (if outer '(t)))))))))
 
   ;; This is unsatisfactory.
   (put 'w3-debug-html 'lisp-indent-function 0)
@@ -721,11 +721,11 @@ available.  Codes in the range [128,160] are substituted 
using
       (let* ((field (symbol-name (car fields)))
              (get-sym (intern (concat "w3-element-" field)))
              (set-sym (intern (concat "w3-set-element-" field))))
-        (eval (` (progn
-                   (defmacro (, get-sym) (element)
-                     (list 'aref element (, index)))
-                   (defmacro (, set-sym) (element value)
-                     (list 'aset element (, index) value))))))
+        (eval `(progn
+                   (defmacro ,get-sym (element)
+                     (list 'aref element ,index))
+                   (defmacro ,set-sym (element value)
+                     (list 'aset element ,index value)))))
       (setq fields (cdr fields))
       (setq index (1- index))))
 
@@ -734,14 +734,14 @@ available.  Codes in the range [128,160] are substituted 
using
 
   ;; *** move this to be with DTD declaration.
   (defmacro w3-fresh-element-for-tag (tag)
-    (` (copy-sequence
-        (or (get (, tag) 'html-element-info)
+    `(copy-sequence
+        (or (get ,tag 'html-element-info)
             (error "unimplemented element %s"
-                   (w3-sgml-name-to-string (, tag)))))))
+                   (w3-sgml-name-to-string ,tag)))))
 
   ;; *** move this to be with DTD declaration.
   (defmacro w3-known-element-p (tag)
-    (` (get (, tag) 'html-element-info)))
+    `(get ,tag 'html-element-info))
   
   (defsubst w3-sgml-name-to-string (sym)
     (upcase (symbol-name sym)))
diff --git a/lisp/w3-speak-table.el b/lisp/w3-speak-table.el
index 05b2071..1b71378 100644
--- a/lisp/w3-speak-table.el
+++ b/lisp/w3-speak-table.el
@@ -18,10 +18,10 @@
 (defmacro w3-within-cell (cell-info table-info &rest forms)
   "Enables to recursively enter the current cell using `extract-rectangle'
 using CELL-INFO and TABLE-INFO and process FORMS inside it (for instance to 
process subtables)"
-  (` (let* ((cell-row (w3-cell-info-row (, cell-info)))
-           (cell-col (w3-cell-info-column (, cell-info)))
-           (cell-beg (w3-cell-info-start (, cell-info)))
-           (cell-end (w3-cell-info-end (, cell-info)))
+  `(let* ((cell-row (w3-cell-info-row ,cell-info))
+           (cell-col (w3-cell-info-column ,cell-info))
+           (cell-beg (w3-cell-info-start ,cell-info))
+           (cell-end (w3-cell-info-end ,cell-info))
            (cell-contents (extract-rectangle cell-beg cell-end))
            (cell-x (count-lines (save-excursion (goto-char cell-beg) 
(beginning-of-line) (point))
                                 (save-excursion (beginning-of-line) (point))))
@@ -31,11 +31,11 @@ using CELL-INFO and TABLE-INFO and process FORMS inside it 
(for instance to proc
                                    (- (point) cell-beg)))
            cell-table-structure)
        ;; really inside cell ?
-       (when (and (, cell-info)
+       (when (and ,cell-info
                  (>= (point) cell-beg)
                  (<= (point) cell-end))
         ;; find current subtables structure
-        (loop for subtable in (w3-table-info-subtables (, table-info))
+        (loop for subtable in (w3-table-info-subtables ,table-info)
           if (and (= cell-row (car subtable))
                   (= cell-col (cadr subtable)))
           do (setq cell-table-structure (cons (cddr subtable) 
cell-table-structure)))
@@ -54,7 +54,7 @@ using CELL-INFO and TABLE-INFO and process FORMS inside it 
(for instance to proc
           (forward-line cell-x)
           (move-to-column cell-y)
           (setq w3-table-structure (nreverse cell-table-structure))
-          (,@ forms))))))
+          ,@forms))))
 
 (put 'w3-within-cell 'lisp-indent-function 2)
 (put 'w3-within-cell 'edebug-form-spec '(sexp sexp &rest form))
@@ -62,15 +62,15 @@ using CELL-INFO and TABLE-INFO and process FORMS inside it 
(for instance to proc
 (defmacro w3-table-compute-relative-movement (&rest forms)
   "Record a movement done by &rest FORMS (e.g. inside a temporary buffer)
 and return it as (horizontal-offset . vertical-offset)"
-  (` (let ((origin-line-beg (save-excursion (beginning-of-line) (point)))
+  `(let ((origin-line-beg (save-excursion (beginning-of-line) (point)))
           (origin-char-col (current-column)))
-       (,@ forms)
+       ,@forms
        (cons (- (current-column) origin-char-col)
             (let* ((new-line-beg (save-excursion (beginning-of-line) (point)))
                    (line-diff (count-lines new-line-beg origin-line-beg)))
               (if (< new-line-beg origin-line-beg)
                   (- line-diff)
-                line-diff))))))
+                line-diff)))))
 (put 'w3-table-compute-relative-movement 'lisp-indent-function 0)
 (put 'w3-table-compute-relative-movement 'edebug-form-spec '(&rest form))
 
@@ -85,31 +85,31 @@ and return it as (horizontal-offset . vertical-offset)"
 (defmacro w3-table-move-within-cell (at-depth cell-info move-function)
   "Move within a cell (in a temporary buffer) and reflect the same movement
 in the containing table in the original buffer"
-  (` (if (null (, cell-info))
+  `(if (null ,cell-info)
         (error "Not inside a W3 cell")
        (let (table-movement)
-        (w3-within-cell (, cell-info) table-info
+        (w3-within-cell ,cell-info table-info
                         (setq table-movement
                               (w3-table-compute-relative-movement
-                               (funcall (, move-function) (1- at-depth)))))
-        (w3-table-redo-relative-movement table-movement)))))
+                               (funcall ,move-function (1- at-depth)))))
+        (w3-table-redo-relative-movement table-movement))))
 (put 'w3-table-move-within-cell 'lisp-indent-function 2)
 (put 'w3-table-move-within-cell 'edebug-form-spec '(sexp sexp &rest form))
 
 (defmacro w3-table-move-within-subtable (at-depth cell-info move-function)
   "Move within a subtable (in a temporary buffer) and reflect the same movement
 in the containing table in the original buffer"
-  (` (if (null (, cell-info))
+  `(if (null ,cell-info)
         (error "Not inside a W3 cell")
-       (let ((subtable-info (w3-cell-info-current-subtable (, cell-info)))
+       (let ((subtable-info (w3-cell-info-current-subtable ,cell-info))
             table-movement)
         (if (null subtable-info)
             (error "Not inside a W3 table")
-          (w3-within-cell (, cell-info) table-info
+          (w3-within-cell ,cell-info table-info
                           (setq table-movement
                                 (w3-table-compute-relative-movement
-                                 (funcall (, move-function) (1- at-depth) 
subtable-info))))
-          (w3-table-redo-relative-movement table-movement))))))
+                                 (funcall ,move-function (1- at-depth) 
subtable-info))))
+          (w3-table-redo-relative-movement table-movement)))))
 
 (put 'w3-table-move-within-subtable 'lisp-indent-function 2)
 (put 'w3-table-move-within-subtable 'edebug-form-spec '(sexp sexp &rest form))

commit 44d11807ae8fc43253d9e56b6194317950826a36
Author: Magnus Henoch <address@hidden>
Date:   Sat Mar 1 20:09:53 2008 +0100

        * lisp/Makefile.in (UTIL_SOURCES): Remove base64.el, md5.el,
        socks.el
    
        * lisp/base64.el: Remove.  Emacs has this builtin.
    
        * lisp/md5.el: Remove.  Emacs has this builtin.
    
        * lisp/socks.el: Remove.  Emacs already has it.
    
        * lisp/ssl.el: Don't require base64.

diff --git a/ChangeLog b/ChangeLog
index 957e4fa..3d98803 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
 2008-03-01  Magnus Henoch  <address@hidden>
 
+       * lisp/Makefile.in (UTIL_SOURCES): Remove base64.el, md5.el,
+       socks.el
+
+       * lisp/base64.el: Remove.  Emacs has this builtin.
+
+       * lisp/md5.el: Remove.  Emacs has this builtin.
+
+       * lisp/socks.el: Remove.  Emacs already has it.
+
+       * lisp/ssl.el: Don't require base64.
+
        * lisp/url-vars.el: Remove.  Emacs already has it.
 
 2008-02-04  Magnus Henoch  <address@hidden>
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index ff20595..3cd9862 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -54,7 +54,7 @@ W3_SOURCES =                                                  
        \
        w3.el
 
 UTIL_SOURCES =                                                                 
\
-       base64.el devices.el font.el images.el md5.el socks.el ssl.el
+       devices.el font.el images.el ssl.el
 
 AUTO_SOURCES = auto-autoloads.el custom-load.el w3-auto.el w3-cfg.el
 
diff --git a/lisp/base64.el b/lisp/base64.el
deleted file mode 100644
index bbef43e..0000000
--- a/lisp/base64.el
+++ /dev/null
@@ -1,276 +0,0 @@
-;;; base64.el,v --- Base64 encoding functions
-;; Author: Kyle E. Jones
-;; Created: 1997/03/12 14:37:09
-;; Version: 1.6
-;; Keywords: extensions
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (C) 1997 Kyle E. Jones
-;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;; For non-MULE
-(if (not (fboundp 'char-int))
-    (fset 'char-int 'identity))
-
-(defvar base64-alphabet
-  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")
-
-(defvar base64-decoder-program nil
-  "*Non-nil value should be a string that names a MIME base64 decoder.
-The program should expect to read base64 data on its standard
-input and write the converted data to its standard output.")
-
-(defvar base64-decoder-switches nil
-  "*List of command line flags passed to the command named by
-base64-decoder-program.")
-
-(defvar base64-encoder-program nil
-  "*Non-nil value should be a string that names a MIME base64 encoder.
-The program should expect arbitrary data on its standard
-input and write base64 data to its standard output.")
-
-(defvar base64-encoder-switches nil
-  "*List of command line flags passed to the command named by
-base64-encoder-program.")
-
-(defconst base64-alphabet-decoding-alist
-  '(
-    ( ?A . 00) ( ?B . 01) ( ?C . 02) ( ?D . 03) ( ?E . 04) ( ?F . 05)
-    ( ?G . 06) ( ?H . 07) ( ?I . 08) ( ?J . 09) ( ?K . 10) ( ?L . 11)
-    ( ?M . 12) ( ?N . 13) ( ?O . 14) ( ?P . 15) ( ?Q . 16) ( ?R . 17)
-    ( ?S . 18) ( ?T . 19) ( ?U . 20) ( ?V . 21) ( ?W . 22) ( ?X . 23)
-    ( ?Y . 24) ( ?Z . 25) ( ?a . 26) ( ?b . 27) ( ?c . 28) ( ?d . 29)
-    ( ?e . 30) ( ?f . 31) ( ?g . 32) ( ?h . 33) ( ?i . 34) ( ?j . 35)
-    ( ?k . 36) ( ?l . 37) ( ?m . 38) ( ?n . 39) ( ?o . 40) ( ?p . 41)
-    ( ?q . 42) ( ?r . 43) ( ?s . 44) ( ?t . 45) ( ?u . 46) ( ?v . 47)
-    ( ?w . 48) ( ?x . 49) ( ?y . 50) ( ?z . 51) ( ?0 . 52) ( ?1 . 53)
-    ( ?2 . 54) ( ?3 . 55) ( ?4 . 56) ( ?5 . 57) ( ?6 . 58) ( ?7 . 59)
-    ( ?8 . 60) ( ?9 . 61) ( ?+ . 62) ( ?/ . 63)
-   ))
-
-(defvar base64-alphabet-decoding-vector
-  (let ((v (make-vector 123 nil))
-       (p base64-alphabet-decoding-alist))
-    (while p
-      (aset v (car (car p)) (cdr (car p)))
-      (setq p (cdr p)))
-    v))
-
-(defvar base64-binary-coding-system 'binary)
-
-(defun base64-run-command-on-region (start end output-buffer command
-                                          &rest arg-list)
-  (let ((tempfile nil) status errstring default-process-coding-system 
-       (coding-system-for-write base64-binary-coding-system)
-       (coding-system-for-read base64-binary-coding-system))
-    (unwind-protect
-       (progn
-         (setq tempfile (make-temp-name "/tmp/base64"))
-         (setq status
-               (apply 'call-process-region
-                      start end command nil
-                      (list output-buffer tempfile)
-                      nil arg-list))
-         (cond ((equal status 0) t)
-               ((zerop (save-excursion
-                         (set-buffer (find-file-noselect tempfile))
-                         (buffer-size)))
-                t)
-               (t (save-excursion
-                    (set-buffer (find-file-noselect tempfile))
-                    (setq errstring (buffer-string))
-                    (kill-buffer nil)
-                    (cons status errstring)))))
-      (ignore-errors
-       (delete-file tempfile)))))
-
-(if (string-match "XEmacs" emacs-version)
-    (defalias 'base64-insert-char 'insert-char)
-  (defun base64-insert-char (char &optional count ignored buffer)
-    (if (or (null buffer) (eq buffer (current-buffer)))
-       (insert-char char count)
-      (with-current-buffer buffer
-       (insert-char char count))))
-  (setq base64-binary-coding-system 'no-conversion))
-
-(defun base64-decode-region (start end)
-  (interactive "r")
-  ;;(message "Decoding base64...")
-  (let ((work-buffer nil)
-       (done nil)
-       (counter 0)
-       (bits 0)
-       (lim 0) inputpos
-       (non-data-chars (concat "^=" base64-alphabet)))
-    (unwind-protect
-       (save-excursion
-         (setq work-buffer (generate-new-buffer " *base64-work*"))
-         (buffer-disable-undo work-buffer)
-         (if base64-decoder-program
-             (let* ((binary-process-output t) ; any text already has CRLFs
-                    (status (apply 'base64-run-command-on-region
-                                  start end work-buffer
-                                  base64-decoder-program
-                                  base64-decoder-switches)))
-               (if (not (eq status t))
-                   (error "%s" (cdr status))))
-           (goto-char start)
-           (skip-chars-forward non-data-chars end)
-           (while (not done)
-             (setq inputpos (point))
-             (cond
-              ((> (skip-chars-forward base64-alphabet end) 0)
-               (setq lim (point))
-               (while (< inputpos lim)
-                 (setq bits (+ bits
-                               (aref base64-alphabet-decoding-vector
-                                     (char-int (char-after inputpos)))))
-                 (setq counter (1+ counter)
-                       inputpos (1+ inputpos))
-                 (cond ((= counter 4)
-                        (base64-insert-char (lsh bits -16) 1 nil work-buffer)
-                        (base64-insert-char (logand (lsh bits -8) 255) 1 nil
-                                        work-buffer)
-                        (base64-insert-char (logand bits 255) 1 nil
-                                            work-buffer)
-                        (setq bits 0 counter 0))
-                       (t (setq bits (lsh bits 6)))))))
-             (cond
-              ((= (point) end)
-               (if (not (zerop counter))
-                   (error "at least %d bits missing at end of base64 encoding"
-                          (* (- 4 counter) 6)))
-               (setq done t))
-              ((eq (char-after (point)) ?=)
-               (setq done t)
-               (cond ((= counter 1)
-                      (error "at least 2 bits missing at end of base64 
encoding"))
-                     ((= counter 2)
-                      (base64-insert-char (lsh bits -10) 1 nil work-buffer))
-                     ((= counter 3)
-                      (base64-insert-char (lsh bits -16) 1 nil work-buffer)
-                      (base64-insert-char (logand (lsh bits -8) 255)
-                                          1 nil work-buffer))
-                     ((= counter 0) t)))
-              (t (skip-chars-forward non-data-chars end)))))
-         (or (markerp end) (setq end (set-marker (make-marker) end)))
-         (goto-char start)
-         (insert-buffer-substring work-buffer)
-         (delete-region (point) end))
-      (and work-buffer (kill-buffer work-buffer))))
-  ;;(message "Decoding base64... done")
-  )
-
-(defun base64-encode-region (start end &optional no-line-break)
-  (interactive "r")
-  (message "Encoding base64...")
-  (let ((work-buffer nil)
-       (counter 0)
-       (cols 0)
-       (bits 0)
-       (alphabet base64-alphabet)
-       inputpos)
-    (unwind-protect
-       (save-excursion
-         (setq work-buffer (generate-new-buffer " *base64-work*"))
-         (buffer-disable-undo work-buffer)
-         (if base64-encoder-program
-             (let ((status (apply 'base64-run-command-on-region
-                                  start end work-buffer
-                                  base64-encoder-program
-                                  base64-encoder-switches)))
-               (if (not (eq status t))
-                   (error "%s" (cdr status))))
-           (setq inputpos start)
-           (while (< inputpos end)
-             (setq bits (+ bits (char-int (char-after inputpos))))
-             (setq counter (1+ counter))
-             (cond ((= counter 3)
-                    (base64-insert-char (aref alphabet (lsh bits -18)) 1 nil
-                                        work-buffer)
-                    (base64-insert-char
-                     (aref alphabet (logand (lsh bits -12) 63))
-                     1 nil work-buffer)
-                    (base64-insert-char
-                     (aref alphabet (logand (lsh bits -6) 63))
-                     1 nil work-buffer)
-                    (base64-insert-char
-                     (aref alphabet (logand bits 63))
-                     1 nil work-buffer)
-                    (setq cols (+ cols 4))
-                    (cond ((and (= cols 72)
-                                (not no-line-break))
-                           (base64-insert-char ?\n 1 nil work-buffer)
-                           (setq cols 0)))
-                    (setq bits 0 counter 0))
-                   (t (setq bits (lsh bits 8))))
-             (setq inputpos (1+ inputpos)))
-           ;; write out any remaining bits with appropriate padding
-           (if (= counter 0)
-               nil
-             (setq bits (lsh bits (- 16 (* 8 counter))))
-             (base64-insert-char (aref alphabet (lsh bits -18)) 1 nil
-                                 work-buffer)
-             (base64-insert-char (aref alphabet (logand (lsh bits -12) 63))
-                                 1 nil work-buffer)
-             (if (= counter 1)
-                 (base64-insert-char ?= 2 nil work-buffer)
-               (base64-insert-char (aref alphabet (logand (lsh bits -6) 63))
-                                   1 nil work-buffer)
-               (base64-insert-char ?= 1 nil work-buffer)))
-           (if (and (> cols 0)
-                    (not no-line-break))
-               (base64-insert-char ?\n 1 nil work-buffer)))
-         (or (markerp end) (setq end (set-marker (make-marker) end)))
-         (goto-char start)
-         (insert-buffer-substring work-buffer)
-         (delete-region (point) end))
-      (and work-buffer (kill-buffer work-buffer))))
-  (message "Encoding base64... done"))
-
-(defun base64-encode (string)
-  (save-excursion
-    (set-buffer (get-buffer-create " *base64-encode*"))
-    (erase-buffer)
-    (insert string)
-    (base64-encode-region (point-min) (point-max))
-    (skip-chars-backward " \t\r\n")
-    (delete-region (point-max) (point))
-    (prog1
-       (buffer-string)
-      (kill-buffer (current-buffer)))))
-
-(defun base64-decode (string)
-  (save-excursion
-    (set-buffer (get-buffer-create " *base64-decode*"))
-    (erase-buffer)
-    (insert string)
-    (base64-decode-region (point-min) (point-max))
-    (goto-char (point-max))
-    (skip-chars-backward " \t\r\n")
-    (delete-region (point-max) (point))
-    (prog1
-       (buffer-string)
-      (kill-buffer (current-buffer)))))
-
-(fset 'base64-decode-string 'base64-decode)
-(fset 'base64-encode-string 'base64-encode)
-
-(provide 'base64)
diff --git a/lisp/md5.el b/lisp/md5.el
deleted file mode 100644
index b4a64e9..0000000
--- a/lisp/md5.el
+++ /dev/null
@@ -1,406 +0,0 @@
-;;; md5.el -- MD5 Message Digest Algorithm
-;;; Gareth Rees <address@hidden>
-
-;; LCD Archive Entry:
-;; md5|Gareth Rees|address@hidden|
-;; MD5 cryptographic message digest algorithm|
-;; 13-Nov-95|1.0|~/misc/md5.el.Z|
-
-;;; Details: ------------------------------------------------------------------
-
-;; This is a direct translation into Emacs LISP of the reference C
-;; implementation of the MD5 Message-Digest Algorithm written by RSA
-;; Data Security, Inc.
-;; 
-;; The algorithm takes a message (that is, a string of bytes) and
-;; computes a 16-byte checksum or "digest" for the message.  This digest
-;; is supposed to be cryptographically strong in the sense that if you
-;; are given a 16-byte digest D, then there is no easier way to
-;; construct a message whose digest is D than to exhaustively search the
-;; space of messages.  However, the robustness of the algorithm has not
-;; been proven, and a similar algorithm (MD4) was shown to be unsound,
-;; so treat with caution!
-;; 
-;; The C algorithm uses 32-bit integers; because GNU Emacs
-;; implementations provide 28-bit integers (with 24-bit integers on
-;; versions prior to 19.29), the code represents a 32-bit integer as the
-;; cons of two 16-bit integers.  The most significant word is stored in
-;; the car and the least significant in the cdr.  The algorithm requires
-;; at least 17 bits of integer representation in order to represent the
-;; carry from a 16-bit addition.
-
-;;; Usage: --------------------------------------------------------------------
-
-;; To compute the MD5 Message Digest for a message M (represented as a
-;; string or as a vector of bytes), call
-;; 
-;;   (md5-encode M)
-;; 
-;; which returns the message digest as a vector of 16 bytes.  If you
-;; need to supply the message in pieces M1, M2, ... Mn, then call
-;; 
-;;   (md5-init)
-;;   (md5-update M1)
-;;   (md5-update M2)
-;;   ...
-;;   (md5-update Mn)
-;;   (md5-final)
-
-;;; Copyright and licence: ----------------------------------------------------
-
-;; Copyright (C) 1995, 1996, 1997 by Gareth Rees
-;; Derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm
-;; 
-;; md5.el is free software; you can redistribute it and/or modify it
-;; under the terms of the GNU General Public License as published by the
-;; Free Software Foundation; either version 2, or (at your option) any
-;; later version.
-;; 
-;; md5.el is distributed in the hope that it will be useful, but WITHOUT
-;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-;; FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-;; for more details.
-;; 
-;; The original copyright notice is given below, as required by the
-;; licence for the original code.  This code is distributed under *both*
-;; RSA's original licence and the GNU General Public Licence.  (There
-;; should be no problems, as the former is more liberal than the
-;; latter).
-
-;;; Original copyright notice: ------------------------------------------------
-
-;; Copyright (C) 1990, RSA Data Security, Inc. All rights reserved.
-;;
-;; License to copy and use this software is granted provided that it is
-;; identified as the "RSA Data Security, Inc. MD5 Message- Digest
-;; Algorithm" in all material mentioning or referencing this software or
-;; this function.
-;;
-;; License is also granted to make and use derivative works provided
-;; that such works are identified as "derived from the RSA Data
-;; Security, Inc. MD5 Message-Digest Algorithm" in all material
-;; mentioning or referencing the derived work.
-;;
-;; RSA Data Security, Inc. makes no representations concerning either
-;; the merchantability of this software or the suitability of this
-;; software for any particular purpose.  It is provided "as is" without
-;; express or implied warranty of any kind.
-;;
-;; These notices must be retained in any copies of any part of this
-;; documentation and/or software.
-
-;;; Code: ---------------------------------------------------------------------
-
-(defvar md5-program "md5"
-  "*Program that reads a message on its standard input and writes an
-MD5 digest on its output.")
-
-(defvar md5-maximum-internal-length 4096
-  "*The maximum size of a piece of data that should use the MD5 routines
-written in lisp.  If a message exceeds this, it will be run through an
-external filter for processing.  Also see the `md5-program' variable.
-This variable has no effect if you call the md5-init|update|final
-functions - only used by the `md5' function's simpler interface.")
-
-(defvar md5-bits (make-vector 4 0)
-  "Number of bits handled, modulo 2^64.
-Represented as four 16-bit numbers, least significant first.")
-(defvar md5-buffer (make-vector 4 '(0 . 0))
-  "Scratch buffer (four 32-bit integers).")
-(defvar md5-input (make-vector 64 0)
-  "Input buffer (64 bytes).")
-
-(defun md5-unhex (x)
-  (if (> x ?9)
-      (if (>= x ?a)
-         (+ 10 (- x ?a))
-       (+ 10 (- x ?A)))
-    (- x ?0)))
-
-(defun md5-encode (message)
-  "Encodes MESSAGE using the MD5 message digest algorithm.
-MESSAGE must be a string or an array of bytes.
-Returns a vector of 16 bytes containing the message digest."
-  (if (<= (length message) md5-maximum-internal-length)
-      (progn
-       (md5-init)
-       (md5-update message)
-       (md5-final))
-    (save-excursion
-      (set-buffer (get-buffer-create " *md5-work*"))
-      (erase-buffer)
-      (insert message)
-      (call-process-region (point-min) (point-max)
-                          md5-program
-                          t (current-buffer))
-      ;; MD5 digest is 32 chars long
-      ;; mddriver adds a newline to make neaten output for tty
-      ;; viewing, make sure we leave it behind.
-      (let ((data (buffer-substring (point-min) (+ (point-min) 32)))
-           (vec (make-vector 16 0))
-           (ctr 0))
-       (while (< ctr 16)
-         (aset vec ctr (+ (* 16 (md5-unhex (aref data (* ctr 2))))
-                          (md5-unhex (aref data (1+ (* ctr 2))))))
-         (setq ctr (1+ ctr)))))))
-
-(defsubst md5-add (x y)
-  "Return 32-bit sum of 32-bit integers X and Y."
-  (let ((m (+ (car x) (car y)))
-        (l (+ (cdr x) (cdr y))))
-    (cons (logand 65535 (+ m (lsh l -16))) (logand l 65535))))
-
-;; FF, GG, HH and II are basic MD5 functions, providing transformations
-;; for rounds 1, 2, 3 and 4 respectively.  Each function follows this
-;; pattern of computation (where ROTATE(x,y) means rotate 32-bit value x
-;; by y bits to the left):
-;; 
-;;   FF(a,b,c,d,x,s,ac) = ROTATE(a + F(b,c,d) + x + ac,s) + b
-;; 
-;; so we use the macro `md5-make-step' to construct each one.  The
-;; helper functions F, G, H and I operate on 16-bit numbers; the full
-;; operation splits its inputs, operates on the halves separately and
-;; then puts the results together.
-
-(defsubst md5-F (x y z) (logior (logand x y) (logand (lognot x) z)))
-(defsubst md5-G (x y z) (logior (logand x z) (logand y (lognot z))))
-(defsubst md5-H (x y z) (logxor x y z))
-(defsubst md5-I (x y z) (logxor y (logior x (logand 65535 (lognot z)))))
-
-(defmacro md5-make-step (name func)
-  (`
-   (defun (, name) (a b c d x s ac)
-     (let*
-         ((m1 (+ (car a) ((, func) (car b) (car c) (car d)) (car x) (car ac)))
-          (l1 (+ (cdr a) ((, func) (cdr b) (cdr c) (cdr d)) (cdr x) (cdr ac)))
-          (m2 (logand 65535 (+ m1 (lsh l1 -16))))
-          (l2 (logand 65535 l1))
-          (m3 (logand 65535 (if (> s 15)
-                                (+ (lsh m2 (- s 32)) (lsh l2 (- s 16)))
-                              (+ (lsh m2 s) (lsh l2 (- s 16))))))
-          (l3 (logand 65535 (if (> s 15)
-                                (+ (lsh l2 (- s 32)) (lsh m2 (- s 16)))
-                              (+ (lsh l2 s) (lsh m2 (- s 16)))))))
-       (md5-add (cons m3 l3) b)))))
-
-(md5-make-step md5-FF md5-F)
-(md5-make-step md5-GG md5-G)
-(md5-make-step md5-HH md5-H)
-(md5-make-step md5-II md5-I)
-
-(defun md5-init ()
-  "Initialise the state of the message-digest routines."
-  (aset md5-bits 0 0)
-  (aset md5-bits 1 0)
-  (aset md5-bits 2 0)
-  (aset md5-bits 3 0)
-  (aset md5-buffer 0 '(26437 .  8961))
-  (aset md5-buffer 1 '(61389 . 43913))
-  (aset md5-buffer 2 '(39098 . 56574))
-  (aset md5-buffer 3 '( 4146 . 21622)))
-
-(defun md5-update (string)
-  "Update the current MD5 state with STRING (an array of bytes)."
-  (let ((len (length string))
-        (i 0)
-        (j 0))
-    (while (< i len)
-      ;; Compute number of bytes modulo 64
-      (setq j (% (/ (aref md5-bits 0) 8) 64))
-
-      ;; Store this byte (truncating to 8 bits to be sure)
-      (aset md5-input j (logand 255 (aref string i)))
-
-      ;; Update number of bits by 8 (modulo 2^64)
-      (let ((c 8) (k 0))
-        (while (and (> c 0) (< k 4))
-          (let ((b (aref md5-bits k)))
-            (aset md5-bits k (logand 65535 (+ b c)))
-            (setq c (if (> b (- 65535 c)) 1 0)
-                  k (1+ k)))))
-
-      ;; Increment number of bytes processed
-      (setq i (1+ i))
-
-      ;; When 64 bytes accumulated, pack them into sixteen 32-bit
-      ;; integers in the array `in' and then tranform them.
-      (if (= j 63)
-          (let ((in (make-vector 16 (cons 0 0)))
-                (k 0)
-                (kk 0))
-            (while (< k 16)
-              (aset in k (md5-pack md5-input kk))
-              (setq k (+ k 1) kk (+ kk 4)))
-            (md5-transform in))))))
-
-(defun md5-pack (array i)
-  "Pack the four bytes at ARRAY reference I to I+3 into a 32-bit integer."
-  (cons (+ (lsh (aref array (+ i 3)) 8) (aref array (+ i 2)))
-        (+ (lsh (aref array (+ i 1)) 8) (aref array (+ i 0)))))
-
-(defun md5-byte (array n b)
-  "Unpack byte B (0 to 3) from Nth member of ARRAY of 32-bit integers."
-  (let ((e (aref array n)))
-    (cond ((eq b 0) (logand 255 (cdr e)))
-          ((eq b 1) (lsh (cdr e) -8))
-          ((eq b 2) (logand 255 (car e)))
-          ((eq b 3) (lsh (car e) -8)))))
-
-(defun md5-final ()
-  (let ((in (make-vector 16 (cons 0 0)))
-        (j 0)
-        (digest (make-vector 16 0))
-        (padding))
-
-    ;; Save the number of bits in the message
-    (aset in 14 (cons (aref md5-bits 1) (aref md5-bits 0)))
-    (aset in 15 (cons (aref md5-bits 3) (aref md5-bits 2)))
-
-    ;; Compute number of bytes modulo 64
-    (setq j (% (/ (aref md5-bits 0) 8) 64))
-
-    ;; Pad out computation to 56 bytes modulo 64
-    (setq padding (make-vector (if (< j 56) (- 56 j) (- 120 j)) 0))
-    (aset padding 0 128)
-    (md5-update padding)
-
-    ;; Append length in bits and transform
-    (let ((k 0) (kk 0))
-      (while (< k 14)
-        (aset in k (md5-pack md5-input kk))
-        (setq k (+ k 1) kk (+ kk 4))))
-    (md5-transform in)
-
-    ;; Store the results in the digest
-    (let ((k 0) (kk 0))
-      (while (< k 4)
-        (aset digest (+ kk 0) (md5-byte md5-buffer k 0))
-        (aset digest (+ kk 1) (md5-byte md5-buffer k 1))
-        (aset digest (+ kk 2) (md5-byte md5-buffer k 2))
-        (aset digest (+ kk 3) (md5-byte md5-buffer k 3))
-        (setq k (+ k 1) kk (+ kk 4))))
-
-    ;; Return digest
-    digest))
-
-;; It says in the RSA source, "Note that if the Mysterious Constants are
-;; arranged backwards in little-endian order and decrypted with the DES
-;; they produce OCCULT MESSAGES!"  Security through obscurity?
-
-(defun md5-transform (in)
-  "Basic MD5 step. Transform md5-buffer based on array IN."
-  (let ((a (aref md5-buffer 0))
-        (b (aref md5-buffer 1))
-        (c (aref md5-buffer 2))
-        (d (aref md5-buffer 3)))
-    (setq
-     a (md5-FF a b c d (aref in  0)  7 '(55146 . 42104))
-     d (md5-FF d a b c (aref in  1) 12 '(59591 . 46934))
-     c (md5-FF c d a b (aref in  2) 17 '( 9248 . 28891))
-     b (md5-FF b c d a (aref in  3) 22 '(49597 . 52974))
-     a (md5-FF a b c d (aref in  4)  7 '(62844 .  4015))
-     d (md5-FF d a b c (aref in  5) 12 '(18311 . 50730))
-     c (md5-FF c d a b (aref in  6) 17 '(43056 . 17939))
-     b (md5-FF b c d a (aref in  7) 22 '(64838 . 38145))
-     a (md5-FF a b c d (aref in  8)  7 '(27008 . 39128))
-     d (md5-FF d a b c (aref in  9) 12 '(35652 . 63407))
-     c (md5-FF c d a b (aref in 10) 17 '(65535 . 23473))
-     b (md5-FF b c d a (aref in 11) 22 '(35164 . 55230))
-     a (md5-FF a b c d (aref in 12)  7 '(27536 .  4386))
-     d (md5-FF d a b c (aref in 13) 12 '(64920 . 29075))
-     c (md5-FF c d a b (aref in 14) 17 '(42617 . 17294))
-     b (md5-FF b c d a (aref in 15) 22 '(18868 .  2081))
-     a (md5-GG a b c d (aref in  1)  5 '(63006 .  9570))
-     d (md5-GG d a b c (aref in  6)  9 '(49216 . 45888))
-     c (md5-GG c d a b (aref in 11) 14 '( 9822 . 23121))
-     b (md5-GG b c d a (aref in  0) 20 '(59830 . 51114))
-     a (md5-GG a b c d (aref in  5)  5 '(54831 .  4189))
-     d (md5-GG d a b c (aref in 10)  9 '(  580 .  5203))
-     c (md5-GG c d a b (aref in 15) 14 '(55457 . 59009))
-     b (md5-GG b c d a (aref in  4) 20 '(59347 . 64456))
-     a (md5-GG a b c d (aref in  9)  5 '( 8673 . 52710))
-     d (md5-GG d a b c (aref in 14)  9 '(49975 .  2006))
-     c (md5-GG c d a b (aref in  3) 14 '(62677 .  3463))
-     b (md5-GG b c d a (aref in  8) 20 '(17754 .  5357))
-     a (md5-GG a b c d (aref in 13)  5 '(43491 . 59653))
-     d (md5-GG d a b c (aref in  2)  9 '(64751 . 41976))
-     c (md5-GG c d a b (aref in  7) 14 '(26479 .   729))
-     b (md5-GG b c d a (aref in 12) 20 '(36138 . 19594))
-     a (md5-HH a b c d (aref in  5)  4 '(65530 . 14658))
-     d (md5-HH d a b c (aref in  8) 11 '(34673 . 63105))
-     c (md5-HH c d a b (aref in 11) 16 '(28061 . 24866))
-     b (md5-HH b c d a (aref in 14) 23 '(64997 . 14348))
-     a (md5-HH a b c d (aref in  1)  4 '(42174 . 59972))
-     d (md5-HH d a b c (aref in  4) 11 '(19422 . 53161))
-     c (md5-HH c d a b (aref in  7) 16 '(63163 . 19296))
-     b (md5-HH b c d a (aref in 10) 23 '(48831 . 48240))
-     a (md5-HH a b c d (aref in 13)  4 '(10395 . 32454))
-     d (md5-HH d a b c (aref in  0) 11 '(60065 . 10234))
-     c (md5-HH c d a b (aref in  3) 16 '(54511 . 12421))
-     b (md5-HH b c d a (aref in  6) 23 '( 1160 .  7429))
-     a (md5-HH a b c d (aref in  9)  4 '(55764 . 53305))
-     d (md5-HH d a b c (aref in 12) 11 '(59099 . 39397))
-     c (md5-HH c d a b (aref in 15) 16 '( 8098 . 31992))
-     b (md5-HH b c d a (aref in  2) 23 '(50348 . 22117))
-     a (md5-II a b c d (aref in  0)  6 '(62505 .  8772))
-     d (md5-II d a b c (aref in  7) 10 '(17194 . 65431))
-     c (md5-II c d a b (aref in 14) 15 '(43924 .  9127))
-     b (md5-II b c d a (aref in  5) 21 '(64659 . 41017))
-     a (md5-II a b c d (aref in 12)  6 '(25947 . 22979))
-     d (md5-II d a b c (aref in  3) 10 '(36620 . 52370))
-     c (md5-II c d a b (aref in 10) 15 '(65519 . 62589))
-     b (md5-II b c d a (aref in  1) 21 '(34180 . 24017))
-     a (md5-II a b c d (aref in  8)  6 '(28584 . 32335))
-     d (md5-II d a b c (aref in 15) 10 '(65068 . 59104))
-     c (md5-II c d a b (aref in  6) 15 '(41729 . 17172))
-     b (md5-II b c d a (aref in 13) 21 '(19976 .  4513))
-     a (md5-II a b c d (aref in  4)  6 '(63315 . 32386))
-     d (md5-II d a b c (aref in 11) 10 '(48442 . 62005))
-     c (md5-II c d a b (aref in  2) 15 '(10967 . 53947))
-     b (md5-II b c d a (aref in  9) 21 '(60294 . 54161)))
-
-     (aset md5-buffer 0 (md5-add (aref md5-buffer 0) a))
-     (aset md5-buffer 1 (md5-add (aref md5-buffer 1) b))
-     (aset md5-buffer 2 (md5-add (aref md5-buffer 2) c))
-     (aset md5-buffer 3 (md5-add (aref md5-buffer 3) d))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Here begins the merger with the XEmacs API and the md5.el from the URL
-;;; package.  Courtesy address@hidden
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun md5 (object &optional start end)
-  "Return the MD5 (a secure message digest algorithm) of an object.
-OBJECT is either a string or a buffer.
-Optional arguments START and END denote buffer positions for computing the
-hash of a portion of OBJECT."
- (let ((buffer nil))
-    (unwind-protect
-       (save-excursion
-         (setq buffer (generate-new-buffer " *md5-work*"))
-         (set-buffer buffer)
-         (cond
-          ((bufferp object)
-           (insert-buffer-substring object start end))
-          ((stringp object)
-           (insert (if (or start end)
-                       (substring object start end)
-                     object)))
-          (t nil))
-         (prog1
-             (if (<= (point-max) md5-maximum-internal-length)
-                 (mapconcat
-                  (function (lambda (node) (format "%02x" node)))
-                  (md5-encode (buffer-string))
-                  "")
-               (call-process-region (point-min) (point-max)
-                                    shell-file-name
-                                    t buffer nil
-                                    shell-command-switch md5-program)
-               ;; MD5 digest is 32 chars long
-               ;; mddriver adds a newline to make neaten output for tty
-               ;; viewing, make sure we leave it behind.
-               (buffer-substring (point-min) (+ (point-min) 32)))
-           (kill-buffer buffer)))
-      (and buffer (buffer-name buffer) (kill-buffer buffer) nil))))
-
-(provide 'md5)
diff --git a/lisp/socks.el b/lisp/socks.el
deleted file mode 100644
index 692ed8a..0000000
--- a/lisp/socks.el
+++ /dev/null
@@ -1,654 +0,0 @@
-;;; socks.el --- A Socks v5 Client for Emacs
-;; Author: $Author: fx $
-;; Created: $Date: 2002/01/22 18:58:43 $
-;; Version: $Revision: 1.7 $
-;; Keywords: comm, firewalls
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996 - 1998 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996, 97, 98, 1999, 2000 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to
-;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; This is an implementation of the SOCKS v5 protocol as defined in
-;;; RFC 1928.
-;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;; TODO
-;; - Finish the redirection rules stuff
-;; - Implement composition of servers.  Recursively evaluate the
-;;   redirection rules and do SOCKS-over-HTTP and SOCKS-in-SOCKS
-
-(eval-when-compile
-  (require 'cl)
-  (require 'wid-edit))
-(require 'custom)
-
-;; For non-XEmacs-MULE
-(if (fboundp 'char-int)
-    (defalias 'socks-char-int 'char-int)
-  (defalias 'socks-char-int 'identity))
-
-(if (not (fboundp 'split-string))
-    (defun split-string (string &optional pattern)
-      "Return a list of substrings of STRING which are separated by PATTERN.
-If PATTERN is omitted, it defaults to \"[ \\f\\t\\n\\r\\v]+\"."
-      (or pattern
-         (setq pattern "[ \f\t\n\r\v]+"))
-      (let (parts (start 0))
-       (while (string-match pattern string start)
-         (setq parts (cons (substring string start (match-beginning 0)) parts)
-               start (match-end 0)))
-       (nreverse (cons (substring string start) parts)))))
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Custom widgets
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(define-widget 'dynamic-choice 'menu-choice
-  "A pretty simple dynamic dropdown list"
-  :format "%[%t%]: %v"
-  :tag "Network"
-  :case-fold t
-  :void '(item :format "invalid (%t)\n")
-  :value-create 's5-widget-value-create
-  :value-delete 'widget-children-value-delete
-  :value-get 'widget-choice-value-get
-  :value-inline 'widget-choice-value-inline
-  :mouse-down-action 'widget-choice-mouse-down-action
-  :action 'widget-choice-action
-  :error "Make a choice"
-  :validate 'widget-choice-validate
-  :match 's5-dynamic-choice-match
-  :match-inline 's5-dynamic-choice-match-inline)
-
-(defun s5-dynamic-choice-match (widget value)
-  (let ((choices (funcall (widget-get widget :choice-function)))
-       current found)
-    (while (and choices (not found))
-      (setq current (car choices)
-           choices (cdr choices)
-           found (widget-apply current :match value)))
-    found))
-
-(defun s5-dynamic-choice-match-inline (widget value)
-  (let ((choices (funcall (widget-get widget :choice-function)))
-       current found)
-    (while (and choices (not found))
-      (setq current (car choices)
-           choices (cdr choices)
-           found (widget-match-inline current value)))
-    found))
-
-(defun s5-widget-value-create (widget)
-  (let ((choices (funcall (widget-get widget :choice-function)))
-       (value (widget-get widget :value)))
-    (if (not value)
-       (widget-put widget :value (widget-value (car choices))))
-    (widget-put widget :args choices)
-    (widget-choice-value-create widget)))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Customization support
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defgroup socks nil
-  "SOCKS Support"
-  :prefix "socks-"
-  :group 'processes)
-
-'(defcustom socks-server-aliases nil
-  "A list of server aliases for use in access control and filtering rules."
-  :group 'socks
-  :type '(repeat (list :format "%v"
-                      :value ("" "" 1080 5)
-                      (string :tag "Alias")
-                      (string :tag "Hostname/IP Address")
-                      (integer :tag "Port #")
-                      (choice :tag "SOCKS Version"
-                              (integer :tag "SOCKS v4" :value 4)
-                              (integer :tag "SOCKS v5" :value 5)))))
-
-'(defcustom socks-network-aliases
-  '(("Anywhere" (netmask "0.0.0.0" "0.0.0.0")))
-  "A list of network aliases for use in subsequent rules."
-  :group 'socks
-  :type '(repeat (list :format "%v"
-                      :value (netmask "" "255.255.255.0")
-                      (string :tag "Alias")
-                      (radio-button-choice
-                       :format "%v"
-                       (list :tag  "IP address range"
-                             (const :format "" :value range)
-                             (string :tag "From")
-                             (string :tag "To"))
-                       (list :tag  "IP address/netmask"
-                             (const :format "" :value netmask)
-                             (string :tag "IP Address")
-                             (string :tag "Netmask"))
-                       (list :tag  "Domain Name"
-                             (const :format "" :value domain)
-                             (string :tag "Domain name"))
-                       (list :tag  "Unique hostname/IP address"
-                             (const :format "" :value exact)
-                             (string :tag "Hostname/IP Address"))))))
-
-'(defun s5-servers-filter ()
-  (if socks-server-aliases
-      (mapcar (lambda (x) (list 'const :tag (car x) :value (car x))) 
s5-server-aliases)
-    '((const :tag "No aliases defined" :value nil))))
-
-'(defun s5-network-aliases-filter ()
-  (mapcar (lambda (x) (list 'const :tag (car x) :value (car x)))
-         socks-network-aliases))
-
-'(defcustom socks-redirection-rules
-   nil
-   "A list of redirection rules."
-   :group 'socks
-   :type '(repeat (list :format "%v"
-                       :value ("Anywhere" nil)
-                       (dynamic-choice :choice-function 
s5-network-aliases-filter
-                                       :tag "Destination network")
-                       (radio-button-choice
-                        :tag "Connection type"
-                        (const :tag "Direct connection" :value nil)
-                        (dynamic-choice :format "%t: %[%v%]"
-                                        :choice-function s5-servers-filter
-                                        :tag "Proxy chain via")))))
-
-(defcustom socks-server
-  (list "Default server" "socks" 1080 5)
-  ""
-  :group 'socks
-  :type '(list
-         (string :format "" :value "Default server")
-         (string :tag "Server")
-         (integer :tag "Port")
-         (radio-button-choice :tag "SOCKS Version"
-                              :format "%t: %v"
-                              (const :tag "SOCKS v4  " :format "%t" :value 4)
-                              (const :tag "SOCKS v5"   :format "%t" :value 
5))))
-  
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Get down to the nitty gritty
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defconst socks-version 5)
-(defvar socks-debug nil)
-
-;; Common socks v5 commands
-(defconst socks-connect-command 1)
-(defconst socks-bind-command 2)
-(defconst socks-udp-associate-command 3)
-
-;; Miscellaneous other socks constants
-(defconst socks-authentication-null 0)
-(defconst socks-authentication-failure 255)
-
-;; Response codes
-(defconst socks-response-success               0)
-(defconst socks-response-general-failure       1)
-(defconst socks-response-access-denied         2)
-(defconst socks-response-network-unreachable   3)
-(defconst socks-response-host-unreachable      4)
-(defconst socks-response-connection-refused    5)
-(defconst socks-response-ttl-expired           6)
-(defconst socks-response-cmd-not-supported     7)
-(defconst socks-response-address-not-supported 8)
-
-(defvar socks-errors
-  '("Succeeded"
-    "General SOCKS server failure"
-    "Connection not allowed by ruleset"
-    "Network unreachable"
-    "Host unreachable"
-    "Connection refused"
-    "Time-to-live expired"
-    "Command not supported"
-    "Address type not supported"))
-
-;; The socks v5 address types
-(defconst socks-address-type-v4   1)
-(defconst socks-address-type-name 3)
-(defconst socks-address-type-v6   4)
-
-;; Base variables
-(defvar socks-timeout 5)
-(defvar socks-connections (make-hash-table :size 13))
-
-;; Miscellaneous stuff for authentication
-(defvar socks-authentication-methods nil)
-(defvar socks-username (user-login-name))
-(defvar socks-password nil)
-
-(defun socks-register-authentication-method (id desc callback)
-  (let ((old (assq id socks-authentication-methods)))
-    (if old
-       (setcdr old (cons desc callback))
-      (setq socks-authentication-methods
-           (cons (cons id (cons desc callback))
-                 socks-authentication-methods)))))
-
-(defun socks-unregister-authentication-method (id)
-  (let ((old (assq id socks-authentication-methods)))
-    (if old
-       (setq socks-authentication-methods
-             (delq old socks-authentication-methods)))))
-
-(socks-register-authentication-method 0 "No authentication" 'identity)
-
-(defun socks-build-auth-list ()
-  (let ((num 0)
-       (retval ""))
-    (mapcar
-     (function
-      (lambda (x)
-       (if (fboundp (cdr (cdr x)))
-           (setq retval (format "%s%c" retval (car x))
-                 num (1+ num)))))
-     (reverse socks-authentication-methods))
-    (format "%c%s" num retval)))
-
-(defconst socks-state-waiting-for-auth 0)
-(defconst socks-state-submethod-negotiation 1)
-(defconst socks-state-authenticated 2)
-(defconst socks-state-waiting 3)
-(defconst socks-state-connected 4)
-
-(defmacro socks-wait-for-state-change (proc htable cur-state)
-  (`
-   (while (and (= (gethash 'state (, htable)) (, cur-state))
-              (memq (process-status (, proc)) '(run open)))
-     (accept-process-output (, proc) socks-timeout))))
-
-(defun socks-filter (proc string)
-  (let ((info (gethash proc socks-connections))
-       state desired-len)
-    (or info (error "socks-filter called on non-SOCKS connection %S" proc))
-    (setq state (gethash 'state info))
-    (cond
-     ((= state socks-state-waiting-for-auth)
-      (puthash 'scratch (concat string (gethash 'scratch info)) info)
-      (setq string (gethash 'scratch info))
-      (if (< (length string) 2)
-         nil                           ; We need to spin some more
-       (puthash 'authtype (socks-char-int (aref string 1)) info)
-       (puthash 'scratch (substring string 2 nil) info)
-       (puthash 'state socks-state-submethod-negotiation info)))
-     ((= state socks-state-submethod-negotiation)
-      )
-     ((= state socks-state-authenticated)
-      )
-     ((= state socks-state-waiting)
-      (puthash 'scratch (concat string (gethash 'scratch info)) info)
-      (setq string (gethash 'scratch info))
-      (case (gethash 'server-protocol info)
-       (http
-        (if (not (string-match "\r\n\r\n" string))
-            nil                        ; Need to spin some more
-          (debug)
-          (puthash 'state socks-state-connected info)
-          (puthash 'reply 0 info)
-          (puthash 'response string info)))
-       (4
-        (if (< (length string) 2)
-            nil                        ; Can't know how much to read yet
-          (setq desired-len
-                (+ 4 ; address length
-                   2 ; port
-                   2 ; initial data
-                   ))
-          (if (< (length string) desired-len)
-              nil                      ; need to spin some more
-            (let ((response (socks-char-int (aref string 1))))
-              (if (= response 90)
-                  (setq response 0))
-              (puthash 'state socks-state-connected info)
-              (puthash 'reply response info)
-              (puthash 'response string info)))))
-       (5
-        (if (< (length string) 4)
-            nil
-          (setq desired-len
-                (+ 6                   ; Standard socks header
-                   (cond
-                    ((= (socks-char-int (aref string 3)) 
socks-address-type-v4) 4)
-                    ((= (socks-char-int (aref string 3)) 
socks-address-type-v6) 16)
-                    ((= (socks-char-int (aref string 3)) 
socks-address-type-name)
-                     (if (< (length string) 5)
-                         255
-                       (+ 1 (socks-char-int (aref string 4))))))))
-          (if (< (length string) desired-len)
-              nil                      ; Need to spin some more
-            (puthash 'state socks-state-connected info)
-            (puthash 'reply (socks-char-int (aref string 1)) info)
-            (puthash 'response string info))))))
-     ((= state socks-state-connected)
-      )
-     )
-    )
-  )
-
-(defun socks-open-connection (server-info)
-  (interactive)
-  (save-excursion
-    (let ((proc (socks-original-open-network-stream "socks"
-                                                   nil
-                                                   (nth 1 server-info)
-                                                   (nth 2 server-info)))
-         (info (make-hash-table :size 13))
-         (authtype nil))
-      
-      ;; Initialize process and info about the process
-      (set-process-filter proc 'socks-filter)
-      (process-kill-without-query proc)
-      (puthash proc info socks-connections)
-      (puthash 'state socks-state-waiting-for-auth info)
-      (puthash 'authtype socks-authentication-failure info)
-      (puthash 'server-protocol (nth 3 server-info) info)
-      (puthash 'server-name (nth 1 server-info) info)
-      (case (nth 3 server-info)
-       (http
-        ;; Don't really have to do any connection setup under http
-        nil)
-       (4
-        ;; Don't really have to do any connection setup under v4
-        nil)
-       (5
-        ;; Need to handle all the authentication crap under v5
-        ;; Send what we think we can handle for authentication types
-        (process-send-string proc (format "%c%s" socks-version
-                                          (socks-build-auth-list)))
-
-        ;; Basically just do a select() until we change states.
-        (socks-wait-for-state-change proc info socks-state-waiting-for-auth)
-        (setq authtype (gethash 'authtype info))
-        (cond
-         ((= authtype socks-authentication-null)
-          (and socks-debug (message "No authentication necessary")))
-         ((= authtype socks-authentication-failure)
-          (error "No acceptable authentication methods found."))
-         (t
-          (let* ((auth-type (gethash 'authtype info))
-                 (auth-handler (assoc auth-type socks-authentication-methods))
-                 (auth-func (and auth-handler (cdr (cdr auth-handler))))
-                 (auth-desc (and auth-handler (car (cdr auth-handler)))))
-            (set-process-filter proc nil)
-            (if (and auth-func (fboundp auth-func)
-                     (funcall auth-func proc))
-                nil                    ; We succeeded!
-              (delete-process proc)
-              (error "Failed to use auth method: %s (%d)"
-                     (or auth-desc "Unknown") auth-type))
-            )
-          )
-         )
-        (puthash 'state socks-state-authenticated info)
-        (set-process-filter proc 'socks-filter)))
-      proc)))
-
-(defun socks-send-command (proc command atype address port)
-  (let ((addr (cond
-              ((or (= atype socks-address-type-v4)
-                   (= atype socks-address-type-v6))
-               address)
-              ((= atype socks-address-type-name)
-               (format "%c%s" (length address) address))
-              (t
-               (error "Unkown address type: %d" atype))))
-       (info (gethash proc socks-connections))
-       request version)
-    (or info (error "socks-send-command called on non-SOCKS connection %S"
-                   proc))
-    (puthash 'state socks-state-waiting info)
-    (setq version (gethash 'server-protocol info))
-    (case version
-      (http
-       (setq request (format (eval-when-compile
-                              (concat
-                               "CONNECT %s:%d HTTP/1.0\r\n"
-                               "User-Agent: Emacs/SOCKS v1.0\r\n"
-                               "\r\n"))
-                            (case atype
-                              (socks-address-type-name address)
-                              (otherwise
-                               (error "Unsupported address type for HTTP: %d" 
atype)))
-                            port)))
-      (4
-       (setq request (format
-                     "%c%c%c%c%s%s%c"
-                     version           ; version
-                     command           ; command
-                     (lsh port -8)     ; port, high byte
-                     (- port (lsh (lsh port -8) 8)) ; port, low byte
-                     addr              ; address
-                     (user-full-name)  ; username
-                     0                 ; terminate username
-                     )))
-      (5
-       (setq request (format 
-                     "%c%c%c%c%s%c%c"
-                     version           ; version 
-                     command           ; command
-                     0                 ; reserved
-                     atype             ; address type
-                     addr              ; address
-                     (lsh port -8)     ; port, high byte
-                     (- port (lsh (lsh port -8) 8)) ; port, low byte
-                     )))
-      (otherwise
-       (error "Unknown protocol version: %d" version)))
-    (process-send-string proc request)
-    (socks-wait-for-state-change proc info socks-state-waiting)
-    (process-status proc)
-    (if (= (or (gethash 'reply info) 1) socks-response-success)
-       nil                             ; Sweet sweet success!
-      (delete-process proc)
-      (error "SOCKS: %s" (nth (or (gethash 'reply info) 1) socks-errors)))
-    proc))
-
-
-;; Replacement functions for open-network-stream, etc.
-(defvar socks-noproxy nil
-  "*List of regexps matching hosts that we should not socksify connections to")
-
-(defun socks-find-route (host service)
-  (let ((route socks-server)
-       (noproxy socks-noproxy))
-    (while noproxy
-      (if (eq ?! (aref (car noproxy) 0))
-         (if (string-match (substring (car noproxy) 1) host)
-             (setq noproxy nil))
-       (if (string-match (car noproxy) host)
-           (setq route nil
-                 noproxy nil)))
-      (setq noproxy (cdr noproxy)))
-    route))
-
-(defvar socks-override-functions nil
-  "*Whether to overwrite the open-network-stream function with the SOCKSified
-version.")
-
-(if (fboundp 'socks-original-open-network-stream)
-    nil                                        ; Do nothing, we've been here 
already
-  (defalias 'socks-original-open-network-stream
-       (symbol-function 'open-network-stream))
-  (if socks-override-functions
-      (defalias 'open-network-stream 'socks-open-network-stream)))
-
-(defvar socks-services-file "/etc/services")
-(defvar socks-tcp-services (make-hash-table :size 13 :test 'equal))
-(defvar socks-udp-services (make-hash-table :size 13 :test 'equal))
-
-(defun socks-parse-services ()
-  (if (not (and (file-exists-p socks-services-file)
-               (file-readable-p socks-services-file)))
-      (error "Could not find services file: %s" socks-services-file))
-  (save-excursion
-    (clrhash socks-tcp-services)
-    (clrhash socks-udp-services)
-    (set-buffer (get-buffer-create " *socks-tmp*"))
-    (erase-buffer)
-    (insert-file-contents socks-services-file)
-    ;; Nuke comments
-    (goto-char (point-min))
-    (while (re-search-forward "#.*" nil t)
-      (replace-match ""))
-    ;; Nuke empty lines
-    (goto-char (point-min))
-    (while (re-search-forward "^[ \t\n]+" nil t)
-      (replace-match ""))
-    ;; Now find all the lines
-    (goto-char (point-min))
-    (let (name port type)
-      (while (re-search-forward "^\\([^ \t]+\\)[ \t]+\\([0-9]+\\)/\\([a-z]+\\)"
-                               nil t)
-       (setq name (downcase (match-string 1))
-             port (string-to-int (match-string 2))
-             type (downcase (match-string 3)))
-       (puthash name port (if (equal type "udp")
-                              socks-udp-services
-                            socks-tcp-services))))))
-
-(defun socks-find-services-entry (service &optional udp)
-  "Return the port # associated with SERVICE"
-  (if (= (hash-table-count socks-tcp-services) 0)
-      (socks-parse-services))
-  (gethash (downcase service)
-             (if udp socks-udp-services socks-tcp-services)))
-
-(defun socks-open-network-stream (name buffer host service)
-  (let* ((route (socks-find-route host service))
-        proc info version atype)
-    (if (not route)
-       (socks-original-open-network-stream name buffer host service)
-      (setq proc (socks-open-connection route)
-           info (gethash proc socks-connections)
-           version (gethash 'server-protocol info))
-      (case version
-       (4
-        (setq host (socks-nslookup-host host))
-        (if (not (listp host))
-            (error "Could not get IP address for: %s" host))
-        (setq host (apply 'format "%c%c%c%c" host))
-        (setq atype socks-address-type-v4))
-       (otherwise
-        (setq atype socks-address-type-name)))
-      (socks-send-command proc
-                         socks-connect-command
-                         atype
-                         host
-                         (if (stringp service)
-                             (socks-find-services-entry service)
-                           service))
-      (puthash 'buffer buffer info)
-      (puthash 'host host info)
-      (puthash 'service host info)
-      (set-process-filter proc nil)
-      (set-process-buffer proc (if buffer (get-buffer-create buffer)))
-      proc)))
-
-;; Authentication modules go here
-
-;; Basic username/password authentication, ala RFC 1929
-(socks-register-authentication-method 2 "Username/Password"
-                                     'socks-username/password-auth)
-
-(defconst socks-username/password-auth-version 1)
-
-(defun socks-username/password-auth-filter (proc str)
-  (let ((info (gethash proc socks-connections))
-       state desired-len)
-    (or info (error "socks-filter called on non-SOCKS connection %S" proc))
-    (setq state (gethash 'state info))
-    (puthash 'scratch (concat (gethash 'scratch info) str) info)
-    (if (< (length (gethash 'scratch info)) 2)
-       nil
-      (puthash 'password-auth-status (socks-char-int
-                                        (aref (gethash 'scratch info) 1))
-                 info)
-      (puthash 'state socks-state-authenticated info))))
-
-(defun socks-username/password-auth (proc)
-  (let* ((info (gethash proc socks-connections))
-        (state (gethash 'state info)))
-    (if (not socks-password)
-       (setq socks-password (read-passwd
-                             (format "Password for address@hidden: "
-                                     socks-username
-                                     (gethash 'server-name info)))))
-    (puthash 'scratch "" info)
-    (set-process-filter proc 'socks-username/password-auth-filter)
-    (process-send-string proc
-                        (format "%c%c%s%c%s"
-                                socks-username/password-auth-version
-                                (length socks-username)
-                                socks-username
-                                (length socks-password)
-                                socks-password))
-    (socks-wait-for-state-change proc info state)
-    (= (gethash 'password-auth-status info) 0)))
-
-
-;; More advanced GSS/API stuff, not yet implemented - volunteers?
-;; (socks-register-authentication-method 1 "GSS/API" 'socks-gssapi-auth)
-
-(defun socks-gssapi-auth (proc)
-  nil)
-
-
-;; CHAP stuff
-;; (socks-register-authentication-method 3 "CHAP" 'socks-chap-auth)
-(defun socks-chap-auth (proc)
-  nil)
-
-
-;; CRAM stuff
-;; (socks-register-authentication-method 5 "CRAM" 'socks-cram-auth)
-(defun socks-cram-auth (proc)
-  nil)
-
-
-(defcustom socks-nslookup-program "nslookup"
-  "*If non-NIL then a string naming the nslookup program."
-  :type '(choice (const :tag "None" :value nil) string)
-  :group 'socks)
-
-(defun socks-nslookup-host (host)
-  "Attempt to resolve the given HOSTNAME using nslookup if possible."
-  (interactive "sHost:  ")
-  (if socks-nslookup-program
-      (let ((proc (start-process " *nslookup*" " *nslookup*"
-                                socks-nslookup-program host))
-           (res host))
-       (process-kill-without-query proc)
-       (save-excursion
-         (set-buffer (process-buffer proc))
-         (while (progn
-                  (accept-process-output proc)
-                  (memq (process-status proc) '(run open))))
-         (goto-char (point-min))
-         (if (re-search-forward "Name:.*\nAddress\\(es\\)?: *\\([0-9.]+\\)$" 
nil t)
-             (progn
-               (setq res (buffer-substring (match-beginning 2)
-                                           (match-end 2))
-                     res (mapcar 'string-to-int (split-string res "\\.")))))
-         (kill-buffer (current-buffer)))
-       res)
-    host))
-
-(provide 'socks)
diff --git a/lisp/ssl.el b/lisp/ssl.el
index 1e4f78d..67e2f75 100644
--- a/lisp/ssl.el
+++ b/lisp/ssl.el
@@ -4,8 +4,8 @@
 ;; Keywords: comm
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996, 97, 98, 99, 2001, 2008 Free Software Foundation, Inc.
 ;;; Copyright (c) 1995, 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996, 97, 98, 99, 2001 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -26,7 +26,6 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (eval-when-compile (require 'cl))
-(require 'base64)
 (require 'url)                         ; for `url-configuration-directory'
 
 (defgroup ssl nil

commit 5f6be6d1bb44a1dfc3215b47dd6eb09d359652a1
Author: Magnus Henoch <address@hidden>
Date:   Sat Mar 1 19:55:32 2008 +0100

    lisp/url-vars.el: Remove.  Emacs already has it.

diff --git a/ChangeLog b/ChangeLog
index 605b609..957e4fa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2008-03-01  Magnus Henoch  <address@hidden>
+
+       * lisp/url-vars.el: Remove.  Emacs already has it.
+
 2008-02-04  Magnus Henoch  <address@hidden>
 
        * lisp/font.el (font-x-font-regexp-foundry-and-family): Add from
diff --git a/lisp/url-vars.el b/lisp/url-vars.el
deleted file mode 100644
index 70e12de..0000000
--- a/lisp/url-vars.el
+++ /dev/null
@@ -1,612 +0,0 @@
-;;; url-vars.el --- Variables for Uniform Resource Locator tool
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:35:58 $
-;; Version: $Revision: 1.4 $
-;; Keywords: comm, data, processes, hypermedia
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(eval-and-compile
-  (condition-case ()
-      (require 'custom)
-    (error nil))
-  (if (and (featurep 'custom) (fboundp 'custom-declare-variable))
-      nil ;; We've got what we needed
-    ;; We have the old custom-library, hack around it!
-    (defmacro defgroup (&rest args)
-      nil)
-    (defmacro defcustom (var value doc &rest args) 
-      (` (defvar (, var) (, value) (, doc))))))
-
-(defconst url-version (let ((x "$State: p4.0pre.47 $"))
-                       (if (string-match "State: \\([^ \t\n]+\\)" x)
-                           (substring x (match-beginning 1) (match-end 1))
-                         x))
-  "Version # of URL package.")
-
-(defgroup url nil
-  "Uniform Resource Locator tool"
-  :group 'hypermedia)
-
-(defgroup url-file nil
-  "URL storage"
-  :prefix "url-"
-  :group 'url)
-
-(defgroup url-cache nil
-  "URL cache"
-  :prefix "url-"
-  :prefix "url-cache-"
-  :group 'url)
-
-(defgroup url-history nil
-  "History variables in the URL package"
-  :prefix "url-"
-  :group 'url)
-
-(defgroup url-cookie nil
-  "URL cookies"
-  :prefix "url-"
-  :prefix "url-cookie-"
-  :group 'url)
-
-(defgroup url-mime nil
-  "MIME options of URL"
-  :prefix "url-"
-  :group 'url)
-
-(defgroup url-hairy nil
-  "Hairy options of URL"
-  :prefix "url-"
-  :group 'url)
-
-
-(defvar url-current-can-be-cached t
-  "*Whether the current URL can be cached.")
-
-(defvar url-current-object nil
-  "A parsed representation of the current url")
-
-(defvar url-current-callback-func nil
-  "*The callback function for the current buffer.")
-
-(defvar url-current-callback-data nil
-  "*The data to be passed to the callback function.  This should be a list,
-each item in the list will be an argument to the url-current-callback-func.")
-
-(mapcar 'make-variable-buffer-local '(
-                                     url-current-callback-data
-                                     url-current-callback-func
-                                     url-current-can-be-cached
-                                     url-current-content-length
-                                     url-current-isindex
-                                     url-current-mime-encoding
-                                     url-current-mime-headers
-                                     url-current-mime-type
-                                     url-current-mime-charset
-                                     url-current-mime-viewer
-                                     url-current-object
-                                     url-current-referer
-
-                                     ;; obsolete
-                                     ;; url-current-file
-                                     ;; url-current-port
-                                     ;; url-current-server
-                                     ;; url-current-type
-                                     ;; url-current-user
-                                     ))
-
-(defvar url-cookie-storage nil         "Where cookies are stored.")
-(defvar url-cookie-secure-storage nil  "Where secure cookies are stored.")
-(defcustom url-cookie-file nil            "*Where cookies are stored on disk."
-  :type '(choice (const :tag "Default" :value nil) file)
-  :group 'url-file
-  :group 'url-cookie)
-
-(defcustom url-default-retrieval-proc 'url-default-callback
-  "*The default action to take when an asynchronous retrieval completes."
-  :type 'function
-  :group 'url-hairy)
-
-(defcustom url-honor-refresh-requests t
-  "*Whether to do automatic page reloads at the request of the document
-author or the server via the `Refresh' header in an HTTP/1.0 response.
-If nil, no refresh requests will be honored.
-If t, all refresh requests will be honored.
-If non-nil and not t, the user will be asked for each refresh request."
-  :type '(choice (const :tag "off" nil)
-                (const :tag "on" t)
-                (const :tag "ask" 'ask))
-  :group 'url-hairy)
-
-(defcustom url-inhibit-mime-parsing nil
-  "Whether to parse out (and delete) the MIME headers from a message."
-  :type 'boolean
-  :group 'url-mime)
-
-(defcustom url-automatic-caching nil
-  "*If non-nil, all documents will be automatically cached to the local
-disk."
-  :type 'boolean
-  :group 'url-cache)
-
-(defcustom url-cache-expired
-  (function (lambda (t1 t2) (>= (- (car t2) (car t1)) 5)))
-  "*A function (`funcall'able) that takes two times as its arguments, and
-returns non-nil if the second time is 'too old' when compared to the first
-time."
-  :type 'function
-  :group 'url-cache)
-
-(defvar url-bug-address "address@hidden"
-  "Where to send bug reports.")
-
-(defcustom url-cookie-confirmation nil
-  "*If non-nil, confirmation by the user is required to accept HTTP cookies."
-  :type 'boolean
-  :group 'url-cookie)
-
-(defcustom url-personal-mail-address nil
-  "*Your full email address.
-This is what is sent to HTTP/1.0 servers as the FROM field in an HTTP/1.0
-request."
-  :type '(choice (const nil) string)
-  :group 'url)
-
-(defcustom url-directory-index-file "index.html"
-  "*The filename to look for when indexing a directory.
-If this file exists, and is readable, then it will be viewed instead of
-using `dired' to view the directory."
-  :type 'string
-  :group 'url-file)
-
-(defcustom url-privacy-level '(email)
-  "*How private you want your requests to be.
-HTTP/1.0 has header fields for various information about the user, including
-operating system information, email addresses, the last page you visited, etc.
-This variable controls how much of this information is sent.
-
-This should a symbol or a list.
-Valid values if a symbol are:
-none     -- Send all information
-low      -- Don't send the last location
-high     -- Don't send the email address or last location
-paranoid -- Don't send anything
-
-If a list, this should be a list of symbols of what NOT to send.
-Valid symbols are:
-email    -- the email address
-os       -- the operating system info
-lastloc  -- the last location
-agent    -- Do not send the User-Agent string
-cookie   -- never accept HTTP cookies
-
-Samples:
-
- (setq url-privacy-level 'high)
- (setq url-privacy-level '(email lastloc))    ;; equivalent to 'high
- (setq url-privacy-level '(os))
-
-::NOTE::
-This variable controls several other variables and is _NOT_ automatically
-updated.  Call the function `url-setup-privacy-info' after modifying this
-variable."
-  :type '(radio (const :tag "None (you believe in the basic goodness of 
humanity)"
-                      :value none)
-               (const :tag "Low (do not reveal last location)"
-                      :value low)
-               (const :tag "High (no email address or last location)"
-                      :value high)
-               (const :tag "Paranoid (reveal nothing!)"
-                      :value paranoid)
-               (checklist :tag "Custom"
-                          (const :tag "Email address" :value email)
-                          (const :tag "Operating system" :value os)
-                          (const :tag "Last location" :value lastloc)
-                          (const :tag "Browser identification" :value agent)
-                          (const :tag "No cookies" :value cookie)))
-  :group 'url)
-
-(defvar url-history-list nil "List of urls visited this session.")
-
-(defvar url-inhibit-uncompression nil "Do not do decompression if non-nil.")
-
-(defcustom url-keep-history nil
-  "*Controls whether to keep a list of all the URLS being visited.
-If non-nil, url will keep track of all the URLS visited.
-If eq to `t', then the list is saved to disk at the end of each emacs
-session."
-  :type 'boolean
-  :group 'url-history)
-
-(defcustom url-uncompressor-alist '((".z"  . "x-gzip")
-                                   (".gz" . "x-gzip")
-                                   (".uue" . "x-uuencoded")
-                                   (".hqx" . "x-hqx")
-                                   (".Z"  . "x-compress"))
-  "*An assoc list of file extensions and the appropriate
-content-transfer-encodings for each."
-  :type '(repeat (cons :format "%v"
-                      (string :tag "Extension")
-                      (string :tag "Encoding")))
-  :group 'url-mime)
-
-(defcustom url-mail-command 'url-mail
-  "*This function will be called whenever url needs to send mail.
-It should enter a mail-mode-like buffer in the current window.
-The commands mail-to and mail-subject should still work in this
-buffer, and it should use mail-header-separator if possible."
-  :type 'function
-  :group 'url)
-
-(defcustom url-proxy-services nil
-  "*An assoc list of access types and servers that gateway them.
-Looks like ((\"http\" . \"hostname:portnumber\") ....)  This is set up
-from the ACCESS_proxy environment variables in url-do-setup."
-  :type '(repeat (cons :format "%v"
-                      (string :tag "Protocol")
-                      (string :tag "Proxy")))
-  :group 'url)
-
-(defcustom url-global-history-file nil
-  "*The global history file used by both Mosaic/X and the url package.
-This file contains a list of all the URLs you have visited.  This file
-is parsed at startup and used to provide URL completion."
-  :type '(choice (const :tag "Default" :value nil) file)
-  :group 'url-history)
-
-(defcustom url-global-history-save-interval 3600
-  "*The number of seconds between automatic saves of the history list.
-Default is 1 hour.  Note that if you change this variable outside of
-the `customize' interface after `url-do-setup' has been run, you need
-to run the `url-setup-save-timer' function manually."
-  :set (function (lambda (var val)
-                  (set-default var val)
-                  (and (featurep 'url)
-                       (fboundp 'url-setup-save-timer)
-                       (url-setup-save-timer))))
-  :type 'integer
-  :group 'url-history)
-
-(defvar url-global-history-timer nil)
-
-(defcustom url-passwd-entry-func nil
-  "*This is a symbol indicating which function to call to read in a
-password.  It will be set up depending on whether you are running EFS
-or ange-ftp at startup if it is nil.  This function should accept the
-prompt string as its first argument, and the default value as its
-second argument."
-  :type '(choice (const :tag "Guess" :value nil)
-                (const :tag "Use Ange-FTP" :value ange-ftp-read-passwd)
-                (const :tag "Use EFS"      :value efs-read-passwd)
-                (const :tag "Use Password Package" :value read-passwd)
-                (function :tag "Other"))
-  :group 'url-hairy)
-
-(defcustom url-gopher-labels
-  '(("0" . "(TXT)")
-    ("1" . "(DIR)")
-    ("2" . "(CSO)")
-    ("3" . "(ERR)")
-    ("4" . "(MAC)")
-    ("5" . "(PCB)")
-    ("6" . "(UUX)")
-    ("7" . "(???)")
-    ("8" . "(TEL)")
-    ("T" . "(TN3)")
-    ("9" . "(BIN)")
-    ("g" . "(GIF)")
-    ("I" . "(IMG)")
-    ("h" . "(WWW)")
-    ("s" . "(SND)"))
-  "*An assoc list of gopher types and how to describe them in the gopher
-menus.  These can be any string, but HTML/HTML+ entities should be
-used when necessary, or it could disrupt formatting of the document
-later on.  It is also a good idea to make sure all the strings are the
-same length after entity references are removed, on a strictly
-stylistic level."
-  :type '(repeat (cons (string :tag "Type")
-                      (string :tag "Description")))
-  :group 'url-hairy)
-
-(defcustom url-gopher-icons
-  '(
-    ("0" . "&text.document;")
-    ("1" . "&folder;")
-    ("2" . "&index;")
-    ("3" . "&stop;")
-    ("4" . "&binhex.document;")
-    ("5" . "&binhex.document;")
-    ("6" . "&uuencoded.document;")
-    ("7" . "&index;")
-    ("8" . "&telnet;")
-    ("T" . "&tn3270;")
-    ("9" . "&binary.document;")
-    ("g" . "&image;")
-    ("I" . "&image;")
-    ("s" . "&audio;"))
-  "*An assoc list of gopher types and the graphic entity references to
-show when possible."
-  :type '(repeat (cons (string :tag "Type")
-                      (string :tag "Icon")))
-  :group 'url-hairy)
-
-(defcustom url-standalone-mode nil "*Rely solely on the cache?"
-  :type 'boolean
-  :group 'url-cache)
-(defcustom url-multiple-p t
-  "*If non-nil, multiple queries are possible through ` *URL-<i>*' buffers"
-  :type 'boolean
-  :group 'url-hairy)
-(defvar url-default-working-buffer " *URL*" " The default buffer to do all of 
the processing in.")
-(defvar url-working-buffer url-default-working-buffer
-  "The buffer to do all of the processing in.
-It defaults to `url-default-working-buffer' and is bound to *URL-<i>*
-buffers when used for multiple requests, cf. `url-multiple-p'")
-(defvar url-current-referer nil "Referer of this page.")
-(defvar url-current-content-length nil "Current content length.")
-(defvar url-current-isindex nil "Is the current document a searchable index?")
-(defvar url-current-mime-encoding nil "MIME encoding of current document.")
-(defvar url-current-mime-headers nil "An alist of MIME headers.")
-(defvar url-current-mime-type nil "MIME type of current document.")
-(defvar url-current-mime-charset nil "MIME charset of current document.")
-(defvar url-current-mime-viewer nil "How to view the current MIME doc.")
-(defvar url-current-passwd-count 0 "How many times password has failed.")
-(defvar url-gopher-types "0123456789+gIThws:;<"
-  "A string containing character representations of all the gopher types.")
-(defvar url-mime-separator-chars (mapcar 'identity
-                                       (concat "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-                                               "abcdefghijklmnopqrstuvwxyz"
-                                               "0123456789'()+_,-./=?"))
-  "Characters allowable in a MIME multipart separator.")
-
-(defcustom url-bad-port-list
-  '("25" "119" "19")
-  "*List of ports to warn the user about connecting to.  Defaults to just
-the mail, chargen, and NNTP ports so you cannot be tricked into sending
-fake mail or forging messages by a malicious HTML document."
-  :type '(repeat (string :tag "Port"))
-  :group 'url-hairy)
-
-(defcustom url-be-anal-about-file-attributes nil
-  "*Whether to use HTTP/1.0 to figure out file attributes
-or just guess based on file extension, etc."
-  :type 'boolean
-  :group 'url-mime)
-
-(defcustom url-be-asynchronous nil
-  "*Controls whether document retrievals over HTTP should be done in
-the background.  This allows you to keep working in other windows
-while large downloads occur."
-  :type 'boolean
-  :group 'url)
-(make-variable-buffer-local 'url-be-asynchronous)
-
-(defvar url-mime-content-type-charset-regexp
-  ";[ \t]*charset=\"?\\([^\"]+\\)\"?"
-  "Regexp used in parsing `Content-Type' for a charset indication")
-
-(defvar url-request-data nil "Any data to send with the next request.")
-
-(defvar url-request-extra-headers nil
-  "A list of extra headers to send with the next request.  Should be
-an assoc list of headers/contents.")
-
-(defvar url-request-method nil "The method to use for the next request.")
-
-(defvar url-mime-encoding-string nil
-  "*String to send to the server in the Accept-encoding: field in HTTP/1.0
-requests.  This is created automatically from mm-content-transfer-encodings.")
-
-(defcustom url-mime-language-string nil
-  "*String to send to the server in the Accept-language: field in
-HTTP/1.0 requests."
-  :type '(radio
-         (const :tag "None (get default language version)" :value nil)
-         (const :tag "Any (get first available language version)" :value "*")
-         (string :tag "Other"))
-  :group 'url-mime
-  :group 'i18n)
-
-(defvar url-mime-accept-string nil
-  "String to send to the server in the Accept: field in HTTP/1.0 requests.
-This is created automatically from url-mime-viewers, after the mailcap file
-has been parsed.")
-
-(defvar url-history-changed-since-last-save nil
-  "Whether the history list has changed since the last save operation.")
-
-(defvar url-cookies-changed-since-last-save nil
-  "Whether the cookies list has changed since the last save operation.")
-
-(defvar url-proxy-basic-authentication nil
-  "Internal structure - do not modify!")
-  
-(defvar url-registered-protocols nil
-  "Internal structure - do not modify!  See `url-register-protocol'")
-
-(defvar url-package-version "Unknown" "Version # of package using URL.")
-
-(defvar url-package-name "Unknown" "Version # of package using URL.")
-
-(defvar url-system-type nil "What type of system we are on.")
-(defvar url-os-type nil "What OS we are on.")
-
-(defcustom url-max-password-attempts 5
-  "*Maximum number of times a password will be prompted for when a
-protected document is denied by the server."
-  :type 'integer
-  :group 'url)
-
-(defcustom url-temporary-directory (or (getenv "TMPDIR") "/tmp")
-  "*Where temporary files go."
-  :type 'directory
-  :group 'url-file)
-
-(defcustom url-show-status t
-  "*Whether to show a running total of bytes transferred.  Can cause a
-large hit if using a remote X display over a slow link, or a terminal
-with a slow modem."
-  :type 'boolean
-  :group 'url)
-
-(defvar url-using-proxy nil
-  "Either nil or the fully qualified proxy URL in use, e.g.
-http://www.domain.com/";)
-
-(defcustom url-news-server nil
-  "*The default news server to get newsgroups/articles from if no server
-is specified in the URL.  Defaults to the environment variable NNTPSERVER
-or \"news\" if NNTPSERVER is undefined."
-  :type '(choice (const :tag "None" :value nil) string)
-  :group 'url)
-
-(defcustom url-gopher-to-mime
-  '((?0 . "text/plain")                        ; It's a file
-    (?1 . "www/gopher")                        ; Gopher directory
-    (?2 . "www/gopher-cso-search")     ; CSO search
-    (?3 . "text/plain")                        ; Error
-    (?4 . "application/mac-binhex40")  ; Binhexed macintosh file
-    (?5 . "application/pc-binhex40")   ; DOS binary archive of some sort
-    (?6 . "archive/x-uuencode")                ; Unix uuencoded file
-    (?7 . "www/gopher-search")         ; Gopher search!
-    (?9 . "application/octet-stream")  ; Binary file!
-    (?g . "image/gif")                 ; Gif file
-    (?I . "image/gif")                 ; Some sort of image
-    (?h . "text/html")                 ; HTML source
-    (?s . "audio/basic")               ; Sound file
-    )
-  "*An assoc list of gopher types and their corresponding MIME types."
-  :type '(repeat (cons sexp string))
-  :group 'url-hairy)
-
-(defcustom url-use-hypertext-gopher t
-  "*Controls how gopher documents are retrieved.
-If non-nil, the gopher pages will be converted into HTML and parsed
-just like any other page.  If nil, the requests will be passed off to
-the gopher.el package by Scott Snyder.  Using the gopher.el package
-will lose the gopher+ support, and inlined searching."
-  :type 'boolean
-  :group 'url)
-
-(defvar url-global-history-hash-table nil
-  "Hash table for global history completion.")
-
-(defvar url-nonrelative-link
-  "^\\([-a-zA-Z0-9+.]+:\\)"
-  "A regular expression that will match an absolute URL.")
-
-(defcustom url-confirmation-func 'y-or-n-p
-  "*What function to use for asking yes or no functions.  Possible
-values are 'yes-or-no-p or 'y-or-n-p, or any function that takes a
-single argument (the prompt), and returns t only if a positive answer
-is gotten."
-  :type '(choice (const :tag "Short (y or n)" :value y-or-n-p)
-                (const :tag "Long (yes or no)" :value yes-or-no-p)
-                (function :tag "Other"))
-  :group 'url-hairy)
-
-(defcustom url-gateway-method 'native
-  "*The type of gateway support to use.
-Should be a symbol specifying how we are to get a connection off of the
-local machine.
-
-Currently supported methods:
-'telnet        :: Run telnet in a subprocess to connect
-'rlogin         :: Rlogin to another machine to connect
-'socks          :: Connects through a socks server
-'ssl            :: Connection should be made with SSL
-'tcp            :: Use the excellent tcp.el package from gnus.
-                   This simply does a (require 'tcp), then sets
-                   url-gateway-method to be 'native.
-'native                :: Use the native open-network-stream in emacs
-"
-  :type '(radio (const :tag "Telnet to gateway host" :value telnet)
-               (const :tag "Rlogin to gateway host" :value rlogin)
-               (const :tag "Use SOCKS proxy" :value socks)
-               (const :tag "Use SSL for all connections" :value ssl)
-               (const :tag "Use the `tcp' package" :value tcp)
-               (const :tag "Direct connection" :value native))
-  :group 'url-hairy)
-
-(defvar url-running-xemacs (string-match "XEmacs" emacs-version)
-  "*Got XEmacs?")
-
-(defvar url-default-ports '(("http"   .  "80")
-                           ("gopher" .  "70")
-                           ("telnet" .  "23")
-                           ("news"   . "119")
-                           ("https"  . "443")
-                           ("shttp"  .  "80"))
-  "An assoc list of protocols and default port #s")
-
-(defvar url-setup-done nil "*Has setup configuration been done?")
-
-(defvar url-source nil
-  "*Whether to force a sourcing of the next buffer.  This forces local
-files to be read into a buffer, no matter what.  Gets around the
-optimization that if you are passing it to a viewer, just make a
-symbolic link, which looses if you want the source for inlined
-images/etc.")
-
-(defconst weekday-alist
-  '(("Sunday" . 0) ("Monday" . 1) ("Tuesday" . 2) ("Wednesday" . 3)
-    ("Thursday" . 4) ("Friday" . 5) ("Saturday" . 6)
-    ("Tues" . 2) ("Thurs" . 4)
-    ("Sun" . 0) ("Mon" . 1) ("Tue" . 2) ("Wed" . 3)
-    ("Thu" . 4) ("Fri" . 5) ("Sat" . 6)))
-
-(defconst monthabbrev-alist
-  '(("Jan" . 1) ("Feb" . 2) ("Mar" . 3) ("Apr" . 4) ("May" . 5) ("Jun" . 6)
-    ("Jul" . 7) ("Aug" . 8) ("Sep" . 9) ("Oct" . 10) ("Nov" . 11) ("Dec" . 12))
-  )
-
-(defvar url-lazy-message-time 0)
-
-(defvar url-extensions-header "Security/Digest Security/SSL")
-
-(defvar url-mailserver-syntax-table
-  (copy-syntax-table emacs-lisp-mode-syntax-table)
-  "*A syntax table for parsing the mailserver URL")
-
-(modify-syntax-entry ?' "\"" url-mailserver-syntax-table)
-(modify-syntax-entry ?` "\"" url-mailserver-syntax-table)
-(modify-syntax-entry ?< "(>" url-mailserver-syntax-table)
-(modify-syntax-entry ?> ")<" url-mailserver-syntax-table)
-(modify-syntax-entry ?/ " " url-mailserver-syntax-table)
-
-(defvar url-handle-no-scheme-hook nil
-  "*Hooks to be run until one can successfully transform an incomplete URL.
-
-Each hook is called with a single argument URL and should return a tranformed
-url with a valid scheme (e.g., \"gnu\" --> \"http://www.gnu.org/\";), or nil
-otherwise.")
-
-(defvar url-load-hook nil
-  "*Hooks to be run after initalizing the URL library.")
-
-;;; Make OS/2 happy - yeeks
-(defvar        tcp-binary-process-input-services nil
-  "*Make OS/2 happy with our CRLF pairs...")
-
-(provide 'url-vars)

commit 1c703f81416b849db5a49d6647c84dc8466e9b00
Author: Magnus Henoch <address@hidden>
Date:   Mon Feb 4 06:29:13 2008 +0000

    2008-02-04  Magnus Henoch  <address@hidden>
    
        * lisp/font.el (font-x-font-regexp-foundry-and-family): Add from
        last version of w3-sysdp.
        (x-font-create-object): Use it instead of
        x-font-regexp-foundry-and-family.

diff --git a/ChangeLog b/ChangeLog
index 21a065c..605b609 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2008-02-04  Magnus Henoch  <address@hidden>
 
+       * lisp/font.el (font-x-font-regexp-foundry-and-family): Add from
+       last version of w3-sysdp.
+       (x-font-create-object): Use it instead of
+       x-font-regexp-foundry-and-family.
+
        * lisp/Makefile.in (EXTRAS): Remove w3-sysdp.el.
        (W3_SOURCES): Add w3-compat.el.
 
diff --git a/lisp/font.el b/lisp/font.el
index 6f5481d..08df0b1 100644
--- a/lisp/font.el
+++ b/lisp/font.el
@@ -2,7 +2,7 @@
 
 ;; Author: wmperry
 ;; Maintainer: Bill Perry <address@hidden>
-;; Created: $Date: 2006/12/15 14:40:54 $
+;; Created: $Date: 2008/02/04 06:29:13 $
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1995, 1996 by William M. Perry <address@hidden>
@@ -448,6 +448,13 @@ These are for use in the `weight' field of an X font 
string.")
           registry - encoding "\\'"
           ))))
 
+(defvar font-x-font-regexp-foundry-and-family
+  (let ((-             "[-?]")
+       (foundry                "[^-]+")
+       (family                 "[^-]+")
+       )
+    (concat "\\`[-?*]" foundry - "\\(" family "\\)" -)))
+
 (defvar font-x-registry-and-encoding-regexp
   (or (and (featurep 'xemacs)
           (boundp 'x-font-regexp-registry-and-encoding)
@@ -506,7 +513,7 @@ These are for use in the `weight' field of an X font 
string.")
            (retval nil)
            (case-fold-search t)
            )
-       (if (not (string-match x-font-regexp-foundry-and-family fontname))
+       (if (not (string-match font-x-font-regexp-foundry-and-family fontname))
            nil
          (setq family (list (downcase (match-string 1 fontname)))))
        (if (string= "*" weight)  (setq weight  nil))

commit 1051911b55844bf6dbe62eb1917492e7fc9ae35a
Author: Magnus Henoch <address@hidden>
Date:   Mon Feb 4 06:12:39 2008 +0000

    2008-02-04  Magnus Henoch  <address@hidden>
    
        * lisp/Makefile.in (EXTRAS): Remove w3-sysdp.el.
        (W3_SOURCES): Add w3-compat.el.

diff --git a/ChangeLog b/ChangeLog
index a994b6f..21a065c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-02-04  Magnus Henoch  <address@hidden>
+
+       * lisp/Makefile.in (EXTRAS): Remove w3-sysdp.el.
+       (W3_SOURCES): Add w3-compat.el.
+
 2007-12-09  Magnus Henoch  <address@hidden>
 
        * lisp/w3-compat.el (w3-url-file-nondirectory): Fix thinko: alias
@@ -439,7 +444,7 @@
 2001-05-31  Dave Love  <address@hidden>
 
        * lisp/w3-menu.el (w3-menu-file-menu): Fix
-       "---:shadowDoubleEtchedIn".  From Pavel Janík.
+       "---:shadowDoubleEtchedIn".  From Pavel Janík.
 
        * lisp/w3-parse.el (decode-char): Define with older Mule-UCS.
        (w3-expand-entity-at-point-maybe): Sanitize regexp for numeric
@@ -489,7 +494,7 @@
        to work around a byte-optimizer bug in Emacs 21 that caused this
        module to fail to byte-compile.
 
-2001-05-24  Pavel Janík <address@hidden>
+2001-05-24  Pavel Janík <address@hidden>
 
        * lisp/w3-display.el (w3-resurrect-hyperlinks): Look for next
        single property change from `st' instead of `nd' to avoid
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index beffe31..ff20595 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -26,6 +26,7 @@ W3_SOURCES =                                                  
        \
        css.el                                                          \
        url-hotlist.el                                                  \
        w3-cfg.el                                                       \
+       w3-compat.el                                                    \
        w3-cus.el                                                       \
        w3-dired.el                                                     \
        w3-display.el                                                   \
@@ -68,7 +69,7 @@ ALLSOURCES = $(W3_SOURCES) $(UTIL_SOURCES) $(AUTO_SOURCES)
 ALLOBJECTS = $(W3_OBJECTS) $(UTIL_OBJECTS) $(AUTO_OBJECTS)
 
 # Warning!  Currently, the following file can _NOT_ be bytecompiled.
-EXTRAS = w3-sysdp.el docomp.el
+EXTRAS = docomp.el
 
 .SUFFIXES: .elc .el
 

commit fa8480fca0e318695ebbe89d5b7dab3b3dad7af9
Author: Magnus Henoch <address@hidden>
Date:   Sun Dec 9 22:21:17 2007 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 5a22993..a994b6f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-12-09  Magnus Henoch  <address@hidden>
+
+       * lisp/w3-compat.el (w3-url-file-nondirectory): Fix thinko: alias
+       to url-file-nondirectory, not url-file-directory.
+
 2007-11-16  Magnus Henoch  <address@hidden>
 
        * lisp/w3-compat.el (w3-alist-to-plist): Define.

commit 79795b17b83c2a99c391c1d0c6b052b9936a723e
Author: Magnus Henoch <address@hidden>
Date:   Sun Dec 9 22:21:04 2007 +0000

    (w3-url-file-nondirectory): Fix thinko: alias to url-file-nondirectory, not 
url-file-directory.

diff --git a/lisp/w3-compat.el b/lisp/w3-compat.el
index 422d430..1d75aa9 100644
--- a/lisp/w3-compat.el
+++ b/lisp/w3-compat.el
@@ -34,7 +34,7 @@
 ;; `url-file-nondirectory' post Emacs 22.
 (cond
  ((fboundp 'url-file-nondirectory)
-  (defalias 'w3-url-file-nondirectory 'url-file-directory))
+  (defalias 'w3-url-file-nondirectory 'url-file-nondirectory))
  ((fboundp 'url-basepath)
   (defsubst w3-url-file-nondirectory (file)
     "Return the directory part of FILE, for a URL."

commit 8a44a180b2cb855117442fe62bf24e835d59fecd
Author: Magnus Henoch <address@hidden>
Date:   Fri Nov 16 12:26:55 2007 +0000

    2007-11-16  Magnus Henoch  <address@hidden>
    
        * lisp/w3-compat.el (w3-alist-to-plist): Define.
    
        * lisp/w3-display.el (w3-parse-link)
        (w3-display-normalize-form-info, w3-display-node): Use
        w3-alist-to-plist instead of alist-to-plist.

diff --git a/ChangeLog b/ChangeLog
index d7bad85..5a22993 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-11-16  Magnus Henoch  <address@hidden>
+
+       * lisp/w3-compat.el (w3-alist-to-plist): Define.
+
+       * lisp/w3-display.el (w3-parse-link)
+       (w3-display-normalize-form-info, w3-display-node): Use
+       w3-alist-to-plist instead of alist-to-plist.
+
 2007-11-15  Magnus Henoch  <address@hidden>
 
        * lisp/w3-display.el: Use w3-url-file-nondirectory instead of
diff --git a/lisp/w3-compat.el b/lisp/w3-compat.el
index 2153a15..422d430 100644
--- a/lisp/w3-compat.el
+++ b/lisp/w3-compat.el
@@ -42,5 +42,29 @@
  (t
   (error "Couldn't define `w3-url-file-nondirectory'")))
 
+;; `alist-to-plist' is only in XEmacs, it seems.
+(cond
+ ((fboundp 'alist-to-plist)
+  (defalias 'w3-alist-to-plist 'alist-to-plist))
+ (t
+  ;; Stolen from Gnus, `mm-alist-to-plist'
+  (defun w3-alist-to-plist (alist)
+  "Convert association list ALIST into the equivalent property-list form.
+The plist is returned.  This converts from
+
+\((a . 1) (b . 2) (c . 3))
+
+into
+
+\(a 1 b 2 c 3)
+
+The original alist is not modified.  See also `destructive-alist-to-plist'."
+  (let (plist)
+    (while alist
+      (let ((el (car alist)))
+       (setq plist (cons (cdr el) (cons (car el) plist))))
+      (setq alist (cdr alist)))
+    (nreverse plist)))))
+
 (provide 'w3-compat)
 ;;; w3-compat.el ends here
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index dc991ef..97c5b3c 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.50 $
+;; Version: $Revision: 1.51 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -749,7 +749,7 @@ If the face already exists, it is unmodified."
         (desc (w3-get-attribute type))
         (dc-desc (and desc (downcase desc))) ; canonical case
         (dest (w3-get-attribute 'href))
-        (plist (alist-to-plist args))
+        (plist (w3-alist-to-plist args))
         (node-1 (assq type w3-current-links))
         (node-2 (and node-1 desc (or (assoc desc
                                             (cdr node-1))
@@ -1942,7 +1942,7 @@ Can sometimes make the structure of a document clearer")
     color))
 
 (defun w3-display-normalize-form-info (args)
-  (let* ((plist (alist-to-plist args))
+  (let* ((plist (w3-alist-to-plist args))
         (type (intern (downcase
                        (or (plist-get plist 'type) "text"))))
         (name (plist-get plist 'name))
@@ -2643,7 +2643,7 @@ Format: (((image-alt row column) . offset) ...)")
             (w3-handle-empty-tag)
             )
            (style
-            (w3-handle-style (alist-to-plist
+            (w3-handle-style (w3-alist-to-plist
                               (cons (cons 'data (apply 'concat (nth 2 node)))
                                     (nth 1 node))))
             (w3-handle-empty-tag))

commit 509bae663efb816e503b6cdd32bd5491196f8d57
Author: Magnus Henoch <address@hidden>
Date:   Thu Nov 15 12:59:53 2007 +0000

    * lisp/w3-display.el: Use w3-url-file-nondirectory instead of
    url-basepath (in many places).
    
    * lisp/w3.el: Require w3-compat.
    (w3-download-url): Use w3-url-file-nondirectory instead of
    url-basepath.
    
    * lisp/w3-compat.el: New file.
    (w3-url-file-nondirectory): New function.

diff --git a/ChangeLog b/ChangeLog
index 3fb9ffe..d7bad85 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2007-11-15  Magnus Henoch  <address@hidden>
 
+       * lisp/w3-display.el: Use w3-url-file-nondirectory instead of
+       url-basepath (in many places).
+
+       * lisp/w3.el: Require w3-compat.
+       (w3-download-url): Use w3-url-file-nondirectory instead of
+       url-basepath.
+
+       * lisp/w3-compat.el: New file.
+       (w3-url-file-nondirectory): New function.
+
        * lisp/images.el: Don't require w3-sysdp.
 
        * lisp/css.el: Ditto.
diff --git a/lisp/w3-compat.el b/lisp/w3-compat.el
new file mode 100644
index 0000000..2153a15
--- /dev/null
+++ b/lisp/w3-compat.el
@@ -0,0 +1,46 @@
+;;; w3-compat.el --- Compatibility stubs
+
+;; Copyright (C) 2007  Free Software Foundation, Inc.
+
+;; Author: Magnus Henoch <address@hidden>
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file defines aliases or stub functions starting with `w3-', to
+;; compensate for the possible nonexistence of needed functions.  The
+;; prefix is used to avoid polluting the namespace and confusing other
+;; packages.
+
+;; Currently no attempt is made to support anything before Emacs 22.
+
+;;; Code:
+
+;; `url-basepath' was morphed into `url-file-directory' and
+;; `url-file-nondirectory' post Emacs 22.
+(cond
+ ((fboundp 'url-file-nondirectory)
+  (defalias 'w3-url-file-nondirectory 'url-file-directory))
+ ((fboundp 'url-basepath)
+  (defsubst w3-url-file-nondirectory (file)
+    "Return the directory part of FILE, for a URL."
+    (url-basepath file t)))
+ (t
+  (error "Couldn't define `w3-url-file-nondirectory'")))
+
+(provide 'w3-compat)
+;;; w3-compat.el ends here
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index da29f46..dc991ef 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.49 $
+;; Version: $Revision: 1.50 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -805,7 +805,7 @@ If the face already exists, it is unmodified."
          (eq (device-type) 'tty))      ; Why bother?
       (w3-add-delayed-graphic widget))
      ((not (w3-image-loadable-p src nil)) ; Hey, we can't load it!
-      (message "Skipping image %s" (url-basepath src t))
+      (message "Skipping image %s" (w3-url-file-nondirectory src))
       (w3-add-delayed-graphic widget))
      (t                                        ; Grab the images
       (let ((url-request-method "GET")
@@ -841,7 +841,7 @@ If the face already exists, it is unmodified."
          (eq (device-type) 'tty))      ; Why bother?
       nil)
      ((not (w3-image-loadable-p src nil)) ; Hey, we can't load it!
-      (message "Skipping image %s" (url-basepath src t))
+      (message "Skipping image %s" (w3-url-file-nondirectory src))
       nil)
      (t                                        ; Grab the images
       (let ((url-request-method "GET")
@@ -996,11 +996,11 @@ If the face already exists, it is unmodified."
                   (cond
                    ((null w3-auto-image-alt) "")
                    ((eq t w3-auto-image-alt)
-                    (concat "[IMAGE(" (url-basepath src t) ")] "))
+                    (concat "[IMAGE(" (w3-url-file-nondirectory src) ")] "))
                    ((stringp w3-auto-image-alt)
-                    (format w3-auto-image-alt (url-basepath src t)))
+                    (format w3-auto-image-alt (w3-url-file-nondirectory src)))
                    ((functionp w3-auto-image-alt)
-                    (funcall w3-auto-image-alt (url-basepath src t))))))
+                    (funcall w3-auto-image-alt (w3-url-file-nondirectory 
src))))))
          c)
      (while (setq c (string-match "[\C-i\C-j\C-l\C-m]" alt))
        (aset alt c ? ))
diff --git a/lisp/w3.el b/lisp/w3.el
index 64a50da..a23131f 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: legoscia $
-;; Created: $Date: 2007/11/15 12:22:34 $
-;; Version: $Revision: 1.39 $
+;; Created: $Date: 2007/11/15 12:59:53 $
+;; Version: $Revision: 1.40 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -33,6 +33,7 @@
 ;;; format.                                                                ;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+(require 'w3-compat)
 (require 'w3-cfg)
 
 (or (featurep 'efs)
@@ -1924,7 +1925,7 @@ Emacs."
   (interactive (list (w3-read-url-with-default)))
   (let* ((url-mime-accept-string "*/*")
         (urlobj (url-generic-parse-url url))
-        (stub-fname (url-basepath (or (url-filename urlobj) "") t))
+        (stub-fname (w3-url-file-nondirectory (or (url-filename urlobj) "")))
         (dir (or mailcap-download-directory "~/"))
         (fname (or file-name
                    (expand-file-name

commit de787b93e0295e127e5601f32b0593b7d9719489
Author: Magnus Henoch <address@hidden>
Date:   Thu Nov 15 12:46:08 2007 +0000

    Fix parentheses

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 38cd2f5..da29f46 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.48 $
+;; Version: $Revision: 1.49 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -604,7 +604,7 @@ If the face already exists, it is unmodified."
     `(progn
        (push (cons tag args) w3-display-open-element-stack)
        (push content content-stack)
-       (setq content (nth 2 ,node)))))
+       (setq content (nth 2 ,node))))
 
   (defmacro w3-display-handle-list-type ()
     `(add-text-properties
@@ -740,7 +740,7 @@ If the face already exists, it is unmodified."
        (otherwise                      ; Assume 'inline' rendering as default
        nil))
      )
-    )
+)  
 
 
 ;; <link> handling

commit 970822ddc796eeda7624d79d2c698dbbfcc9759f
Author: Magnus Henoch <address@hidden>
Date:   Thu Nov 15 12:42:39 2007 +0000

    lisp/w3-display.el: Drop old-style backquotes.

diff --git a/ChangeLog b/ChangeLog
index 84575ed..3fb9ffe 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,15 +1,20 @@
 2007-11-15  Magnus Henoch  <address@hidden>
 
        * lisp/images.el: Don't require w3-sysdp.
+
        * lisp/css.el: Ditto.
        (css-rule-specificity-internal): Drop old-style backquotes.
        (css-symbol-list-as-regexp): Ditto.
 
        * lisp/w3-dired.el: Don't require w3-sysdp.
-       * lisp/w3-display.el: Ditto.
+
+       * lisp/w3-display.el: Ditto.  Also drop old-style backquotes.
+
        * lisp/w3-menu.el: Ditto.
+
        * lisp/w3.el: Ditto.
        (w3-download-callback): Skip HTTP headers when saving file.
+
        * lisp/w3-sysdp.el: Remove.
 
 2007-03-09  Magnus Henoch  <address@hidden>
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 58790b2..38cd2f5 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,10 +1,10 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.47 $
+;; Version: $Revision: 1.48 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996, 97, 98, 99, 2000, 2001 Free Software Foundation, Inc.
+;;; Copyright (c) 1996, 97, 98, 99, 2000, 2001, 2007 Free Software Foundation, 
Inc.
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;
@@ -592,25 +592,22 @@ If the face already exists, it is unmodified."
 ;; Various macros
 (eval-when-compile
   (defmacro w3-node-visible-p ()
-    (` (not (eq (car break-style) 'none))))
+    `(not (eq (car break-style) 'none)))
 
   (defmacro w3-handle-empty-tag ()
-    (`
-     (progn
+    `(progn
        (push (cons tag args) w3-display-open-element-stack)
        (push content content-stack)
-       (setq content nil))))
+       (setq content nil)))
 
   (defmacro w3-handle-content (node)
-    (`
-     (progn
+    `(progn
        (push (cons tag args) w3-display-open-element-stack)
        (push content content-stack)
-       (setq content (nth 2 (, node))))))
+       (setq content (nth 2 ,node)))))
 
   (defmacro w3-display-handle-list-type ()
-    (`
-     (add-text-properties
+    `(add-text-properties
       (point)
       (progn
        (case (car break-style)
@@ -660,11 +657,10 @@ If the face already exists, it is unmodified."
       (list 'start-open t
            'end-open t
            'rear-nonsticky nil
-           'face 'nil))))
+           'face 'nil)))
 
   (defmacro w3-display-set-margins ()
-    (`
-     (progn
+    `(progn
        (push (+ (w3-get-style-info 'margin-left node 0)
                (car left-margin-stack)) left-margin-stack)
        (push (-
@@ -672,17 +668,15 @@ If the face already exists, it is unmodified."
              (w3-get-style-info 'margin-right node 0)) right-margin-stack)
        (setq fill-column (car right-margin-stack))
        (w3-set-fill-prefix-length (car left-margin-stack))
-       (w3-display-handle-list-type))))
+       (w3-display-handle-list-type)))
 
   (defmacro w3-display-restore-margins ()
-    (`
-     (progn
+    `(progn
        (pop right-margin-stack)
-       (pop left-margin-stack))))
+       (pop left-margin-stack)))
 
   (defmacro w3-display-handle-break ()
-    (`
-     (case (car break-style)
+    `(case (car break-style)
        (block                          ; Full paragraph break
        (if (eq (cadr break-style) 'list-item)
            (setf (cadr break-style) 'line)
@@ -722,16 +716,14 @@ If the face already exists, it is unmodified."
         w3-display-alignment-stack))
        (otherwise                      ; Assume 'inline' rendering as default
        nil))
-     )
     )
+    
 
   (defmacro w3-display-progress-meter ()
-    (`
-     (url-lazy-message "Drawing... %c" (aref "/|\\-" (random 4)))))
+    `(url-lazy-message "Drawing... %c" (aref "/|\\-" (random 4))))
     
   (defmacro w3-display-handle-end-break ()
-    (`
-     (case (pop break-style)
+    `(case (pop break-style)
        (block                          ; Full paragraph break
        (w3-display-line-break 1)
        (w3-display-restore-margins)
@@ -749,7 +741,7 @@ If the face already exists, it is unmodified."
        nil))
      )
     )
-  )
+
 
 ;; <link> handling
 (defun w3-parse-link (args)
@@ -999,8 +991,7 @@ If the face already exists, it is unmodified."
     (concat "[" (file-name-sans-extension fname) "]")))
 
 (defmacro w3-image-alt (src)
-  (`
-   (let* ((doc-alt (w3-get-attribute 'alt))
+  `(let* ((doc-alt (w3-get-attribute 'alt))
          (alt (or (and (stringp doc-alt) (string-match "[^ \t\n]" doc-alt) 
doc-alt)
                   (cond
                    ((null w3-auto-image-alt) "")
@@ -1013,7 +1004,7 @@ If the face already exists, it is unmodified."
          c)
      (while (setq c (string-match "[\C-i\C-j\C-l\C-m]" alt))
        (aset alt c ? ))
-     alt)))
+     alt))
 
 (defmacro w3-handle-image ()
   `(let* ((height (w3-get-attribute 'height))

commit a55762dd09cb9a4bf800becb8a11c52d536cf999
Author: Magnus Henoch <address@hidden>
Date:   Thu Nov 15 12:28:29 2007 +0000

    (css-rule-specificity-internal): Drop old-style backquotes.
    (css-symbol-list-as-regexp): Ditto.

diff --git a/ChangeLog b/ChangeLog
index 34097ab..84575ed 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,7 +2,10 @@
 
        * lisp/images.el: Don't require w3-sysdp.
        * lisp/css.el: Ditto.
-       * lisp/w3-dired.el: Ditto.
+       (css-rule-specificity-internal): Drop old-style backquotes.
+       (css-symbol-list-as-regexp): Ditto.
+
+       * lisp/w3-dired.el: Don't require w3-sysdp.
        * lisp/w3-display.el: Ditto.
        * lisp/w3-menu.el: Ditto.
        * lisp/w3.el: Ditto.
diff --git a/lisp/css.el b/lisp/css.el
index 1dad90f..5e87560 100644
--- a/lisp/css.el
+++ b/lisp/css.el
@@ -1,11 +1,11 @@
 ;;; css.el -- Cascading Style Sheet parser
 ;; Author: $Author: legoscia $
-;; Created: $Date: 2007/11/15 12:22:34 $
-;; Version: $Revision: 1.11 $
+;; Created: $Date: 2007/11/15 12:28:29 $
+;; Version: $Revision: 1.12 $
 ;; Keywords: 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996, 97, 98, 1999, 2000, 2001 Free Software Foundation, Inc.
+;;; Copyright (c) 1996, 97, 98, 1999, 2000, 2001, 2007 Free Software 
Foundation, Inc.
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
 ;;;
 ;;; This file is part of GNU Emacs.
@@ -453,11 +453,11 @@ For a terminal frame, the value is always 1."
     rval))
 
 (defmacro css-symbol-list-as-regexp (&rest keys)
-  (` (eval-when-compile
-       (concat "^\\("
-              (mapconcat 'symbol-name
-                         (quote (, keys))
-                         "\\|") "\\)$"))))
+  `(eval-when-compile
+     (concat "^\\("
+            (mapconcat 'symbol-name
+                       (quote ,keys)
+                       "\\|") "\\)$")))
 
 (defun css-expand-color (color)
   (condition-case e
@@ -865,15 +865,14 @@ For a terminal frame, the value is always 1."
     types))
 
 (defmacro css-rule-specificity-internal (rule)
-  (`
-   (progn
-     (setq tmp (cdr (, rule)))
+  `(progn
+     (setq tmp (cdr ,rule))
      (if (listp tmp)
         (while tmp
           (if (= ?# (aref (car tmp) 0))
               (incf a)
             (incf b))
-          (setq tmp (cdr tmp)))))))
+          (setq tmp (cdr tmp))))))
 
 (defsubst css-specificity (rule)
   ;; To find specificity, according to the september 1996 CSS draft

commit da273105f3009d2d64a5e4f708a20819590a3532
Author: Magnus Henoch <address@hidden>
Date:   Thu Nov 15 12:25:17 2007 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 1ded9ed..34097ab 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2007-11-15  Magnus Henoch  <address@hidden>
+
+       * lisp/images.el: Don't require w3-sysdp.
+       * lisp/css.el: Ditto.
+       * lisp/w3-dired.el: Ditto.
+       * lisp/w3-display.el: Ditto.
+       * lisp/w3-menu.el: Ditto.
+       * lisp/w3.el: Ditto.
+       (w3-download-callback): Skip HTTP headers when saving file.
+       * lisp/w3-sysdp.el: Remove.
+
 2007-03-09  Magnus Henoch  <address@hidden>
 
        * lisp/css.el (css-expand-color): Catch errors and display a

commit dad78f0e5287e8a70e528436b1d3e8b385788640
Author: Magnus Henoch <address@hidden>
Date:   Thu Nov 15 12:22:34 2007 +0000

    2007-11-15  Magnus Henoch  <address@hidden>
    
        * lisp/images.el: Don't require w3-sysdp.
        * lisp/css.el: Ditto.
        * lisp/w3-dired.el: Ditto.
        * lisp/w3-display.el: Ditto.
        * lisp/w3-menu.el: Ditto.
        * lisp/w3.el: Ditto.
        (w3-download-callback): Skip HTTP headers when saving file.
        * lisp/w3-sysdp.el: Remove.

diff --git a/lisp/css.el b/lisp/css.el
index 149243e..1dad90f 100644
--- a/lisp/css.el
+++ b/lisp/css.el
@@ -1,12 +1,12 @@
 ;;; css.el -- Cascading Style Sheet parser
 ;; Author: $Author: legoscia $
-;; Created: $Date: 2007/03/09 21:36:27 $
-;; Version: $Revision: 1.10 $
+;; Created: $Date: 2007/11/15 12:22:34 $
+;; Version: $Revision: 1.11 $
 ;; Keywords: 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996 by William M. Perry <address@hidden>
 ;;; Copyright (c) 1996, 97, 98, 1999, 2000, 2001 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 by William M. Perry <address@hidden>
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -30,7 +30,6 @@
 (eval-and-compile
   (require 'cl)
   (require 'font))
-(require 'w3-sysdp)                    ; for copy-tree
 (autoload 'url-expand-file-name "url-expand")
 (autoload 'url-insert-file-contents "url-handlers")
 (autoload 'url-view-url "url-util")
diff --git a/lisp/images.el b/lisp/images.el
index 2d02a58..83892b7 100644
--- a/lisp/images.el
+++ b/lisp/images.el
@@ -1,12 +1,12 @@
 ;;; images.el --- Automatic image converters
-;; Author: $Author: wmperry $
-;; Created: $Date: 2002/02/01 17:42:48 $
-;; Version: $Revision: 1.5 $
+;; Author: $Author: legoscia $
+;; Created: $Date: 2007/11/15 12:22:34 $
+;; Version: $Revision: 1.6 $
 ;; Keywords: images
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 - 1999, 2007 Free Software Foundation Inc.
 ;;; Copyright (c) 1995 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -26,16 +26,6 @@
 ;;; Boston, MA 02111-1307, USA.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; The emacsen compatibility package - load it up before anything else
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(eval-and-compile
-  (if (not (and (featurep 'xemacs)
-               (or (> emacs-major-version 19)
-                   (>= emacs-minor-version 14))))
-      (require 'w3-sysdp)))
-
 (defvar image-temp-stack nil "Do no touch - internal storage.")
 (defvar image-converters nil "Storage for the image converters.")
 (defvar image-native-formats
diff --git a/lisp/w3-dired.el b/lisp/w3-dired.el
index 52c025a..b56b909 100644
--- a/lisp/w3-dired.el
+++ b/lisp/w3-dired.el
@@ -1,11 +1,11 @@
 ;;; w3-dired.el --- W3 Dired minor mode
 ;; Author: Bill Perry <address@hidden>
-;; Created: $Date: 2001/05/29 15:50:37 $
-;; Version: $Revision: 1.4 $
+;; Created: $Date: 2007/11/15 12:22:34 $
+;; Version: $Revision: 1.5 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999, 2007 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -35,7 +35,6 @@
 
 ;; Fixme: should we have both this and url-dired?
 
-(require 'w3-sysdp)                    ; for add-minor-mode
 (autoload 'dired-get-filename "dired")
 (autoload 'w3-open-local "w3")
 (autoload 'w3-fetch "w3")
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 3a1f045..58790b2 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,11 +1,11 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.46 $
+;; Version: $Revision: 1.47 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996 by William M. Perry <address@hidden>
 ;;; Copyright (c) 1996, 97, 98, 99, 2000, 2001 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 by William M. Perry <address@hidden>
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;
 ;;; This file is part of GNU Emacs.
@@ -35,7 +35,6 @@
 (require 'mailcap)
 (require 'w3-widget)
 (require 'w3-imap)
-(require 'w3-sysdp)
 
 ;; Some mm-* "functions" are macros.  Ensure that they are loaded.
 (eval-when-compile
diff --git a/lisp/w3-menu.el b/lisp/w3-menu.el
index 0840f99..98e50b6 100644
--- a/lisp/w3-menu.el
+++ b/lisp/w3-menu.el
@@ -1,11 +1,11 @@
 ;;; w3-menu.el --- Menu functions for emacs-w3
 ;; Author: Bill Perry <address@hidden>
-;; Version: $Revision: 1.14 $
+;; Version: $Revision: 1.15 $
 ;; Keywords: menu, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996, 97, 98, 99, 2000, 2001, 2007 Free Software Foundation, 
Inc.
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996, 97, 98, 99, 2000, 2001 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -27,7 +27,6 @@
 
 (require 'w3-vars)
 (require 'w3-mouse)
-(require 'w3-sysdp)                    ; for copy-tree
 (eval-when-compile
   (require 'cl)
   (defvar w3-html-bookmarks))
diff --git a/lisp/w3-sysdp.el b/lisp/w3-sysdp.el
deleted file mode 100644
index f533a75..0000000
--- a/lisp/w3-sysdp.el
+++ /dev/null
@@ -1,405 +0,0 @@
-;;; sysdep.el --- consolidate Emacs-version dependencies in one file.
-
-;; Copyright (c) 1995 - 1997 Ben Wing.
-
-;; Author: Ben Wing <address@hidden>, William Perry <address@hidden>
-;; Keywords: lisp, tools
-;; Version: 0.003
-
-
-;; This stuff should go.  We don't have papers for it and it's not
-;; good practice to define things like this.  It tends to screw other
-;; packages that do feature tests with fboundp.  Compare what Gnus
-;; does.  (A lot of it's probably irrelevant anyhow, especially as
-;; depending on Gnus MIME stuff means dropping support for old
-;; Emacsen.)  -- fx
-
-;; The purpose of this file is to eliminate the cruftiness that
-;; would otherwise be required of packages that want to run on multiple
-;; versions of Emacs.  The idea is that we make it look like we're running
-;; the latest version of XEmacs (currently 19.12) by emulating all the
-;; missing functions.
-
-;; #### This file does not currently do any advising but should.
-;; Unfortunately, advice.el is a hugely big package.  Is any such
-;; thing as `advice-lite' possible?
-
-;; #### - This package is great, but its role needs to be thought out a bit
-;; more.  Sysdep will not permit programs written for the old XEmacs API to
-;; run on new versions of XEmacs.  Sysdep is a backward-compatibility
-;; package for the latest and greatest XEmacs API.  It permits programmers
-;; to use the latest XEmacs functionality and still have their programs run
-;; on older versions of XEmacs...perhaps even on FSF Emacs.  It should NEVER
-;; ever need to be loaded in the newest XEmacs.  It doesn't even make sense
-;; to put it in the lisp/utils part of the XEmacs distribution because it's
-;; real purpose is to be distributed with packages like w3 which take
-;; advantage of the latest and greatest features of XEmacs but still need to
-;; be run on older versions.  --Stig
-
-;; Any packages that wish to use this file should load it using
-;; `load-library'.  It will not load itself if a version of sysdep.el
-;; that is at least as recent has already been loaded, but will
-;; load over an older version of sysdep.el.  It will attempt to
-;; not redefine functions that have already been custom-redefined,
-;; but will redefine a function if the supplied definition came from
-;; an older version of sysdep.el.
-
-;; Packages such as w3 that wish to include this file with the package
-;; should rename it to something unique, such as `w3-sysdep.el', and
-;; load it with `load-library'.  That will ensure that no conflicts
-;; arise if more than one package in the load path provides a version
-;; of sysdep.el.  If multiple packages load sysdep.el, the most recent
-;; version will end up loaded; as long as I'm careful not to
-;; introduce bugs in previously working definitions, this should work
-;; fine.
-
-;; You may well discover deficiencies in this file as you use it.
-;; The preferable way of dealing with this is to send me a patch
-;; to sysdep.el; that way, the collective body of knowledge gets
-;; increased.
-
-;; IMPORTANT: leave the version string in the format X.XXX (e.g. 1.001)
-;; so that string comparisons to other versions work properly.
-
-(defconst sysdep-potential-version "0.003")
-
-;; this macro means: define the function, but only if either it
-;; wasn't bound before, or the supplied binding comes from an older
-;; version of sysdep.el.  That way, user-supplied bindings don't
-;; get overridden.
-
-;; note: sysdep-defalias is often more useful than this function,
-;; esp. since you can do load-time conditionalizing and can
-;; optionally leave the function undefined. (e.g. frame functions
-;; in v18.)
-
-(defmacro sysdep-defun (function &rest everything-else)
-  (` (cond ((and (not (fboundp (quote (, function))))
-                (or
-                 (not
-                  (stringp (get (quote (, function)) 'sysdep-defined-this)))
-                 (and (get (quote (, function)) 'sysdep-defined-this)
-                      (string-lessp
-                       (get (quote (, function)) 'sysdep-defined-this)
-                       sysdep-potential-version))))
-           (put (quote (, function)) 'sysdep-defined-this
-                sysdep-potential-version)
-           (defun (, function) (,@ everything-else))))))
-
-(defmacro sysdep-defvar (function &rest everything-else)
-  (` (cond ((and (not (boundp (quote (, function))))
-                (or 
-                 (not
-                  (stringp (get (quote (, function)) 'sysdep-defined-this)))
-                 (and (get (quote (, function)) 'sysdep-defined-this)
-                      (string-lessp
-                       (get (quote (, function)) 'sysdep-defined-this)
-                       sysdep-potential-version))))
-           (put (quote (, function)) 'sysdep-defined-this t)
-           (defvar (, function) (,@ everything-else))))))
-
-(defmacro sysdep-defconst (function &rest everything-else)
-  (` (cond ((and (not (boundp (quote (, function))))
-                (or
-                 (not
-                  (stringp (get (quote (, function)) 'sysdep-defined-this)))
-                 (and (get (quote (, function)) 'sysdep-defined-this)
-                      (string-lessp
-                       (get (quote (, function)) 'sysdep-defined-this)
-                       sysdep-potential-version))))
-           (put (quote (, function)) 'sysdep-defined-this t)
-           (defconst (, function) (,@ everything-else))))))
-
-;; similar for fset and defalias.  No need to quote as the argument
-;; is already quoted.
-
-(defmacro sysdep-fset (function def)
-  (` (cond ((and (not (fboundp (, function)))
-                (or (not (stringp
-                          (get (, function) 'sysdep-defined-this)))
-                    (and (get (, function) 'sysdep-defined-this)
-                         (string-lessp
-                          (get (, function) 'sysdep-defined-this)
-                          sysdep-potential-version)))
-                (, def))
-           (put (, function) 'sysdep-defined-this t)
-           (fset (, function) (, def))))))
-
-(defmacro sysdep-defalias (function def)
-  (` (cond ((and (not (fboundp (, function)))
-                (or (not (stringp
-                          (get (, function) 'sysdep-defined-this)))
-                    (and (get (, function) 'sysdep-defined-this)
-                         (string-lessp
-                          (get (, function) 'sysdep-defined-this)
-                          sysdep-potential-version)))
-                (, def)
-                (or (listp (, def))
-                    (and (symbolp (, def))
-                         (fboundp (, def)))))
-           (put (, function) 'sysdep-defined-this t)
-           (defalias (, function) (, def))))))
-
-(sysdep-defvar list-buffers-directory nil)
-(sysdep-defvar x-library-search-path `("/usr/X11R6/lib/X11/"
-                                     "/usr/X11R5/lib/X11/"
-                                     "/usr/lib/X11R6/X11/"
-                                     "/usr/lib/X11R5/X11/"
-                                     "/usr/local/X11R6/lib/X11/"
-                                     "/usr/local/X11R5/lib/X11/"
-                                     "/usr/local/lib/X11R6/X11/"
-                                     "/usr/local/lib/X11R5/X11/"
-                                     "/usr/X11/lib/X11/"
-                                     "/usr/lib/X11/"
-                                     "/usr/local/lib/X11/"
-                                     "/usr/X386/lib/X11/"
-                                     "/usr/x386/lib/X11/"
-                                     "/usr/XFree86/lib/X11/"
-                                     "/usr/unsupported/lib/X11/"
-                                     "/usr/athena/lib/X11/"
-                                     "/usr/local/x11r5/lib/X11/"
-                                     "/usr/lpp/Xamples/lib/X11/"
-                                     "/usr/openwin/lib/X11/"
-                                     "/usr/openwin/share/lib/X11/"
-                                     ,data-directory)
-  "Search path used for X11 libraries.")
-
-;; frame-related stuff.
-
-(sysdep-defun frame-parameter (frame parameter)
-  "Return FRAME's value for parameter PARAMETER.
-  If FRAME is omitted, describe the currently selected frame."
-  (cdr (assq parameter (frame-parameters frame))))
-
-(sysdep-defun event-point (event)
-  (let ((posn (event-end event)))
-    (if posn 
-       (posn-point posn))))
-
-(sysdep-defalias 'face-list 'list-faces)
-
-(sysdep-defun set-keymap-parent (keymap new-parent)
-  (let ((tail keymap))
-    (while (and tail (cdr tail) (not (eq (car (cdr tail)) 'keymap)))
-      (setq tail (cdr tail)))
-    (if tail
-       (setcdr tail new-parent))))
-
-;; Property list functions
-;;
-(sysdep-defun plist-put (plist prop val)
-  "Change value in PLIST of PROP to VAL.
-PLIST is a property list, which is a list of the form
-\(PROP1 VALUE1 PROP2 VALUE2 ...).  PROP is a symbol and VAL is any object.
-If PROP is already a property on the list, its value is set to VAL,
-otherwise the new PROP VAL pair is added.  The new plist is returned;
-use `(setq x (plist-put x prop val))' to be sure to use the new value.
-The PLIST is modified by side effects."
-  (let ((node (memq prop plist)))
-    (if node
-       (setcar (cdr node) val)
-      (setq plist (cons prop (cons val plist))))
-    plist))
-
-(sysdep-defun plist-get (plist prop)
-  "Extract a value from a property list.
-PLIST is a property list, which is a list of the form
-\(PROP1 VALUE1 PROP2 VALUE2...).  This function returns the value
-corresponding to the given PROP, or nil if PROP is not
-one of the properties on the list."
-  (while (and plist (not (eq (car plist) prop)))
-    (setq plist (cdr (cdr plist))))
-  (and plist (car (cdr plist))))
-
-;; misc
-
-(sysdep-defun buffer-substring-no-properties (beg end)
-  "Return the text from BEG to END, without text properties, as a string."
-  (format "%s" (buffer-substring beg end)))
-  
-(sysdep-defun symbol-value-in-buffer (symbol buffer &optional unbound-value)
-  "Return the value of SYMBOL in BUFFER, or UNBOUND-VALUE if it is unbound."
-  (save-excursion
-    (set-buffer buffer)
-    (if (not (boundp symbol))
-       unbound-value
-      (symbol-value symbol))))
-
-(sysdep-defun insert-file-contents-literally
-  (file &optional visit beg end replace)
-  "Like `insert-file-contents', q.v., but only reads in the file.
-A buffer may be modified in several ways after reading into the buffer due
-to advanced Emacs features, such as file-name-handlers, format decoding,
-find-file-hooks, etc.
-  This function ensures that none of these modifications will take place."
-  (let ((file-name-handler-alist nil)
-       (find-file-hooks nil))
-    (insert-file-contents file visit beg end replace)))
-
-(sysdep-defun alist-to-plist (alist)
-  "Convert association list ALIST into the equivalent property-list form.
-The plist is returned.  This converts from
-
-\((a . 1) (b . 2) (c . 3))
-
-into
-
-\(a 1 b 2 c 3)
-
-The original alist is not modified.  See also `destructive-alist-to-plist'."
-  (let (plist)
-    (while alist
-      (let ((el (car alist)))
-       (setq plist (cons (cdr el) (cons (car el) plist))))
-      (setq alist (cdr alist)))
-    (nreverse plist)))
-
-(sysdep-defun add-minor-mode (toggle name &optional keymap after toggle-fun)
-  "Add a minor mode to `minor-mode-alist' and `minor-mode-map-alist'.
-TOGGLE is a symbol which is used as the variable which toggle the minor mode,
-NAME is the name that should appear in the modeline (it should be a string
-beginning with a space), KEYMAP is a keymap to make active when the minor
-mode is active, and AFTER is the toggling symbol used for another minor
-mode.  If AFTER is non-nil, then it is used to position the new mode in the
-minor-mode alists.  TOGGLE-FUN specifies an interactive function that
-is called to toggle the mode on and off; this affects what appens when
-button2 is pressed on the mode, and when button3 is pressed somewhere
-in the list of modes.  If TOGGLE-FUN is nil and TOGGLE names an
-interactive function, TOGGLE is used as the toggle function.
-
-Example:  (add-minor-mode 'view-minor-mode \" View\" view-mode-map)"
-  (if (not (assq toggle minor-mode-alist))
-      (setq minor-mode-alist (cons (list toggle name) minor-mode-alist)))
-  (if (and keymap (not (assq toggle minor-mode-map-alist)))
-      (setq minor-mode-map-alist (cons (cons toggle keymap)
-                                      minor-mode-map-alist))))
-
-(sysdep-defvar x-font-regexp-foundry-and-family
-  (let ((-             "[-?]")
-       (foundry                "[^-]+")
-       (family                 "[^-]+")
-       )
-    (concat "\\`[-?*]" foundry - "\\(" family "\\)" -)))
-
-(sysdep-defalias 'valid-color-name-p
-  (cond
-   ((fboundp 'x-valid-color-name-p)    ; XEmacs/Lucid
-    'x-valid-color-name-p)
-   ((and window-system
-        (fboundp 'color-defined-p))    ; NS/Emacs 19
-    'color-defined-p)
-   ((and window-system
-        (fboundp 'pm-color-defined-p))
-    'pm-color-defined-p)
-   ((and window-system
-        (fboundp 'x-color-defined-p))  ; Emacs 19
-    'x-color-defined-p)
-   ((fboundp 'get-color)               ; Epoch
-    (function (lambda (color)
-               (let ((x (get-color color)))
-                 (if x
-                     (setq x (progn
-                               (free-color x)
-                               t)))
-                 x))))
-   (t 'identity)))                     ; All others
-
-;; Misc.
-
-(sysdep-defun split-string (string pattern)
-  "Return a list of substrings of STRING which are separated by PATTERN."
-  (let (parts (start 0))
-    (while (string-match pattern string start)
-      (setq parts (cons (substring string start (match-beginning 0)) parts)
-           start (match-end 0)))
-    (nreverse (cons (substring string start) parts))
-    ))
-
-(sysdep-defun display-error (error-object stream)
-  "Display `error-object' on `stream' in a user-friendly way."
-  (funcall (or (let ((type (car-safe error-object)))
-                (catch 'error
-                  (and (consp error-object)
-                       (symbolp type)
-                       ;;(stringp (get type 'error-message))
-                       (consp (get type 'error-conditions))
-                       (let ((tail (cdr error-object)))
-                         (while (not (null tail))
-                           (if (consp tail)
-                               (setq tail (cdr tail))
-                             (throw 'error nil)))
-                         t)
-                       ;; (check-type condition condition)
-                       (get type 'error-conditions)
-                       ;; Search class hierarchy
-                       (let ((tail (get type 'error-conditions)))
-                         (while (not (null tail))
-                           (cond ((not (and (consp tail)
-                                            (symbolp (car tail))))
-                                  (throw 'error nil))
-                                 ((get (car tail) 'display-error)
-                                  (throw 'error (get (car tail)
-                                                     'display-error)))
-                                 (t
-                                  (setq tail (cdr tail)))))
-                         ;; Default method
-                         (function
-                          (lambda (error-object stream)
-                            (let ((type (car error-object))
-                                  (tail (cdr error-object))
-                                  (first t))
-                              (if (eq type 'error)
-                                  (progn (princ (car tail) stream)
-                                         (setq tail (cdr tail)))
-                                (princ (or (get type 'error-message) type)
-                                       stream))
-                              (while tail
-                                (princ (if first ": " ", ") stream)
-                                (prin1 (car tail) stream)
-                                (setq tail (cdr tail)
-                                      first nil)))))))))
-              (function
-               (lambda (error-object stream)
-                 (princ "Peculiar error " stream)
-                 (prin1 error-object stream))))
-          error-object stream))
-
-(sysdep-defun find-face (face)
-  (car-safe (memq face (face-list))))
-
-(sysdep-defun copy-tree (tree &optional vecp)
-  "Make a copy of TREE.
-If TREE is a cons cell, this recursively copies both its car and its cdr.
-Contrast to copy-sequence, which copies only along the cdrs.  With second
-argument VECP, this copies vectors as well as conses."
-  (if (consp tree)
-      (let ((p (setq tree (copy-list tree))))
-       (while (consp p)
-         (if (or (consp (car p)) (and vecp (vectorp (car p))))
-             (setcar p (copy-tree (car p) vecp)))
-         (or (listp (cdr p)) (setcdr p (copy-tree (cdr p) vecp)))
-         (pop p)))
-    (if (and vecp (vectorp tree))
-       (let ((i (length (setq tree (copy-sequence tree)))))
-         (while (>= (setq i (1- i)) 0)
-           (aset tree i (copy-tree (aref tree i) vecp))))))
-  tree)
-
-(sysdep-defun truncate-string-to-width (str len &optional start-column pad)
-  "Truncate string STR so that string-width of STR is not greater than LEN.
-If width of the truncated string is less than LEN, and if a character PAD is
-defined, add padding end of it."
-  (concat (if (> (length str) len) (substring str 0 len) str)
-         (if (or (null pad) (> (length str) len))
-             ""
-           (make-string (- len (length str)) pad))))
-
-(provide 'w3-sysdp)
-;;; sysdep.el ends here
-
-;;;(sysdep.el) Local Variables:
-;;;(sysdep.el) eval: (put 'sysdep-defun 'lisp-indent-function 'defun)
-;;;(sysdep.el) eval: (put 'sysdep-defalias 'lisp-indent-function 'defun)
-;;;(sysdep.el) eval: (put 'sysdep-defconst 'lisp-indent-function 'defun)
-;;;(sysdep.el) eval: (put 'sysdep-defvar 'lisp-indent-function 'defun)
-;;;(sysdep.el) End:
diff --git a/lisp/w3.el b/lisp/w3.el
index ff008b5..64a50da 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,12 +1,12 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: legoscia $
-;; Created: $Date: 2006/12/07 00:21:26 $
-;; Version: $Revision: 1.38 $
+;; Created: $Date: 2007/11/15 12:22:34 $
+;; Version: $Revision: 1.39 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996, 97, 98, 99, 2001, 2007 Free Software Foundation, Inc.
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996, 97, 98, 99, 2001 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -33,7 +33,6 @@
 ;;; format.                                                                ;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(require 'w3-sysdp)
 (require 'w3-cfg)
 
 (or (featurep 'efs)
@@ -1897,7 +1896,9 @@ Emacs."
 
 (defun w3-download-callback (fname)
   (let ((coding-system-for-write 'binary))
-    (write-region (point-min) (point-max) fname))
+    (goto-char (point-min))
+    (search-forward "\n\n" nil t)
+    (write-region (point) (point-max) fname))
   (url-mark-buffer-as-dead (current-buffer))
   (message "Download of %s complete." (url-view-url t))
   (sit-for 3))

commit 74e5aca3de9c0790e1493e9b5ad90d5d7bc7bbe9
Author: Magnus Henoch <address@hidden>
Date:   Fri Mar 9 21:36:36 2007 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index f0f4c64..1ded9ed 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-03-09  Magnus Henoch  <address@hidden>
+
+       * lisp/css.el (css-expand-color): Catch errors and display a
+       warning instead.
+
 2006-12-15  Klaus Straubinger <address@hidden> (tiny change)
 
        * lisp/font.el (font-spatial-to-canonical): Fix conversion from

commit 776580324ecb1eb1d7ff024f461222156a11236e
Author: Magnus Henoch <address@hidden>
Date:   Fri Mar 9 21:36:27 2007 +0000

    (css-expand-color): Catch errors and display a warning instead.

diff --git a/lisp/css.el b/lisp/css.el
index 6a6d467..149243e 100644
--- a/lisp/css.el
+++ b/lisp/css.el
@@ -1,7 +1,7 @@
 ;;; css.el -- Cascading Style Sheet parser
 ;; Author: $Author: legoscia $
-;; Created: $Date: 2006/12/15 15:21:47 $
-;; Version: $Revision: 1.9 $
+;; Created: $Date: 2007/03/09 21:36:27 $
+;; Version: $Revision: 1.10 $
 ;; Keywords: 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -461,54 +461,58 @@ For a terminal frame, the value is always 1."
                          "\\|") "\\)$"))))
 
 (defun css-expand-color (color)
-  (cond
-   ((string-match "^\\(transparent\\|none\\)$" color)
-    (setq color nil))
-   ((string-match "^#" color)
-    (let (r g b)
+  (condition-case e
       (cond
-       ((string-match "^#...$" color)
-       ;; 3-char rgb spec, expand out to six chars by replicating
-       ;; digits, not adding zeros.
-       (setq r (css-unhex (make-string 2 (aref color 1)))
-             g (css-unhex (make-string 2 (aref color 2)))
-             b (css-unhex (make-string 2 (aref color 3)))))
-       ((string-match "^#\\(..\\)\\(..\\)\\(..\\)$" color)
-       (setq r (css-unhex (match-string 1 color))
-             g (css-unhex (match-string 2 color))
-             b (css-unhex (match-string 3 color))))
+       ((string-match "^\\(transparent\\|none\\)$" color)
+       (setq color nil))
+       ((string-match "^#" color)
+       (let (r g b)
+         (cond
+          ((string-match "^#...$" color)
+           ;; 3-char rgb spec, expand out to six chars by replicating
+           ;; digits, not adding zeros.
+           (setq r (css-unhex (make-string 2 (aref color 1)))
+                 g (css-unhex (make-string 2 (aref color 2)))
+                 b (css-unhex (make-string 2 (aref color 3)))))
+          ((string-match "^#\\(..\\)\\(..\\)\\(..\\)$" color)
+           (setq r (css-unhex (match-string 1 color))
+                 g (css-unhex (match-string 2 color))
+                 b (css-unhex (match-string 3 color))))
+          (t
+           (setq color (substring color 1))
+           (let* ((n (/ (length color) 3))
+                  (max (float (css-pow 16 n))))
+             (setq r (css-unhex (substring color 0 n))
+                   g (css-unhex (substring color n (* n 2)))
+                   b (css-unhex (substring color (* n 2) (* n 3)))
+                   r (round (* (/ r max) 255))
+                   g (round (* (/ g max) 255))
+                   b (round (* (/ b max) 255))))))
+         (setq color (vector 'rgb r g b))))
+       ((string-match "^rgb *( *\\([0-9]+\\)[, ]+\\([0-9]+\\)[, ]+\\([0-9]+\\) 
*) *$" color)
+       ;; rgb(r,g,b) 0 - 255, cutting off at 255
+       (setq color (vector
+                    'rgb
+                    (min (string-to-int (match-string 1 color)) 255)
+                    (min (string-to-int (match-string 2 color)) 255)
+                    (min (string-to-int (match-string 3 color)) 255))))
+       ((string-match "^rgb *( *\\([0-9]+\\) *%[, ]+\\([0-9]+\\) *%[, 
]+\\([0-9]+\\) *% *) *$" color)
+       ;; rgb(r%,g%,b%) 0 - 100%, cutting off at 100%
+       (let ((r (min (string-to-number (match-string 1 color)) 100.0))
+             (g (min (string-to-number (match-string 2 color)) 100.0))
+             (b (min (string-to-number (match-string 3 color)) 100.0)))
+         (setq r (round (* r 2.55))
+               g (round (* g 2.55))
+               b (round (* b 2.55))
+               color (vector 'rgb r g b))))
        (t
-       (setq color (substring color 1))
-       (let* ((n (/ (length color) 3))
-              (max (float (css-pow 16 n))))
-         (setq r (css-unhex (substring color 0 n))
-               g (css-unhex (substring color n (* n 2)))
-               b (css-unhex (substring color (* n 2) (* n 3)))
-               r (round (* (/ r max) 255))
-               g (round (* (/ g max) 255))
-               b (round (* (/ b max) 255))))))
-      (setq color (vector 'rgb r g b))))
-   ((string-match "^rgb *( *\\([0-9]+\\)[, ]+\\([0-9]+\\)[, ]+\\([0-9]+\\) *) 
*$" color)
-    ;; rgb(r,g,b) 0 - 255, cutting off at 255
-    (setq color (vector
-                'rgb
-                (min (string-to-int (match-string 1 color)) 255)
-                (min (string-to-int (match-string 2 color)) 255)
-                (min (string-to-int (match-string 3 color)) 255))))
-   ((string-match "^rgb *( *\\([0-9]+\\) *%[, ]+\\([0-9]+\\) *%[, 
]+\\([0-9]+\\) *% *) *$" color)
-    ;; rgb(r%,g%,b%) 0 - 100%, cutting off at 100%
-    (let ((r (min (string-to-number (match-string 1 color)) 100.0))
-         (g (min (string-to-number (match-string 2 color)) 100.0))
-         (b (min (string-to-number (match-string 3 color)) 100.0)))
-      (setq r (round (* r 2.55))
-           g (round (* g 2.55))
-           b (round (* b 2.55))
-           color (vector 'rgb r g b))))
-    (t
-     ;; Hmmm... pass it through unmangled and hope the underlying
-     ;; windowing system can handle it.
-     )
-    )
+       ;; Hmmm... pass it through unmangled and hope the underlying
+       ;; windowing system can handle it.
+       )
+       )
+    (error
+     (w3-warn 'css (format "Couldn't interpret color value %s" color))
+     (setq color nil)))
   color
   )
 

commit 32aedb11b0a3c7ce02043f8a9141458ddf936c24
Author: Magnus Henoch <address@hidden>
Date:   Fri Dec 15 15:21:56 2006 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index f49dcb2..f0f4c64 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,9 @@
        * lisp/font.el (font-spatial-to-canonical): Fix conversion from
        pixels to points.
 
+       * lisp/css.el (css-expand-length): Treat character based size
+       specifications as such.
+
 2006-12-07  Magnus Henoch  <address@hidden>
 
        * lisp/w3.el (w3-fetch-callback): Treat application/xhtml+xml as

commit 308cba8d14e0f271ff302f0735d86c93d80e7981
Author: Magnus Henoch <address@hidden>
Date:   Fri Dec 15 15:21:47 2006 +0000

    (css-expand-length): Treat character based size specifications as
    such.

diff --git a/lisp/css.el b/lisp/css.el
index bc8641f..6a6d467 100644
--- a/lisp/css.el
+++ b/lisp/css.el
@@ -1,7 +1,7 @@
 ;;; css.el -- Cascading Style Sheet parser
-;; Author: $Author: fx $
-;; Created: $Date: 2002/01/22 19:01:57 $
-;; Version: $Revision: 1.8 $
+;; Author: $Author: legoscia $
+;; Created: $Date: 2006/12/15 15:21:47 $
+;; Version: $Revision: 1.9 $
 ;; Keywords: 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -409,6 +409,7 @@ For a terminal frame, the value is always 1."
    ((and (string-match "\\([+-]?\\([0-9]+\\|[0-9]*\\.[0-9]+\\)\\)%" spec)
         (fboundp 'frame-char-height))
     ;; A percentage
+    ;; XXX: should be relative to encosing element
     (setq spec (/ (string-to-int (match-string 1 spec)) 100.0))
     (if height
        (round (* (frame-char-height) spec))
@@ -421,7 +422,12 @@ For a terminal frame, the value is always 1."
       (max 0 (round (* (/ (frame-pixel-width) (frame-width)) spec)))))
    ((string-match "\\([+-]?\\([0-9]+\\|[0-9]*\\.[0-9]+\\)\\)e[mx]" spec)
     ;; Character based
-    (max 0 (round (string-to-number (match-string 1 spec)))))
+    ;; XXX: should be relative to font size of enclosing element
+    (round (font-spatial-to-canonical
+            (concat (number-to-string
+                     (* (string-to-number (match-string 1 spec))
+                        (if height (frame-char-height) (frame-char-width))))
+                    "px"))))
    (t
     (truncate (font-spatial-to-canonical spec)))
    )

commit bedfdd5d81b27c7db69b784b5bef22edbc8f73d4
Author: Magnus Henoch <address@hidden>
Date:   Fri Dec 15 14:41:01 2006 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 71e0d67..f49dcb2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-12-15  Klaus Straubinger <address@hidden> (tiny change)
+
+       * lisp/font.el (font-spatial-to-canonical): Fix conversion from
+       pixels to points.
+
 2006-12-07  Magnus Henoch  <address@hidden>
 
        * lisp/w3.el (w3-fetch-callback): Treat application/xhtml+xml as

commit 855a47c41edf88891c2bd67ccdb1ecbbf19ecbdb
Author: Magnus Henoch <address@hidden>
Date:   Fri Dec 15 14:40:54 2006 +0000

    (font-spatial-to-canonical): Fix conversion from pixels to points.

diff --git a/lisp/font.el b/lisp/font.el
index c5a977e..6f5481d 100644
--- a/lisp/font.el
+++ b/lisp/font.el
@@ -2,7 +2,7 @@
 
 ;; Author: wmperry
 ;; Maintainer: Bill Perry <address@hidden>
-;; Created: $Date: 2002/10/23 03:33:41 $
+;; Created: $Date: 2006/12/15 14:40:54 $
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1995, 1996 by William M. Perry <address@hidden>
@@ -307,7 +307,7 @@ These are for use in the `weight' field of an X font 
string.")
       (setq num (string-to-number spec))
       (cond
        ((member type '("pixel" "px" "pix"))
-       (setq retval (* num (/ pix-width mm-width) (/ 25.4 72.0))))
+       (setq retval (* num (/ mm-width pix-width) (/ 72.0 25.4))))
        ((member type '("point" "pt"))
        (setq retval num))
        ((member type '("pica" "pa"))

commit 50baee205590d1a1c3047f3ddee407913f6c3c1c
Author: Magnus Henoch <address@hidden>
Date:   Thu Dec 7 00:21:34 2006 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index d99a2c7..71e0d67 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-12-07  Magnus Henoch  <address@hidden>
+
+       * lisp/w3.el (w3-fetch-callback): Treat application/xhtml+xml as
+       text/html.
+
 2006-11-29  Magnus Henoch  <address@hidden>
 
        * lisp/w3.el (w3-download-redirect-callback): New function.

commit 8676e0a3bcfe33205d5e838789c8e1b0795d24ef
Author: Magnus Henoch <address@hidden>
Date:   Thu Dec 7 00:21:26 2006 +0000

    (w3-fetch-callback): Treat application/xhtml+xml as text/html.

diff --git a/lisp/w3.el b/lisp/w3.el
index 8ae98ae..ff008b5 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: legoscia $
-;; Created: $Date: 2006/11/29 11:59:06 $
-;; Version: $Revision: 1.37 $
+;; Created: $Date: 2006/12/07 00:21:26 $
+;; Version: $Revision: 1.38 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -354,7 +354,10 @@ MUST-BE-VIEWING is the current URL when the timer expires."
                                  (mm-handle-media-type handle)))))
       ;; Fixme: can handle be null?
       (cond
-       ((equal (mm-handle-media-type handle) "text/html")
+       ((or (equal (mm-handle-media-type handle) "text/html")
+           ;; Ultimately this should be handled by an XML parser, but
+           ;; this will mostly work for now:
+           (equal (mm-handle-media-type handle) "application/xhtml+xml"))
        ;; Special case text/html if it comes through w3-fetch
        (set-buffer (generate-new-buffer " *w3-html*"))
        (mm-disable-multibyte)

commit e512bda6a7ed5868cf2be8271bddfb20fea50ffe
Author: Magnus Henoch <address@hidden>
Date:   Wed Nov 29 11:59:15 2006 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 842c1c4..d99a2c7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-11-29  Magnus Henoch  <address@hidden>
+
+       * lisp/w3.el (w3-download-redirect-callback): New function.
+       (w3-download-url): Use it instead of w3-download-callback.
+
 2006-11-01  Magnus Henoch  <address@hidden>
 
        * lisp/w3.el (w3-fetch-redirect-callback): Handle both old and new

commit f8f8a943715c47daa0b0afb1346893c2815b0e6f
Author: Magnus Henoch <address@hidden>
Date:   Wed Nov 29 11:59:06 2006 +0000

    (w3-download-redirect-callback): New function.
    (w3-download-url): Use it instead of w3-download-callback.

diff --git a/lisp/w3.el b/lisp/w3.el
index 6a2f24d..8ae98ae 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: legoscia $
-;; Created: $Date: 2006/11/01 00:21:50 $
-;; Version: $Revision: 1.36 $
+;; Created: $Date: 2006/11/29 11:59:06 $
+;; Version: $Revision: 1.37 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1867,6 +1867,31 @@ Emacs."
                    (setq result (cons x result))))
     result))
 
+(defun w3-download-redirect-callback (&rest args)
+  (let (redirect-url errorp)
+    ;; Handle both styles of `url-retrieve' callbacks...
+    (cond
+     ((listp (car args))
+      ;; Emacs 22 style.  First argument is a list.
+      (let ((status (car args)))
+       (when (eq (car status) :error)
+         (setq errorp t)
+         (setq status (cddr args)))
+       (when (eq (car status) :redirect)
+         (setq redirect-url (second (car args))))
+
+       (setq args (cdr args))))
+
+     ((eq (car args) :redirect)
+      ;; Pre-22 redirect.
+      (setq redirect-url (cadr args))
+      (while (eq (car args) :redirect)
+       (setq args (cddr args)))))
+
+    (if errorp
+       (message "Download of %s failed." (url-view-url t))
+      (w3-download-callback (car args)))))
+
 (defun w3-download-callback (fname)
   (let ((coding-system-for-write 'binary))
     (write-region (point-min) (point-max) fname))
@@ -1904,7 +1929,7 @@ Emacs."
                                     stub-fname
                                     nil
                                     stub-fname) dir))))
-    (url-retrieve url 'w3-download-callback (list fname))))
+    (url-retrieve url 'w3-download-redirect-callback (list fname))))
 
 ;;;###autoload
 (defun w3-follow-link-other-frame (&optional p)

commit fb5b3c55371fd0cb7a1e72b8a9cb2fd77eeecf20
Author: Magnus Henoch <address@hidden>
Date:   Wed Nov 1 00:21:49 2006 +0000

    lisp/w3.el (w3-fetch-redirect-callback): Handle both old and new style
    of `url-retrieve' callback.
    
    lisp/w3-display.el (w3-finalize-image-download-skip-redirects): Ditto.

diff --git a/ChangeLog b/ChangeLog
index 9d51c94..842c1c4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2006-11-01  Magnus Henoch  <address@hidden>
+
+       * lisp/w3.el (w3-fetch-redirect-callback): Handle both old and new
+       style of `url-retrieve' callback.
+
+       * lisp/w3-display.el (w3-finalize-image-download-skip-redirects):
+       Ditto.
+
 2006-10-17  Magnus Henoch  <address@hidden>
 
        * lisp/w3.el (w3-save-url): Use kill-new.
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 5d1f487..3a1f045 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.45 $
+;; Version: $Revision: 1.46 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -872,14 +872,34 @@ If the face already exists, it is unmodified."
        (url-retrieve src 'w3-finalize-image-download-skip-redirects (list src 
buf 'background face)))))))
 
 (defun w3-finalize-image-download-skip-redirects (&rest args)
-  ;; Skip any number of redirects, conserving the real URL of the
-  ;; image.
-  (let ((url (if (eq (car args) :redirect)
-                (cadr args)
-              (car args))))
-    (while (eq (car args) :redirect)
-      (setq args (cddr args)))
-    (apply 'w3-finalize-image-download args)))
+  (let (redirect-url errorp)
+    ;; Handle both styles of `url-retrieve' callbacks...
+    (cond
+     ((listp (car args))
+      ;; Emacs 22 style.  First argument is a list.
+      (let ((status (car args)))
+       (when (eq (car status) :error)
+         (setq errorp (cadr status))
+         (setq status (cddr status)))
+       (when (eq (car status) :redirect)
+         (setq redirect-url (second (car args))))
+
+       (setq args (cdr args))))
+
+     ((eq (car args) :redirect)
+      ;; Pre-22 redirect.
+      (setq redirect-url (cadr args))
+      (while (eq (car args) :redirect)
+       (setq args (cddr args)))))
+
+    (if errorp
+       (progn
+         ;;(message "Reading of %s failed: %s" (or redirect-url (car args)) 
errorp)
+         (url-mark-buffer-as-dead (current-buffer)))
+      ;; Actually, for images we don't want to know the real URL, as the
+      ;; original address is used when putting the images in the right
+      ;; place.  Thus we ignore redirect-url.
+      (apply 'w3-finalize-image-download args))))
 
 (defun w3-finalize-image-download (url buffer &optional widget face)
   (let ((glyph nil)
diff --git a/lisp/w3.el b/lisp/w3.el
index ff671a8..6a2f24d 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: legoscia $
-;; Created: $Date: 2006/10/17 20:24:48 $
-;; Version: $Revision: 1.35 $
+;; Created: $Date: 2006/11/01 00:21:50 $
+;; Version: $Revision: 1.36 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -299,12 +299,28 @@ MUST-BE-VIEWING is the current URL when the timer 
expires."
                               (string-to-int (or reload "5"))))))
 
 (defun w3-fetch-redirect-callback (&rest args)
-  ;; Web page was fetched, but `url-retrieve' might have added
-  ;; information about redirections.
-  (w3-fetch-callback
-   (if (eq (car args) :redirect)
-       (cadr args)
-     (car args))))
+  (let (redirect-url errorp)
+    ;; Handle both styles of `url-retrieve' callbacks...
+    (cond
+     ((listp (car args))
+      ;; Emacs 22 style.  First argument is a list.
+      (let ((status (car args)))
+       (when (eq (car status) :error)
+         (setq errorp t)
+         (setq status (cddr args)))
+       (when (eq (car status) :redirect)
+         (setq redirect-url (second (car args))))
+
+       (setq args (cdr args))))
+
+     ((eq (car args) :redirect)
+      ;; Pre-22 redirect.
+      (setq redirect-url (cadr args))
+      (while (eq (car args) :redirect)
+       (setq args (cddr args)))))
+
+    ;; w3-fetch-callback can handle errors, too.
+    (w3-fetch-callback (or redirect-url (car args)))))
 
 (defun w3-fetch-callback (url)
   (w3-nasty-disgusting-http-equiv-handling (current-buffer) url)

commit ed38e25bbfa8fdcabcc1cc9c9e4df49f3bfd5cd0
Author: Magnus Henoch <address@hidden>
Date:   Tue Oct 17 20:24:47 2006 +0000

    lisp/w3.el (w3-save-url): Use kill-new.
    lisp/w3-xemac.el (w3-store-in-clipboard): Remove.

diff --git a/ChangeLog b/ChangeLog
index 865fb36..9d51c94 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2006-10-17  Magnus Henoch  <address@hidden>
+
+       * lisp/w3.el (w3-save-url): Use kill-new.
+
+       * lisp/w3-xemac.el (w3-store-in-clipboard): Remove.
+
 2006-10-13  Magnus Henoch  <address@hidden>
 
        * lisp/w3-parse.el (w3-slow-parse-buffer): Don't call
diff --git a/lisp/w3-xemac.el b/lisp/w3-xemac.el
index a2cb663..f49ac24 100644
--- a/lisp/w3-xemac.el
+++ b/lisp/w3-xemac.el
@@ -1,7 +1,7 @@
 ;;; w3-xemac.el --- XEmacs specific functions for emacs-w3
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:36:12 $
-;; Version: $Revision: 1.2 $
+;; Author: $Author: legoscia $
+;; Created: $Date: 2006/10/17 20:24:48 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: faces, help, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -90,21 +90,6 @@
     )
   )
 
-(defun w3-store-in-clipboard (str)
-  "Store string STR into the clipboard in X"
-  ;; If possible, let's use the builtin XEmacs device-independent version
-  ;; of this function.  This exists as of XEmacs 21.0, so we should still
-  ;; provide our own version in case we are not on the bleeding edge.
-  (if (fboundp 'own-selection)
-      (own-selection str)
-    (case (device-type)
-      (x
-       (x-own-selection str))
-      (mswindows
-       (mswindows-own-selection str))
-      (otherwise
-       nil))))
-
 (defun w3-mode-motion-hook (e)
   (let* ((glyph  (event-glyph e))
         (x      (and glyph (event-glyph-x-pixel e)))
diff --git a/lisp/w3.el b/lisp/w3.el
index 94d86d9..ff671a8 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: legoscia $
-;; Created: $Date: 2006/10/11 01:23:17 $
-;; Version: $Revision: 1.34 $
+;; Created: $Date: 2006/10/17 20:24:48 $
+;; Version: $Revision: 1.35 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1537,11 +1537,8 @@ as high as possible in w3-explicit-conversion-tree"
            (t (url-view-url t)))))
     (if x
        (progn
-         (setq kill-ring (cons x kill-ring))
-         (setq kill-ring-yank-pointer kill-ring)
-         (message "Stored URL in kill-ring.")
-         (if (fboundp 'w3-store-in-clipboard)
-             (w3-store-in-clipboard x)))
+         (kill-new x)
+         (message "Stored URL in kill-ring."))
       (error "No URL to store"))))
 
 (fset 'w3-end-of-document 'end-of-buffer)

commit aabeb8bb96425f17603fd13d9aa1b509b4bd521f
Author: Magnus Henoch <address@hidden>
Date:   Fri Oct 13 00:33:55 2006 +0000

    (w3-slow-parse-buffer): Don't call w3-element-content-model on nil
    values.

diff --git a/ChangeLog b/ChangeLog
index 6eb59a0..865fb36 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-10-13  Magnus Henoch  <address@hidden>
+
+       * lisp/w3-parse.el (w3-slow-parse-buffer): Don't call
+       w3-element-content-model on nil values.
+
 2006-10-12  Magnus Henoch  <address@hidden>
 
        * lisp/w3-imap.el (w3-image-loadable-p): Ignore errors in
diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index 65cb4e9..6bc1b5b 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -2490,9 +2490,11 @@ Returns a data structure containing the parsed 
information."
                      ((looking-at "/>")
                       (forward-char 2)
                       (or ;; XHTML-style empty tag
-                       (eq 'EMPTY
-                           (w3-element-content-model
-                            (get w3-p-d-tag-name 'html-element-info))) 
+                       (let ((html-element-info (get w3-p-d-tag-name 
'html-element-info)))
+                         (and html-element-info
+                              (eq 'EMPTY
+                                  (w3-element-content-model
+                                   html-element-info)))) 
                        ;; XHTML empty element which is not ordinarily
                        ;; empty.  Simulate by inserting an end tag.
                        (save-excursion

commit 609bb3b42a5422011d59da2d37fc8aaa30c6c9c1
Author: Magnus Henoch <address@hidden>
Date:   Thu Oct 12 21:32:16 2006 +0000

    (w3-image-loadable-p): Ignore errors in url-file-attributes.

diff --git a/ChangeLog b/ChangeLog
index e0350b4..6eb59a0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2006-10-12  Magnus Henoch  <address@hidden>
 
+       * lisp/w3-imap.el (w3-image-loadable-p): Ignore errors in
+       url-file-attributes.
+
        * lisp/w3-display.el (w3-finalize-image-download-skip-redirects):
        New function.
        (w3-maybe-start-background-image-download)
diff --git a/lisp/w3-imap.el b/lisp/w3-imap.el
index e03994d..99948cf 100644
--- a/lisp/w3-imap.el
+++ b/lisp/w3-imap.el
@@ -1,7 +1,7 @@
 ;;; w3-imap.el --- Imagemap functions
-;; Author: $Author: sds $
-;; Created: $Date: 2003/06/26 18:43:27 $
-;; Version: $Revision: 1.4 $
+;; Author: $Author: legoscia $
+;; Created: $Date: 2006/10/12 21:32:16 $
+;; Version: $Revision: 1.5 $
 ;; Keywords: hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -210,7 +210,8 @@ vectors."
 
 (defun w3-image-loadable-p (href force)
   (or force
-      (let ((attribs (url-file-attributes href)))
+      (let ((attribs (condition-case nil (url-file-attributes href)
+                      (error nil))))
         (and attribs
              ;; this is clearly an error: `file-attributes' returns
              ;; the permissions string as the 8th element, not a mime type!

commit 20ca0e8de882282c7d11e832195df33d780b28e3
Author: Magnus Henoch <address@hidden>
Date:   Wed Oct 11 22:18:28 2006 +0000

    (w3-finalize-image-download-skip-redirects): New function.
    (w3-maybe-start-background-image-download)
    (w3-maybe-start-image-download): Use it instead of
    w3-finalize-image-download.

diff --git a/ChangeLog b/ChangeLog
index 52fa100..e0350b4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2006-10-12  Magnus Henoch  <address@hidden>
+
+       * lisp/w3-display.el (w3-finalize-image-download-skip-redirects):
+       New function.
+       (w3-maybe-start-background-image-download)
+       (w3-maybe-start-image-download): Use it instead of
+       w3-finalize-image-download.
+
 2006-10-11  Magnus Henoch  <address@hidden>
 
        * lisp/w3.el (w3-fetch-redirect-callback): New function.
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index b1decbf..5d1f487 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.44 $
+;; Version: $Revision: 1.45 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -832,7 +832,7 @@ If the face already exists, it is unmodified."
            (setq w3-graphics-list (cons (cons src (make-glyph))
                                     w3-graphics-list))
          (add-to-list 'w3-graphics-list (cons src (list 'image))))
-       (url-retrieve src 'w3-finalize-image-download
+       (url-retrieve src 'w3-finalize-image-download-skip-redirects
                      (list src (widget-get widget 'buffer) widget)))))))
 
 (defun w3-maybe-start-background-image-download (src face)
@@ -869,7 +869,17 @@ If the face already exists, it is unmodified."
            (setq w3-graphics-list (cons (cons src (make-glyph))
                                     w3-graphics-list))
          (add-to-list 'w3-graphics-list (cons src (list 'image))))
-       (url-retrieve src 'w3-finalize-image-download (list src buf 'background 
face)))))))
+       (url-retrieve src 'w3-finalize-image-download-skip-redirects (list src 
buf 'background face)))))))
+
+(defun w3-finalize-image-download-skip-redirects (&rest args)
+  ;; Skip any number of redirects, conserving the real URL of the
+  ;; image.
+  (let ((url (if (eq (car args) :redirect)
+                (cadr args)
+              (car args))))
+    (while (eq (car args) :redirect)
+      (setq args (cddr args)))
+    (apply 'w3-finalize-image-download args)))
 
 (defun w3-finalize-image-download (url buffer &optional widget face)
   (let ((glyph nil)

commit 207c4e2efe7ae3343efcdf4b999410c3b69332a0
Author: Magnus Henoch <address@hidden>
Date:   Wed Oct 11 01:23:17 2006 +0000

    * lisp/w3.el (w3-fetch-redirect-callback): New function.
      (w3-fetch): Use it as url-retrieve callback instead of
      w3-fetch-callback.

diff --git a/ChangeLog b/ChangeLog
index 4508346..52fa100 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2006-10-11  Magnus Henoch  <address@hidden>
+
+       * lisp/w3.el (w3-fetch-redirect-callback): New function.
+       (w3-fetch): Use it as url-retrieve callback instead of
+       w3-fetch-callback.
+
 2006-10-09  Magnus Henoch  <address@hidden>
 
        * lisp/w3.el: Require mm-decode here too.
diff --git a/lisp/w3.el b/lisp/w3.el
index e49ca1a..94d86d9 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: legoscia $
-;; Created: $Date: 2006/10/09 09:09:23 $
-;; Version: $Revision: 1.33 $
+;; Created: $Date: 2006/10/11 01:23:17 $
+;; Version: $Revision: 1.34 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -298,6 +298,14 @@ MUST-BE-VIEWING is the current URL when the timer expires."
        (w3-setup-reload-timer uri (url-view-url t)
                               (string-to-int (or reload "5"))))))
 
+(defun w3-fetch-redirect-callback (&rest args)
+  ;; Web page was fetched, but `url-retrieve' might have added
+  ;; information about redirections.
+  (w3-fetch-callback
+   (if (eq (car args) :redirect)
+       (cadr args)
+     (car args))))
+
 (defun w3-fetch-callback (url)
   (w3-nasty-disgusting-http-equiv-handling (current-buffer) url)
   ;; Process any cookie and refresh headers.
@@ -436,7 +444,7 @@ With prefix argument, use the URL of the hyperlink under 
point instead."
                (not (funcall url-confirmation-func
                              (format "Reuse URL in buffer %s? "
                                      (buffer-name buf)))))))
-         (url-retrieve url 'w3-fetch-callback (list url))
+         (url-retrieve url 'w3-fetch-redirect-callback (list url))
        (w3-notify-when-ready buf))))))
 
 

commit 4441613f9dfabe6d8e990b92645e4af2a4d92243
Author: Magnus Henoch <address@hidden>
Date:   Mon Oct 9 09:09:23 2006 +0000

    2006-10-09  Magnus Henoch  <address@hidden>
    
        * lisp/w3.el: Require mm-decode here too.

diff --git a/ChangeLog b/ChangeLog
index 735d918..4508346 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2006-10-09  Magnus Henoch  <address@hidden>
+
+       * lisp/w3.el: Require mm-decode here too.
+
 2006-10-08  Magnus Henoch  <address@hidden>
 
        * lisp/w3-display.el: Require mm-decode when compiling.
diff --git a/lisp/w3.el b/lisp/w3.el
index e3e6fb5..e49ca1a 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
-;; Author: $Author: wmperry $
-;; Created: $Date: 2003/01/12 22:10:25 $
-;; Version: $Revision: 1.32 $
+;; Author: $Author: legoscia $
+;; Created: $Date: 2006/10/09 09:09:23 $
+;; Version: $Revision: 1.33 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -49,6 +49,11 @@
 (require 'w3-vars)
 (eval-and-compile
   (require 'w3-display))
+
+;; Some mm-* "functions" are macros.  Ensure that they are loaded.
+(eval-when-compile
+  (require 'mm-decode))
+
 (autoload 'w3-parse-hotlist "w3-hot")
 (autoload 'w3-menu-install-menus "w3-menu")
 

commit 94de5a3592284694a2435427778cbb39596ccdfe
Author: Magnus Henoch <address@hidden>
Date:   Sun Oct 8 18:44:17 2006 +0000

    lisp/w3-display.el: Require mm-decode when compiling.

diff --git a/ChangeLog b/ChangeLog
index 5944dc9..735d918 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2006-10-08  Magnus Henoch  <address@hidden>
+
+       * lisp/w3-display.el: Require mm-decode when compiling.
+
 2006-04-28  Dave Love  <address@hidden>
 
        * texi/w3.txi: Change licence to GFDL. 
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index fd372db..b1decbf 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.43 $
+;; Version: $Revision: 1.44 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -37,6 +37,10 @@
 (require 'w3-imap)
 (require 'w3-sysdp)
 
+;; Some mm-* "functions" are macros.  Ensure that they are loaded.
+(eval-when-compile
+  (require 'mm-decode))
+
 (autoload 'sentence-ify "flame")
 (autoload 'string-ify "flame")
 (autoload '*flame "flame")

commit e09df3b6ef8af53dadc34018e853ea2ea1a37db8
Author: Dave Love <address@hidden>
Date:   Fri Apr 28 10:57:31 2006 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 6292591..5944dc9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2006-04-28  Dave Love  <address@hidden>
+
+       * texi/w3.txi: Change licence to GFDL. 
+
 2003-06-26  Sam Steingold  <address@hidden>
 
        * lisp/w3-imap.el (w3-image-loadable-p): fixed the logic

commit 0eab27c939d4e17a8ebb9d5a687c83d1d82d9df3
Author: Dave Love <address@hidden>
Date:   Fri Apr 28 10:57:15 2006 +0000

    Change licence to GFDL.

diff --git a/texi/w3.txi b/texi/w3.txi
index 4d948a9..8c6e9bd 100644
--- a/texi/w3.txi
+++ b/texi/w3.txi
@@ -12,7 +12,7 @@
 @c site: http://www.cs.indiana.edu/elisp/w3/docs.html
 @c
 @setfilename w3.info
address@hidden Emacs/W3 $State: v4.0pre.47 $ User's Manual
address@hidden Emacs/W3 $State: Exp $ User's Manual
 @iftex
 @c @finalout
 @end iftex
@@ -29,24 +29,21 @@
 @direntry
 * Emacs/W3: (w3).                 Emacs/W3 World Wide Web browser.
 @end direntry
address@hidden
-This file documents the Emacs/W3 World Wide Web browser.
 
-Copyright (C) 1993, 1994, 1995, 1996 William M. Perry
-Copyright (C) 1996, 1997 Free Software Foundation
-
-Permission is granted to make and distribute verbatim copies of
-this manual provided the copyright notice and this permission notice
-are preserved on all copies.
-
address@hidden
-Permission is granted to process this file through Tex and print the
-results, provided the printed document carries copying permission
-notice identical to this one except for the removal of this paragraph
-(this paragraph not being relevant to the printed manual).
-
address@hidden ignore
address@hidden ifinfo
address@hidden
address@hidden copying
+Copyright @copyright{} 1993, 1994, 1995, 1996, 1997, 1999, 2000
+Free Software Foundation, Inc.
+
address@hidden
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU
+Manual''.  A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License'' in the Emacs manual.
address@hidden quotation
 @c
 @titlepage
 @sp 6
@@ -59,15 +56,6 @@ notice identical to this one except for the removal of this 
paragraph
 @sp 5
 @center William M. Perry
 @center @i{wmperry@@cs.indiana.edu}
address@hidden
address@hidden 0pt plus 1filll
-Copyright @copyright{} 1993 - 1995 William M. address@hidden
-Copyright @copyright{} 1996 - 1999 Free Software Foundation
-
-Permission is granted to make and distribute verbatim copies address@hidden
-this manual provided the copyright notice and this permission address@hidden
-are preserved on all copies.
-
 @end titlepage
 @page
 @node Top, Getting Started, (dir), (dir)
@@ -89,7 +77,7 @@ cannot be modified to your satisfaction, please send mail to 
the
 @t{w3-beta@@xemacs.org} mailing list with any suggestions.
 @xref{Reporting Bugs}.
 
-This manual corresponds to Emacs/W3 $State: v4.0pre.47 $
+This manual corresponds to Emacs/W3 $State: Exp $
 
 @menu
 * Getting Started::             Getting up and running with Emacs/W3

commit 7d6c43e977f7b59e2d82bf11a4f2ac227ee6c4e3
Author: Sam Steingold <address@hidden>
Date:   Thu Jun 26 18:43:27 2003 +0000

    (w3-image-loadable-p): fixed the logic

diff --git a/ChangeLog b/ChangeLog
index 4b16fa0..6292591 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,10 @@
+2003-06-26  Sam Steingold  <address@hidden>
+
+       * lisp/w3-imap.el (w3-image-loadable-p): fixed the logic
+
 2003-01-12  Wolfgang Jenkner <address@hidden>
 
-       * lisp/w3.el (w3-fetch-callback) 
+       * lisp/w3.el (w3-fetch-callback)
        (w3-nasty-disgusting-http-equiv-handling): When searching for the
        ':' meaning we are past the 'http/1.x' response, make sure that we
        save-execursion around it, or bad things happen.
@@ -87,7 +91,7 @@
        (w3-java-run-applet): Use url-generate-unique-filename, not
        non-existent mailcap-generate-unique-filename.
 
-       * lisp/w3-menu.el (w3-first-n-items, w3-only-links) 
+       * lisp/w3-menu.el (w3-first-n-items, w3-only-links)
        (w3-fix-spaces): Autoload to avoid compiler warnings.
        (w3-menu-filters-supported-p): Include Emacs 21.
        (w3-menu-links-constructor): Use modern backquote syntax.
@@ -176,7 +180,7 @@
 2001-10-01  Dave Love  <address@hidden>
 
        * lisp/w3-vars.el: Doc fixes.
-       (w3-meta-content-type-charset-regexp) 
+       (w3-meta-content-type-charset-regexp)
        (w3-meta-charset-content-type-regexp): Removed.
        (w3-persistent-variables): Add url-current-mime-headers.
 
@@ -200,7 +204,7 @@
 
 2001-09-09  Dave Love  <address@hidden>
 
-       * lisp/w3-display.el (w3-mode, w3-add-delayed-graphic) 
+       * lisp/w3-display.el (w3-mode, w3-add-delayed-graphic)
        (w3-find-specific-link, w3-fix-spaces): Autoload.
 
        * lisp/w3-props.el (w3-fillin-text-property): Renamed from
@@ -253,7 +257,7 @@
        cl-map-keymap.
        (w3-form-create-custom): Require cus-edit unconditionally.
        (w3-all-widgets): Move definition.
-       (w3-form-create-file-browser, w3-form-create-option-list) 
+       (w3-form-create-file-browser, w3-form-create-option-list)
        (w3-form-default-button-update): Avoid mule-truncate-string.
        (mule-sysdp): Don't require.
        (w3-form-encode-xwfu): Avoid mule-encode-string.
@@ -296,11 +300,11 @@
        * lisp/w3-vars.el (w3-version-number): Fix regexp, doc.
        (w3-html-entities): Modified per W3C entity list.
 
-       * lisp/w3-toolbar.el (w3-toolbar-back-icon, w3-toolbar-forw-icon) 
-       (w3-toolbar-home-icon, w3-toolbar-reld-icon) 
-       (w3-toolbar-imag-icon, w3-toolbar-open-icon) 
-       (w3-toolbar-print-icon, w3-toolbar-find-icon) 
-       (w3-toolbar-stop-icon, w3-toolbar-help-icon) 
+       * lisp/w3-toolbar.el (w3-toolbar-back-icon, w3-toolbar-forw-icon)
+       (w3-toolbar-home-icon, w3-toolbar-reld-icon)
+       (w3-toolbar-imag-icon, w3-toolbar-open-icon)
+       (w3-toolbar-print-icon, w3-toolbar-find-icon)
+       (w3-toolbar-stop-icon, w3-toolbar-help-icon)
        (w3-toolbar-hotl-icon) [(featurep 'tool-bar)]: Initialize to names
        of Emacs 21 icons.
        (toolbar-make-button-list) [(featurep 'tool-bar)]: Don't define.
@@ -322,14 +326,14 @@
 2001-05-31  Dave Love  <address@hidden>
 
        * lisp/w3-menu.el (w3-menu-file-menu): Fix
-       "---:shadowDoubleEtchedIn".  From Pavel Jan-Bík.-A
+       "---:shadowDoubleEtchedIn".  From Pavel Janík.
 
        * lisp/w3-parse.el (decode-char): Define with older Mule-UCS.
        (w3-expand-entity-at-point-maybe): Sanitize regexp for numeric
        entity.  Don't lose trailing space.  Grok hex form.
 
 2001-05-30  Dave Love  <address@hidden>
-       
+
        * lisp/w3-menu.el: Require w3-sysdp.
        (w3-popup-menu): Revert last change.
 
@@ -372,7 +376,7 @@
        to work around a byte-optimizer bug in Emacs 21 that caused this
        module to fail to byte-compile.
 
-2001-05-24  Pavel Jan-Bík <address@hidden>-A
+2001-05-24  Pavel Janík <address@hidden>
 
        * lisp/w3-display.el (w3-resurrect-hyperlinks): Look for next
        single property change from `st' instead of `nd' to avoid
@@ -502,9 +506,9 @@
 
 2001-01-04  Dave Love  <address@hidden>
 
-       * lisp/w3-toolbar.el (w3-add-toolbar-to-buffer) <featurep 'tool-bar>: 
+       * lisp/w3-toolbar.el (w3-add-toolbar-to-buffer) <featurep 'tool-bar>:
        Test display-graphic-p and tool-bar-lines.  Use mapc, not mapcar.
-       
+
 2001-01-03  Dave Love  <address@hidden>
 
        * lisp/w3-toolbar.el (w3-add-toolbar-to-buffer): In Emacs, test
@@ -708,5 +712,5 @@
        face attribute if it is nil.  The new redisplay doesn't like that.
 
 ;; Local Variables:
-;; coding: iso-2022-7bit
+;; coding: utf-8
 ;; End:
diff --git a/lisp/w3-imap.el b/lisp/w3-imap.el
index 893f9da..e03994d 100644
--- a/lisp/w3-imap.el
+++ b/lisp/w3-imap.el
@@ -1,7 +1,7 @@
 ;;; w3-imap.el --- Imagemap functions
-;; Author: $Author: fx $
-;; Created: $Date: 2001/05/14 17:29:25 $
-;; Version: $Revision: 1.3 $
+;; Author: $Author: sds $
+;; Created: $Date: 2003/06/26 18:43:27 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -97,7 +97,7 @@ All arguments are vectors of [X Y] coordinates."
 (defun w3-image-poly-alloc (n)
   (if (< n 3)
       (error "w3-image-poly-alloc: invalid number of sides (%d)" n))
-  
+
   (vector n 0 (make-vector n nil) (make-vector n nil)))
 
 (defun w3-image-poly-assign (p x y)
@@ -209,13 +209,16 @@ vectors."
   `(cdr-safe (assoc ,href w3-graphics-list)))
 
 (defun w3-image-loadable-p (href force)
-  (let ((attribs (url-file-attributes href)))
-    (or force
-       (assoc (nth 8 attribs) w3-allowed-image-types)
-       (null w3-image-size-restriction)
-       (<= (nth 7 attribs) 0)
-       (and (numberp w3-image-size-restriction)
-            (<= (nth 7 attribs) w3-image-size-restriction)))))
+  (or force
+      (let ((attribs (url-file-attributes href)))
+        (and attribs
+             ;; this is clearly an error: `file-attributes' returns
+             ;; the permissions string as the 8th element, not a mime type!
+             ;; (assoc (nth 8 attribs) w3-allowed-image-types)
+             (or (null w3-image-size-restriction)
+                 (and (<= (nth 7 attribs) 0)
+                      (or (not (numberp w3-image-size-restriction))
+                          (<= (nth 7 attribs) w3-image-size-restriction))))))))
 
 (defmacro w3-image-invalid-glyph-p (glyph)
   `(if (vectorp glyph)

commit 380d7602424cac4f454c245d584a5c25f224cd19
Author: William M. Perry <address@hidden>
Date:   Sun Jan 12 22:10:25 2003 +0000

    Fix http-equiv handling bug thanks to Wolfgang Jenkner <address@hidden>

diff --git a/ChangeLog b/ChangeLog
index c2034f2..4b16fa0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2003-01-12  Wolfgang Jenkner <address@hidden>
+
+       * lisp/w3.el (w3-fetch-callback) 
+       (w3-nasty-disgusting-http-equiv-handling): When searching for the
+       ':' meaning we are past the 'http/1.x' response, make sure that we
+       save-execursion around it, or bad things happen.
+
 2002-10-28  Dave Love  <address@hidden>
 
        * lisp/w3-display.el (w3-display-node): Don't use
diff --git a/lisp/w3.el b/lisp/w3.el
index 6e47cb3..e3e6fb5 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 2002/10/28 02:32:11 $
-;; Version: $Revision: 1.31 $
+;; Created: $Date: 2003/01/12 22:10:25 $
+;; Version: $Revision: 1.32 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -248,7 +248,8 @@ Operate on BUFFER."
                         (w3-parse-buffer)))))
                (when http-header
                  (goto-char (point-min))
-                 (unless (search-forward ":" (line-end-position) t)
+                 (unless (save-excursion
+                           (search-forward ":" (line-end-position) t))
                    (forward-line))
                  (insert http-header)))))))))
 
@@ -300,7 +301,8 @@ MUST-BE-VIEWING is the current URL when the timer expires."
       (save-restriction
        (mail-narrow-to-head)
        (goto-char (point-min))
-       (unless (search-forward ":" (line-end-position) t)
+       (unless (save-excursion
+                 (search-forward ":" (line-end-position) t))
          (forward-line))
        (setq headers (mail-header-extract))
        (let (refreshed)

commit 512e3a0528fc9d3df38944844fd53a604df1d38d
Author: Dave Love <address@hidden>
Date:   Mon Oct 28 23:58:07 2002 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index d5c7621..c2034f2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2002-10-28  Dave Love  <address@hidden>
+
+       * lisp/w3-display.el (w3-display-node): Don't use
+       font-running-xemacs.
+
 2002-10-27  William M. Perry  <address@hidden>
 
        * lisp/w3.el (w3-nasty-disgusting-http-equiv-handling): Now takes

commit 2bbf3e094063b7c3be4203c4688f6fe375a427ae
Author: Dave Love <address@hidden>
Date:   Mon Oct 28 23:55:54 2002 +0000

    (w3-display-node): Don't use
    font-running-xemacs.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index d85a270..fd372db 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.42 $
+;; Version: $Revision: 1.43 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2458,7 +2458,7 @@ Format: (((image-alt row column) . offset) ...)")
                 (setf (car w3-face-color) fore)
                 (setf (car w3-face-background-color) back)
 
-                (if (not font-running-xemacs)
+                (if (not (featurep 'xemacs))
                     (setq w3-display-background-properties (cons fore back))
                   (if pixm
                       (w3-maybe-start-background-image-download pixm 'default))

commit a61e788da868f3b40f803940edf5eabc1dcde8a7
Author: William M. Perry <address@hidden>
Date:   Mon Oct 28 02:32:11 2002 +0000

        * lisp/w3.el (w3-nasty-disgusting-http-equiv-handling): Now takes
        a second parameter, which is the URL that is being processed.
        This allows us to set url-current-object in the temporary buffer.
        This fixes the bug where a not-fully-qualified URL would cause
        url-expand-filename to get 'confused' and throw an error.
        (w3-fetch-callback): Pass the new URL argument to
        w3-nasty-disgusting-*

diff --git a/ChangeLog b/ChangeLog
index 626c486..d5c7621 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2002-10-27  William M. Perry  <address@hidden>
+
+       * lisp/w3.el (w3-nasty-disgusting-http-equiv-handling): Now takes
+       a second parameter, which is the URL that is being processed.
+       This allows us to set url-current-object in the temporary buffer.
+       This fixes the bug where a not-fully-qualified URL would cause
+       url-expand-filename to get 'confused' and throw an error.
+       (w3-fetch-callback): Pass the new URL argument to
+       w3-nasty-disgusting-*
+
 2002-10-22  William M. Perry  <address@hidden>
 
        * lisp/w3-forms.el (w3-form-create-option-list): Invalid call to
diff --git a/lisp/w3.el b/lisp/w3.el
index e408a11..6e47cb3 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 2002/10/23 03:33:41 $
-;; Version: $Revision: 1.30 $
+;; Created: $Date: 2002/10/28 02:32:11 $
+;; Version: $Revision: 1.31 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -208,7 +208,7 @@ variable `http-header'."
                                         (cdr (assq 'content attrs))))))))
              (w3-http-equiv-headers (nth 2 node)))))))
 
-(defun w3-nasty-disgusting-http-equiv-handling (buffer)
+(defun w3-nasty-disgusting-http-equiv-handling (buffer url)
   "Propagate information from <meta http-equiv...> elements to MIME headers.
 Operate on BUFFER."
   (let (content-type end-of-headers extra-headers)
@@ -242,6 +242,7 @@ Operate on BUFFER."
                       ;; widening and munging character references
                       ;; &c.
                       (with-temp-buffer
+                        (setq url-current-object (url-generic-parse-url url))
                         (insert-buffer-substring buffer
                                                  end-of-headers end-of-head)
                         (w3-parse-buffer)))))
@@ -292,7 +293,7 @@ MUST-BE-VIEWING is the current URL when the timer expires."
                               (string-to-int (or reload "5"))))))
 
 (defun w3-fetch-callback (url)
-  (w3-nasty-disgusting-http-equiv-handling (current-buffer))
+  (w3-nasty-disgusting-http-equiv-handling (current-buffer) url)
   ;; Process any cookie and refresh headers.
   (let (headers)
     (ignore-errors
@@ -333,18 +334,18 @@ MUST-BE-VIEWING is the current URL when the timer 
expires."
        (setq url-current-mime-headers headers)
        (w3-notify-when-ready (current-buffer))
        (mm-destroy-parts handle))
-       ;;        ((equal (mm-handle-media-type handle) "text/xml")
-       ;;      ;; Special case text/xml if it comes through w3-fetch
-       ;;      (set-buffer (generate-new-buffer " *w3-xml*"))
-       ;;      (mm-disable-multibyte)
-       ;;      (mm-insert-part handle)
-       ;;      (w3-decode-charset handle)
-       ;;      !!! Need some function to view XML nicely... maybe the
-       ;;      !!! customize tree control?
-       ;;      (setq url-current-object (url-generic-parse-url url)
-       ;;            url-current-mime-headers headers)
-       ;;      (mm-destroy-parts handle)
-       ;;      (w3-notify-when-ready (current-buffer)))
+       ;;        ((equal (mm-handle-media-type handle) "text/xml")
+       ;;      ;; Special case text/xml if it comes through w3-fetch
+       ;;      (set-buffer (generate-new-buffer " *w3-xml*"))
+       ;;      (mm-disable-multibyte)
+       ;;      (mm-insert-part handle)
+       ;;      (w3-decode-charset handle)
+       ;;      !!! Need some function to view XML nicely... maybe the
+       ;;      !!! customize tree control?
+       ;;      (setq url-current-object (url-generic-parse-url url)
+       ;;            url-current-mime-headers headers)
+       ;;      (mm-destroy-parts handle)
+       ;;      (w3-notify-when-ready (current-buffer)))
        ((equal (car-safe (mm-handle-type handle))
               "application/x-elisp-parsed-html")
        ;; Also need to special-case pre-parsed representations of HTML.

commit fff9a202d3d71a8055f62655725f513066f78e37
Author: William M. Perry <address@hidden>
Date:   Wed Oct 23 03:33:41 2002 +0000

    Fix select options.  Remove cookie handling - this is all in the http 
loader now.

diff --git a/ChangeLog b/ChangeLog
index de8e02c..626c486 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2002-10-22  William M. Perry  <address@hidden>
+
+       * lisp/w3-forms.el (w3-form-create-option-list): Invalid call to
+       truncate-string-to-width caused all reasonably sized <option>
+       elements in a <select> to be invisible.
+       (w3-form-default-button-update): Similar problem for buttons.
+
+2002-09-17  William M. Perry  <address@hidden>
+
+       * lisp/w3.el (w3-fetch-callback): Removed set-cookie handling.
+       This needs to be handled in the HTTP protocol loader so that
+       cookies that get set on redirects are honored.  This seems to be
+       why my.yahoo.com has stopped working.
+
 2002-09-15  William M. Perry  <address@hidden>
 
        * lisp/w3.el (w3-nasty-disgusting-http-equiv-handling): Need to
diff --git a/lisp/font.el b/lisp/font.el
index be08491..c5a977e 100644
--- a/lisp/font.el
+++ b/lisp/font.el
@@ -2,7 +2,7 @@
 
 ;; Author: wmperry
 ;; Maintainer: Bill Perry <address@hidden>
-;; Created: $Date: 2002/02/01 17:42:48 $
+;; Created: $Date: 2002/10/23 03:33:41 $
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1995, 1996 by William M. Perry <address@hidden>
@@ -30,7 +30,7 @@
 (require 'devices)
 (require 'disp-table)
 
-(when (featurep 'xemacs)
+(when (fboundp 'globally-declare-fboundp)
   (globally-declare-fboundp
    '(x-list-fonts
      mswindows-list-fonts fontsetp get-font-info
diff --git a/lisp/w3-forms.el b/lisp/w3-forms.el
index e0fa890..db05cc6 100644
--- a/lisp/w3-forms.el
+++ b/lisp/w3-forms.el
@@ -1,7 +1,7 @@
 ;;; w3-forms.el --- Emacs-w3 forms parsing code for new display engine
-;; Author: $Author: fx $
-;; Created: $Date: 2001/09/09 15:30:49 $
-;; Version: $Revision: 1.10 $
+;; Author: $Author: wmperry $
+;; Created: $Date: 2002/10/23 03:33:41 $
+;; Version: $Revision: 1.11 $
 ;; Keywords: faces, help, comm, data, languages
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -404,11 +404,12 @@
                       (mapcar
                        (function
                         (lambda (x)
-                          (list 'choice-item :format "%[%t%]"
+                          (list 'choice-item
+                                :format "%[%t%]"
                                 :emacspeak-help 'w3-form-summarize-field
                                 :menu-tag-get (` (lambda (zed) (, (car x))))
                                 :tag (truncate-string-to-width (car x)
-                                                               size ? )
+                                                               size nil ? )
                                 :button-face face
                                 :value-face face
                                 :value (car x))))
@@ -491,7 +492,7 @@
                     (if (eq 'password (w3-form-element-type info))
                         (make-string (length v) ?*)
                       v)
-                    (w3-form-element-size info) ? )))
+                    (w3-form-element-size info) nil ? )))
     v))
 
 (defun w3-form-default-button-callback (widget &rest ignore)
diff --git a/lisp/w3.el b/lisp/w3.el
index 8fef8b5..e408a11 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 2002/09/16 01:43:42 $
-;; Version: $Revision: 1.29 $
+;; Created: $Date: 2002/10/23 03:33:41 $
+;; Version: $Revision: 1.30 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -296,22 +296,20 @@ MUST-BE-VIEWING is the current URL when the timer 
expires."
   ;; Process any cookie and refresh headers.
   (let (headers)
     (ignore-errors
-     (save-restriction
-       (mail-narrow-to-head)
-       (goto-char (point-min))
-       (unless (search-forward ":" (line-end-position) t)
-        (forward-line))
-       (setq headers (mail-header-extract))
-       (let (refreshed)
-        (dolist (header headers)
-          ;; Act on multiple cookies if necessary, but only on a
-          ;; single refresh request in case there's more than one.
-          (case (car header)
-                (set-cookie (url-cookie-handle-set-cookie (cdr header)))
-                ;(set-cookie2 (url-cookie-handle-set-cookie2 (cdr header)))
-                (refresh (unless refreshed
-                           (w3-handle-refresh-header (cdr header))
-                           (setq refreshed t))))))))
+      (save-restriction
+       (mail-narrow-to-head)
+       (goto-char (point-min))
+       (unless (search-forward ":" (line-end-position) t)
+         (forward-line))
+       (setq headers (mail-header-extract))
+       (let (refreshed)
+         (dolist (header headers)
+           ;; Act on multiple cookies if necessary, but only on a
+           ;; single refresh request in case there's more than one.
+           (case (car header)
+             (refresh (unless refreshed
+                        (w3-handle-refresh-header (cdr header))
+                        (setq refreshed t))))))))
     (let ((handle (mm-dissect-buffer t))
          (w3-explicit-coding-system
           (or w3-explicit-coding-system
@@ -335,18 +333,18 @@ MUST-BE-VIEWING is the current URL when the timer 
expires."
        (setq url-current-mime-headers headers)
        (w3-notify-when-ready (current-buffer))
        (mm-destroy-parts handle))
-;;        ((equal (mm-handle-media-type handle) "text/xml")
-;;     ;; Special case text/xml if it comes through w3-fetch
-;;     (set-buffer (generate-new-buffer " *w3-xml*"))
-;;     (mm-disable-multibyte)
-;;     (mm-insert-part handle)
-;;     (w3-decode-charset handle)
-;;      !!! Need some function to view XML nicely... maybe the
-;;      !!! customize tree control?
-;;     (setq url-current-object (url-generic-parse-url url)
-;;           url-current-mime-headers headers)
-;;     (mm-destroy-parts handle)
-;;     (w3-notify-when-ready (current-buffer)))
+       ;;        ((equal (mm-handle-media-type handle) "text/xml")
+       ;;      ;; Special case text/xml if it comes through w3-fetch
+       ;;      (set-buffer (generate-new-buffer " *w3-xml*"))
+       ;;      (mm-disable-multibyte)
+       ;;      (mm-insert-part handle)
+       ;;      (w3-decode-charset handle)
+       ;;      !!! Need some function to view XML nicely... maybe the
+       ;;      !!! customize tree control?
+       ;;      (setq url-current-object (url-generic-parse-url url)
+       ;;            url-current-mime-headers headers)
+       ;;      (mm-destroy-parts handle)
+       ;;      (w3-notify-when-ready (current-buffer)))
        ((equal (car-safe (mm-handle-type handle))
               "application/x-elisp-parsed-html")
        ;; Also need to special-case pre-parsed representations of HTML.
@@ -356,7 +354,7 @@ MUST-BE-VIEWING is the current URL when the timer expires."
        ((mm-inlinable-p handle)
        ;; We can view it inline!
        (set-buffer (generate-new-buffer url))
-       (require 'mm-view)              ; make sure methods are defined
+       (require 'mm-view)             ; make sure methods are defined
        (mm-display-part handle)
        (set-buffer-modified-p nil)
        (w3-mode)

commit a50f82b09b8c9ecc832a2cd5d5825dfbe6247a33
Author: William M. Perry <address@hidden>
Date:   Mon Sep 16 01:43:42 2002 +0000

    Fix cookie handling.

diff --git a/ChangeLog b/ChangeLog
index 4827a58..de8e02c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2002-09-15  William M. Perry  <address@hidden>
+
+       * lisp/w3.el (w3-nasty-disgusting-http-equiv-handling): Need to
+       make sure that we skip the 'HTTP/1.x' line at the top of the
+       buffer (due to changes in the url library), or we end up confusing
+       mail-header-extract if there are any <meta> elements with
+       http-equiv headers in them.
+       (w3-fetch-callback): I'm an idiot and was trying to compare the
+       VALUE of a header against the actual header name for doing cookie
+       handling.  Arguably this cookie handling should all be done in the
+       HTTP handler itself.  Should move it somebday.
+
 2002-02-01  William M. Perry  <address@hidden>
 
        * lisp/w3.el (w3-fetch-callback): Fiddling with how to display XML
diff --git a/lisp/w3.el b/lisp/w3.el
index 1419e9d..8fef8b5 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 2002/02/01 17:42:49 $
-;; Version: $Revision: 1.28 $
+;; Created: $Date: 2002/09/16 01:43:42 $
+;; Version: $Revision: 1.29 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -247,6 +247,8 @@ Operate on BUFFER."
                         (w3-parse-buffer)))))
                (when http-header
                  (goto-char (point-min))
+                 (unless (search-forward ":" (line-end-position) t)
+                   (forward-line))
                  (insert http-header)))))))))
 
 (defun w3-setup-reload-timer (url must-be-viewing &optional time)
@@ -304,8 +306,9 @@ MUST-BE-VIEWING is the current URL when the timer expires."
         (dolist (header headers)
           ;; Act on multiple cookies if necessary, but only on a
           ;; single refresh request in case there's more than one.
-          (case (cdr header)
+          (case (car header)
                 (set-cookie (url-cookie-handle-set-cookie (cdr header)))
+                ;(set-cookie2 (url-cookie-handle-set-cookie2 (cdr header)))
                 (refresh (unless refreshed
                            (w3-handle-refresh-header (cdr header))
                            (setq refreshed t))))))))

commit 2ce1b75bfaf8c1b4db270ae1accdde81b2c2cd52
Author: Sam Steingold <address@hidden>
Date:   Sun May 19 16:42:52 2002 +0000

    ignore generated files

diff --git a/etc/.cvsignore b/etc/.cvsignore
new file mode 100644
index 0000000..f3c7a7c
--- /dev/null
+++ b/etc/.cvsignore
@@ -0,0 +1 @@
+Makefile
diff --git a/lisp/.cvsignore b/lisp/.cvsignore
new file mode 100644
index 0000000..e72d50b
--- /dev/null
+++ b/lisp/.cvsignore
@@ -0,0 +1,5 @@
+Makefile
+auto-autoloads.el
+custom-load.el
+w3-auto.el
+w3-cfg.el
diff --git a/texi/.cvsignore b/texi/.cvsignore
new file mode 100644
index 0000000..c4df0aa
--- /dev/null
+++ b/texi/.cvsignore
@@ -0,0 +1,2 @@
+*.info*
+Makefile

commit bf6e41dd7b563242d5b1a60a4a40cefe8a2ff90d
Author: William M. Perry <address@hidden>
Date:   Thu Feb 21 14:43:44 2002 +0000

    Make sure we compile and install w3-fast-parse.el[c]

diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index a47a9cc..beffe31 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -32,6 +32,7 @@ W3_SOURCES =                                                  
        \
        w3-emacs.el                                                     \
        w3-emulate.el                                                   \
        w3-forms.el                                                     \
+       w3-fast-parse.el                                                \
        w3-hot.el                                                       \
        w3-hotindex.el                                                  \
        w3-imap.el                                                      \

commit 13c765b43b97e9ca2640a9ecff7455bbbe2dcce8
Author: Dave Love <address@hidden>
Date:   Wed Feb 6 11:36:36 2002 +0000

    Fix last change.

diff --git a/lisp/ssl.el b/lisp/ssl.el
index 4db1b2d..1e4f78d 100644
--- a/lisp/ssl.el
+++ b/lisp/ssl.el
@@ -1,6 +1,6 @@
 ;;; ssl.el,v --- ssl functions for Emacsen without them builtin
 ;; Author: William M. Perry <address@hidden>
-;; $Revision: 1.4 $
+;; $Revision: 1.5 $
 ;; Keywords: comm
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -212,8 +212,7 @@ specifying a port number to connect to."
   (if (integerp service) (setq service (int-to-string service)))
   (let* ((process-connection-type nil)
         (port service)
-        (proc (eval
-               (start-process name buffer ,@(ssl-get-command)))))
+        (proc (eval `(start-process name buffer ,@(ssl-get-command)))))
     (process-kill-without-query proc)
     proc))
 

commit 733a144456e79f2ca570cf481df37692cdbcc259
Author: William M. Perry <address@hidden>
Date:   Fri Feb 1 17:42:48 2002 +0000

    2002-02-01  William M. Perry  <address@hidden>
    
        * lisp/w3.el (w3-fetch-callback): Fiddling with how to display XML
        by default.
    
        * lisp/w3-widget.el: Attempt to make images work with Emacs 21.
    
        * lisp/w3-display.el (w3-display-node): Revert change for <hr>
        handling.
    
        * lisp/images.el: Use (featurep 'xemacs) instead of
        string-matching on emacs-version.
    
    2001-12-11  William M. Perry  <address@hidden>
    
        * lisp/devices.el: Remove ancient NextStep support.
    
        * lisp/font.el: Merge with the version from XEmacs 21.5.  This
        pulls in lots of GTK fixes that I made ages ago.  Also removes
        ancient, unworking NextStep support.  Use new backquote syntax
        (emacs 19 can go away now).

diff --git a/ChangeLog b/ChangeLog
index ade6b89..4827a58 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+2002-02-01  William M. Perry  <address@hidden>
+
+       * lisp/w3.el (w3-fetch-callback): Fiddling with how to display XML
+       by default.
+
+       * lisp/w3-widget.el: Attempt to make images work with Emacs 21.
+
+       * lisp/w3-display.el (w3-display-node): Revert change for <hr>
+       handling.
+
+       * lisp/images.el: Use (featurep 'xemacs) instead of
+       string-matching on emacs-version.
+
+2001-12-11  William M. Perry  <address@hidden>
+
+       * lisp/devices.el: Remove ancient NextStep support.
+
+       * lisp/font.el: Merge with the version from XEmacs 21.5.  This
+       pulls in lots of GTK fixes that I made ages ago.  Also removes
+       ancient, unworking NextStep support.  Use new backquote syntax
+       (emacs 19 can go away now).
+
 2002-01-22  Dave Love  <address@hidden>
 
        * lisp/css.el (css-color-values): Maybe use `color-values'.
@@ -252,7 +274,7 @@
 2001-05-31  Dave Love  <address@hidden>
 
        * lisp/w3-menu.el (w3-menu-file-menu): Fix
-       "---:shadowDoubleEtchedIn".  From Pavel Jan,Bm(Bk.
+       "---:shadowDoubleEtchedIn".  From Pavel Jan-Bík.-A
 
        * lisp/w3-parse.el (decode-char): Define with older Mule-UCS.
        (w3-expand-entity-at-point-maybe): Sanitize regexp for numeric
@@ -302,7 +324,7 @@
        to work around a byte-optimizer bug in Emacs 21 that caused this
        module to fail to byte-compile.
 
-2001-05-24  Pavel Jan,Bm(Bk <address@hidden>
+2001-05-24  Pavel Jan-Bík <address@hidden>-A
 
        * lisp/w3-display.el (w3-resurrect-hyperlinks): Look for next
        single property change from `st' instead of `nd' to avoid
diff --git a/lisp/devices.el b/lisp/devices.el
index 71ed43e..72d842d 100644
--- a/lisp/devices.el
+++ b/lisp/devices.el
@@ -1,7 +1,7 @@
 ;;; devices.el -- XEmacs device API emulation
-;; Author: $Author: fx $
-;; Created: $Date: 2002/01/22 18:33:38 $
-;; Version: $Revision: 1.3 $
+;; Author: $Author: wmperry $
+;; Created: $Date: 2002/02/01 17:42:48 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -31,28 +31,26 @@
 ;; XEmacs 19.14.  A 'device' for Emacs 19 is just a frame, from which we can
 ;; determine the connection to an X display, etc.
 
-(eval-when-compile (require 'cl))
 (eval-when-compile
-  (if (string-match "XEmacs" (emacs-version))
-      (set 'byte-optimize nil)))
+  (require 'cl)
+  (when (featurep 'xemacs)
+    (set 'byte-optimize nil)))
     
-(if (string-match "XEmacs" (emacs-version))
-    nil
-'()
-(defalias 'selected-device 'ignore)
-(defalias 'device-or-frame-p 'framep)
-(defalias 'device-console 'ignore)
-(defalias 'device-sound-enabled-p 'ignore)
-(defalias 'device-live-p 'frame-live-p)
-(defalias 'devicep 'framep)
-(defalias 'frame-device 'identity)
-(defalias 'redisplay-device 'redraw-frame)
-(defalias 'redraw-device 'redraw-frame)
-(defalias 'select-device 'select-frame)
-(defalias 'set-device-class 'ignore)
-
-(defun make-device (type connection &optional props)
-  "Create a new device of type TYPE, attached to connection CONNECTION.
+(when (not (featurep 'xemacs))
+  (defalias 'selected-device 'ignore)
+  (defalias 'device-or-frame-p 'framep)
+  (defalias 'device-console 'ignore)
+  (defalias 'device-sound-enabled-p 'ignore)
+  (defalias 'device-live-p 'frame-live-p)
+  (defalias 'devicep 'framep)
+  (defalias 'frame-device 'identity)
+  (defalias 'redisplay-device 'redraw-frame)
+  (defalias 'redraw-device 'redraw-frame)
+  (defalias 'select-device 'select-frame)
+  (defalias 'set-device-class 'ignore)
+
+  (defun make-device (type connection &optional props)
+    "Create a new device of type TYPE, attached to connection CONNECTION.
 
 The valid values for CONNECTION are device-specific; however,
 CONNECTION is generally a string. (Specifically, for X devices,
@@ -67,18 +65,18 @@ device creation.
 If CONNECTION specifies an already-existing device connection, that
 device is simply returned; no new device is created, and PROPS
 have no effect."
-  (cond
-   ((and (eq type 'x) connection)
-    (make-frame-on-display connection props))
-   ((eq type 'x)
-    (make-frame props))
-   ((eq type 'tty)
-    nil)
-   (t
-    (error "Unsupported device-type: %s" type))))
-
-(defun make-frame-on-device (type connection &optional props)
-  "Create a frame of type TYPE on CONNECTION.
+    (cond
+     ((and (eq type 'x) connection)
+      (make-frame-on-display connection props))
+     ((eq type 'x)
+      (make-frame props))
+     ((eq type 'tty)
+      nil)
+     (t
+      (error "Unsupported device-type: %s" type))))
+
+  (defun make-frame-on-device (type connection &optional props)
+    "Create a frame of type TYPE on CONNECTION.
 TYPE should be a symbol naming the device type, i.e. one of
 
 x      An X display.  CONNECTION should be a standard display string
@@ -100,249 +98,230 @@ PROPS should be an plist of properties, as in the call 
to `make-frame'.
 
 If a connection to CONNECTION already exists, it is reused; otherwise,
 a new connection is opened."
-  (make-device type connection props))
+    (make-device type connection props))
 
-(defun make-tty-device (&optional tty terminal-type)
-  "Create a new device on TTY.
+  (defun make-tty-device (&optional tty terminal-type)
+    "Create a new device on TTY.
   TTY should be the name of a tty device file (e.g. \"/dev/ttyp3\" under
 SunOS et al.), as returned by the `tty' command.  A value of nil means
 use the stdin and stdout as passed to XEmacs from the shell.
   If TERMINAL-TYPE is non-nil, it should be a string specifying the
 type of the terminal attached to the specified tty.  If it is nil,
 the terminal type will be inferred from the TERM environment variable."
-  (make-device 'tty tty (list 'terminal-type terminal-type)))
+    (make-device 'tty tty (list 'terminal-type terminal-type)))
 
-(defun make-x-device (&optional display)
-  (make-device 'x display))
+  (defun make-x-device (&optional display)
+    (make-device 'x display))
 
-(defun set-device-selected-frame (device frame)
-  "Set the selected frame of device object DEVICE to FRAME.
+  (defun set-device-selected-frame (device frame)
+    "Set the selected frame of device object DEVICE to FRAME.
 If DEVICE is nil, the selected device is used.
 If DEVICE is the selected device, this makes FRAME the selected frame."
-  (select-frame frame))
+    (select-frame frame))
 
-(defun set-device-baud-rate (device rate)
-  "Set the output baud rate of DEVICE to RATE.
+  (defun set-device-baud-rate (device rate)
+    "Set the output baud rate of DEVICE to RATE.
 On most systems, changing this value will affect the amount of padding
 and other strategic decisions made during redisplay."
-  (setq baud-rate rate))
+    (setq baud-rate rate))
 
-(defun dfw-device (obj)
-  "Given a device, frame, or window, return the associated device.
+  (defun dfw-device (obj)
+    "Given a device, frame, or window, return the associated device.
 Return nil otherwise."
-  (cond
-   ((windowp obj)
-    (window-frame obj))
-   ((framep obj)
-    obj)
-   (t
-    nil)))
-
-(defun event-device (event)
-  "Return the device that EVENT occurred on.
+    (cond
+     ((windowp obj)
+      (window-frame obj))
+     ((framep obj)
+      obj)
+     (t
+      nil)))
+
+  (defun event-device (event)
+    "Return the device that EVENT occurred on.
 This will be nil for some types of events (e.g. keyboard and eval events)."
-  (dfw-device (posn-window (event-start event))))
+    (dfw-device (posn-window (event-start event))))
 
-(defun device-connection (&optional device)
-  "Return the connection of the specified device.
+  (defun device-connection (&optional device)
+    "Return the connection of the specified device.
 DEVICE defaults to the selected device if omitted"
-  (or (cdr-safe (assq 'display (frame-parameters device))) "stdio"))
+    (or (cdr-safe (assq 'display (frame-parameters device))) "stdio"))
 
-(defun find-device (connection &optional type)
-  "Look for an existing device attached to connection CONNECTION.
+  (defun find-device (connection &optional type)
+    "Look for an existing device attached to connection CONNECTION.
 Return the device if found; otherwise, return nil.
 
 If TYPE is specified, only return devices of that type; otherwise,
 return devices of any type. (It is possible, although unlikely,
 that two devices of different types could have the same connection
 name; in such a case, the first device found is returned.)"
-  (let ((devices (device-list))
-       (retval nil))
-    (while (and devices (not nil))
-      (if (equal connection (device-connection (car devices)))
-         (setq retval (car devices)))
-      (setq devices (cdr devices)))
-    retval))
-
-(defalias 'get-device 'find-device)
-
-(defmacro device-baud-rate (&optional device)
-  "Return the output baud rate of DEVICE."
-  'baud-rate)
-
-(defun device-on-window-system-p (&optional device)
-  "Return non-nil if DEVICE is on a window system.
+    (let ((devices (device-list))
+         (retval nil))
+      (while (and devices (not nil))
+       (if (equal connection (device-connection (car devices)))
+           (setq retval (car devices)))
+       (setq devices (cdr devices)))
+      retval))
+
+  (defalias 'get-device 'find-device)
+
+  (defmacro device-baud-rate (&optional device)
+    "Return the output baud rate of DEVICE."
+    'baud-rate)
+
+  (defun device-on-window-system-p (&optional device)
+    "Return non-nil if DEVICE is on a window system.
 This generally means that there is support for the mouse, the menubar,
 the toolbar, glyphs, etc."
-  (and (cdr-safe (assq 'display (frame-parameters device))) t))
+    (and (cdr-safe (assq 'display (frame-parameters device))) t))
 
-(defun device-name (&optional device)
-  "Return the name of the specified device."
-  (or (cdr-safe (assq 'display (frame-parameters device))) "stdio"))
+  (defun device-name (&optional device)
+    "Return the name of the specified device."
+    (or (cdr-safe (assq 'display (frame-parameters device))) "stdio"))
 
-(defun device-frame-list (&optional device)
-  "Return a list of all frames on DEVICE.
+  (defun device-frame-list (&optional device)
+    "Return a list of all frames on DEVICE.
 If DEVICE is nil, the selected device will be used."
-  (let ((desired (device-connection device)))
-    (filtered-frame-list (function (lambda (x) (equal (device-connection x)
-                                                     desired))))))
-(defun device-list ()
-  "Return a list of all devices"
-  (let ((seen nil)
-       (cur nil)
-       (conn nil)
-       (retval nil)
-       (not-heard (frame-list)))
-    (while not-heard
-      (setq cur (car not-heard)
-           conn (device-connection cur)
-           not-heard (cdr not-heard))
-      (if (member conn seen)
-         nil                           ; Already got it
-       (setq seen (cons conn seen)     ; Whoo hoo, a new one!
-             retval (cons cur retval))))
-    retval))
-
-(defvar delete-device-hook nil
-  "Function or functions to call when a device is deleted.
+    (let ((desired (device-connection device)))
+      (filtered-frame-list (function (lambda (x) (equal (device-connection x)
+                                                       desired))))))
+  (defun device-list ()
+    "Return a list of all devices"
+    (let ((seen nil)
+         (cur nil)
+         (conn nil)
+         (retval nil)
+         (not-heard (frame-list)))
+      (while not-heard
+       (setq cur (car not-heard)
+             conn (device-connection cur)
+             not-heard (cdr not-heard))
+       (if (member conn seen)
+           nil                         ; Already got it
+         (setq seen (cons conn seen)   ; Whoo hoo, a new one!
+               retval (cons cur retval))))
+      retval))
+
+  (defvar delete-device-hook nil
+    "Function or functions to call when a device is deleted.
 One argument, the to-be-deleted device.")
 
-(defun delete-device (device &optional force)
-  "Delete DEVICE, permanently eliminating it from use.
+  (defun delete-device (device &optional force)
+    "Delete DEVICE, permanently eliminating it from use.
 Normally, you cannot delete the last non-minibuffer-only frame (you must
 use `save-buffers-kill-emacs' or `kill-emacs').  However, if optional
 second argument FORCE is non-nil, you can delete the last frame. (This
 will automatically call `save-buffers-kill-emacs'.)"
-  (let ((frames (device-frame-list device)))
-    (run-hook-with-args 'delete-device-hook device)
-    (while frames
-      (delete-frame (car frames) force)
-      (setq frames (cdr frames)))))
-
-(defun device-color-cells (&optional device)
-  (case window-system
-    ((x win32 w32 pm) (x-display-color-cells device))
-    (ns (ns-display-color-cells device))
-    (otherwise 1)))
-
-(defun device-pixel-width (&optional device)
-  (case window-system
-    ((x win32 w32 pm) (x-display-pixel-width device))
-    (ns (ns-display-pixel-width device))
-    (otherwise (frame-width device))))
-
-(defun device-pixel-height (&optional device)
-  (case window-system
-    ((x win32 w32 pm) (x-display-pixel-height device))
-    (ns (ns-display-pixel-height device))
-    (otherwise (frame-height device))))
-
-(defun device-mm-width (&optional device)
-  (case window-system
-    ((x win32 w32 pm) (x-display-mm-width device))
-    (ns (ns-display-mm-width device))
-    (otherwise nil)))
-
-(defun device-mm-height (&optional device)
-  (case window-system
-    ((x win32 w32 pm) (x-display-mm-height device))
-    (ns (ns-display-mm-height device))
-    (otherwise nil)))
-
-(defun device-bitplanes (&optional device)
-  (case window-system
-    ((x win32 w32 pm) (x-display-planes device))
-    (ns (ns-display-planes device))
-    (otherwise 2)))
-
-(defun device-class (&optional device)
-  (if (fboundp 'display-color-p)
-      (if (display-color-p device)
-         'color
-       (if (display-grayscale-p device)
-           'grayscale
-         'mono))
+    (let ((frames (device-frame-list device)))
+      (run-hook-with-args 'delete-device-hook device)
+      (while frames
+       (delete-frame (car frames) force)
+       (setq frames (cdr frames)))))
+
+  (defun device-color-cells (&optional device)
+    (case window-system
+      ((x win32 w32 pm) (x-display-color-cells device))
+      (otherwise 1)))
+
+  (defun device-pixel-width (&optional device)
+    (case window-system
+      ((x win32 w32 pm) (x-display-pixel-width device))
+      (otherwise (frame-width device))))
+
+  (defun device-pixel-height (&optional device)
+    (case window-system
+      ((x win32 w32 pm) (x-display-pixel-height device))
+      (otherwise (frame-height device))))
+
+  (defun device-mm-width (&optional device)
+    (case window-system
+      ((x win32 w32 pm) (x-display-mm-width device))
+      (otherwise nil)))
+
+  (defun device-mm-height (&optional device)
+    (case window-system
+      ((x win32 w32 pm) (x-display-mm-height device))
+      (otherwise nil)))
+
+  (defun device-bitplanes (&optional device)
     (case window-system
-      (x                ; X11
-       (cond
-       ((fboundp 'x-display-visual-class)
-        (let ((val (symbol-name (x-display-visual-class device))))
-          (cond
-           ((string-match "color" val) 'color)
-           ((string-match "gray-scale" val) 'grayscale)
-           (t 'mono))))
-       ((fboundp 'x-display-color-p)
-        (if (x-display-color-p device)
-            'color
-          'mono))
-       (t 'color)))
-      (pm ; OS/2 Presentation Manager
-       (cond
-       ((fboundp 'pm-display-visual-class)
-        (let ((val (symbol-name (pm-display-visual-class device))))
-          (cond
-           ((string-match "color" val) 'color)
-           ((string-match "gray-scale" val) 'grayscale)
-           (t 'mono))))
-       ((fboundp 'pm-display-color-p)
-        (if (pm-display-color-p device)
-            'color
-          'mono))
-       (t 'color)))
-      (ns
-       (cond
-       ((fboundp 'ns-display-visual-class)
-        (let ((val (symbol-name (ns-display-visual-class device))))
-          (cond
-           ((string-match "color" val) 'color)
-           ((string-match "gray-scale" val) 'grayscale)
-           (t 'mono))))
-       ((fboundp 'ns-display-color-p)
-        (if (ns-display-color-p device)
-            'color
-          'mono))
-       (t 'mono)))
-      (otherwise 'color))))
-
-(defun device-class-list ()
-  "Returns a list of valid device classes."
-  (list 'color 'grayscale 'mono))
-
-(defun valid-device-class-p (class)
-  "Given a CLASS, return t if it is valid.
+      ((x win32 w32 pm) (x-display-planes device))
+      (otherwise 2)))
+
+  (defun device-class (&optional device)
+    (if (fboundp 'display-color-p)
+       (if (display-color-p device)
+           'color
+         (if (display-grayscale-p device)
+             'grayscale
+           'mono))
+      (case window-system
+       (x                              ; X11
+        (cond
+         ((fboundp 'x-display-visual-class)
+          (let ((val (symbol-name (x-display-visual-class device))))
+            (cond
+             ((string-match "color" val) 'color)
+             ((string-match "gray-scale" val) 'grayscale)
+             (t 'mono))))
+         ((fboundp 'x-display-color-p)
+          (if (x-display-color-p device)
+              'color
+            'mono))
+         (t 'color)))
+       (pm                             ; OS/2 Presentation Manager
+        (cond
+         ((fboundp 'pm-display-visual-class)
+          (let ((val (symbol-name (pm-display-visual-class device))))
+            (cond
+             ((string-match "color" val) 'color)
+             ((string-match "gray-scale" val) 'grayscale)
+             (t 'mono))))
+         ((fboundp 'pm-display-color-p)
+          (if (pm-display-color-p device)
+              'color
+            'mono))
+         (t 'color)))
+       (otherwise 'color))))
+
+  (defun device-class-list ()
+    "Returns a list of valid device classes."
+    (list 'color 'grayscale 'mono))
+
+  (defun valid-device-class-p (class)
+    "Given a CLASS, return t if it is valid.
 Valid classes are 'color, 'grayscale, and 'mono."
-  (memq class (device-class-list)))
+    (memq class (device-class-list)))
 
-(defun device-or-frame-type (device-or-frame)
-  "Return the type (e.g. `x' or `tty') of DEVICE-OR-FRAME.
+  (defun device-or-frame-type (device-or-frame)
+    "Return the type (e.g. `x' or `tty') of DEVICE-OR-FRAME.
 DEVICE-OR-FRAME should be a device or a frame object.  See `device-type'
 for a description of the possible types."
-  (or window-system 'tty))
+    (or window-system 'tty))
 
-(defun device-type (&optional device)
-  "Return the type of the specified device (e.g. `x' or `tty').
+  (defun device-type (&optional device)
+    "Return the type of the specified device (e.g. `x' or `tty').
 Value is `tty' for a tty device (a character-only terminal),
 `x' for a device which is a connection to an X server,
 'ns' for a device which is a connection to a NeXTStep dps server,
 'win32' or 'w32' for a Windows-NT window,
 'pm' for an OS/2 Presentation Manager window,
 'intuition' for an Amiga screen"
-  (device-or-frame-type device))
+    (device-or-frame-type device))
 
-(defun device-type-list ()
-  "Return a list of valid console types."
-  (if window-system
-      (list window-system 'tty)
-    (list 'tty)))
+  (defun device-type-list ()
+    "Return a list of valid console types."
+    (if window-system
+       (list window-system 'tty)
+      (list 'tty)))
 
-(defun valid-device-type-p (type)
-  "Given a TYPE, return t if it is valid."
-  (memq type (device-type-list)))
+  (defun valid-device-type-p (type)
+    "Given a TYPE, return t if it is valid."
+    (memq type (device-type-list)))
 
-) ; This closes the conditional on whether we are in XEmacs or not
+  )   ; This closes the conditional on whether we are in XEmacs or not
 
 (provide 'devices)
 
 (eval-when-compile
-  (if (string-match "XEmacs" (emacs-version))
-      (set 'byte-optimize t)))
+  (when (featurep 'xemacs)
+    (set 'byte-optimize t)))
diff --git a/lisp/font.el b/lisp/font.el
index f0c0e91..be08491 100644
--- a/lisp/font.el
+++ b/lisp/font.el
@@ -1,8 +1,8 @@
 ;;; font.el --- New font model
-;; Author: $Author: fx $
-;; Created: $Date: 2002/01/22 18:55:35 $
-;; Version: $Revision: 1.10 $
-;; Keywords: faces
+
+;; Author: wmperry
+;; Maintainer: Bill Perry <address@hidden>
+;; Created: $Date: 2002/02/01 17:42:48 $
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1995, 1996 by William M. Perry <address@hidden>
@@ -26,46 +26,29 @@
 ;;; Boston, MA 02111-1307, USA.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; The emacsen compatibility package - load it up before anything else
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (eval-when-compile (require 'cl))
 (require 'devices)
-
-;; Needed for XEmacs 19.13, noop on all others, since it is always loaded.
 (require 'disp-table)
 
-(eval-and-compile
-  (condition-case ()
-      (require 'custom)
-    (error nil))
-  (if (and (featurep 'custom) (fboundp 'custom-declare-variable))
-      nil ;; We've got what we needed
-    ;; We have the old custom-library, hack around it!
-    (defmacro defgroup (&rest args)
-      nil)
-    (defmacro defcustom (var value doc &rest args)
-      (` (defvar (, var) (, value) (, doc))))))
+(when (featurep 'xemacs)
+  (globally-declare-fboundp
+   '(x-list-fonts
+     mswindows-list-fonts fontsetp get-font-info
+     get-fontset-info mswindows-define-rgb-color cancel-function-timers
+     ;; #### perhaps we should rewrite font-warn to avoid the warning
+     font-warn))
+
+  (globally-declare-boundp
+   '(global-face-data
+     x-font-regexp x-font-regexp-foundry-and-family)))
 
 (if (not (fboundp 'try-font-name))
     (defun try-font-name (fontname &rest args)
       (case window-system
-       ((x win32 w32 pm) (car-safe (x-list-fonts fontname)))
+       ((x pm) (car-safe (x-list-fonts fontname)))
        (mswindows (car-safe (mswindows-list-fonts fontname)))
        (otherwise nil))))
 
-(if (not (fboundp 'facep))
-    (defun facep (face)
-      "Return t if X is a face name or an internal face vector."
-      (declare (special global-face-data))
-      (if (not window-system)
-         ;; FIXME if FSF ever does TTY faces
-         ;; Well, they fixed it for us by finally defining facep! 12/5/1999
-         nil
-       (and (or (internal-facep face)
-                (and (symbolp face) (assq face global-face-data)))
-            t))))
-
 (if (not (fboundp 'set-face-property))
     (defun set-face-property (face property value &optional locale
                                   tag-set how-to-add)
@@ -84,29 +67,15 @@
   (if (not (fboundp '|))    (defalias '| 'logior))
   (if (not (fboundp '~))    (defalias '~ 'lognot))
   (if (not (fboundp '>>))   (defun >> (value count) (<< value (- count)))))
+
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Lots of variables / keywords for use later in the program
 ;;; Not much should need to be modified
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defconst font-running-xemacs (string-match "XEmacs" (emacs-version))
-  "Whether we are running in XEmacs or not.")
-
-(defconst font-running-emacs-new-redisplay (and (fboundp 'set-face-attribute)
-                                               (fboundp 
'set-face-background-pixmap))
-  "Whether we are running in Emacs with the new redisplay engine.")
-
-(defmacro define-font-keywords (&rest keys)
-  (`
-   (eval-and-compile
-     (let ((keywords (quote (, keys))))
-       (while keywords
-        (or (boundp (car keywords))
-            (set (car keywords) (car keywords)))
-        (setq keywords (cdr keywords)))))))
-
 (defconst font-window-system-mappings
-  '((x        . (x-font-create-name x-font-create-object))
+  '((x         . (x-font-create-name x-font-create-object))
+    (gtk       . (x-font-create-name x-font-create-object))
     (mswindows . (mswindows-font-create-name mswindows-font-create-object))
     (win32    . (x-font-create-name x-font-create-object))
     (w32      . (x-font-create-name x-font-create-object))
@@ -115,16 +84,19 @@
   "Alist mapping device types to functions.
 The functions are used to create a font name from a font structure.")
 
-(defconst ns-font-weight-mappings
-  '((:extra-light . "extralight")
-    (:light       . "light")
-    (:demi-light  . "demilight")
-    (:medium      . "medium")
-    (:normal      . "medium")
-    (:demi-bold   . "demibold")
-    (:bold        . "bold")
-    (:extra-bold  . "extrabold"))
-  "Alist mapping keywords to actual NeXTstep specific information to use.")
+(defconst font-emacs21-weight-mappings
+  '((:extra-light . extra-light)
+    (:light       . light)
+    (:demi-light  . semi-light)
+    (:demi        . semi-light)
+    (:book        . normal)
+    (:medium      . normal)
+    (:normal      . normal)
+    (:demi-bold   . semi-bold)
+    (:bold        . bold)
+    (:extra-bold  . extra-bold))
+  "An assoc list mapping font weights to the actual symbols used by
+the Emacs21 redisplay engine.")
 
 (defconst x-font-weight-mappings
   '((:extra-light . "extralight")
@@ -140,19 +112,6 @@ The functions are used to create a font name from a font 
structure.")
   "Alist mapping keywords to actual X-specific strings.
 These are for use in the `weight' field of an X font string.")
 
-(defconst font-new-redisplay-weight-mappings
-  '((:extra-light . extra-light)
-    (:light       . light)
-    (:demi-light  . semi-light)
-    (:demi        . semi-light)
-    (:book        . normal)
-    (:medium      . normal)
-    (:normal      . normal)
-    (:demi-bold   . semi-bold)
-    (:bold        . bold)
-    (:extra-bold  . extra-bold))
-  "Alist mapping font weights to symbols used by the new redisplay engine.")
-
 (defconst font-possible-weights
   (mapcar 'car x-font-weight-mappings))
 
@@ -162,98 +121,90 @@ These are for use in the `weight' field of an X font 
string.")
 (defvar font-maximum-slippage "1pt"
   "How much a font is allowed to vary from the desired size.")
 
-(define-font-keywords :family :style :size :registry :encoding)
-
-(define-font-keywords
-  :weight :extra-light :light :demi-light :medium :normal :regular
-  :demi-bold :bold :extra-bold)
-
 (defvar font-style-keywords nil)
 
-(defsubst set-font-family (fontobj family)
+(defun set-font-family (fontobj family)
   (aset fontobj 1 family))
 
-(defsubst set-font-weight (fontobj weight)
+(defun set-font-weight (fontobj weight)
   (aset fontobj 3 weight))
 
-(defsubst set-font-style (fontobj style)
+(defun set-font-style (fontobj style)
   (aset fontobj 5 style))
 
-(defsubst set-font-size (fontobj size)
+(defun set-font-size (fontobj size)
   (aset fontobj 7 size))
 
-(defsubst set-font-registry (fontobj reg)
+(defun set-font-registry (fontobj reg)
   (aset fontobj 9 reg))
 
 (defsubst font-set-font-encoding (fontobj enc)
   (aset fontobj 11 enc))
 
-(defsubst font-family (fontobj)
+(defun font-family (fontobj)
   (aref fontobj 1))
 
-(defsubst font-weight (fontobj)
+(defun font-weight (fontobj)
   (aref fontobj 3))
 
-(defsubst font-style (fontobj)
+(defun font-style (fontobj)
   (aref fontobj 5))
 
-(defsubst font-size (fontobj)
+(defun font-size (fontobj)
   (aref fontobj 7))
 
-(defsubst font-registry (fontobj)
+(defun font-registry (fontobj)
   (aref fontobj 9))
 
-(defsubst font-encoding (fontobj)
+(defun font-encoding (fontobj)
   (aref fontobj 11))
 
 (eval-when-compile
   (defmacro define-new-mask (attr mask)
-    (`
-     (progn
+    `(progn
        (setq font-style-keywords
-            (cons (cons (quote (, attr))
+            (cons (cons (quote ,attr)
                         (cons
-                         (quote (, (intern (format "set-font-%s-p" attr))))
-                         (quote (, (intern (format "font-%s-p" attr))))))
+                         (quote ,(intern (format "set-font-%s-p" attr)))
+                         (quote ,(intern (format "font-%s-p" attr)))))
                   font-style-keywords))
-       (defconst (, (intern (format "font-%s-mask" attr))) (<< 1 (, mask))
-        (, (format
-            "Bitmask for whether a font is to be rendered in %s or not."
-            attr)))
-       (defun (, (intern (format "font-%s-p" attr))) (fontobj)
-        (, (format "Whether FONTOBJ will be renderd in `%s' or not." attr))
-        (if (/= 0 (& (font-style fontobj)
-                     (, (intern (format "font-%s-mask" attr)))))
+       (defconst ,(intern (format "font-%s-mask" attr)) (lsh 1 ,mask)
+        ,(format
+          "Bitmask for whether a font is to be rendered in %s or not."
+          attr))
+       (defun ,(intern (format "font-%s-p" attr)) (fontobj)
+        ,(format "Whether FONTOBJ will be renderd in `%s' or not." attr)
+        (if (/= 0 (logand (font-style fontobj)
+                     ,(intern (format "font-%s-mask" attr))))
             t
           nil))
-       (defun (, (intern (format "set-font-%s-p" attr))) (fontobj val)
-        (, (format "Set whether FONTOBJ will be renderd in `%s' or not."
-                   attr))
+       (defun ,(intern (format "set-font-%s-p" attr)) (fontobj val)
+        ,(format "Set whether FONTOBJ will be renderd in `%s' or not."
+                 attr)
         (cond
          (val
-          (set-font-style fontobj (| (font-style fontobj)
-                                     (, (intern
-                                         (format "font-%s-mask" attr))))))
-         (((, (intern (format "font-%s-p" attr))) fontobj)
+          (set-font-style fontobj (logior (font-style fontobj)
+                                          ,(intern
+                                            (format "font-%s-mask" attr)))))
+         ((,(intern (format "font-%s-p" attr)) fontobj)
           (set-font-style fontobj (- (font-style fontobj)
-                                     (, (intern
-                                         (format "font-%s-mask" attr))))))))
-       ))))
-
-(let ((mask 0))
-  (define-new-mask bold        (setq mask (1+ mask)))
-  (define-new-mask italic      (setq mask (1+ mask)))
-  (define-new-mask oblique     (setq mask (1+ mask)))
-  (define-new-mask dim         (setq mask (1+ mask)))
-  (define-new-mask underline   (setq mask (1+ mask)))
-  (define-new-mask overline    (setq mask (1+ mask)))
-  (define-new-mask linethrough (setq mask (1+ mask)))
-  (define-new-mask strikethru  (setq mask (1+ mask)))
-  (define-new-mask reverse     (setq mask (1+ mask)))
-  (define-new-mask blink       (setq mask (1+ mask)))
-  (define-new-mask smallcaps   (setq mask (1+ mask)))
-  (define-new-mask bigcaps     (setq mask (1+ mask)))
-  (define-new-mask dropcaps    (setq mask (1+ mask))))
+                                     ,(intern
+                                       (format "font-%s-mask" attr)))))))
+       )))
+
+(define-new-mask bold        1)
+(define-new-mask italic      2)
+(define-new-mask oblique     3)
+(define-new-mask dim         4)
+(define-new-mask underline   5)
+(define-new-mask overline    6)
+(define-new-mask linethrough 7)
+(define-new-mask strikethru  8)
+(define-new-mask reverse     9)
+(define-new-mask blink       10)
+(define-new-mask smallcaps   11)
+(define-new-mask bigcaps     12)
+(define-new-mask dropcaps    13)
 
 (defvar font-caps-display-table
   (let ((table (make-display-table))
@@ -276,7 +227,7 @@ These are for use in the `weight' field of an X font 
string.")
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Utility functions
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defsubst set-font-style-by-keywords (fontobj styles)
+(defun set-font-style-by-keywords (fontobj styles)
   (make-local-variable 'font-func)
   (declare (special font-func))
   (if (listp styles)
@@ -287,7 +238,7 @@ These are for use in the `weight' field of an X font 
string.")
     (setq font-func (car-safe (cdr-safe (assq styles font-style-keywords))))
     (and (fboundp font-func) (funcall font-func fontobj t))))
 
-(defsubst font-properties-from-style (fontobj)
+(defun font-properties-from-style (fontobj)
   (let ((todo font-style-keywords)
        type func retval)
     (while todo
@@ -415,7 +366,8 @@ These are for use in the `weight' field of an X font 
string.")
                                                (font-weight fontobj-2)))
     (set-font-family retval (font-unique (append (font-family fontobj-1)
                                                 (font-family fontobj-2))))
-    (set-font-style retval (| (font-style fontobj-1) (font-style fontobj-2)))
+    (set-font-style retval (logior (font-style fontobj-1)
+                                  (font-style fontobj-2)))
     (set-font-registry retval (or (font-registry fontobj-1)
                                  (font-registry fontobj-2)))
     (font-set-font-encoding retval (or (font-encoding fontobj-1)
@@ -468,7 +420,7 @@ These are for use in the `weight' field of an X font 
string.")
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; The window-system dependent code (X-style)
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defvar font-x-font-regexp (or (and font-running-xemacs
+(defvar font-x-font-regexp (or (and (featurep 'xemacs)
                                    (boundp 'x-font-regexp)
                                    x-font-regexp)
  (let
@@ -493,11 +445,11 @@ These are for use in the `weight' field of an X font 
string.")
    (concat "\\`\\*?[-?*]"
           foundry - family - weight\? - slant\? - swidth - adstyle -
           pixelsize - pointsize - resx - resy - spacing - avgwidth -
-          registry - encoding - "*" "\\'"
+          registry - encoding "\\'"
           ))))
 
 (defvar font-x-registry-and-encoding-regexp
-  (or (and font-running-xemacs
+  (or (and (featurep 'xemacs)
           (boundp 'x-font-regexp-registry-and-encoding)
           (symbol-value 'x-font-regexp-registry-and-encoding))
       (let ((- "[-?]")
@@ -508,36 +460,36 @@ These are for use in the `weight' field of an X font 
string.")
 (defvar font-x-family-mappings
   '(
     ("serif"        . ("new century schoolbook"
-                      "utopia"
-                      "charter"
-                      "times"
-                      "lucidabright"
-                      "garamond"
-                      "palatino"
-                      "times new roman"
-                      "baskerville"
-                      "bookman"
-                      "bodoni"
-                      "computer modern"
-                      "rockwell"
-                      ))
+                      "utopia"
+                      "charter"
+                      "times"
+                      "lucidabright"
+                      "garamond"
+                      "palatino"
+                      "times new roman"
+                      "baskerville"
+                      "bookman"
+                      "bodoni"
+                      "computer modern"
+                      "rockwell"
+                      ))
     ("sans-serif"   . ("lucida"
-                      "helvetica"
-                      "gills-sans"
-                      "avant-garde"
-                      "univers"
-                      "optima"))
+                      "helvetica"
+                      "gills-sans"
+                      "avant-garde"
+                      "univers"
+                      "optima"))
     ("elfin"        . ("tymes"))
     ("monospace"    . ("courier"
-                      "fixed"
-                      "lucidatypewriter"
-                      "clean"
-                      "terminal"))
+                      "fixed"
+                      "lucidatypewriter"
+                      "clean"
+                      "terminal"))
     ("cursive"      . ("sirene"
-                      "zapf chancery"))
+                      "zapf chancery"))
     )
   "A list of font family mappings on X devices.")
- 
+
 (defun x-font-create-object (fontname &optional device)
   (let ((case-fold-search t))
     (if (or (not (stringp fontname))
@@ -585,18 +537,17 @@ These are for use in the `weight' field of an X font 
string.")
 
 (defun x-font-families-for-device (&optional device no-resetp)
   (ignore-errors (require 'x-font-menu))
+  (declare (special device-fonts-cache))
   (or device (setq device (selected-device)))
   (if (boundp 'device-fonts-cache)
-      (let ((menu nil))
-       (declare (special device-fonts-cache))
-       (setq menu (cdr-safe (assq device device-fonts-cache)))
+      (let ((menu (or (cdr-safe (assq device device-fonts-cache)))))
        (if (and (not menu) (not no-resetp))
            (progn
              (reset-device-font-menus device)
              (x-font-families-for-device device t))
-         (let ((scaled (mapcar (lambda (x) (if x (aref x 0)))
+         (let ((scaled (mapcar #'(lambda (x) (if x (aref x 0)))
                                (aref menu 0)))
-               (normal (mapcar (lambda (x) (if x (aref x 0)))
+               (normal (mapcar #'(lambda (x) (if x (aref x 0)))
                                (aref menu 1))))
            (sort (font-unique (nconc scaled normal)) 'string-lessp))))
     (cons "monospace" (mapcar 'car font-x-family-mappings))))
@@ -606,7 +557,7 @@ These are for use in the `weight' field of an X font 
string.")
 ;;;###autoload
 (defun font-default-font-for-device (&optional device)
   (or device (setq device (selected-device)))
-  (if font-running-xemacs
+  (if (featurep 'xemacs)
       (font-truename
        (make-font-specifier
        (face-font-name 'default device)))
@@ -614,14 +565,14 @@ These are for use in the `weight' field of an X font 
string.")
       (if (and (fboundp 'fontsetp) (fontsetp font))
          (aref (get-font-info (aref (cdr (get-fontset-info font)) 0)) 2)
        font))))
-         
+
 ;;;###autoload
 (defun font-default-object-for-device (&optional device)
   (let ((font (font-default-font-for-device device)))
     (or (cdr-safe (assoc font font-default-cache))
-       (let ((object (font-create-object font)))
-         (push (cons font object) font-default-cache)
-         object))))
+       (let ((object (font-create-object font)))
+         (push (cons font object) font-default-cache)
+         object))))
 
 ;;;###autoload
 (defun font-default-family-for-device (&optional device)
@@ -638,7 +589,7 @@ These are for use in the `weight' field of an X font 
string.")
 ;;;###autoload
 (defun font-default-size-for-device (&optional device)
   ;; face-height isn't the right thing (always 1 pixel too high?)
-  ;; (if font-running-xemacs
+  ;; (if (featurep 'xemacs)
   ;;    (format "%dpx" (face-height 'default device))
   (font-size (font-default-object-for-device device)))
 
@@ -656,7 +607,7 @@ These are for use in the `weight' field of an X font 
string.")
                       (font-family default)
                       (x-font-families-for-device device)))
           (weight (or (font-weight fontobj) :medium))
-          (size (or (if font-running-xemacs
+          (size (or (if (featurep 'xemacs)
                         (font-size fontobj))
                     (font-size default)))
           (registry (or (font-registry fontobj)
@@ -824,7 +775,7 @@ These are for use in the `weight' field of an MS-Windows 
font string.")
           (family (or (font-family fontobj)
                       (font-family default)))
           (weight (or (font-weight fontobj) :regular))
-          (size (or (if font-running-xemacs
+          (size (or (if (featurep 'xemacs)
                         (font-size fontobj))
                     (font-size default)))
           (underline-p (font-underline-p fontobj))
@@ -878,7 +829,7 @@ These are for use in the `weight' field of an MS-Windows 
font string.")
 (defun x-font-build-cache (&optional device)
   (let ((hash-table (make-hash-table :test 'equal :size 15))
        (fonts (mapcar 'x-font-create-object
-                      (list-fonts "-*-*-*-*-*-*-*-*-*-*-*-*-*-*")))
+                      (x-list-fonts "-*-*-*-*-*-*-*-*-*-*-*-*-*-*")))
        (plist nil)
        (cur nil))
     (while fonts
@@ -905,7 +856,7 @@ These are for use in the `weight' field of an MS-Windows 
font string.")
 ;;; Now overwrite the original copy of set-face-font with our own copy that
 ;;; can deal with either syntax.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;###autoload
+;;; ###autoload
 (defun font-set-face-font (&optional face font &rest args)
   (cond
    ((and (vectorp font) (= (length font) 12))
@@ -920,7 +871,7 @@ These are for use in the `weight' field of an MS-Windows 
font string.")
            (setq cur (car font-name)
                  font-name (cdr font-name))
            (apply 'set-face-property face (car cur) (cdr cur) args))))
-       (font-running-xemacs
+       ((featurep 'xemacs)
        (apply 'set-face-font face font-name args)
        (apply 'set-face-underline-p face (font-underline-p font) args)
        (if (and (or (font-smallcaps-p font) (font-bigcaps-p font))
@@ -946,6 +897,10 @@ These are for use in the `weight' field of an MS-Windows 
font string.")
     (set-face-property face 'font-specification nil)
     (apply 'set-face-font face font args))))
 
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Emacs 21 Redisplay
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (defun font-find-available-family (fontobj &optional device)
   (let* ((default (font-default-object-for-device device))
         (family (or (font-family fontobj)
@@ -977,7 +932,7 @@ These are for use in the `weight' field of an MS-Windows 
font string.")
              done (try-font-name font-name device))))
     (and done cur-family)))
 
-(defun font-set-face-font-new-redisplay (&optional face font &rest args)
+(defun font-set-face-font-emacs21 (&optional face font &rest args)
   (cond
    ((and (vectorp font) (= (length font) 12))
     (set-face-property face 'font-specification font)
@@ -985,7 +940,7 @@ These are for use in the `weight' field of an MS-Windows 
font string.")
      face nil
      :underline (font-underline-p font)
      :weight (or (cdr-safe (assoc (font-weight font)
-                                 font-new-redisplay-weight-mappings))
+                                 font-emacs21-weight-mappings))
                 'normal))
     (if (font-find-available-family font)
        (set-face-attribute :family (font-find-available-family font)))
@@ -997,8 +952,10 @@ These are for use in the `weight' field of an MS-Windows 
font string.")
     (set-face-property face 'font-specification nil)
     (apply 'set-face-font face font args))))
 
-(if font-running-emacs-new-redisplay
-(defalias 'font-set-face-font 'font-set-face-font-new-redisplay))
+(if (and (not (featurep 'xemacs))
+        (>= emacs-major-version 21))
+    (defalias 'font-set-face-font 'font-set-face-font-emacs21))
+
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Now for emacsen specific stuff
@@ -1043,14 +1000,18 @@ DEVICE_LIST defaults to a list of all active devices."
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (cond
  ((fboundp 'display-warning)
-  (defalias 'font-warn 'display-warning))
+  (fset 'font-warn 'display-warning))
+ ((fboundp 'w3-warn)
+  (fset 'font-warn 'w3-warn))
+ ((fboundp 'url-warn)
+  (fset 'font-warn 'url-warn))
  ((fboundp 'warn)
   (defun font-warn (class message &optional level)
     (warn "(%s/%s) %s" class (or level 'warning) message)))
  (t
   (defun font-warn (class message &optional level)
     (save-excursion
-      (set-buffer (get-buffer-create "*FONT-WARNINGS*"))
+      (set-buffer (get-buffer-create "*W3-WARNINGS*"))
       (goto-char (point-max))
       (save-excursion
        (insert (format "(%s/%s) %s\n" class (or level 'warning) message)))
@@ -1196,14 +1157,14 @@ The list (R G B) is returned, or an error is signaled 
if the lookup fails."
               b 0)))
   (list r g b) ))
 
-(defsubst font-rgb-color-p (obj)
+(defun font-rgb-color-p (obj)
   (or (and (vectorp obj)
           (= (length obj) 4)
           (eq (aref obj 0) 'rgb))))
 
-(defsubst font-rgb-color-red (obj) (aref obj 1))
-(defsubst font-rgb-color-green (obj) (aref obj 2))
-(defsubst font-rgb-color-blue (obj) (aref obj 3))
+(defun font-rgb-color-red (obj) (aref obj 1))
+(defun font-rgb-color-green (obj) (aref obj 2))
+(defun font-rgb-color-blue (obj) (aref obj 3))
 
 (defun font-color-rgb-components (color)
   "Return the RGB components of COLOR as a list of integers (R G B).
@@ -1225,7 +1186,7 @@ The variable x-library-search-path is use to locate the 
rgb.txt file."
      ((and (vectorp color) (= 3 (length color)))
       (list (aref color 0) (aref color 1) (aref color 2)))
      ((and (listp color) (= 3 (length color)) (floatp (car color)))
-      (mapcar (lambda (x) (* x 65535)) color))
+      (mapcar #'(lambda (x) (* x 65535)) color))
      ((and (listp color) (= 3 (length color)))
       color)
      ((or (string-match "^#" color)
@@ -1294,16 +1255,6 @@ If an error occurs, return black."
   (case (device-type device)
    ((x pm)
     (apply 'format "#%02x%02x%02x" (font-color-rgb-components color)))
-   (win32
-    (let* ((rgb (font-color-rgb-components color))
-          (color (apply 'format "#%02x%02x%02x" rgb)))
-      (win32-define-rgb-color (nth 0 rgb) (nth 1 rgb) (nth 2 rgb) color)
-      color))
-   (w32
-    (let* ((rgb (font-color-rgb-components color))
-          (color (apply 'format "#%02x%02x%02x" rgb)))
-      (w32-define-rgb-color (nth 0 rgb) (nth 1 rgb) (nth 2 rgb) color)
-      color))
    (mswindows
     (let* ((rgb (font-color-rgb-components color))
           (color (apply 'format "#%02x%02x%02x" rgb)))
@@ -1312,7 +1263,7 @@ If an error occurs, return black."
    (tty
     (apply 'font-tty-find-closest-color (font-color-rgb-components color)))
    (ns
-    (let ((vals (mapcar (lambda (x) (>> x 8))
+    (let ((vals (mapcar #'(lambda (x) (lsh x -8))
                        (font-color-rgb-components color))))
       (apply 'format "RGB%02x%02x%02xff" vals)))
    (otherwise
@@ -1370,11 +1321,11 @@ If an error occurs, return black."
       (if (or (eq face face-at) (and (listp face-at) (memq face face-at)))
          (setq found t)))
     found))
-  
+
 (defun font-blink-callback ()
   ;; Optimized to never invert the face unless one of the visible windows
   ;; is showing it.
-  (let ((faces (if font-running-xemacs (face-list t) (face-list)))
+  (let ((faces (if (featurep 'xemacs) (face-list t) (face-list)))
        (obj nil))
     (while faces
       (if (and (setq obj (face-property (car faces) 'font-specification))
@@ -1388,7 +1339,7 @@ If an error occurs, return black."
   "How often to blink faces."
   :type 'number
   :group 'faces)
-  
+
 (defun font-blink-initialize ()
   (cond
    ((featurep 'itimer)
@@ -1403,5 +1354,5 @@ If an error occurs, return black."
                 font-blink-interval
                 'font-blink-callback))
    (t nil)))
-  
+
 (provide 'font)
diff --git a/lisp/images.el b/lisp/images.el
index 8622f49..2d02a58 100644
--- a/lisp/images.el
+++ b/lisp/images.el
@@ -1,7 +1,7 @@
 ;;; images.el --- Automatic image converters
-;; Author: $Author: fx $
-;; Created: $Date: 2001/06/07 16:36:27 $
-;; Version: $Revision: 1.4 $
+;; Author: $Author: wmperry $
+;; Created: $Date: 2002/02/01 17:42:48 $
+;; Version: $Revision: 1.5 $
 ;; Keywords: images
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -31,7 +31,7 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (eval-and-compile
-  (if (not (and (string-match "XEmacs" emacs-version)
+  (if (not (and (featurep 'xemacs)
                (or (> emacs-major-version 19)
                    (>= emacs-minor-version 14))))
       (require 'w3-sysdp)))
@@ -40,7 +40,7 @@
 (defvar image-converters nil "Storage for the image converters.")
 (defvar image-native-formats
   (cond
-   ((string-match "XEmacs" emacs-version)
+   ((featurep 'xemacs)
     (delq nil (cons (if (featurep 'x) 'xbm)
                    (mapcar (function (lambda (x) (if (featurep x) x)))
                            '(xpm gif jpeg tiff png imagick)))))
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 3d56075..d85a270 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.41 $
+;; Version: $Revision: 1.42 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -369,12 +369,6 @@
        "white"
       "black")))
 
-;; Test function for XEmacs and the color inference code.
-;; (defun w3-display-test-inference (color)
-;;  (interactive "sColor: ")
-;;  (set-face-background 'default color (current-buffer))
-;;  (set-face-foreground 'default (w3-display-infer-contrasting-color color) 
(current-buffer)))
-
 (defun w3-make-face-emacs19 (name &optional doc-string temporary)
   "Defines and returns a new FACE described by DOC-STRING.
 If the face already exists, it is unmodified."
@@ -2325,9 +2319,7 @@ Format: (((image-alt row column) . offset) ...)")
                   (setq perc (/ (min (string-to-int perc) 100) 100.0)
                         width (truncate (* fill-column perc)))
                 (setq width perc))
-              (w3-display-handle-break)
               (w3-insert-terminal-char (w3-horizontal-rule-char) width)
-              (w3-display-handle-break)
               (w3-handle-empty-tag)))
            (map                        ; Client side imagemaps
             (let ((name (or (w3-get-attribute 'name)
diff --git a/lisp/w3-fast-parse.el b/lisp/w3-fast-parse.el
index b51d944..a8034f5 100644
--- a/lisp/w3-fast-parse.el
+++ b/lisp/w3-fast-parse.el
@@ -42,9 +42,9 @@
       (setq tree (cdr tree))
       (if (stringp node)
          nil                           ; Do nothing
-       (setq tag (nth 0 node)
-             attrs (nth 1 node)
-             content (nth 2 node))
+       (setq tag (xml-node-name node)
+             attrs (xml-node-attributes node)
+             content (xml-node-children node))
        (cond
         ((eq tag 'base)
          (setq base-object (cdr-safe (or (assq 'src attrs) (assq 'href 
attrs)))))
diff --git a/lisp/w3-widget.el b/lisp/w3-widget.el
index 63d1981..2938f2b 100644
--- a/lisp/w3-widget.el
+++ b/lisp/w3-widget.el
@@ -1,7 +1,7 @@
 ;;; w3-widget.el --- An image widget
 ;; Author: Bill Perry <address@hidden>
-;; Created: $Date: 2001/05/18 23:42:43 $
-;; Version: $Revision: 1.7 $
+;; Created: $Date: 2002/02/01 17:42:49 $
+;; Version: $Revision: 1.8 $
 ;; Keywords: faces, images
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -268,32 +268,37 @@
          (if real-widget
              (widget-put widget :children (list real-widget))))
       ;;; Actually use the image
-      (if (featurep 'xemacs)
-         (let ((extent (or (widget-get widget 'extent)
-                           (make-extent where where))))
-           (set-extent-endpoints extent where where)
-           (widget-put widget 'extent extent)
-           (widget-put widget :children nil)
-           (set-extent-property extent 'keymap widget-image-keymap)
-           (set-extent-property extent 'begin-glyph glyph)
-           (set-extent-property extent 'detachable t)
-           (set-extent-property extent 'help-echo
-                                (cond
-                                 ((and href (or client-map
-                                                server-map))
-                                  (format "%s [map]" href))
-                                 (href href)
-                                 (t nil)))
-           (set-glyph-property glyph 'widget widget))
-       
-      (insert-image glyph
-                   (propertize " "
-                               'keymap widget-image-keymap
-                               'help-echo (cond
-                                           ((and href (or client-map
-                                                          server-map))
-                                            (format "%s [map]" href))
-                                           (href href))))))))
+      (cond
+       ((featurep 'xemacs)
+       (let ((extent (or (widget-get widget 'extent)
+                         (make-extent where where))))
+         (set-extent-endpoints extent where where)
+         (widget-put widget 'extent extent)
+         (widget-put widget :children nil)
+         (set-extent-property extent 'keymap widget-image-keymap)
+         (set-extent-property extent 'begin-glyph glyph)
+         (set-extent-property extent 'detachable t)
+         (set-extent-property extent 'help-echo
+                              (cond
+                               ((and href (or client-map
+                                              server-map))
+                                (format "%s [map]" href))
+                               (href href)
+                               (t nil)))
+         (set-glyph-property glyph 'widget widget)))
+       ((fboundp 'insert-image)
+       ;; Emacs 21!
+       (let ((buffer-read-only nil)
+             (after-change-functions nil)
+             (before-change-functions nil))
+         (insert-image glyph
+                       (propertize " "
+                                   'keymap widget-image-keymap
+                                   'help-echo (cond
+                                               ((and href (or client-map
+                                                              server-map))
+                                                (format "%s [map]" href))
+                                               (href href))))))))))
 
 (defun widget-image-delete (widget)
   "Remove WIDGET from the buffer."
diff --git a/lisp/w3.el b/lisp/w3.el
index 9e7023d..1419e9d 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
-;; Author: $Author: fx $
-;; Created: $Date: 2002/01/22 17:56:53 $
-;; Version: $Revision: 1.27 $
+;; Author: $Author: wmperry $
+;; Created: $Date: 2002/02/01 17:42:49 $
+;; Version: $Revision: 1.28 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -332,9 +332,21 @@ MUST-BE-VIEWING is the current URL when the timer expires."
        (setq url-current-mime-headers headers)
        (w3-notify-when-ready (current-buffer))
        (mm-destroy-parts handle))
+;;        ((equal (mm-handle-media-type handle) "text/xml")
+;;     ;; Special case text/xml if it comes through w3-fetch
+;;     (set-buffer (generate-new-buffer " *w3-xml*"))
+;;     (mm-disable-multibyte)
+;;     (mm-insert-part handle)
+;;     (w3-decode-charset handle)
+;;      !!! Need some function to view XML nicely... maybe the
+;;      !!! customize tree control?
+;;     (setq url-current-object (url-generic-parse-url url)
+;;           url-current-mime-headers headers)
+;;     (mm-destroy-parts handle)
+;;     (w3-notify-when-ready (current-buffer)))
        ((equal (car-safe (mm-handle-type handle))
               "application/x-elisp-parsed-html")
-      ;; Also need to special-case pre-parsed representations of HTML.
+       ;; Also need to special-case pre-parsed representations of HTML.
        ;; Fixme: will this need decoding?
        (w3-prepare-tree (read (set-marker (make-marker) 1
                                           (mm-handle-buffer handle)))))

commit 951fddcec98cf0b210cedbfb0d63aaf12c6ab454
Author: Dave Love <address@hidden>
Date:   Thu Jan 24 20:03:28 2002 +0000

    Really delete, per ChangeLog.

diff --git a/lisp/w3-e19.el b/lisp/w3-e19.el
deleted file mode 100644
index 3a923e7..0000000
--- a/lisp/w3-e19.el
+++ /dev/null
@@ -1,97 +0,0 @@
-;;; w3-e19.el --- Emacs 19.xx specific functions for emacs-w3
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:36:03 $
-;; Version: $Revision: 1.2 $
-;; Keywords: faces, help, mouse, hypermedia
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Enhancements For Emacs 19
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(eval-when-compile
-  (require 'w3-props))
-(require 'w3-forms)
-(require 'font)
-
-(defvar w3-e19-window-width nil)
-(make-variable-buffer-local 'w3-e19-window-width)
-
-(defun w3-setup-version-specifics ()
-  ;; Set up routine for emacs 19
-  )
-
-(defun w3-store-in-clipboard (str)
-  "Store string STR in the system clipboard"
-  (cond
-   ((and (boundp 'interprogram-cut-function) interprogram-cut-function)
-    (funcall interprogram-cut-function str t))
-   (t
-    (case (device-type)
-      (x (x-select-text str))
-      (pm (pm-put-clipboard str))
-      (ns (ns-store-pasteboard-internal str))
-      (otherwise nil)))))
-
-(defun w3-mode-version-specifics ()
-  ;; Emacs 19 specific stuff for w3-mode
-  (declare (special w3-face-index w3-display-background-properties))
-  (make-local-variable 'track-mouse)
-  (setq w3-e19-window-width (window-width))
-  (if w3-track-mouse (setq track-mouse t))
-  (if w3-display-background-properties
-      (let ((face (w3-make-face (intern
-                                (format "w3-style-face-%05d" w3-face-index))
-                               "An Emacs-W3 face... don't edit by hand." t))
-           (fore (car w3-display-background-properties))
-           (inhibit-read-only t)
-           (back (cdr w3-display-background-properties)))
-       (setq w3-face-index (1+ w3-face-index))
-       (if fore (font-set-face-foreground face fore))
-       (if back (font-set-face-background face back))
-       (fillin-text-property (point-min) (point-max) 'face 'face face))))
-
-(defun w3-mouse-handler (e)
-  "Function to message the url under the mouse cursor"
-  (interactive "e")
-  (let* ((pt (posn-point (event-start e)))
-        (good (eq (posn-window (event-start e)) (selected-window)))
-        (mouse-events nil))
-    (if (not (and good pt (number-or-marker-p pt)))
-       nil
-      (widget-echo-help pt))))
-
-(defun w3-window-size-change-function (frame)
-  (let ((first (frame-first-window frame))
-       (cur nil))
-    (while (not (eq cur first))
-      (setq cur (if cur (next-window cur nil frame) first))
-      (save-excursion
-       (set-buffer (window-buffer cur))
-       (if (and (eq major-mode 'w3-mode)
-                (not (eq (window-width cur) w3-e19-window-width)))
-           (w3-refresh-buffer))))))
-
-
-(provide 'w3-emacs19)
-(provide 'w3-e19)
diff --git a/lisp/w3-e20.el b/lisp/w3-e20.el
deleted file mode 100644
index 148b128..0000000
--- a/lisp/w3-e20.el
+++ /dev/null
@@ -1,29 +0,0 @@
-;;; w3-e20.el --- Emacs 20.xx specific functions for emacs-w3
-;; Author: $Author: sds $
-;; Created: $Date: 2000/07/28 17:17:19 $
-;; Version: $Revision: 1.2 $
-;; Keywords: faces, help, mouse, hypermedia
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1997, 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'w3-e19)
-(provide 'w3-e20)
diff --git a/lisp/w3-e21.el b/lisp/w3-e21.el
deleted file mode 100644
index 4900206..0000000
--- a/lisp/w3-e21.el
+++ /dev/null
@@ -1,59 +0,0 @@
-;;; w3-e21.el --- Emacs 21.xx specific functions for emacs-w3
-;; Author: $Author: wmperry $
-;; Created: $Date: 2000/10/16 15:36:56 $
-;; Version: $Revision: 1.4 $
-;; Keywords: faces, help, mouse, hypermedia
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1997, 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'w3-e19)
-
-(defadvice w3-setup-version-specifics (after emacs21 pre act)
-  (and (featurep 'tool-bar)
-       (w3-toolbar-make-buttons)))
-
-(defadvice w3-mode-version-specifics (after emacs21 pre act)
-  (w3-add-toolbar-to-buffer))
-
-(defun w3-tooltip-get-tips (event)
-  (let (widget pos help start)
-    (setq start (event-start event)
-         pos (posn-point start)
-         widget (and pos (widget-at pos))
-         help (and widget (widget-get widget :help-echo)))
-    (if (functionp help)
-       (setq help (funcall help widget (posn-window start)
-                           (window-buffer (posn-window start))
-                           (posn-point start))))
-    (if (stringp help)
-       (tooltip-show help))))
-
-(add-hook 'tooltip-hook 'w3-tooltip-get-tips)
-
-(defvar toolbar-file-icon "new"
-  "Lame definition to look a little like XEmacs' toolbar for Emacs/W3")
-
-(defvar toolbar-printer-icon "print"
-  "Lame definition to look a little like XEmacs' toolbar for Emacs/W3")
-
-(provide 'w3-e21)
-(require 'w3-toolbar)

commit 39dfa95596ac5bd53b80e3354605eee4432aac03
Author: Dave Love <address@hidden>
Date:   Tue Jan 22 19:03:00 2002 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index ccf31fe..ade6b89 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,48 @@
+2002-01-22  Dave Love  <address@hidden>
+
+       * lisp/css.el (css-color-values): Maybe use `color-values'.
+
+       * lisp/socks.el: Require cl only when compiling.  Require wid-edit
+       when compiling.
+
+       * lisp/font.el: Require cl only when compiling.  Remove second
+       (require 'disp-table).  Wrap definitions of << & al in
+       eval-and-compile.  Doc fixes.
+       (font-set-font-encoding): Renamed from set-font-encoding (which is
+       in fontset.el).
+
+       * lisp/devices.el: Require cl only when compiling.
+
+       * lisp/w3-java.el (url-util): Require.
+       (w3-java-run-applet): Use url-generate-unique-filename, not
+       non-existent mailcap-generate-unique-filename.
+
+       * lisp/w3-menu.el (w3-first-n-items, w3-only-links) 
+       (w3-fix-spaces): Autoload to avoid compiler warnings.
+       (w3-menu-filters-supported-p): Include Emacs 21.
+       (w3-menu-links-constructor): Use modern backquote syntax.
+
+       * lisp/ssl.el: Require cl only when compiling.  Require url.  Doc
+       fixes.
+       (ssl-view-certificate-program-arguments): Modify :type.
+       (top-level): Delete custom compatibility code since we require a
+       modern Emacs.
+       (open-ssl-stream): Use modern backquote syntax.
+
+       * lisp/w3-display.el (top-level): Declarations and autoloads to
+       avoid compiler warnings.
+       (w3-display-node): Use copy-sequence, not CL runtime copy-tree.
+
+       * lisp/w3-parse.el (decode-char): Modify logic for compiler
+       warning.
+
+       * lisp/w3.el (w3-nasty-disgusting-http-equiv-handling): Make
+       buffer arg compulsory and always set the buffer.  Parse a copy of
+       the head region, since w3-parse-region widens the buffer and may
+       mung it.
+       (w3-fetch-callback): Give w3-nasty-disgusting-http-equiv-handling
+       an arg.
+
 2001-12-04  William M. Perry  <address@hidden>
 
        * lisp/w3-display.el (w3-display-node): Explicitly put in breaks

commit 36b3cc225845e568dd5ef0ac034c09e4645b1564
Author: Dave Love <address@hidden>
Date:   Tue Jan 22 19:01:57 2002 +0000

    (css-color-values): Maybe use `color-values'.

diff --git a/lisp/css.el b/lisp/css.el
index 2297efb..bc8641f 100644
--- a/lisp/css.el
+++ b/lisp/css.el
@@ -1,12 +1,12 @@
 ;;; css.el -- Cascading Style Sheet parser
 ;; Author: $Author: fx $
-;; Created: $Date: 2001/06/05 16:02:18 $
-;; Version: $Revision: 1.7 $
+;; Created: $Date: 2002/01/22 19:01:57 $
+;; Version: $Revision: 1.8 $
 ;; Keywords: 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996, 97, 98, 1999 Free Software Foundation, Inc.
+;;; Copyright (c) 1996, 97, 98, 1999, 2000, 2001 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -780,6 +780,8 @@ For a terminal frame, the value is always 1."
          t)))
   (defun css-color-values (color)
     (cond
+     ((fboundp 'display-color-p)
+      (color-values color))
      ((eq window-system 'x)
       (x-color-values color))
      ((eq window-system 'pm)

commit 20947ba849a71fd664fe20887d698c6b50132a68
Author: Dave Love <address@hidden>
Date:   Tue Jan 22 18:58:43 2002 +0000

    Update copyright.

diff --git a/lisp/socks.el b/lisp/socks.el
index 4832dde..692ed8a 100644
--- a/lisp/socks.el
+++ b/lisp/socks.el
@@ -1,12 +1,12 @@
 ;;; socks.el --- A Socks v5 Client for Emacs
 ;; Author: $Author: fx $
-;; Created: $Date: 2002/01/22 18:57:48 $
-;; Version: $Revision: 1.6 $
+;; Created: $Date: 2002/01/22 18:58:43 $
+;; Version: $Revision: 1.7 $
 ;; Keywords: comm, firewalls
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1996 - 1998 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
+;;; Copyright (c) 1996, 97, 98, 1999, 2000 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;

commit 220e456857bc7bd194efc460cfed42ca26f23f30
Author: Dave Love <address@hidden>
Date:   Tue Jan 22 18:57:48 2002 +0000

    Require cl only when compiling.  Require wid-edit
    when compiling.

diff --git a/lisp/socks.el b/lisp/socks.el
index 0861f94..4832dde 100644
--- a/lisp/socks.el
+++ b/lisp/socks.el
@@ -1,7 +1,7 @@
 ;;; socks.el --- A Socks v5 Client for Emacs
 ;; Author: $Author: fx $
-;; Created: $Date: 2000/12/20 20:53:17 $
-;; Version: $Revision: 1.5 $
+;; Created: $Date: 2002/01/22 18:57:48 $
+;; Version: $Revision: 1.6 $
 ;; Keywords: comm, firewalls
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -35,10 +35,12 @@
 ;; - Implement composition of servers.  Recursively evaluate the
 ;;   redirection rules and do SOCKS-over-HTTP and SOCKS-in-SOCKS
 
-(require 'cl)
+(eval-when-compile
+  (require 'cl)
+  (require 'wid-edit))
 (require 'custom)
 
-;; For non-MULE
+;; For non-XEmacs-MULE
 (if (fboundp 'char-int)
     (defalias 'socks-char-int 'char-int)
   (defalias 'socks-char-int 'identity))

commit 0337b64549864a912adfaf186c12e654fd7553e5
Author: Dave Love <address@hidden>
Date:   Tue Jan 22 18:55:35 2002 +0000

    Require cl only when compiling.  Remove second
    (require 'disp-table).  Wrap definitions of << & al in
    eval-and-compile.  Doc fixes.
    (font-set-font-encoding): Renamed from set-font-encoding (which is
    in fontset.el).

diff --git a/lisp/font.el b/lisp/font.el
index 8217d1a..f0c0e91 100644
--- a/lisp/font.el
+++ b/lisp/font.el
@@ -1,12 +1,12 @@
 ;;; font.el --- New font model
-;; Author: $Author: wmperry $
-;; Created: $Date: 2001/11/24 21:07:38 $
-;; Version: $Revision: 1.9 $
+;; Author: $Author: fx $
+;; Created: $Date: 2002/01/22 18:55:35 $
+;; Version: $Revision: 1.10 $
 ;; Keywords: faces
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1995, 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
+;;; Copyright (c) 1996, 97, 98, 99, 2000, 2001 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -29,7 +29,7 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; The emacsen compatibility package - load it up before anything else
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(require 'cl)
+(eval-when-compile (require 'cl))
 (require 'devices)
 
 ;; Needed for XEmacs 19.13, noop on all others, since it is always loaded.
@@ -44,7 +44,7 @@
     ;; We have the old custom-library, hack around it!
     (defmacro defgroup (&rest args)
       nil)
-    (defmacro defcustom (var value doc &rest args) 
+    (defmacro defcustom (var value doc &rest args)
       (` (defvar (, var) (, value) (, doc))))))
 
 (if (not (fboundp 'try-font-name))
@@ -78,14 +78,12 @@
       "Return FACE's value of the given PROPERTY."
       (and (symbolp face) (get face property))))
 
-(require 'disp-table)
-
-(if (not (fboundp '<<))   (defalias '<< 'lsh))
-(if (not (fboundp '&))    (defalias '& 'logand))
-(if (not (fboundp '|))    (defalias '| 'logior))
-(if (not (fboundp '~))    (defalias '~ 'lognot))
-(if (not (fboundp '>>))   (defun >> (value count) (<< value (- count))))
-
+(eval-and-compile
+  (if (not (fboundp '<<))   (defalias '<< 'lsh))
+  (if (not (fboundp '&))    (defalias '& 'logand))
+  (if (not (fboundp '|))    (defalias '| 'logior))
+  (if (not (fboundp '~))    (defalias '~ 'lognot))
+  (if (not (fboundp '>>))   (defun >> (value count) (<< value (- count)))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Lots of variables / keywords for use later in the program
@@ -105,7 +103,7 @@
        (while keywords
         (or (boundp (car keywords))
             (set (car keywords) (car keywords)))
-        (setq keywords (cdr keywords)))))))  
+        (setq keywords (cdr keywords)))))))
 
 (defconst font-window-system-mappings
   '((x        . (x-font-create-name x-font-create-object))
@@ -114,8 +112,8 @@
     (w32      . (x-font-create-name x-font-create-object))
     (pm       . (x-font-create-name x-font-create-object)) ; Change? FIXME
     (tty      . (tty-font-create-plist tty-font-create-object)))
-  "An assoc list mapping device types to the function used to create
-a font name from a font structure.")
+  "Alist mapping device types to functions.
+The functions are used to create a font name from a font structure.")
 
 (defconst ns-font-weight-mappings
   '((:extra-light . "extralight")
@@ -126,8 +124,7 @@ a font name from a font structure.")
     (:demi-bold   . "demibold")
     (:bold        . "bold")
     (:extra-bold  . "extrabold"))
-  "An assoc list mapping keywords to actual NeXTstep specific
-information to use")
+  "Alist mapping keywords to actual NeXTstep specific information to use.")
 
 (defconst x-font-weight-mappings
   '((:extra-light . "extralight")
@@ -140,8 +137,8 @@ information to use")
     (:demi-bold   . "demibold")
     (:bold        . "bold")
     (:extra-bold  . "extrabold"))
-  "An assoc list mapping keywords to actual Xwindow specific strings
-for use in the 'weight' field of an X font string.")
+  "Alist mapping keywords to actual X-specific strings.
+These are for use in the `weight' field of an X font string.")
 
 (defconst font-new-redisplay-weight-mappings
   '((:extra-light . extra-light)
@@ -154,8 +151,7 @@ for use in the 'weight' field of an X font string.")
     (:demi-bold   . semi-bold)
     (:bold        . bold)
     (:extra-bold  . extra-bold))
-  "An assoc list mapping font weights to the actual symbols used by
-the new redisplay engine.")
+  "Alist mapping font weights to symbols used by the new redisplay engine.")
 
 (defconst font-possible-weights
   (mapcar 'car x-font-weight-mappings))
@@ -189,7 +185,7 @@ the new redisplay engine.")
 (defsubst set-font-registry (fontobj reg)
   (aset fontobj 9 reg))
 
-(defsubst set-font-encoding (fontobj enc)
+(defsubst font-set-font-encoding (fontobj enc)
   (aset fontobj 11 enc))
 
 (defsubst font-family (fontobj)
@@ -275,7 +271,7 @@ the new redisplay engine.")
     (while (< i 255)                   ;; Oslash - Thorn
       (aset table i (- i 32))
       (setq i (1+ i)))
-    table))    
+    table))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Utility functions
@@ -324,7 +320,7 @@ the new redisplay engine.")
       w2))))
 
 (defun font-spatial-to-canonical (spec &optional device)
-  "Convert SPEC (in inches, millimeters, points, or picas) into points"
+  "Convert SPEC (in inches, millimeters, points, or picas) into points."
   ;; 1 in = 6 pa = 25.4 mm = 72 pt
   (cond
    ((numberp spec)
@@ -422,7 +418,7 @@ the new redisplay engine.")
     (set-font-style retval (| (font-style fontobj-1) (font-style fontobj-2)))
     (set-font-registry retval (or (font-registry fontobj-1)
                                  (font-registry fontobj-2)))
-    (set-font-encoding retval (or (font-encoding fontobj-1)
+    (font-set-font-encoding retval (or (font-encoding fontobj-1)
                                  (font-encoding fontobj-2)))
     (set-font-size retval (cond
                           ((and size-1 size-2 (>= size-2 size-1))
@@ -584,7 +580,7 @@ the new redisplay engine.")
          (set-font-oblique-p retval t)))
        (when (string-match font-x-registry-and-encoding-regexp fontname)
          (set-font-registry retval (match-string 1 fontname))
-         (set-font-encoding retval (match-string 2 fontname)))
+         (font-set-font-encoding retval (match-string 2 fontname)))
        retval))))
 
 (defun x-font-families-for-device (&optional device no-resetp)
@@ -756,8 +752,8 @@ the new redisplay engine.")
     (:bold        . "Bold")
     (:regular    . "Regular")
     (:extra-bold  . "Extrabold"))
-  "An assoc list mapping keywords to actual mswindows specific strings
-for use in the 'weight' field of an mswindows font string.")
+  "Alist mapping keywords to actual MS-Windows specific strings.
+These are for use in the `weight' field of an MS-Windows font string.")
 
 (defvar font-mswindows-family-mappings
   '(
@@ -985,11 +981,12 @@ for use in the 'weight' field of an mswindows font 
string.")
   (cond
    ((and (vectorp font) (= (length font) 12))
     (set-face-property face 'font-specification font)
-    (set-face-attribute face nil
-                       :underline (font-underline-p font)
-                       :weight (or (cdr-safe (assoc (font-weight font)
-                                                    
font-new-redisplay-weight-mappings))
-                                   'normal))
+    (set-face-attribute
+     face nil
+     :underline (font-underline-p font)
+     :weight (or (cdr-safe (assoc (font-weight font)
+                                 font-new-redisplay-weight-mappings))
+                'normal))
     (if (font-find-available-family font)
        (set-face-attribute :family (font-find-available-family font)))
     (if (and (font-size font)
@@ -1021,8 +1018,8 @@ for use in the 'weight' field of an mswindows font 
string.")
          (set-face-font cur font-spec device)))))
 
 (defun font-update-one-face (face &optional device-list)
-  ;; Update FACE on all devices in DEVICE-LIST
-  ;; DEVICE_LIST defaults to a list of all active devices
+  "Update FACE on all devices in DEVICE-LIST.
+DEVICE_LIST defaults to a list of all active devices."
   (setq device-list (or device-list (device-list)))
   (if (devicep device-list)
       (setq device-list (list device-list)))
@@ -1126,7 +1123,7 @@ The list (R G B) is returned, or an error is signaled if 
the lookup fails."
                     (?3 . 3) (?d . 13) (?D . 13)
                     (?4 . 4) (?e . 14) (?E . 14)
                     (?5 . 5) (?f . 15) (?F . 15)
-                    (?6 . 6) 
+                    (?6 . 6)
                     (?7 . 7)
                     (?8 . 8)
                     (?9 . 9)))
@@ -1248,7 +1245,7 @@ The variable x-library-search-path is use to locate the 
rgb.txt file."
       (font-lookup-rgb-components color)))))
 
 (defsubst font-tty-compute-color-delta (col1 col2)
-  (+ 
+  (+
    (* (- (aref col1 0) (aref col2 0))
       (- (aref col1 0) (aref col2 0)))
    (* (- (aref col1 1) (aref col2 1))
@@ -1292,8 +1289,8 @@ The variable x-library-search-path is use to locate the 
rgb.txt file."
     (cdr-safe (aref colors nearest))))
 
 (defun font-normalize-color (color &optional device)
-  "Return an RGB tuple, given any form of input.  If an error occurs, black
-is returned."
+  "Return an RGB tuple, given any form of input.
+If an error occurs, return black."
   (case (device-type device)
    ((x pm)
     (apply 'format "#%02x%02x%02x" (font-color-rgb-components color)))
@@ -1388,7 +1385,7 @@ is returned."
       (pop faces))))
 
 (defcustom font-blink-interval 0.5
-  "How often to blink faces"
+  "How often to blink faces."
   :type 'number
   :group 'faces)
   
@@ -1401,7 +1398,7 @@ is returned."
                  font-blink-interval
                  font-blink-interval))
    ((fboundp 'run-at-time)
-    (cancel-function-timers 'font-blink-callback)    
+    (cancel-function-timers 'font-blink-callback)
     (run-at-time font-blink-interval
                 font-blink-interval
                 'font-blink-callback))

commit 66fd662ac64cd0be1d37be91b0ca18531e0b6b0d
Author: Dave Love <address@hidden>
Date:   Tue Jan 22 18:33:38 2002 +0000

    Require cl only when compiling.

diff --git a/lisp/devices.el b/lisp/devices.el
index f27186f..71ed43e 100644
--- a/lisp/devices.el
+++ b/lisp/devices.el
@@ -1,7 +1,7 @@
 ;;; devices.el -- XEmacs device API emulation
 ;; Author: $Author: fx $
-;; Created: $Date: 2000/12/20 20:41:24 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 2002/01/22 18:33:38 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -31,7 +31,7 @@
 ;; XEmacs 19.14.  A 'device' for Emacs 19 is just a frame, from which we can
 ;; determine the connection to an X display, etc.
 
-(require 'cl)
+(eval-when-compile (require 'cl))
 (eval-when-compile
   (if (string-match "XEmacs" (emacs-version))
       (set 'byte-optimize nil)))

commit bfaa4b66632f5be0288813260ad58bd0f8806eab
Author: Dave Love <address@hidden>
Date:   Tue Jan 22 18:31:50 2002 +0000

    (url-util): Require.
    (w3-java-run-applet): Use url-generate-unique-filename, not
    non-existent mailcap-generate-unique-filename.

diff --git a/lisp/w3-java.el b/lisp/w3-java.el
index b320e6c..78ffb28 100644
--- a/lisp/w3-java.el
+++ b/lisp/w3-java.el
@@ -1,7 +1,7 @@
 ;;; w3-java.el --- Rudimentary java support
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:36:07 $
-;; Version: $Revision: 1.2 $
+;; Author: $Author: fx $
+;; Created: $Date: 2002/01/22 18:31:50 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: hypermedia, scripting
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -25,6 +25,7 @@
 ;;; Boston, MA 02111-1307, USA.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (require 'mailcap)
+(require 'url-util)                    ; for `url-generate-unique-filename'
 
 (defgroup w3-java nil
   "Emacs/W3 Java Runtime support"
@@ -46,7 +47,7 @@ Java applet."
   :group 'w3-java)
 
 (defun w3-java-run-applet (options params)
-  (let ((file (mailcap-generate-unique-filename "%s-runjava.html")))
+  (let ((file (url-generate-unique-filename "%s-runjava.html")))
     (save-excursion
       (set-buffer (get-buffer-create " *java*"))
       (erase-buffer)

commit 6e9a99913594b6e81398e73eb1568299dbb65b7e
Author: Dave Love <address@hidden>
Date:   Tue Jan 22 18:28:06 2002 +0000

    (w3-first-n-items, w3-only-links)
    (w3-fix-spaces): Autoload to avoid compiler warnings.
    (w3-menu-filters-supported-p): Include Emacs 21.
    (w3-menu-links-constructor): Use modern backquote syntax.

diff --git a/lisp/w3-menu.el b/lisp/w3-menu.el
index 566e11e..0840f99 100644
--- a/lisp/w3-menu.el
+++ b/lisp/w3-menu.el
@@ -1,11 +1,11 @@
 ;;; w3-menu.el --- Menu functions for emacs-w3
 ;; Author: Bill Perry <address@hidden>
-;; Version: $Revision: 1.13 $
+;; Version: $Revision: 1.14 $
 ;; Keywords: menu, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
+;;; Copyright (c) 1996, 97, 98, 99, 2000, 2001 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -32,6 +32,9 @@
   (require 'cl)
   (defvar w3-html-bookmarks))
 (autoload 'url-truncate-url-for-viewing "url-util")
+(autoload 'w3-first-n-items "w3")
+(autoload 'w3-only-links "w3")
+(autoload 'w3-fix-spaces "w3")
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; InfoDock stuff
@@ -43,8 +46,10 @@
 ;;; Spiffy new menus (for both Emacs and XEmacs)
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (defvar w3-menu-filters-supported-p
-  (or (featurep 'xemacs) (and (= emacs-major-version 20)
-                            (>= emacs-minor-version 3))))
+  (or (featurep 'xemacs)
+      (and (= emacs-major-version 20)
+                             (>= emacs-minor-version 3))
+      (>= emacs-major-version 21)))
 
 (defvar w3-menu-fsfemacs-bookmark-menu nil)
 (defvar w3-menu-fsfemacs-debug-menu nil)
@@ -194,7 +199,8 @@ on that platform."
                                (buffer-substring-no-properties
                                 (widget-get widget :from)
                                 (widget-get widget :to)))))
-                         (` (url-retrieve (url-expand-file-name (, href)))) t) 
menu)))
+                         `(url-retrieve (url-expand-file-name ,href)) t)
+                 menu)))
     (setq menu (w3-menu-breakup menu w3-max-menu-length))
     (easy-menu-define w3-menu-links-menu nil "Emacs/W3 dynamic menu"
                      (or menu (w3-menu-dummy-menu "No links")))
@@ -346,8 +352,10 @@ on that platform."
 (defconst w3-menu-go-menu
   (list
    "Go"
-   ["Forward" w3-history-forward (cdr (w3-history-find-url-internal 
(url-view-url t)))]
-   ["Back" w3-history-backward (car (w3-history-find-url-internal 
(url-view-url t)))]
+   ["Forward" w3-history-forward
+    (cdr (w3-history-find-url-internal (url-view-url t)))]
+   ["Back" w3-history-backward
+    (car (w3-history-find-url-internal (url-view-url t)))]
    ["Home" w3 w3-default-homepage]
    ["View History..." w3-show-history-list url-history-track]
    "----"

commit a6feffc0103db449e35ed3f0587906fe52dccff6
Author: Dave Love <address@hidden>
Date:   Tue Jan 22 18:21:21 2002 +0000

    Require cl only when compiling.  Require url.  Doc
    fixes.
    (ssl-view-certificate-program-arguments): Modify :type.
    (top-level): Delete custom compatibility code since we require a
    modern Emacs.
    (open-ssl-stream): Use modern backquote syntax.

diff --git a/lisp/ssl.el b/lisp/ssl.el
index 32bd266..4db1b2d 100644
--- a/lisp/ssl.el
+++ b/lisp/ssl.el
@@ -1,12 +1,11 @@
-;;; ssl.el,v --- ssl functions for emacsen without them builtin
-;; Author: $Author: wmperry $
-;; Created: $Date: 2001/11/24 20:59:52 $
-;; Version: $Revision: 1.3 $
+;;; ssl.el,v --- ssl functions for Emacsen without them builtin
+;; Author: William M. Perry <address@hidden>
+;; $Revision: 1.4 $
 ;; Keywords: comm
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1995, 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
+;;; Copyright (c) 1996, 97, 98, 99, 2001 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -26,27 +25,16 @@
 ;;; Boston, MA 02111-1307, USA.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(require 'cl)
+(eval-when-compile (require 'cl))
 (require 'base64)
-
-(eval-and-compile
-  (condition-case ()
-      (require 'custom)
-    (error nil))
-  (if (and (featurep 'custom) (fboundp 'custom-declare-variable))
-      nil ;; We've got what we needed
-    ;; We have the old custom-library, hack around it!
-    (defmacro defgroup (&rest args)
-      nil)
-    (defmacro defcustom (var value doc &rest args) 
-      (` (defvar (, var) (, value) (, doc))))))
+(require 'url)                         ; for `url-configuration-directory'
 
 (defgroup ssl nil
   "Support for `Secure Sockets Layer' encryption."
   :group 'comm)
   
 (defcustom ssl-certificate-directory "~/.w3/certs/"
-  "*Directory to store CA certificates in"
+  "*Directory in which to store CA certificates."
   :group 'ssl
   :type 'directory)
 
@@ -66,7 +54,7 @@ Run with one argument, the directory name."
 The certificate is piped to it.
 Maybe a way of passing a file should be implemented"
   :group 'ssl
-  :type 'list)
+  :type '(repeat string))
 
 (defcustom ssl-certificate-directory-style 'ssleay
   "*Style of cert database to use, the only valid value right now is `ssleay'.
@@ -105,6 +93,19 @@ to."
   :group 'ssl
   :type 'list)
 
+(defcustom ssl-view-certificate-program-name ssl-program-name
+  "*The program to run to provide a human-readable view of a certificate."
+  :group 'ssl
+  :type 'string)
+
+(defcustom ssl-view-certificate-program-arguments
+  '("x509" "-text" "-inform" "DER")
+  "*Arguments that should be passed to the certificate viewing program.
+The certificate is piped to it.
+Maybe a way of passing a file should be implemented."
+  :group 'ssl
+  :type 'list)
+
 (defun ssl-certificate-information (der)
   "Return an assoc list of information about a certificate in DER format."
   (let ((certificate (concat "-----BEGIN CERTIFICATE-----\n"
@@ -115,18 +116,19 @@ to."
       (set-buffer (get-buffer-create " *openssl*"))
       (erase-buffer)
       (insert certificate)
-      (setq exit-code (condition-case ()
-                         (call-process-region (point-min) (point-max)
-                                              ssl-program-name
-                                              t (list (current-buffer) nil) t
-                                              "x509"
-                                              "-subject" ; Print the subject DN
-                                              "-issuer" ; Print the issuer DN
-                                              "-dates" ; Both before and after 
dates
-                                              "-serial" ; print out serial 
number
-                                              "-noout" ; Don't spit out the 
certificate
-                                              )
-                       (error -1)))
+      (setq exit-code
+           (condition-case ()
+               (call-process-region (point-min) (point-max)
+                                    ssl-program-name
+                                    t (list (current-buffer) nil) t
+                                    "x509"
+                                    "-subject" ; Print the subject DN
+                                    "-issuer" ; Print the issuer DN
+                                    "-dates" ; Both before and after dates
+                                    "-serial" ; print out serial number
+                                    "-noout" ; Don't spit out the certificate
+                                    )
+             (error -1)))
       (if (/= exit-code 0)
          nil
        (let ((vals nil))
@@ -136,17 +138,17 @@ to."
          vals)))))
   
 (defun ssl-accept-ca-certificate ()
-  "Ask if the user is willing to accept a new CA certificate. The buffer-name
-should be the intended name of the certificate, and the buffer should probably
-be in DER encoding"
+  "Ask if the user is willing to accept a new CA certificate.
+The buffer name should be the intended name of the certificate, and
+the buffer should probably be in DER encoding"
   ;; TODO, check if it is really new or if we already know it
   (let* ((process-connection-type nil)
         (tmpbuf (generate-new-buffer "X509 CA Certificate Information"))
         (response (save-excursion
-                    (and (eq 0 
+                    (and (eq 0
                              (apply 'call-process-region
-                                    (point-min) (point-max) 
-                                    ssl-view-certificate-program-name 
+                                    (point-min) (point-max)
+                                    ssl-view-certificate-program-name
                                     nil tmpbuf t
                                     ssl-view-certificate-program-arguments))
                          (switch-to-buffer tmpbuf)
@@ -187,7 +189,8 @@ be in DER encoding"
              ;; Need to create our handy-dandy utility script to shut OpenSSL
              ;; up completely.
              (progn
-               (write-region "#!/bin/sh\n\nexec \"address@hidden" 2> 
/dev/null\n" nil script nil 5)
+               (write-region "#!/bin/sh\n\nexec \"address@hidden" 2> 
/dev/null\n" nil
+                             script nil 5)
                (set-file-modes script 493))) ; (rwxr-xr-x)
          (setq ssl-exec-wrapper script)))
     (cons ssl-exec-wrapper (cons ssl-program-name ssl-program-arguments))))
@@ -198,11 +201,11 @@ Returns a subprocess-object to represent the connection.
 Input and output work as for subprocesses; `delete-process' closes it.
 Args are NAME BUFFER HOST SERVICE.
 NAME is name for process.  It is modified if necessary to make it unique.
-BUFFER is the buffer (or buffer-name) to associate with the process.
- Process output goes at end of that buffer, unless you specify
- an output stream or filter function to handle the output.
- BUFFER may be also nil, meaning that this process is not associated
- with any buffer
+BUFFER is the buffer (or buffer name) to associate with the process.
+Process output goes at end of that buffer, unless you specify
+an output stream or filter function to handle the output.
+BUFFER may be also nil, meaning that this process is not associated
+with any buffer.
 Third arg is name of the host to connect to, or its IP address.
 Fourth arg SERVICE is name of the service desired, or an integer
 specifying a port number to connect to."
@@ -210,9 +213,7 @@ specifying a port number to connect to."
   (let* ((process-connection-type nil)
         (port service)
         (proc (eval
-               (`
-                (start-process name buffer
-                               (,@ (ssl-get-command)))))))
+               (start-process name buffer ,@(ssl-get-command)))))
     (process-kill-without-query proc)
     proc))
 

commit 1505fd40ba0fa62979ab40036f629911dc50287d
Author: Dave Love <address@hidden>
Date:   Tue Jan 22 18:06:21 2002 +0000

    Copyright update.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 0f4275d..3d56075 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,11 +1,11 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.40 $
+;; Version: $Revision: 1.41 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
+;;; Copyright (c) 1996, 97, 98, 99, 2000, 2001 Free Software Foundation, Inc.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;
 ;;; This file is part of GNU Emacs.

commit 8dc47f560c1731aec4b77dbd1fd36b33f2da85a4
Author: Dave Love <address@hidden>
Date:   Tue Jan 22 18:04:30 2002 +0000

    (top-level): Declarations and autoloads to
    avoid compiler warnings.
    (w3-display-node): Use copy-sequence, not CL runtime copy-tree.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 8601da6..0f4275d 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.39 $
+;; Version: $Revision: 1.40 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -27,7 +27,8 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (eval-when-compile
   (require 'cl)
-  (require 'w3-props))
+  (require 'w3-props)
+  (defvar w3-last-parse-tree))
 (require 'css)
 (require 'font)
 (require 'url-parse)
@@ -47,6 +48,14 @@
 (autoload 'w3-find-specific-link "w3")
 (autoload 'w3-fix-spaces "w3")
 (autoload 'mm-inline-text "mm-view")   ; may not be done by Gnus
+(autoload 'w3-form-resurrect-widgets "w3-forms")
+(autoload 'w3-do-setup "w3")
+(autoload 'w3-parse-buffer "w3-parse")
+(autoload 'w3-mode "w3")
+(autoload 'w3-handle-style "w3-style")
+(autoload 'w3-form-add-element "w3-forms")
+(autoload 'w3-warn "w3")
+
 (defvar w3-cookie-cache nil)
 
 (defmacro w3-d-s-var-def (var)
@@ -2190,7 +2199,7 @@ Format: (((image-alt row column) . offset) ...)")
                    (old-props w3-display-css-properties)
                    (active-face nil)
                    (visited-face nil)
-                   (munged (copy-tree args)))
+                   (munged (copy-sequence args)))
               (if (assq 'class munged)
                   (push ":active" (cdr (assq 'class munged)))
                 (setq munged (cons (cons 'class '(":active")) munged)))
@@ -2201,7 +2210,7 @@ Format: (((image-alt row column) . offset) ...)")
                                                w3-display-open-element-stack))
               (setq active-face (w3-face-for-element (list tag munged nil)))
               (w3-pop-all-face-info)
-              (setq munged (copy-tree args))
+              (setq munged (copy-sequence args))
               (if (assq 'class munged)
                   (push ":visited" (cdr (assq 'class munged)))
                 (setq munged (cons (cons 'class '(":visited")) munged)))
@@ -2234,8 +2243,10 @@ Format: (((image-alt row column) . offset) ...)")
               )
             )
            ((ol ul dl menu)
-            (push (if (or (w3-get-attribute 'start) (w3-get-attribute 'seqnum))
-                      (1- (string-to-int (or (w3-get-attribute 'start) 
(w3-get-attribute 'seqnum))))
+            (push (if (or (w3-get-attribute 'start)
+                          (w3-get-attribute 'seqnum))
+                      (1- (string-to-int (or (w3-get-attribute 'start)
+                                             (w3-get-attribute 'seqnum))))
                     0) w3-display-list-stack)
             (w3-handle-content node))
            (dir

commit 561c3629a57d858dbecb6f1ab0228ff62c7abe28
Author: Dave Love <address@hidden>
Date:   Tue Jan 22 17:56:53 2002 +0000

    (w3-nasty-disgusting-http-equiv-handling): Make
    buffer arg compulsory and always set the buffer.  Parse a copy of
    the head region, since w3-parse-region widens the buffer and may
    mung it.
    (w3-fetch-callback): Give w3-nasty-disgusting-http-equiv-handling
    an arg.

diff --git a/lisp/w3.el b/lisp/w3.el
index cda1ac6..9e7023d 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
-;; Author: $Author: wmperry $
-;; Created: $Date: 2001/11/22 00:34:31 $
-;; Version: $Revision: 1.26 $
+;; Author: $Author: fx $
+;; Created: $Date: 2002/01/22 17:56:53 $
+;; Version: $Revision: 1.27 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -208,11 +208,12 @@ variable `http-header'."
                                         (cdr (assq 'content attrs))))))))
              (w3-http-equiv-headers (nth 2 node)))))))
 
-(defun w3-nasty-disgusting-http-equiv-handling (&optional buffer)
-  "Propagate information from <meta http-equiv...> elements to MIME headers."
+(defun w3-nasty-disgusting-http-equiv-handling (buffer)
+  "Propagate information from <meta http-equiv...> elements to MIME headers.
+Operate on BUFFER."
   (let (content-type end-of-headers extra-headers)
     (save-excursion
-      (if buffer (set-buffer buffer))
+      (set-buffer buffer)
       (goto-char (point-min))
       (mail-narrow-to-head)
       (setq content-type (mail-fetch-field "content-type"))
@@ -223,7 +224,7 @@ variable `http-header'."
        (if (and content-type (string-match "^text/html" content-type)
                 ;; Try not to parse past the head element.
                 (re-search-forward "</[ \n]*head\\|<[ \n]*body" nil t))
-           (let ((end-of-head (point)))
+           (let ((end-of-head (match-beginning 0)))
              ;; Find any <meta http-equiv> stuff in the head so we
              ;; can promote it into the MIME headers before
              ;; mm-dissect-buffer looks at them.
@@ -233,7 +234,17 @@ variable `http-header'."
                  (goto-char (point-min))
                  ;; Quick check before parsing.
                  (if (search-forward "http-equiv=" nil t)
-                     (w3-http-equiv-headers (w3-parse-buffer))))
+                     (w3-http-equiv-headers
+                      ;; We need to take a copy of the region we're
+                      ;; going to parse (which we hope is small) to
+                      ;; avoid assumptions about what
+                      ;; `w3-parse-buffer' does in the way of
+                      ;; widening and munging character references
+                      ;; &c.
+                      (with-temp-buffer
+                        (insert-buffer-substring buffer
+                                                 end-of-headers end-of-head)
+                        (w3-parse-buffer)))))
                (when http-header
                  (goto-char (point-min))
                  (insert http-header)))))))))
@@ -279,7 +290,7 @@ MUST-BE-VIEWING is the current URL when the timer expires."
                               (string-to-int (or reload "5"))))))
 
 (defun w3-fetch-callback (url)
-  (w3-nasty-disgusting-http-equiv-handling)
+  (w3-nasty-disgusting-http-equiv-handling (current-buffer))
   ;; Process any cookie and refresh headers.
   (let (headers)
     (ignore-errors

commit 48d8a1ae3bc6ec9ffad8047e1dc521206c914d67
Author: William M. Perry <address@hidden>
Date:   Tue Dec 4 15:49:58 2001 +0000

    2001-12-04  William M. Perry  <address@hidden>
    
        * lisp/w3-display.el (w3-display-node): Explicitly put in breaks
        for <hr> - <p> is not always inferred before and after (like when
        using w3-fast-parse.
    
    2001-11-25  William M. Perry  <address@hidden>
    
        * lisp/w3-parse.el (w3-parse-buffer): Add : to the allowed tag
        names to deal with Microsoft XHTML.
        (w3-parse-buffer): Allow : in attribute names for XHTML

diff --git a/ChangeLog b/ChangeLog
index 5a75a20..ccf31fe 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2001-12-04  William M. Perry  <address@hidden>
+
+       * lisp/w3-display.el (w3-display-node): Explicitly put in breaks
+       for <hr> - <p> is not always inferred before and after (like when
+       using w3-fast-parse.
+
+2001-11-25  William M. Perry  <address@hidden>
+
+       * lisp/w3-parse.el (w3-parse-buffer): Add : to the allowed tag
+       names to deal with Microsoft XHTML.
+       (w3-parse-buffer): Allow : in attribute names for XHTML
+
 2001-11-24  William M. Perry  <address@hidden>
 
        * lisp/font.el (font-set-face-font-new-redisplay): Doh!  Fix my
diff --git a/TODO b/TODO
index 243c3ca..f18ea85 100644
--- a/TODO
+++ b/TODO
@@ -75,9 +75,3 @@ FEATURES (5.0)
   - implement <spacer> from netscape 3.0b5
   - Handle math environment using the calc library
   - Better integration with the parser
-
-MAINTENANCE CRAP (4.0)
-- Get in touch with "Rob" == Rob Partington <address@hidden> about
-  registering w3.browser.org
-- Legal Papers (status - emailed necessary paperwork)
-  - Stephen Peters <address@hidden> - LaTeX code (???)
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 9b5e690..8601da6 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.38 $
+;; Version: $Revision: 1.39 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2314,7 +2314,9 @@ Format: (((image-alt row column) . offset) ...)")
                   (setq perc (/ (min (string-to-int perc) 100) 100.0)
                         width (truncate (* fill-column perc)))
                 (setq width perc))
+              (w3-display-handle-break)
               (w3-insert-terminal-char (w3-horizontal-rule-char) width)
+              (w3-display-handle-break)
               (w3-handle-empty-tag)))
            (map                        ; Client side imagemaps
             (let ((name (or (w3-get-attribute 'name)
diff --git a/lisp/w3-fast-parse.el b/lisp/w3-fast-parse.el
new file mode 100644
index 0000000..b51d944
--- /dev/null
+++ b/lisp/w3-fast-parse.el
@@ -0,0 +1,98 @@
+;;; w3-fast-parse.el --- Parse HTML and/or XML for Emacs/W3
+
+;; Author: William M. Perry <address@hidden>
+
+;; Copyright © 2001 Free Software Foundation
+;; 
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2 of the License, or
+;; (at your option) any later version.
+;; 
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;; 
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+(require 'xml)
+
+(defvar w3-fast-parse-tidy-program nil)
+
+(defun w3-fast-parse-find-program (program var)
+  (if (not (symbol-value var))
+      (let (p)
+       (mapc (lambda (d)
+               (if (file-executable-p (setq p (expand-file-name program d)))
+                   (set var p)))
+             exec-path)))
+  (symbol-value var))
+
+(defun w3-fast-parse-find-tidy-program ()
+  (w3-fast-parse-find-program "tidy" 'w3-fast-parse-tidy-program))
+
+(defun w3-fast-parse-cleanup (tree)
+  (declare (special base-object))
+  (let* (node tag attrs content btdt)
+    (while (setq node (car tree))
+      (setq tree (cdr tree))
+      (if (stringp node)
+         nil                           ; Do nothing
+       (setq tag (nth 0 node)
+             attrs (nth 1 node)
+             content (nth 2 node))
+       (cond
+        ((eq tag 'base)
+         (setq base-object (cdr-safe (or (assq 'src attrs) (assq 'href 
attrs)))))
+        ((setq btdt
+               (or (assq 'src attrs)
+                   (assq 'background attrs)
+                   (assq 'codebase attrs)
+                   (assq 'href attrs)
+                   (assq 'action attrs)))
+         (setcdr btdt (url-expand-file-name (cdr btdt) base-object))
+         (setq btdt (if (url-have-visited-url (cdr btdt))
+                        ":visited"
+                      ":link"))
+         (if (assq 'class attrs)
+             (setcdr (assq 'class attrs)
+                     (cons btdt (cdr (assq 'class attrs))))
+           (setf (nth 1 node)
+                 (cons (cons 'class (list btdt)) attrs))))
+        (t
+         nil))
+       (w3-fast-parse-cleanup content)))))
+
+(defun w3-fast-parse-buffer (&optional buff)
+  "Parse contents of BUFF as HTML.
+BUFF defaults to the current buffer.
+Destructively alters contents of BUFF.
+Returns a data structure containing the parsed information."
+  (if (not w3-setup-done) (w3-do-setup))
+  (let ((tree nil)
+       (base-object nil)
+       (tidy-program (w3-fast-parse-find-tidy-program)))
+    (save-excursion
+      (if buff
+         (set-buffer buff)
+       (setq buff (current-buffer)))
+      (buffer-disable-undo buff)
+      (widen)
+      (call-process-region (point-min) (point-max)
+                          tidy-program
+                          t (list buff nil) nil
+                          "-quiet" "-asxml" "-clean")
+      (setq tree (xml-parse-region (point-min) (point-max) buff))
+      (setq w3-last-parse-tree
+           (list
+            (list '*document
+                  nil
+                  tree)))
+      (w3-fast-parse-cleanup w3-last-parse-tree)
+      w3-last-parse-tree)))
+
+(provide 'w3-fast-parse)
diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index e445fb3..65cb4e9 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -2025,7 +2025,7 @@ Do nothing in non-Mule or unibyte session."
 ;; %       DO NOT call any of the other functions!      %
 ;; %                                                    %
 ;; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-(defun w3-parse-buffer (&optional buff)
+(defun w3-slow-parse-buffer (&optional buff)
   "Parse contents of BUFF as HTML.
 BUFF defaults to the current buffer.
 Destructively alters contents of BUFF.
@@ -2213,7 +2213,9 @@ Returns a data structure containing the parsed 
information."
              (forward-char)
              (cond
 
-              ((looking-at "/?\\([a-z][-a-z0-9.]*\\)")
+              ;; jbw 2001-11-02: added possibility of of ":" in element
+              ;; name to handle Microsoft-generated XHTML.
+              ((looking-at "/?\\([a-z][-a-z0-9.:]*\\)")
                ;; We are looking at a non-empty tag.
 
                ;; Downcase it in the buffer, to save creation of a string
@@ -2253,7 +2255,9 @@ Returns a data structure containing the parsed 
information."
                          "[ \n\r\t,]*"
                          ;; The attribute name, possibly with a bad syntax
                          ;; component.
-                         
"\\([a-z_:][-a-z0-9.]*\\(\\([_][-a-z0-9._:]*\\)?\\)\\)"
+                         ;; jbw 2001-11-02: added possibility of ":" to
+                         ;; next line to handle Microsoft-generated XHTML.
+                         
"\\([a-z_][-a-z0-9.]*\\(\\([_:][-a-z0-9._:]*\\)?\\)\\)"
                          ;; Trailing whitespace and perhaps an "=".
                          "[ \n\r\t]*\\(\\(=[ \n\r\t]*\\)?\\)")))
                
@@ -2914,6 +2918,18 @@ Returns a data structure containing the parsed 
information."
          (w3-element-content w3-p-d-current-element)
          )))))
 
+(require 'w3-fast-parse)
+
+(defun w3-parse-buffer (&optional buff)
+  "Parse contents of BUFF as HTML.
+BUFF defaults to the current buffer.
+Destructively alters contents of BUFF.
+Returns a data structure containing the parsed information."
+  (if nil ;; (w3-fast-parse-find-tidy-program)
+      (fset 'w3-parse-buffer 'w3-fast-parse-buffer)
+    (fset 'w3-parse-buffer 'w3-slow-parse-buffer))
+  (w3-parse-buffer buff))
+
 
 
 (provide 'w3-parse)

commit 97f94a061286da9f1bfc8d770391f43c5df35f3d
Author: William M. Perry <address@hidden>
Date:   Sat Nov 24 21:07:38 2001 +0000

    Fix font-size screwup.

diff --git a/ChangeLog b/ChangeLog
index a2416e4..5a75a20 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2001-11-24  William M. Perry  <address@hidden>
 
+       * lisp/font.el (font-set-face-font-new-redisplay): Doh!  Fix my
+       last font-size checking screwup.  *sigh*
+
        * lisp/ssl.el (ssl-get-command): New routine to handle wrapping
        the ssl program inside something that will redirect stderr to
        /dev/null.  Do this only on non-dos, non-windows, and non-vms
diff --git a/lisp/font.el b/lisp/font.el
index f71bbf3..8217d1a 100644
--- a/lisp/font.el
+++ b/lisp/font.el
@@ -1,7 +1,7 @@
 ;;; font.el --- New font model
 ;; Author: $Author: wmperry $
-;; Created: $Date: 2001/11/24 20:59:52 $
-;; Version: $Revision: 1.8 $
+;; Created: $Date: 2001/11/24 21:07:38 $
+;; Version: $Revision: 1.9 $
 ;; Keywords: faces
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -992,7 +992,8 @@ for use in the 'weight' field of an mswindows font string.")
                                    'normal))
     (if (font-find-available-family font)
        (set-face-attribute :family (font-find-available-family font)))
-    (if (not (eq (font-size font) 0))
+    (if (and (font-size font)
+            (/= 0 (font-size font)))
        (set-face-attribute face nil
                            :height (* 10 (font-spatial-to-canonical (font-size 
font))))))
    (t

commit 8f6900a75326ed10e4927080ec8900181e04f03e
Author: William M. Perry <address@hidden>
Date:   Sat Nov 24 20:59:52 2001 +0000

        * lisp/ssl.el (ssl-get-command): New routine to handle wrapping
        the ssl program inside something that will redirect stderr to
        /dev/null.  Do this only on non-dos, non-windows, and non-vms
        system types.  This is necessary because the -quiet switch to
        openssl's s_client program doesn't do what it is supposed to do.
        *sigh*
    
        * lisp/font.el (font-set-face-font-new-redisplay): Check font-size
        for == 0, not just non-nil.

diff --git a/ChangeLog b/ChangeLog
index 058aeb1..a2416e4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2001-11-24  William M. Perry  <address@hidden>
+
+       * lisp/ssl.el (ssl-get-command): New routine to handle wrapping
+       the ssl program inside something that will redirect stderr to
+       /dev/null.  Do this only on non-dos, non-windows, and non-vms
+       system types.  This is necessary because the -quiet switch to
+       openssl's s_client program doesn't do what it is supposed to do.
+       *sigh*
+
+       * lisp/font.el (font-set-face-font-new-redisplay): Check font-size
+       for == 0, not just non-nil.
+
 2001-11-21  William M. Perry  <address@hidden>
 
        * lisp/w3.el (w3-mode): Don't bother calling
diff --git a/lisp/font.el b/lisp/font.el
index 0fdf819..f71bbf3 100644
--- a/lisp/font.el
+++ b/lisp/font.el
@@ -1,7 +1,7 @@
 ;;; font.el --- New font model
-;; Author: $Author: fx $
-;; Created: $Date: 2001/08/24 09:23:33 $
-;; Version: $Revision: 1.7 $
+;; Author: $Author: wmperry $
+;; Created: $Date: 2001/11/24 20:59:52 $
+;; Version: $Revision: 1.8 $
 ;; Keywords: faces
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -992,7 +992,7 @@ for use in the 'weight' field of an mswindows font string.")
                                    'normal))
     (if (font-find-available-family font)
        (set-face-attribute :family (font-find-available-family font)))
-    (if (font-size font)
+    (if (not (eq (font-size font) 0))
        (set-face-attribute face nil
                            :height (* 10 (font-spatial-to-canonical (font-size 
font))))))
    (t
diff --git a/lisp/ssl.el b/lisp/ssl.el
index 516ace1..32bd266 100644
--- a/lisp/ssl.el
+++ b/lisp/ssl.el
@@ -1,7 +1,7 @@
 ;;; ssl.el,v --- ssl functions for emacsen without them builtin
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/10/14 12:44:18 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 2001/11/24 20:59:52 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: comm
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -174,6 +174,24 @@ be in DER encoding"
                         nil nil nil
                         (expand-file-name ssl-certificate-directory))))))))
 
+(defvar ssl-exec-wrapper nil)
+
+(defun ssl-get-command ()
+  (if (memq system-type '(ms-dos ms-windows axp-vms vax-vms))
+      ;; Nothing to do on DOS, Windows, or VMS!
+      (cons ssl-program-name ssl-program-arguments)
+    (if (not ssl-exec-wrapper)
+       (let ((script
+              (expand-file-name "exec_ssl_quietly" 
url-configuration-directory)))
+         (if (not (file-executable-p script))
+             ;; Need to create our handy-dandy utility script to shut OpenSSL
+             ;; up completely.
+             (progn
+               (write-region "#!/bin/sh\n\nexec \"address@hidden" 2> 
/dev/null\n" nil script nil 5)
+               (set-file-modes script 493))) ; (rwxr-xr-x)
+         (setq ssl-exec-wrapper script)))
+    (cons ssl-exec-wrapper (cons ssl-program-name ssl-program-arguments))))
+
 (defun open-ssl-stream (name buffer host service)
   "Open a SSL connection for a service to a host.
 Returns a subprocess-object to represent the connection.
@@ -193,8 +211,8 @@ specifying a port number to connect to."
         (port service)
         (proc (eval
                (`
-                (start-process name buffer ssl-program-name
-                               (,@ ssl-program-arguments))))))
+                (start-process name buffer
+                               (,@ (ssl-get-command)))))))
     (process-kill-without-query proc)
     proc))
 

commit d465481e02567674791ead99613420ad9b4c146b
Author: William M. Perry <address@hidden>
Date:   Thu Nov 22 00:34:43 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 5dbe38a..058aeb1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2001-11-21  William M. Perry  <address@hidden>
 
+       * lisp/w3.el (w3-mode): Don't bother calling
+       kill-all-local-variables.  It screws up too many things, namely
+       emacspeak personality properties and XEmacs' buffer-local faces.
+
+       * lisp/w3-display.el (w3-handle-string-content): Just go ahead an
+       always put the personality (aural properties) on text.
+
        * lisp/w3-parse.el (w3-parse-buffer): Patch from Joe Wells to
        handle XHTML a little bit better.  Still a hack, but it will now
        work at all.

commit a6f79f3e6ce4590c273550cca3d068e898f846fe
Author: William M. Perry <address@hidden>
Date:   Thu Nov 22 00:34:31 2001 +0000

        * lisp/w3.el (w3-mode): Don't bother calling
        kill-all-local-variables.  It screws up too many things, namely
        emacspeak personality properties and XEmacs' buffer-local faces.

diff --git a/lisp/w3.el b/lisp/w3.el
index 2b1c51c..cda1ac6 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
-;; Author: $Author: fx $
-;; Created: $Date: 2001/10/31 16:17:21 $
-;; Version: $Revision: 1.25 $
+;; Author: $Author: wmperry $
+;; Created: $Date: 2001/11/22 00:34:31 $
+;; Version: $Revision: 1.26 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2028,22 +2028,35 @@ Current keymap is:
   (w3-do-setup)
   (if (interactive-p)
       (w3-preview-this-buffer)
-    (let ((tmp (mapcar (lambda (x) (cons x (and (boundp x) (symbol-value x))))
-                      w3-persistent-variables)))
-      ;; Oh gross, this kills buffer-local faces in XEmacs
-      (unless (featurep 'xemacs)
-       (kill-all-local-variables))
-      (use-local-map w3-mode-map)
-      (setq mode-name "WWW")
-      (mapcar (lambda (x) (if (boundp (car x))
-                             (set-variable (car x) (cdr x)))) tmp)
-      (setq major-mode 'w3-mode)
-      (w3-mode-version-specifics)
-      (w3-menu-install-menus)
-      (setq truncate-lines t
-           mode-line-format w3-modeline-format)
-      (run-hooks 'w3-mode-hook)
-      (widget-setup))))
+    ;; This code used to keep a few buffer-local variables around so
+    ;; that we could be a nice major mode and kill all the local
+    ;; variables like we are supposed to, but still save some of them
+    ;; that were set up in the URL and parsing libraries.
+    ;;
+    ;: Two problems with this approach:
+    ;;
+    ;; 1) It kills buffer-local faces in XEmacs, which we use extensively.
+    ;; 2) With Emacspeak it causes all the personality properties on
+    ;;    the text to mysteriously disappear.
+    ;;
+    ;; So screw it... I'm leaving the code in here commented out so
+    ;; that I don't forget and try to 'fix' this later in life.
+    ;;
+    ;; - Bill Perry Nov 21, 2001
+    ;; (let ((tmp (mapcar (lambda (x) (cons x (and (boundp x) (symbol-value 
x))))
+    ;;                    w3-persistent-variables)))
+    ;;    (kill-all-local-variables))
+    ;;    (mapcar (lambda (x) (if (boundp (car x))
+    ;;                            (set-variable (car x) (cdr x)))) tmp))
+    (use-local-map w3-mode-map)
+    (setq mode-name "WWW")
+    (setq major-mode 'w3-mode)
+    (w3-mode-version-specifics)
+    (w3-menu-install-menus)
+    (setq truncate-lines t
+         mode-line-format w3-modeline-format)
+    (run-hooks 'w3-mode-hook)
+    (widget-setup)))
 
 (put 'w3-mode 'mode-class 'special)
 

commit 7083a84499b01c95a43e10c7eef702c6e57bf422
Author: William M. Perry <address@hidden>
Date:   Thu Nov 22 00:28:42 2001 +0000

        * lisp/w3-display.el (w3-handle-string-content): Just go ahead an
        always put the personality (aural properties) on text.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 2b9064c..9b5e690 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.37 $
+;; Version: $Revision: 1.38 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -153,7 +153,7 @@
            (orig nil ))
        (setq orig (get-text-property start 'personality))
        ad-do-it 
-       (and orig 
+       (and orig
             (put-text-property start end 
                                'personality orig)))))
 
@@ -499,10 +499,8 @@ If the face already exists, it is unmodified."
                                     'end-open nil
                                     'front-sticky t
                                     'rear-nonsticky nil
+                                    'personality (car w3-active-voices)
                                     'duplicable t))
-  (if (car w3-active-voices)
-      (add-text-properties w3-scratch-start-point (point)
-                          (list 'personality (car w3-active-voices))))
   )
 
 (defun w3-display-get-cookie (args)

commit 44ee5eb953009a5b7838049a3fc3a4993054b83c
Author: William M. Perry <address@hidden>
Date:   Wed Nov 21 17:08:54 2001 +0000

    doh!

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 158cb73..2b9064c 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.36 $
+;; Version: $Revision: 1.37 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -165,7 +165,7 @@
       (setq len (1+ len)))
     prefix-vector))
 
-n(defvar w3-pause-keystroke nil)
+(defvar w3-pause-keystroke nil)
 
 (defsubst w3-pause ()
   (declare (special cur-viewing-pos))

commit 68af7c107dcbe194e303f3f118575029d559e1ba
Author: William M. Perry <address@hidden>
Date:   Wed Nov 21 16:53:56 2001 +0000

           * lisp/w3-parse.el (w3-parse-buffer): Patch from Joe Wells to
           handle XHTML a little bit better.  Still a hack, but it will now
           work at all.
    
           * lisp/w3-display.el (w3-display-node): Add support for 'start'
           element on list start elements.  Some sites use this instead of
           seqnum.

diff --git a/ChangeLog b/ChangeLog
index d445399..5dbe38a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2001-11-21  William M. Perry  <address@hidden>
+
+       * lisp/w3-parse.el (w3-parse-buffer): Patch from Joe Wells to
+       handle XHTML a little bit better.  Still a hack, but it will now
+       work at all.
+
+       * lisp/w3-display.el (w3-display-node): Add support for 'start'
+       element on list start elements.  Some sites use this instead of
+       seqnum.
+
 2001-10-31  Dave Love  <address@hidden>
 
        * lisp/w3.el (w3-decode-charset): DTRT for explicit ascii charset.
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index f96bfda..158cb73 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.35 $
+;; Version: $Revision: 1.36 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2236,8 +2236,8 @@ Format: (((image-alt row column) . offset) ...)")
               )
             )
            ((ol ul dl menu)
-            (push (if (w3-get-attribute 'seqnum)
-                      (1- (string-to-int (w3-get-attribute 'seqnum)))
+            (push (if (or (w3-get-attribute 'start) (w3-get-attribute 'seqnum))
+                      (1- (string-to-int (or (w3-get-attribute 'start) 
(w3-get-attribute 'seqnum))))
                     0) w3-display-list-stack)
             (w3-handle-content node))
            (dir
diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index 3588136..e445fb3 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -2474,6 +2474,25 @@ Returns a data structure containing the parsed 
information."
                (cond ((eq ?> (char-after (point)))
                       ;; Ordinary tag end.
                       (forward-char 1))
+                     ;; jbw 2001-06-25: added next sexp to make XHTML
+                     ;; masquerading as HTML work.  This is a crude
+                     ;; disgusting hack which happens to make many of
+                     ;; the common cases work.  One thing it does not
+                     ;; handle is if the input contains <br></br> which
+                     ;; is legal XHTML.  Probably to handle that we need
+                     ;; to set a flag if we see an XML declaration and
+                     ;; then treat the EMPTY content model differently
+                     ;; below.
+                     ((looking-at "/>")
+                      (forward-char 2)
+                      (or ;; XHTML-style empty tag
+                       (eq 'EMPTY
+                           (w3-element-content-model
+                            (get w3-p-d-tag-name 'html-element-info))) 
+                       ;; XHTML empty element which is not ordinarily
+                       ;; empty.  Simulate by inserting an end tag.
+                       (save-excursion
+                         (insert "</" (symbol-name w3-p-d-tag-name) ">"))))
                      ((and (eq ?/ (char-after (point)))
                            (not w3-p-d-end-tag-p))
                       ;; This is a NET-enabling start-tag.

commit 1557cb6f1e2a986c83bd31af7118f7663e6a242b
Author: Dave Love <address@hidden>
Date:   Wed Oct 31 16:21:44 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 7dc3692..d445399 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2001-10-31  Dave Love  <address@hidden>
+
+       * lisp/w3.el (w3-decode-charset): DTRT for explicit ascii charset.
+
 2001-10-11  Dave Love  <address@hidden>
 
        * lisp/w3-style.el (cl): Require only when compiling.

commit cb2daffbb702e2fa1969849674e0dc07fdff3ec4
Author: Dave Love <address@hidden>
Date:   Wed Oct 31 16:17:21 2001 +0000

    (w3-decode-charset): DTRT for explicit ascii charset.

diff --git a/lisp/w3.el b/lisp/w3.el
index df7a1f2..2b1c51c 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: fx $
-;; Created: $Date: 2001/10/11 12:57:16 $
-;; Version: $Revision: 1.24 $
+;; Created: $Date: 2001/10/31 16:17:21 $
+;; Version: $Revision: 1.25 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -163,9 +163,9 @@ Return the coding system used for the decoding."
                      "iso-8859-1"))
         (type (mm-handle-media-type handle))
         (coding-system (mm-charset-to-coding-system charset)))
-    (if (and (not coding-system)
-            (not (equal charset "ascii")))
-       ;; Does this work for XEmacs?  Should we guess anyhow (which
+    (if (or (not coding-system)
+           (eq coding-system 'ascii))
+       ;; Does this work for XEmacs?  Should we actually guess (which
        ;; is what `undecided' involves)?  In Emacs 20 we'll get
        ;; byte-combination anyhow when switching to multibyte below,
        ;; but we can't leave the buffer as unibyte, or we can't deal

commit a7b5da1c1c6e56c72983caa0888acf40f83ffc53
Author: Dave Love <address@hidden>
Date:   Thu Oct 11 13:05:18 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 08ad83e..7dc3692 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2001-10-11  Dave Love  <address@hidden>
+
+       * lisp/w3-style.el (cl): Require only when compiling.
+
+       * lisp/w3-cus.el: Doc fixes.
+       (w3-delay-image-loads): Fix default for Emacs 21.
+       (w3-mule-charset-to-coding-alist): Remove.
+
+       * lisp/w3.el (w3-parse-hotlist, w3-menu-install-menus): Autoload.
+       (w3-explicit-coding-system): Move definition.
+       (w3-decode-charset, w3-fetch-callback): Use it.
+
 2001-10-01  Dave Love  <address@hidden>
 
        * lisp/w3-vars.el: Doc fixes.

commit fb0a2c687ab1d20e5be14a3a8558372f6dce9b21
Author: Dave Love <address@hidden>
Date:   Thu Oct 11 13:04:58 2001 +0000

    (cl): Require only when compiling.

diff --git a/lisp/w3-style.el b/lisp/w3-style.el
index efdf5a4..56b32ef 100644
--- a/lisp/w3-style.el
+++ b/lisp/w3-style.el
@@ -1,7 +1,7 @@
 ;;; w3-style.el --- Emacs/W3 binding style sheet mechanism
-;; Author: $Author: wmperry $
-;; Created: $Date: 2000/07/10 14:43:36 $
-;; Version: $Revision: 1.3 $
+;; Author: $Author: fx $
+;; Created: $Date: 2001/10/11 13:04:58 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: faces, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -33,7 +33,7 @@
 ;;; experimental W3C mechanism
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (require 'font)
-(require 'cl)
+(eval-when-compile (require 'cl))
 (require 'css)
 
 ;;;###autoload

commit 01d8fe666abbffaa73f2bb6b137bac956fd14e24
Author: Dave Love <address@hidden>
Date:   Thu Oct 11 12:59:46 2001 +0000

    Doc fixes.
    (w3-delay-image-loads): Fix default for Emacs 21.
    (w3-mule-charset-to-coding-alist): Remove.

diff --git a/lisp/w3-cus.el b/lisp/w3-cus.el
index f877a47..989d48f 100644
--- a/lisp/w3-cus.el
+++ b/lisp/w3-cus.el
@@ -1,7 +1,7 @@
 ;;; w3-cus.el --- Customization support for Emacs-W3
 ;; Author: $Author: fx $
-;; Created: $Date: 2001/06/07 16:38:25 $
-;; Version: $Revision: 1.8 $
+;; Created: $Date: 2001/10/11 12:59:46 $
+;; Version: $Revision: 1.9 $
 ;; Keywords: comm, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -67,27 +67,27 @@
 
 ;;; File related variables
 (defcustom w3-configuration-directory "~/.w3/"
-  "*Directory where Emacs-w3 can find its configuration files"
+  "Directory where Emacs-w3 can find its configuration files."
   :group 'w3-files
-  :type 'directory)  
+  :type 'directory)
 
 (defcustom w3-default-configuration-file "profile"
-  "*Base filename where per-user customizations are kept.
+  "Base filename where per-user customizations are kept.
 This filename is relative to `w3-configuration-directory' if
 not fully specified."
   :group 'w3-files
   :type 'string)
 
 (defcustom w3-default-homepage nil
-  "*The url to open at startup.  It can be any valid URL.
+  "The url to open at startup.  It can be any valid URL.
 This will default to the environment variable WWW_HOME if you do not
-set it in your .emacs file. If WWW_HOME is undefined, then it will
+set it in your .emacs file.  If WWW_HOME is undefined, then it will
 default to  the hypertext documentation for W3 at Indiana University."
   :group 'w3-files
   :type 'string)
 
 (defcustom w3-default-stylesheet nil
-  "*The filename of the users default stylesheet."
+  "The filename of the users default stylesheet."
   :group 'w3-files
   :type '(choice (const :tag "None" :value nil)
                 (file)))
@@ -102,14 +102,14 @@ menus to get to them."
   :type 'file)
 
 (defcustom w3-explicit-encodings-file nil
-  "*Explicit encodings filename.
+  "Explicit encodings filename.
 This should be the name of a file that is used to keep user-specified
 explicit encodings for URLs."
   :group 'w3-files
   :type 'file)
 
 (defcustom w3-documentation-root "http://www.cs.indiana.edu/elisp/w3/";
-  "*Where the w3 documentation lives.  This MUST end in a slash."
+  "Where the w3 documentation lives.  This MUST end in a slash."
   :group 'w3-files
   :type 'string)
 
@@ -132,8 +132,8 @@ t           display frame hyperlinks and fetch them."
     (square . ?#)
     (none   . ? )
     )
-  "*An assoc list of unordered list types mapping to characters to use
-as the bullet character."
+  "An alist of unordered list types.
+This maps to characters to use as the bullet character."
   :group 'w3-display
   :type '(repeat (cons :format "%v"
                       (symbol :tag "Type")
@@ -159,7 +159,7 @@ in menus, etc."
                     :value name)))
 
 (defcustom w3-horizontal-rule-char nil
-  "*The character to use to create a horizontal rule.
+  "The character to use to create a horizontal rule.
 Must be the character's code, not a string.  This character is
 replicated across the screen to create a division.
 If nil W3 will use a terminal graphic character if possible."
@@ -174,34 +174,41 @@ If nil W3 will use a terminal graphic character if 
possible."
                       ;; Fixme: Emacs 21 has coding-system :type.
                       (symbol :tag "Coding system" :value binary))))
 
-;;; these three variables control how w3-setup-terminal-chars works
+;;; these four variables control how w3-setup-terminal-chars works
 (defcustom w3-use-terminal-characters nil
-  "*Use terminal graphics characters for drawing tables and rules if available"
+  "*Use terminal graphics characters for drawing tables and rules if 
available."
   :group 'w3-display
   :type 'boolean)
 
 (defcustom w3-use-terminal-characters-on-tty nil
   "*Use terminal graphics characters for tables and rules even on a tty.
-This triggers display bugs on both FSF Emacs and XEmacs. 
-(Though it's usually tolerable at least on FSF Emacs.)"
+This triggers display bugs on both Emacs and XEmacs.
+\(Though it's usually tolerable at least in Emacs.)"
   :group 'w3-display
   :type 'boolean)
 
 (defcustom w3-use-terminal-glyphs nil
-  "*Use glyphs if possible rather than properties for terminal graphics 
characters
+  "*Use glyphs if possible rather than properties for terminal graphics 
characters.
 
 Glyphs are probably more efficient but don't work with the most recent versions
 of XEmacs and there are some cute tricks we can play with text-properties that
 glyphs won't let us do. It may be possible someday to make XEmacs automagically
 translate the characters back to ascii characters when pasted into another
-buffer. (On the other hand, right now w3-excise-terminal-characters doesn't
+buffer. (On the other hand, right now `w3-excise-terminal-characters' doesn't
 work at all if we're using text-properties)."
   :group 'w3-display
   :type '(choice (const :tag "Use Glyphs" :value t)
                 (const :tag "Use Text Properties" :value nil)))
 
+(defcustom w3-use-unicode-table-characters nil
+  "*Non-nil means use Unicode box-drawing characters for tables if avilable.
+This only works for Emacs 21.  You might wat to turn this off if your
+Unicode font isn't available in appropriate sizes."
+  :group 'w3-display
+  :type 'boolean)
+
 (defcustom w3-do-incremental-display nil
-  "*Whether to do incremental display of pages or not."
+  "*Non-nil means do incremental display of pages."
   :group 'w3-display
   :type 'boolean)
 
@@ -214,29 +221,29 @@ work at all if we're using text-properties)."
   ;; Alternate, Stylesheet, Start, Next, Prev, Contents, Index,
   ;; Glossary, Copyright, Chapter, Section, Subsection, Appendix,
   ;; Help, Bookmark
-  "A list of the (lower-case) names which have special significance
-as the values of REL or REV attributes of <link> elements.  They will
-be presented on the toolbar or the links menu, for instance."
+  "A list of the (lower-case) names which have special significance.
+The significance is when they are used as the values of REL or REV
+attributes of <link> elements.  They will be presented on the toolbar
+or the links menu, for instance."
   :group 'w3-display
   :type '(repeat string))
 
 ;;; Parsing related variables
 (defcustom w3-debug-html nil
-  "*Whether to gripe about bad HTML or not."
+  "*Non-nil means to gripe about bad HTML."
   :group 'w3-parsing
   :type '(choice (const :tag "HTML Errors" :value t)
                 (const :tag "Errors and stylistic issues" :value style)
                 (const :tag "None" :value nil)))
 
 (defcustom w3-debug-buffer "*HTML Debug*"
-  "*Name of buffer to store debugging information in."
+  "Name of buffer to store debugging information in."
   :group 'w3-parsing
   :type 'string)
 
 ;;; Image related variables
 (defcustom w3-auto-image-alt 'w3-default-image-alt-func
-  "*Whether emacs-w3 should create an alt attribute for an image that
-is missing it.
+  "*Whether to create an alt attribute for an image that is missing it.
 If nil, Emacs-W3 will not automatically create an ALT attribute.
 
 If a string, it should be a string suitable for running through format,
@@ -244,19 +251,20 @@ with only one %s, which will be replaced with just the 
filename of the
 graphic that is not loaded.
 
 Otherwise, it is considered a function and is passed a single
-argument, the filename of the graphic that is not loaded.
-"
+argument, the filename of the graphic that is not loaded."
   :group 'w3-images
   :type '(choice (const :tag "None" :value nil)
                 (const :tag "Default" :value "[IMAGE(%s)]")
                 (string :tag "Format string")
                 (sexp :tag "Function" :value nil)))
 
-(defcustom w3-delay-image-loads (not (or (featurep 'gif)
+(defcustom w3-delay-image-loads (not (or (and (fboundp 'display-images-p)
+                                             (display-images-p))
+                                        (featurep 'gif)
                                         (featurep 'jpeg)
                                         (featurep 'imagick)
                                         (featurep 'png)))
-  "*Whether to delay image loading, or automatically retrieve them."
+  "*Non-nil means delay loading images, not automatically retrieve them."
   :group 'w3-images
   :type 'boolean)
 
@@ -283,7 +291,7 @@ argument, the filename of the graphic that is not loaded.
     ("image/x-targa"          . tga)
     ("image/tiff"             . tiff)
     )
-  "*How to map MIME types to image types for the `image' package.
+  "How to map MIME types to image types for the `image' package.
 Each entry is a cons cell of MIME types and image-type symbols."
   :group 'w3-images
   :type '(repeat (cons :format "%v"
@@ -292,9 +300,9 @@ Each entry is a cons cell of MIME types and image-type 
symbols."
 
 ;;; Menus
 (defcustom w3-max-menu-length 35
-  "*The maximum length of a pulldown menu before it will be split into
-smaller chunks, with the first part as a submenu, followed by the rest
-of the menu."
+  "The maximum length of a pulldown menu.
+This is the length before it will be split into smaller chunks, with
+the first part as a submenu, followed by the rest of the menu."
   :group 'w3-menus
   :type 'integer)
 
@@ -316,7 +324,7 @@ of the menu."
        (w3-current-isindex "[Searchable]  ")
        (w3-current-badhtml "[BAD HTML]  ")
        "%p" "  " global-mode-string))
-  "*The modeline format string when in w3 mode"
+  "The modeline format string when in w3 mode."
   :group 'w3-advanced
   :type 'sexp)
 
@@ -364,11 +372,12 @@ A nil value means W3 should not change the binding of 
mouse-3."
   :type 'boolean)
 
 (defcustom w3-reuse-buffers 'yes
-  "What to do when following a link will re-fetch a document that has
-already been fetched into a W3 buffer.  Possible values are: nil,
-'yes, and 'no.  Nil means ask the user if we should reuse the buffer.
- A value of 'yes means assume the user wants us to reuse the buffer.
-A value of 'no means assume the user wants us to re-fetch the document.
+  "What to do when following a link will re-fetch a document.
+This means a document that has already been fetched into a W3 buffer.
+Possible values are: nil, `yes', and `no'.  Nil means ask the user if
+we should reuse the buffer.  A value of 'yes means assume the user
+wants us to reuse the buffer.  A value of 'no means assume the user
+wants us to re-fetch the document.
 
 This will also accept:
 'no    ==> always reload
@@ -382,7 +391,7 @@ This will also accept:
 (defcustom w3-right-margin 2
   "*Default right margin for Emacs-W3 buffers.
 This amount is subtracted from (window-width) for each new WWW buffer
-and used as the new fill-column."
+and used as the new fill column."
   :group 'w3-display
   :type 'integer)
 
@@ -394,7 +403,7 @@ If nil, then lines can extend all the way to the window 
margin."
                (integer :tag "Limit to")))
 
 (defcustom w3-track-mouse t
-  "*Whether to track the mouse and message the url under the mouse."
+  "*Non-nil means track the mouse and message the url under the mouse."
   :group 'w3-display
   :type 'boolean)
 
@@ -404,36 +413,36 @@ If nil, then lines can extend all the way to the window 
margin."
   :type 'boolean)
 
 (defcustom w3-user-colors-take-precedence nil
-  "*Whether to let a document define certain colors about itself.
+  "*Non-nil means don't let a document define certain colors itself.
 Like foreground and background colors and pixmaps, color of links and
 visited links, etc."
   :group 'w3-display
   :type 'boolean)
 
 (defcustom w3-user-fonts-take-precedence nil
-  "*Whether to let a document define certain fonts.
+  "*Non-nil means don't let a document define certain fonts.
 Certain fonts can cause problems under Emacs."
   :group 'w3-display
   :type 'boolean)
 
 ;;; Hook Variables
 (defcustom w3-load-hook nil
-  "*Hooks to be run after loading w3."
+  "Hook run after loading w3."
   :group 'w3-hooks
   :type 'hook)
 
 (defcustom w3-mode-hook nil
-  "*Hooks to be run after entering w3-mode."
+  "Hook run after entering W3 mode."
   :group 'w3-hooks
   :type 'hook)
 
 (defcustom w3-source-file-hook nil
-  "*Hooks to be run after getting document source."
+  "Hook run after getting document source."
   :group 'w3-hooks
   :type 'hook)
 
 (defcustom w3-display-errors-hook nil
-  "*Hooks to be run after displaying HTML errors for a page."
+  "Hook run after displaying HTML errors for a page."
   :group 'w3-hooks
   :type 'hook)
 
@@ -465,31 +474,8 @@ Certain fonts can cause problems under Emacs."
     ("^  [A-Z][a-zA-Z0-9 ]*: .*" . font-lock-comment-face)
     ("^  [A-Z][a-zA-Z0-9 ]*: " . font-lock-comment-face)
     ("\\*ERROR\\*" 0 font-lock-keyword-face t))
-  "*Font locking keywords used for HTML error display"
+  "Font locking keywords used for HTML error display."
   :group 'w3
   :type 'sexp)
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Internationalization
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defconst w3-mule-charset-to-coding-alist
-  '(
-    ("us-ascii"          . no-conversion)
-    ("iso-8859-1" . no-conversion)
-    ("iso-8859-2" . iso-8859-2)
-    ("iso-8859-3" . iso-8859-3)
-    ("iso-8859-4" . iso-8859-4)
-    ("iso-8859-5" . iso-8859-5)
-    ("iso-8859-6" . iso-8859-6)
-    ("iso-8859-7" . iso-8859-7)
-    ("iso-8859-8" . iso-8859-8)
-    ("iso-8859-9" . iso-8859-9)
-    ("iso-2022-jp" . iso-2022-jp)
-    ;; probably not correct, but probably better than nothing.
-    ("iso-2022-jp-2" . iso-2022-jp)
-    ("iso-2022-int-1" . iso-2022-int-1)
-    ("iso-2022-kr"    . iso-2022-kr)
-    ("euc-kr"         . iso-2022-kr)
-    ))
   
 (provide 'w3-cus)

commit 84845f51179c910481a81f62aaafdf2b4b8629de
Author: Dave Love <address@hidden>
Date:   Thu Oct 11 12:57:16 2001 +0000

    (w3-parse-hotlist, w3-menu-install-menus): Autoload.
    (w3-explicit-coding-system): Move definition.
    (w3-decode-charset, w3-fetch-callback): Use it.

diff --git a/lisp/w3.el b/lisp/w3.el
index 1267a81..df7a1f2 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: fx $
-;; Created: $Date: 2001/10/01 11:34:55 $
-;; Version: $Revision: 1.23 $
+;; Created: $Date: 2001/10/11 12:57:16 $
+;; Version: $Revision: 1.24 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -49,6 +49,8 @@
 (require 'w3-vars)
 (eval-and-compile
   (require 'w3-display))
+(autoload 'w3-parse-hotlist "w3-hot")
+(autoload 'w3-menu-install-menus "w3-menu")
 
 
 (defun w3-notify-when-ready (buff)
@@ -144,13 +146,19 @@ hypertext document."
                    (url-get-url-at-point))))
     url))
 
+(defvar w3-explicit-coding-system nil
+  "Coding system to decode documents.
+
+The global value is usually nil.  It will be bound locally if a user
+invokes some commands which read a coding system from the user.")
+
 (defun w3-decode-charset (handle)
   "Decode charset-encoded text in the document.
 HANDLE is the MIME handle of the original part.
 Return the coding system used for the decoding."
-  (interactive "P")
   (let* ((encoding (mm-handle-encoding handle))
-        (charset (or (mail-content-type-get (mm-handle-type handle)
+        (charset (or w3-explicit-coding-system
+                     (mail-content-type-get (mm-handle-type handle)
                                             'charset)
                      "iso-8859-1"))
         (type (mm-handle-media-type handle))
@@ -291,11 +299,15 @@ MUST-BE-VIEWING is the current URL when the timer 
expires."
                            (w3-handle-refresh-header (cdr header))
                            (setq refreshed t))))))))
     (let ((handle (mm-dissect-buffer t))
+         (w3-explicit-coding-system
+          (or w3-explicit-coding-system
+              (w3-recall-explicit-coding-system url)))
          (buff nil))
       (message "Downloading of `%s' complete." url)
       (url-mark-buffer-as-dead (current-buffer))
       (unless headers
-       (setq headers (list (cons 'content-type (mm-handle-media-type 
handle)))))
+       (setq headers (list (cons 'content-type
+                                 (mm-handle-media-type handle)))))
       ;; Fixme: can handle be null?
       (cond
        ((equal (mm-handle-media-type handle) "text/html")
@@ -378,17 +390,17 @@ With prefix argument, use the URL of the hyperlink under 
point instead."
          (buf (w3-buffer-visiting url)))
       (if (or (not buf)
              (cond
-              ((not (equal (downcase (or url-request-method "GET")) "get")) t)
+              ((not (equal (downcase (or url-request-method "GET")) "get"))
+               t)
               ((memq w3-reuse-buffers '(no never reload)) t)
               ((memq w3-reuse-buffers '(yes reuse always)) nil)
               (t
-               (if (and w3-reuse-buffers (not (eq w3-reuse-buffers 'ask)))
-                   (progn
-                     (ding)
-                     (message
-                      "Warning: Invalid value for variable w3-reuse-buffers: 
%s"
-                      (prin1-to-string w3-reuse-buffers))
-                     (sit-for 2)))
+               (when (and w3-reuse-buffers (not (eq w3-reuse-buffers 'ask)))
+                 (ding)
+                 (message
+                  "Warning: Invalid value for variable w3-reuse-buffers: %s"
+                  (prin1-to-string w3-reuse-buffers))
+                 (sit-for 2))
                (not (funcall url-confirmation-func
                              (format "Reuse URL in buffer %s? "
                                      (buffer-name buf)))))))
@@ -972,12 +984,6 @@ ftp.w3.org:/pub/www/doc."
   "List of MIME encodings that require Mule not to convert
 even though the MIME type is nil or listed in 
`w3-mime-list-for-code-conversion'.")
 
-(defvar w3-explicit-coding-system nil
-  "Coding system to decode documents.
-
-The global value is usually nil.  It will be bound locally if a user
-invokes some commands which read a coding system from the user.")
-
 (defun w3-show-history-list ()
   "Format the url-history-list prettily and show it to the user."
   (interactive)

commit 59824870190b9161f2ad3729ddc318e2b2d45c10
Author: Dave Love <address@hidden>
Date:   Mon Oct 1 11:43:05 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 6d51fad..08ad83e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2001-10-01  Dave Love  <address@hidden>
+
+       * lisp/w3-vars.el: Doc fixes.
+       (w3-meta-content-type-charset-regexp) 
+       (w3-meta-charset-content-type-regexp): Removed.
+       (w3-persistent-variables): Add url-current-mime-headers.
+
+       * lisp/w3.el (w3-setup-reload-timer, w3-handle-refresh-header):
+       New function.
+       (w3-fetch-callback): Handle refresh and cookies.  Set
+       url-current-object.  Don't destroy external parts immediately.
+       For inlines, use w3-mode, require mm-view, lose cursor for images.
+
+       (w3-document-information): Fix for current url stuff.
+       (w3-replace-invalid-chars): Remove.
+
+       * lisp/w3-display.el (w3-display-node): Fix <meta> and <link>
+       handling.
+
 2001-09-24  Dave Love  <address@hidden>
 
        * lisp/w3.el (w3-http-equiv-headers): New function.

commit da4af6af22a799f35b5a28eeabfe08cb90220ff3
Author: Dave Love <address@hidden>
Date:   Mon Oct 1 11:42:46 2001 +0000

    Doc fixes.
    (w3-meta-content-type-charset-regexp)
    (w3-meta-charset-content-type-regexp): Removed.
    (w3-persistent-variables): Add url-current-mime-headers.

diff --git a/lisp/w3-vars.el b/lisp/w3-vars.el
index a1892ad..8d8d5c0 100644
--- a/lisp/w3-vars.el
+++ b/lisp/w3-vars.el
@@ -1,7 +1,7 @@
 ;;; w3-vars.el,v --- All variable definitions for emacs-w3
 ;; Author: $Author: fx $
-;; Created: $Date: 2001/06/05 15:56:16 $
-;; Version: $Revision: 1.7 $
+;; Created: $Date: 2001/10/01 11:42:46 $
+;; Version: $Revision: 1.8 $
 ;; Keywords: comm, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -34,7 +34,7 @@
 (require 'wid-edit)                    ; For `widget-keymap'
 
 (defconst w3-version-number
-  (let ((x "$State: Exp $"))
+  (let ((x "$State: p4.0pre.47 $"))
     (if (string-match "State:[ \t\n]+\\([^ \t\n]+\\)" x)
        (setq x (substring x (match-beginning 1) (match-end 1)))
       (setq x (substring x 1)))
@@ -42,7 +42,7 @@
      (function (lambda (x) (if (= x ?-) "." (char-to-string x)))) x ""))
   "Version number of w3-mode.")
 
-(defconst w3-version-date (let ((x "$Date: 2001/06/05 15:56:16 $"))
+(defconst w3-version-date (let ((x "$Date: 2001/10/01 11:42:46 $"))
                            (if (string-match "Date: \\([^ \t\n]+\\)" x)
                                (substring x (match-beginning 1) (match-end 1))
                              x))
@@ -261,7 +261,7 @@ in later garbage collections taking more time.")
     ("Copy this Image Location" . w3-save-url))
   "An assoc list of function names and labels.  These will be displayed
 in a popup menu when the mouse is pressed on a hyperlink.  Format is
-( (label . function)), function is called with one argument, the URL of
+\( (label . function)), function is called with one argument, the URL of
 the link.  Each label can have exactly one `%s' that will be replaced by
 the URL of the link.")
 
@@ -273,7 +273,7 @@ the URL of the link.")
     ("Copy this Link Location to Clipboard" . w3-save-url))
   "An assoc list of function names and labels.  These will be displayed
 in a popup menu when the mouse is pressed on a hyperlink.  Format is
-( (label . function)), function is called with one argument, the URL of
+\( (label . function)), function is called with one argument, the URL of
 the link.  Each label can have exactly one `%s' that will be replaced by
 the URL of the link.")
 
@@ -281,10 +281,10 @@ the URL of the link.")
 ;;; Variables internal to W3, you should not change any of these
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (defvar w3-graphics-list nil
-  "*List of graphics already read in.")
+  "List of graphics already read in.")
 
 (defvar w3-delayed-images nil
-  "*A buffer-local variable holding positions and urls of images within
+  "A buffer-local variable holding positions and urls of images within
 the buffer.")
 
 (defvar w3-frameset-structure nil
@@ -347,21 +347,6 @@ returns.")
 (defvar w3-submit-button nil
   "A widget object specifying what button was pressed to submit a form.")
 
-;; FIXME - this should be changed to use the mm stuff. - FIXME
-(defvar w3-meta-content-type-charset-regexp
-  (concat "<meta[ \t]+http-equiv=\"?Content-type\"?[ \t]+content=\"\\([^;]+\\)"
-         ";[ \t]*charset=\"?\\([^\"]+\\)\"?"
-         ">")
-  "Regexp used in parsing `<META HTTP-EQUIV=\"Content-Type\" 
content=\"...;charset=...\">
-for a charset indication")
-
-(defvar w3-meta-charset-content-type-regexp
-  (concat "<meta[ \t]+content=\"\\([^;]+\\)"
-         ";[ \t]*charset=\"?\\([^\"]+\\)\"?"
-         "[ \t]+http-equiv=\"?Content-type\"?>")
-  "Regexp used in parsing `<META content=\"...;charset=...\" 
HTTP-EQUIV=\"Content-Type\">
-for a charset indication")
-
 (defvar w3-explicit-conversion-tree nil
   "Tree to hold explicit coding systems for URLs and their superdirs:
    ((hostN default-coding (dirN-1 default-coding (dirN-1-1 ...) ...) ...)
@@ -403,6 +388,7 @@ for a charset indication")
     w3-target-window-distances
     w3-frameset-structure
     buffer-file-coding-system
+    url-current-mime-headers
     )
   "A list of variables that should be preserved when entering w3-mode.")
 

commit 4f2b2373c71a60d26fc1ee01bd73fdba270dfd43
Author: Dave Love <address@hidden>
Date:   Mon Oct 1 11:35:34 2001 +0000

    (w3-display-node): Fix <meta> and <link>
    handling.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 78ad6ef..f96bfda 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.34 $
+;; Version: $Revision: 1.35 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -139,7 +139,7 @@
   )
 
 (defvar w3-display-same-buffer nil)
-(defvar w3-face-cache nil  "Cache for w3-face-for-element")
+(defvar w3-face-cache nil  "Cache for `w3-face-for-element'.")
 (defvar w3-face-index 0)
 (defvar w3-image-widgets-waiting nil)
 
@@ -165,7 +165,7 @@
       (setq len (1+ len)))
     prefix-vector))
 
-(defvar w3-pause-keystroke nil)
+n(defvar w3-pause-keystroke nil)
 
 (defsubst w3-pause ()
   (declare (special cur-viewing-pos))
@@ -2500,30 +2500,13 @@ Format: (((image-alt row column) . offset) ...)")
            (*invisible
             (w3-handle-empty-tag))
            (meta
-            ;; FIXME!!! This is broken for the new URL package.
-            '(let* ((equiv (cdr-safe (assq 'http-equiv args)))
-                    (value (w3-get-attribute 'content))
-                    (name  (w3-get-attribute 'name))
-                    (node  (and equiv (assoc (setq equiv (downcase equiv))
-                                             url-current-mime-headers))))
-               (if equiv
-                   (setq url-current-mime-headers (cons
-                                                   (cons equiv value)
-                                                   url-current-mime-headers)))
-               (if name
-                   (setq w3-current-metainfo (cons
-                                              (cons name value)
-                                              w3-current-metainfo)))
-
-               ;; Special-case the Set-Cookie header
-               (if (and equiv (string= (downcase equiv) "set-cookie"))
-                   (url-cookie-handle-set-cookie value))
-               ;; Special-case the refresh header
-               (if (and equiv (string= (downcase equiv) "refresh"))
-                   ;; FIXME!!!
-                   (url-handle-refresh-header value)))
-            (w3-handle-empty-tag)
-            )
+            (let ((name (w3-get-attribute 'name))
+                  (value (or (w3-get-attribute 'content) "")))
+              ;; http-equiv is dealt with by `w3-fetch-callback'.
+              (if name
+                  (setq w3-current-metainfo (cons
+                                             (cons name value)
+                                             w3-current-metainfo)))))
            (link
             ;; This doesn't handle blank-separated values per the RFC.
             (w3-parse-link args)

commit 1e3efc29accf817c35efcff6dc6fb2729bde3f85
Author: Dave Love <address@hidden>
Date:   Mon Oct 1 11:34:55 2001 +0000

    (w3-setup-reload-timer, w3-handle-refresh-header):
    New function.
    (w3-fetch-callback): Handle refresh and cookies.  Set
    url-current-object.  Don't destroy external parts immediately.
    For inlines, use w3-mode, require mm-view, lose cursor for images.

diff --git a/lisp/w3.el b/lisp/w3.el
index 5598fd8..1267a81 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: fx $
-;; Created: $Date: 2001/09/25 09:13:25 $
-;; Version: $Revision: 1.22 $
+;; Created: $Date: 2001/10/01 11:34:55 $
+;; Version: $Revision: 1.23 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -230,38 +230,107 @@ variable `http-header'."
                  (goto-char (point-min))
                  (insert http-header)))))))))
 
+(defun w3-setup-reload-timer (url must-be-viewing &optional time)
+  "Set up a timer to load URL at optional TIME.
+If TIME is unspecified, default to 5 seconds.  Only loads document if
+MUST-BE-VIEWING is the current URL when the timer expires."
+  (if (or (not time)
+         (<= time 0))
+      (setq time 5))
+  (let ((func
+        `(lambda ()
+           (if (equal (url-view-url t) ,must-be-viewing)
+               (let ((w3-reuse-buffers 'no))
+                 (if (equal ,url (url-view-url t))
+                     (kill-buffer (current-buffer)))
+                 (w3-fetch ,url))))))
+    (cond
+     ((featurep 'itimer)
+      (start-itimer "reloader" func time))
+     ((fboundp 'run-at-time)
+      (run-at-time time nil func))
+     (t
+      (w3-warn 'url "Cannot set up timer for automatic reload, sorry!")))))
+
+(defun w3-handle-refresh-header (reload)
+  (if (and reload
+          url-honor-refresh-requests
+          (or (eq url-honor-refresh-requests t)
+              (funcall url-confirmation-func "Honor refresh request? ")))
+      (let ((uri (url-view-url t)))
+       (if (string-match ";" reload)
+           (progn
+             (setq uri (substring reload (match-end 0) nil)
+                   reload (substring reload 0 (match-beginning 0)))
+             (if (string-match
+                  "ur[li][ \t]*=[ \t]*\"*\\([^ \t\"]+\\)\"*"
+                  uri)
+                 (setq uri (match-string 1 uri)))
+             (setq uri (url-expand-file-name uri (url-view-url t)))))
+       (w3-setup-reload-timer uri (url-view-url t)
+                              (string-to-int (or reload "5"))))))
+
 (defun w3-fetch-callback (url)
   (w3-nasty-disgusting-http-equiv-handling)
-  (let ((handle (mm-dissect-buffer t))
-       (buff nil))
-    (message "Downloading of `%s' complete." url)
-    (url-mark-buffer-as-dead (current-buffer))
-    ;; Fixme: can handle be null?
-    (cond
-     ((equal (mm-handle-media-type handle) "text/html")
-      ;; Special case text/html if it comes through w3-fetch
-      (set-buffer (generate-new-buffer " *w3-html*"))
-      (mm-disable-multibyte)
-      (mm-insert-part handle)
-      (w3-decode-charset handle)
-      (setq url-current-object (url-generic-parse-url url))
-      (w3-prepare-buffer)
-      (w3-notify-when-ready (current-buffer)))
-     ((equal (car-safe (mm-handle-type handle))
-            "application/x-elisp-parsed-html")
+  ;; Process any cookie and refresh headers.
+  (let (headers)
+    (ignore-errors
+     (save-restriction
+       (mail-narrow-to-head)
+       (goto-char (point-min))
+       (unless (search-forward ":" (line-end-position) t)
+        (forward-line))
+       (setq headers (mail-header-extract))
+       (let (refreshed)
+        (dolist (header headers)
+          ;; Act on multiple cookies if necessary, but only on a
+          ;; single refresh request in case there's more than one.
+          (case (cdr header)
+                (set-cookie (url-cookie-handle-set-cookie (cdr header)))
+                (refresh (unless refreshed
+                           (w3-handle-refresh-header (cdr header))
+                           (setq refreshed t))))))))
+    (let ((handle (mm-dissect-buffer t))
+         (buff nil))
+      (message "Downloading of `%s' complete." url)
+      (url-mark-buffer-as-dead (current-buffer))
+      (unless headers
+       (setq headers (list (cons 'content-type (mm-handle-media-type 
handle)))))
+      ;; Fixme: can handle be null?
+      (cond
+       ((equal (mm-handle-media-type handle) "text/html")
+       ;; Special case text/html if it comes through w3-fetch
+       (set-buffer (generate-new-buffer " *w3-html*"))
+       (mm-disable-multibyte)
+       (mm-insert-part handle)
+       (w3-decode-charset handle)
+       (setq url-current-object (url-generic-parse-url url))
+       (w3-prepare-buffer)
+       (setq url-current-mime-headers headers)
+       (w3-notify-when-ready (current-buffer))
+       (mm-destroy-parts handle))
+       ((equal (car-safe (mm-handle-type handle))
+              "application/x-elisp-parsed-html")
       ;; Also need to special-case pre-parsed representations of HTML.
-      ;; Fixme: will this need decoding?
-      (w3-prepare-tree (read (set-marker (make-marker) 1
-                                        (mm-handle-buffer handle)))))
-     ((mm-inlinable-p handle)
-      ;; We can view it inline!
-      (set-buffer (generate-new-buffer url))
-      (mm-display-part handle)
-      (w3-notify-when-ready (current-buffer)))
-     (t
-      ;; Must be an external viewer
-      (mm-display-part handle)))
-    (mm-destroy-parts handle)))
+       ;; Fixme: will this need decoding?
+       (w3-prepare-tree (read (set-marker (make-marker) 1
+                                          (mm-handle-buffer handle)))))
+       ((mm-inlinable-p handle)
+       ;; We can view it inline!
+       (set-buffer (generate-new-buffer url))
+       (require 'mm-view)              ; make sure methods are defined
+       (mm-display-part handle)
+       (set-buffer-modified-p nil)
+       (w3-mode)
+       (if (equal "image" (mm-handle-media-supertype handle))
+           (setq cursor-type nil))
+       (setq url-current-mime-headers headers)
+       (w3-notify-when-ready (current-buffer)))
+       (t
+       ;; Must be an external viewer
+       (mm-display-part handle)
+       ;;(mm-destroy-parts handle)
+       )))))
 
 ;;;###autoload
 (defun w3-fetch (&optional url target)
@@ -399,15 +468,13 @@ the cdr is the 'next' node."
   (erase-buffer)
   (let (entity)
     (mapatoms
-     (function
-      (lambda (x)
-       (setq entity (get x 'html-entity-expansion))
-       (if entity
-           (insert (format "<!entity %s %s \"%s\">\n" x (car entity)
-                           (cdr entity))))))))
+     (lambda (x)
+       (setq entity (get x 'html-entity-expansion))
+       (if entity
+          (insert (format "<!entity %s %s \"%s\">\n" x (car entity)
+                          (cdr entity)))))))
   (goto-char (point-min)))
 
-;; FIXME!!! This is broken with the new URL package.
 (defun w3-document-information (&optional buff)
   "Display information on the document in buffer BUFF."
   (interactive)
@@ -423,73 +490,102 @@ the cdr is the 'next' node."
             (cur-links w3-current-links)
             (title (buffer-name))
             (case-fold-search t)
-            (possible-lastmod (save-excursion
-                                (goto-char (point-min))
-                                (if (re-search-forward
-                                     "^Last modified:\\(.*\\)" nil t)
-                                    (buffer-substring (match-beginning 1)
-                                                      (match-end 1)))))
             (attributes (url-file-attributes url))
-            (lastmod (or (cdr-safe (assoc "last-modified"
-                                          url-current-mime-headers))
+            (lastmod (or (cdr-safe (assq 'last-modified
+                                         url-current-mime-headers))
                          (nth 5 attributes)))
             (hdrs url-current-mime-headers)
-            (size (or (cdr (assoc "content-length" url-current-mime-headers))
-                      (buffer-size)))
-            (info w3-current-metainfo))
+            (size (cdr (assq 'content-length url-current-mime-headers)))
+            (info w3-current-metainfo)
+            (links w3-current-links))
        (set-buffer (get-buffer-create url-working-buffer))
        (setq url-current-can-be-cached nil)
        (erase-buffer)
-       (cond
-        ((stringp lastmod) nil)
-        ((equal '(0 . 0) lastmod) (setq lastmod possible-lastmod))
-        ((consp lastmod) (setq lastmod (current-time-string lastmod)))
-        (t (setq lastmod possible-lastmod)))
+       (if (consp lastmod)
+           (if (equal '(0 . 0) lastmod)
+               (setq lastmod nil)
+             (setq lastmod (current-time-string lastmod))))
        (setq url-current-mime-type "text/html")
-       (insert "<html>\n"
-               " <head>\n"
-               "  <title>Document Information</title>\n"
-               " </head>\n"
-               " <body\n"
-               "  <table border>\n"
-               "   <tr><th colspan=2>Document Information</th></tr>\n"
-               "   <tr><td>Title:</td><td>" title "</td></tr>\n"
-               "   <tr><td>Location:</td><td>" url "</td></tr>\n"
-               "   <tr><td>Size:</td><td>" (url-pretty-length
-                                            (if (stringp size)
-                                                (string-to-int size)
-                                              size)) "</td></tr>\n"
-               "   <tr><td>Last Modified:</td><td>" (or lastmod "None Given")
-               "</td></tr>\n")
-       (if hdrs
-           (let* ((maxlength (car (sort (mapcar (function (lambda (x)
-                                                            (length (car x))))
-                                                hdrs)
-                                        '>)))
-                  (fmtstring (format "   <tr><td 
align=right>%%%ds:</td><td>%%s</td></tr>" maxlength)))
-             (insert "  <tr><th colspan=2>MetaInformation</th></tr>\n"
-                     (mapconcat
-                      (function
-                       (lambda (x)
-                         (if (/= (length (car x)) 0)
-                             (format fmtstring
-                                     (url-insert-entities-in-string
-                                      (capitalize (car x)))
-                                     (url-insert-entities-in-string
-                                      (if (numberp (cdr x))
-                                          (int-to-string (cdr x))
-                                        (cdr x)))))))
-                      (sort hdrs
-                            (function
-                             (lambda (x y) (string-lessp (car x) (car y)))))
-                      "\n"))))
-
-       ;; FIXME!!! Need to reimplement showing rel/rev links for the new
-       ;; storage format.
+       (insert "\
+Content-Type: text/html\n
+<html>
+ <head>
+  <title>Document Information</title>
+ </head>
+ <body
+  <table border>
+   <tr><th colspan=2>Document Information</th></tr>
+   <tr><td>Title:</td><td>" title "</td></tr>
+   <tr><td>Location:</td><td>" url "</td></tr>")
+       (if size (insert "\
+   <tr><td>Size:</td><td>" (url-pretty-length (if (stringp size)
+                                                 (string-to-int size)
+                                               size)) "</td></tr>"))
+       (insert "\
+   <tr><td>Last Modified:</td><td>" (or lastmod "None Given") "</td></tr>\n")
+       (when hdrs
+         (setq hdrs (delete (assq 'last-modified hdrs) hdrs))
+         (setq hdrs (delete (assq 'content-length hdrs) hdrs))
+         (setq hdrs (mapcar (lambda (pair)
+                              (cons (symbol-name (car pair))
+                                    (cdr pair)))
+                            hdrs)))
+       (let* ((maxlength (car (sort (mapcar (lambda (x)
+                                              (length (car x)))
+                                            hdrs)
+                                    '>)))
+              (fmtstring (format "\
+  <tr><td align=right>%%%ds:</td><td>%%s</td></tr>" maxlength)))
+         (insert
+          "\
+  <tr><th colspan=2>MetaInformation</th></tr>\n"
+          (mapconcat
+           (lambda (x)
+             (if (/= (length (car x)) 0)
+                 (format fmtstring
+                         (url-insert-entities-in-string
+                          (capitalize (car x)))
+                         (url-insert-entities-in-string
+                          (if (numberp (cdr x))
+                              (int-to-string (cdr x))
+                            (cdr x))))))
+           (sort hdrs
+                 (lambda (x y) (string-lessp (car x) (car y))))
+           "\n")))
+       (when links
+         ;; collapse `rel' and `rev' components
+         (setq links (apply 'append (mapcar 'cdr links)))
+         ;; extract
+         (setq links (mapcar
+                      (lambda (elt)
+                        (cons (or (plist-get (cadr elt) 'title)
+                                  (car elt))
+                              (plist-get (cadr elt) 'href)))
+                      links))
+         (let* ((maxlength (car (sort (mapcar (lambda (x)
+                                                (length (car x)))
+                                              links)
+                                      '>)))
+                (fmtstring
+                 (format
+                  "   <tr><td>%%%ds:</td><td><a href='%%s'>%%s</a></td></tr>"
+                  maxlength)))
+           (insert
+            "   <tr><th colspan=2>Document Links</th></tr>\n")
+           (while links
+             (if (and (caar links) (cdar links))
+                 (insert (format fmtstring
+                                 (url-insert-entities-in-string
+                                  (capitalize (caar links)))
+                                 (url-insert-entities-in-string
+                                  (cdar links))
+                                 (url-insert-entities-in-string
+                                  (cdar links))) "\n"))
+             (setq links (cdr links)))))
        
        (if info
-           (let* ((maxlength (car (sort (mapcar (function (lambda (x)
-                                                            (length (car x))))
+           (let* ((maxlength (car (sort (mapcar (lambda (x)
+                                                  (length (car x)))
                                                 info)
                                         '>)))
                   (fmtstring (format
@@ -504,13 +600,9 @@ the cdr is the 'next' node."
                                     (capitalize (caar info)))
                                    (url-insert-entities-in-string
                                     (cdar info))) "\n"))
-               (setq info (cdr info))
-               )
-             )
-         )
-       (insert "  </table>\n"
-               " </body>\n"
-               "</html>\n")))))
+               (setq info (cdr info)))))
+       (insert "  </table></body></html>\n")
+       (current-buffer)))))
 
 (defun w3-insert-formatted-url (p)
   "Insert a formatted url into a buffer.
@@ -886,18 +978,6 @@ even though the MIME type is nil or listed in 
`w3-mime-list-for-code-conversion'
 The global value is usually nil.  It will be bound locally if a user
 invokes some commands which read a coding system from the user.")
 
-;; Fixme: use skip-chars-forward.
-(defun w3-replace-invalid-chars ()
-  (let ((invalid-char-alist w3-invalid-sgml-char-replacement))
-    (while invalid-char-alist
-      (goto-char (point-min))
-      (if (< (caar invalid-char-alist) 256)
-         (let ((str (char-to-string (caar invalid-char-alist)))
-               (repl (cdar invalid-char-alist)))
-           (while (search-forward str nil t)
-             (replace-match repl nil t))))
-      (setq invalid-char-alist (cdr invalid-char-alist)))))
-
 (defun w3-show-history-list ()
   "Format the url-history-list prettily and show it to the user."
   (interactive)
@@ -1326,12 +1406,11 @@ as high as possible in w3-explicit-conversion-tree"
   (interactive "P")
   (if mega
       (mapcar
-       (function
-       (lambda (x)
-         (save-excursion
-           (set-buffer (get-buffer x))
-           (if (eq major-mode 'w3-mode)
-               (w3-quit nil)))))
+       (lambda (x)
+        (save-excursion
+          (set-buffer (get-buffer x))
+          (if (eq major-mode 'w3-mode)
+              (w3-quit nil))))
        (buffer-list))
     (let ((x w3-current-last-buffer))
       (if w3-frame-name
@@ -1446,7 +1525,7 @@ No arg means whole window full.  Arg is number of lines 
to scroll."
       (move-to-window-line -1)
       (beginning-of-line))))
 
-;; FIXME!! This is broken for the new URL package
+
 (defun w3-mail-document-author ()
   "Send mail to the author of this document, if possible."
   (interactive)
@@ -1532,19 +1611,18 @@ BUFFER, the end of BUFFER, nil, and (current-buffer), 
respectively."
   (let ((parent)
        (highly-unlikely-name-for-a-variable-holding-a-function function))
     (widget-map-buttons
-     (function
-      (lambda (widget arg)
-       (setq parent (and widget (widget-get widget :parent)))
-       ;; Check to see if its got a URL tacked on it somewhere
-       (cond
-        ((and widget (widget-get widget :href))
-         (funcall highly-unlikely-name-for-a-variable-holding-a-function
-                  widget maparg))
-        ((and parent (widget-get parent :href))
-         (funcall highly-unlikely-name-for-a-variable-holding-a-function
-                  widget maparg))
-        (t nil))
-       nil)))))
+     (lambda (widget arg)
+       (setq parent (and widget (widget-get widget :parent)))
+       ;; Check to see if its got a URL tacked on it somewhere
+       (cond
+       ((and widget (widget-get widget :href))
+        (funcall highly-unlikely-name-for-a-variable-holding-a-function
+                 widget maparg))
+       ((and parent (widget-get parent :href))
+        (funcall highly-unlikely-name-for-a-variable-holding-a-function
+                 widget maparg))
+       (t nil))
+       nil))))
 
 (defun w3-refresh-stylesheets ()
   "Reload all stylesheets."
@@ -1726,9 +1804,8 @@ Emacs."
 
 (defun w3-only-links ()
   (let* (result temp)
-    (w3-map-links (function
-                  (lambda (x y)
-                    (setq result (cons x result)))))
+    (w3-map-links (lambda (x y)
+                   (setq result (cons x result))))
     result))
 
 (defun w3-download-callback (fname)
@@ -1862,22 +1939,20 @@ With optional ARG, move across that many fields."
                          (buffer-substring-no-properties
                           (widget-get link-at-point :from)
                           (widget-get link-at-point :to)))))
-    (w3-map-links (function
-                  (lambda (widget arg)
-                    (if (and (widget-get widget :from)
-                             (widget-get widget :to))
-                        (setq links-alist (cons
-                                           (cons
-                                            (w3-fix-spaces
-                                             (buffer-substring-no-properties
-                                              (widget-get widget :from)
-                                              (widget-get widget :to)))
-                                            (widget-get widget :href))
-                                           links-alist))))))
+    (w3-map-links (lambda (widget arg)
+                   (if (and (widget-get widget :from)
+                            (widget-get widget :to))
+                       (setq links-alist (cons
+                                          (cons
+                                           (w3-fix-spaces
+                                            (buffer-substring-no-properties
+                                             (widget-get widget :from)
+                                             (widget-get widget :to)))
+                                           (widget-get widget :href))
+                                          links-alist)))))
     (if (not links-alist) (error "No links in current document"))
-    (setq links-alist (sort links-alist (function
-                                        (lambda (x y)
-                                          (string< (car x) (car y))))))
+    (setq links-alist (sort links-alist (lambda (x y)
+                                         (string< (car x) (car y)))))
     ;; Destructively remove duplicate entries from links-alist.
     (let ((remaining-links links-alist))
       (while remaining-links

commit a3a4150885f0e5215ad720fbddbb24c1f267f172
Author: Dave Love <address@hidden>
Date:   Tue Sep 25 09:13:39 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 631f563..6d51fad 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2001-09-24  Dave Love  <address@hidden>
+
+       * lisp/w3.el (w3-http-equiv-headers): New function.
+       (w3-nasty-disgusting-http-equiv-handling): Use it to fix
+       http-equiv handling.
+
 2001-09-09  Dave Love  <address@hidden>
 
        * lisp/w3-display.el (w3-mode, w3-add-delayed-graphic) 

commit 1f7abb0a268f096d62b372ae22f26e5a714ff442
Author: Dave Love <address@hidden>
Date:   Tue Sep 25 09:13:25 2001 +0000

    (w3-http-equiv-headers): New function.
    (w3-nasty-disgusting-http-equiv-handling): Use it to fix
    http-equiv handling.

diff --git a/lisp/w3.el b/lisp/w3.el
index 0081e59..5598fd8 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: fx $
-;; Created: $Date: 2001/06/07 16:27:31 $
-;; Version: $Revision: 1.21 $
+;; Created: $Date: 2001/09/25 09:13:25 $
+;; Version: $Revision: 1.22 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -179,35 +179,56 @@ Return the coding system used for the decoding."
       (mm-enable-multibyte))
     coding-system))
 
+(defvar http-header)                   ; dynamically bound below
+
+(defun w3-http-equiv-headers (tree)
+  "Grovel parse TREE for <meta http-equiv...> elements.
+Concatenate the equivalent MIME header onto the dynamically-bound
+variable `http-header'."
+  (if (consp tree)
+      (dolist (node tree)
+       (if (consp node)
+           (if (eq 'meta (car-safe node))
+               (let ((attrs (cadr node)))
+                 (if (assq 'http-equiv attrs)
+                     (if (assq 'content attrs)
+                         (setq http-header
+                               (concat 
+                                http-header
+                                (format "%s: %s\n" 
+                                        (cdr (assq 'http-equiv attrs))
+                                        (cdr (assq 'content attrs))))))))
+             (w3-http-equiv-headers (nth 2 node)))))))
+
 (defun w3-nasty-disgusting-http-equiv-handling (&optional buffer)
-  (let ((content-type nil)
-       (end-of-headers nil)
-       (extra-headers nil))
+  "Propagate information from <meta http-equiv...> elements to MIME headers."
+  (let (content-type end-of-headers extra-headers)
     (save-excursion
       (if buffer (set-buffer buffer))
       (goto-char (point-min))
       (mail-narrow-to-head)
       (setq content-type (mail-fetch-field "content-type"))
-      (goto-char (point-max))          ; Make sure we are beyond the headers
+      (goto-char (point-max))   ; Make sure we are beyond the headers
       (setq end-of-headers (point))
       (widen)
-      (if (and content-type (string-match "^text/html" content-type)
-              (re-search-forward "</head" nil t))
-         (let ((case-fold-search t)
-               (end-of-head (point)))
-           ;; Need to find any <meta http-equiv> stuff in the head so
-           ;; we can promote them into the headers before
-           ;; mm-dissect-buffer looks for them.
-           (goto-char end-of-headers)
-           (while (re-search-forward "<meta[ \t\r\n]+http-equiv"
-                                     end-of-head t)
-             (forward-char 5)
-             (skip-chars-forward " \t\r\n")
-             ;; We should now be directly in front of the first
-             ;; attribute name.  Need to parse the tag attributes and
-             ;; push them up.
-             (message "address@hidden - Need to promote a header.")
-             (forward-char 1)))))))
+      (let ((case-fold-search t))
+       (if (and content-type (string-match "^text/html" content-type)
+                ;; Try not to parse past the head element.
+                (re-search-forward "</[ \n]*head\\|<[ \n]*body" nil t))
+           (let ((end-of-head (point)))
+             ;; Find any <meta http-equiv> stuff in the head so we
+             ;; can promote it into the MIME headers before
+             ;; mm-dissect-buffer looks at them.
+             (let (http-header)
+               (save-restriction
+                 (narrow-to-region end-of-headers end-of-head)
+                 (goto-char (point-min))
+                 ;; Quick check before parsing.
+                 (if (search-forward "http-equiv=" nil t)
+                     (w3-http-equiv-headers (w3-parse-buffer))))
+               (when http-header
+                 (goto-char (point-min))
+                 (insert http-header)))))))))
 
 (defun w3-fetch-callback (url)
   (w3-nasty-disgusting-http-equiv-handling)

commit eecfed4dcf1310a4ee0d3fc49cd5a5565f1b5907
Author: Dave Love <address@hidden>
Date:   Sun Sep 9 15:35:38 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index f31f690..631f563 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2001-09-09  Dave Love  <address@hidden>
+
+       * lisp/w3-display.el (w3-mode, w3-add-delayed-graphic) 
+       (w3-find-specific-link, w3-fix-spaces): Autoload.
+
+       * lisp/w3-props.el (w3-fillin-text-property): Renamed from
+       `fillin-text-property'.
+
 2001-08-24  Dave Love  <address@hidden>
 
        * lisp/font.el (font-spatial-to-canonical): Don't choke if

commit d8094fb6060d046a46a9bfea86aef9258917810f
Author: Dave Love <address@hidden>
Date:   Sun Sep 9 15:35:00 2001 +0000

    (w3-mode, w3-add-delayed-graphic)
    (w3-find-specific-link, w3-fix-spaces): Autoload.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index bcac30a..78ad6ef 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.33 $
+;; Version: $Revision: 1.34 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -42,6 +42,10 @@
 (autoload 'flatten "flame")
 (autoload 'append-suffixes-hack "flame") ; I guess... -- fx
 (autoload 'w3-java-run-applet "w3-java")
+(autoload 'w3-mode "w3")
+(autoload 'w3-add-delayed-graphic "w3")
+(autoload 'w3-find-specific-link "w3")
+(autoload 'w3-fix-spaces "w3")
 (autoload 'mm-inline-text "mm-view")   ; may not be done by Gnus
 (defvar w3-cookie-cache nil)
 

commit ee07adb9e4d59d816229baeb1f3f53cf6b44500e
Author: Dave Love <address@hidden>
Date:   Sun Sep 9 15:33:14 2001 +0000

    (w3-fillin-text-property): Renamed from
    `fillin-text-property'.

diff --git a/lisp/w3-props.el b/lisp/w3-props.el
index 49ce2e3..ce8a5cc 100644
--- a/lisp/w3-props.el
+++ b/lisp/w3-props.el
@@ -1,7 +1,7 @@
 ;;; w3-props.el --- Additional text property stuff
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:11 $
-;; Version: $Revision: 1.1 $
+;; Author: $Author: fx $
+;; Created: $Date: 2001/09/09 15:33:14 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: faces
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -37,7 +37,8 @@
 ;; so, should the first or last duplicate item remain?  Or the one that was
 ;; added?  In our implementation, the first duplicate remains.
 
-(defsubst fillin-text-property (start end setprop markprop value &optional 
object)
+(defsubst w3-fillin-text-property (start end setprop markprop value
+                                        &optional object)
   "Fill in one property of the text from START to END.
 Arguments PROP and VALUE specify the property and value to put where none are
 already in place.  Therefore existing property values are not overwritten.

commit 7d0792f79ccf393fb4a3b146b8dbb59f21df7e00
Author: Dave Love <address@hidden>
Date:   Sun Sep 9 15:30:49 2001 +0000

    Fix error messages.

diff --git a/lisp/w3-forms.el b/lisp/w3-forms.el
index 98b7d26..e0fa890 100644
--- a/lisp/w3-forms.el
+++ b/lisp/w3-forms.el
@@ -1,7 +1,7 @@
 ;;; w3-forms.el --- Emacs-w3 forms parsing code for new display engine
 ;; Author: $Author: fx $
-;; Created: $Date: 2001/06/07 17:24:58 $
-;; Version: $Revision: 1.9 $
+;; Created: $Date: 2001/09/09 15:30:49 $
+;; Version: $Revision: 1.10 $
 ;; Keywords: faces, help, comm, data, languages
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -139,7 +139,7 @@
               (mapcar (function (lambda (pair)
                                   (length (car pair))))
                       w3-form-valid-key-sizes))))
-    (otherwise (or size 22))))    
+    (otherwise (or size 22))))
  
 ;;;###autoload
 (defun w3-form-add-element (plist face)
@@ -368,11 +368,11 @@
                 :value (w3-form-element-value el)))
 
 (defun w3-form-create-keygen-list (el face)
-  (let* ((size (apply 'max (mapcar (lambda (pair) (length (car pair))) 
+  (let* ((size (apply 'max (mapcar (lambda (pair) (length (car pair)))
                                   w3-form-valid-key-sizes)))
         (options (mapcar (lambda (pair)
                            (list 'choice-item
-                                 :format "%[%t%]" 
+                                 :format "%[%t%]"
                                  :tab-order -1
                                  :button-face face
                                  :value-face face
@@ -485,7 +485,7 @@
 
 (defun w3-form-default-button-update (w v)
   (let ((info (widget-get w :w3-form-data)))
-    (widget-put w :tag 
+    (widget-put w :tag
                (if info
                    (truncate-string-to-width
                     (if (eq 'password (w3-form-element-type info))
@@ -553,7 +553,7 @@ This can be used as the :help-echo property of all w3 form 
entry widgets."
   (declare (special w3-form-labels))
   (cdr-safe
    (assoc (or (plist-get (w3-form-element-plist data) 'id)
-             (plist-get (w3-form-element-plist data) 'label))        
+             (plist-get (w3-form-element-plist data) 'label))
          w3-form-labels)))
 
 (defun w3-form-summarize-default (data widget)
@@ -624,7 +624,7 @@ This can be used as the :help-echo property of all w3 form 
entry widgets."
                                                                "[nothing]"))))
 
 (defun w3-form-summarize-keygen-list (data widget)
-  (format "Submitting this form will generate a %d bit key (not)" 
+  (format "Submitting this form will generate a %d bit key (not)"
          (widget-value (w3-form-element-widget data))))
 
 (defun w3-form-maybe-submit-by-keypress ()
@@ -817,9 +817,9 @@ This can be used as the :help-echo property of all w3 form 
entry widgets."
                   (keygen
                    (condition-case ()
                        (require 'ssl)
-                     (error (error "Not configured for SSL, please read the 
info pages.")))
+                     (error (error "Not configured for SSL, please read the 
info pages")))
                    (if (fboundp 'ssl-req-user-cert) nil
-                     (error "This version of SSL isn't capable of requesting 
certificates."))
+                     (error "This version of SSL isn't capable of requesting 
certificates"))
                    (let ((challenge (plist-get (w3-form-element-plist formobj) 
'challenge))
                          (size (widget-value widget)))
                      (cons (w3-form-element-name formobj)
@@ -892,6 +892,9 @@ This can be used as the :help-echo property of all w3 form 
entry widgets."
           (w3-form-encode-helper result) "\n"))
     query))
 
+;; Fixme: check the charset issues on form submission
+;; http://ppewww.ph.gla.ac.uk/%7Eflavell/charset/form-i18n.html
+
 (defun w3-form-encode-xwfu (chunk)
   "Escape characters in a string for application/x-www-form-urlencoded.
 Blasphemous crap because someone didn't think %20 was good enough for encoding

commit 8a11a68f2c2a046d9d710316948700f33627015c
Author: Dave Love <address@hidden>
Date:   Fri Aug 24 09:24:21 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 1353188..f31f690 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2001-08-24  Dave Love  <address@hidden>
+
+       * lisp/font.el (font-spatial-to-canonical): Don't choke if
+       font-default-size-for-device returns nil, convert it to 0.
+       From Jim Meyering <address@hidden>
+
 2001-07-19  Dave Love  <address@hidden>
 
        * lisp/w3-toolbar.el (w3-toolbar-map): Don't lose on non-graphical

commit ececf2731dee615410216751718c1c49b88f9e06
Author: Dave Love <address@hidden>
Date:   Fri Aug 24 09:23:33 2001 +0000

    (font-spatial-to-canonical): Don't choke if
    font-default-size-for-device returns nil, convert it to 0.
    From Jim Meyering <address@hidden>

diff --git a/lisp/font.el b/lisp/font.el
index 719bd25..0fdf819 100644
--- a/lisp/font.el
+++ b/lisp/font.el
@@ -1,7 +1,7 @@
 ;;; font.el --- New font model
 ;; Author: $Author: fx $
-;; Created: $Date: 2000/12/20 20:52:16 $
-;; Version: $Revision: 1.6 $
+;; Created: $Date: 2001/08/24 09:23:33 $
+;; Version: $Revision: 1.7 $
 ;; Keywords: faces
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -345,7 +345,7 @@ the new redisplay engine.")
              (other (font-spatial-to-canonical
                      (substring spec (match-end 0) nil)))
              (default (font-spatial-to-canonical
-                       (font-default-size-for-device device))))
+                       (or (font-default-size-for-device device) 0))))
          (if (fboundp math-func)
              (setq type "px"
                    spec (int-to-string (funcall math-func default other)))
@@ -1000,7 +1000,7 @@ for use in the 'weight' field of an mswindows font 
string.")
     (apply 'set-face-font face font args))))
 
 (if font-running-emacs-new-redisplay
-    (defalias 'font-set-face-font 'font-set-face-font-new-redisplay))
+(defalias 'font-set-face-font 'font-set-face-font-new-redisplay))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Now for emacsen specific stuff

commit 56b706f1b9abcad7c83396950cb5407b70a40a27
Author: Dave Love <address@hidden>
Date:   Thu Jul 19 14:18:07 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 2a69636..1353188 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2001-07-19  Dave Love  <address@hidden>
+
+       * lisp/w3-toolbar.el (w3-toolbar-map): Don't lose on non-graphical
+       display with tool-bar-mode t.
+
 2001-06-21  Dave Love  <address@hidden>
 
        * lisp/w3-menu.el (w3-menu-hotlist-constructor): Require w3-hot,

commit 896556da25cb5ed663662f78310070b9f9e8adbf
Author: Dave Love <address@hidden>
Date:   Thu Jul 19 14:15:52 2001 +0000

    (w3-toolbar-map): Don't lose on non-graphical
    display with tool-bar-mode t.

diff --git a/lisp/w3-toolbar.el b/lisp/w3-toolbar.el
index b6934eb..bee5bce 100644
--- a/lisp/w3-toolbar.el
+++ b/lisp/w3-toolbar.el
@@ -1,7 +1,7 @@
 ;;; w3-toolbar.el --- Toolbar functions for emacs-w3
 ;; Author: William M. Perry <address@hidden>
-;; Created: $Date: 2001/06/07 13:44:51 $
-;; Version: $Revision: 1.7 $
+;; Created: $Date: 2001/07/19 14:15:52 $
+;; Version: $Revision: 1.8 $
 ;; Keywords: mouse, toolbar
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -364,31 +364,31 @@ not `none'.")
                 ["Cancel" (beep) t])))
     (popup-dialog-box descr)))
 
-(eval-and-compile
-  (if (featurep 'tool-bar)
 (defvar w3-toolbar-map
-  (progn
-    (if (not w3-toolbar-icon-directory)
-       (setq w3-toolbar-icon-directory
-             (file-name-as-directory
-              (expand-file-name "w3" data-directory))))
-    (let ((tool-bar-map (make-sparse-keymap))
-         ;; Add to normal image search path:
-         (load-path (cons w3-toolbar-icon-directory load-path)))
-    (dolist (desc w3-toolbar)
-      (when desc
-       (let ((sym (aref desc 0)))
-         ;; w3-toolbar contains `toolbar-' symbols as well as
-         ;; `w3-toolbar-'.
-         (unless (boundp sym)
-           (setq sym (intern (format "w3-%s" sym))))
-         (if (and desc (not (keywordp (aref desc 0))))
-             (tool-bar-add-item (symbol-value sym) ; image
-                                (aref desc 1) ; binding
-                                (intern (aref desc 3)) ; key
-                                :help (aref desc 3)
-                                :enable (aref desc 2))))))
-    tool-bar-map)))))
+  (if (and (featurep 'tool-bar)
+          (display-graphic-p))         ; would lose on tty
+      (progn
+       (if (not w3-toolbar-icon-directory)
+           (setq w3-toolbar-icon-directory
+                 (file-name-as-directory
+                  (expand-file-name "w3" data-directory))))
+       (let ((tool-bar-map (make-sparse-keymap))
+             ;; Add to normal image search path:
+             (load-path (cons w3-toolbar-icon-directory load-path)))
+         (dolist (desc w3-toolbar)
+           (when desc
+             (let ((sym (aref desc 0)))
+               ;; w3-toolbar contains `toolbar-' symbols as well as
+               ;; `w3-toolbar-'.
+               (unless (boundp sym)
+                 (setq sym (intern (format "w3-%s" sym))))
+               (if (and desc (not (keywordp (aref desc 0))))
+                   (tool-bar-add-item (symbol-value sym) ; image
+                                      (aref desc 1) ; binding
+                                      (intern (aref desc 3)) ; key
+                                      :help (aref desc 3)
+                                      :enable (aref desc 2))))))
+         tool-bar-map))))
 
 (defun w3-add-toolbar-to-buffer ()
   (cond

commit c3ed0d8a454f4cc2012fadf48e104d4a9330bfab
Author: Dave Love <address@hidden>
Date:   Thu Jun 21 16:44:12 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 19b503e..2a69636 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2001-06-21  Dave Love  <address@hidden>
+
+       * lisp/w3-menu.el (w3-menu-hotlist-constructor): Require w3-hot,
+       not w3-hotlist.
+
+2001-06-14  Dave Love  <address@hidden>
+
+       * lisp/Makefile.in (W3_SOURCES): Add w3-emacs.el, remove files it
+       obsoletes.
+
 2001-06-07  Dave Love  <address@hidden>
 
        * lisp/w3-print.el (mule-sysdp): Don't require.

commit 2a819cac9e00d9e60016211f2e26620bd9b00183
Author: Dave Love <address@hidden>
Date:   Thu Jun 21 16:43:52 2001 +0000

    (w3-menu-hotlist-constructor): Require w3-hot,
    not w3-hotlist.

diff --git a/lisp/w3-menu.el b/lisp/w3-menu.el
index b992330..566e11e 100644
--- a/lisp/w3-menu.el
+++ b/lisp/w3-menu.el
@@ -1,6 +1,6 @@
 ;;; w3-menu.el --- Menu functions for emacs-w3
 ;; Author: Bill Perry <address@hidden>
-;; Version: $Revision: 1.12 $
+;; Version: $Revision: 1.13 $
 ;; Keywords: menu, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -128,7 +128,7 @@ on that platform."
     (list "Ignored" (vector item nil nil))))
       
 (defun w3-menu-hotlist-constructor (menu-items)
-  (require 'w3-hotlist)
+  (require 'w3-hot)
   (easy-menu-define
    w3-menu-hotlist-menu nil "Emacs/W3 Dynamic menu"
    (or (cdr w3-html-bookmarks)

commit 9e88090406087a51ceb66d847b5afad67203df0b
Author: Dave Love <address@hidden>
Date:   Thu Jun 14 16:55:04 2001 +0000

    (W3_SOURCES): Add w3-emacs.el, remove files it
    obsoletes.

diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index 9ea7a93..a47a9cc 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -29,9 +29,7 @@ W3_SOURCES =                                                  
        \
        w3-cus.el                                                       \
        w3-dired.el                                                     \
        w3-display.el                                                   \
-       w3-e19.el                                                       \
-       w3-e20.el                                                       \
-       w3-e21.el                                                       \
+       w3-emacs.el                                                     \
        w3-emulate.el                                                   \
        w3-forms.el                                                     \
        w3-hot.el                                                       \

commit b3a11fd213ffa0f28a20a6f55145d110e7c8c3a6
Author: Dave Love <address@hidden>
Date:   Thu Jun 7 17:26:03 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index b1be570..19b503e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -32,7 +32,7 @@
        * lisp/w3-emacs.el: New file.
 
        * lisp/w3-e19.el, lisp/w3-e20.el, lisp/w3-e21.el: Deleted in
-       favour of w3-emacs.
+       favour of w3-emacs.  (Avoid defadvice.)
 
        * lisp/w3.el (w3-load-flavors): Remove Emacs version-specifics --
        just require w3-emacs.

commit 153b569f850687cde5444648a3a638c7e5c79dca
Author: Dave Love <address@hidden>
Date:   Thu Jun 7 17:25:28 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index e4b16c1..b1be570 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,18 +1,48 @@
 2001-06-07  Dave Love  <address@hidden>
 
+       * lisp/w3-print.el (mule-sysdp): Don't require.
+
+       * lisp/w3-parse.el (mule-sysdp): Don't require.
+
+       * lisp/w3-latex.el (mule-sysdp): Don't require.
+       (w3-show-dvi): Avoid mule-write-region-no-coding-system.
+
+       * lisp/w3-display.el (mule-sysdp): Don't require.
+       (w3-display-get-cookie, w3-finalize-image-download): Avoid
+       mule-write-region-no-coding-system.
+
+       * lisp/w3-cus.el (mule-sysdp): Don't require.
+       (w3-force-conversion-alist): Use binary, not
+       mule-no-coding-system.
+
+       * lisp/images.el (mule-sysdp): Don't require.
+       (image-normalize): Use binary, not mule-no-coding-system.
+
+       * lisp/w3-forms.el (wid-edit): Require unconditionally.
+       (custom-magic-reset, w3-warn): Autoload.
+       (w3-form-keymap): Use substitute-key-definition, not
+       cl-map-keymap.
+       (w3-form-create-custom): Require cus-edit unconditionally.
+       (w3-all-widgets): Move definition.
+       (w3-form-create-file-browser, w3-form-create-option-list) 
+       (w3-form-default-button-update): Avoid mule-truncate-string.
+       (mule-sysdp): Don't require.
+       (w3-form-encode-xwfu): Avoid mule-encode-string.
+
        * lisp/w3-emacs.el: New file.
 
        * lisp/w3-e19.el, lisp/w3-e20.el, lisp/w3-e21.el: Deleted in
        favour of w3-emacs.
 
        * lisp/w3.el (w3-load-flavors): Remove Emacs version-specifics --
-       just require w3-emacs..
+       just require w3-emacs.
 
        * lisp/w3-toolbar.el (w3-toolbar-file-icon)
        (w3-toolbar-printer-icon, w3-toolbar-file-icon): New variable.
        (w3-toolbar-map): Transform `toolbar-' symbols into `w3-toolbar-'.
 
        * lisp/w3-sysdp.el (copy-tree): Fix cl- functions.
+       (truncate-string-to-width): New.
 
 2001-06-05  Dave Love  <address@hidden>
 

commit 3ebc0b8553a85cc1805063e3ea249b8b1c15bec0
Author: Dave Love <address@hidden>
Date:   Thu Jun 7 17:24:58 2001 +0000

    (wid-edit): Require unconditionally.
    (custom-magic-reset, w3-warn): Autoload.
    (w3-form-keymap): Use substitute-key-definition, not
    cl-map-keymap.
    (w3-form-create-custom): Require cus-edit unconditionally.
    (w3-all-widgets): Move definition.
    (w3-form-create-file-browser, w3-form-create-option-list)
    (w3-form-default-button-update): Avoid mule-truncate-string.
    (mule-sysdp): Don't require.
    (w3-form-encode-xwfu): Avoid mule-encode-string.

diff --git a/lisp/w3-forms.el b/lisp/w3-forms.el
index d33b4a1..98b7d26 100644
--- a/lisp/w3-forms.el
+++ b/lisp/w3-forms.el
@@ -1,7 +1,7 @@
 ;;; w3-forms.el --- Emacs-w3 forms parsing code for new display engine
-;; Author: $Author: wmperry $
-;; Created: $Date: 2000/07/10 14:43:34 $
-;; Version: $Revision: 1.8 $
+;; Author: $Author: fx $
+;; Created: $Date: 2001/06/07 17:24:58 $
+;; Version: $Revision: 1.9 $
 ;; Keywords: faces, help, comm, data, languages
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -38,29 +38,23 @@
   (require 'url)
   (require 'url-util)
   (require 'widget)
-  (condition-case nil
-      (require 'wid-edit)
-    (error (require 'widget-edit))))
+  (require 'wid-edit))
 
 (require 'w3-vars)
-(require 'mule-sysdp)
+(autoload 'custom-magic-reset "cus-edit")
+(autoload 'w3-warn "w3")
 
 (defvar w3-form-use-old-style nil
   "*Non-nil means use the old way of interacting for form fields.")
 
 (defvar w3-form-keymap
+  ;; Fixme: Why doesn't this use inheritance?  -- fx
   (let ((map (copy-keymap global-map))
        (eol-loc (where-is-internal 'end-of-line global-map t)))
-    (if widget-keymap
-       (cl-map-keymap (function
-                       (lambda (key binding)
-                         (define-key map
-                           (if (vectorp key) key (vector key))
-                           (case binding
-                                 (widget-backward 'w3-widget-backward)
-                                 (widget-forward  'w3-widget-forward)
-                                 (otherwise binding)))))
-                      widget-keymap))
+    (substitute-key-definition 'widget-backward 'w3-widget-backward
+                              map widget-keymap)
+    (substitute-key-definition 'widget-forward 'w3-widget-forward
+                              map widget-keymap)
     (define-key map [return]      'w3-form-maybe-submit-by-keypress)
     (define-key map "\r"          'w3-form-maybe-submit-by-keypress)
     (define-key map "\n"          'w3-form-maybe-submit-by-keypress)
@@ -265,9 +259,7 @@
 (make-variable-buffer-local 'w3-custom-options)
 
 (defun w3-form-create-custom (el face)
-  (condition-case ()
-      (require 'cus-edit)
-    (error (require 'custom-edit)))
+  (require 'cus-edit)
   (let* ((name (w3-form-element-name el))
         (var-name (w3-form-element-value el))
         (type (plist-get (w3-form-element-plist el) 'custom-type))
@@ -376,17 +368,18 @@
                 :value (w3-form-element-value el)))
 
 (defun w3-form-create-keygen-list (el face)
-  (let* ((size (apply 'max (mapcar (function (lambda (pair) (length (car 
pair)))) 
+  (let* ((size (apply 'max (mapcar (lambda (pair) (length (car pair))) 
                                   w3-form-valid-key-sizes)))
-        (options (mapcar (function (lambda (pair)
-                                     (list 'choice-item
-                                           :format "%[%t%]" 
-                                           :tab-order -1
-                                           :button-face face
-                                           :value-face face
-                                           :menu-tag-get `(lambda (zed) ,(car 
pair))
-                                           :tag (mule-truncate-string (car 
pair) size ? )
-                                           :value (cdr pair))))
+        (options (mapcar (lambda (pair)
+                           (list 'choice-item
+                                 :format "%[%t%]" 
+                                 :tab-order -1
+                                 :button-face face
+                                 :value-face face
+                                 :menu-tag-get `(lambda (zed) ,(car pair))
+                                 :tag (truncate-string-to-width (car pair)
+                                                                size nil ? )
+                                 :value (cdr pair)))
                          w3-form-valid-key-sizes)))
     (apply 'widget-create 'menu-choice
           :emacspeak-help 'w3-form-summarize-field
@@ -414,7 +407,8 @@
                           (list 'choice-item :format "%[%t%]"
                                 :emacspeak-help 'w3-form-summarize-field
                                 :menu-tag-get (` (lambda (zed) (, (car x))))
-                                :tag (mule-truncate-string (car x) size ? )
+                                :tag (truncate-string-to-width (car x)
+                                                               size ? )
                                 :button-face face
                                 :value-face face
                                 :value (car x))))
@@ -493,7 +487,7 @@
   (let ((info (widget-get w :w3-form-data)))
     (widget-put w :tag 
                (if info
-                   (mule-truncate-string
+                   (truncate-string-to-width
                     (if (eq 'password (w3-form-element-type info))
                         (make-string (length v) ?*)
                       v)
@@ -639,6 +633,10 @@ This can be used as the :help-echo property of all w3 form 
entry widgets."
     (if widget
        (w3-form-possibly-submit widget))))
 
+(defsubst w3-all-widgets (actn)
+  ;; Return a list of data entry widgets in form number ACTN
+  (cdr-safe (assoc actn w3-form-elements)))
+
 (defun w3-form-possibly-submit (widget &rest ignore)
   (let* ((formobj (widget-get widget :w3-form-data))
         (ident (w3-form-element-action formobj))
@@ -712,10 +710,6 @@ This can be used as the :help-echo property of all w3 form 
entry widgets."
          (switch-to-buffer buff)
          (w3-form-element-set-value formobj valu)))))
 
-(defsubst w3-all-widgets (actn)
-  ;; Return a list of data entry widgets in form number ACTN
-  (cdr-safe (assoc actn w3-form-elements)))
-
 (defun w3-revert-form (actn)
   (save-excursion
     (let* ((formobjs (w3-all-widgets actn))
@@ -908,13 +902,20 @@ spaces.  Die Die Die."
       (setq chunk (cdr chunk)))
 
   (mapconcat
-   (function
-    (lambda (char)
-      (cond
-       ((= char ?  ) "+")
-       ((memq char url-unreserved-chars) (char-to-string char))
-       (t (upcase (format "%%%02x" char))))))
-    (mule-encode-string chunk) ""))
+   (lambda (char)
+     (cond
+      ((= char ?  ) "+")
+      ((memq char url-unreserved-chars) (char-to-string char))
+      (t (upcase (format "%%%02x" char)))))
+   ;; Fixme: Should this actually be accepting multibyte?  Is there a
+   ;; better way in XEmacs?
+   (if (featurep 'mule)
+       (encode-coding-string chunk
+                            (if (fboundp 'find-coding-systems-string)
+                                (car (find-coding-systems-string chunk))
+                                buffer-file-coding-system))
+     chunk)
+   ""))
 
 (defun w3-form-encode-application/x-www-form-urlencoded (result)
   (mapconcat

commit cd36c56bcdba789d340bbc4aed6952a3504c71fc
Author: Dave Love <address@hidden>
Date:   Thu Jun 7 17:19:15 2001 +0000

    (mule-sysdp): Don't require.
    (w3-display-get-cookie, w3-finalize-image-download): Avoid
    mule-write-region-no-coding-system.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index c34e8c5..bcac30a 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.32 $
+;; Version: $Revision: 1.33 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -501,9 +501,6 @@ If the face already exists, it is unmodified."
                           (list 'personality (car w3-active-voices))))
   )
 
-(eval-and-compile
-  (require 'mule-sysdp))
-
 (defun w3-display-get-cookie (args)
   (if (not (fboundp 'cookie))
       "Sorry, no cookies today."
@@ -515,10 +512,12 @@ If the face already exists, it is unmodified."
       (if (not (file-exists-p fname))
          (save-excursion
            (set-buffer (generate-new-buffer " *cookie*"))
+           (mm-disable-multibyte)
            (url-insert-file-contents href)
            (setq buffer-file-name nil)
            (set-buffer-modified-p nil)    
-           (mule-write-region-no-coding-system (point-min) (point-max) fname 5)
+           (let ((coding-system-for-write 'binary))
+             (write-region (point-min) (point-max) fname 5))
            (setq w3-cookie-cache (cons (cons href fname) w3-cookie-cache))))
       (cookie fname st nd))))
 
@@ -897,7 +896,8 @@ If the face already exists, it is unmodified."
          (erase-buffer)
          (insert (aref glyph 2))
          (setq glyph temp-fname)
-         (mule-write-region-no-coding-system (point-min) (point-max) 
temp-fname)
+         (let ((coding-system-for-write 'binary))
+           (write-region (point-min) (point-max) temp-fname))
          (kill-buffer (current-buffer)))
        (setq glyph (make-glyph (list (cons 'x glyph))))
        (condition-case ()

commit 1270a3f1c8b37828c5cf740ad6a354b8a435fb1c
Author: Dave Love <address@hidden>
Date:   Thu Jun 7 17:17:58 2001 +0000

    (truncate-string-to-width): New.

diff --git a/lisp/w3-sysdp.el b/lisp/w3-sysdp.el
index a5c1666..f533a75 100644
--- a/lisp/w3-sysdp.el
+++ b/lisp/w3-sysdp.el
@@ -367,7 +367,6 @@ Example:  (add-minor-mode 'view-minor-mode \" View\" 
view-mode-map)"
 (sysdep-defun find-face (face)
   (car-safe (memq face (face-list))))
 
-
 (sysdep-defun copy-tree (tree &optional vecp)
   "Make a copy of TREE.
 If TREE is a cons cell, this recursively copies both its car and its cdr.
@@ -386,6 +385,15 @@ argument VECP, this copies vectors as well as conses."
            (aset tree i (copy-tree (aref tree i) vecp))))))
   tree)
 
+(sysdep-defun truncate-string-to-width (str len &optional start-column pad)
+  "Truncate string STR so that string-width of STR is not greater than LEN.
+If width of the truncated string is less than LEN, and if a character PAD is
+defined, add padding end of it."
+  (concat (if (> (length str) len) (substring str 0 len) str)
+         (if (or (null pad) (> (length str) len))
+             ""
+           (make-string (- len (length str)) pad))))
+
 (provide 'w3-sysdp)
 ;;; sysdep.el ends here
 

commit 142732a66ff31d6d3ec0d481bb0f30f2909f2ddf
Author: Dave Love <address@hidden>
Date:   Thu Jun 7 17:16:03 2001 +0000

    (mule-sysdp): Don't require.

diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index 3ed126c..3588136 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -56,7 +56,6 @@
 (require 'w3-vars)
 (require 'url-parse)
 (require 'url-history)
-(require 'mule-sysdp)
 (autoload 'url-expand-file-name "url-expand")
 
 (eval-when-compile (require 'cl))
diff --git a/lisp/w3-print.el b/lisp/w3-print.el
index c4e2b2b..eca6016 100644
--- a/lisp/w3-print.el
+++ b/lisp/w3-print.el
@@ -1,7 +1,7 @@
 ;;; w3-print.el --- Printing support for emacs-w3
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:36:10 $
-;; Version: $Revision: 1.2 $
+;; Author: $Author: fx $
+;; Created: $Date: 2001/06/07 17:16:57 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: faces, help, printing, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -32,8 +32,6 @@ Possible values include:
 ps-print-buffer-with-faces   - print immediately
 ps-spool-buffer-with-faces   - spool for later")
 
-(require 'mule-sysdp)
-
 ;;;###autoload
 (defun w3-print-this-url (&optional url format)
   "Print out the current document"

commit c11d2f6688bddfd16cac5a84db6d5f24f253db3c
Author: Dave Love <address@hidden>
Date:   Thu Jun 7 17:15:11 2001 +0000

    (mule-sysdp): Don't require.
    (w3-show-dvi): Avoid mule-write-region-no-coding-system.

diff --git a/lisp/w3-latex.el b/lisp/w3-latex.el
index e57651a..b141997 100644
--- a/lisp/w3-latex.el
+++ b/lisp/w3-latex.el
@@ -7,7 +7,7 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1996, 1997 by Stephen Peters <address@hidden>
 ;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;; This file is part of GNU Emacs.
 ;;;
 ;;; GNU Emacs is free software; you can redistribute it and/or modify
 ;;; it under the terms of the GNU General Public License as published by
@@ -421,6 +421,7 @@
    (t
     (w3-latex-contents tree))))
 
+;; Fixme: url-working-buffer is never defined.
 ;;;###autoload
 (defun w3-parse-tree-to-latex (tree &optional url)
   ; assumes that url-working-buffer exists.
@@ -440,8 +441,6 @@
     (w3-latex-subtree (car tree))
     (setq tree (cdr tree))))
 
-(require 'mule-sysdp)
-
 ;;;###autoload
 (defun w3-show-dvi ()
   "Uses xdvi to show DVI file created from `w3-parse-tree-to-latex'."
@@ -449,10 +448,11 @@
   (w3-parse-tree-to-latex w3-current-parse)
   (save-window-excursion
     (set-buffer url-working-buffer)
-    (mule-write-region-no-coding-system
-     (point-min) (point-max)
-     (expand-file-name "w3-tmp.latex"
-                      w3-temporary-directory) nil 5)
+    (let ((coding-system-for-write 'binary))
+      (write-region
+       (point-min) (point-max)
+       (expand-file-name "w3-tmp.latex"
+                        w3-temporary-directory) nil 5))
     (shell-command
      (format 
       "(cd %s ; latex w3-tmp.latex ; latex w3-tmp.latex ; xdvi w3-tmp.dvi ; rm 
-f w3-tmp*) &"

commit baa029c2f8dd6b0a30fad048260de935fa9a027b
Author: Dave Love <address@hidden>
Date:   Thu Jun 7 16:38:25 2001 +0000

    (mule-sysdp): Don't require.
    (w3-force-conversion-alist): Use binary, not
    mule-no-coding-system.

diff --git a/lisp/w3-cus.el b/lisp/w3-cus.el
index 309a10b..f877a47 100644
--- a/lisp/w3-cus.el
+++ b/lisp/w3-cus.el
@@ -1,7 +1,7 @@
 ;;; w3-cus.el --- Customization support for Emacs-W3
-;; Author: $Author: wmperry $
-;; Created: $Date: 2001/05/24 16:45:40 $
-;; Version: $Revision: 1.7 $
+;; Author: $Author: fx $
+;; Created: $Date: 2001/06/07 16:38:25 $
+;; Version: $Revision: 1.8 $
 ;; Keywords: comm, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -26,8 +26,6 @@
 ;;; Boston, MA 02111-1307, USA.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(require 'mule-sysdp)
-
 (defgroup w3 '((url custom-group))
   "Emacs-W3 - the web browser of choice."
   :group 'hypermedia)
@@ -170,10 +168,11 @@ If nil W3 will use a terminal graphic character if 
possible."
                 (character)))
 
 (defcustom w3-force-conversion-alist nil
-  "*An assoc list of URL host/filename regexps and coding systems in which to 
force conversion in Mule"
+  "*An alist of URL host/filename regexps and coding systems to use for them."
   :group 'w3-display
   :type `(repeat (cons (string :tag "Host / filename")
-                      (symbol :tag "Coding system" :value 
,mule-no-coding-system))))
+                      ;; Fixme: Emacs 21 has coding-system :type.
+                      (symbol :tag "Coding system" :value binary))))
 
 ;;; these three variables control how w3-setup-terminal-chars works
 (defcustom w3-use-terminal-characters nil

commit d3ceda895fd3847cab8a9edba4aa1be2be8ffb1e
Author: Dave Love <address@hidden>
Date:   Thu Jun 7 16:36:27 2001 +0000

    (mule-sysdp): Don't require.
    (image-normalize): Use binary, not mule-no-coding-system.

diff --git a/lisp/images.el b/lisp/images.el
index 4940ab5..8622f49 100644
--- a/lisp/images.el
+++ b/lisp/images.el
@@ -1,7 +1,7 @@
 ;;; images.el --- Automatic image converters
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/09 14:52:10 $
-;; Version: $Revision: 1.3 $
+;; Author: $Author: fx $
+;; Created: $Date: 2001/06/07 16:36:27 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: images
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -29,7 +29,6 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; The emacsen compatibility package - load it up before anything else
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(require 'mule-sysdp)
 
 (eval-and-compile
   (if (not (and (string-match "XEmacs" emacs-version)
@@ -156,7 +155,7 @@ to a suitable internal image format will be carried out."
              (while chain
                (cond
                 ((stringp (car chain))
-                 (let ((file-coding-system mule-no-coding-system))
+                 (let ((file-coding-system 'binary))
                    (call-process-region
                     (point-min) (point-max)
                     shell-file-name t

commit 2d3e3e5a4c0f6450e9c9af6a2cad4d188c990abe
Author: Dave Love <address@hidden>
Date:   Thu Jun 7 16:27:31 2001 +0000

    (w3-load-flavors): Remove Emacs version-specifics --
    just require w3-emacs..

diff --git a/lisp/w3.el b/lisp/w3.el
index 0fc081d..0081e59 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: fx $
-;; Created: $Date: 2001/06/01 18:46:30 $
-;; Version: $Revision: 1.20 $
+;; Created: $Date: 2001/06/07 16:27:31 $
+;; Version: $Revision: 1.21 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -979,10 +979,9 @@ invokes some commands which read a coding system from the 
user.")
 
 (defun w3-load-flavors ()
   "Load the correct emacsen specific stuff."
-  (cond
-   (w3-running-xemacs (require 'w3-xemac))
-   (t                                  ; Assume we are the FSF variant
-    (require (intern (format "w3-e%d" emacs-major-version)))))
+  (if (featurep 'xemacs)
+      (require 'w3-xemac)
+    (require 'w3-emacs))
   (if (featurep 'emacspeak)
       (condition-case ()
          (progn

commit 7126b9dbec76ab84ef9fa064de8583d5da541509
Author: Dave Love <address@hidden>
Date:   Thu Jun 7 16:23:54 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 7d2562d..e4b16c1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2001-06-07  Dave Love  <address@hidden>
+
+       * lisp/w3-emacs.el: New file.
+
+       * lisp/w3-e19.el, lisp/w3-e20.el, lisp/w3-e21.el: Deleted in
+       favour of w3-emacs.
+
+       * lisp/w3.el (w3-load-flavors): Remove Emacs version-specifics --
+       just require w3-emacs..
+
+       * lisp/w3-toolbar.el (w3-toolbar-file-icon)
+       (w3-toolbar-printer-icon, w3-toolbar-file-icon): New variable.
+       (w3-toolbar-map): Transform `toolbar-' symbols into `w3-toolbar-'.
+
+       * lisp/w3-sysdp.el (copy-tree): Fix cl- functions.
+
 2001-06-05  Dave Love  <address@hidden>
 
        * lisp/w3-display.el: Require cl only when compiling.
diff --git a/lisp/w3-emacs.el b/lisp/w3-emacs.el
new file mode 100644
index 0000000..1491a1d
--- /dev/null
+++ b/lisp/w3-emacs.el
@@ -0,0 +1,97 @@
+;;; w3-emacs.el --- Emacs-specific functions for emacs-w3
+
+;; Copyright (c) 1997, 1998, 2001 Free Software Foundation, Inc.
+
+;; Author: Dave Love <address@hidden>
+;; Keywords: hypermedia
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to
+;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;; Emacs-specific initialization code for W3.
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(require 'w3-props)
+(autoload 'tooltip-show "tooltip")
+
+(defun w3-setup-version-specifics ()
+  (when (featurep 'tool-bar)
+    (require 'w3-toolbar)
+    (w3-toolbar-make-buttons)
+    (w3-add-toolbar-to-buffer)
+    (add-hook 'tooltip-hook 'w3-tooltip-get-tips)))
+
+(defvar w3-emacs-window-width nil)
+(make-variable-buffer-local 'w3-emacs-window-width)
+;; Unused.  Presumably meant for `window-size-change-functions'.
+(defun w3-window-size-change-function (frame)
+  (let ((first (frame-first-window frame))
+       (cur nil))
+    (while (not (eq cur first))
+      (setq cur (if cur (next-window cur nil frame) first))
+      (save-excursion
+       (set-buffer (window-buffer cur))
+       (if (and (eq major-mode 'w3-mode)
+                (not (eq (window-width cur) w3-emacs-window-width)))
+           (w3-refresh-buffer))))))
+
+(defun w3-mode-version-specifics ()
+  (declare (special w3-face-index w3-display-background-properties))
+  (setq w3-emacs-window-width (window-width))
+  (if w3-track-mouse
+      (set (make-local-variable 'track-mouse) t))
+  (if w3-display-background-properties
+      (let ((face (w3-make-face (intern
+                                (format "w3-style-face-%05d" w3-face-index))
+                               "An Emacs-W3 face... don't edit by hand." t))
+           (fore (car w3-display-background-properties))
+           (inhibit-read-only t)
+           (back (cdr w3-display-background-properties)))
+       (setq w3-face-index (1+ w3-face-index))
+       (if fore (font-set-face-foreground face fore))
+       (if back (font-set-face-background face back))
+       (w3-fillin-text-property (point-min) (point-max) 'face 'face face)))
+  (when (featurep 'tool-bar)
+    (w3-add-toolbar-to-buffer)))
+
+(defun w3-tooltip-get-tips (event)
+  (let (widget pos help start)
+    (setq start (event-start event)
+         pos (posn-point start)
+         widget (and pos (widget-at pos))
+         help (and widget (widget-get widget :help-echo)))
+    (if (functionp help)
+       (setq help (funcall help widget (posn-window start)
+                           (window-buffer (posn-window start))
+                           (posn-point start))))
+    (if (stringp help)
+       (tooltip-show help))))
+
+(defun w3-mouse-handler (e)
+  "Function to message the url under the mouse cursor"
+  (interactive "e")
+  (let* ((pt (posn-point (event-start e)))
+        (good (eq (posn-window (event-start e)) (selected-window)))
+        (mouse-events nil))
+    (if (not (and good pt (number-or-marker-p pt)))
+       nil
+      (widget-echo-help pt))))
+
+(provide 'w3-emacs)
+;;; w3-emacs.el ends here

commit c165fb4330223e0d1f84c99675d3760768797e68
Author: Dave Love <address@hidden>
Date:   Thu Jun 7 13:44:51 2001 +0000

    (w3-toolbar-file-icon)
    (w3-toolbar-printer-icon, w3-toolbar-file-icon): New variable.
    (w3-toolbar-map): Transform `toolbar-' symbols into `w3-toolbar-'.

diff --git a/lisp/w3-toolbar.el b/lisp/w3-toolbar.el
index 969a5fd..b6934eb 100644
--- a/lisp/w3-toolbar.el
+++ b/lisp/w3-toolbar.el
@@ -1,7 +1,7 @@
 ;;; w3-toolbar.el --- Toolbar functions for emacs-w3
 ;; Author: William M. Perry <address@hidden>
-;; Created: $Date: 2001/06/05 15:50:25 $
-;; Version: $Revision: 1.6 $
+;; Created: $Date: 2001/06/07 13:44:51 $
+;; Version: $Revision: 1.7 $
 ;; Keywords: mouse, toolbar
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -71,6 +71,12 @@ In Emacs, this is searched preferentially to the normal 
search path.")
 (defvar w3-toolbar-hotl-icon (if (featurep 'tool-bar)
                                 "jump_to")
   "Toolbar icon for hotlist")
+(defvar w3-toolbar-file-icon (if (featurep 'tool-bar)
+                                "new")
+  "Toolbar icon for open url")
+(defvar w3-toolbar-printer-icon (if (featurep 'tool-bar)
+                                "print")
+  "Toolbar icon for open url")
 
 (defvar w3-link-toolbar-orientation 'bottom
   "*Where to put the document specific toolbar.  Must be one of these symbols:
@@ -370,12 +376,18 @@ not `none'.")
          ;; Add to normal image search path:
          (load-path (cons w3-toolbar-icon-directory load-path)))
     (dolist (desc w3-toolbar)
-      (if (and desc (not (keywordp (aref desc 0))))
-         (tool-bar-add-item (symbol-value (aref desc 0)) ; image
-                            (aref desc 1) ; binding
-                            (intern (aref desc 3)) ; key
-                            :help (aref desc 3)
-                            :enable (aref desc 2))))
+      (when desc
+       (let ((sym (aref desc 0)))
+         ;; w3-toolbar contains `toolbar-' symbols as well as
+         ;; `w3-toolbar-'.
+         (unless (boundp sym)
+           (setq sym (intern (format "w3-%s" sym))))
+         (if (and desc (not (keywordp (aref desc 0))))
+             (tool-bar-add-item (symbol-value sym) ; image
+                                (aref desc 1) ; binding
+                                (intern (aref desc 3)) ; key
+                                :help (aref desc 3)
+                                :enable (aref desc 2))))))
     tool-bar-map)))))
 
 (defun w3-add-toolbar-to-buffer ()

commit 78c2a81232782ca53e68c65c0e2754008b038433
Author: Dave Love <address@hidden>
Date:   Thu Jun 7 13:41:39 2001 +0000

    (copy-tree): Fix cl- functions.

diff --git a/lisp/w3-sysdp.el b/lisp/w3-sysdp.el
index df0178f..a5c1666 100644
--- a/lisp/w3-sysdp.el
+++ b/lisp/w3-sysdp.el
@@ -377,13 +377,13 @@ argument VECP, this copies vectors as well as conses."
       (let ((p (setq tree (copy-list tree))))
        (while (consp p)
          (if (or (consp (car p)) (and vecp (vectorp (car p))))
-             (setcar p (cl-copy-tree (car p) vecp)))
-         (or (listp (cdr p)) (setcdr p (cl-copy-tree (cdr p) vecp)))
-         (cl-pop p)))
+             (setcar p (copy-tree (car p) vecp)))
+         (or (listp (cdr p)) (setcdr p (copy-tree (cdr p) vecp)))
+         (pop p)))
     (if (and vecp (vectorp tree))
        (let ((i (length (setq tree (copy-sequence tree)))))
          (while (>= (setq i (1- i)) 0)
-           (aset tree i (cl-copy-tree (aref tree i) vecp))))))
+           (aset tree i (copy-tree (aref tree i) vecp))))))
   tree)
 
 (provide 'w3-sysdp)

commit 3dc7c456972ffc5c7c9b9e01b143e670a7eca8eb
Author: Dave Love <address@hidden>
Date:   Tue Jun 5 23:17:41 2001 +0000

    Fix last commit.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 252773d..c34e8c5 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.31 $
+;; Version: $Revision: 1.32 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -457,14 +457,7 @@ If the face already exists, it is unmodified."
        ))
     (setq n (1- n)))
   (setq w3-last-fill-pos (point-max))
-  (insert-char ?\n n)
-  (cond
-   ((<= n 0) nil)
-   ((< n 10)
-    (insert (aref w3-line-breaks-vector n)))
-   (t
-    (dotimes (i n)
-      (insert ?\n)))))
+  (insert-char ?\n n t))
 
 (defsubst w3-munge-line-breaks-p ()
   (eq (car w3-display-whitespace-stack) 'pre))

commit 4068b2270871da3261636d1e84466c9f78ebddec
Author: Dave Love <address@hidden>
Date:   Tue Jun 5 16:32:35 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 5b01d4d..7d2562d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,38 @@
+2001-06-05  Dave Love  <address@hidden>
+
+       * lisp/w3-display.el: Require cl only when compiling.
+       (w3-line-breaks-vector): Deleted.
+       (w3-display-line-break): Use justification arg of
+       fill-region-as-paragraph.  Use insert-char.
+
+       * lisp/css.el (w3-sysdp): Require.
+       (url-expand-file-name, url-insert-file-contents, url-view-url):
+       Autoload.
+       (css-running-xemacs): Removed.  Change callers to use featurep.
+       (css-handle-import, css-parse): Declare url-current-object
+       special.
+       (css-active-device-types): Use display-multi-font-p, not
+       font-running-emacs-new-redisplay.
+
+       * lisp/w3-parse.el (w3-invalid-sgml-char-replacement): Doc fix.
+       (w3-resolve-numeric-char): Renamed from
+       w3-resolve-numeric-entity.  Callers changed.
+
+       * lisp/w3-vars.el (w3-version-number): Fix regexp, doc.
+       (w3-html-entities): Modified per W3C entity list.
+
+       * lisp/w3-toolbar.el (w3-toolbar-back-icon, w3-toolbar-forw-icon) 
+       (w3-toolbar-home-icon, w3-toolbar-reld-icon) 
+       (w3-toolbar-imag-icon, w3-toolbar-open-icon) 
+       (w3-toolbar-print-icon, w3-toolbar-find-icon) 
+       (w3-toolbar-stop-icon, w3-toolbar-help-icon) 
+       (w3-toolbar-hotl-icon) [(featurep 'tool-bar)]: Initialize to names
+       of Emacs 21 icons.
+       (toolbar-make-button-list) [(featurep 'tool-bar)]: Don't define.
+       (w3-toolbar-make-buttons): Do nothing if (featurep 'tool-bar).
+       (w3-toolbar-map): New variable.
+       (w3-add-toolbar-to-buffer): Use it.
+
 2001-06-01  Dave Love  <address@hidden>
 
        * lisp/w3-display.el (widget-convert-text): Only advise it if

commit d19f0d04e206e21153a512b131fa8056ea5c3161
Author: Dave Love <address@hidden>
Date:   Tue Jun 5 16:19:02 2001 +0000

    Require cl only when compiling.
    (w3-line-breaks-vector): Deleted.
    (w3-display-line-break): Use justification arg of
    fill-region-as-paragraph.  Use insert-char.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 1d5af82..252773d 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.30 $
+;; Version: $Revision: 1.31 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -25,8 +25,8 @@
 ;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 ;;; Boston, MA 02111-1307, USA.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(require 'cl)
 (eval-when-compile
+  (require 'cl)
   (require 'w3-props))
 (require 'css)
 (require 'font)
@@ -161,14 +161,6 @@
       (setq len (1+ len)))
     prefix-vector))
 
-(defconst w3-line-breaks-vector
-  (let ((len 0)
-       (breaks-vector (make-vector 10 nil)))
-    (while (< len 10)
-      (aset breaks-vector len (make-string len ?\n))
-      (setq len (1+ len)))
-    breaks-vector))
-
 (defvar w3-pause-keystroke nil)
 
 (defsubst w3-pause ()
@@ -455,37 +447,24 @@ If the face already exists, it is unmodified."
          width)
       (case (car w3-display-alignment-stack)
        (center
-        (fill-region-as-paragraph w3-last-fill-pos (point))
-        (center-region w3-last-fill-pos (point-max)))
+        (fill-region-as-paragraph w3-last-fill-pos (point) 'center))
        ((justify full)
         (fill-region-as-paragraph w3-last-fill-pos (point) 'full))
        (right
-        (fill-region-as-paragraph w3-last-fill-pos (point))
-        (goto-char w3-last-fill-pos)
-        (catch 'fill-exit
-          (while (re-search-forward ".$" nil t)
-            (if (>= (setq width (current-column)) fill-column)
-                nil                    ; already justified, or error
-              (beginning-of-line)
-              (insert-char ?  (- fill-column width) t)
-              (end-of-line)
-              (if (eobp)
-                  (throw 'fill-exit t))
-              (condition-case ()
-                  (forward-char 1)
-                (error (throw 'fill-exit t))))))
-        )
+        (fill-region-as-paragraph w3-last-fill-pos (point) 'right))
        (otherwise                      ; Default is left justification
         (fill-region-as-paragraph w3-last-fill-pos (point)))
        ))
     (setq n (1- n)))
   (setq w3-last-fill-pos (point-max))
-  (insert (cond
-          ((<= n 0) "")
-          ((< n 10)
-           (aref w3-line-breaks-vector n))
-          (t
-           (make-string n ?\n)))))
+  (insert-char ?\n n)
+  (cond
+   ((<= n 0) nil)
+   ((< n 10)
+    (insert (aref w3-line-breaks-vector n)))
+   (t
+    (dotimes (i n)
+      (insert ?\n)))))
 
 (defsubst w3-munge-line-breaks-p ()
   (eq (car w3-display-whitespace-stack) 'pre))

commit c94023187e6dc5c5df48789a8685d2390cd90098
Author: Dave Love <address@hidden>
Date:   Tue Jun 5 16:02:18 2001 +0000

    (w3-sysdp): require.
    (url-expand-file-name, url-insert-file-contents, url-view-url):
    Autoload.
    (css-running-xemacs): Removed.  Change callers to use featurep.
    (css-handle-import, css-parse): Declare url-current-object
    special.
    (css-active-device-types): Use display-multi-font-p, not
    font-running-emacs-new-redisplay.

diff --git a/lisp/css.el b/lisp/css.el
index 0ff7c09..2297efb 100644
--- a/lisp/css.el
+++ b/lisp/css.el
@@ -1,7 +1,7 @@
 ;;; css.el -- Cascading Style Sheet parser
-;; Author: $Author: wmperry $
-;; Created: $Date: 2001/05/22 19:03:20 $
-;; Version: $Revision: 1.6 $
+;; Author: $Author: fx $
+;; Created: $Date: 2001/06/05 16:02:18 $
+;; Version: $Revision: 1.7 $
 ;; Keywords: 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -29,8 +29,11 @@
 
 (eval-and-compile
   (require 'cl)
-  (require 'font)
-  )
+  (require 'font))
+(require 'w3-sysdp)                    ; for copy-tree
+(autoload 'url-expand-file-name "url-expand")
+(autoload 'url-insert-file-contents "url-handlers")
+(autoload 'url-view-url "url-util")
 
 (if (not (fboundp 'frame-char-height))
     (defun frame-char-height (&optional frame)
@@ -214,10 +217,6 @@ For a terminal screen, the value is always 1."
   (defvar css-scratch-current-value nil)
   )
 
-(defconst css-running-xemacs
-  (string-match "XEmacs" (emacs-version))
-  "Whether we are running in XEmacs or not.")
-
 (defsubst css-replace-regexp (regexp to-string)
   (goto-char (point-min))
   (while (re-search-forward regexp nil t)
@@ -724,6 +723,7 @@ For a terminal frame, the value is always 1."
          (insert data)))))
 
 (defun css-handle-import (data)
+  (declare (special url-current-object))
   (let (url purl)
     (setq purl url-current-object)
     (setq url (css-expand-value 'url data))
@@ -758,7 +758,7 @@ For a terminal frame, the value is always 1."
   (css-replace-regexp "[ \t\r]+$" "")  ; Nuke whitespace at end of line
   (goto-char (point-min)))
 
-(if css-running-xemacs
+(if (featurep 'xemacs)
     (defun css-color-light-p (color-or-face)
       (let (face color)
        (cond
@@ -812,8 +812,10 @@ For a terminal frame, the value is always 1."
 
 (defun css-active-device-types (&optional device)
   (let ((types (list 'all
-                    (if css-running-xemacs 'xemacs 'emacs)
-                    (if (or css-running-xemacs 
font-running-emacs-new-redisplay)
+                    (if (featurep 'xemacs) 'xemacs 'emacs)
+                    (if (or (featurep 'xemacs)
+                            (if (fboundp 'display-multi-font-p)
+                                (display-multi-font-p)))
                         'multifont 'unifont)
                     (if (css-color-light-p 'default) 'light 'dark)))
        (type (device-type device)))
@@ -912,6 +914,7 @@ For a terminal frame, the value is always 1."
   )
 
 (defun css-parse (url &optional string inherit)
+  (declare (special url-current-object))
   (let (
        (url-mime-accept-string
         "text/css ; level=2")

commit e162ac02ec3249a277019f7b87dd8811223e8081
Author: Dave Love <address@hidden>
Date:   Tue Jun 5 15:58:16 2001 +0000

    (w3-invalid-sgml-char-replacement): Doc fix.
    (w3-resolve-numeric-char): Renamed from
    w3-resolve-numeric-entity.  Callers changed.

diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index 04b0e73..3ed126c 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -290,7 +290,7 @@ which must be a string to use as the error message."
     (158 "z\\v" 382) ;; U+017E  LATIN SMALL LETTER Z WITH CARON
     (159 "Y\\.." 376) ;; U+0178  LATIN CAPITAL LETTER Y WITH DIAERESIS
     )
-  "Replacements for SGML numeric entities between 128 and 159.
+  "Replacements for SGML numeric character references between 128 and 159.
 \(Such entities are not valid graphic charcters and are assumed to
 come from the cp1252 character set rather than Unicode.)  This is an
 alist indexed by numeric code.  The cdr of each element is a list of
@@ -331,8 +331,8 @@ is used."
           (setq fs (cdr fs)))
         ret)))
 
-(defun w3-resolve-numeric-entity (code)
-  "Return a representation of the numeric entity CODE.
+(defun w3-resolve-numeric-char (code)
+  "Return a representation of the numeric character reference CODE.
 This may be a string or a character.  CODE is always interpreted as a
 Unicode.  A Unicode character is returned if function `decode-char' is
 available.  Codes in the range [128,160] are substituted using
@@ -357,7 +357,7 @@ available.  Codes in the range [128,160] are substituted 
using
   (while html-entities
     (put (car (car html-entities)) 'html-entity-expansion
         (cons 'CDATA (if (integerp (cdr (car html-entities)))
-                          (let ((ent (w3-resolve-numeric-entity
+                          (let ((ent (w3-resolve-numeric-char
                                       (cdr (car html-entities)))))
                             (unless (stringp ent)
                               (char-to-string ent)))
@@ -477,7 +477,7 @@ available.  Codes in the range [128,160] are substituted 
using
         (backward-char 1))
       ;; The condition-case is probably not necessary now.
       (condition-case ()
-          (insert (w3-resolve-numeric-entity w3-p-s-num))
+          (insert (w3-resolve-numeric-char w3-p-s-num))
         (error (insert "~"))))
      ((looking-at "&#x\\([0-9a-f]+\\)\\([ ;\n]?\\)")
       ;; Similarly to above, but for hex numbers.
@@ -492,7 +492,7 @@ available.  Codes in the range [128,160] are substituted 
using
         (replace-match (match-string 2))
         (backward-char 1))
       (condition-case ()
-          (insert (w3-resolve-numeric-entity w3-p-s-num))
+          (insert (w3-resolve-numeric-char w3-p-s-num))
         (error (insert "~"))))
      ((looking-at "&#\\(re\\|rs\\|space\\|tab\\)[\ ;\n]?") ; \n should be \r
       (replace-match (assq (upcase (char-after (+ 3 (point))))
@@ -2688,7 +2688,7 @@ Returns a data structure containing the parsed 
information."
              (w3-debug-html
               (format "Invalid SGML character: %c" (char-after (point))))
              ;; Probably cp1252 or some such without proper MIME spec...
-             (insert (w3-resolve-numeric-entity
+             (insert (w3-resolve-numeric-char
                       (w3-char-int (char-after (point)))))
              (delete-char 1))
             ((eobp)

commit 2e7bc54248beb9f64792219c6bc25c91b77b6acc
Author: Dave Love <address@hidden>
Date:   Tue Jun 5 15:56:16 2001 +0000

    (w3-version-number): Fix regexp, doc.
    (w3-html-entities): Modified per W3C entity list.

diff --git a/lisp/w3-vars.el b/lisp/w3-vars.el
index b5de3bb..a1892ad 100644
--- a/lisp/w3-vars.el
+++ b/lisp/w3-vars.el
@@ -1,12 +1,12 @@
 ;;; w3-vars.el,v --- All variable definitions for emacs-w3
-;; Author: $Author: wmperry $
-;; Created: $Date: 2000/07/10 14:43:36 $
-;; Version: $Revision: 1.6 $
+;; Author: $Author: fx $
+;; Created: $Date: 2001/06/05 15:56:16 $
+;; Version: $Revision: 1.7 $
 ;; Keywords: comm, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
+;;; Copyright (c) 1996, 97, 98, 99, 2001 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -35,14 +35,14 @@
 
 (defconst w3-version-number
   (let ((x "$State: Exp $"))
-    (if (string-match "State:[ \t\n]+.\\([^ \t\n]+\\)" x)
+    (if (string-match "State:[ \t\n]+\\([^ \t\n]+\\)" x)
        (setq x (substring x (match-beginning 1) (match-end 1)))
       (setq x (substring x 1)))
     (mapconcat
      (function (lambda (x) (if (= x ?-) "." (char-to-string x)))) x ""))
-  "Version # of w3-mode.")
+  "Version number of w3-mode.")
 
-(defconst w3-version-date (let ((x "$Date: 2000/07/10 14:43:36 $"))
+(defconst w3-version-date (let ((x "$Date: 2001/06/05 15:56:16 $"))
                            (if (string-match "Date: \\([^ \t\n]+\\)" x)
                                (substring x (match-beginning 1) (match-end 1))
                              x))
@@ -76,37 +76,37 @@ in later garbage collections taking more time.")
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Store the database of HTML general entities.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Commentary on the basis of the current W3C entity list.  -- fx
 (defvar w3-html-entities 
   '(
-    (excl        .  33)
+    ;;(excl        .  33)
     (quot        .  34)
-    (num         .  35)
-    (dollar      .  36)
-    (percent     .  37)
+    ;;(num         .  35)
+    ;;(dollar      .  36)
+    ;;(percent     .  37)
     (amp         .  38)
-    (rsquo       .  39)
-    (apos        .  39)
-    (lpar        .  40)
-    (rpar        .  41)
-    (times       .  42)
-    (ast         .  42)
-    (plus        .  43)
-    (comma       .  44)
-    (period      .  46)
-    (colon       .  58)
-    (semi        .  59)
+    (rsquo       .  39)                        ; should be U+8217
+    ;;(apos        .  39)
+    ;;(lpar        .  40)
+    ;;(rpar        .  41)
+    ;;(ast         .  42)
+    ;;(plus        .  43)
+    ;;(comma       .  44)
+    ;;(period      .  46)
+    ;;(colon       .  58)
+    ;;(semi        .  59)
     (lt          .  60)
-    (equals      .  61)
+    ;;(equals      .  61)
     (gt          .  62)
-    (quest       .  63)
-    (commat      .  64)
-    (lsqb        .  91)
-    (rsqb        .  93)
-    (uarr        .  94)
-    (lowbar      .  95)
-    (lsquo       .  96)
+    ;;(quest       .  63)
+    ;;(commat      .  64)
+    ;;(lsqb        .  91)
+    ;;(rsqb        .  93)
+    (uarr        .  94)                        ; should be U+8593
+    ;;(lowbar      .  95)
+    (lsquo       .  96)                        ; should be U+8216
     (lcub        . 123)
-    (verbar      . 124)
+    ;;(verbar      . 124)
     (rcub        . 125)
     (tilde       . 126)
     (nbsp        . 160)
@@ -376,6 +376,7 @@ for a charset indication")
 (defvar w3-id-positions nil "Internal use only.")
 (defvar w3-imagemaps nil "Internal use only.")
 
+;; Why aren't these just permanent-local?  -- fx
 (defvar w3-persistent-variables
   '(
     ;; So we can show the URL in the list-buffers listing

commit 46cb11cbe4fa67c3696782b90659ccc935877889
Author: Dave Love <address@hidden>
Date:   Tue Jun 5 15:50:25 2001 +0000

    (w3-toolbar-back-icon, w3-toolbar-forw-icon)
    (w3-toolbar-home-icon, w3-toolbar-reld-icon)
    (w3-toolbar-imag-icon, w3-toolbar-open-icon)
    (w3-toolbar-print-icon, w3-toolbar-find-icon)
    (w3-toolbar-stop-icon, w3-toolbar-help-icon)
    (w3-toolbar-hotl-icon) [(featurep 'tool-bar)]: Initialize to names
    of Emacs 21 icons.
    (toolbar-make-button-list) [(featurep 'tool-bar)]: Don't define.
    (w3-toolbar-make-buttons): Do nothing if (featurep 'tool-bar).
    (w3-toolbar-map): New variable.
    (w3-add-toolbar-to-buffer): Use it.

diff --git a/lisp/w3-toolbar.el b/lisp/w3-toolbar.el
index 50c3718..969a5fd 100644
--- a/lisp/w3-toolbar.el
+++ b/lisp/w3-toolbar.el
@@ -1,7 +1,7 @@
 ;;; w3-toolbar.el --- Toolbar functions for emacs-w3
-;; Author: $Author: fx $
-;; Created: $Date: 2001/05/29 15:57:46 $
-;; Version: $Revision: 1.5 $
+;; Author: William M. Perry <address@hidden>
+;; Created: $Date: 2001/06/05 15:50:25 $
+;; Version: $Revision: 1.6 $
 ;; Keywords: mouse, toolbar
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -27,7 +27,7 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Toolbar specific function for XEmacs 19.12+
+;;; Toolbar specific function for XEmacs and Emacs 21
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (condition-case ()
     (progn
@@ -35,18 +35,42 @@
       (require 'xbm-button))
   (error nil))
 
-(defvar w3-toolbar-icon-directory nil "Where the toolbar icons for w3 are.")
-(defvar w3-toolbar-back-icon nil "Toolbar icon for back")
-(defvar w3-toolbar-forw-icon nil "Toolbar icon for forward")
-(defvar w3-toolbar-home-icon nil "Toolbar icon for home")
-(defvar w3-toolbar-reld-icon nil "Toolbar icon for reload")
-(defvar w3-toolbar-imag-icon nil "Toolbar icon for images")
-(defvar w3-toolbar-open-icon nil "Toolbar icon for open url")
-(defvar w3-toolbar-print-icon nil "Toolbar icon for printing")
-(defvar w3-toolbar-find-icon nil "Toolbar icon for find")
-(defvar w3-toolbar-stop-icon nil "Toolbar icon for stop")
-(defvar w3-toolbar-help-icon nil "Toolbar icon for help")
-(defvar w3-toolbar-hotl-icon nil "Toolbar icon for hotlist")
+(defvar w3-toolbar-icon-directory nil
+  "Where the toolbar icons for W3 are.
+In Emacs, this is searched preferentially to the normal search path.")
+(defvar w3-toolbar-back-icon (if (featurep 'tool-bar)
+                                "left_arrow")
+  "Toolbar icon for back")
+(defvar w3-toolbar-forw-icon (if (featurep 'tool-bar)
+                                "right_arrow")
+  "Toolbar icon for forward")
+(defvar w3-toolbar-home-icon (if (featurep 'tool-bar)
+                                "home")
+  "Toolbar icon for home")
+(defvar w3-toolbar-reld-icon (if (featurep 'tool-bar)
+                                "refresh")
+  "Toolbar icon for reload")
+(defvar w3-toolbar-imag-icon (if (featurep 'tool-bar)
+                                "images")
+  "Toolbar icon for images")
+(defvar w3-toolbar-open-icon (if (featurep 'tool-bar)
+                                "open")
+  "Toolbar icon for open url")
+(defvar w3-toolbar-print-icon (if (featurep 'tool-bar)
+                                 "print")
+  "Toolbar icon for printing")
+(defvar w3-toolbar-find-icon (if (featurep 'tool-bar)
+                                "search")
+  "Toolbar icon for find")
+(defvar w3-toolbar-stop-icon (if (featurep 'tool-bar)
+                                "cancel")
+  "Toolbar icon for stop")
+(defvar w3-toolbar-help-icon (if (featurep 'tool-bar)
+                                "help")
+  "Toolbar icon for help")
+(defvar w3-toolbar-hotl-icon (if (featurep 'tool-bar)
+                                "jump_to")
+  "Toolbar icon for hotlist")
 
 (defvar w3-link-toolbar-orientation 'bottom
   "*Where to put the document specific toolbar.  Must be one of these symbols:
@@ -95,10 +119,6 @@ not `none'.")
     [w3-toolbar-help-icon w3-show-info-node t "Help"])
   "The toolbar for w3")
 
-(if (featurep 'tool-bar)
-    (defun toolbar-make-button-list (up &optional dn no cap-up cap-dn cap-no)
-      (file-name-sans-extension up)))
-
 (defun w3-toolbar-make-captioned-buttons ()
   (mapcar
    (function
@@ -177,6 +197,10 @@ not `none'.")
        (w3-toolbar-make-text-buttons))
        ((boundp 'toolbar-buttons-captioned-p)
        (w3-toolbar-make-captioned-buttons))
+       ((featurep 'tool-bar)
+       nil)
+       ;; Fixme: Redundant?  XEmacs versions supported have captioned
+       ;; buttons.
        (t
        (w3-toolbar-make-picture-buttons)))
     (error nil)))
@@ -334,6 +358,26 @@ not `none'.")
                 ["Cancel" (beep) t])))
     (popup-dialog-box descr)))
 
+(eval-and-compile
+  (if (featurep 'tool-bar)
+(defvar w3-toolbar-map
+  (progn
+    (if (not w3-toolbar-icon-directory)
+       (setq w3-toolbar-icon-directory
+             (file-name-as-directory
+              (expand-file-name "w3" data-directory))))
+    (let ((tool-bar-map (make-sparse-keymap))
+         ;; Add to normal image search path:
+         (load-path (cons w3-toolbar-icon-directory load-path)))
+    (dolist (desc w3-toolbar)
+      (if (and desc (not (keywordp (aref desc 0))))
+         (tool-bar-add-item (symbol-value (aref desc 0)) ; image
+                            (aref desc 1) ; binding
+                            (intern (aref desc 3)) ; key
+                            :help (aref desc 3)
+                            :enable (aref desc 2))))
+    tool-bar-map)))))
+
 (defun w3-add-toolbar-to-buffer ()
   (cond
    ((featurep 'infodock)
@@ -350,16 +394,7 @@ not `none'.")
         (display-graphic-p)
         (> (frame-parameter nil 'tool-bar-lines) 0))
     ;; Emacs 21.x way of doing things
-    (let ((toolbar-map (make-sparse-keymap)))
-      (mapc (lambda (desc)
-             (if (and desc (not (keywordp (aref desc 0))))
-                 (tool-bar-add-item (symbol-value (aref desc 0)) ; image
-                                    (aref desc 1) ; binding
-                                    (intern (aref desc 3)) ; key
-                                    toolbar-map ; keymap
-                                    :enable (aref desc 2))))
-             w3-toolbar)
-      (define-key w3-mode-map [tool-bar] toolbar-map)))
+    (set (make-local-variable 'tool-bar-map) w3-toolbar-map))
    (t
     nil)))
 

commit 3a05c9a394c22eb1fad2fefd14fd78b5be8e2000
Author: Dave Love <address@hidden>
Date:   Sun Jun 3 19:12:48 2001 +0000

    *** empty log message ***

diff --git a/INSTALL b/INSTALL
index aeb92ab..2179376 100644
--- a/INSTALL
+++ b/INSTALL
@@ -15,20 +15,15 @@ Copyright (c) 1997 Free Software Foundation, Inc.
    of the Free Software Foundation are approved by the Foundation.
 
 
-ADDITIONAL DISTRIBUTION FILES
-
-* custom.tar.gz
-
-For older versions of Emacs (pre-20.x), you will need the latest and
-greatest versions of the custom and widget libraries.  This is
-distributed in a separate tar file to save users time in downloading,
-and to ease maintenance of the libraries.
-
-
 BUILDING AND INSTALLATION
 
 (This is for a Unix or Unix-like system.  For Windows NT or Windows
-95, see the file README.NT.  For VMS systems, see the file README.VMS)
+95, see the file README.NT.)
+
+This version requires either Emacs 20.3 or later (but 20.3 is known to
+be quite buggy) or XEmacs 20.4 or later.  If you're using a version
+without Gnus 5.8 or later, get a more recent distribution from
+gnus.org.
 
 1) Make sure your system has enough memory to run Emacs, plus about 1
 megabyte to spare.
@@ -50,17 +45,9 @@ options, `configure' will try to figure out what flavor of 
Emacs to
 use.  It will honor the `EMACS' environment variable if it is set,
 otherwise it will check for `xemacs' and `emacs' in your path.
 
-If you had to install the custom and widget libraries in a
-non-standard place, specify `--with-custom=DIR'.  If you omit this
-option, `configure' will try to figure out where an acceptable version 
-of custom and widget are installed.
-
 If you had to install Gnus in a non-standard place, specify
 `--with-gnus=DIR'.  If you omit this option, `configure' will try to
-figure out where an acceptable version of Gnus is installed.  The
-Content-ID (CID) URL handling relies on a recent version of Gnus, but
-the rest of Emacs/W3 can function with any version of Gnus later than
-5.0.
+figure out where an acceptable version of Gnus is installed.
 
 If you prefer not to use the GNU `makeinfo' program if it is
 available, specify `--with-makeinfo=no'.  This will cause the info
diff --git a/README b/README
index 30bb63f..a332285 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-This directory tree holds version $State: p4.0pre.46 $ of Emacs/W3, the fully
+This directory tree holds version $State: p4.0pre.47 $ of Emacs/W3, the fully
 customizable, largely undocumented web browser for Emacs.
 
 You may encounter bugs in this release.  If you do, please report
@@ -33,3 +33,7 @@ There are several subdirectories:
 `lisp' holds the lisp code for Emacs/W3
 `texi' holds the documentation tree for Emacs/W3
 `contrib' holds user-contributed utilities that are not officially supported
+
+This version requires either Emacs 20.3 or later, or XEmacs 20.4 or
+later.  For Emacs, at least 20.4 is recommended since 20.3 (the first
+release of Mule 4) was somewhat buggy.
diff --git a/TODO b/TODO
index d217ddc..243c3ca 100644
--- a/TODO
+++ b/TODO
@@ -1,3 +1,5 @@
+[This is probably in need of updating.  -- fx]
+
 BUGS (4.0):
 - trim down w3-sysdp.el to be just the stuff it really needs
 - border-color can have multiple color specifications, but we

commit dda0e2917931be55391d7faafce6ff96d332a55d
Author: William M. Perry <address@hidden>
Date:   Sat Jun 2 02:17:05 2001 +0000

    Urrrr - forgot a conflict indicator.

diff --git a/ChangeLog b/ChangeLog
index 8dba26d..5b01d4d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -56,7 +56,6 @@
        * lisp/w3-parse.el (w3-parse-buffer): Use
        w3-resolve-numeric-entity for bogus characters.
 
->>>>>>> 1.60
 2001-05-25  William M. Perry  <address@hidden>
 
        * lisp/w3-speak-table.el: Make sure to load cl-extra at load time

commit e8a9216959abd74b470a5741a8cdb2991ced51c4
Author: William M. Perry <address@hidden>
Date:   Sat Jun 2 02:14:22 2001 +0000

    Trying for unicode under XEmacs.

diff --git a/ChangeLog b/ChangeLog
index 5b01d4d..8dba26d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -56,6 +56,7 @@
        * lisp/w3-parse.el (w3-parse-buffer): Use
        w3-resolve-numeric-entity for bogus characters.
 
+>>>>>>> 1.60
 2001-05-25  William M. Perry  <address@hidden>
 
        * lisp/w3-speak-table.el: Make sure to load cl-extra at load time

commit f1fa2ae32ec6d6a7403ed065b68092e72e54d0ea
Author: Dave Love <address@hidden>
Date:   Fri Jun 1 18:54:01 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index f9b4aca..5b01d4d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2001-06-01  Dave Love  <address@hidden>
+
+       * lisp/w3-display.el (widget-convert-text): Only advise it if
+       we're in Emacspeak.
+       (append-suffixes-hack, w3-java-run-applet, mm-inline-text):
+       Autoload.
+       (w3-display-get-cookie): Use url-generate-unique-filename.
+       (w3-display-table): Use copy-sequence, not copy-seq.
+
+       * lisp/w3.el (w3-decode-charset): Set buffer file coding system.
+
 2001-05-31  Dave Love  <address@hidden>
 
        * lisp/w3-menu.el (w3-menu-file-menu): Fix

commit d211636e0bdad0a9d14e40f94e4412d0cbf0f713
Author: Dave Love <address@hidden>
Date:   Fri Jun 1 18:52:31 2001 +0000

    (widget-convert-text): Only advise it if
    we're in Emacspeak.
    (append-suffixes-hack, w3-java-run-applet, mm-inline-text):
    Autoload.
    (w3-display-get-cookie): Use url-generate-unique-filename.
    (w3-display-table): Use copy-sequence, not copy-seq.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 6a95a53..1d5af82 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.29 $
+;; Version: $Revision: 1.30 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -40,6 +40,9 @@
 (autoload 'string-ify "flame")
 (autoload '*flame "flame")
 (autoload 'flatten "flame")
+(autoload 'append-suffixes-hack "flame") ; I guess... -- fx
+(autoload 'w3-java-run-applet "w3-java")
+(autoload 'mm-inline-text "mm-view")   ; may not be done by Gnus
 (defvar w3-cookie-cache nil)
 
 (defmacro w3-d-s-var-def (var)
@@ -138,16 +141,17 @@
 
 (make-variable-buffer-local 'w3-last-fill-pos)
 
-(defadvice widget-convert-text (around emacspeak pre act comp)
-  "Protect value of personality if set originally"
-  (let ((start (ad-get-arg 1))
-        (end (ad-get-arg 2))
-        (orig nil ))
-    (setq orig (get-text-property start 'personality))
-    ad-do-it 
-    (and orig 
-         (put-text-property start end 
-                            'personality orig))))
+(if (featurep 'emacspeak)
+    (defadvice widget-convert-text (around emacspeak pre act comp)
+      "Protect value of personality if set originally"
+      (let ((start (ad-get-arg 1))
+           (end (ad-get-arg 2))
+           (orig nil ))
+       (setq orig (get-text-property start 'personality))
+       ad-do-it 
+       (and orig 
+            (put-text-property start end 
+                               'personality orig)))))
 
 (defconst w3-fill-prefixes-vector
   (let ((len 0)
@@ -533,7 +537,7 @@ If the face already exists, it is unmodified."
       "Sorry, no cookies today."
     (let* ((href (or (w3-get-attribute 'href) (w3-get-attribute 'src)))
           (fname (or (cdr-safe (assoc href w3-cookie-cache))
-                     (mailcap-generate-unique-filename "%s.cki")))
+                     (url-generate-unique-filename "%s.cki")))
           (st (or (cdr-safe (assq 'start args)) "Loading cookies..."))
           (nd (or (cdr-safe (assq 'end args)) "Loading cookies... done.")))
       (if (not (file-exists-p fname))
@@ -1819,8 +1823,8 @@ Can sometimes make the structure of a document clearer")
                   (setq height (max height (length (aref formatted-cols i)))))
               (setq i (+ i (max 1 (aref table-colspans i)))))
 
-            (aset whole-table-rowspans row-index (copy-seq table-rowspans))
-            (aset whole-table-colspans row-index (copy-seq table-colspans))
+            (aset whole-table-rowspans row-index (copy-sequence 
table-rowspans))
+            (aset whole-table-colspans row-index (copy-sequence 
table-colspans))
             
             ;; update row-dimensions
             (aset row-dimensions row-index (1+ height))
@@ -1847,8 +1851,8 @@ Can sometimes make the structure of a document clearer")
                   (decf (aref table-rowspans i)))
               (incf i))
             
-            (setq prev-rowspans (copy-seq table-rowspans))
-            (setq prev-colspans (copy-seq table-colspans))
+            (setq prev-rowspans (copy-sequence table-rowspans))
+            (setq prev-colspans (copy-sequence table-colspans))
         
             (and w3-do-incremental-display (w3-pause))
             )
@@ -2056,7 +2060,7 @@ Format: (((image-alt row column) . offset) ...)")
     rval))
 
 (defvar w3-auto-run-java nil
-  "*If non-nil, will cause Java applets to automatically be run in another 
process.")
+  "*Non-nil means cause Java applets to run automatically in another process.")
 
 (defun w3-display-handle-java (node)
   (let ((options (nth 1 node))

commit 1d7348f65cf83fda8a25282b21b8ae4b203487da
Author: Dave Love <address@hidden>
Date:   Fri Jun 1 18:46:30 2001 +0000

    (w3-decode-charset): Set buffer file coding system.

diff --git a/lisp/w3.el b/lisp/w3.el
index 5c0ac31..0fc081d 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,12 +1,12 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: fx $
-;; Created: $Date: 2001/05/29 16:07:02 $
-;; Version: $Revision: 1.19 $
+;; Created: $Date: 2001/06/01 18:46:30 $
+;; Version: $Revision: 1.20 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
+;;; Copyright (c) 1996, 97, 98, 99, 2001 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -157,7 +157,12 @@ Return the coding system used for the decoding."
         (coding-system (mm-charset-to-coding-system charset)))
     (if (and (not coding-system)
             (not (equal charset "ascii")))
-       ;; Does this work for XEmacs?  Should we guess anyhow?
+       ;; Does this work for XEmacs?  Should we guess anyhow (which
+       ;; is what `undecided' involves)?  In Emacs 20 we'll get
+       ;; byte-combination anyhow when switching to multibyte below,
+       ;; but we can't leave the buffer as unibyte, or we can't deal
+       ;; properly with non-ASCII entities inserted by the parsing
+       ;; stage.
        (setq coding-system 'undecided))
     (save-excursion
       (if encoding
@@ -167,7 +172,10 @@ Return the coding system used for the decoding."
                     default-enable-multibyte-characters
                   t)
                 coding-system)
-       (mm-decode-coding-region (point-min) (point-max) coding-system))
+       (mm-decode-coding-region (point-min) (point-max) coding-system)
+       ;; Potentially useful is the buffer's going to be saved, and
+       ;; for the mode-line indication.
+       (set-buffer-file-coding-system coding-system))
       (mm-enable-multibyte))
     coding-system))
 

commit 91233231abe3d5c232b795ebc4cd5a04697969f4
Author: Dave Love <address@hidden>
Date:   Thu May 31 09:22:41 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 1d6018e..f9b4aca 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
-2001-05-30  Dave Love  <address@hidden>
+2001-05-31  Dave Love  <address@hidden>
+
+       * lisp/w3-menu.el (w3-menu-file-menu): Fix
+       "---:shadowDoubleEtchedIn".  From Pavel Jan,Bm(Bk.
+
+       * lisp/w3-parse.el (decode-char): Define with older Mule-UCS.
+       (w3-expand-entity-at-point-maybe): Sanitize regexp for numeric
+       entity.  Don't lose trailing space.  Grok hex form.
 
+2001-05-30  Dave Love  <address@hidden>
+       
        * lisp/w3-menu.el: Require w3-sysdp.
        (w3-popup-menu): Revert last change.
 
@@ -42,7 +51,7 @@
        to work around a byte-optimizer bug in Emacs 21 that caused this
        module to fail to byte-compile.
 
-2001-05-24  Pavel Janík <address@hidden>
+2001-05-24  Pavel Jan,Bm(Bk <address@hidden>
 
        * lisp/w3-display.el (w3-resurrect-hyperlinks): Look for next
        single property change from `st' instead of `nd' to avoid
@@ -377,3 +386,6 @@
        * lisp/font.el (font-set-face-font-new-redisplay): Don't set the :family
        face attribute if it is nil.  The new redisplay doesn't like that.
 
+;; Local Variables:
+;; coding: iso-2022-7bit
+;; End:

commit e06f7f3d79bfb0321b609eadcdd8898b8d45d158
Author: Dave Love <address@hidden>
Date:   Thu May 31 09:21:22 2001 +0000

    (decode-char): Define with older Mule-UCS.
    (w3-expand-entity-at-point-maybe): Sanitize regexp for numeric
    entity.  Don't lose trailing space.  Grok hex form.

diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index aa084c6..04b0e73 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -259,7 +259,8 @@ which must be a string to use as the error message."
 
 ;; *** I18N HTML support?
 
-
+;; It's perhaps better to use a suitable display table for these
+;; things.  -- fx
 (defconst w3-invalid-sgml-char-replacement
   `((128 "euro" 8364) ;; U+20AC  EURO SIGN
     (130 "," 8218) ;; U+201A  SINGLE LOW-9 QUOTATION MARK
@@ -307,6 +308,29 @@ an ASCII substitute and the Unicode for the cp1252 
character.")
           ?~)))
     (defalias 'w3-int-to-char 'identity)))
 
+;; For older Mule-UCS.  This is from Mule-UCS 0.84.
+(if (and (not (fboundp 'decode-char))
+         (fboundp 'mucs-get-representation-decoding-backend))
+    (defun decode-char (representation object &optional restriction)
+      "Return a character represented by OBJECT in view of REPRESENTATION.
+Return nil if OBJECT cannot be mapped to only one character.
+Available representation list can be obtained by mucs-representation-list.
+Optional argument RESTRICTION specifies a way to map OBJECT to
+a character.  Its interpretation depends on the given
+REPRESENTATION.  If not specified, the default restriction of REPRESENTATION
+is used."
+      (let ((fs (mucs-get-representation-decoding-backend
+                 representation restriction))
+            ret)
+        (while
+            (and fs
+                 (not (setq ret
+                            (funcall
+                             (car fs)
+                             representation object restriction))))
+          (setq fs (cdr fs)))
+        ret)))
+
 (defun w3-resolve-numeric-entity (code)
   "Return a representation of the numeric entity CODE.
 This may be a string or a character.  CODE is always interpreted as a
@@ -316,11 +340,11 @@ available.  Codes in the range [128,160] are substituted 
using
   ;; Maybe fall back to something like `(format "&%d;" code)' instead
   ;; of ?~.
   (if (fboundp 'decode-char)
-    (progn (if (and (< code 160) (> code 128))
-               (setq code
-                     (or (nth 2 (assq code w3-invalid-sgml-char-replacement))
-                         code)))
-           (or (decode-char 'ucs code) ?~))
+      (progn (if (and (< code 160) (> code 128))
+                 (setq code
+                       (or (nth 2 (assq code w3-invalid-sgml-char-replacement))
+                           code)))
+             (or (decode-char 'ucs code) ?~))
     (w3-int-to-char (cond ((<= code 127)
                            code)
                           ((<= code 255)
@@ -427,9 +451,10 @@ available.  Codes in the range [128,160] are substituted 
using
             (t
              ;; *** We don't handle external entities yet.
              (error "[Unimplemented entity: \"%s\"]" w3-p-s-entity))))
-   
-     ;; Fixme: do &#x<n>; too.
-     ((looking-at "&#[0-9][0-9]*\\([\   ;\n]?\\)") ; \n should be \r
+
+;;; What was this regexp supposed to be?
+;;;     ((looking-at "&#[0-9][0-9]*\\([\   ;\n]?\\)") ; \n should be \r
+     ((looking-at "&#[0-9]+\\([ ;\n]?\\)") ; \n should be \r
       ;; We are looking at a numeric character reference.
       ;; Ensure the number is already terminated by a semicolon or carriage
       ;; return so we can use "read" to get it as a number quickly.
@@ -440,16 +465,35 @@ available.  Codes in the range [128,160] are substituted 
using
                (goto-char (match-end 0)) ; same as match-end 1
                (insert ?\;))
              ;; Set up the match data properly
-             (looking-at "&#[0-9][0-9]*;")))
+             (looking-at "&#[0-9]+;")))
       (forward-char 2)
       (setq w3-p-s-num (read (current-buffer)))
-      ;; Always leave point after the expansion of a numeric
-      ;; character reference, like it were a CDATA entity.
-      (replace-match "")
+      ;; Always leave point after the expansion of a numeric character
+      ;; reference, like it were a CDATA entity.  Don't zap a
+      ;; delimiter other than `;'.
+      (if (eq ?\; (char-before (match-end 0)))
+          (replace-match "")
+        (replace-match (match-string 1))
+        (backward-char 1))
       ;; The condition-case is probably not necessary now.
       (condition-case ()
           (insert (w3-resolve-numeric-entity w3-p-s-num))
         (error (insert "~"))))
+     ((looking-at "&#x\\([0-9a-f]+\\)\\([ ;\n]?\\)")
+      ;; Similarly to above, but for hex numbers.
+      (cond ((= (match-beginning 2) (match-end 2))
+             (save-excursion
+               (goto-char (match-end 0))
+               (insert ?\;))
+             (looking-at "&#x[0-9a-f]+;")))
+      (setq w3-p-s-num (string-to-number (match-string 1) 16))
+      (if (eq ?\; (char-before (match-end 0)))
+          (replace-match "")
+        (replace-match (match-string 2))
+        (backward-char 1))
+      (condition-case ()
+          (insert (w3-resolve-numeric-entity w3-p-s-num))
+        (error (insert "~"))))
      ((looking-at "&#\\(re\\|rs\\|space\\|tab\\)[\ ;\n]?") ; \n should be \r
       (replace-match (assq (upcase (char-after (+ 3 (point))))
                            '(;; *** Strictly speaking, record end should be

commit 006d3380e275dc0c2c496b485c2568d0dd8f8e1e
Author: Dave Love <address@hidden>
Date:   Thu May 31 09:18:42 2001 +0000

    (w3-menu-file-menu): Fix
    "---:shadowDoubleEtchedIn".  From Pavel Jan,Bm(Bk.

diff --git a/lisp/w3-menu.el b/lisp/w3-menu.el
index 74e394e..b992330 100644
--- a/lisp/w3-menu.el
+++ b/lisp/w3-menu.el
@@ -1,6 +1,6 @@
 ;;; w3-menu.el --- Menu functions for emacs-w3
 ;; Author: Bill Perry <address@hidden>
-;; Version: $Revision: 1.11 $
+;; Version: $Revision: 1.12 $
 ;; Keywords: menu, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -287,7 +287,7 @@ on that platform."
     ["PostScript" (w3-mail-current-document nil "PostScript") t]
     )
    (if (or (featurep 'xemacs) (>= emacs-major-version 21))
-       "---:shadowDoubleEtchedIn"
+       "--:shadowDoubleEtchedIn"
      "---")
    ["Close" delete-frame (not (eq (next-frame) (selected-frame)))]
    ["Exit"  save-buffers-kill-emacs t]

commit 198b9b402a4306b997bf17d842d306ad190b7c2c
Author: Dave Love <address@hidden>
Date:   Wed May 30 11:10:51 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index c462bbe..1d6018e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2001-05-30  Dave Love  <address@hidden>
+
+       * lisp/w3-menu.el: Require w3-sysdp.
+       (w3-popup-menu): Revert last change.
+
 2001-05-29  Dave Love  <address@hidden>
 
        * lisp/w3-sysdp.el: Remove lots of unused stuff.

commit 4ddf5c765cadbb91e73948bbd97e033d49f0f932
Author: Dave Love <address@hidden>
Date:   Wed May 30 11:09:09 2001 +0000

    Require w3-sysdp.
    (w3-popup-menu): Revert last change.

diff --git a/lisp/w3-menu.el b/lisp/w3-menu.el
index 7803f8c..74e394e 100644
--- a/lisp/w3-menu.el
+++ b/lisp/w3-menu.el
@@ -1,6 +1,6 @@
 ;;; w3-menu.el --- Menu functions for emacs-w3
 ;; Author: Bill Perry <address@hidden>
-;; Version: $Revision: 1.10 $
+;; Version: $Revision: 1.11 $
 ;; Keywords: menu, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -27,6 +27,7 @@
 
 (require 'w3-vars)
 (require 'w3-mouse)
+(require 'w3-sysdp)                    ; for copy-tree
 (eval-when-compile
   (require 'cl)
   (defvar w3-html-bookmarks))
@@ -803,9 +804,7 @@ on that platform."
                     (and parent (widget-get parent :href))))
           (imag (or (and widget (widget-get widget :src))
                     (and parent (widget-get parent :src))))
-          (menu (if (featurep 'xemacs)
-                    (copy-tree w3-popup-menu)
-                  (copy-keymap w3-popup-menu)))
+          (menu (copy-tree w3-popup-menu))
           url val trunc-url)
       (if href
          (progn

commit 0ec4aa4deed5c781e08e0b231c6e4caf51016684
Author: Dave Love <address@hidden>
Date:   Tue May 29 16:09:46 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 2c8e5c5..c462bbe 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,36 @@
+2001-05-29  Dave Love  <address@hidden>
+
+       * lisp/w3-sysdp.el: Remove lots of unused stuff.
+
+       * lisp/w3.el: Require cl only when compiling.  Doc and message
+       fixes.
+
+       * lisp/w3-toolbar.el (w3-toolbar): Bind w3-hotlist-view, not
+       w3-show-hotlist.
+
+       * lisp/w3-menu.el (w3-menu-hotlist-constructor): Require
+       w3-hotlist.
+       (w3-menu-bookmark-menu): Bind w3-hotlist-view, not
+       w3-show-hotlist.
+       (w3-popup-menu): In Emacs, use copy-keymap, not copy-tree.
+
+       * lisp/w3-hotindex.el (w3-hotindex-query): Call w3-hotlist-view,
+       not w3-show-hotlist.
+
+       * lisp/w3-emulate.el (url-vars): Require.
+       (w3-lynx-emulation-minor-mode-map)
+       (w3-netscape-emulation-minor-mode-map): Bind w3-hotlist-view, not
+       w3-show-hotlist.
+
+       * lisp/w3-dired.el (w3-open-local, w3-fetch): Autoload.
+       (add-minor-mode): Remove definition in favour of autoload.
+
+       * lisp/w3-keymap.el (w3-mode-map): Bind w3-hotlist-view, not
+       w3-show-hotlist.
+
+       * lisp/w3-parse.el (w3-parse-buffer): Use
+       w3-resolve-numeric-entity for bogus characters.
+
 2001-05-25  William M. Perry  <address@hidden>
 
        * lisp/w3-speak-table.el: Make sure to load cl-extra at load time

commit 380f334131dfac1e6bdd1ee1b1b13dace79e61a9
Author: Dave Love <address@hidden>
Date:   Tue May 29 16:08:59 2001 +0000

    Remove lots of unused stuff.

diff --git a/lisp/w3-sysdp.el b/lisp/w3-sysdp.el
index de8b099..df0178f 100644
--- a/lisp/w3-sysdp.el
+++ b/lisp/w3-sysdp.el
@@ -140,197 +140,42 @@
            (put (, function) 'sysdep-defined-this t)
            (defalias (, function) (, def))))))
 
-;; bootstrapping: defalias and define-function don't exist
-;; in older versions of lemacs
-
-(sysdep-fset 'defalias 'fset)
-(sysdep-defalias 'define-function 'defalias)
-
-;; useful ways of determining what version is running
-;; emacs-major-version and emacs-minor-version are
-;; already defined in recent versions of FSF Emacs and XEmacs
-
-(sysdep-defconst emacs-major-version
-                ;; will string-match ever fail?  If so, assume 19.0.
-                ;; (should we assume 18.something?)
-                (if (string-match "^[0-9]+" emacs-version)
-                    (string-to-int
-                     (substring emacs-version
-                                (match-beginning 0) (match-end 0)))
-                  19))
-
-(sysdep-defconst emacs-minor-version
-                (if (string-match "^[0-9]+\\.\\([0-9]+\\)" emacs-version)
-                    (string-to-int
-                     (substring emacs-version
-                                (match-beginning 1) (match-end 1)))
-                  0))
-
-(sysdep-defconst sysdep-running-xemacs
-                (or (string-match "Lucid" emacs-version)
-                    (string-match "XEmacs" emacs-version)))
-
-(sysdep-defconst window-system nil)
-(sysdep-defconst window-system-version 0)
-
 (sysdep-defvar list-buffers-directory nil)
-(sysdep-defvar x-library-search-path (`
-                                     ("/usr/X11R6/lib/X11/"
-                                      "/usr/X11R5/lib/X11/"
-                                      "/usr/lib/X11R6/X11/"
-                                      "/usr/lib/X11R5/X11/"
-                                      "/usr/local/X11R6/lib/X11/"
-                                      "/usr/local/X11R5/lib/X11/"
-                                      "/usr/local/lib/X11R6/X11/"
-                                      "/usr/local/lib/X11R5/X11/"
-                                      "/usr/X11/lib/X11/"
-                                      "/usr/lib/X11/"
-                                      "/usr/local/lib/X11/"
-                                      "/usr/X386/lib/X11/"
-                                      "/usr/x386/lib/X11/"
-                                      "/usr/XFree86/lib/X11/"
-                                      "/usr/unsupported/lib/X11/"
-                                      "/usr/athena/lib/X11/"
-                                      "/usr/local/x11r5/lib/X11/"
-                                      "/usr/lpp/Xamples/lib/X11/"
-                                      "/usr/openwin/lib/X11/"
-                                      "/usr/openwin/share/lib/X11/"
-                                      (, data-directory)
-                                      )
-                                     )
+(sysdep-defvar x-library-search-path `("/usr/X11R6/lib/X11/"
+                                     "/usr/X11R5/lib/X11/"
+                                     "/usr/lib/X11R6/X11/"
+                                     "/usr/lib/X11R5/X11/"
+                                     "/usr/local/X11R6/lib/X11/"
+                                     "/usr/local/X11R5/lib/X11/"
+                                     "/usr/local/lib/X11R6/X11/"
+                                     "/usr/local/lib/X11R5/X11/"
+                                     "/usr/X11/lib/X11/"
+                                     "/usr/lib/X11/"
+                                     "/usr/local/lib/X11/"
+                                     "/usr/X386/lib/X11/"
+                                     "/usr/x386/lib/X11/"
+                                     "/usr/XFree86/lib/X11/"
+                                     "/usr/unsupported/lib/X11/"
+                                     "/usr/athena/lib/X11/"
+                                     "/usr/local/x11r5/lib/X11/"
+                                     "/usr/lpp/Xamples/lib/X11/"
+                                     "/usr/openwin/lib/X11/"
+                                     "/usr/openwin/share/lib/X11/"
+                                     ,data-directory)
   "Search path used for X11 libraries.")
 
 ;; frame-related stuff.
 
-(sysdep-defalias 'buffer-dedicated-frame 'buffer-dedicated-screen)
-(sysdep-defalias 'deiconify-frame
-  (cond ((fboundp 'deiconify-screen) 'deiconify-screen)
-       ;; make-frame-visible will be defined as necessary
-       (t 'make-frame-visible)))
-(sysdep-defalias 'delete-frame 'delete-screen)
-(sysdep-defalias 'event-frame 'event-screen)
-(sysdep-defalias 'event-glyph-extent 'event-glyph)
-(sysdep-defalias 'find-file-other-frame 'find-file-other-screen)
-(sysdep-defalias 'find-file-read-only-other-frame
-  'find-file-read-only-other-screen)
-(sysdep-defalias 'frame-height 'screen-height)
-(sysdep-defalias 'frame-iconified-p 'screen-iconified-p)
-(sysdep-defalias 'frame-left-margin-width 'screen-left-margin-width)
-(sysdep-defalias 'frame-list 'screen-list)
-(sysdep-defalias 'frame-live-p
-  (cond ((fboundp 'screen-live-p) 'screen-live-p)
-       ((fboundp 'live-screen-p) 'live-screen-p)
-       ;; #### not sure if this is correct (this is for Epoch)
-       ;; but gnuserv.el uses it this way
-       ((fboundp 'screenp) 'screenp)))
-(sysdep-defalias 'frame-name 'screen-name)
-(sysdep-defalias 'frame-parameters 'screen-parameters)
-(sysdep-defalias 'frame-pixel-height 'screen-pixel-height)
-(sysdep-defalias 'frame-pixel-width 'screen-pixel-width)
-(sysdep-defalias 'frame-right-margin-width 'screen-right-margin-width)
-(sysdep-defalias 'frame-root-window 'screen-root-window)
-(sysdep-defalias 'frame-selected-window 'screen-selected-window)
-(sysdep-defalias 'frame-totally-visible-p 'screen-totally-visible-p)
-(sysdep-defalias 'frame-visible-p 'screen-visible-p)
-(sysdep-defalias 'frame-width 'screen-width)
-(sysdep-defalias 'framep 'screenp)
-(sysdep-defalias 'get-frame-for-buffer 'get-screen-for-buffer)
-(sysdep-defalias 'get-frame-for-buffer-noselect 
'get-screen-for-buffer-noselect)
-(sysdep-defalias 'get-other-frame 'get-other-screen)
-(sysdep-defalias 'iconify-frame 'iconify-screen)
-(sysdep-defalias 'lower-frame 'lower-screen)
-(sysdep-defalias 'mail-other-frame 'mail-other-screen)
-
 (sysdep-defun frame-parameter (frame parameter)
   "Return FRAME's value for parameter PARAMETER.
   If FRAME is omitted, describe the currently selected frame."
   (cdr (assq parameter (frame-parameters frame))))
 
-(sysdep-defalias 'make-frame
-  (cond ((fboundp 'make-screen)
-        (function (lambda (&optional parameters device)
-                    (make-screen parameters))))
-       ((fboundp 'x-create-screen)
-        (function (lambda (&optional parameters device)
-                    (x-create-screen parameters))))))
-
-(sysdep-defalias 'make-frame-invisible 'make-screen-invisible)
-(sysdep-defalias 'make-frame-visible
-  (cond ((fboundp 'make-screen-visible) 'make-screen-visible)
-       ((fboundp 'mapraised-screen) 'mapraised-screen)
-       ((fboundp 'x-remap-window)
-        (lambda (&optional x)
-          (x-remap-window)
-          (accept-process-output)))))
-(sysdep-defalias 'modify-frame-parameters 'modify-screen-parameters)
-(sysdep-defalias 'new-frame 'new-screen)
-(sysdep-defalias 'next-frame 'next-screen)
-(sysdep-defalias 'next-multiframe-window 'next-multiscreen-window)
-(sysdep-defalias 'other-frame 'other-screen)
-(sysdep-defalias 'previous-frame 'previous-screen)
-(sysdep-defalias 'previous-multiframe-window 'previous-multiscreen-window)
-(sysdep-defalias 'raise-frame
-  (cond ((fboundp 'raise-screen) 'raise-screen)
-       ((fboundp 'mapraise-screen) 'mapraise-screen)))
-(sysdep-defalias 'redraw-frame 'redraw-screen)
-(sysdep-defalias 'select-frame 'select-screen)
-(sysdep-defalias 'selected-frame 'selected-screen)
-(sysdep-defalias 'set-buffer-dedicated-frame 'set-buffer-dedicated-screen)
-(sysdep-defalias 'set-frame-height 'set-screen-height)
-(sysdep-defalias 'set-frame-left-margin-width 'set-screen-left-margin-width)
-(sysdep-defalias 'set-frame-position 'set-screen-position)
-(sysdep-defalias 'set-frame-right-margin-width 'set-screen-right-margin-width)
-(sysdep-defalias 'set-frame-size 'set-screen-size)
-(sysdep-defalias 'set-frame-width 'set-screen-width)
-(sysdep-defalias 'show-temp-buffer-in-current-frame 
'show-temp-buffer-in-current-screen)
-(sysdep-defalias 'switch-to-buffer-other-frame 'switch-to-buffer-other-screen)
-(sysdep-defalias 'visible-frame-list 'visible-screen-list)
-(sysdep-defalias 'window-frame 'window-screen)
-(sysdep-defalias 'x-create-frame 'x-create-screen)
-(sysdep-defalias 'x-set-frame-icon-pixmap 'x-set-screen-icon-pixmap)
-(sysdep-defalias 'x-set-frame-pointer 'x-set-screen-pointer)
-(sysdep-defalias 'x-display-color-p 'x-color-display-p)
-(sysdep-defalias 'x-display-grayscale-p 'x-grayscale-display-p)
-(sysdep-defalias 'menu-event-p 'misc-user-event-p)
-
 (sysdep-defun event-point (event)
   (let ((posn (event-end event)))
     (if posn 
        (posn-point posn))))
 
-;; WMP - commenting these out so that Emacs 19 doesn't get screwed by them.
-;; In particular, this makes the 'custom' package blow up quite well.
-;;(sysdep-defun add-submenu (menu-path submenu &optional before)
-;;  "Add a menu to the menubar or one of its submenus.
-;;If the named menu exists already, it is changed.
-;;MENU-PATH identifies the menu under which the new menu should be inserted.
-;; It is a list of strings; for example, (\"File\") names the top-level 
\"File\"
-;; menu.  (\"File\" \"Foo\") names a hypothetical submenu of \"File\".
-;; If MENU-PATH is nil, then the menu will be added to the menubar itself.
-;;SUBMENU is the new menu to add.
-;; See the documentation of `current-menubar' for the syntax.
-;;BEFORE, if provided, is the name of a menu before which this menu should
-;; be added, if this menu is not on its parent already.  If the menu is already
-;; present, it will not be moved."
-;;  (add-menu menu-path (car submenu) (cdr submenu) before))
-
-;;(sysdep-defun add-menu-button (menu-path menu-leaf &optional before)
-;;  "Add a menu item to some menu, creating the menu first if necessary.
-;;If the named item exists already, it is changed.
-;;MENU-PATH identifies the menu under which the new menu item should be 
inserted.
-;; It is a list of strings; for example, (\"File\") names the top-level 
\"File\"
-;; menu.  (\"File\" \"Foo\") names a hypothetical submenu of \"File\".
-;;MENU-LEAF is a menubar leaf node.  See the documentation of 
`current-menubar'.
-;;BEFORE, if provided, is the name of a menu item before which this item should
-;; be added, if this item is not on the menu already.  If the item is already
-;; present, it will not be moved."
-;; (add-menu-item menu-path (aref menu-leaf 0) (aref menu-leaf 1)
-;;             (aref menu-leaf 2) before))
-
-(sysdep-defun make-glyph (&optional spec-list)
-  (if (and spec-list (cdr-safe (assq 'x spec-list)))
-      (make-pixmap (cdr-safe (assq 'x spec-list)))))
-
 (sysdep-defalias 'face-list 'list-faces)
 
 (sysdep-defun set-keymap-parent (keymap new-parent)
@@ -345,7 +190,7 @@
 (sysdep-defun plist-put (plist prop val)
   "Change value in PLIST of PROP to VAL.
 PLIST is a property list, which is a list of the form
-(PROP1 VALUE1 PROP2 VALUE2 ...).  PROP is a symbol and VAL is any object.
+\(PROP1 VALUE1 PROP2 VALUE2 ...).  PROP is a symbol and VAL is any object.
 If PROP is already a property on the list, its value is set to VAL,
 otherwise the new PROP VAL pair is added.  The new plist is returned;
 use `(setq x (plist-put x prop val))' to be sure to use the new value.
@@ -366,78 +211,7 @@ one of the properties on the list."
     (setq plist (cdr (cdr plist))))
   (and plist (car (cdr plist))))
 
-;; Extent stuff
-;; (sysdep-defalias 'delete-extent 'delete-overlay)
-;; (sysdep-defalias 'extent-end-position 'overlay-end)
-;; (sysdep-defalias 'extent-start-position 'overlay-start)
-;; (sysdep-defalias 'set-extent-endpoints 'move-overlay)
-;; (sysdep-defalias 'set-extent-property 'overlay-put)
-;; (sysdep-defalias 'make-extent 'make-overlay)
-
-;; (sysdep-defun extent-property (extent property &optional default)
-;;   (or (overlay-get extent property) default))
-
-;; (sysdep-defun extent-at (pos &optional object property before at-flag)
-;;   (let ((tmp (overlays-at (point)))
-;;     ovls)
-;;     (if property
-;;     (while tmp
-;;       (if (extent-property (car tmp) property)
-;;           (setq ovls (cons (car tmp) ovls)))
-;;       (setq tmp (cdr tmp)))
-;;       (setq ovls tmp
-;;         tmp nil))
-;;     (car-safe
-;;      (sort ovls
-;;        (function
-;;         (lambda (a b)
-;;           (< (- (extent-end-position a) (extent-start-position a))
-;;              (- (extent-end-position b) (extent-start-position b)))))))))
-
-(sysdep-defun overlays-in (beg end)
-  "Return a list of the overlays that overlap the region BEG ... END.
-Overlap means that at least one character is contained within the overlay
-and also contained within the specified region.
-Empty overlays are included in the result if they are located at BEG
-or between BEG and END."
-  (let ((ovls (overlay-lists))
-       tmp retval)
-    (if (< end beg)
-       (setq tmp end
-             end beg
-             beg tmp))
-    (setq ovls (nconc (car ovls) (cdr ovls)))
-    (while ovls
-      (setq tmp (car ovls)
-           ovls (cdr ovls))
-      (if (or (and (<= (overlay-start tmp) end)
-                  (>= (overlay-start tmp) beg))
-             (and (<= (overlay-end tmp) end)
-                  (>= (overlay-end tmp) beg)))
-         (setq retval (cons tmp retval))))
-    retval))
-
-;; (sysdep-defun map-extents (function &optional object from to
-;;                                 maparg flags property value)
-;;   (let ((tmp (overlays-in (or from (point-min))
-;;                       (or to (point-max))))
-;;     ovls)
-;;     (if property
-;;     (while tmp
-;;       (if (extent-property (car tmp) property)
-;;           (setq ovls (cons (car tmp) ovls)))
-;;       (setq tmp (cdr tmp)))
-;;       (setq ovls tmp
-;;         tmp nil))
-;;     (catch 'done
-;;       (while ovls
-;;     (setq tmp (funcall function (car ovls) maparg)
-;;           ovls (cdr ovls))
-;;     (if tmp
-;;         (throw 'done tmp))))))
-
 ;; misc
-(sysdep-defalias 'make-local-hook 'make-local-variable)
 
 (sysdep-defun buffer-substring-no-properties (beg end)
   "Return the text from BEG to END, without text properties, as a string."
@@ -507,37 +281,6 @@ Example:  (add-minor-mode 'view-minor-mode \" View\" 
view-mode-map)"
        )
     (concat "\\`[-?*]" foundry - "\\(" family "\\)" -)))
 
-(sysdep-defun match-string (num &optional string)
-  "Return string of text matched by last search.
-NUM specifies which parenthesized expression in the last regexp.
- Value is nil if NUMth pair didn't match, or there were less than NUM pairs.
-Zero means the entire text matched by the whole regexp or whole string.
-STRING should be given if the last search was by `string-match' on STRING."
-  (if (match-beginning num)
-      (if string
-         (substring string (match-beginning num) (match-end num))
-       (buffer-substring (match-beginning num) (match-end num)))))
-
-(sysdep-defun add-hook (hook-var function &optional at-end)
-  "Add a function to a hook.
-First argument HOOK-VAR (a symbol) is the name of a hook, second
- argument FUNCTION is the function to add.
-Third (optional) argument AT-END means to add the function at the end
- of the hook list instead of the beginning.  If the function is already
- present, this has no effect.
-Returns nil if FUNCTION was already present in HOOK-VAR, else new
- value of HOOK-VAR."
-      (if (not (boundp hook-var)) (set hook-var nil))
-      (let ((old (symbol-value hook-var)))
-       (if (or (not (listp old)) (eq (car old) 'lambda))
-           (setq old (list old)))
-       (if (member function old)
-           nil
-         (set hook-var
-              (if at-end
-                  (append old (list function)) ; don't nconc
-                (cons function old))))))
-
 (sysdep-defalias 'valid-color-name-p
   (cond
    ((fboundp 'x-valid-color-name-p)    ; XEmacs/Lucid
@@ -562,27 +305,6 @@ Returns nil if FUNCTION was already present in HOOK-VAR, 
else new
    (t 'identity)))                     ; All others
 
 ;; Misc.
-;; NT doesn't have make-symbolic-link
-(sysdep-defalias 'make-symbolic-link 'copy-file)
-(sysdep-defalias 'insert-and-inherit 'insert)
-
-(sysdep-defun run-hook-with-args-until-success (hook &rest args)
-  "Run HOOK with the specified arguments ARGS.
-HOOK should be a symbol, a hook variable.  Its value should
-be a list of functions.  We call those functions, one by one,
-passing arguments ARGS to each of them, until one of them
-returns a non-nil value.  Then we return that value.
-If all the functions return nil, we return nil."
-  (let ((rval nil)
-       (todo (and (boundp hook) (symbol-value hook)))
-       (global (and (boundp hook) (default-value hook)))
-       (cur nil))
-    (while (and (setq cur (car todo)) (not rval))
-      (setq todo (cdr todo))
-      (if (eq cur t)
-         (if global
-             (setq todo (append global todo)))
-       (setq rval (apply cur args))))))
 
 (sysdep-defun split-string (string pattern)
   "Return a list of substrings of STRING which are separated by PATTERN."
@@ -593,18 +315,6 @@ If all the functions return nil, we return nil."
     (nreverse (cons (substring string start) parts))
     ))
 
-(sysdep-defun member (elt list)
-  (while (and list (not (equal elt (car list))))
-    (setq list (cdr list)))
-  list)
-
-(sysdep-defun rassoc (key list)
-  (let ((found nil))
-    (while (and list (not found))
-      (if (equal (cdr (car list)) key) (setq found (car list)))
-      (setq list (cdr list)))
-    found))
-
 (sysdep-defun display-error (error-object stream)
   "Display `error-object' on `stream' in a user-friendly way."
   (funcall (or (let ((type (car-safe error-object)))
@@ -654,41 +364,27 @@ If all the functions return nil, we return nil."
                  (prin1 error-object stream))))
           error-object stream))
 
-(sysdep-defun decode-time (&optional specified-time)
-  (let* ((date (current-time-string specified-time))
-        (dateinfo (and date (timezone-parse-date date)))
-        (timeinfo (and dateinfo (timezone-parse-time (aref dateinfo 3)))))
-    (list (aref timeinfo 2) (aref timeinfo 1)
-         (aref timeinfo 0) (aref dateinfo 2)
-         (aref dateinfo 1) (aref dateinfo 0)
-         "unknown" nil 0)))
-
 (sysdep-defun find-face (face)
   (car-safe (memq face (face-list))))
 
-(sysdep-defun set-marker-insertion-type (marker type)
-  "Set the insertion-type of MARKER to TYPE.
-If TYPE is t, it means the marker advances when you insert text at it.
-If TYPE is nil, it means the marker stays behind when you insert text at it."
-  nil)
-
-;; window functions
-
-;; not defined in v18
-(sysdep-defun eval-buffer (bufname &optional printflag)
-  (interactive)
-  (save-excursion
-    (set-buffer bufname)
-    (eval-current-buffer)))
-
-(sysdep-defun window-minibuffer-p (window)
-  "Returns non-nil if WINDOW is a minibuffer window."
-  (eq window (minibuffer-window)))
 
-(sysdep-defun window-live-p (window)
-  "Returns t if OBJ is a window which is currently visible."
-  (and (windowp window)
-       (window-point window)))
+(sysdep-defun copy-tree (tree &optional vecp)
+  "Make a copy of TREE.
+If TREE is a cons cell, this recursively copies both its car and its cdr.
+Contrast to copy-sequence, which copies only along the cdrs.  With second
+argument VECP, this copies vectors as well as conses."
+  (if (consp tree)
+      (let ((p (setq tree (copy-list tree))))
+       (while (consp p)
+         (if (or (consp (car p)) (and vecp (vectorp (car p))))
+             (setcar p (cl-copy-tree (car p) vecp)))
+         (or (listp (cdr p)) (setcdr p (cl-copy-tree (cdr p) vecp)))
+         (cl-pop p)))
+    (if (and vecp (vectorp tree))
+       (let ((i (length (setq tree (copy-sequence tree)))))
+         (while (>= (setq i (1- i)) 0)
+           (aset tree i (cl-copy-tree (aref tree i) vecp))))))
+  tree)
 
 (provide 'w3-sysdp)
 ;;; sysdep.el ends here

commit 565a57c4dcf2ec7789fa5cae8ce9866e90fb7846
Author: Dave Love <address@hidden>
Date:   Tue May 29 16:07:02 2001 +0000

    Require cl only when compiling.  Doc and message
    fixes.

diff --git a/lisp/w3.el b/lisp/w3.el
index 29feac9..5c0ac31 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: fx $
-;; Created: $Date: 2001/05/16 19:11:12 $
-;; Version: $Revision: 1.18 $
+;; Created: $Date: 2001/05/29 16:07:02 $
+;; Version: $Revision: 1.19 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -35,7 +35,6 @@
 
 (require 'w3-sysdp)
 (require 'w3-cfg)
-(require 'widget)
 
 (or (featurep 'efs)
     (featurep 'efs-auto)
@@ -43,7 +42,7 @@
        (require 'ange-ftp)
       (error nil)))
 
-(require 'cl)
+(eval-when-compile (require 'cl))
 (require 'css)
 (require 'url-vars)
 (require 'url-parse)
@@ -87,7 +86,7 @@ See the variable `w3-notify' for the different notification 
behaviors."
 ;;;###autoload
 (defun w3-open-local (fname)
   "Find a local file, and interpret it as a hypertext document.
-It will prompt for an existing file or directory, and retrieve it as a
+Prompt for an existing file or directory, and retrieve it as a
 hypertext document."
   (interactive "FLocal file: ")
   (setq fname (expand-file-name fname))
@@ -97,7 +96,7 @@ hypertext document."
 ;;;###autoload
 (defun w3-find-file (fname)
   "Find a local file, and interpret it as a hypertext document.
-It will prompt for an existing file or directory, and retrieve it as a
+Prompt for an existing file or directory, and retrieve it as a
 hypertext document."
   (interactive "FLocal file: ")
   (w3-open-local fname))
@@ -192,11 +191,13 @@ Return the coding system used for the decoding."
            ;; we can promote them into the headers before
            ;; mm-dissect-buffer looks for them.
            (goto-char end-of-headers)
-           (while (re-search-forward "<meta[ \t\r\n]+http-equiv" end-of-head t)
+           (while (re-search-forward "<meta[ \t\r\n]+http-equiv"
+                                     end-of-head t)
              (forward-char 5)
              (skip-chars-forward " \t\r\n")
-             ;; We should now be directly in front of the first attribute name.
-             ;; Need to parse the tag attributes and push them up.
+             ;; We should now be directly in front of the first
+             ;; attribute name.  Need to parse the tag attributes and
+             ;; push them up.
              (message "address@hidden - Need to promote a header.")
              (forward-char 1)))))))
 
@@ -255,7 +256,8 @@ With prefix argument, use the URL of the hyperlink under 
point instead."
   (if (stringp target)
       (setq target (intern (downcase target))))
   (and target
-       (let ((window-distance (cdr-safe (assq target 
w3-target-window-distances))))
+       (let ((window-distance (cdr-safe (assq target
+                                             w3-target-window-distances))))
         (if (numberp window-distance)
             (other-window window-distance)
           (case target
@@ -325,7 +327,7 @@ the cdr is the 'next' node."
          next)))
 
 (defun w3-history-forward ()
-  "Go forward in the history from this page"
+  "Go forward in the history from this page."
   (interactive)
   (let ((next (cadr (w3-history-find-url-internal (url-view-url t))))
        (w3-reuse-buffers 'yes))
@@ -333,7 +335,7 @@ the cdr is the 'next' node."
        (w3-fetch next))))
 
 (defun w3-history-backward ()
-  "Go backward in the history from this page"
+  "Go backward in the history from this page."
   (interactive)
   (let ((last (caar (w3-history-find-url-internal (url-view-url t))))
        (w3-reuse-buffers 'yes))
@@ -378,7 +380,7 @@ the cdr is the 'next' node."
 
 ;; FIXME!!! This is broken with the new URL package.
 (defun w3-document-information (&optional buff)
-  "Display information on the document in buffer BUFF"
+  "Display information on the document in buffer BUFF."
   (interactive)
   (if (interactive-p)
       (let ((w3-notify 'friendly))
@@ -394,7 +396,8 @@ the cdr is the 'next' node."
             (case-fold-search t)
             (possible-lastmod (save-excursion
                                 (goto-char (point-min))
-                                (if (re-search-forward "^Last 
modified:\\(.*\\)" nil t)
+                                (if (re-search-forward
+                                     "^Last modified:\\(.*\\)" nil t)
                                     (buffer-substring (match-beginning 1)
                                                       (match-end 1)))))
             (attributes (url-file-attributes url))
@@ -460,8 +463,11 @@ the cdr is the 'next' node."
                                                             (length (car x))))
                                                 info)
                                         '>)))
-                  (fmtstring (format "   <tr><td>%%%ds:</td><td>%%s</td></tr>" 
maxlength)))
-             (insert "   <tr><th colspan=2>Miscellaneous 
Variables</th></tr>\n")
+                  (fmtstring (format
+                              "   <tr><td>%%%ds:</td><td>%%s</td></tr>"
+                              maxlength)))
+             (insert
+              "   <tr><th colspan=2>Miscellaneous Variables</th></tr>\n")
              (while info
                (if (and (caar info) (cdar info))
                    (insert (format fmtstring
@@ -478,8 +484,8 @@ the cdr is the 'next' node."
                "</html>\n")))))
 
 (defun w3-insert-formatted-url (p)
-  "Insert a formatted url into a buffer.  With prefix arg, insert the url
-under point."
+  "Insert a formatted url into a buffer.
+With prefix arg, insert the url under point."
   (interactive "P")
   (let (buff str)
     (cond
@@ -502,7 +508,7 @@ under point."
       (message "Cancelled."))))
 
 (defun w3-first-n-items (l n)
-  "Return the first N items from list L"
+  "Return the first N items from list L."
   (let ((x 0)
        y)
     (if (> n (length l))
@@ -547,7 +553,7 @@ If there is no link under point, this will try using
 (defun w3-maybe-follow-link ()
   "Maybe follow a hypertext link under point.
 If there is no link under point, this will try using
-url-get-url-at-point"
+`url-get-url-at-point'"
   (interactive)
   (require 'w3)
   (w3-do-setup)
@@ -561,32 +567,31 @@ url-get-url-at-point"
 
 ;;;###autoload
 (defun w3-follow-url-at-point-other-frame (&optional pt)
-  "Follow the URL under PT, defaults to link under (point)"
+  "Follow the URL under PT, defaults to link under (point)."
   (interactive "d")
   (let ((url (url-get-url-at-point pt)))
     (and url (w3-fetch-other-frame url))))
 
 ;;;###autoload
 (defun w3-follow-url-at-point (&optional pt)
-  "Follow the URL under PT, defaults to link under (point)"
+  "Follow the URL under PT, defaults to link under (point)."
   (interactive "d")
   (let ((url (url-get-url-at-point pt)))
     (and url (w3-fetch url))))
 
-(defun w3-fix-spaces (x)
-  "Remove spaces/tabs at the beginning of a string,
-and convert newlines into spaces."
+(defun w3-fix-spaces (string)
+  "Remove spaces/tabs at beginning of STRING and convert newlines to spaces."
   ;(url-convert-newlines-to-spaces
    (url-strip-leading-spaces
-    (url-eat-trailing-space x)));)
+    (url-eat-trailing-space string)));)
 
 (defun w3-source-document-at-point ()
-  "View source to the document pointed at by link under point"
+  "View source to the document pointed at by link under point."
   (interactive)
   (w3-source-document t))
 
 (defun w3-source-document (under)
-  "View this document's source"
+  "View this document's source."
   (interactive "P")
   (let* ((url (if under (w3-view-this-url) (url-view-url t))))
     (set-buffer (generate-new-buffer (concat "Source of: " url)))
@@ -612,7 +617,7 @@ and convert newlines into spaces."
   (w3-mail-current-document t))
 
 (defun w3-mail-current-document (under &optional format)
-  "Mail the current-document to someone"
+  "Mail the current-document to someone."
   (interactive "P")
   (let* ((completion-ignore-case t)
         (format (or format
@@ -637,12 +642,14 @@ and convert newlines into spaces."
          (save-excursion
            (cond
             ((and (equal "HTML Source" format) under)
-             (setq content-type (concat "text/html; charset=" content-charset))
+             (setq content-type (concat "text/html; charset="
+                                        content-charset))
              (let ((url-source t))
                ;; Fixme: this needs a callback -- which?
                (url-retrieve url)))
             ((equal "HTML Source" format)
-             (setq content-type (concat "text/html; charset=" content-charset))
+             (setq content-type (concat "text/html; charset="
+                                        content-charset))
              (if w3-current-source
                  (let ((x w3-current-source))
                    (set-buffer (get-buffer-create url-working-buffer))
@@ -668,10 +675,12 @@ and convert newlines into spaces."
                (ps-spool-buffer-with-faces)
                (set-buffer ps-spool-buffer-name)))
             ((and under (equal "Formatted Text" format))
-             (setq content-type (concat "text/plain; charset=" 
content-charset))
+             (setq content-type (concat "text/plain; charset="
+                                        content-charset))
              (w3-fetch url))
             ((equal "Formatted Text" format)
-             (setq content-type (concat "text/plain; charset=" 
content-charset))))
+             (setq content-type (concat "text/plain; charset="
+                                        content-charset))))
            (buffer-string))))
     (funcall url-mail-command)
     (mail-subject)
@@ -735,7 +744,7 @@ and convert newlines into spaces."
     (w3-fetch (url-expand-file-name url))))
 
 (defun w3-maybe-eval ()
-  ;; Maybe evaluate a buffer of emacs lisp code
+  "Maybe evaluate a buffer of Emacs Lisp code."
   (if (funcall url-confirmation-func "This is emacs-lisp code, evaluate it?")
       (eval-buffer (current-buffer))
     (emacs-lisp-mode)))
@@ -744,12 +753,12 @@ and convert newlines into spaces."
   "Select one of the <LINK> tags from this document and fetch it."
   (interactive)
   (and (not w3-current-links)
-       (error "No links defined for this document."))
+       (error "No links defined for this document"))
   (w3-fetch "about:document"))
 
 (defun w3-find-this-file ()
-  "Do a find-file on the currently viewed html document if it is a file: or
-ftp: reference"
+  "Do a `find-file' on the currently viewed html document.
+Do this if it is a file: or ftp: reference"
   (interactive)
   (or url-current-object
       (error "Not a URL-based buffer"))
@@ -767,8 +776,8 @@ ftp: reference"
      (t (message "Sorry, I can't get that file so you can alter it.")))))
 
 (defun w3-insert-this-url (pref-arg)
-  "Insert the current url in another buffer, with prefix ARG,
-insert URL under point"
+  "Insert the current url in another buffer.
+With prefix ARG, insert URL under point"
   (interactive "P")
   (let ((thebuf (get-buffer (read-buffer "Insert into buffer: ")))
        (oldbuf (current-buffer))
@@ -781,7 +790,7 @@ insert URL under point"
       (message "Not on a link!"))))
 
 (defun w3-in-assoc (elt list)
-  "Check to see if ELT matches any of the regexps in the car elements of LIST"
+  "Check to see if ELT matches any of the regexps in the car elements of LIST."
   (let (rslt)
     (while (and list (not rslt))
       (and (car (car list))
@@ -793,7 +802,7 @@ insert URL under point"
     rslt))
 
 (defun w3-goto-last-buffer ()
-  "Go to last WWW buffer visited"
+  "Go to last WWW buffer visited."
   (interactive)
   (if w3-current-last-buffer
       (if w3-frame-name
@@ -816,7 +825,7 @@ ftp.w3.org:/pub/www/doc."
   (w3-fetch (concat "www://preview/" (buffer-name))))
 
 (defun w3-source ()
-  "Show the source of a file"
+  "Show the source of a file."
   (let ((tmp (buffer-name (generate-new-buffer "Document Source"))))
     (set-buffer url-working-buffer)
     (kill-buffer tmp)
@@ -834,8 +843,9 @@ ftp.w3.org:/pub/www/doc."
 
 (defvar w3-compression-encodings
   '("x-gzip" "gzip" "x-compress" "compress")
-  "List of MIME encodings that denote compression")
+  "List of MIME encodings that denote compression.")
 
+;; This looks bogus  -- fx
 (defvar w3-no-conversion-encodings
   w3-compression-encodings
   "List of MIME encodings that require Mule not to convert
@@ -860,12 +870,12 @@ invokes some commands which read a coding system from the 
user.")
       (setq invalid-char-alist (cdr invalid-char-alist)))))
 
 (defun w3-show-history-list ()
-  "Format the url-history-list prettily and show it to the user"
+  "Format the url-history-list prettily and show it to the user."
   (interactive)
   (w3-fetch "www://auto/history"))
 
 (defun w3-save-as (&optional type)
-  "Save a document to the local disk"
+  "Save a document to the local disk."
   (interactive)
   (save-excursion
     (let* ((completion-ignore-case t)
@@ -921,7 +931,7 @@ invokes some commands which read a coding system from the 
user.")
             (w3-log-bad-html type desc)))))
 
 (defun w3-log-bad-html (type desc)
-  ;; Log bad HTML to the buffer specified by w3-debug-buffer
+  "Log bad HTML to the buffer specified by w3-debug-buffer."
   (if w3-debug-html
       (save-excursion
        (set-buffer (get-buffer-create w3-debug-buffer))
@@ -955,12 +965,12 @@ invokes some commands which read a coding system from the 
user.")
 ;;; Functions to handle formatting an html buffer
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (defun w3-add-delayed-graphic (widget)
-  ;; Add a delayed image for the current buffer.
+  "Add a delayed image for the current buffer."
   (setq w3-delayed-images (cons widget w3-delayed-images)))
 
 
 (defun w3-load-flavors ()
-  ;; Load the correct emacsen specific stuff
+  "Load the correct emacsen specific stuff."
   (cond
    (w3-running-xemacs (require 'w3-xemac))
    (t                                  ; Assume we are the FSF variant
@@ -978,7 +988,7 @@ invokes some commands which read a coding system from the 
user.")
 ;;; Automatic bug submission.                                               ;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (defun w3-submit-bug ()
-  "Submit a bug on Emacs-w3"
+  "Submit a bug on Emacs-w3."
   (interactive)
   (require 'reporter)
   (and (yes-or-no-p "Do you really want to submit a bug on Emacs-w3? ")
@@ -1067,11 +1077,11 @@ invokes some commands which read a coding system from 
the user.")
   "Show the version number of W3 in the minibuffer.
 If optional argument HERE is non-nil, insert info at point."
   (interactive "P")
-  (let ((version-string 
-         (format "WWW %s, URL %s" 
-                 w3-version-number 
+  (let ((version-string
+         (format "WWW %s, URL %s"
+                 w3-version-number
                  url-version)))
-    (if here 
+    (if here
         (insert version-string)
       (if (interactive-p)
           (message "%s" version-string)
@@ -1083,7 +1093,7 @@ If optional argument HERE is non-nil, insert info at 
point."
 The World Wide Web is a global hypertext system started by CERN in
 Switzerland in 1991.
 
-The home page is specified by the variable w3-default-homepage.  The
+The home page is specified by the variable `w3-default-homepage'.  The
 document should be specified by its fully specified Uniform Resource
 Locator.  The document will be parsed as HTML (if appropriate) and
 displayed in a new buffer."
@@ -1110,8 +1120,8 @@ displayed in a new buffer."
 ;;; Stuff for good local file handling
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (defun w3-ff (file)
-  "Find a file in any window already displaying it, otherwise just as
-display-buffer, and using this function"
+  "Find a file in any window already displaying it.
+Otherwise just as `display-buffer', and using this function."
   (if (not (eq 'tty (device-type)))
       (let ((f (window-frame (display-buffer (find-file-noselect file)))))
        (set-mouse-position f 1 0)
@@ -1157,8 +1167,8 @@ display-buffer, and using this function"
       (message "Link #%s not found." link))))
 
 (defun w3-force-reload-document ()
-  "Reload the current document.  Take it from the network, even if
-cached and in local mode."
+  "Reload the current document.
+Take it from the network, even if cached and in local mode."
   (let ((url-standalone-mode nil))
     (w3-reload-document)))
 
@@ -1183,22 +1193,24 @@ With prefix argument, it reads a coding system to 
decode the document."
     (set-window-start (selected-window) (min window-start (point-max)))))
 
 (defun w3-recall-explicit-coding-system (url)
-  "Find user-specified explicit coding system for this URL
-in w3-explicit-conversion-tree"
+  "Find user-specified explicit coding system for this URL.
+Look for it in `w3-explicit-conversion-tree'"
   (let* ((urlobj (if (stringp url)
                     (url-generic-parse-url url)
                   url))
         (hostname (or (url-host urlobj) "localhost"))
         (fname-list (split-string (url-filename urlobj) "\\/")))
     ;; now recurse
-    (w3-find-explicit-coding-system (cons hostname fname-list) 
w3-explicit-conversion-tree)))
+    (w3-find-explicit-coding-system (cons hostname fname-list)
+                                   w3-explicit-conversion-tree)))
 
 (defun w3-find-explicit-coding-system (fname-list tree)
-  "Recall a user-specified explicit coding system"
+  "Recall a user-specified explicit coding system."
   (let ((branch (assoc (car fname-list) tree)))
     (and branch
         (or (and (cdr fname-list) (cddr branch)
-                 (w3-find-explicit-coding-system (cdr fname-list) (cddr 
branch)))
+                 (w3-find-explicit-coding-system (cdr fname-list)
+                                                 (cddr branch)))
             (cadr branch)))))
 
 (defun w3-record-explicit-coding-system (url coding-system)
@@ -1219,7 +1231,7 @@ as high as possible in w3-explicit-conversion-tree"
     (setq w3-explicit-encodings-changed-since-last-save t)))
 
 (defun w3-add-explicit-coding-system (fname-list coding-system tree)
-  "Memorize a user-specified explicit coding system"
+  "Memorize a user-specified explicit coding system."
   (if (and (cadr tree) (not (equal (cadr tree) coding-system)))
       (setcar (cdr tree) nil))
   (let ((branch (assoc (car fname-list) (cddr tree))))
@@ -1229,7 +1241,8 @@ as high as possible in w3-explicit-conversion-tree"
                  (or (equal (cadr branch) coding-system)
                      (null (cadr branch))
                      (setcar (cdr branch) nil))
-                 (w3-add-explicit-coding-system (cdr fname-list) coding-system 
branch))
+                 (w3-add-explicit-coding-system (cdr fname-list)
+                                                coding-system branch))
                 (t
                  (setcar (cdr branch) coding-system))))
          (t
@@ -1237,7 +1250,8 @@ as high as possible in w3-explicit-conversion-tree"
           (setcdr tree
                   (if fname-list
                       (let ((subbranch (list (car fname-list))))
-                        (w3-add-explicit-coding-system (cdr fname-list) 
coding-system subbranch)
+                        (w3-add-explicit-coding-system
+                         (cdr fname-list) coding-system subbranch)
                         (cons (if (or (null (cddr tree))
                                       (equal coding-system (cadr tree)))
                                   coding-system)
@@ -1280,7 +1294,7 @@ as high as possible in w3-explicit-conversion-tree"
            (w3-notify-when-ready x))))))
 
 (defun w3-quit (&optional mega)
-  "Quit WWW mode"
+  "Quit WWW mode."
   (interactive "P")
   (if mega
       (mapcar
@@ -1328,7 +1342,7 @@ as high as possible in w3-explicit-conversion-tree"
        (w3-leave-buffer)))))
 
 (defun w3-view-this-url (&optional no-show)
-  "View the URL of the link under point"
+  "View the URL of the link under point."
   (interactive)
   (let* ((widget (widget-at (point)))
         (parent (and widget (widget-get widget :parent)))
@@ -1357,12 +1371,12 @@ as high as possible in w3-explicit-conversion-tree"
       (setq todo (cdr todo)))))
 
 (defun w3-save-this-url ()
-  "Save url under point in the kill ring"
+  "Save url under point in the kill ring."
   (interactive)
   (w3-save-url t))
 
 (defun w3-save-url (under-pt)
-  "Save current url in the kill ring"
+  "Save current url in the kill ring."
   (interactive "P")
   (let ((x (cond
            ((stringp under-pt) under-pt)
@@ -1375,7 +1389,7 @@ as high as possible in w3-explicit-conversion-tree"
          (message "Stored URL in kill-ring.")
          (if (fboundp 'w3-store-in-clipboard)
              (w3-store-in-clipboard x)))
-      (error "No URL to store."))))
+      (error "No URL to store"))))
 
 (fset 'w3-end-of-document 'end-of-buffer)
 (fset 'w3-start-of-document 'beginning-of-buffer)
@@ -1438,9 +1452,9 @@ No arg means whole window full.  Arg is number of lines 
to scroll."
       (message "Could not automatically determine authors address, sorry."))))
 
 (defun w3-kill-emacs-func ()
-  "Routine called when exiting emacs.  Do miscellaneous clean up."
+  "Routine called when exiting Emacs.  Do miscellaneous clean up."
   (url-history-save-history)
-  (message "Cleaning up w3 storage...")
+  (message "Cleaning up w3 temporary files...")
   ;; FIXME!  This needs to be in the URL library now I guess?
   '(let ((x (nconc
            (and (file-exists-p w3-temporary-directory)
@@ -1457,7 +1471,7 @@ No arg means whole window full.  Arg is number of lines 
to scroll."
          (delete-file (car x))
        (error nil))
       (setq x (cdr x))))
-  (message "Cleaning up w3 storage... done."))
+  (message "Cleaning up w3 temporary files... done."))
 
 (eval-and-compile
   (cond
@@ -1588,14 +1602,14 @@ BUFFER, the end of BUFFER, nil, and (current-buffer), 
respectively."
 
 ;;;###autoload
 (defun w3-do-setup ()
-  "Do setup - this is to avoid conflict with user settings when W3 is
-dumped with emacs."
-  (if w3-setup-done
-      nil
+  "Do setup.
+This is to avoid conflict with user settings when W3 is dumped with
+Emacs."
+  (unless w3-setup-done
     (url-do-setup)
     (w3-load-flavors)
     (w3-setup-version-specifics)
-    (setq w3-default-configuration-file (expand-file-name 
+    (setq w3-default-configuration-file (expand-file-name
                                         (or w3-default-configuration-file
                                             "profile")
                                         w3-configuration-directory))
@@ -1657,20 +1671,20 @@ dumped with emacs."
       (setq w3-hotlist-file (or w3-hotlist-file
                                (expand-file-name "~/mosaic.hotlist-default"))
            ))
-     (t 
+     (t
       (setq w3-hotlist-file (or w3-hotlist-file
                                (expand-file-name "~/.mosaic-hotlist-default"))
            )))
   
-                                       ; Set up a hook that will save the 
history list when
-                                       ; exiting emacs
+    ;; Set up a hook that will save the history list when exiting
+    ;; emacs
     (add-hook 'kill-emacs-hook 'w3-kill-emacs-func)
 
-                                       ; Load in the hotlist if they haven't 
set it already
+    ;; Load in the hotlist if they haven't set it already
     (or w3-hotlist (w3-parse-hotlist))
 
-                                       ; Set the default home page, honoring 
their defaults, then
-                                       ; the standard WWW_HOME, then default 
to the documentation @ IU
+    ;; Set the default home page, honoring their defaults, then the
+    ;; standard WWW_HOME, then default to the documentation @ IU
     (or w3-default-homepage
        (setq w3-default-homepage
              (or (getenv "WWW_HOME")
@@ -1679,7 +1693,7 @@ dumped with emacs."
     (run-hooks 'w3-load-hook)))
 
 (defun w3-mark-link-as-followed (ext dat)
-  ;; Mark a link as followed
+  "Mark a link as followed."
   (message "Reimplement w3-mark-link-as-followed"))
 
 (defun w3-only-links ()
@@ -1711,7 +1725,7 @@ dumped with emacs."
   (let ((x (if under-pt (w3-view-this-url t) (url-view-url t))))
     (if x
        (w3-download-url x)
-      (error "No link found."))))
+      (error "No link found"))))
             
 (defun w3-download-url (url &optional file-name)
   (interactive (list (w3-read-url-with-default)))
@@ -1790,6 +1804,7 @@ to disk."
         (w3-fetch href)
       (error "No PREVIOUS document"))))
 
+;; Why are these defined?
 (defun w3-widget-forward (arg)
   "Move point to the next field or button.
 With optional ARG, move across that many fields."
@@ -1803,7 +1818,7 @@ With optional ARG, move across that many fields."
   (w3-widget-forward (- arg)))
 
 (defun w3-complete-link ()
-  "Choose a link from the current buffer and follow it"
+  "Choose a link from the current buffer and follow it."
   (interactive)
   (let (links-alist
        link-at-point
@@ -1831,7 +1846,7 @@ With optional ARG, move across that many fields."
                                               (widget-get widget :to)))
                                             (widget-get widget :href))
                                            links-alist))))))
-    (if (not links-alist) (error "No links in current document."))
+    (if (not links-alist) (error "No links in current document"))
     (setq links-alist (sort links-alist (function
                                         (lambda (x y)
                                           (string< (car x) (car y))))))
@@ -1881,21 +1896,22 @@ With optional ARG, move across that many fields."
        (goto-char (point-min))
        (insert "\n" (car todo))
        (setq todo (cdr todo)))
-      (if url
-         (progn
-           (goto-char (point-min))
-           (insert (format "HTML Errors for: <URL:%s>\n" url))))
-      (set (make-local-variable 'font-lock-keywords) 
w3-html-errors-font-lock-keywords)
+      (when url
+       (goto-char (point-min))
+       (insert (format "HTML Errors for: <URL:%s>\n" url)))
+      (set (make-local-variable 'font-lock-keywords)
+          w3-html-errors-font-lock-keywords)
       (set (make-local-variable 'font-lock-keywords-only) nil)
       (set (make-local-variable 'font-lock-keywords-case-fold-search) nil)
       (set (make-local-variable 'font-lock-syntax-table) nil)
-      (set (make-local-variable 'font-lock-beginning-of-syntax-function) 
'beginning-of-line)
+      (set (make-local-variable 'font-lock-beginning-of-syntax-function)
+          'beginning-of-line)
       (run-hooks 'w3-display-errors-hook))
     (w3-notify-when-ready buffer)))
 
 (defun w3-mode ()
-  "Mode for viewing HTML documents.  If called interactively, will
-display the current buffer as HTML.
+  "Mode for viewing HTML documents.
+If called interactively, will display the current buffer as HTML.
 
 Current keymap is:
 \\{w3-mode-map}"
@@ -1903,15 +1919,15 @@ Current keymap is:
   (w3-do-setup)
   (if (interactive-p)
       (w3-preview-this-buffer)
-    (let ((tmp (mapcar (function (lambda (x) (cons x (and (boundp x) 
(symbol-value x)))))
+    (let ((tmp (mapcar (lambda (x) (cons x (and (boundp x) (symbol-value x))))
                       w3-persistent-variables)))
       ;; Oh gross, this kills buffer-local faces in XEmacs
       (unless (featurep 'xemacs)
        (kill-all-local-variables))
       (use-local-map w3-mode-map)
       (setq mode-name "WWW")
-      (mapcar (function (lambda (x) (if (boundp (car x))
-                                       (set-variable (car x) (cdr x))))) tmp)
+      (mapcar (lambda (x) (if (boundp (car x))
+                             (set-variable (car x) (cdr x)))) tmp)
       (setq major-mode 'w3-mode)
       (w3-mode-version-specifics)
       (w3-menu-install-menus)
@@ -1930,3 +1946,5 @@ Current keymap is:
 (require 'w3-menu)
 (require 'w3-mouse)
 (provide 'w3)
+
+;;; w3.el ends here

commit c657f02601b18ad269f165d79ffa70d1346742a9
Author: Dave Love <address@hidden>
Date:   Tue May 29 15:57:46 2001 +0000

    (w3-toolbar): Bind w3-hotlist-view, not
    w3-show-hotlist.

diff --git a/lisp/w3-toolbar.el b/lisp/w3-toolbar.el
index 1e0ce01..50c3718 100644
--- a/lisp/w3-toolbar.el
+++ b/lisp/w3-toolbar.el
@@ -1,7 +1,7 @@
 ;;; w3-toolbar.el --- Toolbar functions for emacs-w3
 ;; Author: $Author: fx $
-;; Created: $Date: 2001/01/04 12:50:00 $
-;; Version: $Revision: 1.4 $
+;; Created: $Date: 2001/05/29 15:57:46 $
+;; Version: $Revision: 1.5 $
 ;; Keywords: mouse, toolbar
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -84,7 +84,7 @@ not `none'.")
     [w3-toolbar-home-icon w3 t "Go home"]
     [:style 2d :size 5]
     [w3-toolbar-reld-icon w3-reload-document t "Reload document"]
-    [w3-toolbar-hotl-icon w3-show-hotlist t "View hotlist"]
+    [w3-toolbar-hotl-icon w3-hotlist-view t "View hotlist"]
     [w3-toolbar-imag-icon w3-load-delayed-images w3-delayed-images
                          "Load images"]
     [toolbar-file-icon w3-fetch t "Fetch a URL"]

commit 3d4bdd01ef278df961106b3bb0965454a452133c
Author: Dave Love <address@hidden>
Date:   Tue May 29 15:55:13 2001 +0000

    (w3-menu-hotlist-constructor): Require
    w3-hotlist.
    (w3-menu-bookmark-menu): Bind w3-hotlist-view, not
    w3-show-hotlist.
    (w3-popup-menu): In Emacs, use copy-keymap, not copy-tree.

diff --git a/lisp/w3-menu.el b/lisp/w3-menu.el
index 478e153..7803f8c 100644
--- a/lisp/w3-menu.el
+++ b/lisp/w3-menu.el
@@ -1,6 +1,6 @@
 ;;; w3-menu.el --- Menu functions for emacs-w3
 ;; Author: Bill Perry <address@hidden>
-;; Version: $Revision: 1.9 $
+;; Version: $Revision: 1.10 $
 ;; Keywords: menu, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -27,8 +27,10 @@
 
 (require 'w3-vars)
 (require 'w3-mouse)
-(require 'widget)
-(eval-when-compile (require 'cl))
+(eval-when-compile
+  (require 'cl)
+  (defvar w3-html-bookmarks))
+(autoload 'url-truncate-url-for-viewing "url-util")
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; InfoDock stuff
@@ -125,6 +127,7 @@ on that platform."
     (list "Ignored" (vector item nil nil))))
       
 (defun w3-menu-hotlist-constructor (menu-items)
+  (require 'w3-hotlist)
   (easy-menu-define
    w3-menu-hotlist-menu nil "Emacs/W3 Dynamic menu"
    (or (cdr w3-html-bookmarks)
@@ -359,7 +362,7 @@ on that platform."
 (defconst w3-menu-bookmark-menu
   (list
    "Bookmark"
-   ["View Bookmarks..." w3-show-hotlist w3-hotlist]
+   ["View Bookmarks..." w3-hotlist-view w3-hotlist]
    ["Add Bookmark" w3-hotlist-add-document t]
    ["Delete Bookmark" w3-hotlist-delete t]
    ["Rename Bookmark" w3-hotlist-rename-entry t]
@@ -800,8 +803,9 @@ on that platform."
                     (and parent (widget-get parent :href))))
           (imag (or (and widget (widget-get widget :src))
                     (and parent (widget-get parent :src))))
-          ;; Fixme: runtime dependency on cl through copy-tree.
-          (menu (copy-tree w3-popup-menu))
+          (menu (if (featurep 'xemacs)
+                    (copy-tree w3-popup-menu)
+                  (copy-keymap w3-popup-menu)))
           url val trunc-url)
       (if href
          (progn

commit 70cb03248509b88a3b88cb0b8b5a38c84d6a6b83
Author: Dave Love <address@hidden>
Date:   Tue May 29 15:53:37 2001 +0000

    (w3-hotindex-query): Call w3-hotlist-view,
    not w3-show-hotlist.

diff --git a/lisp/w3-hotindex.el b/lisp/w3-hotindex.el
index 2ae4e98..1cb683f 100644
--- a/lisp/w3-hotindex.el
+++ b/lisp/w3-hotindex.el
@@ -157,7 +157,7 @@ Case is therefore important."
       (setq index (cdr index)))
     (let ((w3-hotlist result)
          (w3-reuse-buffers 'no))
-      (w3-show-hotlist))))
+      (w3-hotlist-view))))
 
 (defun w3-hotindex-save (filename)
   "*Save the index structure in filename. If filename is nil, 

commit d2ad529d446b9136736b78643d7c68e113c1e5d7
Author: Dave Love <address@hidden>
Date:   Tue May 29 15:52:51 2001 +0000

    (url-vars): Require.
    (w3-lynx-emulation-minor-mode-map)
    (w3-netscape-emulation-minor-mode-map): Bind w3-hotlist-view, not
    w3-show-hotlist.

diff --git a/lisp/w3-emulate.el b/lisp/w3-emulate.el
index 79b467f..05a2787 100644
--- a/lisp/w3-emulate.el
+++ b/lisp/w3-emulate.el
@@ -1,7 +1,7 @@
 ;;; w3-emulate.el --- All variable definitions for emacs-w3
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:36:05 $
-;; Version: $Revision: 1.2 $
+;; Author: $Author: fx $
+;; Created: $Date: 2001/05/29 15:52:51 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: comm, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -30,6 +30,7 @@
 ;;; Provide emulations of various other web browsers
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (require 'w3-vars)
+(require 'url-vars)
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -70,7 +71,7 @@
 (define-key w3-netscape-emulation-minor-mode-map "\M-r" 'w3-reload-document)
 (define-key w3-netscape-emulation-minor-mode-map "\M-i" 
'w3-load-delayed-images)
 (define-key w3-netscape-emulation-minor-mode-map "\M-a" 
'w3-hotlist-add-document)
-(define-key w3-netscape-emulation-minor-mode-map "\M-b" 'w3-show-hotlist)
+(define-key w3-netscape-emulation-minor-mode-map "\M-b" 'w3-hotlist-view)
 (define-key w3-netscape-emulation-minor-mode-map "\M-h" 'w3-show-history-list)
 
 (define-key w3-netscape-emulation-minor-mode-map [up]
@@ -183,8 +184,8 @@
 (define-key w3-lynx-emulation-minor-mode-map "t"   'ignore) ; tag
 (define-key w3-lynx-emulation-minor-mode-map "u"   'w3-history-backward)
 (define-key w3-lynx-emulation-minor-mode-map "/"   'w3-search-forward)
-(define-key w3-lynx-emulation-minor-mode-map "v"   'w3-show-hotlist)
-(define-key w3-lynx-emulation-minor-mode-map "V"   'w3-show-hotlist)
+(define-key w3-lynx-emulation-minor-mode-map "v"   'w3-hotlist-view)
+(define-key w3-lynx-emulation-minor-mode-map "V"   'w3-hotlist-view)
 (define-key w3-lynx-emulation-minor-mode-map "x"   'widget-button-press)
 (define-key w3-lynx-emulation-minor-mode-map "z"   'keyboard-quit)
 (define-key w3-lynx-emulation-minor-mode-map "="   'w3-document-information)

commit 8767283ac449d18a050104b2913244d4bdd4d07c
Author: Dave Love <address@hidden>
Date:   Tue May 29 15:50:37 2001 +0000

    (w3-open-local, w3-fetch): Autoload.
    (add-minor-mode): Remove definition in favour of autoload.

diff --git a/lisp/w3-dired.el b/lisp/w3-dired.el
index 6bd7ba0..52c025a 100644
--- a/lisp/w3-dired.el
+++ b/lisp/w3-dired.el
@@ -1,7 +1,7 @@
 ;;; w3-dired.el --- W3 Dired minor mode
 ;; Author: Bill Perry <address@hidden>
-;; Created: $Date: 2001/05/14 16:19:07 $
-;; Version: $Revision: 1.3 $
+;; Created: $Date: 2001/05/29 15:50:37 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -35,7 +35,10 @@
 
 ;; Fixme: should we have both this and url-dired?
 
+(require 'w3-sysdp)                    ; for add-minor-mode
 (autoload 'dired-get-filename "dired")
+(autoload 'w3-open-local "w3")
+(autoload 'w3-fetch "w3")
 
 (defvar w3-dired-minor-mode-map
   (let ((map (make-sparse-keymap)))
@@ -75,27 +78,6 @@
    (t
     (setq w3-dired-minor-mode t))))
 
-(if (not (fboundp 'add-minor-mode))
-    (defun add-minor-mode (toggle name &optional keymap after toggle-fun)
-      "Add a minor mode to `minor-mode-alist' and `minor-mode-map-alist'.
-TOGGLE is a symbol which is used as the variable which toggle the minor mode,
-NAME is the name that should appear in the modeline (it should be a string
-beginning with a space), KEYMAP is a keymap to make active when the minor
-mode is active, and AFTER is the toggling symbol used for another minor
-mode.  If AFTER is non-nil, then it is used to position the new mode in the
-minor-mode alists.  TOGGLE-FUN specifies an interactive function that
-is called to toggle the mode on and off; this affects what appens when
-button2 is pressed on the mode, and when button3 is pressed somewhere
-in the list of modes.  If TOGGLE-FUN is nil and TOGGLE names an
-interactive function, TOGGLE is used as the toggle function.
-
-Example:  (add-minor-mode 'view-minor-mode \" View\" view-mode-map)"
-      (if (not (assq toggle minor-mode-alist))
-         (setq minor-mode-alist (cons (list toggle name) minor-mode-alist)))
-      (if (and keymap (not (assq toggle minor-mode-map-alist)))
-         (setq minor-mode-map-alist (cons (cons toggle keymap)
-                                          minor-mode-map-alist)))))
-
 (add-minor-mode 'w3-dired-minor-mode " W3" w3-dired-minor-mode-map)
 
 ;;;###autoload

commit 6949ea72ca45c1b4a502916b4e504ecb101ca607
Author: Dave Love <address@hidden>
Date:   Tue May 29 15:46:28 2001 +0000

    (w3-mode-map): Bind w3-hotlist-view, not
    w3-show-hotlist.

diff --git a/lisp/w3-keymap.el b/lisp/w3-keymap.el
index 969d62b..49ac088 100644
--- a/lisp/w3-keymap.el
+++ b/lisp/w3-keymap.el
@@ -1,7 +1,7 @@
 ;;; w3-keymap.el --- Keybindings for Emacs/W3
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:36:08 $
-;; Version: $Revision: 1.1 $
+;; Author: $Author: fx $
+;; Created: $Date: 2001/05/29 15:46:28 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: comm, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -40,7 +40,7 @@
 (define-key w3-mode-map "ha"       'w3-hotlist-apropos)
 (define-key w3-mode-map "hd"       'w3-hotlist-delete)
 (define-key w3-mode-map "hi"       'w3-hotlist-add-document)
-(define-key w3-mode-map "hv"       'w3-show-hotlist)
+(define-key w3-mode-map "hv"       'w3-hotlist-view)
 (define-key w3-mode-map "hr"       'w3-hotlist-rename-entry)
 (define-key w3-mode-map "hu"       'w3-use-hotlist)
 (define-key w3-mode-map "hA"       'w3-hotlist-append)

commit b2f11b5d934401227877a147d3998213e0d959bb
Author: Dave Love <address@hidden>
Date:   Tue May 29 15:45:27 2001 +0000

    (w3-parse-buffer): Use
    w3-resolve-numeric-entity for bogus characters.

diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index 4aa66a5..aa084c6 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -2643,16 +2643,9 @@ Returns a data structure containing the parsed 
information."
                            (concat "[" (w3-invalid-sgml-chars) "]")))
              (w3-debug-html
               (format "Invalid SGML character: %c" (char-after (point))))
-             ;; This will avoid ebola warnings... but do we reallly want
-             ;; to be nuking the invalid character if we are in a MULE
-             ;; buffer... ISO2022 could have 'invalid' HTML characters,
-             ;; but still parse well.  But would this only ever happen
-             ;; if for some reason we did not decode the SJIS/ISO2022
-             ;; encodings?  Mislabeled MIME with no charset?
-             ;;
-             ;; FIXME FIXME FIXME!!!!!
-             (insert (or (cdr-safe (assq (w3-char-int (char-after (point)))
-                                         w3-invalid-sgml-char-replacement)) 
""))
+             ;; Probably cp1252 or some such without proper MIME spec...
+             (insert (w3-resolve-numeric-entity
+                      (w3-char-int (char-after (point)))))
              (delete-char 1))
             ((eobp)
              ;; We have finished the buffer.  Make sure we process the last

commit 9c69d3a948c9df78572600d73f40f8b5f57aca82
Author: William M. Perry <address@hidden>
Date:   Fri May 25 14:05:05 2001 +0000

    Load cl-extra in w3-speak-table.el to work around a byte-optimizer bug in 
Emacs 21.

diff --git a/ChangeLog b/ChangeLog
index 96c26dc..2c8e5c5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2001-05-25  William M. Perry  <address@hidden>
+
+       * lisp/w3-speak-table.el: Make sure to load cl-extra at load time
+       to work around a byte-optimizer bug in Emacs 21 that caused this
+       module to fail to byte-compile.
+
 2001-05-24  Pavel Janík <address@hidden>
 
        * lisp/w3-display.el (w3-resurrect-hyperlinks): Look for next
diff --git a/lisp/w3-speak-table.el b/lisp/w3-speak-table.el
index 3e636cb..05b2071 100644
--- a/lisp/w3-speak-table.el
+++ b/lisp/w3-speak-table.el
@@ -1,8 +1,11 @@
-;;;$Id: w3-speak-table.el,v 1.3 1999/12/24 12:16:41 wmperry Exp $
+;;;$Id: w3-speak-table.el,v 1.4 2001/05/25 14:05:05 wmperry Exp $
 ;;;Authors: Thierry Emery <address@hidden>, T.V. Raman <address@hidden>
 ;;;Description: Speak W3 tables
 
-(require 'cl)
+(eval-when-compile
+  (require 'cl)
+  (load "cl-extra"))
+
 ;;{{{  inline functions
 
 (defsubst w3-table-inside-table-display-p ()

commit 248882b58d7cc525732b56dda4403f6213de80e5
Author: William M. Perry <address@hidden>
Date:   Thu May 24 16:45:40 2001 +0000

    2001-05-24  Pavel Janík <address@hidden>
    
        * lisp/w3-display.el (w3-resurrect-hyperlinks): Look for next
        single property change from `st' instead of `nd' to avoid
        potential infinite loops.
    
    2001-05-24  William M. Perry  <address@hidden>
    
        * lisp/w3-cus.el (w3-honor-stylesheets): Turn off stylesheets for
        now - url-retrieve-synchronously seems to be acting quite
        strange.

diff --git a/ChangeLog b/ChangeLog
index 426737c..96c26dc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2001-05-24  Pavel Janík <address@hidden>
+
+       * lisp/w3-display.el (w3-resurrect-hyperlinks): Look for next
+       single property change from `st' instead of `nd' to avoid
+       potential infinite loops.
+
+2001-05-24  William M. Perry  <address@hidden>
+
+       * lisp/w3-cus.el (w3-honor-stylesheets): Turn off stylesheets for
+       now - url-retrieve-synchronously seems to be acting quite
+       strange.
+
 2001-05-22  William M. Perry  <address@hidden>
 
        * lisp/css.el (css-handle-import): Use ignore-errors around url
diff --git a/lisp/w3-cus.el b/lisp/w3-cus.el
index 2c5e8c9..309a10b 100644
--- a/lisp/w3-cus.el
+++ b/lisp/w3-cus.el
@@ -1,7 +1,7 @@
 ;;; w3-cus.el --- Customization support for Emacs-W3
-;; Author: $Author: fx $
-;; Created: $Date: 2000/12/20 20:36:31 $
-;; Version: $Revision: 1.6 $
+;; Author: $Author: wmperry $
+;; Created: $Date: 2001/05/24 16:45:40 $
+;; Version: $Revision: 1.7 $
 ;; Keywords: comm, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -399,7 +399,7 @@ If nil, then lines can extend all the way to the window 
margin."
   :group 'w3-display
   :type 'boolean)
 
-(defcustom w3-honor-stylesheets t
+(defcustom w3-honor-stylesheets nil
   "*Whether to let a document specify a CSS stylesheet."
   :group 'w3-display
   :type 'boolean)
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 27f0825..6a95a53 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.28 $
+;; Version: $Revision: 1.29 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2044,7 +2044,7 @@ Format: (((image-alt row column) . offset) ...)")
                                                                 :button-keymap 
w3-display-hackmap
                                                                 :end nd)
                                                           info))))
-      (setq st (next-single-property-change nd 'w3-hyperlink-info)))))
+      (setq st (next-single-property-change st 'w3-hyperlink-info)))))
 
 (defun w3-display-convert-arglist (args)
   (let ((rval nil)

commit f8da8b3ce0bb9e79bc0f1d402533c97e1b5e2eca
Author: William M. Perry <address@hidden>
Date:   Tue May 22 19:03:20 2001 +0000

        * lisp/css.el (css-handle-import): Use ignore-errors around url
        loading.
        (css-parse): Ditto.
    
        * lisp/docomp.el: Remove a bunch of the autoloading crap - it
        isn't needed anymore.

diff --git a/ChangeLog b/ChangeLog
index de59a89..426737c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2001-05-22  William M. Perry  <address@hidden>
+
+       * lisp/css.el (css-handle-import): Use ignore-errors around url
+       loading.
+       (css-parse): Ditto.
+
+       * lisp/docomp.el: Remove a bunch of the autoloading crap - it
+       isn't needed anymore.
+
 2001-05-17  William M. Perry  <address@hidden>
 
        * lisp/w3-parse.el w3-int-to-char: Deal with XEmacs more nicely.
diff --git a/lisp/css.el b/lisp/css.el
index d6f7c6b..0ff7c09 100644
--- a/lisp/css.el
+++ b/lisp/css.el
@@ -1,7 +1,7 @@
 ;;; css.el -- Cascading Style Sheet parser
-;; Author: $Author: fx $
-;; Created: $Date: 2000/12/20 20:52:38 $
-;; Version: $Revision: 1.5 $
+;; Author: $Author: wmperry $
+;; Created: $Date: 2001/05/22 19:03:20 $
+;; Version: $Revision: 1.6 $
 ;; Keywords: 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -733,9 +733,8 @@ For a terminal frame, the value is always 1."
           (save-excursion
             (set-buffer (generate-new-buffer " *styleimport*"))
             ;; ftp/file URLs can signal an error.
-            (condition-case ()
-                (url-insert-file-contents url)
-              (error nil))
+            (ignore-errors
+              (url-insert-file-contents url))
             (css-clean-buffer)
             (setq sheet (buffer-string))
             (set-buffer-modified-p nil)
@@ -934,7 +933,8 @@ For a terminal frame, the value is always 1."
       (setq url-current-object pobj)
       (set-syntax-table css-syntax-table)
       (erase-buffer)
-      (if url (url-insert-file-contents url))
+      (ignore-errors
+       (if url (url-insert-file-contents url)))
       (goto-char (point-max))
       (if string (insert string))
       (css-clean-buffer)
diff --git a/lisp/docomp.el b/lisp/docomp.el
index 1db1c10..1fbab63 100644
--- a/lisp/docomp.el
+++ b/lisp/docomp.el
@@ -86,13 +86,3 @@
 
 (defun emacs-batch-build-custom-load ()
   (emacs-build-custom-load (car command-line-args-left)))
-
-(provide 'w3-auto)
-(autoload 'w3-load-flavors "w3")
-
-(w3-load-flavors)
-(w3-setup-version-specifics)
-
-(require 'w3-sysdp)
-(require 'w3-vars)
-(require 'url)

commit d194cde5473fb88183e903b38fbbc422365e6521
Author: Dave Love <address@hidden>
Date:   Mon May 21 10:28:17 2001 +0000

    *** empty log message ***

diff --git a/NOTES b/NOTES
index 0a3acdf..98d5592 100644
--- a/NOTES
+++ b/NOTES
@@ -13,15 +13,11 @@ I'm also aiming to dump w3-sysdp.  It's unclean, for 
instance, to
 define `extent' functions in Emacs without a name prefix -- other
 packages test for their existence and then lose.
 
-I haven't been testing on XEmacs, and may well have broken things for
-it.  In fact, I've really only been testing in development Emacs 21.
+I haven't been testing much on XEmacs, and may well have broken things
+for it.  In fact, I've mostly been testing in development Emacs 21.
 
 There's plenty that still doesn't work, and docs are likely wrong.
 
-It will be more profitable to correspond with me than send to the bug
-address; I seem to be the only one currently working on this stuff and
-can't read any w3-related mail boxes other than w3-beta.
-
 HTH.
 
   -- Dave Love <address@hidden>, May 2001

commit 1678c562a8bf2cd2fc5a99c943f32da4615beede
Author: Dave Love <address@hidden>
Date:   Fri May 18 23:42:43 2001 +0000

    comments

diff --git a/lisp/w3-widget.el b/lisp/w3-widget.el
index cc20ae4..63d1981 100644
--- a/lisp/w3-widget.el
+++ b/lisp/w3-widget.el
@@ -1,12 +1,12 @@
 ;;; w3-widget.el --- An image widget
-;; Author: ll Perry <address@hidden>$Author: fx $
-;; Created: $Date: 2001/05/14 17:27:57 $
-;; Version: $Revision: 1.6 $
+;; Author: Bill Perry <address@hidden>
+;; Created: $Date: 2001/05/18 23:42:43 $
+;; Version: $Revision: 1.7 $
 ;; Keywords: faces, images
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996, 1997 Free Software Foundation, Inc.
+;;; Copyright (c) 1996, 1997, 2001 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -50,6 +50,10 @@
 ;;;    These are either URLs (http://foo/...) or alternative text.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+;; I don't think there's currently any way to get the pixel position
+;; of a mouse event on an Emacs 21 image, so image maps aren't going
+;; to work properly.  -- fx
+
 (require 'widget)
 (require 'url-util)
 (require 'w3-vars)

commit 2f26e1d992063f5e020793376be9999ef865671b
Author: Dave Love <address@hidden>
Date:   Fri May 18 09:42:46 2001 +0000

    *** empty log message ***

diff --git a/NOTES b/NOTES
new file mode 100644
index 0000000..0a3acdf
--- /dev/null
+++ b/NOTES
@@ -0,0 +1,28 @@
+                                                           -*- text -*-
+
+As well as making a lot more actually work, I'm trying to clean things
+up, both in the w3 and url packages, so that it might eventually go
+into Emacs.
+
+Emacs 20.3 or XEmacs 20.4 is now required -- by the Gnus dependency,
+if nothing else.  That rules out VMS support.  The aim is to be
+able to compile individual files without docomp.el, but I may have
+missed some (eval-when-compile (require 'cl)) for Emacs 20, for
+instance.  I'm aiming to dump mule-sysdp.el and rely on mm-util & al.
+I'm also aiming to dump w3-sysdp.  It's unclean, for instance, to
+define `extent' functions in Emacs without a name prefix -- other
+packages test for their existence and then lose.
+
+I haven't been testing on XEmacs, and may well have broken things for
+it.  In fact, I've really only been testing in development Emacs 21.
+
+There's plenty that still doesn't work, and docs are likely wrong.
+
+It will be more profitable to correspond with me than send to the bug
+address; I seem to be the only one currently working on this stuff and
+can't read any w3-related mail boxes other than w3-beta.
+
+HTH.
+
+  -- Dave Love <address@hidden>, May 2001
+

commit 910472c30e2cc7b71e8e6346f1cf07c58babb56e
Author: William M. Perry <address@hidden>
Date:   Thu May 17 20:22:01 2001 +0000

        * lisp/w3-parse.el w3-int-to-char: Deal with XEmacs more nicely.
        int-to-char does error checking, so passing in ?~ tends to blow
        things up.  Do better error checking for characters passed in, and
        for integers that are not capable of being converted to
        characters.
    
        * lisp/w3-display.el (w3-dingbats): Deal with a mule-less XEmacs
        in our conditions.

diff --git a/ChangeLog b/ChangeLog
index b4f1934..de59a89 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2001-05-17  William M. Perry  <address@hidden>
+
+       * lisp/w3-parse.el w3-int-to-char: Deal with XEmacs more nicely.
+       int-to-char does error checking, so passing in ?~ tends to blow
+       things up.  Do better error checking for characters passed in, and
+       for integers that are not capable of being converted to
+       characters.
+
+       * lisp/w3-display.el (w3-dingbats): Deal with a mule-less XEmacs
+       in our conditions.
+
 2001-05-16  Dave Love  <address@hidden>
 
        * lisp/w3.el (w3-decode-charset): Re-write.
diff --git a/lisp/base64.el b/lisp/base64.el
index 6c0b7c0..bbef43e 100644
--- a/lisp/base64.el
+++ b/lisp/base64.el
@@ -82,7 +82,7 @@ base64-encoder-program.")
        (coding-system-for-read base64-binary-coding-system))
     (unwind-protect
        (progn
-         (setq tempfile (make-temp-name "base64"))
+         (setq tempfile (make-temp-name "/tmp/base64"))
          (setq status
                (apply 'call-process-region
                       start end command nil
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 69a45d1..27f0825 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.27 $
+;; Version: $Revision: 1.28 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1045,28 +1045,28 @@ If the face already exists, it is unmodified."
 
 ;; The table handling
 (eval-and-compile
-  (if (and (featurep 'xemacs)
-          (featurep 'mule)
-          (not (find-charset 'w3-dingbats)))
-      (make-charset 'w3-dingbats "Dingbats character set for Emacs/W3"
-                   '(registry "" dimension 1 chars 96 final ?:))
-    (if (not (charsetp 'w3-dingbats))
-       (define-charset nil 'w3-dingbats
-         (vector
-          1                            ; dimension
-          96                           ; chars
-          1                            ; width
-          1                            ; direction
-          ?:                           ; iso-final-char
-          0                         ; iso-graphic-plane (whats this?)
-          "dingbats" "emacs/w3-dingbats"
-          "Dingbats character set for Emacs/W3")))))
+  (when (featurep 'mule)
+    (if (and (featurep 'xemacs)
+            (not (find-charset 'w3-dingbats)))
+       (make-charset 'w3-dingbats "Dingbats character set for Emacs/W3"
+                     '(registry "" dimension 1 chars 96 final ?:))
+      (if (not (charsetp 'w3-dingbats))
+         (define-charset nil 'w3-dingbats
+           (vector
+            1                          ; dimension
+            96                         ; chars
+            1                          ; width
+            1                          ; direction
+            ?:                         ; iso-final-char
+            0                          ; iso-graphic-plane (whats this?)
+            "dingbats" "emacs/w3-dingbats"
+            "Dingbats character set for Emacs/W3"))))))
 
 (defun w3-make-char (oct)
-  (if (and (featurep 'xemacs)
-          (featurep 'mule))
-      (make-char 'w3-dingbats (if (characterp oct) (char-int oct) oct))
-    (make-char 'w3-dingbats oct)))
+  (when (featurep 'mule)
+    (if (featurep 'xemacs)
+       (make-char 'w3-dingbats (if (characterp oct) (char-int oct) oct))
+      (make-char 'w3-dingbats oct))))
 
 (defvar w3-table-ascii-border-chars
   [nil  nil  nil  ?+ nil  ?- ?+ ?- nil ?+ ?| ?| ?+ ?- ?| ?+]
diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index 7b6f86c..4aa66a5 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -297,7 +297,14 @@ an ASCII substitute and the Unicode for the cp1252 
character.")
 
 (eval-and-compile
   (if (fboundp 'int-to-char)            ; XEmacs
-      (defalias 'w3-int-to-char 'int-to-char)
+      (defun w3-int-to-char (c)
+        (cond
+         ((characterp c)
+          c)
+         ((char-int-p c)
+          (int-to-char c))
+         (t
+          ?~)))
     (defalias 'w3-int-to-char 'identity)))
 
 (defun w3-resolve-numeric-entity (code)

commit a338b92ea4a4025c88f6e77e9a630b0d9ef48d3c
Author: Dave Love <address@hidden>
Date:   Wed May 16 19:11:40 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 6d5fb6e..b4f1934 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2001-05-16  Dave Love  <address@hidden>
+
+       * lisp/w3.el (w3-decode-charset): Re-write.
+       (w3-fetch-callback): Partly re-write for coding conversion.
+       (w3-convert-code-for-mule, w3-coding-system-for-mime-charset):
+       Deleted.
+       (w3-save-as, w3-download-callback): Avoid
+       mule-write-region-no-coding-system.
+       (w3-mode): Do kill-all-local-variables in Emacs.
+
 2001-05-15  Dave Love  <address@hidden>
 
        * lisp/w3-display.el (w3-sysdp): Require.

commit e3f2dfa5fcd92128d4c2488c338e533dc0ea3ed5
Author: Dave Love <address@hidden>
Date:   Wed May 16 19:11:12 2001 +0000

    (w3-decode-charset): Re-write.
    (w3-fetch-callback): Partly re-write for coding conversion.
    (w3-convert-code-for-mule, w3-coding-system-for-mime-charset):
    Deleted.
    (w3-save-as, w3-download-callback): Avoid
    mule-write-region-no-coding-system.
    (w3-mode): Do kill-all-local-variables in Emacs.

diff --git a/lisp/w3.el b/lisp/w3.el
index 9a0b24e..29feac9 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: fx $
-;; Created: $Date: 2001/05/14 17:45:50 $
-;; Version: $Revision: 1.17 $
+;; Created: $Date: 2001/05/16 19:11:12 $
+;; Version: $Revision: 1.18 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -145,42 +145,31 @@ hypertext document."
                    (url-get-url-at-point))))
     url))
 
-(defun w3-decode-charset ()
+(defun w3-decode-charset (handle)
   "Decode charset-encoded text in the document.
+HANDLE is the MIME handle of the original part.
 Return the coding system used for the decoding."
   (interactive "P")
-  (let (coding-system)
+  (let* ((encoding (mm-handle-encoding handle))
+        (charset (or (mail-content-type-get (mm-handle-type handle)
+                                            'charset)
+                     "iso-8859-1"))
+        (type (mm-handle-media-type handle))
+        (coding-system (mm-charset-to-coding-system charset)))
+    (if (and (not coding-system)
+            (not (equal charset "ascii")))
+       ;; Does this work for XEmacs?  Should we guess anyhow?
+       (setq coding-system 'undecided))
     (save-excursion
-      (mail-narrow-to-head)
-      (let* ((inhibit-point-motion-hooks t)
-            (case-fold-search t)
-            (ct (mail-fetch-field "Content-Type" t))
-            (cte (mail-fetch-field "Content-Transfer-Encoding" t))
-            (ctl (and ct (ignore-errors
-                          (mail-header-parse-content-type ct))))
-            (charset (if ctl
-                         (mail-content-type-get ctl 'charset)))
-            (mail-parse-charset 'iso-8859-1) ; Always true for HTTP, right?
-            (mail-parse-ignored-charsets nil)
-            buffer-read-only)
-       (setq coding-system
-             (and charset
-                  (mm-charset-to-coding-system (intern (downcase charset)))))
-       (if (and ctl (not (string-match "/" (car ctl)))) 
-           (setq ctl nil))
-       (goto-char (point-max))
-       (widen)
-       (forward-line 1)
-       (narrow-to-region (point) (point-max))
-       (when (and (or (not ctl)
-                      (equal (car ctl) "text/plain")))
-         (mm-decode-body
-          charset (and cte
-                       (intern (downcase
-                                (while (string-match "[\r\n\t ]+" cte)
-                                  (setq cte (replace-match "" t t cte))))))
-          (car ctl))))
-      (widen))
+      (if encoding
+         (mm-decode-content-transfer-encoding encoding type))
+      (when (and (featurep 'mule)
+                (if (boundp 'default-enable-multibyte-characters)
+                    default-enable-multibyte-characters
+                  t)
+                coding-system)
+       (mm-decode-coding-region (point-min) (point-max) coding-system))
+      (mm-enable-multibyte))
     coding-system))
 
 (defun w3-nasty-disgusting-http-equiv-handling (&optional buffer)
@@ -214,29 +203,29 @@ Return the coding system used for the decoding."
 (defun w3-fetch-callback (url)
   (w3-nasty-disgusting-http-equiv-handling)
   (let ((handle (mm-dissect-buffer t))
-       (buff nil)
-       mule-retrieval-coding-system)
+       (buff nil))
     (message "Downloading of `%s' complete." url)
-    (setq mule-retrieval-coding-system
-         (mm-charset-to-coding-system (w3-decode-charset)))
-    (mm-enable-multibyte)
     (url-mark-buffer-as-dead (current-buffer))
+    ;; Fixme: can handle be null?
     (cond
-     ((equal (car-safe (mm-handle-type handle)) "text/html")
+     ((equal (mm-handle-media-type handle) "text/html")
       ;; Special case text/html if it comes through w3-fetch
-      (setq buff (generate-new-buffer " *w3-html*"))
-      (set-buffer buff)
-      (setq url-current-object (url-generic-parse-url url))
+      (set-buffer (generate-new-buffer " *w3-html*"))
+      (mm-disable-multibyte)
       (mm-insert-part handle)
+      (w3-decode-charset handle)
+      (setq url-current-object (url-generic-parse-url url))
       (w3-prepare-buffer)
       (w3-notify-when-ready (current-buffer)))
-     ((equal (car-safe (mm-handle-type handle)) 
"application/x-elisp-parsed-html")
-      ;; Also need to special-case pre-parsed representations of HTML
-      (w3-prepare-tree (read (set-marker (make-marker) 1 (mm-handle-buffer 
handle)))))
+     ((equal (car-safe (mm-handle-type handle))
+            "application/x-elisp-parsed-html")
+      ;; Also need to special-case pre-parsed representations of HTML.
+      ;; Fixme: will this need decoding?
+      (w3-prepare-tree (read (set-marker (make-marker) 1
+                                        (mm-handle-buffer handle)))))
      ((mm-inlinable-p handle)
       ;; We can view it inline!
-      (setq buff (generate-new-buffer url))
-      (set-buffer buff)
+      (set-buffer (generate-new-buffer url))
       (mm-display-part handle)
       (w3-notify-when-ready (current-buffer)))
      (t
@@ -858,51 +847,7 @@ even though the MIME type is nil or listed in 
`w3-mime-list-for-code-conversion'
 The global value is usually nil.  It will be bound locally if a user
 invokes some commands which read a coding system from the user.")
 
-(defun w3-convert-code-for-mule (mmtype mmcharset mmencoding)
-  "Decode current data by an appropriate coding system."
-  (and (or (not mmtype)
-          (member mmtype w3-mime-list-for-code-conversion))
-       (not (member mmencoding w3-no-conversion-encodings))
-       (let (charset-symbol coding-system)
-        (cond (;; explicit coding system ? (through C-u [w3-reload-document])
-               (and w3-explicit-coding-system
-                    (mule-coding-system-p w3-explicit-coding-system))
-               (setq coding-system w3-explicit-coding-system))
-              (;; explicit charset ? (through MIME headers or META tag)
-               (and (stringp mmcharset)
-                    (setq coding-system (w3-coding-system-for-mime-charset 
mmcharset))))
-              (;; recorded explicit coding system ? (in 
`w3-explicit-encodings-file')
-               (setq coding-system (w3-recall-explicit-coding-system 
url-current-object)))
-              ;; forced conversion ? (through user option 
w3-force-conversion-alist)
-              ((and (url-filename url-current-object)
-                    (let ((force-alist w3-force-conversion-alist)
-                          (url (concat (url-host url-current-object)
-                                       (url-filename url-current-object))))
-                      (while (and force-alist (not coding-system))
-                        (if (string-match (car (car force-alist)) url)
-                            (setq coding-system (cdr (car force-alist))))
-                        (setq force-alist (cdr force-alist)))
-                      coding-system))
-               coding-system)
-              (t;; otherwise try to detect coding-system
-               (setq coding-system
-                     (mule-detect-coding-version (url-host url-current-object)
-                                                 (point-min) (point-max)))))
-        (mule-code-convert-region coding-system)
-        (if (mule-coding-system-with-invalid-chars coding-system)
-            (w3-replace-invalid-chars)))))
-
-(defun w3-coding-system-for-mime-charset (mmcharset)
-  (let ((coding-system nil)
-       (l w3-mime-charset-coding-alist))
-    (while l
-      (if (string-match (car (car l)) mmcharset)
-         (setq coding-system (if (mule-coding-system-p (cdr (car l)))
-                                 (cdr (car l)))
-               l nil)
-       (setq l (cdr l))))
-    coding-system))
-
+;; Fixme: use skip-chars-forward.
 (defun w3-replace-invalid-chars ()
   (let ((invalid-char-alist w3-invalid-sgml-char-replacement))
     (while invalid-char-alist
@@ -953,7 +898,8 @@ invokes some commands which read a coding system from the 
user.")
        (require 'ps-print)
        (let ((ps-spool-buffer-name (buffer-name)))
          (ps-spool-buffer-with-faces))))
-      (mule-write-region-no-coding-system (point-min) (point-max) fname)
+      (let ((coding-system-for-write 'binary))
+       (write-region (point-min) (point-max) fname))
       (kill-buffer (current-buffer)))))
 
 
@@ -1744,7 +1690,8 @@ dumped with emacs."
     result))
 
 (defun w3-download-callback (fname)
-  (mule-write-region-no-coding-system (point-min) (point-max) fname)
+  (let ((coding-system-for-write 'binary))
+    (write-region (point-min) (point-max) fname))
   (url-mark-buffer-as-dead (current-buffer))
   (message "Download of %s complete." (url-view-url t))
   (sit-for 3))
@@ -1959,7 +1906,8 @@ Current keymap is:
     (let ((tmp (mapcar (function (lambda (x) (cons x (and (boundp x) 
(symbol-value x)))))
                       w3-persistent-variables)))
       ;; Oh gross, this kills buffer-local faces in XEmacs
-      ;;(kill-all-local-variables)
+      (unless (featurep 'xemacs)
+       (kill-all-local-variables))
       (use-local-map w3-mode-map)
       (setq mode-name "WWW")
       (mapcar (function (lambda (x) (if (boundp (car x))

commit 4ae6a7bca2425d0b9108eac495ca1619ef29b9c9
Author: Dave Love <address@hidden>
Date:   Wed May 16 11:45:54 2001 +0000

    @sc fixes from Jim Meyering.

diff --git a/texi/w3.txi b/texi/w3.txi
index 94d8241..4d948a9 100644
--- a/texi/w3.txi
+++ b/texi/w3.txi
@@ -12,7 +12,7 @@
 @c site: http://www.cs.indiana.edu/elisp/w3/docs.html
 @c
 @setfilename w3.info
address@hidden Emacs/W3 $State: Exp $ User's Manual
address@hidden Emacs/W3 $State: v4.0pre.47 $ User's Manual
 @iftex
 @c @finalout
 @end iftex
@@ -89,7 +89,7 @@ cannot be modified to your satisfaction, please send mail to 
the
 @t{w3-beta@@xemacs.org} mailing list with any suggestions.
 @xref{Reporting Bugs}.
 
-This manual corresponds to Emacs/W3 $State: Exp $
+This manual corresponds to Emacs/W3 $State: v4.0pre.47 $
 
 @menu
 * Getting Started::             Getting up and running with Emacs/W3
@@ -365,7 +365,6 @@ non-graphic terminals (VT100, DOS window, etc.).  On a 
graphics
 terminal, the links are in shown in different colors.
 For information on how to change this, @xref{Stylesheets}.
 
-
 There are approximately 50 keys bound to special Emacs/W3 functions.
 The basic rule of thumb regarding keybindings in Emacs/W3 is that a
 lowercase key takes an action on the @b{current document}, and an
@@ -787,7 +786,6 @@ netscape emulation.  lynx emulation is handled by the
 @code{w3-lynx-emulation-minor-mode} minor mode.  For more information
 about lynx style hotlists, @xref{Hotlist Handling}.
 
-
 :: work :: Document lynx address@hidden
 @table @kbd
 @kindex down
@@ -967,7 +965,6 @@ off lynx emulation.  netscape emulation is handled by the
 information about netscape style hotlists, @xref{Hotlist Handling}.
 
 
-
 @table @kbd
 @kindex M-a
 @item M-a
@@ -1231,7 +1228,7 @@ automatically written to disk every
 @code{url-global-history-save-interval} seconds and when exiting emacs.
 The list is added to those already in the file specified by
 @code{url-global-history-file}, which defaults to @file{~/mosaic.hst}
-for MS operating systems, @file{~/mosaic.global-history} for @sc{VMS} and
+for MS operating systems, @file{~/mosaic.global-history} for @sc{vms} and
 @file{~/.w3/history} for everything else.
 
 If any @sc{url} in the list is found in the file, it is not saved, but new
@@ -1487,12 +1484,12 @@ W3C proposals.  Wherever Emacs/W3 diverges from the 
specification, it
 will be clearly documented, and will be changed once a full standard is
 available.
 
-Support for @sc{DSSSL} is progressing, but spare time is at an all-time
+Support for @sc{dsssl} is progressing, but spare time is at an all-time
 low.  If anyone would like to help, please contact the author.
 
-The following sections closely parallel the @sc{CSS1} specification so
+The following sections closely parallel the @sc{css1} specification so
 it should be very easy to look up what Emacs/W3 supports when browsing
-through the @sc{CSS1} specification.  Please note that a lot of the text
+through the @sc{css1} specification.  Please note that a lot of the text
 in the following sections comes directly from the specification as
 well.
 
@@ -1514,7 +1511,7 @@ HTML attribute, ie: @samp{align=center} --- align is the 
attribute.
 @item author
 The author of an HTML document.
 @item block-level element
-An element which has a line break before and after (e.g. 'H1' in @sc{HTML}).
+An element which has a line break before and after (e.g.@: 'H1' in @sc{html}).
 @item canvas
 The part of the UA's drawing surface onto which documents are rendered.
 @item child element

commit ffb2c5cddc478b536b0b8af47acb6b7730e33fb5
Author: Dave Love <address@hidden>
Date:   Tue May 15 11:29:02 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 1c07f4e..6d5fb6e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2001-05-15  Dave Love  <address@hidden>
+
+       * lisp/w3-display.el (w3-sysdp): Require.
+       (flatten): Autoload unconditionally.
+
+       * lisp/w3-parse.el (w3-invalid-sgml-char-replacement): Redefined.
+       (w3-resolve-numeric-entity): New function.
+       (html-entities): Consider string and non-string returns from
+       w3-resolve-numeric-entity.
+       (w3-p-s-var-def): Use w3-resolve-numeric-entity.
+       (w3-parse-hooks): Fix typo.
+       (w3-int-to-char): New alias.
+
 2001-05-14  Dave Love  <address@hidden>
 
        * lisp/w3-sysdp.el: Don't define extent-related functions, to

commit a13f8d1552a6b2de5307b4e864126fb1176e2324
Author: Dave Love <address@hidden>
Date:   Tue May 15 11:28:18 2001 +0000

    (w3-invalid-sgml-char-replacement): Redefined.
    (w3-resolve-numeric-entity): New function.
    (html-entities): Consider string and non-string returns from
    w3-resolve-numeric-entity.
    (w3-p-s-var-def): Use w3-resolve-numeric-entity.
    (w3-parse-hooks): Fix typo.
    (w3-int-to-char): New alias.

diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index 42d8a55..7b6f86c 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -259,12 +259,77 @@ which must be a string to use as the error message."
 
 ;; *** I18N HTML support?
 
+
+(defconst w3-invalid-sgml-char-replacement
+  `((128 "euro" 8364) ;; U+20AC  EURO SIGN
+    (130 "," 8218) ;; U+201A  SINGLE LOW-9 QUOTATION MARK
+    (131 "_f" 402) ;; U+0192  LATIN SMALL LETTER F WITH HOOK
+    (132 ",,"8222) ;; U+201E  DOUBLE LOW-9 QUOTATION MARK
+    (133 "..." 8230) ;; U+2026  HORIZONTAL ELLIPSIS
+    (134 "(dagger)" 8224) ;; U+2020  DAGGER
+    (135 "(double dagger)" 8225) ;; U+2021  DOUBLE DAGGER
+    (136 ?^ 710) ;; U+02C6  MODIFIER LETTER CIRCUMFLEX ACCENT
+    (137 "%o" 8240) ;; U+2030  PER MILLE SIGN
+    (138 "S\\v" 352) ;; U+0160  LATIN CAPITAL LETTER S WITH CARON
+    (139 ?\< 8249) ;; U+2039  SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+    (140 "OE" 338) ;; U+0152  LATIN CAPITAL LIGATURE OE
+    (142 "Z\\v" 381) ;; U+017D  LATIN CAPITAL LETTER Z WITH CARON
+    (145 ?\` 8216) ;; U+2018  LEFT SINGLE QUOTATION MARK
+    (146 ?\' 8217) ;; U+2019  RIGHT SINGLE QUOTATION MARK
+    (147 "``" 8220) ;; U+201C  LEFT DOUBLE QUOTATION MARK
+    (148 "''" 8221) ;; U+201D  RIGHT DOUBLE QUOTATION MARK
+    (149 ?o 8226) ;; U+2022  BULLET
+    (150 ?- 8211) ;; U+2013  EN DASH
+    (151 "--" 8212) ;; U+2014  EM DASH
+    (152 ?~ 732) ;; U+02DC  SMALL TILDE
+    (153 "(TM)" 8482) ;; U+2122  TRADE MARK SIGN
+    (154 "s\\v" 353) ;; U+0161  LATIN SMALL LETTER S WITH CARON
+    (155 ?\> 8250) ;; U+203A  SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+    (156 "oe" 339) ;; U+0153  LATIN SMALL LIGATURE OE
+    (158 "z\\v" 382) ;; U+017E  LATIN SMALL LETTER Z WITH CARON
+    (159 "Y\\.." 376) ;; U+0178  LATIN CAPITAL LETTER Y WITH DIAERESIS
+    )
+  "Replacements for SGML numeric entities between 128 and 159.
+\(Such entities are not valid graphic charcters and are assumed to
+come from the cp1252 character set rather than Unicode.)  This is an
+alist indexed by numeric code.  The cdr of each element is a list of
+an ASCII substitute and the Unicode for the cp1252 character.")
+
+(eval-and-compile
+  (if (fboundp 'int-to-char)            ; XEmacs
+      (defalias 'w3-int-to-char 'int-to-char)
+    (defalias 'w3-int-to-char 'identity)))
+
+(defun w3-resolve-numeric-entity (code)
+  "Return a representation of the numeric entity CODE.
+This may be a string or a character.  CODE is always interpreted as a
+Unicode.  A Unicode character is returned if function `decode-char' is
+available.  Codes in the range [128,160] are substituted using
+`w3-invalid-sgml-char-replacement'."
+  ;; Maybe fall back to something like `(format "&%d;" code)' instead
+  ;; of ?~.
+  (if (fboundp 'decode-char)
+    (progn (if (and (< code 160) (> code 128))
+               (setq code
+                     (or (nth 2 (assq code w3-invalid-sgml-char-replacement))
+                         code)))
+           (or (decode-char 'ucs code) ?~))
+    (w3-int-to-char (cond ((<= code 127)
+                           code)
+                          ((<= code 255)
+                           (if (fboundp 'make-char)
+                               (make-char 'latin-iso8859-1 (- code 128))
+                             code))
+                          (t ?~)))))
+
 (let ((html-entities w3-html-entities))
   (while html-entities
     (put (car (car html-entities)) 'html-entity-expansion
         (cons 'CDATA (if (integerp (cdr (car html-entities)))
-                          (char-to-string
-                           (mule-make-iso-character (cdr (car html-entities))))
+                          (let ((ent (w3-resolve-numeric-entity
+                                      (cdr (car html-entities)))))
+                            (unless (stringp ent)
+                              (char-to-string ent)))
                        (cdr (car html-entities)))))
     (setq html-entities (cdr html-entities))))
 
@@ -356,6 +421,7 @@ which must be a string to use as the error message."
              ;; *** We don't handle external entities yet.
              (error "[Unimplemented entity: \"%s\"]" w3-p-s-entity))))
    
+     ;; Fixme: do &#x<n>; too.
      ((looking-at "&#[0-9][0-9]*\\([\   ;\n]?\\)") ; \n should be \r
       ;; We are looking at a numeric character reference.
       ;; Ensure the number is already terminated by a semicolon or carriage
@@ -373,18 +439,10 @@ which must be a string to use as the error message."
       ;; Always leave point after the expansion of a numeric
       ;; character reference, like it were a CDATA entity.
       (replace-match "")
-      ;; char-to-string will hopefully do something useful with characters
-      ;; larger than 255.  I think in MULE it does.  Is this true?
-      ;; Bill wants to call w3-resolve-numeric-entity here, but I think
-      ;; that functionality belongs in char-to-string.
-      ;; The largest valid character in the I18N version of HTML is 65533.
-      ;; ftp://ds.internic.net/internet-drafts/draft-ietf-html-i18n-01.txt
-      ;; wrongo!  Apparently, mule doesn't do sane things with char-to-string
-      ;; -wmp 7/9/96
-      (let ((repl (cdr-safe (assq w3-p-s-num 
w3-invalid-sgml-char-replacement))))
-        (condition-case ()
-            (insert (or repl (mule-make-iso-character w3-p-s-num)))
-          (error (insert "~")))))
+      ;; The condition-case is probably not necessary now.
+      (condition-case ()
+          (insert (w3-resolve-numeric-entity w3-p-s-num))
+        (error (insert "~"))))
      ((looking-at "&#\\(re\\|rs\\|space\\|tab\\)[\ ;\n]?") ; \n should be \r
       (replace-match (assq (upcase (char-after (+ 3 (point))))
                            '(;; *** Strictly speaking, record end should be
@@ -1879,36 +1937,6 @@ skip-chars-forward."
   "Used for debugging only.  Stores the most recently computed parse tree
 \(a tree, not a parse tag stream\).")
 
-(defvar w3-invalid-sgml-char-replacement
-  '(
-    ;; These characters are apparently from an M$ character set (cp1252)
-    (130 . ",")                      ; single low-9 quotation mark
-    (131 . "_f")             ; latin small letter f with hook
-    (132 . ",,")             ; double low-9 quotation mark
-    (133 . "...")            ; horizontal ellipsis
-    (134 . "(dagger)")       ; dagger
-    (135 . "(double dagger)") ; double dagger
-    (136 . "^")                      ; modifier letter circumflex accent
-    (137 . "%o")             ; per mille sign
-    (138 . "S\\v")           ; latin capital letter S with caron
-    (139 . "<")                      ; single left-pointing angle quotation 
mark
-    (140 . "OE")             ; latin capital ligature OE
-    (145 . "`")                      ; left single quotation mark
-    (146 . "'")                      ; right single quotation mark
-    (147 . "``")             ; left double quotation mark
-    (148 . "''")             ; right double quotation mark
-    (149 . "o")                      ; bullet
-    (150 . "--")             ; en dash
-    (151 . "---")            ; em dash
-    (152 . "~")                      ; small tilde
-    (153 . "(TM)")           ; trade mark sign
-    (154 . "s\\v")           ; latin small letter s with caron
-    (155 . ">")                      ; single right-pointing angle quotation 
mark
-    (156 . "oe")             ; latin small ligature oe
-    (157 . "Y\\..")          ; latin capital letter Y with diaeresis
-    )
-  "Replacement for invalid SGML characters")
-
 (defun w3-display-parse-tree (&optional ptree)
   (interactive)
   (with-output-to-temp-buffer "W3 HTML Parse Tree"
@@ -1923,10 +1951,11 @@ skip-chars-forward."
 (defalias 'w3-preparse-buffer 'w3-parse-buffer)
 
 (defcustom w3-parse-hooks nil
+  "*List of hooks to be run before parsing."
   :type 'hook
   :group 'w3-display
-  :options '(w3-parse-munge-ethiopic-text)
-  "*List of hooks to be run before parsing.")
+  :options '(w3-parse-munge-ethiopic-text) ; too exotic for a default
+  )
 
 (defun w3-parse-munge-ethiopic-text ()
   "Treat marked-up regions using `ethio-sera-to-fidel-marker'.

commit 375ab7d68dcb2e38651ac1d06d173e6d1bc5cbd7
Author: Dave Love <address@hidden>
Date:   Tue May 15 11:06:03 2001 +0000

    (w3-sysdp): Require.
    (flatten): Autoload unconditionally.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index f5d8145..69a45d1 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,6 +1,6 @@
 ;;; w3-display.el --- W3 display engine
 ;; Author: William M. Perry <address@hidden>
-;; Version: $Revision: 1.26 $
+;; Version: $Revision: 1.27 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -34,11 +34,12 @@
 (require 'mailcap)
 (require 'w3-widget)
 (require 'w3-imap)
+(require 'w3-sysdp)
 
 (autoload 'sentence-ify "flame")
 (autoload 'string-ify "flame")
 (autoload '*flame "flame")
-(if (not (fboundp 'flatten)) (autoload 'flatten "flame"))
+(autoload 'flatten "flame")
 (defvar w3-cookie-cache nil)
 
 (defmacro w3-d-s-var-def (var)

commit 60d84b183120f44c51cea84f5cc30c3c15323b66
Author: Dave Love <address@hidden>
Date:   Mon May 14 17:51:15 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index b4beb84..1c07f4e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,69 @@
+2001-05-14  Dave Love  <address@hidden>
+
+       * lisp/w3-sysdp.el: Don't define extent-related functions, to
+       avoid trouble with other packages.
+
+       * lisp/w3.el: Don't require mule-sysdp.
+       (w3-decode-charset): Remove prompting stuff.  Avoid
+       gnus-strip-whitespace.  Use mm-charset-to-coding-system and return
+       coding system used.
+       (w3-fetch-callback): Bind and set mule-retrieval-coding-system.
+       Call mm-enable-multibyte.
+       (w3-widget-button-click): Add Emacs case.
+       (w3-warn): Wrap definition in eval-and-compile.
+
+       * lisp/w3-imap.el: Use new backquote syntax.
+       (w3-image-invalid-glyph-p): Test for Emacs images.
+
+       * lisp/w3-widget.el: Use (featurep 'xemacs).  Use modern backquote
+       syntax.
+       (widget): Don't require cl.
+       (w3-vars): Require.
+       (w3-point-in-map, w3-point-in-map): Autoload.
+       (widget-image-value-set): Add Emacs 21 image test.
+       (widget-image-usemap): Avoid a string-match.
+       (widget-image-value-create): Use align property.  Fix call of
+       image-type-available-p.  Some simplification.  Use `insert-image'
+       in Emacs.
+       (widget-image-delete): Maybe use delete-overlay.
+       (widget-glyphp): Test for Emacs image.
+       (widget-image-button-press): Add code for Emacs.
+
+       * lisp/w3-display.el: Use (featurep 'xemacs), not
+       w3-running-xemacs.  Use modern backquote syntax.
+       (w3-maybe-start-image-download): Use display-graphic-p.  Don't use
+       make-glyph in Emacs.
+       (w3-maybe-start-background-image-download): Fix typo `mesage'.
+       Don't use make-glyph in Emacs.
+       (w3-finalize-image-download): For Emacs, grok `align' attribute.
+       Use unibyte for image data in Emacs.  Only do xbm stuff in XEmacs.
+       Don't do make-glyph by default.  Only call set-glyph-image if it's
+       defined.
+       (w3-handle-image): Use `align'.
+       (w3-dingbats): Define without using mule-sysdep-version.
+       (w3-make-char): Likewise.
+       (w3-display-node): Minor logic simplification.
+
+       * lisp/w3-menu.el (cl): Require cl when compiling.  Use (featurep
+       'xemacs), not w3-running-xemacs.
+       (w3-menu-file-menu): Allow ---:shadowDoubleEtchedIn in Emacs 21.
+       (w3-menu-options-menu): Comment-out `download to disk'
+       (w3-dump-to-disk not defined).
+
+       * lisp/w3-parse.el (url-expand-file-name): Autoload.
+       (cl): Require when compiling.
+       (w3-invalid-sgml-char-replacement): Defvar when compiling.
+       (w3-parse-munge-ethiopic-text): Don't bother supporting MULE 2.
+       (w3-parse-hooks): Customize.  Default to nil, with
+       w3-parse-munge-ethiopic-text as an option.
+
+       * lisp/w3-dired.el (w3-dired-find-file-mouse): Use mouse-set-point.
+       (dired-get-filename): Autoload.
+       (w3-dired-find-file-dired): New function, renamed from second
+       occurrence of w3-dired-find-file.
+
+       * lisp/w3-hot.el (cl): Require when compiling.
+
 2001-05-10  Dave Love  <address@hidden>
 
        * lisp/w3-menu.el (w3-menu-go-menu): Use url-history-track, not

commit 9a46fc624380031f7ebd3b97b9a675a555d3c64c
Author: Dave Love <address@hidden>
Date:   Mon May 14 17:51:05 2001 +0000

    Don't define extent-related functions, to
    avoid trouble with other packages.

diff --git a/lisp/w3-sysdp.el b/lisp/w3-sysdp.el
index 7656f62..de8b099 100644
--- a/lisp/w3-sysdp.el
+++ b/lisp/w3-sysdp.el
@@ -6,6 +6,14 @@
 ;; Keywords: lisp, tools
 ;; Version: 0.003
 
+
+;; This stuff should go.  We don't have papers for it and it's not
+;; good practice to define things like this.  It tends to screw other
+;; packages that do feature tests with fboundp.  Compare what Gnus
+;; does.  (A lot of it's probably irrelevant anyhow, especially as
+;; depending on Gnus MIME stuff means dropping support for old
+;; Emacsen.)  -- fx
+
 ;; The purpose of this file is to eliminate the cruftiness that
 ;; would otherwise be required of packages that want to run on multiple
 ;; versions of Emacs.  The idea is that we make it look like we're running
@@ -351,7 +359,7 @@ The PLIST is modified by side effects."
 (sysdep-defun plist-get (plist prop)
   "Extract a value from a property list.
 PLIST is a property list, which is a list of the form
-(PROP1 VALUE1 PROP2 VALUE2...).  This function returns the value
+\(PROP1 VALUE1 PROP2 VALUE2...).  This function returns the value
 corresponding to the given PROP, or nil if PROP is not
 one of the properties on the list."
   (while (and plist (not (eq (car plist) prop)))
@@ -359,32 +367,32 @@ one of the properties on the list."
   (and plist (car (cdr plist))))
 
 ;; Extent stuff
-(sysdep-defalias 'delete-extent 'delete-overlay)
-(sysdep-defalias 'extent-end-position 'overlay-end)
-(sysdep-defalias 'extent-start-position 'overlay-start)
-(sysdep-defalias 'set-extent-endpoints 'move-overlay)
-(sysdep-defalias 'set-extent-property 'overlay-put)
-(sysdep-defalias 'make-extent 'make-overlay)
-
-(sysdep-defun extent-property (extent property &optional default)
-  (or (overlay-get extent property) default))
-
-(sysdep-defun extent-at (pos &optional object property before at-flag)
-  (let ((tmp (overlays-at (point)))
-       ovls)
-    (if property
-       (while tmp
-         (if (extent-property (car tmp) property)
-             (setq ovls (cons (car tmp) ovls)))
-         (setq tmp (cdr tmp)))
-      (setq ovls tmp
-           tmp nil))
-    (car-safe
-     (sort ovls
-          (function
-           (lambda (a b)
-             (< (- (extent-end-position a) (extent-start-position a))
-                (- (extent-end-position b) (extent-start-position b)))))))))
+;; (sysdep-defalias 'delete-extent 'delete-overlay)
+;; (sysdep-defalias 'extent-end-position 'overlay-end)
+;; (sysdep-defalias 'extent-start-position 'overlay-start)
+;; (sysdep-defalias 'set-extent-endpoints 'move-overlay)
+;; (sysdep-defalias 'set-extent-property 'overlay-put)
+;; (sysdep-defalias 'make-extent 'make-overlay)
+
+;; (sysdep-defun extent-property (extent property &optional default)
+;;   (or (overlay-get extent property) default))
+
+;; (sysdep-defun extent-at (pos &optional object property before at-flag)
+;;   (let ((tmp (overlays-at (point)))
+;;     ovls)
+;;     (if property
+;;     (while tmp
+;;       (if (extent-property (car tmp) property)
+;;           (setq ovls (cons (car tmp) ovls)))
+;;       (setq tmp (cdr tmp)))
+;;       (setq ovls tmp
+;;         tmp nil))
+;;     (car-safe
+;;      (sort ovls
+;;        (function
+;;         (lambda (a b)
+;;           (< (- (extent-end-position a) (extent-start-position a))
+;;              (- (extent-end-position b) (extent-start-position b)))))))))
 
 (sysdep-defun overlays-in (beg end)
   "Return a list of the overlays that overlap the region BEG ... END.
@@ -409,24 +417,24 @@ or between BEG and END."
          (setq retval (cons tmp retval))))
     retval))
 
-(sysdep-defun map-extents (function &optional object from to
-                                   maparg flags property value)
-  (let ((tmp (overlays-in (or from (point-min))
-                         (or to (point-max))))
-       ovls)
-    (if property
-       (while tmp
-         (if (extent-property (car tmp) property)
-             (setq ovls (cons (car tmp) ovls)))
-         (setq tmp (cdr tmp)))
-      (setq ovls tmp
-           tmp nil))
-    (catch 'done
-      (while ovls
-       (setq tmp (funcall function (car ovls) maparg)
-             ovls (cdr ovls))
-       (if tmp
-           (throw 'done tmp))))))
+;; (sysdep-defun map-extents (function &optional object from to
+;;                                 maparg flags property value)
+;;   (let ((tmp (overlays-in (or from (point-min))
+;;                       (or to (point-max))))
+;;     ovls)
+;;     (if property
+;;     (while tmp
+;;       (if (extent-property (car tmp) property)
+;;           (setq ovls (cons (car tmp) ovls)))
+;;       (setq tmp (cdr tmp)))
+;;       (setq ovls tmp
+;;         tmp nil))
+;;     (catch 'done
+;;       (while ovls
+;;     (setq tmp (funcall function (car ovls) maparg)
+;;           ovls (cdr ovls))
+;;     (if tmp
+;;         (throw 'done tmp))))))
 
 ;; misc
 (sysdep-defalias 'make-local-hook 'make-local-variable)

commit 59734baca96eee9472194124e4a7dfa890ebe840
Author: Dave Love <address@hidden>
Date:   Mon May 14 17:45:50 2001 +0000

    Don't require mule-sysdp.
    (w3-decode-charset): Remove prompting stuff.  Avoid
    gnus-strip-whitespace.  Use mm-charset-to-coding-system and return
    coding system used.
    (w3-fetch-callback): Bind and set mule-retrieval-coding-system.
    Call mm-enable-multibyte.
    (w3-widget-button-click): Add Emacs case.
    (w3-warn): Wrap definition in eval-and-compile.

diff --git a/lisp/w3.el b/lisp/w3.el
index 6374156..9a0b24e 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: fx $
-;; Created: $Date: 2000/12/20 20:45:02 $
-;; Version: $Revision: 1.16 $
+;; Created: $Date: 2001/05/14 17:45:50 $
+;; Version: $Revision: 1.17 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -35,7 +35,6 @@
 
 (require 'w3-sysdp)
 (require 'w3-cfg)
-(require 'mule-sysdp)
 (require 'widget)
 
 (or (featurep 'efs)
@@ -146,39 +145,43 @@ hypertext document."
                    (url-get-url-at-point))))
     url))
 
-(defun w3-decode-charset (&optional prompt)
-  "Decode charset-encoded text in the article.
-If PROMPT (the prefix), prompt for a coding system to use."
+(defun w3-decode-charset ()
+  "Decode charset-encoded text in the document.
+Return the coding system used for the decoding."
   (interactive "P")
-  (save-excursion
-    (mail-narrow-to-head)
-    (let* ((inhibit-point-motion-hooks t)
-          (case-fold-search t)
-          (ct (mail-fetch-field "Content-Type" t))
-          (cte (mail-fetch-field "Content-Transfer-Encoding" t))
-          (ctl (and ct (ignore-errors
-                         (mail-header-parse-content-type ct))))
-          (charset (cond
-                    (prompt
-                     (mm-read-coding-system "Charset to decode: "))
-                    (ctl
-                     (mail-content-type-get ctl 'charset))))
-          (mail-parse-charset 'iso-8859-1) ; Always true for HTTP, right?
-          (mail-parse-ignored-charsets nil)
-          buffer-read-only)
-      (if (and ctl (not (string-match "/" (car ctl)))) 
-         (setq ctl nil))
-      (goto-char (point-max))
-      (widen)
-      (forward-line 1)
-      (narrow-to-region (point) (point-max))
-      (when (and (or (not ctl)
-                    (equal (car ctl) "text/plain")))
-       (mm-decode-body
-        charset (and cte (intern (downcase
-                                  (gnus-strip-whitespace cte))))
-        (car ctl))))
-    (widen)))
+  (let (coding-system)
+    (save-excursion
+      (mail-narrow-to-head)
+      (let* ((inhibit-point-motion-hooks t)
+            (case-fold-search t)
+            (ct (mail-fetch-field "Content-Type" t))
+            (cte (mail-fetch-field "Content-Transfer-Encoding" t))
+            (ctl (and ct (ignore-errors
+                          (mail-header-parse-content-type ct))))
+            (charset (if ctl
+                         (mail-content-type-get ctl 'charset)))
+            (mail-parse-charset 'iso-8859-1) ; Always true for HTTP, right?
+            (mail-parse-ignored-charsets nil)
+            buffer-read-only)
+       (setq coding-system
+             (and charset
+                  (mm-charset-to-coding-system (intern (downcase charset)))))
+       (if (and ctl (not (string-match "/" (car ctl)))) 
+           (setq ctl nil))
+       (goto-char (point-max))
+       (widen)
+       (forward-line 1)
+       (narrow-to-region (point) (point-max))
+       (when (and (or (not ctl)
+                      (equal (car ctl) "text/plain")))
+         (mm-decode-body
+          charset (and cte
+                       (intern (downcase
+                                (while (string-match "[\r\n\t ]+" cte)
+                                  (setq cte (replace-match "" t t cte))))))
+          (car ctl))))
+      (widen))
+    coding-system))
 
 (defun w3-nasty-disgusting-http-equiv-handling (&optional buffer)
   (let ((content-type nil)
@@ -211,9 +214,12 @@ If PROMPT (the prefix), prompt for a coding system to use."
 (defun w3-fetch-callback (url)
   (w3-nasty-disgusting-http-equiv-handling)
   (let ((handle (mm-dissect-buffer t))
-       (buff nil))
+       (buff nil)
+       mule-retrieval-coding-system)
     (message "Downloading of `%s' complete." url)
-    (w3-decode-charset)
+    (setq mule-retrieval-coding-system
+         (mm-charset-to-coding-system (w3-decode-charset)))
+    (mm-enable-multibyte)
     (url-mark-buffer-as-dead (current-buffer))
     (cond
      ((equal (car-safe (mm-handle-type handle)) "text/html")
@@ -524,14 +530,19 @@ under point."
 
 (defun w3-widget-button-click (e)
   (interactive "@e")
-  (cond
-   ((and (event-point e)
-        (widget-at (event-point e)))
-    (widget-button-click e))
-   ((and (fboundp 'event-glyph)
-        (event-glyph e)
-        (glyph-property (event-glyph e) 'widget))
-    (widget-button-click e))))
+  (if (featurep 'xemacs)
+      (cond
+       ((and (event-point e)
+            (widget-at (event-point e)))
+       (widget-button-click e))
+       ((and (fboundp 'event-glyph)
+            (event-glyph e)
+            (glyph-property (event-glyph e) 'widget))
+       (widget-button-click e)))
+    (save-excursion
+      (mouse-set-point e)
+      (if (widget-at (point))
+         (widget-button-click e)))))
    
 ;;;###autoload
 (defun w3-maybe-follow-link-mouse (e)
@@ -639,6 +650,7 @@ and convert newlines into spaces."
             ((and (equal "HTML Source" format) under)
              (setq content-type (concat "text/html; charset=" content-charset))
              (let ((url-source t))
+               ;; Fixme: this needs a callback -- which?
                (url-retrieve url)))
             ((equal "HTML Source" format)
              (setq content-type (concat "text/html; charset=" content-charset))
@@ -647,6 +659,7 @@ and convert newlines into spaces."
                    (set-buffer (get-buffer-create url-working-buffer))
                    (erase-buffer)
                    (insert x))
+               ;; Fixme: this needs a callback -- which?
                (url-retrieve url)))
             ((and under (equal "PostScript" format))
              (setq content-type "application/postscript")
@@ -690,6 +703,7 @@ and convert newlines into spaces."
                   (search-forward "<html>" nil t))
               (insert "\n"))
            (insert (format "<base href=\"%s\">" url))))
+    ;; Fixme: not defined.
     (mail-to)))
 
 (defun w3-internal-use-history (hist-item)
@@ -719,6 +733,7 @@ and convert newlines into spaces."
          (progn
            (goto-char (point-min))
            (w3-find-specific-link (substring url 1 nil)))))
+     ;; Fixme: url-maybe-relative not defined.
      (url (url-maybe-relative url))            ; Get the link
      (t (message "Couldn't understand whats in the history.")))))
 
@@ -1498,26 +1513,27 @@ No arg means whole window full.  Arg is number of lines 
to scroll."
       (setq x (cdr x))))
   (message "Cleaning up w3 storage... done."))
 
-(cond
- ((fboundp 'display-warning)
-  (fset 'w3-warn 'display-warning))
- ((fboundp 'warn)
-  (defun w3-warn (class message &optional level)
-    (if (and (eq class 'html)
-            (not w3-debug-html))
-       nil
-      (warn "(%s/%s) %s" class (or level 'warning) message))))
- (t
-  (defun w3-warn (class message &optional level)
-    (if (and (eq class 'html)
-            (not w3-debug-html))
-       nil
-      (save-excursion
-       (set-buffer (get-buffer-create "*W3-WARNINGS*"))
-       (goto-char (point-max))
+(eval-and-compile
+  (cond
+   ((fboundp 'display-warning)
+    (fset 'w3-warn 'display-warning))
+   ((fboundp 'warn)
+    (defun w3-warn (class message &optional level)
+      (if (and (eq class 'html)
+              (not w3-debug-html))
+         nil
+       (warn "(%s/%s) %s" class (or level 'warning) message))))
+   (t
+    (defun w3-warn (class message &optional level)
+      (if (and (eq class 'html)
+              (not w3-debug-html))
+         nil
        (save-excursion
-         (insert (format "(%s/%s) %s\n" class (or level 'warning) message)))
-       (display-buffer (current-buffer)))))))
+         (set-buffer (get-buffer-create "*W3-WARNINGS*"))
+         (goto-char (point-max))
+         (save-excursion
+           (insert (format "(%s/%s) %s\n" class (or level 'warning) message)))
+         (display-buffer (current-buffer))))))))
 
 (defun w3-map-links (function &optional buffer from to maparg)
   "Map FUNCTION over the hypertext links which overlap region in BUFFER,

commit 44cfc6bbef945d453498942559d1f5d390b6050c
Author: Dave Love <address@hidden>
Date:   Mon May 14 17:37:18 2001 +0000

    (url-expand-file-name): Autoload.
    (cl): Require when compiling.
    (w3-invalid-sgml-char-replacement): Defvar when compiling.
    (w3-parse-munge-ethiopic-text): Don't bother supporting MULE 2.
    (w3-parse-hooks): Customize.  Default to nil, with
    w3-parse-munge-ethiopic-text as an option.

diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index d8e33cb..42d8a55 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -1,7 +1,7 @@
-;; Created by: Joe Wells, address@hidden
+;;; w3-parse.el --- Parse HTML and/or SGML for Emacs W3 browser
+
+;; Author: Joe Wells <address@hidden>
 ;; Created on: Sat Sep 30 17:25:40 1995
-;; Filename: w3-parse.el
-;; Purpose: Parse HTML and/or SGML for Emacs W3 browser.
 
 ;; Copyright © 1995, 1996, 1997  Joseph Brian Wells
 ;; Copyright © 1993, 1994, 1995 by William M. Perry <address@hidden>
@@ -20,10 +20,6 @@
 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 ;; Boston, MA 02111-1307, USA.
-;;
-;; On November 13, 1995, the license was available at
-;; <URL:ftp://prep.ai.mit.edu/pub/gnu/COPYING-2.0>.  It may still be
-;; obtainable via that URL.
 
 
 ;;;
@@ -61,6 +57,9 @@
 (require 'url-parse)
 (require 'url-history)
 (require 'mule-sysdp)
+(autoload 'url-expand-file-name "url-expand")
+
+(eval-when-compile (require 'cl))
 
 (eval-when-compile
   (defconst w3-p-s-var-list nil
@@ -294,6 +293,7 @@ which must be a string to use as the error message."
 ;; & should only be recognized when followed by letter or # and
 ;; digit or # and letter.
 
+(eval-when-compile (defvar w3-invalid-sgml-char-replacement))
 (eval-when-compile
 
   (w3-p-s-var-def w3-p-s-entity)
@@ -1922,23 +1922,19 @@ skip-chars-forward."
 ;; For compatibility with the old parser interface.
 (defalias 'w3-preparse-buffer 'w3-parse-buffer)
 
-(defvar w3-parse-hooks '(w3-parse-munge-ethiopic-text)
+(defcustom w3-parse-hooks nil
+  :type 'hook
+  :group 'w3-display
+  :options '(w3-parse-munge-ethiopic-text)
   "*List of hooks to be run before parsing.")
 
 (defun w3-parse-munge-ethiopic-text ()
-  ;; This is for ethiopic text.  Unfortunately, old MULE and new MULE conflict
-  ;; on what exactly to call this function.
-  (condition-case ()
-      (let ((sera-being-called-by-w3 t))
-        (case mule-sysdep-version
-          (2.4
-           (sera-to-fidel-marker))
-          ((xemacs 3.0)
-           (ethio-sera-to-fidel-marker))
-          (4.0
-           (when default-enable-multibyte-characters
-             (ethio-sera-to-fidel-marker)))))
-    (error nil)))
+  "Treat marked-up regions using `ethio-sera-to-fidel-marker'.
+Do nothing in non-Mule or unibyte session."
+  (when (and (featurep 'mule)
+             (boundp 'default-enable-multibyte-characters)
+             default-enable-multibyte-characters)
+    (ethio-sera-to-fidel-marker)))
 
 (if (fboundp 'char-int)
     (defalias 'w3-char-int 'char-int)

commit b6f4ae6e9e1a84d12d7583060b2a10a0dd609648
Author: Dave Love <address@hidden>
Date:   Mon May 14 17:29:25 2001 +0000

    Use new backquote syntax.
    (w3-image-invalid-glyph-p): Test for Emacs images.

diff --git a/lisp/w3-imap.el b/lisp/w3-imap.el
index efa6c1f..893f9da 100644
--- a/lisp/w3-imap.el
+++ b/lisp/w3-imap.el
@@ -1,7 +1,7 @@
 ;;; w3-imap.el --- Imagemap functions
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:36:07 $
-;; Version: $Revision: 1.2 $
+;; Author: $Author: fx $
+;; Created: $Date: 2001/05/14 17:29:25 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -206,7 +206,7 @@ vectors."
 
 (defmacro w3-image-cached-p (href)
   "Return non-nil iff HREF is in the image cache."
-  (` (cdr-safe (assoc (, href) w3-graphics-list))))
+  `(cdr-safe (assoc ,href w3-graphics-list)))
 
 (defun w3-image-loadable-p (href force)
   (let ((attribs (url-file-attributes href)))
@@ -218,9 +218,12 @@ vectors."
             (<= (nth 7 attribs) w3-image-size-restriction)))))
 
 (defmacro w3-image-invalid-glyph-p (glyph)
-  (` (or (null (aref (, glyph) 0))
-        (null (aref (, glyph) 2))
-        (equal (aref (, glyph) 2) ""))))
+  `(if (vectorp glyph)
+       (progn
+        (or (null (aref ,glyph 0))
+            (null (aref ,glyph 2))
+            (equal (aref ,glyph 2) "")))
+     (not (eq 'image (car-safe glyph)))))
 
 ;; data structure in storage is a vector
 ;; if (href == t) then no action should be taken

commit 117680bdf704a92133797027d0fc70d34d6b1c8b
Author: Dave Love <address@hidden>
Date:   Mon May 14 17:27:57 2001 +0000

    Use (featurep 'xemacs).  Use modern backquote
    syntax.
    (widget): Don't require cl.
    (w3-vars): Require.
    (w3-point-in-map, w3-point-in-map): Autoload.
    (widget-image-value-set): Add Emacs 21 image test.
    (widget-image-usemap): Avoid a string-match.
    (widget-image-value-create): Use align property.  Fix call of
    image-type-available-p.  Some simplification.  Use `insert-image'
    in Emacs.
    (widget-image-delete): Maybe use delete-overlay.
    (widget-glyphp): Test for Emacs image.
    (widget-image-button-press): Add code for Emacs.

diff --git a/lisp/w3-widget.el b/lisp/w3-widget.el
index 2296e9a..cc20ae4 100644
--- a/lisp/w3-widget.el
+++ b/lisp/w3-widget.el
@@ -1,7 +1,7 @@
 ;;; w3-widget.el --- An image widget
-;; Author: $Author: fx $
-;; Created: $Date: 2000/12/20 20:48:08 $
-;; Version: $Revision: 1.5 $
+;; Author: ll Perry <address@hidden>$Author: fx $
+;; Created: $Date: 2001/05/14 17:27:57 $
+;; Version: $Revision: 1.6 $
 ;; Keywords: faces, images
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -50,9 +50,11 @@
 ;;;    These are either URLs (http://foo/...) or alternative text.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(require 'cl)
 (require 'widget)
 (require 'url-util)
+(require 'w3-vars)
+(autoload 'w3-fetch "w3")
+(autoload 'w3-point-in-map "w3-imap")
 
 (defvar widget-image-keymap (make-sparse-keymap)
   "Keymap used over glyphs in an image widget")
@@ -61,7 +63,7 @@
 (defconst widget-mouse-button2 nil)
 (defconst widget-mouse-button3 nil)
 
-(if (string-match "XEmacs" (emacs-version))
+(if (featurep 'xemacs)
     (if (featurep 'mouse)
        (setq widget-mouse-button1 'button1
              widget-mouse-button2 'button2
@@ -127,7 +129,8 @@
   ;; Recreate widget with new value.
   (save-excursion
     (widget-image-delete widget)
-    (if (widget-glyphp value)
+    (if (or (eq 'image (car-safe value)) ; Emacs 21
+           (widget-glyphp value))
        (widget-put widget 'glyph value)
       (widget-put widget :value value))
     (put-text-property (point)
@@ -141,7 +144,7 @@
   (let ((usemap (widget-get widget 'usemap)))
     (if (listp usemap)
        usemap
-      (if (and usemap (string-match "^#" usemap))
+      (if (and usemap (> (length usemap) 0) (eq ?# (aref usemap 0)))
          (setq usemap (substring usemap 1 nil)))
       (cdr-safe (assoc usemap w3-imagemaps)))))
 
@@ -150,19 +153,18 @@
       (w3-fetch (widget-get widget :href) (widget-get widget :target))))
 
 (defmacro widget-image-create-subwidget (&rest args)
-  (` (widget-create (,@ args)
-                   :parent widget
-                   :help-echo 'widget-image-summarize
-                   'usemap (widget-get widget 'usemap)
-                   :href href
-                   :target target
-                   :src (widget-get widget :src)
-                   'ismap server-map)))
+  `(widget-create ,@args
+                 :parent widget
+                 :help-echo 'widget-image-summarize
+                 'usemap (widget-get widget 'usemap)
+                 :href href
+                 :target target
+                 :src (widget-get widget :src)
+                 'ismap server-map))
 
 (defun widget-image-value-create (widget)
   ;; Insert the printed representation of the value
-  (let (
-       (href (widget-get widget :href))
+  (let ((href (widget-get widget :href))
        (target (widget-get widget :target))
        (face (widget-get widget :button-face))
        (server-map (widget-get widget 'ismap))
@@ -170,9 +172,9 @@
        (where (or (widget-get widget 'where) (point)))
        (glyph (widget-get widget 'glyph))
        (alt (widget-get widget 'alt))
+       (align (widget-get widget 'align))
        (real-widget nil)
-       (invalid-glyph nil)
-       )
+       (invalid-glyph nil))
     (if target (setq target (intern (downcase target))))
 
     ;; Specifier-instance will signal an error if we have an invalid
@@ -180,7 +182,7 @@
     ;; data back from a URL somewhere.
 
     (cond
-     (w3-running-xemacs
+     ((featurep 'xemacs)
       ;; All XEmacsen have support for glyphs
       (setq invalid-glyph (and glyph (condition-case ()
                                         (if (fboundp 'specifier-instance)
@@ -194,9 +196,7 @@
       (require 'image)
       (setq invalid-glyph
            (and glyph
-                (not (image-type-available-p (plist-get glyph :type))))))
-     (t
-      nil))
+                (not (image-type-available-p (plist-get (cdr glyph) 
:type)))))))
 
     (if (or (not glyph) invalid-glyph)
        ;; Do a TTY or delayed image version of the image.
@@ -207,18 +207,17 @@
           (client-map
            (let* ((default nil)
                   (options (mapcar
-                            (function
-                             (lambda (x)
-                               (if (eq (aref x 0) 'default)
-                                   (setq default (aref x 2)))
-                               (if (and (not default) (stringp (aref x 2)))
-                                   (setq default (aref x 2)))
-                               (list 'choice-item
-                                     :tab-order -1
-                                     :delete 'widget-default-delete
-                                     :format "%[%t%]"
-                                     :tag (or (aref x 3) (aref x 2))
-                                     :value (aref x 2)))) client-map)))
+                            (lambda (x)
+                              (if (eq (aref x 0) 'default)
+                                  (setq default (aref x 2)))
+                              (if (and (not default) (stringp (aref x 2)))
+                                  (setq default (aref x 2)))
+                              (list 'choice-item
+                                    :tab-order -1
+                                    :delete 'widget-default-delete
+                                    :format "%[%t%]"
+                                    :tag (or (aref x 3) (aref x 2))
+                                    :value (aref x 2))) client-map)))
              (setq real-widget
                    (apply 'widget-create 'menu-choice
                           :tag (or (widget-get widget :tag) alt "Imagemap")
@@ -262,33 +261,45 @@
                   :delete 'widget-default-delete
                   :action (widget-get widget :action)
                   :notify 'widget-image-callback))))
-         (if (not real-widget)
-             nil
-           (widget-put widget :children (list real-widget))))
+         (if real-widget
+             (widget-put widget :children (list real-widget))))
       ;;; Actually use the image
-      (let ((extent (or (widget-get widget 'extent)
-                       (make-extent where where))))
-       (set-extent-endpoints extent where where)
-       (widget-put widget 'extent extent)
-       (widget-put widget :children nil)
-       (set-extent-property extent 'keymap widget-image-keymap)
-       (set-extent-property extent 'begin-glyph glyph)
-       (set-extent-property extent 'detachable t)
-       (set-extent-property extent 'help-echo (cond
-                                               ((and href (or client-map
-                                                              server-map))
-                                                (format "%s [map]" href))
-                                               (href href)
-                                               (t nil)))
-       (set-glyph-property glyph 'widget widget)))))
+      (if (featurep 'xemacs)
+         (let ((extent (or (widget-get widget 'extent)
+                           (make-extent where where))))
+           (set-extent-endpoints extent where where)
+           (widget-put widget 'extent extent)
+           (widget-put widget :children nil)
+           (set-extent-property extent 'keymap widget-image-keymap)
+           (set-extent-property extent 'begin-glyph glyph)
+           (set-extent-property extent 'detachable t)
+           (set-extent-property extent 'help-echo
+                                (cond
+                                 ((and href (or client-map
+                                                server-map))
+                                  (format "%s [map]" href))
+                                 (href href)
+                                 (t nil)))
+           (set-glyph-property glyph 'widget widget))
+       
+      (insert-image glyph
+                   (propertize " "
+                               'keymap widget-image-keymap
+                               'help-echo (cond
+                                           ((and href (or client-map
+                                                          server-map))
+                                            (format "%s [map]" href))
+                                           (href href))))))))
 
 (defun widget-image-delete (widget)
-  ;; Remove the widget from the buffer
+  "Remove WIDGET from the buffer."
   (let ((extent (widget-get widget 'extent))
        (child  (car (widget-get widget :children))))
     (cond
      (extent                           ; Remove a glyph
-      (delete-extent extent))
+      (if (fboundp 'delete-extent)
+         (delete-extent extent)
+       (delete-overlay extent)))
      (child                            ; Remove a child widget
       (widget-apply child :delete))
      (t                                        ; Doh!  Do nothing.
@@ -303,15 +314,21 @@
   (defalias 'widget-glyphp 'glyphp))
  ((boundp 'image-types)
   (defun widget-glyphp (glyph)
-    (and (listp glyph) (plist-get glyph :type))))
+    (and (listp glyph) (eq 'image (car glyph)))))
  (t
   (defalias 'widget-glyphp 'ignore)))
 
 (defun widget-image-button-press (event)
   (interactive "@e")
-  (let* ((glyph (and event (widget-mouse-event-p event) (event-glyph event)))
-        (widget (and glyph (glyph-property glyph 'widget))))
-    (widget-image-notify widget widget event)))    
+  (if (featurep 'xemacs)
+      (let* ((glyph (and event (widget-mouse-event-p event)
+                        (event-glyph event)))
+            (widget (and glyph (glyph-property glyph 'widget))))
+       (widget-image-notify widget widget event))
+    (save-excursion
+      (mouse-set-point event)
+      (let ((widget (widget-at (point))))
+       (widget-image-notify widget widget event)))))    
 
 (defun widget-image-usemap-default (usemap)
   (let ((rval (and usemap (car usemap))))
@@ -376,11 +393,11 @@ Any other value means ask the user each time.")
      ((and glyph x y ismap)            ; Do the server-side imagemap stuff
       (w3-fetch (format "%s?%d,%d" href x y) target))
      (usemap                           ; Dumbed-down tty client side imap
-      (let ((choices (mapcar (function
-                             (lambda (entry)
-                               (cons
-                                (or (aref entry 3) (aref entry 2))
-                                (aref entry 2)))) usemap))
+      (let ((choices (mapcar (lambda (entry)
+                              (cons
+                               (or (aref entry 3) (aref entry 2))
+                               (aref entry 2)))
+                            usemap))
            (choice nil)
            (case-fold-search t))
        (setq choice (completing-read "Imagemap: " choices nil t)

commit a778293fbaf7c8f63053150adbae289ccf91a3a4
Author: Dave Love <address@hidden>
Date:   Mon May 14 17:16:41 2001 +0000

    Use (featurep 'xemacs), not
    w3-running-xemacs.  Use modern backquote syntax.
    (w3-maybe-start-image-download): Use display-graphic-p.  Don't use
    make-glyph in Emacs.
    (w3-maybe-start-background-image-download): Fix typo `mesage'.
    Don't use make-glyph in Emacs.
    (w3-finalize-image-download): For Emacs, grok `align' attribute.
    Use unibyte for image data in Emacs.  Only do xbm stuff in XEmacs.
    Don't do make-glyph by default.  Only call set-glyph-image if it's
    defined.
    (w3-handle-image): Use `align'.
    (w3-dingbats): Define without using mule-sysdep-version.
    (w3-make-char): Likewise.
    (w3-display-node): Minor logic simplification.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index f54fc3c..f5d8145 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,6 @@
-;;; w3-display.el --- display engine
-;; Author: $Author: fx $
-;; Created: $Date: 2000/12/20 20:51:28 $
-;; Version: $Revision: 1.25 $
+;;; w3-display.el --- W3 display engine
+;; Author: William M. Perry <address@hidden>
+;; Version: $Revision: 1.26 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -43,7 +42,7 @@
 (defvar w3-cookie-cache nil)
 
 (defmacro w3-d-s-var-def (var)
-  (` (make-variable-buffer-local (defvar (, var) nil))))
+  `(make-variable-buffer-local (defvar ,var nil)))
 
 (w3-d-s-var-def w3-display-label-marker)
 (w3-d-s-var-def w3-display-open-element-stack)
@@ -78,24 +77,23 @@
 
 (eval-when-compile
   (defmacro w3-get-attribute (attr)
-    (` (cdr-safe (assq (, attr) args))))
+    `(cdr-safe (assq ,attr args)))
   
   (defmacro w3-get-face-info (info &optional other)
     (let ((var (intern (format "w3-face-%s" info))))
-      (` (push (w3-get-style-info (quote (, info)) node
-                                 (or (and (not w3-user-colors-take-precedence)
-                                          (cdr-safe (assq (quote (, other))
-                                                          (nth 1 node))))
-                                     (car (, var))))
-              (, var)))))
+      `(push (w3-get-style-info (quote ,info) node
+                               (or (and (not w3-user-colors-take-precedence)
+                                        (cdr-safe (assq (quote ,other)
+                                                        (nth 1 node))))
+                                   (car ,var)))
+            ,var)))
 
   (defmacro w3-pop-face-info (info)
     (let ((var (intern (format "w3-face-%s" info))))
-      (` (pop (, var)))))
+      `(pop ,var)))
 
   (defmacro w3-get-all-face-info ()
-    (`
-     (progn
+    `(progn
        (w3-get-face-info font-family)
        ;; This is to handle the 'face' attribute on arbitrary elements
        (if (cdr-safe (assq 'face (nth 1 node)))
@@ -116,11 +114,10 @@
                                :weight (car w3-face-font-weight)
                                :family  (if (not w3-user-fonts-take-precedence)
                                             (car w3-face-font-family))
-                               :size (car w3-face-font-size))))))
+                               :size (car w3-face-font-size)))))
 
   (defmacro w3-pop-all-face-info ()
-    (`
-     (progn
+    `(progn
        (w3-pop-face-info font-family)
        (w3-pop-face-info font-weight)
        (w3-pop-face-info font-variant)
@@ -129,7 +126,7 @@
        (w3-pop-face-info text-decoration)
        (w3-pop-face-info background-image)
        (w3-pop-face-info color)
-       (w3-pop-face-info background-color))))
+       (w3-pop-face-info background-color)))
 
   )
 
@@ -174,7 +171,7 @@
   (save-excursion
     (goto-char (or cur-viewing-pos (point-min)))
     (cond
-     (w3-running-xemacs
+     ((featurep 'xemacs)
       (if (and (not (sit-for 0)) (input-pending-p))
          (condition-case ()
              (let ((buffer-read-only t))
@@ -194,12 +191,12 @@
     (setq cur-viewing-pos (point))))
 
 (defmacro w3-get-pad-string (len)
-  (` (cond
-      ((< (, len) 0)
+  `(cond
+      ((< ,len 0)
        "")
-      ((< (, len) 80)
-       (aref w3-fill-prefixes-vector (, len)))
-      (t (make-string (, len) ? )))))
+      ((< ,len 80)
+       (aref w3-fill-prefixes-vector ,len))
+      (t (make-string ,len ? ))))
 
 (defsubst w3-set-fill-prefix-length (len)
   (setq fill-prefix (if (< len (- (or w3-strict-width (window-width)) 4))
@@ -310,7 +307,7 @@
   (equal foreground background))
 
 (defun w3-get-default-color (backgroundp)
-  (if w3-running-xemacs
+  (if (featurep 'xemacs)
       (or (if backgroundp
              (face-background-name 'default)
            (face-foreground-name 'default))
@@ -376,7 +373,7 @@ If the face already exists, it is unmodified."
 (cond
  ((not (fboundp 'make-face))
   (defalias 'w3-make-face 'ignore))
- (w3-running-xemacs
+ ((featurep 'xemacs)
   (defalias 'w3-make-face 'make-face))
  (t
   (defalias 'w3-make-face 'w3-make-face-emacs19)))
@@ -826,7 +823,9 @@ If the face already exists, it is unmodified."
       (setq w3-image-widgets-waiting (cons widget w3-image-widgets-waiting)))
      ((or w3-delay-image-loads         ; Delaying images
          (and (not (fboundp 'valid-specifier-domain-p)) ; Can't do images 
(XEmacs)
-              (not (boundp 'image-types))) ; Can't do images (Emacs)
+              (if (fboundp 'display-graphic-p)
+                  (not (display-graphic-p))
+                t))                    ; Can't do images (Emacs))
          (eq (device-type) 'tty))      ; Why bother?
       (w3-add-delayed-graphic widget))
      ((not (w3-image-loadable-p src nil)) ; Hey, we can't load it!
@@ -838,15 +837,16 @@ If the face already exists, it is unmodified."
            (url-request-extra-headers nil)
            (url-mime-accept-string (substring
                                     (mapconcat
-                                     (function
-                                      (lambda (x)
-                                        (if x
-                                            (concat (car x) ",")
-                                          "")))
+                                     (lambda (x)
+                                       (if x
+                                           (concat (car x) ",")
+                                         ""))
                                      w3-allowed-image-types "")
                                     0 -1)))
-       (setq w3-graphics-list (cons (cons src (make-glyph))
+       (if (featurep 'xemacs)
+           (setq w3-graphics-list (cons (cons src (make-glyph))
                                     w3-graphics-list))
+         (add-to-list 'w3-graphics-list (cons src (list 'image))))
        (url-retrieve src 'w3-finalize-image-download
                      (list src (widget-get widget 'buffer) widget)))))))
 
@@ -865,7 +865,7 @@ If the face already exists, it is unmodified."
          (eq (device-type) 'tty))      ; Why bother?
       nil)
      ((not (w3-image-loadable-p src nil)) ; Hey, we can't load it!
-      (mesage "Skipping image %s" (url-basepath src t))
+      (message "Skipping image %s" (url-basepath src t))
       nil)
      (t                                        ; Grab the images
       (let ((url-request-method "GET")
@@ -880,27 +880,40 @@ If the face already exists, it is unmodified."
                                           "")))
                                      w3-allowed-image-types "")
                                     0 -1)))
-       (setq w3-graphics-list (cons (cons src (make-glyph))
+       (if (featurep 'xemacs)
+           (setq w3-graphics-list (cons (cons src (make-glyph))
                                     w3-graphics-list))
+         (add-to-list 'w3-graphics-list (cons src (list 'image))))
        (url-retrieve src 'w3-finalize-image-download (list src buf 'background 
face)))))))
 
 (defun w3-finalize-image-download (url buffer &optional widget face)
   (let ((glyph nil)
        (node nil)
-       (handle (mm-dissect-buffer t)))
+       (handle (mm-dissect-buffer t))
+       (align (ignore-errors
+                (widget-get widget 'align))))
     (url-mark-buffer-as-dead (current-buffer))
-    (message "Enhancing image...")
-    (with-temp-buffer
-      (mm-insert-part handle)
-      (setq glyph (image-normalize (cdr-safe (assoc (car (mm-handle-type 
handle))
-                                                   w3-image-mappings))
-                                  (buffer-string))))
-    (message "Enhancing image... done")
+    ;;(message "Enhancing image...")
+    (let ((default-enable-multibyte-characters nil))
+      (with-temp-buffer
+       (mm-insert-part handle)
+       (setq glyph 
+             (let ((type (cdr-safe (assoc (car (mm-handle-type handle))
+                                          w3-image-mappings))))
+               (if (fboundp 'image-normalize)
+                   (image-normalize type (buffer-string))
+                 (create-image (buffer-string) type 'data
+                               :ascent (case align
+                                         ((bottom nil) 100)
+                                         (center 'center)
+                                         (top 0))))))))
+    ;;(message "Enhancing image... done")
     (cond
      ((w3-image-invalid-glyph-p glyph)
       (setq glyph nil)
       (message "Reading of %s failed." url))
-     ((eq (aref glyph 0) 'xbm)
+     ((and (featurep 'xemacs)
+          (eq (aref glyph 0) 'xbm))
       (let ((temp-fname (url-generate-unique-filename "%s.xbm")))
        (save-excursion
          (set-buffer (generate-new-buffer " *xbm-garbage*"))
@@ -912,13 +925,13 @@ If the face already exists, it is unmodified."
        (setq glyph (make-glyph (list (cons 'x glyph))))
        (condition-case ()
            (delete-file temp-fname)
-         (error nil))))
-     (t
-      (setq glyph (make-glyph glyph))))
+         (error nil)))))
     (setq node (assoc url w3-graphics-list))
     (cond
      ((and node glyph)
-      (set-glyph-image (cdr node) (glyph-image glyph)))
+      (if (fboundp 'set-glyph-image)
+         (set-glyph-image (cdr node) (glyph-image glyph))
+       (setcdr (cdr node) (cdr glyph))))
      (glyph
       (setq w3-graphics-list (cons (cons url glyph) w3-graphics-list)))
      (t nil))
@@ -929,7 +942,7 @@ If the face already exists, it is unmodified."
          (not (buffer-name buffer)))
       nil)
      ((and (eq widget 'background)
-          w3-running-xemacs)
+          (featurep 'xemacs))
       (set-face-background-pixmap face
                                  (glyph-image-instance glyph)
                                  buffer))
@@ -988,16 +1001,18 @@ If the face already exists, it is unmodified."
      alt)))
 
 (defmacro w3-handle-image ()
-  (`
-   (let* ((height (w3-get-attribute 'height))
+  `(let* ((height (w3-get-attribute 'height))
          (width (w3-get-attribute 'width))
          (src (or (w3-get-attribute 'src) "Error Image"))
          (alt (w3-image-alt src))
          (ismap (and (assq 'ismap args) 'ismap))
          (usemap (w3-get-attribute 'usemap))
          (base (w3-get-attribute 'base))
-         (href (and hyperlink-info (cadr (widget-plist-member (cadr 
hyperlink-info) :href))))
-         (target (and hyperlink-info (cadr (widget-plist-member (cadr 
hyperlink-info) :target))))
+         (href (and hyperlink-info
+                    (cadr (widget-plist-member (cadr hyperlink-info) :href))))
+         (target (and hyperlink-info
+                      (cadr (widget-plist-member (cadr hyperlink-info)
+                                                 :target))))
          (widget nil)
          (align (or (w3-get-attribute 'align)
                     (w3-get-style-info 'vertical-align node)))
@@ -1007,15 +1022,16 @@ If the face already exists, it is unmodified."
        (setq hyperimage-info
             (list (point)
                   (list 'image
-                        :src src          ; Where to load the image from
-                        'alt alt          ; Textual replacement
-                        'ismap ismap      ; Is it a server-side map?
-                        'usemap usemap    ; Is it a client-side map?
-                        :href href        ; Hyperlink destination
-                        :target target    ; target frame
+                        :src src       ; Where to load the image from
+                        'alt alt       ; Textual replacement
+                        'ismap ismap   ; Is it a server-side map?
+                        'usemap usemap ; Is it a client-side map?
+                        :href href     ; Hyperlink destination
+                        :target target ; target frame
                         :button-face face ; img:link or img:visited entry in 
stylesheet
                         'row w3-display-current-row
                         'column w3-display-current-col
+                        'align align
                         )))
        (setq widget (apply (function widget-create) (cadr hyperimage-info)))
        (widget-put widget 'buffer (current-buffer))
@@ -1024,38 +1040,32 @@ If the face already exists, it is unmodified."
           (add-text-properties (widget-get widget :from)
                                (widget-get widget :to)
                                (list 'html-stack 
w3-display-open-element-stack)))
-       (goto-char (point-max))))))
+       (goto-char (point-max)))))
 
 ;; The table handling
 (eval-and-compile
-  (case mule-sysdep-version
-    (xemacs
-     (if (not (find-charset 'w3-dingbats))
-        (make-charset 'w3-dingbats "Dingbats character set for Emacs/W3"
-                      '(registry "" dimension 1 chars 96 final ?:))))
-    ((4.0 3.0 3.1)
-     (if (not (charsetp 'w3-dingbats))
-        (define-charset nil 'w3-dingbats
-          (vector
-           1                           ; dimension
-           96                          ; chars
-           1                           ; width
-           1                           ; direction
-           ?:                          ; iso-final-char
-           0                           ; iso-graphic-plane (whats this?)
-           "dingbats" "emacs/w3-dingbats"
-           "Dingbats character set for Emacs/W3"))))
-    (t
-     nil)))
+  (if (and (featurep 'xemacs)
+          (featurep 'mule)
+          (not (find-charset 'w3-dingbats)))
+      (make-charset 'w3-dingbats "Dingbats character set for Emacs/W3"
+                   '(registry "" dimension 1 chars 96 final ?:))
+    (if (not (charsetp 'w3-dingbats))
+       (define-charset nil 'w3-dingbats
+         (vector
+          1                            ; dimension
+          96                           ; chars
+          1                            ; width
+          1                            ; direction
+          ?:                           ; iso-final-char
+          0                         ; iso-graphic-plane (whats this?)
+          "dingbats" "emacs/w3-dingbats"
+          "Dingbats character set for Emacs/W3")))))
 
 (defun w3-make-char (oct)
-  (case mule-sysdep-version
-    (xemacs 
-     (make-char 'w3-dingbats (if (characterp oct) (char-int oct) oct)))
-    ((4.0 3.0 3.1)
-     (make-char 'w3-dingbats oct))
-    (t
-     oct)))
+  (if (and (featurep 'xemacs)
+          (featurep 'mule))
+      (make-char 'w3-dingbats (if (characterp oct) (char-int oct) oct))
+    (make-char 'w3-dingbats oct)))
 
 (defvar w3-table-ascii-border-chars
   [nil  nil  nil  ?+ nil  ?- ?+ ?- nil ?+ ?| ?| ?+ ?- ?| ?+]
@@ -2012,7 +2022,7 @@ Format: (((image-alt row column) . offset) ...)")
 (defvar w3-display-hackmap nil "Keymap used for hyperlink widgets")
   
 (defun w3-resurrect-hyperlinks ()
-  (if (and (not w3-display-hackmap) w3-running-xemacs)
+  (if (and (not w3-display-hackmap) (featurep 'xemacs))
       (progn
        (setq w3-display-hackmap (make-sparse-keymap))
        (set-keymap-parent w3-display-hackmap widget-button-keymap)
@@ -2104,15 +2114,14 @@ Format: (((image-alt row column) . offset) ...)")
                                 'w3-hyperlink-info (cadr hyperlink-info))))
         (setq hyperlink-info nil))
        (img
-        (if (not hyperimage-info)
-            nil
-          (add-text-properties (car hyperimage-info) (point)
-                               (list
-                                'duplicable t
-                                'start-open t
-                                'end-open t
-                                'rear-nonsticky t
-                                'w3-hyperimage-info (cadr hyperimage-info))))
+        (if hyperimage-info
+            (add-text-properties (car hyperimage-info) (point)
+                                 (list
+                                  'duplicable t
+                                  'start-open t
+                                  'end-open t
+                                  'rear-nonsticky t
+                                  'w3-hyperimage-info (cadr hyperimage-info))))
         (setq hyperimage-info nil))
        ((ol ul dl dir menu)
         (pop w3-display-list-stack))
@@ -2744,7 +2753,7 @@ Format: (((image-alt row column) . offset) ...)")
        (push-mark (point) t)
        (w3-find-specific-link (url-target url-current-object)))
     (goto-char (point-min)))
-  (and (not w3-running-xemacs)
+  (and (not (featurep 'xemacs))
        (not (eq (device-type) 'tty))
        (w3-fixup-eol-faces))
   (message "Drawing... done"))

commit d5ceb4a1ab0f7ba7b8b2b0cbbacb6c06687bf833
Author: Dave Love <address@hidden>
Date:   Mon May 14 16:19:07 2001 +0000

    (w3-dired-find-file-dired): New function, renamed from second
    occurrence of w3-dired-find-file.

diff --git a/lisp/w3-dired.el b/lisp/w3-dired.el
index b4c73a5..6bd7ba0 100644
--- a/lisp/w3-dired.el
+++ b/lisp/w3-dired.el
@@ -1,7 +1,7 @@
-;;; w3-dired.el --- Main functions for Emacs-W3 on all platforms/versions
+;;; w3-dired.el --- W3 Dired minor mode
 ;; Author: Bill Perry <address@hidden>
-;; Created: $Date: 2001/05/14 15:51:07 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 2001/05/14 16:19:07 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -33,6 +33,8 @@
 ;;; (add-hook 'dired-mode-hook 'turn-on-w3-dired)
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+;; Fixme: should we have both this and url-dired?
+
 (autoload 'dired-get-filename "dired")
 
 (defvar w3-dired-minor-mode-map
@@ -97,7 +99,7 @@ Example:  (add-minor-mode 'view-minor-mode \" View\" 
view-mode-map)"
 (add-minor-mode 'w3-dired-minor-mode " W3" w3-dired-minor-mode-map)
 
 ;;;###autoload
-(defun w3-dired-find-file (dir)
+(defun w3-dired-find-file-dired (dir)
   "\"Edit\" directory DIR, but with additional URL-friendly bindings."
   (interactive "DURL Dired (directory): ")
   (find-file dir)

commit d616a099fec42d9e6a28f6079b7d73ac407526f7
Author: Dave Love <address@hidden>
Date:   Mon May 14 15:51:54 2001 +0000

    (cl): Require when compiling.

diff --git a/lisp/w3-hot.el b/lisp/w3-hot.el
index 5ab8bc5..85f65e4 100644
--- a/lisp/w3-hot.el
+++ b/lisp/w3-hot.el
@@ -1,7 +1,7 @@
 ;;; w3-hot.el --- Main functions for emacs-w3 on all platforms/versions
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:36:06 $
-;; Version: $Revision: 1.3 $
+;; Author: $Author: fx $
+;; Created: $Date: 2001/05/14 15:51:54 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -39,6 +39,7 @@
 (require 'w3-vars)
 (require 'w3-parse)
 (require 'url-parse)
+(eval-when-compile (require 'cl))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Hotlist Handling Code

commit cebee82805aded04265091d33a4fbaecc8c1ad69
Author: Dave Love <address@hidden>
Date:   Mon May 14 15:51:07 2001 +0000

    (w3-dired-find-file-mouse): Use mouse-set-point.
    (dired-get-filename): Autoload.

diff --git a/lisp/w3-dired.el b/lisp/w3-dired.el
index a907351..b4c73a5 100644
--- a/lisp/w3-dired.el
+++ b/lisp/w3-dired.el
@@ -1,7 +1,7 @@
 ;;; w3-dired.el --- Main functions for Emacs-W3 on all platforms/versions
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/17 21:55:32 $
-;; Version: $Revision: 1.1 $
+;; Author: Bill Perry <address@hidden>
+;; Created: $Date: 2001/05/14 15:51:07 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -33,6 +33,8 @@
 ;;; (add-hook 'dired-mode-hook 'turn-on-w3-dired)
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+(autoload 'dired-get-filename "dired")
+
 (defvar w3-dired-minor-mode-map
   (let ((map (make-sparse-keymap)))
     (define-key map "b" 'w3-dired-find-file)
@@ -56,10 +58,8 @@
 (defun w3-dired-find-file-mouse (event)
   "In dired, visit the file or directory name you click on, using Emacs-W3."
   (interactive "@e")
-    (if (event-point event)
-       (progn
-         (goto-char (event-point event))
-         (w3-dired-find-file))))
+  (mouse-set-point event)
+  (w3-dired-find-file))
 
 ;;;###autoload
 (defun w3-dired-minor-mode (&optional arg)

commit 59f257f3770f0651f41cff7c6e05cbd93e724873
Author: Dave Love <address@hidden>
Date:   Mon May 14 15:49:46 2001 +0000

    (cl): Require cl when compiling.  Use (featurep
    'xemacs), not w3-running-xemacs.
    (w3-menu-file-menu): Allow ---:shadowDoubleEtchedIn in Emacs 21.
    (w3-menu-options-menu): Comment-out `download to disk'
    (w3-dump-to-disk not defined).

diff --git a/lisp/w3-menu.el b/lisp/w3-menu.el
index bad611d..478e153 100644
--- a/lisp/w3-menu.el
+++ b/lisp/w3-menu.el
@@ -1,7 +1,6 @@
 ;;; w3-menu.el --- Menu functions for emacs-w3
-;; Author: $Author: fx $
-;; Created: $Date: 2001/05/10 18:33:02 $
-;; Version: $Revision: 1.8 $
+;; Author: Bill Perry <address@hidden>
+;; Version: $Revision: 1.9 $
 ;; Keywords: menu, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -29,6 +28,7 @@
 (require 'w3-vars)
 (require 'w3-mouse)
 (require 'widget)
+(eval-when-compile (require 'cl))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; InfoDock stuff
@@ -40,7 +40,7 @@
 ;;; Spiffy new menus (for both Emacs and XEmacs)
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (defvar w3-menu-filters-supported-p
-  (or w3-running-xemacs (and (= emacs-major-version 20)
+  (or (featurep 'xemacs) (and (= emacs-major-version 20)
                             (>= emacs-minor-version 3))))
 
 (defvar w3-menu-fsfemacs-bookmark-menu nil)
@@ -120,7 +120,7 @@ on that platform."
     (concat (substring string 0 w3-max-menu-width) "$")))
 
 (defun w3-menu-dummy-menu (item)
-  (if w3-running-xemacs
+  (if (featurep 'xemacs)
       (list (vector item nil nil))
     (list "Ignored" (vector item nil nil))))
       
@@ -143,6 +143,7 @@ on that platform."
   (let ((links (mapcar 'cdr w3-current-links))
        (menu nil))
     (if links
+       ;; Fixme: delete*, reduce runtime cl dependency.
        (setq links (delete*
                     nil
                     (reduce 'append links)
@@ -198,7 +199,7 @@ on that platform."
 (defun w3-toggle-minibuffer ()
   (interactive)
   (cond
-   (w3-running-xemacs
+   ((featurep 'xemacs)
     (if (equal (frame-property (selected-frame) 'minibuffer) t)
  
        ;; frame has a minibuffer, so remove it
@@ -220,7 +221,7 @@ on that platform."
 (defun w3-toggle-location ()
   (interactive)
   (cond
-   (w3-running-xemacs
+   ((featurep 'xemacs)
     (let ((on (specifier-instance has-modeline-p (selected-window))))
       (set-specifier has-modeline-p (not on) (selected-window))))
    (t nil)))
@@ -229,7 +230,7 @@ on that platform."
   (interactive)
   (cond
    ;; XEmacs style
-   (w3-running-xemacs
+   ((featurep 'xemacs)
     (set-specifier menubar-visible-p (cons (current-buffer)
                                           (not (specifier-instance
                                                 menubar-visible-p)))))
@@ -238,17 +239,17 @@ on that platform."
     (menu-bar-mode (if (w3-menubar-active) -1 1)))))
 
 (defun w3-location-active ()
-  (if w3-running-xemacs
+  (if (featurep 'xemacs)
       (specifier-instance has-modeline-p (selected-window))
     t))
 
 (defun w3-menubar-active ()
-  (if w3-running-xemacs
+  (if (featurep 'xemacs)
       (and (featurep 'menubar) (specifier-instance menubar-visible-p))
     (and (boundp 'menu-bar-mode) menu-bar-mode)))
 
 (defun w3-menu-global-menubar ()
-  (if w3-running-xemacs
+  (if (featurep 'xemacs)
       (default-value 'default-menubar)
     (lookup-key (current-global-map) [menu-bar])))
 
@@ -281,7 +282,7 @@ on that platform."
     ["Formatted Text" (w3-mail-current-document nil "Formatted Text") t]
     ["PostScript" (w3-mail-current-document nil "PostScript") t]
     )
-   (if w3-running-xemacs
+   (if (or (featurep 'xemacs) (>= emacs-major-version 21))
        "---:shadowDoubleEtchedIn"
      "---")
    ["Close" delete-frame (not (eq (next-frame) (selected-frame)))]
@@ -380,15 +381,16 @@ on that platform."
        "---"
        ["Show Menubar" w3-toggle-menubar
         :style toggle :selected (w3-menubar-active)]
-       (if (and w3-running-xemacs (featurep 'toolbar))
+       ;; Fixme: should work in Emacs 21.
+       (if (and (featurep 'xemacs) (featurep 'toolbar))
            ["Show Toolbar" w3-toggle-toolbar
             :style toggle :selected (w3-toolbar-active)]
          ["Show Toolbar" w3-toggle-toolbar nil])
-       (if w3-running-xemacs
+       (if (featurep 'xemacs)
            ["Show Location" w3-toggle-location
             :style toggle :selected (w3-location-active)]
          ["Show Location" w3-toggle-location nil])
-       (if w3-running-xemacs
+       (if (featurep 'xemacs)
            ["Show Status Bar" w3-toggle-minibuffer
             :style toggle
             :selected (eq (frame-property (selected-frame) 'minibuffer) t)
@@ -403,9 +405,9 @@ on that platform."
         :style toggle :selected (not w3-delay-image-loads)]
        ["Flush Image Cache" (setq w3-graphics-list nil) w3-graphics-list]
        "----"
-       ["Download to disk" (setq w3-dump-to-disk (not w3-dump-to-disk))
-        :style toggle :selected w3-dump-to-disk]
-       ["Caching" (setq url-automatic-caching (not url-automatic-caching))
+;;     ["Download to disk" (setq w3-dump-to-disk (not w3-dump-to-disk))
+;;      :style toggle :selected w3-dump-to-disk]
+       ["caching" (setq url-automatic-caching (not url-automatic-caching))
         :style toggle :selected url-automatic-caching]
        ["Use Cache Only"
         (setq url-standalone-mode (not url-standalone-mode))
@@ -433,7 +435,7 @@ on that platform."
   "W3 menu style list.")
 
 (defconst w3-menu-buffer-menu
-  (if w3-running-xemacs
+  (if (featurep 'xemacs)
       '("Buffers"
        :filter buffers-menu-filter
        ["List All Buffers" list-buffers t]
@@ -455,7 +457,7 @@ on that platform."
 
 (defconst w3-menu-emacs-button
   (vector
-   (if w3-running-xemacs "XEmacs" "Emacs") 'w3-menu-toggle-menubar t))
+   (if (featurep 'xemacs) "XEmacs" "Emacs") 'w3-menu-toggle-menubar t))
 
 (defconst w3-menu-help-menu
   (list
@@ -600,7 +602,7 @@ on that platform."
 
 (defun w3-menu-install-menubar ()
   (cond
-   (w3-running-xemacs
+   ((featurep 'xemacs)
     (cond
      ((not (featurep 'menubar)) nil)   ; No menus available
      ((featurep 'infodock) nil)                ; InfoDock does it automatically
@@ -614,7 +616,7 @@ on that platform."
 
 (defun w3-menu-install-menubar-item ()
   (cond
-   (w3-running-xemacs
+   ((featurep 'xemacs)
     (if (not (featurep 'menubar))
        nil                             ; No menus available
       (set-buffer-menubar (copy-sequence (w3-menu-global-menubar)))
@@ -635,7 +637,7 @@ on that platform."
        (t nil)))
 
 (defun w3-menu-set-menubar-dirty-flag ()
-  (cond (w3-running-xemacs
+  (cond ((featurep 'xemacs)
         (set-menubar-dirty-flag))
        (t
         (force-mode-line-update))))
@@ -645,7 +647,7 @@ on that platform."
   (cond
    ;;((eq w3-use-menus 1)
    ;;nil)
-   (w3-running-xemacs
+   ((featurep 'xemacs)
     (if (null (car (find-menu-item current-menubar '("XEmacs"))))
        (set-buffer-menubar w3-menu-w3-menubar)
       (set-buffer-menubar (copy-sequence (w3-menu-global-menubar)))
@@ -778,7 +780,7 @@ on that platform."
   (defalias 'w3-event-glyph 'ignore))
 
 (defun w3-menu-popup-menu (e menu)
-  (if w3-running-xemacs
+  (if (fboundp 'popup-menu)
       (popup-menu menu)
     (let ((bogus-menu nil))
       (easy-menu-define bogus-menu nil nil menu)
@@ -798,6 +800,7 @@ on that platform."
                     (and parent (widget-get parent :href))))
           (imag (or (and widget (widget-get widget :src))
                     (and parent (widget-get parent :src))))
+          ;; Fixme: runtime dependency on cl through copy-tree.
           (menu (copy-tree w3-popup-menu))
           url val trunc-url)
       (if href

commit 3a7253acbdffedd198198b14ceb8380f0b521dff
Author: Dave Love <address@hidden>
Date:   Thu May 10 18:33:13 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 60efae4..b4beb84 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2001-05-10  Dave Love  <address@hidden>
 
+       * lisp/w3-menu.el (w3-menu-go-menu): Use url-history-track, not
+       url-keep-history.
+
        * lisp/mule-sysdp.el: Removed in favour of one in url package.
 
 2001-01-04  Dave Love  <address@hidden>

commit ac81e4e274c033427123992a0fe33e7eeb7721c1
Author: Dave Love <address@hidden>
Date:   Thu May 10 18:33:02 2001 +0000

    (w3-menu-go-menu): Use url-history-track, not
    url-keep-history.

diff --git a/lisp/w3-menu.el b/lisp/w3-menu.el
index 1d1abbc..bad611d 100644
--- a/lisp/w3-menu.el
+++ b/lisp/w3-menu.el
@@ -1,7 +1,7 @@
 ;;; w3-menu.el --- Menu functions for emacs-w3
 ;; Author: $Author: fx $
-;; Created: $Date: 2000/12/20 20:40:37 $
-;; Version: $Revision: 1.7 $
+;; Created: $Date: 2001/05/10 18:33:02 $
+;; Version: $Revision: 1.8 $
 ;; Keywords: menu, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -344,7 +344,7 @@ on that platform."
    ["Forward" w3-history-forward (cdr (w3-history-find-url-internal 
(url-view-url t)))]
    ["Back" w3-history-backward (car (w3-history-find-url-internal 
(url-view-url t)))]
    ["Home" w3 w3-default-homepage]
-   ["View History..." w3-show-history-list url-keep-history]
+   ["View History..." w3-show-history-list url-history-track]
    "----"
    (if w3-menu-filters-supported-p
        '("Links" :filter w3-menu-links-constructor)

commit d3d16d64a820ce6112b055369eeb2a58eeb08734
Author: Dave Love <address@hidden>
Date:   Thu May 10 18:31:00 2001 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 9f9a4d5..60efae4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2001-05-10  Dave Love  <address@hidden>
+
+       * lisp/mule-sysdp.el: Removed in favour of one in url package.
+
+2001-01-04  Dave Love  <address@hidden>
+
+       * lisp/w3-toolbar.el (w3-add-toolbar-to-buffer) <featurep 'tool-bar>: 
+       Test display-graphic-p and tool-bar-lines.  Use mapc, not mapcar.
+       
+2001-01-03  Dave Love  <address@hidden>
+
+       * lisp/w3-toolbar.el (w3-add-toolbar-to-buffer): In Emacs, test
+       for graphic display and non-zero tool bar lines.
+
 2001-01-02  Sam Steingold  <address@hidden>
 
        * lisp/docomp.el (load-path): Gnus and URL are two levels

commit 60e020f559f16b65780368bc725097c3fb4d1e5e
Author: Dave Love <address@hidden>
Date:   Thu May 10 18:29:44 2001 +0000

    Removed in favour of one in url package.

diff --git a/lisp/mule-sysdp.el b/lisp/mule-sysdp.el
deleted file mode 100644
index 253bc93..0000000
--- a/lisp/mule-sysdp.el
+++ /dev/null
@@ -1,382 +0,0 @@
-;;; mule-sysdp.el --- consolidate MULE-version dependencies in one file.
-
-;; Copyright (c) 1996 - 1999 William Perry
-
-;; Author: William Perry <address@hidden>
-;; Keywords: lisp, tools
-
-;; The purpose of this file is to eliminate the cruftiness that
-;; would otherwise be required of packages that want to run on multiple
-;; versions of Emacs with and without Mule support.
-
-(eval-when-compile (require 'cl))
-
-(defconst mule-sysdep-version (if (featurep 'mule)
-                                 (cond
-                                  ((string-match "XEmacs" emacs-version)
-                                   (if (boundp 'enable-multibyte-characters)
-                                       (make-variable-buffer-local 
'enable-multibyte-characters))
-                                   'xemacs)
-                                  ((and
-                                    (boundp 'mule-version)
-                                    (string-match "[0-9]+\\.[0-9]+"
-                                                  mule-version))
-                                   (if (or (fboundp 'kinsoku)
-                                           (boundp 'kinsoku-ascii))
-                                       (string-to-number (substring
-                                                          mule-version
-                                                          (match-beginning 0)
-                                                          (match-end 0)))
-                                     0))
-                                  (t 2.3))
-                               0)
-  "What version of mule we are running under.")
-
-;; MULE variants
-;; XEmacs 20.x  - 'xemacs
-;; MULE 2.3/2.4 - 2.3 -or- 2.4 (2.4 exists only in beta versions)
-;; Emacs 20.x   - 3.0
-;; Emacs 20.3+  - 4.0 (with character encapsulation)
-
-;; Return non-nil if CODING-SYSTEM is a valid coding system system.
-(defun mule-coding-system-p (coding-system)
-  (case mule-sysdep-version
-    (xemacs
-     (find-coding-system coding-system))
-    (0
-     nil)
-    (otherwise
-     (coding-system-p coding-system))))
-
-;; Return the first valid coding system in the list ARGS.
-(defun mule-coding-system-version (&rest args)
-  (if (featurep 'mule)
-      (progn
-       (while (and args (not (mule-coding-system-p (car args))))
-         (setq args (cdr args)))
-       (car args))))
-
-(defconst w3-mime-charset-coding-alist
-  `(("big5" . ,(mule-coding-system-version 'cn-big5 '*big5*))
-    ("euc-jp" . ,(mule-coding-system-version 'euc-jp '*euc-japan*))
-    ("euc-kr" . ,(mule-coding-system-version 'euc-kr '*euc-korea*))
-    ("gb" . ,(mule-coding-system-version 'cn-gb-2312 '*euc-china*))
-    ("iso-2022-jp" . ,(mule-coding-system-version 'iso-2022-jp '*iso-2022-jp*))
-    ("iso-2022-kr" . ,(mule-coding-system-version 'iso-2022-kr '*iso-2022-kr*))
-    ("iso-8859-1" . ,(mule-coding-system-version 'iso-8859-1 '*ctext*))
-    ("koi-8" . ,(mule-coding-system-version 'koi8))
-    ("koi8-r" . ,(mule-coding-system-version 'koi8))
-    ("x-ctext" . ,(mule-coding-system-version 'ctext '*ctext*))
-    ("x-sjis" . ,(mule-coding-system-version 'shift_jis '*sjis*))
-    ("x-shiftjis" . ,(mule-coding-system-version 'shift_jis '*sjis*))
-    )
-  "Alist of MIME-charset parameter regexps vs the corresponding coding 
systems.")
-
-(defconst w3-url-domain-language-environment-alist
-  '(("\\.jp$" . "Japanese")
-    ("\\.cn$" . "Chinese-GB")
-    ("\\.tw$" . "Chinese-BIG5")
-    ("\\.hk$" . "Chinese-BIG5")
-    ("\\.sg$" . "Chinese-GB")
-    ("\\.kr$" . "Korean")
-    ("\\.ru$" . "Cyrillic-KOI8")
-    ("\\.su$" . "Cyrillic-KOI8")
-    )
-  "Alist of regexps of URL vs the corresponding language environemnt.
-While detecting a coding system of a document whose URL matches some of
-the regular expressions, the coding system priorities defined in
-the corresponding language environment is used.
-
-This facility can be used only in Emacs 20.3 or later.")
-
-(defconst w3-url-domain-coding-alist
-  `(("\\.th$" . ,(mule-coding-system-version 'th-tis620 '*tis620*))
-    ("\\.kr$" . ,(mule-coding-system-version 'euc-kr '*euc-korea*))
-    ("\\.cn$" . ,(mule-coding-system-version 'cn-gb-2312 '*euc-china*))
-    ("\\.sg$" . ,(mule-coding-system-version 'cn-gb-2312 '*euc-china*))
-    ("\\.tw$" . ,(mule-coding-system-version 'cn-big5 '*big5*))
-    ("\\.hk$" . ,(mule-coding-system-version 'cn-big5 '*big5*))
-    ("\\.su$" . ,(mule-coding-system-version 'koi8))
-    ("\\.il$" . ,(mule-coding-system-version 'iso-8859-8 '*iso-8859-8*))
-    ("\\.fr$" . ,(mule-coding-system-version 'iso-8859-1 '*ctext*)))
-  "Alist of regexps of URL vs the corresponding coding systems.
-While decoding a document whose URL matches some of
-the regeular expressions, the corresponding coding system is used.")
-
-(defconst mule-retrieval-coding-system
-  (mule-coding-system-version 'euc-japan '*euc-japan* 'coding-system-euc-japan)
-  "Default retrieval coding system for packages that use this package.")
-
-(defconst mule-no-coding-system
-  (mule-coding-system-version 'no-conversion '*noconv*)
-  "Coding system that means no coding system should be used.")
-
-;; With Mule of version 2.3, insert-file-contents-literally is defined
-;; but performs code conversion.  Thus, we re-define it here to avoid
-;; the code conversion.
-(if (and (numberp mule-sysdep-version) (= mule-sysdep-version 2.3))
-    (defun insert-file-contents-literally
-      (file &optional visit beg end replace)
-      "Like `insert-file-contents', q.v., but only reads in the file.
-A buffer may be modified in several ways after reading into the buffer due
-to advanced Emacs features, such as file-name-handlers, format decoding,
-find-file-hooks, etc.
-  This function ensures that none of these modifications will take place."
-      (let ((file-name-handler-alist nil)
-           (find-file-hooks nil)
-           (input-coding-system mule-no-coding-system))
-       (insert-file-contents file visit beg end replace))))
-
-;; List of coding systems that require calling
-;; w3-replace-invalid-chars after decoding a text by them.
-(defconst mule-invalid-char-coding-systems
-  (list (mule-coding-system-version 'raw-text '*noconv*)
-       (mule-coding-system-version 'iso-8859-1 '*ctext*)))
-
-;; Return non-nil if CODING-SYSTEM requires calling
-;; w3-replace-invalid-chars after decoding a text.
-(defun mule-coding-system-with-invalid-chars (coding-system)
-  (or (null coding-system)
-      (progn
-       (if (listp coding-system)
-           (setq coding-system (car coding-system)))
-       (case mule-sysdep-version
-         ((2.3 2.4)
-          (while (not (vectorp (get coding-system 'coding-system)))
-            (setq coding-system (get coding-system 'coding-system))))
-         (3.0
-          (setq coding-system (coding-system-base coding-system))))
-       (memq coding-system mule-invalid-char-coding-systems))))
-
-(defun mule-detect-coding-version (host st nd)
-  "Return a coding system of the current data."
-  (let ((coding-system nil))
-    ;; The facility of detecting a coding system by language
-    ;; environment is provided only in Emacs 20.3 (Mule 4.0) or later.
-    (if (and host
-            (numberp mule-sysdep-version)
-            (>= mule-sysdep-version 4.0))
-       (let ((l w3-url-domain-language-environment-alist))
-         (while l
-           (if (string-match (car (car l)) host)
-               (setq coding-system
-                     (funcall 'detect-coding-with-language-environment
-                              st nd (cdr (car l)))
-                     l nil)
-             (setq l (cdr l))))))
-    ;; Next, check if the data is from some domain which prefer a
-    ;; specific coding system.
-    (if (and (not coding-system)
-            host)
-       (let ((l w3-url-domain-coding-alist))
-         (while l
-           (if (string-match (car (car l)) host)
-               (setq coding-system (if (mule-coding-system-p
-                                        (cdr (car l)))
-                                       (cdr (car l)))
-                     l nil)
-             (setq l (cdr l))))))
-    ;; At last, try to detect a coding system from the data itself.
-    (if (not coding-system)
-       (setq coding-system
-             (case mule-sysdep-version
-               (2.3 (code-detect-region st nd))
-               ((2.4 xemacs)
-                (detect-coding-region st nd))
-               (3.0
-                ;; Emacs 20.2 returns bogus information from
-                ;; detect-coding-region sometimes.  This is fixed in
-                ;; 20.3 (aka Mule 4.x)
-                (let ((possible (detect-coding-region st nd)))
-                  (if (not (symbolp (car-safe possible)))
-                      '(undecided-unix)
-                    possible)))
-               ((4.0 4.1)
-                ;; We can use HIGHEST arg t for faster detection.
-                (detect-coding-region st nd t))
-               (otherwise nil))))
-    (if (and (not (listp coding-system))
-            (not (mule-coding-system-p coding-system)))
-       (setq coding-system mule-no-coding-system))
-    coding-system))
-
-(defun mule-code-convert-region (code)
-  (if (and (listp code) (car code))
-      (setq code (car code)))
-  (case mule-sysdep-version
-    (2.3
-     (set 'mc-flag t)
-     (code-convert-region (point-min) (point-max) code *internal*)
-     (set-file-coding-system code))
-    (2.4
-     (set (make-local-variable 'enable-multibyte-characters) t)
-     (if (memq code '(autodetect coding-system-automatic))
-        nil
-       (decode-coding-region (point-min) (point-max) code)
-       (set-buffer-file-coding-system code)))
-    (3.0
-     (when default-enable-multibyte-characters
-       (set (make-local-variable 'enable-multibyte-characters) t)
-       (if (memq code '(autodetect automatic-conversion))
-          nil
-        (or code (setq code 'automatic-conversion))
-        (decode-coding-region (point-min) (point-max) code)
-        (set-buffer-file-coding-system code))))
-    (4.0
-     (when default-enable-multibyte-characters
-       (set-buffer-multibyte t)
-       (if (memq code '(autodetect automatic-conversion))
-          nil
-        (or code (setq code 'automatic-conversion))
-        (decode-coding-region (point-min) (point-max) code)
-        (set-buffer-file-coding-system (symbol-value 
'last-coding-system-used)))))
-    (xemacs
-     (if (and (listp code) (not (car code)))
-        (progn
-          (setq code 'autodetect)
-          (condition-case ()
-              (get-coding-system 'autodetect)
-            (error (setq code 'automatic-conversion)))))
-     (decode-coding-region (point-min) (point-max) code)
-     (set-file-coding-system code))
-    (otherwise
-     nil)))
-
-(defun mule-inhibit-code-conversion (proc)
-  (if (process-buffer proc)
-      (save-excursion
-       (set-buffer (process-buffer proc))
-       (set 'mc-flag nil)
-       (if (fboundp 'set-buffer-multibyte)
-           (set-buffer-multibyte nil)
-         (set 'enable-multibyte-characters nil))))
-  (case mule-sysdep-version
-    ((3.0 4.0 4.1 2.4 2.3)
-     (set-process-coding-system proc mule-no-coding-system
-                               mule-no-coding-system))
-    (xemacs
-     (set-process-input-coding-system proc mule-no-coding-system)
-     (set-process-input-coding-system proc mule-no-coding-system))))
-
-(defun mule-write-region-no-coding-system (st nd file &optional append visit 
lockname)
-  (let ((coding-system-for-write mule-no-coding-system)
-       (file-coding-system mule-no-coding-system)
-       (buffer-file-coding-system mule-no-coding-system)
-       (mc-flag t)
-       (require-final-newline nil)
-       ;;(file-name-handler-alist nil)
-       (crypt-encoding-alist nil)
-       (jka-compr-compression-info-list nil)
-       (jam-zcat-filename-list nil)
-       (write-file-hooks nil)
-       (write-contents-hooks nil)
-       (file-coding-system-alist nil))
-    (case mule-sysdep-version
-      (2.3
-       (write-region st nd file append visit lockname mule-no-coding-system))
-      (3.0
-       (let ((enable-multibyte-characters t))
-        (write-region st nd file append visit lockname)))
-      ((4.0 4.1)
-       (write-region st nd file append visit lockname))
-      (otherwise
-       (write-region st nd file append visit lockname)))))
-
-(defun mule-encode-string (str)
-  (case mule-sysdep-version
-    (2.3
-     (code-convert-string str *internal* mule-retrieval-coding-system))
-    ((2.4 3.0 xemacs)
-     (encode-coding-string str mule-retrieval-coding-system))
-    ((4.0 4.1)
-     (if default-enable-multibyte-characters
-        (encode-coding-string str mule-retrieval-coding-system)
-       str))
-    (otherwise
-     str)))
-
-(defun mule-decode-string (str)
-  (and str
-       (case mule-sysdep-version
-        ((2.4 3.0 xemacs)
-         (decode-coding-string str mule-retrieval-coding-system))
-        (2.3
-         (code-convert-string str *internal* mule-retrieval-coding-system))
-        ((4.0 4.1)
-         (if default-enable-multibyte-characters
-             (decode-coding-string str mule-retrieval-coding-system)
-           str))
-        (otherwise
-         str))))
-
-(defun mule-truncate-string (str len &optional pad)
-  "Truncate string STR so that string-width of STR is not greater than LEN.
- If width of the truncated string is less than LEN, and if a character PAD is
- defined, add padding end of it."
-  (case mule-sysdep-version
-    ((3.0 4.0 4.1)
-     (truncate-string-to-width str len 0 pad))
-    (2.4
-     (let ((cl (string-to-vector str)) (n 0) (sw 0))
-       (if (<= (string-width str) len) str
-        (while (<= (setq sw (+ (char-width (aref cl n)) sw)) len)
-          (setq n (1+ n)))
-        (string-match (make-string n ?.) str)
-        (setq str (substring str 0 (match-end 0))))
-       (if pad (concat str (make-string (- len (string-width str)) pad)) str)))
-    (2.3
-     (let ((cl (string-to-char-list str)) (n 0) (sw 0))
-       (if (<= (string-width str) len) str
-        (while (<= (setq sw (+ (char-width (nth n cl)) sw)) len)
-          (setq n (1+ n)))
-        (string-match (make-string n ?.) str)
-        (setq str (substring str 0 (match-end 0))))
-       (if pad (concat str (make-string (- len (string-width str)) pad)) str)))
-    (otherwise
-     (concat (if (> (length str) len) (substring str 0 len) str)
-            (if (or (null pad) (> (length str) len))
-                ""
-              (make-string (- len (length str)) pad))))))
-
-(defun mule-find-charset-region (beg end &optional table)
-  (case mule-sysdep-version
-    (2.3 (code-detect-region beg end))
-    ((2.4 3.0 4.0 4.1) (find-charset-region beg end table))
-    (xemacs (charsets-in-region beg end))
-    (otherwise '(no-conversion))))
-
-(defun mule-coding-system-name (codesys)
-  (case mule-sysdep-version
-    ((3.0 4.0 4.1) nil)
-    (xemacs (coding-system-name codesys))))
-
-(defun mule-find-coding-system (sys)
-  (case mule-sysdep-version
-    ((2.3 2.4) nil)
-    ((3.0 4.0 4.1) (if (get sys 'coding-system) sys nil))
-    (xemacs (find-coding-system sys))
-    (otherwise nil)))
-     
-(defun mule-make-iso-character (char)
-  (if (<= char 127)
-      char
-    (case mule-sysdep-version
-      (2.3 (make-character lc-ltn1 char))
-      (2.4 (make-char charset-latin-iso8859-1 char))
-      (3.0 (make-char 'latin-iso8859-1 char))
-      ((4.0 4.1) (if default-enable-multibyte-characters
-                    (make-char 'latin-iso8859-1 char)
-                  char))
-      (xemacs char)
-      (otherwise char))))
-
-(case mule-sysdep-version
-  ((2.3 2.4 3.0 4.0 4.1 xemacs) nil)
-  (otherwise (fset 'string-width 'length)))
-
-(and
- (boundp 'MULE)
- (not (featurep 'mule))
- (provide 'mule))
-
-(provide 'mule-sysdp)

commit ba69ce7175e2b144d0d41bc978dc1e5e9113ffd4
Author: Dave Love <address@hidden>
Date:   Thu Jan 4 12:50:00 2001 +0000

    (w3-add-toolbar-to-buffer) <featurep 'tool-bar>:
    Test display-graphic-p and tool-bar-lines.  Use mapc, not mapcar.

diff --git a/lisp/w3-toolbar.el b/lisp/w3-toolbar.el
index 3821f70..1e0ce01 100644
--- a/lisp/w3-toolbar.el
+++ b/lisp/w3-toolbar.el
@@ -1,7 +1,7 @@
 ;;; w3-toolbar.el --- Toolbar functions for emacs-w3
-;; Author: $Author: wmperry $
-;; Created: $Date: 2000/10/16 15:25:47 $
-;; Version: $Revision: 1.3 $
+;; Author: $Author: fx $
+;; Created: $Date: 2001/01/04 12:50:00 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: mouse, toolbar
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -346,16 +346,19 @@ not `none'.")
          (set-specifier toolbar (cons (current-buffer) w3-toolbar))))
     (set-specifier toolbar-buttons-captioned-p
                   (cons (current-buffer) (eq w3-toolbar-type 'both))))
-   ((featurep 'tool-bar)
+   ((and (featurep 'tool-bar) 
+        (display-graphic-p)
+        (> (frame-parameter nil 'tool-bar-lines) 0))
     ;; Emacs 21.x way of doing things
     (let ((toolbar-map (make-sparse-keymap)))
-      (mapcar (lambda (desc)
-               (if (and desc (not (keywordp (aref desc 0))))
-                   (tool-bar-add-item (symbol-value (aref desc 0)) ; image
-                                      (aref desc 1) ; binding
-                                      (intern (aref desc 3)) ; key
-                                      toolbar-map ; keymap
-                                      :enable (aref desc 2)))) w3-toolbar)
+      (mapc (lambda (desc)
+             (if (and desc (not (keywordp (aref desc 0))))
+                 (tool-bar-add-item (symbol-value (aref desc 0)) ; image
+                                    (aref desc 1) ; binding
+                                    (intern (aref desc 3)) ; key
+                                    toolbar-map ; keymap
+                                    :enable (aref desc 2))))
+             w3-toolbar)
       (define-key w3-mode-map [tool-bar] toolbar-map)))
    (t
     nil)))

commit f12037d08df165b594bbd2d002f366009e7429f8
Author: Sam Steingold <address@hidden>
Date:   Tue Jan 2 23:29:10 2001 +0000

    Gnus and URL are two levels above w3/lisp by default

diff --git a/ChangeLog b/ChangeLog
index 51475ff..9f9a4d5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2001-01-02  Sam Steingold  <address@hidden>
+
+       * lisp/docomp.el (load-path): Gnus and URL are two levels
+       above w3/lisp by default.
+
 2000-12-20  Dave Love  <address@hidden>
 
        * lisp/w3-sysdp.el: Use sysdep-defalias, not sysdep-fset.
@@ -25,14 +30,14 @@
        Callers changed.
        (socks-original-open-network-stream, open-network-stream): Use
        defalias, not fset.
-       (socks-wait-for-state-change, socks-filter) 
-       (socks-open-connection, socks-open-connection) 
-       (socks-send-command, socks-parse-services) 
+       (socks-wait-for-state-change, socks-filter)
+       (socks-open-connection, socks-open-connection)
+       (socks-send-command, socks-parse-services)
        (socks-find-services-entry, socks-open-network-stream)
        (socks-username/password-auth-filter)
        (socks-username/password-auth): Don't use cl-...hash.
 
-       * lisp/css.el (css-get-internal, css-copy-stylesheet) 
+       * lisp/css.el (css-get-internal, css-copy-stylesheet)
        (css-store-rule, css-display): Don't use cl-...hash.
 
 2000-11-15  William M. Perry  <address@hidden>
diff --git a/lisp/docomp.el b/lisp/docomp.el
index 772c759..1db1c10 100644
--- a/lisp/docomp.el
+++ b/lisp/docomp.el
@@ -5,8 +5,10 @@
 (setq srcdir (or (getenv "W3SRCDIR") "."))
 
 (push srcdir load-path)
-(push (or (getenv "GNUSDIR") (expand-file-name "../gnus/lisp/" srcdir)) 
load-path)
-(push (or (getenv "URLDIR") (expand-file-name "../url/lisp/" srcdir)) 
load-path)
+(push (or (getenv "GNUSDIR") (expand-file-name "../../gnus/lisp/" srcdir))
+      load-path)
+(push (or (getenv "URLDIR") (expand-file-name "../../url/lisp/" srcdir))
+      load-path)
 
 (setq max-specpdl-size (* 1000 max-specpdl-size)
       max-lisp-eval-depth (* 1000 max-lisp-eval-depth))

commit bef9e5f934e86618425b62e5ee4339065d783070
Author: Dave Love <address@hidden>
Date:   Wed Dec 20 20:54:23 2000 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 32608a5..51475ff 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,40 @@
+2000-12-20  Dave Love  <address@hidden>
+
+       * lisp/w3-sysdp.el: Use sysdep-defalias, not sysdep-fset.
+
+       * lisp/w3-widget.el: Use defalias, not fset.
+
+       * lisp/w3.el (w3-maybe-follow-link): Fix call of
+       widget-button-press.
+
+       * lisp/w3-parse.el (w3-char-int): New alias instead of char-int.
+
+       * lisp/w3-menu.el (w3-event-glyph): New alias instead of
+       event-glyph.
+
+       * lisp/w3-display.el: Use defalias, not fset.
+       (w3-widget-echo): Revert last change, following Emacs change.
+
+       * lisp/mule-sysdp.el (cl): Require only when compiling.
+
+       * lisp/font.el: Use defalias, not fset.  Don't use cl-...hash.
+
+       * lisp/devices.el (device-class): Try display-color-p first.
+
+       * lisp/socks.el (socks-char-int): New alias instead of char-int.
+       Callers changed.
+       (socks-original-open-network-stream, open-network-stream): Use
+       defalias, not fset.
+       (socks-wait-for-state-change, socks-filter) 
+       (socks-open-connection, socks-open-connection) 
+       (socks-send-command, socks-parse-services) 
+       (socks-find-services-entry, socks-open-network-stream)
+       (socks-username/password-auth-filter)
+       (socks-username/password-auth): Don't use cl-...hash.
+
+       * lisp/css.el (css-get-internal, css-copy-stylesheet) 
+       (css-store-rule, css-display): Don't use cl-...hash.
+
 2000-11-15  William M. Perry  <address@hidden>
 
        * lisp/w3-mouse.el (not): Don't ever try to grab mouse-movement

commit 9a4d994eae10ae6ed62b0e5cde14091f2fd5813c
Author: Dave Love <address@hidden>
Date:   Wed Dec 20 20:53:17 2000 +0000

    (socks-char-int): New alias instead of char-int.
    Callers changed.
    (socks-original-open-network-stream, open-network-stream): Use
    defalias, not fset.
    (socks-wait-for-state-change, socks-filter)
    (socks-open-connection, socks-open-connection)
    (socks-send-command, socks-parse-services)
    (socks-find-services-entry, socks-open-network-stream)
    (socks-username/password-auth-filter)
    (socks-username/password-auth): Don't use cl-...hash.

diff --git a/lisp/socks.el b/lisp/socks.el
index b9f5750..0861f94 100644
--- a/lisp/socks.el
+++ b/lisp/socks.el
@@ -1,7 +1,7 @@
 ;;; socks.el --- A Socks v5 Client for Emacs
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/09 14:52:16 $
-;; Version: $Revision: 1.4 $
+;; Author: $Author: fx $
+;; Created: $Date: 2000/12/20 20:53:17 $
+;; Version: $Revision: 1.5 $
 ;; Keywords: comm, firewalls
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -39,8 +39,9 @@
 (require 'custom)
 
 ;; For non-MULE
-(if (not (fboundp 'char-int))
-    (fset 'char-int 'identity))
+(if (fboundp 'char-int)
+    (defalias 'socks-char-int 'char-int)
+  (defalias 'socks-char-int 'identity))
 
 (if (not (fboundp 'split-string))
     (defun split-string (string &optional pattern)
@@ -268,39 +269,39 @@ If PATTERN is omitted, it defaults to \"[ 
\\f\\t\\n\\r\\v]+\"."
 
 (defmacro socks-wait-for-state-change (proc htable cur-state)
   (`
-   (while (and (= (cl-gethash 'state (, htable)) (, cur-state))
+   (while (and (= (gethash 'state (, htable)) (, cur-state))
               (memq (process-status (, proc)) '(run open)))
      (accept-process-output (, proc) socks-timeout))))
 
 (defun socks-filter (proc string)
-  (let ((info (cl-gethash proc socks-connections))
+  (let ((info (gethash proc socks-connections))
        state desired-len)
     (or info (error "socks-filter called on non-SOCKS connection %S" proc))
-    (setq state (cl-gethash 'state info))
+    (setq state (gethash 'state info))
     (cond
      ((= state socks-state-waiting-for-auth)
-      (cl-puthash 'scratch (concat string (cl-gethash 'scratch info)) info)
-      (setq string (cl-gethash 'scratch info))
+      (puthash 'scratch (concat string (gethash 'scratch info)) info)
+      (setq string (gethash 'scratch info))
       (if (< (length string) 2)
          nil                           ; We need to spin some more
-       (cl-puthash 'authtype (char-int (aref string 1)) info)
-       (cl-puthash 'scratch (substring string 2 nil) info)
-       (cl-puthash 'state socks-state-submethod-negotiation info)))
+       (puthash 'authtype (socks-char-int (aref string 1)) info)
+       (puthash 'scratch (substring string 2 nil) info)
+       (puthash 'state socks-state-submethod-negotiation info)))
      ((= state socks-state-submethod-negotiation)
       )
      ((= state socks-state-authenticated)
       )
      ((= state socks-state-waiting)
-      (cl-puthash 'scratch (concat string (cl-gethash 'scratch info)) info)
-      (setq string (cl-gethash 'scratch info))
-      (case (cl-gethash 'server-protocol info)
+      (puthash 'scratch (concat string (gethash 'scratch info)) info)
+      (setq string (gethash 'scratch info))
+      (case (gethash 'server-protocol info)
        (http
         (if (not (string-match "\r\n\r\n" string))
             nil                        ; Need to spin some more
           (debug)
-          (cl-puthash 'state socks-state-connected info)
-          (cl-puthash 'reply 0 info)
-          (cl-puthash 'response string info)))
+          (puthash 'state socks-state-connected info)
+          (puthash 'reply 0 info)
+          (puthash 'response string info)))
        (4
         (if (< (length string) 2)
             nil                        ; Can't know how much to read yet
@@ -311,29 +312,29 @@ If PATTERN is omitted, it defaults to \"[ 
\\f\\t\\n\\r\\v]+\"."
                    ))
           (if (< (length string) desired-len)
               nil                      ; need to spin some more
-            (let ((response (char-int (aref string 1))))
+            (let ((response (socks-char-int (aref string 1))))
               (if (= response 90)
                   (setq response 0))
-              (cl-puthash 'state socks-state-connected info)
-              (cl-puthash 'reply response info)
-              (cl-puthash 'response string info)))))
+              (puthash 'state socks-state-connected info)
+              (puthash 'reply response info)
+              (puthash 'response string info)))))
        (5
         (if (< (length string) 4)
             nil
           (setq desired-len
                 (+ 6                   ; Standard socks header
                    (cond
-                    ((= (char-int (aref string 3)) socks-address-type-v4) 4)
-                    ((= (char-int (aref string 3)) socks-address-type-v6) 16)
-                    ((= (char-int (aref string 3)) socks-address-type-name)
+                    ((= (socks-char-int (aref string 3)) 
socks-address-type-v4) 4)
+                    ((= (socks-char-int (aref string 3)) 
socks-address-type-v6) 16)
+                    ((= (socks-char-int (aref string 3)) 
socks-address-type-name)
                      (if (< (length string) 5)
                          255
-                       (+ 1 (char-int (aref string 4))))))))
+                       (+ 1 (socks-char-int (aref string 4))))))))
           (if (< (length string) desired-len)
               nil                      ; Need to spin some more
-            (cl-puthash 'state socks-state-connected info)
-            (cl-puthash 'reply (char-int (aref string 1)) info)
-            (cl-puthash 'response string info))))))
+            (puthash 'state socks-state-connected info)
+            (puthash 'reply (socks-char-int (aref string 1)) info)
+            (puthash 'response string info))))))
      ((= state socks-state-connected)
       )
      )
@@ -353,11 +354,11 @@ If PATTERN is omitted, it defaults to \"[ 
\\f\\t\\n\\r\\v]+\"."
       ;; Initialize process and info about the process
       (set-process-filter proc 'socks-filter)
       (process-kill-without-query proc)
-      (cl-puthash proc info socks-connections)
-      (cl-puthash 'state socks-state-waiting-for-auth info)
-      (cl-puthash 'authtype socks-authentication-failure info)
-      (cl-puthash 'server-protocol (nth 3 server-info) info)
-      (cl-puthash 'server-name (nth 1 server-info) info)
+      (puthash proc info socks-connections)
+      (puthash 'state socks-state-waiting-for-auth info)
+      (puthash 'authtype socks-authentication-failure info)
+      (puthash 'server-protocol (nth 3 server-info) info)
+      (puthash 'server-name (nth 1 server-info) info)
       (case (nth 3 server-info)
        (http
         ;; Don't really have to do any connection setup under http
@@ -373,14 +374,14 @@ If PATTERN is omitted, it defaults to \"[ 
\\f\\t\\n\\r\\v]+\"."
 
         ;; Basically just do a select() until we change states.
         (socks-wait-for-state-change proc info socks-state-waiting-for-auth)
-        (setq authtype (cl-gethash 'authtype info))
+        (setq authtype (gethash 'authtype info))
         (cond
          ((= authtype socks-authentication-null)
           (and socks-debug (message "No authentication necessary")))
          ((= authtype socks-authentication-failure)
           (error "No acceptable authentication methods found."))
          (t
-          (let* ((auth-type (cl-gethash 'authtype info))
+          (let* ((auth-type (gethash 'authtype info))
                  (auth-handler (assoc auth-type socks-authentication-methods))
                  (auth-func (and auth-handler (cdr (cdr auth-handler))))
                  (auth-desc (and auth-handler (car (cdr auth-handler)))))
@@ -394,7 +395,7 @@ If PATTERN is omitted, it defaults to \"[ 
\\f\\t\\n\\r\\v]+\"."
             )
           )
          )
-        (cl-puthash 'state socks-state-authenticated info)
+        (puthash 'state socks-state-authenticated info)
         (set-process-filter proc 'socks-filter)))
       proc)))
 
@@ -407,12 +408,12 @@ If PATTERN is omitted, it defaults to \"[ 
\\f\\t\\n\\r\\v]+\"."
                (format "%c%s" (length address) address))
               (t
                (error "Unkown address type: %d" atype))))
-       (info (cl-gethash proc socks-connections))
+       (info (gethash proc socks-connections))
        request version)
     (or info (error "socks-send-command called on non-SOCKS connection %S"
                    proc))
-    (cl-puthash 'state socks-state-waiting info)
-    (setq version (cl-gethash 'server-protocol info))
+    (puthash 'state socks-state-waiting info)
+    (setq version (gethash 'server-protocol info))
     (case version
       (http
        (setq request (format (eval-when-compile
@@ -452,10 +453,10 @@ If PATTERN is omitted, it defaults to \"[ 
\\f\\t\\n\\r\\v]+\"."
     (process-send-string proc request)
     (socks-wait-for-state-change proc info socks-state-waiting)
     (process-status proc)
-    (if (= (or (cl-gethash 'reply info) 1) socks-response-success)
+    (if (= (or (gethash 'reply info) 1) socks-response-success)
        nil                             ; Sweet sweet success!
       (delete-process proc)
-      (error "SOCKS: %s" (nth (or (cl-gethash 'reply info) 1) socks-errors)))
+      (error "SOCKS: %s" (nth (or (gethash 'reply info) 1) socks-errors)))
     proc))
 
 
@@ -482,10 +483,10 @@ version.")
 
 (if (fboundp 'socks-original-open-network-stream)
     nil                                        ; Do nothing, we've been here 
already
-  (fset 'socks-original-open-network-stream
+  (defalias 'socks-original-open-network-stream
        (symbol-function 'open-network-stream))
   (if socks-override-functions
-      (fset 'open-network-stream 'socks-open-network-stream)))
+      (defalias 'open-network-stream 'socks-open-network-stream)))
 
 (defvar socks-services-file "/etc/services")
 (defvar socks-tcp-services (make-hash-table :size 13 :test 'equal))
@@ -517,7 +518,7 @@ version.")
        (setq name (downcase (match-string 1))
              port (string-to-int (match-string 2))
              type (downcase (match-string 3)))
-       (cl-puthash name port (if (equal type "udp")
+       (puthash name port (if (equal type "udp")
                               socks-udp-services
                             socks-tcp-services))))))
 
@@ -525,7 +526,7 @@ version.")
   "Return the port # associated with SERVICE"
   (if (= (hash-table-count socks-tcp-services) 0)
       (socks-parse-services))
-  (cl-gethash (downcase service)
+  (gethash (downcase service)
              (if udp socks-udp-services socks-tcp-services)))
 
 (defun socks-open-network-stream (name buffer host service)
@@ -534,8 +535,8 @@ version.")
     (if (not route)
        (socks-original-open-network-stream name buffer host service)
       (setq proc (socks-open-connection route)
-           info (cl-gethash proc socks-connections)
-           version (cl-gethash 'server-protocol info))
+           info (gethash proc socks-connections)
+           version (gethash 'server-protocol info))
       (case version
        (4
         (setq host (socks-nslookup-host host))
@@ -552,9 +553,9 @@ version.")
                          (if (stringp service)
                              (socks-find-services-entry service)
                            service))
-      (cl-puthash 'buffer buffer info)
-      (cl-puthash 'host host info)
-      (cl-puthash 'service host info)
+      (puthash 'buffer buffer info)
+      (puthash 'host host info)
+      (puthash 'service host info)
       (set-process-filter proc nil)
       (set-process-buffer proc (if buffer (get-buffer-create buffer)))
       proc)))
@@ -567,31 +568,28 @@ version.")
 
 (defconst socks-username/password-auth-version 1)
 
-(if (not (fboundp 'char-int))
-    (fset 'char-int 'identity))
-
 (defun socks-username/password-auth-filter (proc str)
-  (let ((info (cl-gethash proc socks-connections))
+  (let ((info (gethash proc socks-connections))
        state desired-len)
     (or info (error "socks-filter called on non-SOCKS connection %S" proc))
-    (setq state (cl-gethash 'state info))
-    (cl-puthash 'scratch (concat (cl-gethash 'scratch info) str) info)
-    (if (< (length (cl-gethash 'scratch info)) 2)
+    (setq state (gethash 'state info))
+    (puthash 'scratch (concat (gethash 'scratch info) str) info)
+    (if (< (length (gethash 'scratch info)) 2)
        nil
-      (cl-puthash 'password-auth-status (char-int
-                                        (aref (cl-gethash 'scratch info) 1))
+      (puthash 'password-auth-status (socks-char-int
+                                        (aref (gethash 'scratch info) 1))
                  info)
-      (cl-puthash 'state socks-state-authenticated info))))
+      (puthash 'state socks-state-authenticated info))))
 
 (defun socks-username/password-auth (proc)
-  (let* ((info (cl-gethash proc socks-connections))
-        (state (cl-gethash 'state info)))
+  (let* ((info (gethash proc socks-connections))
+        (state (gethash 'state info)))
     (if (not socks-password)
        (setq socks-password (read-passwd
                              (format "Password for address@hidden: "
                                      socks-username
-                                     (cl-gethash 'server-name info)))))
-    (cl-puthash 'scratch "" info)
+                                     (gethash 'server-name info)))))
+    (puthash 'scratch "" info)
     (set-process-filter proc 'socks-username/password-auth-filter)
     (process-send-string proc
                         (format "%c%c%s%c%s"
@@ -601,7 +599,7 @@ version.")
                                 (length socks-password)
                                 socks-password))
     (socks-wait-for-state-change proc info state)
-    (= (cl-gethash 'password-auth-status info) 0)))
+    (= (gethash 'password-auth-status info) 0)))
 
 
 ;; More advanced GSS/API stuff, not yet implemented - volunteers?

commit ef8a28b275aae982b587f6f78cad52c6a921076a
Author: Dave Love <address@hidden>
Date:   Wed Dec 20 20:52:38 2000 +0000

    (css-get-internal, css-copy-stylesheet)
    (css-store-rule, css-display): Don't use cl-...hash.

diff --git a/lisp/css.el b/lisp/css.el
index 8d8f227..d6f7c6b 100644
--- a/lisp/css.el
+++ b/lisp/css.el
@@ -1,12 +1,12 @@
 ;;; css.el -- Cascading Style Sheet parser
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/11 00:53:12 $
-;; Version: $Revision: 1.4 $
+;; Author: $Author: fx $
+;; Created: $Date: 2000/12/20 20:52:38 $
+;; Version: $Revision: 1.5 $
 ;; Keywords: 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
+;;; Copyright (c) 1996, 97, 98, 1999 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -260,7 +260,7 @@ For a terminal screen, the value is always 1."
   (setq css-scratch-id (or (cdr-safe (assq 'id args))
                           (cdr-safe (assq 'name args)))
        css-scratch-class (or (cdr-safe (assq 'class args)) t)  
-       css-scratch-possibles (cl-gethash tag sheet))
+       css-scratch-possibles (gethash tag sheet))
   (while css-scratch-possibles
     (setq css-scratch-current (car css-scratch-possibles)
          css-scratch-current-rule (car css-scratch-current)
@@ -880,10 +880,10 @@ For a terminal frame, the value is always 1."
 
 (defun css-copy-stylesheet (sheet)
   (let ((new (make-hash-table :size (hash-table-count sheet))))
-    (cl-maphash
+    (maphash
      (function
       (lambda (k v)
-       (cl-puthash k (copy-tree v) new))) sheet)
+       (puthash k (copy-tree v) new))) sheet)
     new))
 
 (defsubst css-store-rule (attrs applies-to)
@@ -894,11 +894,11 @@ For a terminal frame, the value is always 1."
            tag (car cur))
       (if (listp tag)
          (setq tag (car tag)))
-      (setq rules (cl-gethash tag sheet))
+      (setq rules (gethash tag sheet))
       (cond
        ((null rules)
        ;; First rule for this tag.  Create new ruleset
-       (cl-puthash tag (list (cons cur attrs)) sheet))
+       (puthash tag (list (cons cur attrs)) sheet))
        ((setq node (assoc cur rules))
        ;; Similar rule already exists, splice in our information
        (setcdr node (append attrs (cdr node))))
@@ -906,7 +906,7 @@ For a terminal frame, the value is always 1."
        ;; First rule for this particular combination of tag/ancestors/class.
        ;; Slap it onto the existing set of rules and push back into sheet.
        (setq rules (cons (cons cur attrs) rules))
-       (cl-puthash tag rules sheet))
+       (puthash tag rules sheet))
        )
       )
     )
@@ -1050,7 +1050,7 @@ For a terminal frame, the value is always 1."
            "# styles specified by the document.  The rules are in no\n"
            "# particular order.\n\n")
     (let (tmp cur goal-col)
-      (cl-maphash
+      (maphash
        (function
        (lambda (k v)
          (while v

commit c2a971452837b9f181797eff36c42cefe1afa5b8
Author: Dave Love <address@hidden>
Date:   Wed Dec 20 20:52:16 2000 +0000

    Use defalias, not fset.  Don't use cl-...hash.

diff --git a/lisp/font.el b/lisp/font.el
index fba488a..719bd25 100644
--- a/lisp/font.el
+++ b/lisp/font.el
@@ -1,7 +1,7 @@
 ;;; font.el --- New font model
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 19:58:37 $
-;; Version: $Revision: 1.5 $
+;; Author: $Author: fx $
+;; Created: $Date: 2000/12/20 20:52:16 $
+;; Version: $Revision: 1.6 $
 ;; Keywords: faces
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -80,10 +80,10 @@
 
 (require 'disp-table)
 
-(if (not (fboundp '<<))   (fset '<< 'lsh))
-(if (not (fboundp '&))    (fset '& 'logand))
-(if (not (fboundp '|))    (fset '| 'logior))
-(if (not (fboundp '~))    (fset '~ 'lognot))
+(if (not (fboundp '<<))   (defalias '<< 'lsh))
+(if (not (fboundp '&))    (defalias '& 'logand))
+(if (not (fboundp '|))    (defalias '| 'logior))
+(if (not (fboundp '~))    (defalias '~ 'lognot))
 (if (not (fboundp '>>))   (defun >> (value count) (<< value (- count))))
 
 
@@ -888,7 +888,7 @@ for use in the 'weight' field of an mswindows font string.")
     (while fonts
       (setq cur (car fonts)
            fonts (cdr fonts)
-           plist (cl-gethash (car (font-family cur)) hash-table))
+           plist (gethash (car (font-family cur)) hash-table))
       (if (not (memq (font-weight cur) (plist-get plist 'weights)))
          (setq plist (plist-put plist 'weights (cons (font-weight cur)
                                                      (plist-get plist 
'weights)))))
@@ -901,7 +901,7 @@ for use in the 'weight' field of an mswindows font string.")
       (if (and (font-italic-p cur)
               (not (memq 'italic (plist-get plist 'styles))))
          (setq plist (plist-put plist 'styles (cons 'italic (plist-get plist 
'styles)))))
-      (cl-puthash (car (font-family cur)) plist hash-table))
+      (puthash (car (font-family cur)) plist hash-table))
     hash-table))
 
 
@@ -1000,7 +1000,7 @@ for use in the 'weight' field of an mswindows font 
string.")
     (apply 'set-face-font face font args))))
 
 (if font-running-emacs-new-redisplay
-    (fset 'font-set-face-font 'font-set-face-font-new-redisplay))
+    (defalias 'font-set-face-font 'font-set-face-font-new-redisplay))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Now for emacsen specific stuff
@@ -1045,7 +1045,7 @@ for use in the 'weight' field of an mswindows font 
string.")
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (cond
  ((fboundp 'display-warning)
-  (fset 'font-warn 'display-warning))
+  (defalias 'font-warn 'display-warning))
  ((fboundp 'warn)
   (defun font-warn (class message &optional level)
     (warn "(%s/%s) %s" class (or level 'warning) message)))

commit b8421a4952f96892db516901082a234d12a048bb
Author: Dave Love <address@hidden>
Date:   Wed Dec 20 20:51:28 2000 +0000

    Use defalias, not fset.
    (w3-widget-echo): Revert last change, following Emacs change.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 9207d63..f54fc3c 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
-;; Author: $Author: wmperry $
-;; Created: $Date: 2000/11/15 13:58:28 $
-;; Version: $Revision: 1.24 $
+;; Author: $Author: fx $
+;; Created: $Date: 2000/12/20 20:51:28 $
+;; Version: $Revision: 1.25 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -375,11 +375,11 @@ If the face already exists, it is unmodified."
 
 (cond
  ((not (fboundp 'make-face))
-  (fset 'w3-make-face 'ignore))
+  (defalias 'w3-make-face 'ignore))
  (w3-running-xemacs
-  (fset 'w3-make-face 'make-face))
+  (defalias 'w3-make-face 'make-face))
  (t
-  (fset 'w3-make-face 'w3-make-face-emacs19)))
+  (defalias 'w3-make-face 'w3-make-face-emacs19)))
 
 (defsubst w3-face-for-element (node)
   (w3-get-all-face-info)
@@ -557,13 +557,6 @@ If the face already exists, it is unmodified."
        (and extent (extent-buffer extent)))))
 
 (defun w3-widget-echo (widget &rest ignore)
-  (if (windowp widget)
-      ;; FSF emacs 21.x does some weird shit...
-      ;; args are window object pos
-      (debug)
-      (save-excursion
-       (set-buffer (window-buffer widget))
-       (setq widget (widget-at (cadr ignore)))))
   (save-excursion
     (set-buffer (or (w3-widget-buffer widget) (current-buffer)))
     (let* ((url (widget-get widget :href))

commit 0749663753fcddc99790f3bf4aa04cd4e518661d
Author: Dave Love <address@hidden>
Date:   Wed Dec 20 20:49:33 2000 +0000

    Use sysdep-defalias, not sysdep-fset.

diff --git a/lisp/w3-sysdp.el b/lisp/w3-sysdp.el
index d7471be..7656f62 100644
--- a/lisp/w3-sysdp.el
+++ b/lisp/w3-sysdp.el
@@ -359,12 +359,12 @@ one of the properties on the list."
   (and plist (car (cdr plist))))
 
 ;; Extent stuff
-(sysdep-fset 'delete-extent 'delete-overlay)
-(sysdep-fset 'extent-end-position 'overlay-end)
-(sysdep-fset 'extent-start-position 'overlay-start)
-(sysdep-fset 'set-extent-endpoints 'move-overlay)
-(sysdep-fset 'set-extent-property 'overlay-put)
-(sysdep-fset 'make-extent 'make-overlay)
+(sysdep-defalias 'delete-extent 'delete-overlay)
+(sysdep-defalias 'extent-end-position 'overlay-end)
+(sysdep-defalias 'extent-start-position 'overlay-start)
+(sysdep-defalias 'set-extent-endpoints 'move-overlay)
+(sysdep-defalias 'set-extent-property 'overlay-put)
+(sysdep-defalias 'make-extent 'make-overlay)
 
 (sysdep-defun extent-property (extent property &optional default)
   (or (overlay-get extent property) default))
@@ -429,7 +429,7 @@ or between BEG and END."
            (throw 'done tmp))))))
 
 ;; misc
-(sysdep-fset 'make-local-hook 'make-local-variable)
+(sysdep-defalias 'make-local-hook 'make-local-variable)
 
 (sysdep-defun buffer-substring-no-properties (beg end)
   "Return the text from BEG to END, without text properties, as a string."

commit 83642dae8b65dc59ba46adb9d9fd8398b76dfcf1
Author: Dave Love <address@hidden>
Date:   Wed Dec 20 20:48:08 2000 +0000

    Use defalias, not fset.

diff --git a/lisp/w3-widget.el b/lisp/w3-widget.el
index 8a640e7..2296e9a 100644
--- a/lisp/w3-widget.el
+++ b/lisp/w3-widget.el
@@ -1,7 +1,7 @@
 ;;; w3-widget.el --- An image widget
-;; Author: $Author: wmperry $
-;; Created: $Date: 2000/07/10 14:43:37 $
-;; Version: $Revision: 1.4 $
+;; Author: $Author: fx $
+;; Created: $Date: 2000/12/20 20:48:08 $
+;; Version: $Revision: 1.5 $
 ;; Keywords: faces, images
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -190,10 +190,11 @@
                                           nil)
                                       (error t)))))
      ((boundp 'image-types)
-      ;; We are in Emacs 20.5+, which has image support
+      ;; We are in Emacs 21+, which has image support
       (require 'image)
-      (setq invalid-glyph (and glyph
-                              (not (memq (plist-get glyph :type) 
image-types)))))
+      (setq invalid-glyph
+           (and glyph
+                (not (image-type-available-p (plist-get glyph :type))))))
      (t
       nil))
 
@@ -294,17 +295,17 @@
       nil))))     
 
 (if (fboundp 'mouse-event-p)
-    (fset 'widget-mouse-event-p 'mouse-event-p)
-  (fset 'widget-mouse-event-p 'ignore))
+    (defalias 'widget-mouse-event-p 'mouse-event-p)
+  (defalias 'widget-mouse-event-p 'ignore))
 
 (cond
  ((fboundp 'glyphp)
-  (fset 'widget-glyphp 'glyphp))
+  (defalias 'widget-glyphp 'glyphp))
  ((boundp 'image-types)
   (defun widget-glyphp (glyph)
     (and (listp glyph) (plist-get glyph :type))))
  (t
-  (fset 'widget-glyphp 'ignore)))
+  (defalias 'widget-glyphp 'ignore)))
 
 (defun widget-image-button-press (event)
   (interactive "@e")
@@ -374,7 +375,7 @@ Any other value means ask the user each time.")
        (message "No destination found for %d,%d" x y)))
      ((and glyph x y ismap)            ; Do the server-side imagemap stuff
       (w3-fetch (format "%s?%d,%d" href x y) target))
-     (usemap                           ; Dummed-down tty client side imap
+     (usemap                           ; Dumbed-down tty client side imap
       (let ((choices (mapcar (function
                              (lambda (entry)
                                (cons

commit ef60a9561bd2d13258a587f7e0eab1f9dc4ec113
Author: Dave Love <address@hidden>
Date:   Wed Dec 20 20:45:02 2000 +0000

    (w3-maybe-follow-link): Fix call of
    widget-button-press.

diff --git a/lisp/w3.el b/lisp/w3.el
index 0d102d0..6374156 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
-;; Author: $Author: wmperry $
-;; Created: $Date: 2000/10/16 15:25:47 $
-;; Version: $Revision: 1.15 $
+;; Author: $Author: fx $
+;; Created: $Date: 2000/12/20 20:45:02 $
+;; Version: $Revision: 1.16 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -555,7 +555,7 @@ url-get-url-at-point"
          (url1 (and widget (widget-get widget :href)))
          (url2 (url-get-url-at-point)))
     (cond
-      (url1 (widget-button-press))
+      (url1 (widget-button-press (point)))
       ((and url2 (string-match url-nonrelative-link url2)) (w3-fetch url2))
       (t (message "No URL could be found!")))))
 

commit 5b4d837400a2c970edf04ac3b035f8a636ae02b1
Author: Dave Love <address@hidden>
Date:   Wed Dec 20 20:43:54 2000 +0000

    *** empty log message ***

diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index aacf7c0..d8e33cb 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -1940,8 +1940,9 @@ skip-chars-forward."
              (ethio-sera-to-fidel-marker)))))
     (error nil)))
 
-(if (not (fboundp 'char-int))
-    (defalias 'char-int 'identity))
+(if (fboundp 'char-int)
+    (defalias 'w3-char-int 'char-int)
+  (defalias 'w3-char-int 'identity))
 
 ;; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 ;; %                                                    %
@@ -2618,7 +2619,7 @@ Returns a data structure containing the parsed 
information."
              ;; encodings?  Mislabeled MIME with no charset?
              ;;
              ;; FIXME FIXME FIXME!!!!!
-             (insert (or (cdr-safe (assq (char-int (char-after (point)))
+             (insert (or (cdr-safe (assq (w3-char-int (char-after (point)))
                                          w3-invalid-sgml-char-replacement)) 
""))
              (delete-char 1))
             ((eobp)

commit 530617310d3e89c0a9a6ae5f247cabf9f7eeda39
Author: Dave Love <address@hidden>
Date:   Wed Dec 20 20:42:23 2000 +0000

    (cl): Require only when compiling.

diff --git a/lisp/mule-sysdp.el b/lisp/mule-sysdp.el
new file mode 100644
index 0000000..253bc93
--- /dev/null
+++ b/lisp/mule-sysdp.el
@@ -0,0 +1,382 @@
+;;; mule-sysdp.el --- consolidate MULE-version dependencies in one file.
+
+;; Copyright (c) 1996 - 1999 William Perry
+
+;; Author: William Perry <address@hidden>
+;; Keywords: lisp, tools
+
+;; The purpose of this file is to eliminate the cruftiness that
+;; would otherwise be required of packages that want to run on multiple
+;; versions of Emacs with and without Mule support.
+
+(eval-when-compile (require 'cl))
+
+(defconst mule-sysdep-version (if (featurep 'mule)
+                                 (cond
+                                  ((string-match "XEmacs" emacs-version)
+                                   (if (boundp 'enable-multibyte-characters)
+                                       (make-variable-buffer-local 
'enable-multibyte-characters))
+                                   'xemacs)
+                                  ((and
+                                    (boundp 'mule-version)
+                                    (string-match "[0-9]+\\.[0-9]+"
+                                                  mule-version))
+                                   (if (or (fboundp 'kinsoku)
+                                           (boundp 'kinsoku-ascii))
+                                       (string-to-number (substring
+                                                          mule-version
+                                                          (match-beginning 0)
+                                                          (match-end 0)))
+                                     0))
+                                  (t 2.3))
+                               0)
+  "What version of mule we are running under.")
+
+;; MULE variants
+;; XEmacs 20.x  - 'xemacs
+;; MULE 2.3/2.4 - 2.3 -or- 2.4 (2.4 exists only in beta versions)
+;; Emacs 20.x   - 3.0
+;; Emacs 20.3+  - 4.0 (with character encapsulation)
+
+;; Return non-nil if CODING-SYSTEM is a valid coding system system.
+(defun mule-coding-system-p (coding-system)
+  (case mule-sysdep-version
+    (xemacs
+     (find-coding-system coding-system))
+    (0
+     nil)
+    (otherwise
+     (coding-system-p coding-system))))
+
+;; Return the first valid coding system in the list ARGS.
+(defun mule-coding-system-version (&rest args)
+  (if (featurep 'mule)
+      (progn
+       (while (and args (not (mule-coding-system-p (car args))))
+         (setq args (cdr args)))
+       (car args))))
+
+(defconst w3-mime-charset-coding-alist
+  `(("big5" . ,(mule-coding-system-version 'cn-big5 '*big5*))
+    ("euc-jp" . ,(mule-coding-system-version 'euc-jp '*euc-japan*))
+    ("euc-kr" . ,(mule-coding-system-version 'euc-kr '*euc-korea*))
+    ("gb" . ,(mule-coding-system-version 'cn-gb-2312 '*euc-china*))
+    ("iso-2022-jp" . ,(mule-coding-system-version 'iso-2022-jp '*iso-2022-jp*))
+    ("iso-2022-kr" . ,(mule-coding-system-version 'iso-2022-kr '*iso-2022-kr*))
+    ("iso-8859-1" . ,(mule-coding-system-version 'iso-8859-1 '*ctext*))
+    ("koi-8" . ,(mule-coding-system-version 'koi8))
+    ("koi8-r" . ,(mule-coding-system-version 'koi8))
+    ("x-ctext" . ,(mule-coding-system-version 'ctext '*ctext*))
+    ("x-sjis" . ,(mule-coding-system-version 'shift_jis '*sjis*))
+    ("x-shiftjis" . ,(mule-coding-system-version 'shift_jis '*sjis*))
+    )
+  "Alist of MIME-charset parameter regexps vs the corresponding coding 
systems.")
+
+(defconst w3-url-domain-language-environment-alist
+  '(("\\.jp$" . "Japanese")
+    ("\\.cn$" . "Chinese-GB")
+    ("\\.tw$" . "Chinese-BIG5")
+    ("\\.hk$" . "Chinese-BIG5")
+    ("\\.sg$" . "Chinese-GB")
+    ("\\.kr$" . "Korean")
+    ("\\.ru$" . "Cyrillic-KOI8")
+    ("\\.su$" . "Cyrillic-KOI8")
+    )
+  "Alist of regexps of URL vs the corresponding language environemnt.
+While detecting a coding system of a document whose URL matches some of
+the regular expressions, the coding system priorities defined in
+the corresponding language environment is used.
+
+This facility can be used only in Emacs 20.3 or later.")
+
+(defconst w3-url-domain-coding-alist
+  `(("\\.th$" . ,(mule-coding-system-version 'th-tis620 '*tis620*))
+    ("\\.kr$" . ,(mule-coding-system-version 'euc-kr '*euc-korea*))
+    ("\\.cn$" . ,(mule-coding-system-version 'cn-gb-2312 '*euc-china*))
+    ("\\.sg$" . ,(mule-coding-system-version 'cn-gb-2312 '*euc-china*))
+    ("\\.tw$" . ,(mule-coding-system-version 'cn-big5 '*big5*))
+    ("\\.hk$" . ,(mule-coding-system-version 'cn-big5 '*big5*))
+    ("\\.su$" . ,(mule-coding-system-version 'koi8))
+    ("\\.il$" . ,(mule-coding-system-version 'iso-8859-8 '*iso-8859-8*))
+    ("\\.fr$" . ,(mule-coding-system-version 'iso-8859-1 '*ctext*)))
+  "Alist of regexps of URL vs the corresponding coding systems.
+While decoding a document whose URL matches some of
+the regeular expressions, the corresponding coding system is used.")
+
+(defconst mule-retrieval-coding-system
+  (mule-coding-system-version 'euc-japan '*euc-japan* 'coding-system-euc-japan)
+  "Default retrieval coding system for packages that use this package.")
+
+(defconst mule-no-coding-system
+  (mule-coding-system-version 'no-conversion '*noconv*)
+  "Coding system that means no coding system should be used.")
+
+;; With Mule of version 2.3, insert-file-contents-literally is defined
+;; but performs code conversion.  Thus, we re-define it here to avoid
+;; the code conversion.
+(if (and (numberp mule-sysdep-version) (= mule-sysdep-version 2.3))
+    (defun insert-file-contents-literally
+      (file &optional visit beg end replace)
+      "Like `insert-file-contents', q.v., but only reads in the file.
+A buffer may be modified in several ways after reading into the buffer due
+to advanced Emacs features, such as file-name-handlers, format decoding,
+find-file-hooks, etc.
+  This function ensures that none of these modifications will take place."
+      (let ((file-name-handler-alist nil)
+           (find-file-hooks nil)
+           (input-coding-system mule-no-coding-system))
+       (insert-file-contents file visit beg end replace))))
+
+;; List of coding systems that require calling
+;; w3-replace-invalid-chars after decoding a text by them.
+(defconst mule-invalid-char-coding-systems
+  (list (mule-coding-system-version 'raw-text '*noconv*)
+       (mule-coding-system-version 'iso-8859-1 '*ctext*)))
+
+;; Return non-nil if CODING-SYSTEM requires calling
+;; w3-replace-invalid-chars after decoding a text.
+(defun mule-coding-system-with-invalid-chars (coding-system)
+  (or (null coding-system)
+      (progn
+       (if (listp coding-system)
+           (setq coding-system (car coding-system)))
+       (case mule-sysdep-version
+         ((2.3 2.4)
+          (while (not (vectorp (get coding-system 'coding-system)))
+            (setq coding-system (get coding-system 'coding-system))))
+         (3.0
+          (setq coding-system (coding-system-base coding-system))))
+       (memq coding-system mule-invalid-char-coding-systems))))
+
+(defun mule-detect-coding-version (host st nd)
+  "Return a coding system of the current data."
+  (let ((coding-system nil))
+    ;; The facility of detecting a coding system by language
+    ;; environment is provided only in Emacs 20.3 (Mule 4.0) or later.
+    (if (and host
+            (numberp mule-sysdep-version)
+            (>= mule-sysdep-version 4.0))
+       (let ((l w3-url-domain-language-environment-alist))
+         (while l
+           (if (string-match (car (car l)) host)
+               (setq coding-system
+                     (funcall 'detect-coding-with-language-environment
+                              st nd (cdr (car l)))
+                     l nil)
+             (setq l (cdr l))))))
+    ;; Next, check if the data is from some domain which prefer a
+    ;; specific coding system.
+    (if (and (not coding-system)
+            host)
+       (let ((l w3-url-domain-coding-alist))
+         (while l
+           (if (string-match (car (car l)) host)
+               (setq coding-system (if (mule-coding-system-p
+                                        (cdr (car l)))
+                                       (cdr (car l)))
+                     l nil)
+             (setq l (cdr l))))))
+    ;; At last, try to detect a coding system from the data itself.
+    (if (not coding-system)
+       (setq coding-system
+             (case mule-sysdep-version
+               (2.3 (code-detect-region st nd))
+               ((2.4 xemacs)
+                (detect-coding-region st nd))
+               (3.0
+                ;; Emacs 20.2 returns bogus information from
+                ;; detect-coding-region sometimes.  This is fixed in
+                ;; 20.3 (aka Mule 4.x)
+                (let ((possible (detect-coding-region st nd)))
+                  (if (not (symbolp (car-safe possible)))
+                      '(undecided-unix)
+                    possible)))
+               ((4.0 4.1)
+                ;; We can use HIGHEST arg t for faster detection.
+                (detect-coding-region st nd t))
+               (otherwise nil))))
+    (if (and (not (listp coding-system))
+            (not (mule-coding-system-p coding-system)))
+       (setq coding-system mule-no-coding-system))
+    coding-system))
+
+(defun mule-code-convert-region (code)
+  (if (and (listp code) (car code))
+      (setq code (car code)))
+  (case mule-sysdep-version
+    (2.3
+     (set 'mc-flag t)
+     (code-convert-region (point-min) (point-max) code *internal*)
+     (set-file-coding-system code))
+    (2.4
+     (set (make-local-variable 'enable-multibyte-characters) t)
+     (if (memq code '(autodetect coding-system-automatic))
+        nil
+       (decode-coding-region (point-min) (point-max) code)
+       (set-buffer-file-coding-system code)))
+    (3.0
+     (when default-enable-multibyte-characters
+       (set (make-local-variable 'enable-multibyte-characters) t)
+       (if (memq code '(autodetect automatic-conversion))
+          nil
+        (or code (setq code 'automatic-conversion))
+        (decode-coding-region (point-min) (point-max) code)
+        (set-buffer-file-coding-system code))))
+    (4.0
+     (when default-enable-multibyte-characters
+       (set-buffer-multibyte t)
+       (if (memq code '(autodetect automatic-conversion))
+          nil
+        (or code (setq code 'automatic-conversion))
+        (decode-coding-region (point-min) (point-max) code)
+        (set-buffer-file-coding-system (symbol-value 
'last-coding-system-used)))))
+    (xemacs
+     (if (and (listp code) (not (car code)))
+        (progn
+          (setq code 'autodetect)
+          (condition-case ()
+              (get-coding-system 'autodetect)
+            (error (setq code 'automatic-conversion)))))
+     (decode-coding-region (point-min) (point-max) code)
+     (set-file-coding-system code))
+    (otherwise
+     nil)))
+
+(defun mule-inhibit-code-conversion (proc)
+  (if (process-buffer proc)
+      (save-excursion
+       (set-buffer (process-buffer proc))
+       (set 'mc-flag nil)
+       (if (fboundp 'set-buffer-multibyte)
+           (set-buffer-multibyte nil)
+         (set 'enable-multibyte-characters nil))))
+  (case mule-sysdep-version
+    ((3.0 4.0 4.1 2.4 2.3)
+     (set-process-coding-system proc mule-no-coding-system
+                               mule-no-coding-system))
+    (xemacs
+     (set-process-input-coding-system proc mule-no-coding-system)
+     (set-process-input-coding-system proc mule-no-coding-system))))
+
+(defun mule-write-region-no-coding-system (st nd file &optional append visit 
lockname)
+  (let ((coding-system-for-write mule-no-coding-system)
+       (file-coding-system mule-no-coding-system)
+       (buffer-file-coding-system mule-no-coding-system)
+       (mc-flag t)
+       (require-final-newline nil)
+       ;;(file-name-handler-alist nil)
+       (crypt-encoding-alist nil)
+       (jka-compr-compression-info-list nil)
+       (jam-zcat-filename-list nil)
+       (write-file-hooks nil)
+       (write-contents-hooks nil)
+       (file-coding-system-alist nil))
+    (case mule-sysdep-version
+      (2.3
+       (write-region st nd file append visit lockname mule-no-coding-system))
+      (3.0
+       (let ((enable-multibyte-characters t))
+        (write-region st nd file append visit lockname)))
+      ((4.0 4.1)
+       (write-region st nd file append visit lockname))
+      (otherwise
+       (write-region st nd file append visit lockname)))))
+
+(defun mule-encode-string (str)
+  (case mule-sysdep-version
+    (2.3
+     (code-convert-string str *internal* mule-retrieval-coding-system))
+    ((2.4 3.0 xemacs)
+     (encode-coding-string str mule-retrieval-coding-system))
+    ((4.0 4.1)
+     (if default-enable-multibyte-characters
+        (encode-coding-string str mule-retrieval-coding-system)
+       str))
+    (otherwise
+     str)))
+
+(defun mule-decode-string (str)
+  (and str
+       (case mule-sysdep-version
+        ((2.4 3.0 xemacs)
+         (decode-coding-string str mule-retrieval-coding-system))
+        (2.3
+         (code-convert-string str *internal* mule-retrieval-coding-system))
+        ((4.0 4.1)
+         (if default-enable-multibyte-characters
+             (decode-coding-string str mule-retrieval-coding-system)
+           str))
+        (otherwise
+         str))))
+
+(defun mule-truncate-string (str len &optional pad)
+  "Truncate string STR so that string-width of STR is not greater than LEN.
+ If width of the truncated string is less than LEN, and if a character PAD is
+ defined, add padding end of it."
+  (case mule-sysdep-version
+    ((3.0 4.0 4.1)
+     (truncate-string-to-width str len 0 pad))
+    (2.4
+     (let ((cl (string-to-vector str)) (n 0) (sw 0))
+       (if (<= (string-width str) len) str
+        (while (<= (setq sw (+ (char-width (aref cl n)) sw)) len)
+          (setq n (1+ n)))
+        (string-match (make-string n ?.) str)
+        (setq str (substring str 0 (match-end 0))))
+       (if pad (concat str (make-string (- len (string-width str)) pad)) str)))
+    (2.3
+     (let ((cl (string-to-char-list str)) (n 0) (sw 0))
+       (if (<= (string-width str) len) str
+        (while (<= (setq sw (+ (char-width (nth n cl)) sw)) len)
+          (setq n (1+ n)))
+        (string-match (make-string n ?.) str)
+        (setq str (substring str 0 (match-end 0))))
+       (if pad (concat str (make-string (- len (string-width str)) pad)) str)))
+    (otherwise
+     (concat (if (> (length str) len) (substring str 0 len) str)
+            (if (or (null pad) (> (length str) len))
+                ""
+              (make-string (- len (length str)) pad))))))
+
+(defun mule-find-charset-region (beg end &optional table)
+  (case mule-sysdep-version
+    (2.3 (code-detect-region beg end))
+    ((2.4 3.0 4.0 4.1) (find-charset-region beg end table))
+    (xemacs (charsets-in-region beg end))
+    (otherwise '(no-conversion))))
+
+(defun mule-coding-system-name (codesys)
+  (case mule-sysdep-version
+    ((3.0 4.0 4.1) nil)
+    (xemacs (coding-system-name codesys))))
+
+(defun mule-find-coding-system (sys)
+  (case mule-sysdep-version
+    ((2.3 2.4) nil)
+    ((3.0 4.0 4.1) (if (get sys 'coding-system) sys nil))
+    (xemacs (find-coding-system sys))
+    (otherwise nil)))
+     
+(defun mule-make-iso-character (char)
+  (if (<= char 127)
+      char
+    (case mule-sysdep-version
+      (2.3 (make-character lc-ltn1 char))
+      (2.4 (make-char charset-latin-iso8859-1 char))
+      (3.0 (make-char 'latin-iso8859-1 char))
+      ((4.0 4.1) (if default-enable-multibyte-characters
+                    (make-char 'latin-iso8859-1 char)
+                  char))
+      (xemacs char)
+      (otherwise char))))
+
+(case mule-sysdep-version
+  ((2.3 2.4 3.0 4.0 4.1 xemacs) nil)
+  (otherwise (fset 'string-width 'length)))
+
+(and
+ (boundp 'MULE)
+ (not (featurep 'mule))
+ (provide 'mule))
+
+(provide 'mule-sysdp)

commit 112ca79bdec04ad1323d3af17fb167e7c0d65279
Author: Dave Love <address@hidden>
Date:   Wed Dec 20 20:41:24 2000 +0000

    (device-class): Try display-color-p first.

diff --git a/lisp/devices.el b/lisp/devices.el
index bc28c07..f27186f 100644
--- a/lisp/devices.el
+++ b/lisp/devices.el
@@ -1,14 +1,14 @@
 ;;; devices.el -- XEmacs device API emulation
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:07 $
-;; Version: $Revision: 1.1 $
+;; Author: $Author: fx $
+;; Created: $Date: 2000/12/20 20:41:24 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;; This file is part of GNU Emacs.
 ;;;
 ;;; GNU Emacs is free software; you can redistribute it and/or modify
 ;;; it under the terms of the GNU General Public License as published by
@@ -256,47 +256,53 @@ will automatically call `save-buffers-kill-emacs'.)"
     (otherwise 2)))
 
 (defun device-class (&optional device)
-  (case window-system
-    (x                                 ; X11
-     (cond
-      ((fboundp 'x-display-visual-class)
-       (let ((val (symbol-name (x-display-visual-class device))))
-        (cond
-         ((string-match "color" val) 'color)
-         ((string-match "gray-scale" val) 'grayscale)
-         (t 'mono))))
-      ((fboundp 'x-display-color-p)
-       (if (x-display-color-p device)
-          'color
-        'mono))
-      (t 'color)))
-    (pm                                        ; OS/2 Presentation Manager
-     (cond
-      ((fboundp 'pm-display-visual-class)
-       (let ((val (symbol-name (pm-display-visual-class device))))
-        (cond
-         ((string-match "color" val) 'color)
-         ((string-match "gray-scale" val) 'grayscale)
-         (t 'mono))))
-      ((fboundp 'pm-display-color-p)
-       (if (pm-display-color-p device)
-          'color
-        'mono))
-      (t 'color)))
-    (ns
-     (cond
-      ((fboundp 'ns-display-visual-class)
-       (let ((val (symbol-name (ns-display-visual-class device))))
-        (cond
-         ((string-match "color" val) 'color)
-         ((string-match "gray-scale" val) 'grayscale)
-         (t 'mono))))
-      ((fboundp 'ns-display-color-p)
-       (if (ns-display-color-p device)
-          'color
-        'mono))
-      (t 'mono)))
-    (otherwise 'color)))
+  (if (fboundp 'display-color-p)
+      (if (display-color-p device)
+         'color
+       (if (display-grayscale-p device)
+           'grayscale
+         'mono))
+    (case window-system
+      (x                ; X11
+       (cond
+       ((fboundp 'x-display-visual-class)
+        (let ((val (symbol-name (x-display-visual-class device))))
+          (cond
+           ((string-match "color" val) 'color)
+           ((string-match "gray-scale" val) 'grayscale)
+           (t 'mono))))
+       ((fboundp 'x-display-color-p)
+        (if (x-display-color-p device)
+            'color
+          'mono))
+       (t 'color)))
+      (pm ; OS/2 Presentation Manager
+       (cond
+       ((fboundp 'pm-display-visual-class)
+        (let ((val (symbol-name (pm-display-visual-class device))))
+          (cond
+           ((string-match "color" val) 'color)
+           ((string-match "gray-scale" val) 'grayscale)
+           (t 'mono))))
+       ((fboundp 'pm-display-color-p)
+        (if (pm-display-color-p device)
+            'color
+          'mono))
+       (t 'color)))
+      (ns
+       (cond
+       ((fboundp 'ns-display-visual-class)
+        (let ((val (symbol-name (ns-display-visual-class device))))
+          (cond
+           ((string-match "color" val) 'color)
+           ((string-match "gray-scale" val) 'grayscale)
+           (t 'mono))))
+       ((fboundp 'ns-display-color-p)
+        (if (ns-display-color-p device)
+            'color
+          'mono))
+       (t 'mono)))
+      (otherwise 'color))))
 
 (defun device-class-list ()
   "Returns a list of valid device classes."

commit 5e94c06ddae5364f314418bcf686739e9f151243
Author: Dave Love <address@hidden>
Date:   Wed Dec 20 20:40:37 2000 +0000

    (w3-event-glyph): New alias instead of
    event-glyph.

diff --git a/lisp/w3-menu.el b/lisp/w3-menu.el
index ee1818c..1d1abbc 100644
--- a/lisp/w3-menu.el
+++ b/lisp/w3-menu.el
@@ -1,7 +1,7 @@
 ;;; w3-menu.el --- Menu functions for emacs-w3
-;; Author: $Author: wmperry $
-;; Created: $Date: 2000/07/10 14:43:35 $
-;; Version: $Revision: 1.6 $
+;; Author: $Author: fx $
+;; Created: $Date: 2000/12/20 20:40:37 $
+;; Version: $Revision: 1.7 $
 ;; Keywords: menu, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -706,7 +706,6 @@ on that platform."
                '(
                  ps-print-color-p
                  url-automatic-caching
-                 url-be-asynchronous
                  url-honor-refresh-requests
                  url-privacy-level
                  url-cookie-confirmation
@@ -774,8 +773,9 @@ on that platform."
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Context-sensitive popup menu
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(if (not (fboundp 'event-glyph))
-    (fset 'event-glyph 'ignore))
+(if (fboundp 'event-glyph)
+    (defalias 'w3-event-glyph 'event-glyph)
+  (defalias 'w3-event-glyph 'ignore))
 
 (defun w3-menu-popup-menu (e menu)
   (if w3-running-xemacs
@@ -790,7 +790,7 @@ on that platform."
   (if (not w3-popup-menu-on-mouse-3)
       (call-interactively (lookup-key global-map (vector w3-mouse-button3)))
     (mouse-set-point e)
-    (let* ((glyph (event-glyph e))
+    (let* ((glyph (w3-event-glyph e))
           (widget (or (and glyph (glyph-property glyph 'widget))
                       (widget-at (point))))
           (parent (and widget (widget-get widget :parent)))

commit e215edd84a86bbda3a4adfda9f284db42c779d5c
Author: Dave Love <address@hidden>
Date:   Wed Dec 20 20:36:31 2000 +0000

    Comment.

diff --git a/lisp/w3-cus.el b/lisp/w3-cus.el
index 08100b5..2c5e8c9 100644
--- a/lisp/w3-cus.el
+++ b/lisp/w3-cus.el
@@ -1,7 +1,7 @@
 ;;; w3-cus.el --- Customization support for Emacs-W3
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:36:02 $
-;; Version: $Revision: 1.5 $
+;; Author: $Author: fx $
+;; Created: $Date: 2000/12/20 20:36:31 $
+;; Version: $Revision: 1.6 $
 ;; Keywords: comm, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -210,6 +210,11 @@ work at all if we're using text-properties)."
   ;; This is the HTML3.0 list (downcased) plus "made".
   '("previous" "next" "up" "down" "home" "toc" "index" "glossary"
     "copyright" "bookmark" "help" "made" "contents" "top")
+  ;; HTML 4 link types
+  ;; <URL:http://www.w3.org/TR/html401/types.html#type-links>:
+  ;; Alternate, Stylesheet, Start, Next, Prev, Contents, Index,
+  ;; Glossary, Copyright, Chapter, Section, Subsection, Appendix,
+  ;; Help, Bookmark
   "A list of the (lower-case) names which have special significance
 as the values of REL or REV attributes of <link> elements.  They will
 be presented on the toolbar or the links menu, for instance."

commit 51699a44dd80005ca744b0889a14ba21c6d0ccf7
Author: William M. Perry <address@hidden>
Date:   Wed Nov 15 13:58:28 2000 +0000

    Compilation fix under Emacs21 and mouse-track is disabled for emacs21 - it 
is no longer needed.

diff --git a/ChangeLog b/ChangeLog
index c4de55f..32608a5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2000-11-15  William M. Perry  <address@hidden>
+
+       * lisp/w3-mouse.el (not): Don't ever try to grab mouse-movement
+       events if we are running Emacs 21.
+
+       * lisp/w3-display.el (w3-decimal-to-alpha): Don't try to inline
+       this - it called itself recursively and so blew up Emacs'
+       byte-compiler.
+       (w3-decimal-to-alpha): Also fixed bug where large numbers did not
+       get converted correctly (3 letters or more were completely screwed
+       up).
+       (w3-decimal-to-roman): Don't inline this one either, just for
+       safety.
+
+2000-10-16  William M. Perry  <address@hidden>
+
+       * lisp/w3-e21.el (toolbar-file-icon): added definitions of
+       toolbar-file-icon and toolbar-printer-icon
+
 2000-10-02  William M. Perry  <address@hidden>
 
        * lisp/w3-e21.el (w3-setup-version-specifics): Advise this
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 0266cb9..9207d63 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 2000/07/10 14:43:33 $
-;; Version: $Revision: 1.23 $
+;; Created: $Date: 2000/11/15 13:58:28 $
+;; Version: $Revision: 1.24 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -209,7 +209,7 @@
                       "Runaway indentation!  Too deep for window width!")
                      fill-prefix)))
 
-(defsubst w3-decimal-to-roman (n)
+(defun w3-decimal-to-roman (n)
   ;; Convert from decimal to roman numerals
   (let ((curmod 1000)
        (str "")
@@ -238,12 +238,12 @@
            j (- j 2)))
     str))
 
-(defsubst w3-decimal-to-alpha (n)
+(defun w3-decimal-to-alpha (n)
   ;; Convert from decimal to alphabetical (a, b, c, ..., aa, ab,...)
   (cond
    ((< n 1) (char-to-string ?Z))
    ((<= n 26) (char-to-string (+ ?A (1- n))))
-   (t (concat (char-to-string (+ ?A (1- (/ n 27))))
+   (t (concat (w3-decimal-to-alpha (/ n 26))
              (w3-decimal-to-alpha (% n 26))))))
 
 (defsubst w3-get-style-info (info node &optional default)
@@ -557,12 +557,19 @@ If the face already exists, it is unmodified."
        (and extent (extent-buffer extent)))))
 
 (defun w3-widget-echo (widget &rest ignore)
+  (if (windowp widget)
+      ;; FSF emacs 21.x does some weird shit...
+      ;; args are window object pos
+      (debug)
+      (save-excursion
+       (set-buffer (window-buffer widget))
+       (setq widget (widget-at (cadr ignore)))))
   (save-excursion
     (set-buffer (or (w3-widget-buffer widget) (current-buffer)))
     (let* ((url (widget-get widget :href))
           (name (widget-get widget :name))
           (text (buffer-substring (widget-get widget :from)
-                                                (widget-get widget :to)))
+                                  (widget-get widget :to)))
           (title (widget-get widget :title))
           (check w3-echo-link)
           (msg nil))
diff --git a/lisp/w3-mouse.el b/lisp/w3-mouse.el
index 5feddd2..1757bab 100644
--- a/lisp/w3-mouse.el
+++ b/lisp/w3-mouse.el
@@ -1,7 +1,7 @@
 ;;; w3-menu.el --- Mouse specific functions for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/21 16:28:39 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 2000/11/15 13:58:28 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -85,7 +85,7 @@ the mouse click, opening it in another frame."
 
 (if (not w3-running-xemacs)
     (progn
-      (if w3-track-mouse
+      (if (and w3-track-mouse (not (= 21 emacs-major-version)))
          (define-key w3-mode-map [mouse-movement] 'w3-mouse-handler))
       (if w3-popup-menu-on-mouse-3
          (define-key w3-mode-map [down-mouse-3] 'w3-popup-menu))))

commit f070efb8fce7e109ebbe1496f0a8dfe2be68804c
Author: William M. Perry <address@hidden>
Date:   Mon Oct 16 15:36:56 2000 +0000

    added definitions of toolbar-file-icon and toolbar-printer-icon

diff --git a/lisp/w3-e21.el b/lisp/w3-e21.el
index ba4304e..4900206 100644
--- a/lisp/w3-e21.el
+++ b/lisp/w3-e21.el
@@ -1,7 +1,7 @@
 ;;; w3-e21.el --- Emacs 21.xx specific functions for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 2000/10/16 15:25:47 $
-;; Version: $Revision: 1.3 $
+;; Created: $Date: 2000/10/16 15:36:56 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: faces, help, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -49,5 +49,11 @@
 
 (add-hook 'tooltip-hook 'w3-tooltip-get-tips)
 
+(defvar toolbar-file-icon "new"
+  "Lame definition to look a little like XEmacs' toolbar for Emacs/W3")
+
+(defvar toolbar-printer-icon "print"
+  "Lame definition to look a little like XEmacs' toolbar for Emacs/W3")
+
 (provide 'w3-e21)
 (require 'w3-toolbar)

commit fb7f879f1dc8ea45e63fd9626837d15ea09d1b99
Author: William M. Perry <address@hidden>
Date:   Mon Oct 16 15:25:47 2000 +0000

    Toolbar support for Emacs 21.x

diff --git a/ChangeLog b/ChangeLog
index 01a56f1..c4de55f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2000-10-02  William M. Perry  <address@hidden>
+
+       * lisp/w3-e21.el (w3-setup-version-specifics): Advise this
+       function to create toolbar buttons in Emacs 21.x with toolbar
+       support.
+       (w3-mode-version-specifics): Advise this function to actually add
+       the toolbars to each buffer.
+
+       * lisp/w3-toolbar.el (w3-add-toolbar-to-buffer): Deal with
+       toolbars in Emacs 21.
+
 2000-07-28  Sam Steingold  <address@hidden>
 
        * lisp/Makefile.in: added w3-e21.el to W3_SOURCES
diff --git a/lisp/w3-e21.el b/lisp/w3-e21.el
index 277f13d..ba4304e 100644
--- a/lisp/w3-e21.el
+++ b/lisp/w3-e21.el
@@ -1,7 +1,7 @@
 ;;; w3-e21.el --- Emacs 21.xx specific functions for emacs-w3
-;; Author: $Author: sds $
-;; Created: $Date: 2000/07/28 17:17:20 $
-;; Version: $Revision: 1.2 $
+;; Author: $Author: wmperry $
+;; Created: $Date: 2000/10/16 15:25:47 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: faces, help, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -26,4 +26,28 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (require 'w3-e19)
+
+(defadvice w3-setup-version-specifics (after emacs21 pre act)
+  (and (featurep 'tool-bar)
+       (w3-toolbar-make-buttons)))
+
+(defadvice w3-mode-version-specifics (after emacs21 pre act)
+  (w3-add-toolbar-to-buffer))
+
+(defun w3-tooltip-get-tips (event)
+  (let (widget pos help start)
+    (setq start (event-start event)
+         pos (posn-point start)
+         widget (and pos (widget-at pos))
+         help (and widget (widget-get widget :help-echo)))
+    (if (functionp help)
+       (setq help (funcall help widget (posn-window start)
+                           (window-buffer (posn-window start))
+                           (posn-point start))))
+    (if (stringp help)
+       (tooltip-show help))))
+
+(add-hook 'tooltip-hook 'w3-tooltip-get-tips)
+
 (provide 'w3-e21)
+(require 'w3-toolbar)
diff --git a/lisp/w3-toolbar.el b/lisp/w3-toolbar.el
index ae28000..3821f70 100644
--- a/lisp/w3-toolbar.el
+++ b/lisp/w3-toolbar.el
@@ -1,7 +1,7 @@
 ;;; w3-toolbar.el --- Toolbar functions for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:36:11 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 2000/10/16 15:25:47 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: mouse, toolbar
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -95,6 +95,10 @@ not `none'.")
     [w3-toolbar-help-icon w3-show-info-node t "Help"])
   "The toolbar for w3")
 
+(if (featurep 'tool-bar)
+    (defun toolbar-make-button-list (up &optional dn no cap-up cap-dn cap-no)
+      (file-name-sans-extension up)))
+
 (defun w3-toolbar-make-captioned-buttons ()
   (mapcar
    (function
@@ -331,13 +335,29 @@ not `none'.")
     (popup-dialog-box descr)))
 
 (defun w3-add-toolbar-to-buffer ()
-  (if (or (not (featurep 'toolbar))
-         (featurep 'infodock))         ; InfoDock uses different toolbars
-      nil
+  (cond
+   ((featurep 'infodock)
+    ;; Infodock handles toolbars differently
+    nil)
+   ((featurep 'toolbar)
+    ;; XEmacs way of doing things
     (let ((toolbar (w3-toolbar-from-orientation w3-toolbar-orientation)))
       (if toolbar
          (set-specifier toolbar (cons (current-buffer) w3-toolbar))))
     (set-specifier toolbar-buttons-captioned-p
-                  (cons (current-buffer) (eq w3-toolbar-type 'both)))))
+                  (cons (current-buffer) (eq w3-toolbar-type 'both))))
+   ((featurep 'tool-bar)
+    ;; Emacs 21.x way of doing things
+    (let ((toolbar-map (make-sparse-keymap)))
+      (mapcar (lambda (desc)
+               (if (and desc (not (keywordp (aref desc 0))))
+                   (tool-bar-add-item (symbol-value (aref desc 0)) ; image
+                                      (aref desc 1) ; binding
+                                      (intern (aref desc 3)) ; key
+                                      toolbar-map ; keymap
+                                      :enable (aref desc 2)))) w3-toolbar)
+      (define-key w3-mode-map [tool-bar] toolbar-map)))
+   (t
+    nil)))
 
 (provide 'w3-toolbar)
diff --git a/lisp/w3.el b/lisp/w3.el
index b6b6b46..0d102d0 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 2000/07/10 14:43:37 $
-;; Version: $Revision: 1.14 $
+;; Created: $Date: 2000/10/16 15:25:47 $
+;; Version: $Revision: 1.15 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1956,6 +1956,8 @@ Current keymap is:
       (run-hooks 'w3-mode-hook)
       (widget-setup))))
 
+(put 'w3-mode 'mode-class 'special)
+
 (require 'url)
 (require 'w3-parse)
 (require 'w3-display)

commit 5061fc4796769407de06eb5683508ac0cb702b76
Author: Sam Steingold <address@hidden>
Date:   Fri Jul 28 17:17:15 2000 +0000

    added w3-e21.el to W3_SOURCES

diff --git a/ChangeLog b/ChangeLog
index cd241fb..01a56f1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2000-07-28  Sam Steingold  <address@hidden>
+
+       * lisp/Makefile.in: added w3-e21.el to W3_SOURCES
+
 2000-07-10  William M. Perry  <address@hidden>
 
        * lisp/w3-parse.el (w3-expand-entity-at-point-maybe): Wrap
@@ -28,7 +32,7 @@
 
        * lisp/w3.el (w3-fetch-callback): Added in special case for
        handling content-type of application/x-elisp-parsed-html, for when
-       we want to 
+       we want to
 
        * lisp/css.el (css-handle-import): Protect against
        url-insert-file-contents signalling an error.
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index 2ac4120..9ea7a93 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -31,6 +31,7 @@ W3_SOURCES =                                                  
        \
        w3-display.el                                                   \
        w3-e19.el                                                       \
        w3-e20.el                                                       \
+       w3-e21.el                                                       \
        w3-emulate.el                                                   \
        w3-forms.el                                                     \
        w3-hot.el                                                       \
diff --git a/lisp/w3-e20.el b/lisp/w3-e20.el
index 5ad8443..148b128 100644
--- a/lisp/w3-e20.el
+++ b/lisp/w3-e20.el
@@ -1,7 +1,7 @@
-;;; w3-e19.el --- Emacs 20.xx specific functions for emacs-w3
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:10 $
-;; Version: $Revision: 1.1 $
+;;; w3-e20.el --- Emacs 20.xx specific functions for emacs-w3
+;; Author: $Author: sds $
+;; Created: $Date: 2000/07/28 17:17:19 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: faces, help, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/lisp/w3-e21.el b/lisp/w3-e21.el
index db3536b..277f13d 100644
--- a/lisp/w3-e21.el
+++ b/lisp/w3-e21.el
@@ -1,7 +1,7 @@
-;;; w3-e21.el --- Emacs 20.xx specific functions for emacs-w3
-;; Author: $Author: wmperry $
-;; Created: $Date: 2000/07/10 14:43:34 $
-;; Version: $Revision: 1.1 $
+;;; w3-e21.el --- Emacs 21.xx specific functions for emacs-w3
+;; Author: $Author: sds $
+;; Created: $Date: 2000/07/28 17:17:20 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: faces, help, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

commit f4df5679673532c2e2b421f98470e7b40956468e
Author: William M. Perry <address@hidden>
Date:   Mon Jul 10 15:18:50 2000 +0000

    Protect against bad characters specified with &#xxx; when in mule.  Would 
abort the parse before, now just inserts '~' kind of like MULE would anyway

diff --git a/ChangeLog b/ChangeLog
index 9f0b928..cd241fb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2000-07-10  William M. Perry  <address@hidden>
+
+       * lisp/w3-parse.el (w3-expand-entity-at-point-maybe): Wrap
+       inserting of &#xxx; entities inside a condition-case so that we
+       won't choke and die when parsing a bad document.
+
 1999-12-23  William M. Perry  <address@hidden>
 
        * lisp/w3-speak-table.el (w3-table-focus-on-this-cell): Synch'd up
diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index 297d0d5..aacf7c0 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -382,7 +382,9 @@ which must be a string to use as the error message."
       ;; wrongo!  Apparently, mule doesn't do sane things with char-to-string
       ;; -wmp 7/9/96
       (let ((repl (cdr-safe (assq w3-p-s-num 
w3-invalid-sgml-char-replacement))))
-        (insert (or repl (mule-make-iso-character w3-p-s-num)))))
+        (condition-case ()
+            (insert (or repl (mule-make-iso-character w3-p-s-num)))
+          (error (insert "~")))))
      ((looking-at "&#\\(re\\|rs\\|space\\|tab\\)[\ ;\n]?") ; \n should be \r
       (replace-match (assq (upcase (char-after (+ 3 (point))))
                            '(;; *** Strictly speaking, record end should be

commit f1d64ab2b2429586a88410ff89ae00600aec99a6
Author: William M. Perry <address@hidden>
Date:   Mon Jul 10 14:43:31 2000 +0000

    Committed queued changes from god knows when

diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index 5c70332..2ac4120 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -38,7 +38,6 @@ W3_SOURCES =                                                  
        \
        w3-imap.el                                                      \
        w3-java.el                                                      \
        w3-keymap.el                                                    \
-       w3-keyword.el                                                   \
        w3-menu.el                                                      \
        w3-mouse.el                                                     \
        w3-parse.el                                                     \
diff --git a/lisp/descrip.mms b/lisp/descrip.mms
index 474927f..f5b8916 100644
--- a/lisp/descrip.mms
+++ b/lisp/descrip.mms
@@ -30,7 +30,7 @@ URLOBJECTS    = $(URLSOURCES:.el=.elc)
 SOURCES = \
        mule-sysdp.el w3-widget.el devices.el w3-imap.el                \
        css.el dsssl.el dsssl-flow.el font.el images.el w3-vars.el      \
-       w3-cus.el w3-style.el w3-keyword.el w3-forms.el w3-emulate.el   \
+       w3-cus.el w3-style.el w3-forms.el w3-emulate.el \
        w3-props.el w3-auto.el w3-menu.el w3-mouse.el w3-toolbar.el     \
        w3-speak.el w3-latex.el w3-parse.el w3-display.el               \
        w3-print.el w3-about.el w3-hot.el w3-e19.el w3-xemac.el w3.el   \
diff --git a/lisp/docomp.el b/lisp/docomp.el
index 472e3d6..772c759 100644
--- a/lisp/docomp.el
+++ b/lisp/docomp.el
@@ -8,8 +8,8 @@
 (push (or (getenv "GNUSDIR") (expand-file-name "../gnus/lisp/" srcdir)) 
load-path)
 (push (or (getenv "URLDIR") (expand-file-name "../url/lisp/" srcdir)) 
load-path)
 
-(setq max-specpdl-size (* 10 max-specpdl-size)
-      max-lisp-eval-depth (* 10 max-lisp-eval-depth))
+(setq max-specpdl-size (* 1000 max-specpdl-size)
+      max-lisp-eval-depth (* 1000 max-lisp-eval-depth))
 
 ;; If we are building w3 in a different directory than the source
 ;; directory, we must read *.el from source directory and write *.elc
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 8fb3ea2..0266cb9 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/24 12:16:35 $
-;; Version: $Revision: 1.22 $
+;; Created: $Date: 2000/07/10 14:43:33 $
+;; Version: $Revision: 1.23 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -29,7 +29,6 @@
 (require 'cl)
 (eval-when-compile
   (require 'w3-props))
-(require 'w3-keyword)
 (require 'css)
 (require 'font)
 (require 'url-parse)
@@ -210,6 +209,43 @@
                       "Runaway indentation!  Too deep for window width!")
                      fill-prefix)))
 
+(defsubst w3-decimal-to-roman (n)
+  ;; Convert from decimal to roman numerals
+  (let ((curmod 1000)
+       (str "")
+       (j 7)
+       i2 k curcnt)
+    (while (>= curmod 1)
+      (if (>= n curmod)
+         (progn
+           (setq curcnt (/ n curmod)
+                 n (- n (* curcnt curmod)))
+           (if (= 4 (% curcnt 5))
+               (setq i2 (+ j (if (> curcnt 5) 1 0))
+                     str (format "%s%c%c" str
+                                 (aref w3-roman-characters (1- j))
+                                 (aref w3-roman-characters i2)))
+             (progn
+               (if (>= curcnt 5)
+                   (setq str (format "%s%c" str (aref w3-roman-characters j))
+                         curcnt (- curcnt 5)))
+               (setq k 0)
+               (while (< k curcnt)
+                 (setq str (format "%s%c" str
+                                   (aref w3-roman-characters (1- j)))
+                       k (1+ k)))))))
+      (setq curmod (/ curmod 10)
+           j (- j 2)))
+    str))
+
+(defsubst w3-decimal-to-alpha (n)
+  ;; Convert from decimal to alphabetical (a, b, c, ..., aa, ab,...)
+  (cond
+   ((< n 1) (char-to-string ?Z))
+   ((<= n 26) (char-to-string (+ ?A (1- n))))
+   (t (concat (char-to-string (+ ?A (1- (/ n 27))))
+             (w3-decimal-to-alpha (% n 26))))))
+
 (defsubst w3-get-style-info (info node &optional default)
   (or (cdr-safe (assq info w3-display-css-properties)) default))
 
diff --git a/lisp/w3-e21.el b/lisp/w3-e21.el
new file mode 100644
index 0000000..db3536b
--- /dev/null
+++ b/lisp/w3-e21.el
@@ -0,0 +1,29 @@
+;;; w3-e21.el --- Emacs 20.xx specific functions for emacs-w3
+;; Author: $Author: wmperry $
+;; Created: $Date: 2000/07/10 14:43:34 $
+;; Version: $Revision: 1.1 $
+;; Keywords: faces, help, mouse, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1997, 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'w3-e19)
+(provide 'w3-e21)
diff --git a/lisp/w3-forms.el b/lisp/w3-forms.el
index a9afbdd..d33b4a1 100644
--- a/lisp/w3-forms.el
+++ b/lisp/w3-forms.el
@@ -1,7 +1,7 @@
 ;;; w3-forms.el --- Emacs-w3 forms parsing code for new display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:36:05 $
-;; Version: $Revision: 1.7 $
+;; Created: $Date: 2000/07/10 14:43:34 $
+;; Version: $Revision: 1.8 $
 ;; Keywords: faces, help, comm, data, languages
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -33,7 +33,6 @@
   (require 'cl))
 
 (eval-and-compile
-  (require 'w3-keyword)
   (require 'w3-mouse)
   (require 'w3-display)
   (require 'url)
diff --git a/lisp/w3-keyword.el b/lisp/w3-keyword.el
deleted file mode 100644
index b96d43c..0000000
--- a/lisp/w3-keyword.el
+++ /dev/null
@@ -1,126 +0,0 @@
-;;; w3-keyword.el --- Emacs-W3 binding style sheet mechanism
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/10/01 20:22:11 $
-;; Version: $Revision: 1.3 $
-;; Keywords: hypermedia
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Lots of generic keywords for use by Emacs-W3
-;;;
-;;; This is in a separate file just for sanity's sake - I cannot rely on
-;;; keywords being automatically recognized (ala XEmacs), and doing a
-;;; defconst doesn't work either, because the byte-compiler gets too
-;;; smart for us, and the .elc files are no longer portable.  Joy oh joy!
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(let ((keywords '(
-                 :align
-                 :average-pitch
-                 :link-title
-                 :background
-                 :center
-                 :data
-                 :depth
-                 :left-volume
-                 :right-volume
-                 :pitch-range
-                 :stress
-                 :richness
-                 :figalt
-                 :figdata
-                 :fillcol
-                 :form
-                 :formnum
-                 :gain
-                 :header-start
-                 :help-echo
-                 :href
-                 :link-args
-                 :image
-                 :lists
-                 :map
-                 :name
-                 :needspace
-                 :next-break
-                 :nofill
-                 :nowrap
-                 :optarg
-                 :options
-                 :pre-start
-                 :select
-                 :secret
-                 :table
-                 :text-mangler
-                 :title
-                 :w3-graphic
-                 :w3-form-data
-                 :zone
-                 :label-text
-                 :seen-this-url
-
-                 ;; These are duplicated from the font.el code
-                 ;; so that we can share .elc files...
-
-                 :family
-                 :weight
-                 :extra-light
-                 :light
-                 :demi-light
-                 :medium
-                 :normal
-                 :demi-bold
-                 :bold
-                 :extra-bold
-                 :style
-                 :size
-                 :registry
-                 :encoding
-
-                 ;; These are duplicated from the widget code
-                 ;; so that we can share .elc files
-                 :from
-                 :action
-                 :to
-                 :group
-                 :args
-                 :tag
-                 :tab-order
-                 :notify
-                 :button-keymap
-                 :ignore-case
-                 :parent
-                 :type
-                 :src
-                 :button-extent
-                 :active-face
-                 :visited-face
-                 :emacspeak-help
-                 :target
-  )))
-  (while keywords
-    (or (boundp (car keywords))
-       (set (car keywords) (car keywords)))
-    (setq keywords (cdr keywords))))
-
-(provide 'w3-keyword)
diff --git a/lisp/w3-menu.el b/lisp/w3-menu.el
index a85fc68..ee1818c 100644
--- a/lisp/w3-menu.el
+++ b/lisp/w3-menu.el
@@ -1,7 +1,7 @@
 ;;; w3-menu.el --- Menu functions for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:36:08 $
-;; Version: $Revision: 1.5 $
+;; Created: $Date: 2000/07/10 14:43:35 $
+;; Version: $Revision: 1.6 $
 ;; Keywords: menu, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -29,7 +29,6 @@
 (require 'w3-vars)
 (require 'w3-mouse)
 (require 'widget)
-(require 'w3-keyword)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; InfoDock stuff
@@ -115,6 +114,11 @@ on that platform."
                          (w3-menu-breakup (nthcdr max-len menu-desc) 
max-len))))
     menu-desc))
 
+(defun w3-menu-truncate-item (string)
+  (if (<= (length string) w3-max-menu-width)
+      string
+    (concat (substring string 0 w3-max-menu-width) "$")))
+
 (defun w3-menu-dummy-menu (item)
   (if w3-running-xemacs
       (list (vector item nil nil))
@@ -128,7 +132,7 @@ on that platform."
             (hot w3-hotlist))
         (while hot
           (setq hot-menu (cons (vector
-                                (w3-truncate-menu-item (car (car hot)))
+                                (w3-menu-truncate-item (car (car hot)))
                                 (list 'w3-fetch (car (cdr (car hot))))
                                 t) hot-menu)
                 hot (cdr hot)))
@@ -179,7 +183,7 @@ on that platform."
            widgets (cdr widgets)
            href (widget-get widget :href)
            menu (cons
-                 (vector (w3-truncate-menu-item
+                 (vector (w3-menu-truncate-item
                           (or (widget-get widget :title)
                               (w3-fix-spaces
                                (buffer-substring-no-properties
diff --git a/lisp/w3-style.el b/lisp/w3-style.el
index ea4a376..efdf5a4 100644
--- a/lisp/w3-style.el
+++ b/lisp/w3-style.el
@@ -1,7 +1,7 @@
 ;;; w3-style.el --- Emacs/W3 binding style sheet mechanism
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:36:11 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 2000/07/10 14:43:36 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: faces, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -33,7 +33,6 @@
 ;;; experimental W3C mechanism
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (require 'font)
-(require 'w3-keyword)
 (require 'cl)
 (require 'css)
 
diff --git a/lisp/w3-vars.el b/lisp/w3-vars.el
index 029ac1c..b5de3bb 100644
--- a/lisp/w3-vars.el
+++ b/lisp/w3-vars.el
@@ -1,7 +1,7 @@
 ;;; w3-vars.el,v --- All variable definitions for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:36:11 $
-;; Version: $Revision: 1.5 $
+;; Created: $Date: 2000/07/10 14:43:36 $
+;; Version: $Revision: 1.6 $
 ;; Keywords: comm, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -42,7 +42,7 @@
      (function (lambda (x) (if (= x ?-) "." (char-to-string x)))) x ""))
   "Version # of w3-mode.")
 
-(defconst w3-version-date (let ((x "$Date: 1999/12/05 08:36:11 $"))
+(defconst w3-version-date (let ((x "$Date: 2000/07/10 14:43:36 $"))
                            (if (string-match "Date: \\([^ \t\n]+\\)" x)
                                (substring x (match-beginning 1) (match-end 1))
                              x))
@@ -439,5 +439,4 @@ for a charset indication")
 (make-variable-buffer-local 'w3-table-structure)
 
 (require 'w3-keymap)
-(require 'w3-keyword)
 (provide 'w3-vars)
diff --git a/lisp/w3-widget.el b/lisp/w3-widget.el
index cd99a00..8a640e7 100644
--- a/lisp/w3-widget.el
+++ b/lisp/w3-widget.el
@@ -1,7 +1,7 @@
 ;;; w3-widget.el --- An image widget
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:36:12 $
-;; Version: $Revision: 1.3 $
+;; Created: $Date: 2000/07/10 14:43:37 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: faces, images
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -53,7 +53,6 @@
 (require 'cl)
 (require 'widget)
 (require 'url-util)
-(require 'w3-keyword)
 
 (defvar widget-image-keymap (make-sparse-keymap)
   "Keymap used over glyphs in an image widget")
diff --git a/lisp/w3.el b/lisp/w3.el
index 578c698..b6b6b46 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/11 00:54:09 $
-;; Version: $Revision: 1.13 $
+;; Created: $Date: 2000/07/10 14:43:37 $
+;; Version: $Revision: 1.14 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -53,89 +53,6 @@
   (require 'w3-display))
 
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Code for printing out roman numerals
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun w3-decimal-to-roman (n)
-  ;; Convert from decimal to roman numerals
-  (let ((curmod 1000)
-       (str "")
-       (j 7)
-       i2 k curcnt)
-    (while (>= curmod 1)
-      (if (>= n curmod)
-         (progn
-           (setq curcnt (/ n curmod)
-                 n (- n (* curcnt curmod)))
-           (if (= 4 (% curcnt 5))
-               (setq i2 (+ j (if (> curcnt 5) 1 0))
-                     str (format "%s%c%c" str
-                                 (aref w3-roman-characters (1- j))
-                                 (aref w3-roman-characters i2)))
-             (progn
-               (if (>= curcnt 5)
-                   (setq str (format "%s%c" str (aref w3-roman-characters j))
-                         curcnt (- curcnt 5)))
-               (setq k 0)
-               (while (< k curcnt)
-                 (setq str (format "%s%c" str
-                                   (aref w3-roman-characters (1- j)))
-                       k (1+ k)))))))
-      (setq curmod (/ curmod 10)
-           j (- j 2)))
-    str))
-
-(defun w3-decimal-to-alpha (n)
-  ;; Convert from decimal to alphabetical (a, b, c, ..., aa, ab,...)
-  (cond
-   ((< n 1) (char-to-string ?Z))
-   ((<= n 26) (char-to-string (+ ?A (1- n))))
-   (t (concat (char-to-string (+ ?A (1- (/ n 27))))
-             (w3-decimal-to-alpha (% n 26))))))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Functions to pass files off to external viewers
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun w3-start-viewer (fname cmd &optional view)
-  "Start a subprocess, named FNAME, executing CMD.
-If third arg VIEW is non-nil, show the output in a buffer when
-the subprocess exits."
-  (if view (save-excursion
-            (set-buffer (get-buffer-create view))
-            (erase-buffer)))
-  (start-process fname view shell-file-name shell-command-switch cmd))
-
-(defun w3-viewer-filter (proc string)
-  ;; A process filter for asynchronous external viewers
-  (if (= (length string) 0)
-      nil
-    (let ((buff (get-buffer-create (generate-new-buffer-name
-                                   (symbol-name
-                                    (read (nth 2 (process-command proc))))))))
-      (save-excursion
-       (set-buffer buff)
-       (erase-buffer)
-       (insert string)
-       (set-process-buffer proc buff)
-       (w3-notify-when-ready buff)
-       (set-process-filter proc nil)))))
-
-(defun w3-viewer-sentinel (proc string)
-  ;; Delete any temp files left from a viewer process.
-  (let ((fname (process-name proc))
-       (buffr (process-buffer proc))
-       (status (process-exit-status proc)))
-    (and (/= 0 status)
-        (funcall url-confirmation-func
-                 (format "Viewer for %s failed... save to disk? " fname))
-        (copy-file fname (read-file-name "Save as: ") t))
-    (if (and (file-exists-p fname)
-            (file-writable-p fname))
-       (delete-file fname)))
-  ;; FSF Emacs doesn't do this after calling a process-sentinel
-  (set-buffer (window-buffer (selected-window))))
-
 (defun w3-notify-when-ready (buff)
   "Notify the user when BUFF is ready.
 See the variable `w3-notify' for the different notification behaviors."
@@ -188,9 +105,7 @@ hypertext document."
  
 ;;;###autoload
 (defun w3-fetch-other-frame (&optional url)
-  "Attempt to follow the hypertext reference under point in a new frame.
-With prefix-arg P, ignore viewers and dump the link straight
-to disk."
+  "Attempt to follow the hypertext reference under point in a new frame."
   (interactive (list (w3-read-url-with-default)))
   (cond
    ((and (fboundp 'make-frame)
@@ -203,9 +118,7 @@ to disk."
    (t (w3-fetch url))))
 
 (defun w3-fetch-other-window (&optional url)
-  "Attempt to follow the hypertext reference under point in a new window.
-With prefix-arg P, ignore viewers and dump the link straight
-to disk."
+  "Attempt to follow the hypertext reference under point in a new window."
   (interactive (list (w3-read-url-with-default)))
   (split-window)
   (w3-fetch url))
@@ -267,7 +180,36 @@ If PROMPT (the prefix), prompt for a coding system to use."
         (car ctl))))
     (widen)))
 
+(defun w3-nasty-disgusting-http-equiv-handling (&optional buffer)
+  (let ((content-type nil)
+       (end-of-headers nil)
+       (extra-headers nil))
+    (save-excursion
+      (if buffer (set-buffer buffer))
+      (goto-char (point-min))
+      (mail-narrow-to-head)
+      (setq content-type (mail-fetch-field "content-type"))
+      (goto-char (point-max))          ; Make sure we are beyond the headers
+      (setq end-of-headers (point))
+      (widen)
+      (if (and content-type (string-match "^text/html" content-type)
+              (re-search-forward "</head" nil t))
+         (let ((case-fold-search t)
+               (end-of-head (point)))
+           ;; Need to find any <meta http-equiv> stuff in the head so
+           ;; we can promote them into the headers before
+           ;; mm-dissect-buffer looks for them.
+           (goto-char end-of-headers)
+           (while (re-search-forward "<meta[ \t\r\n]+http-equiv" end-of-head t)
+             (forward-char 5)
+             (skip-chars-forward " \t\r\n")
+             ;; We should now be directly in front of the first attribute name.
+             ;; Need to parse the tag attributes and push them up.
+             (message "address@hidden - Need to promote a header.")
+             (forward-char 1)))))))
+
 (defun w3-fetch-callback (url)
+  (w3-nasty-disgusting-http-equiv-handling)
   (let ((handle (mm-dissect-buffer t))
        (buff nil))
     (message "Downloading of `%s' complete." url)
@@ -540,11 +482,6 @@ the cdr is the 'next' node."
                " </body>\n"
                "</html>\n")))))
 
-(defun w3-truncate-menu-item (string)
-  (if (<= (length string) w3-max-menu-width)
-      string
-    (concat (substring string 0 w3-max-menu-width) "$")))
-
 (defun w3-insert-formatted-url (p)
   "Insert a formatted url into a buffer.  With prefix arg, insert the url
 under point."
diff --git a/texi/w3.txi b/texi/w3.txi
index 87f872e..94d8241 100644
--- a/texi/w3.txi
+++ b/texi/w3.txi
@@ -98,7 +98,7 @@ This manual corresponds to Emacs/W3 $State: Exp $
                                 other browsers.
 * Display Variables::           How to control Emacs/W3's look.
 * Stylesheets::                 How to control the look of web pages
-* Supported URLs::              What @sc{URL} schemes are supported.
+* Supported URLs::              What @sc{url} schemes are supported.
 * MIME Support::                Support for @sc{mime}
 * Security::                    Various security methods supported
 * Cookies::                     Emacs/W3 and cookies.
@@ -661,7 +661,7 @@ This (@code{w3-leave-buffer}) is similar to @code{w3-quit}, 
but the
 buffer is not killed, it is moved to the bottom of the buffer list (so
 it is the least likely to show up as the default with switch-to-buffer).
 This is different from @code{w3-goto-last-buffer} in that it does not
-return to the last @sc{WWW} page visited --- it is the same as using
+return to the last @sc{www} page visited --- it is the same as using
 @code{switch-to-buffer} --- the buffer left in the window is fairly
 random.
 @end table
@@ -4580,11 +4580,11 @@ Thiss the default server, it take the form 
(@samp{"Default server"}
 
 @item socks-server-aliases
 This a list of server aliases.  It is a list of aliases of the form
address@hidden(alias hostname port version)}.
address@hidden(alias hostname port version)}.
 
 @item socks-network-aliases
 This a list of network aliases.  Each entry in the list takes the form
address@hidden(alias (network))} where @var{alias} is a string that names the
address@hidden(alias (network))} where @var{alias} is a string that names the
 @var{network}.  The networks can contain a pair (not a dotted pair) of
 @sc{ip} addresses which specify a range of @sc{ip} addresses, an @sc{ip}
 address and a netmask, a domain name or a unique hostname or @sc{ip}
@@ -4592,7 +4592,7 @@ address.
 
 @item socks-redirection-rules
 This a list of redirection rules.  Each rule take the form
address@hidden(Destination network Connection type)} where @var{Destination
address@hidden(Destination network Connection type)} where @var{Destination
 network} is a network alias from @code{socks-network-aliases} and
 @var{Connection type} can be @code{nil} in which case a direct
 connection is used, or it can be an alias from

commit 7a3194fa2d9ad99fb2702f7151c7f8e2ee52e205
Author: William M. Perry <address@hidden>
Date:   Fri Dec 24 12:16:28 1999 +0000

    1999-12-23  William M. Perry  <address@hidden>
    
    * lisp/w3-speak-table.el (w3-table-focus-on-this-cell): Synch'd up
    with Thierry & Raman.  Provide default value for at-depth.
    Resurrect hyperlinks and images when focusing on a cell.
    (w3-table-setup-keys): New bindings for `,\' and `.\' to focus on
    and speak table cells.
    
    1999-12-22  William M. Perry  <address@hidden>
    
    * lisp/w3-parse.el (w3-parse-buffer): Allow \':\' in attribute
    names, to deal with stupid quasi-HTML/XML data output by MS Word
    9.x
    (w3-parse-buffer): Removed progress bar stuff, since it is causing
    XEmacs 21.2 betas to crash.

diff --git a/ChangeLog b/ChangeLog
index 94b5921..9f0b928 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
-1999-12-10  William M. Perry  <address@hidden>
+1999-12-23  William M. Perry  <address@hidden>
 
+       * lisp/w3-speak-table.el (w3-table-focus-on-this-cell): Synch'd up
+       with Thierry & Raman.  Provide default value for at-depth.
+       Resurrect hyperlinks and images when focusing on a cell.
+       (w3-table-setup-keys): New bindings for `,' and `.' to focus on
+       and speak table cells.
+
+1999-12-22  William M. Perry  <address@hidden>
+
+       * lisp/w3-parse.el (w3-parse-buffer): Allow ':' in attribute
+       names, to deal with stupid quasi-HTML/XML data output by MS Word
+       9.x
+       (w3-parse-buffer): Removed progress bar stuff, since it is causing
+       XEmacs 21.2 betas to crash.
 
 1999-12-06  William M. Perry  <address@hidden>
 
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index dde59f7..8fb3ea2 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/11 00:54:44 $
-;; Version: $Revision: 1.21 $
+;; Created: $Date: 1999/12/24 12:16:35 $
+;; Version: $Revision: 1.22 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2475,27 +2475,27 @@ Format: (((image-alt row column) . offset) ...)")
             (w3-handle-empty-tag))
            (meta
             ;; FIXME!!! This is broken for the new URL package.
-            (let* ((equiv (cdr-safe (assq 'http-equiv args)))
-                   (value (w3-get-attribute 'content))
-                   (name  (w3-get-attribute 'name))
-                   (node  (and equiv (assoc (setq equiv (downcase equiv))
-                                            url-current-mime-headers))))
-              (if equiv
-                  (setq url-current-mime-headers (cons
-                                                  (cons equiv value)
-                                                  url-current-mime-headers)))
-              (if name
-                  (setq w3-current-metainfo (cons
-                                             (cons name value)
-                                             w3-current-metainfo)))
-
-              ;; Special-case the Set-Cookie header
-              (if (and equiv (string= (downcase equiv) "set-cookie"))
-                  (url-cookie-handle-set-cookie value))
-              ;; Special-case the refresh header
-              (if (and equiv (string= (downcase equiv) "refresh"))
-                  ;; FIXME!!!
-                  (url-handle-refresh-header value)))
+            '(let* ((equiv (cdr-safe (assq 'http-equiv args)))
+                    (value (w3-get-attribute 'content))
+                    (name  (w3-get-attribute 'name))
+                    (node  (and equiv (assoc (setq equiv (downcase equiv))
+                                             url-current-mime-headers))))
+               (if equiv
+                   (setq url-current-mime-headers (cons
+                                                   (cons equiv value)
+                                                   url-current-mime-headers)))
+               (if name
+                   (setq w3-current-metainfo (cons
+                                              (cons name value)
+                                              w3-current-metainfo)))
+
+               ;; Special-case the Set-Cookie header
+               (if (and equiv (string= (downcase equiv) "set-cookie"))
+                   (url-cookie-handle-set-cookie value))
+               ;; Special-case the refresh header
+               (if (and equiv (string= (downcase equiv) "refresh"))
+                   ;; FIXME!!!
+                   (url-handle-refresh-header value)))
             (w3-handle-empty-tag)
             )
            (link
diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index 9bffd54..297d0d5 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -2117,14 +2117,9 @@ Returns a data structure containing the parsed 
information."
            ;; of results
            (cond ((= 0 (% (setq loop-count (1+ loop-count)) 40))
                   (if status-message-format
-                      (progn
-                        (if (fboundp 'progress)
-                            (progress "Parsing %s"
-                                      (truncate (/ (* (point) one-hundred) 
(point-max)))
-                                      (url-pretty-length (point-max))))
-                        (message status-message-format
-                                 ;; Percentage of buffer processed.
-                                 (/ (* (point) one-hundred) (point-max)))))))
+                      (message status-message-format
+                               ;; Percentage of buffer processed.
+                               (/ (* (point) one-hundred) (point-max))))))
       
            ;; Go to next interesting thing in the buffer.
            (skip-chars-forward w3-p-d-non-markup-chars)
@@ -2180,7 +2175,7 @@ Returns a data structure containing the parsed 
information."
                          "[ \n\r\t,]*"
                          ;; The attribute name, possibly with a bad syntax
                          ;; component.
-                         "\\([a-z_][-a-z0-9.]*\\(\\([_][-a-z0-9._]*\\)?\\)\\)"
+                         
"\\([a-z_:][-a-z0-9.]*\\(\\([_][-a-z0-9._:]*\\)?\\)\\)"
                          ;; Trailing whitespace and perhaps an "=".
                          "[ \n\r\t]*\\(\\(=[ \n\r\t]*\\)?\\)")))
                
@@ -2820,8 +2815,6 @@ Returns a data structure containing the parsed 
information."
          (if status-message-format
              (message "%sdone" (format status-message-format 100)))
     
-         (if (fboundp 'clear-progress) (clear-progress))
-
          ;; *** For debugging, save the true parse tree.
          ;; *** Make this look inside *DOCUMENT.
          (setq w3-last-parse-tree
diff --git a/lisp/w3-speak-table.el b/lisp/w3-speak-table.el
index 99e1041..3e636cb 100644
--- a/lisp/w3-speak-table.el
+++ b/lisp/w3-speak-table.el
@@ -1,4 +1,4 @@
-;;;$Id: w3-speak-table.el,v 1.2 1999/01/05 12:42:03 wmperry Exp $
+;;;$Id: w3-speak-table.el,v 1.3 1999/12/24 12:16:41 wmperry Exp $
 ;;;Authors: Thierry Emery <address@hidden>, T.V. Raman <address@hidden>
 ;;;Description: Speak W3 tables
 
@@ -395,6 +395,7 @@ contents being displayed in a separate buffer in W3 mode.
 This is useful to navigate pages that use a single table
 cell for a newspaper style column"
   (interactive "p")
+  (setq at-depth (or at-depth 1))
   (let ((contents (w3-table-this-cell-contents at-depth))
         (buffer (get-buffer-create
                  (format "Cell-%s" (buffer-name))))
@@ -404,7 +405,9 @@ cell for a newspaper style column"
       (erase-buffer)
       (w3-mode)
       (insert contents)
-      (goto-char (point-min)))
+      (goto-char (point-min))
+      (w3-resurrect-hyperlinks)
+      (w3-resurrect-images))
     (switch-to-buffer buffer)))
 
 
@@ -661,6 +664,9 @@ Prefix arg can be used to specify the desired table 
nesting."
   "Setup emacspeak table browsing keys in w3 mode"
   (declare (special emacspeak-prefix w3-mode-map))
   (let ((key (make-vector 1 (aref emacspeak-prefix 0))))
+    (define-key w3-mode-map ","
+      'w3-table-focus-on-this-cell)
+    (define-key w3-mode-map "." 'w3-table-speak-this-cell)
     (define-key w3-mode-map
       (concat emacspeak-prefix "=")
       'w3-table-move-to-top-of-table-column)

commit a765d87af0f0bd27cd454e5e275c0d26ffe06e1b
Author: William M. Perry <address@hidden>
Date:   Fri Dec 17 21:55:32 1999 +0000

    *** empty log message ***

diff --git a/lisp/w3-dired.el b/lisp/w3-dired.el
new file mode 100644
index 0000000..a907351
--- /dev/null
+++ b/lisp/w3-dired.el
@@ -0,0 +1,113 @@
+;;; w3-dired.el --- Main functions for Emacs-W3 on all platforms/versions
+;; Author: $Author: wmperry $
+;; Created: $Date: 1999/12/17 21:55:32 $
+;; Version: $Revision: 1.1 $
+;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; This is a minor mode for invoking Emacs/W3 from a dired buffer
+;;;
+;;; To enable for all dired buffers, put this in your .emacs file:
+;;;
+;;; (add-hook 'dired-mode-hook 'turn-on-w3-dired)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar w3-dired-minor-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "b" 'w3-dired-find-file)
+    map)
+  "Keymap used when browsing directories.")
+
+(defvar w3-dired-minor-mode nil
+  "Whether we are in w3-dired-minor-mode")
+
+(make-variable-buffer-local 'w3-dired-minor-mode)
+
+(defun w3-dired-find-file ()
+  "In dired, visit the file or directory named on this line, using Emacs-W3."
+  (interactive)
+  (let ((filename (dired-get-filename)))
+    (cond ((string-match "/\\(address@hidden):\\(/.*\\)" filename)
+          (w3-fetch (concat "file://" (match-string 1 filename) (match-string 
2 filename))))
+         (t
+          (w3-open-local filename)))))
+
+(defun w3-dired-find-file-mouse (event)
+  "In dired, visit the file or directory name you click on, using Emacs-W3."
+  (interactive "@e")
+    (if (event-point event)
+       (progn
+         (goto-char (event-point event))
+         (w3-dired-find-file))))
+
+;;;###autoload
+(defun w3-dired-minor-mode (&optional arg)
+  "Minor mode for directory browsing with Emacs-W3."
+  (interactive "P")
+  (cond
+   ((null arg)
+    (setq w3-dired-minor-mode (not w3-dired-minor-mode)))
+   ((equal 0 arg)
+    (setq w3-dired-minor-mode nil))
+   (t
+    (setq w3-dired-minor-mode t))))
+
+(if (not (fboundp 'add-minor-mode))
+    (defun add-minor-mode (toggle name &optional keymap after toggle-fun)
+      "Add a minor mode to `minor-mode-alist' and `minor-mode-map-alist'.
+TOGGLE is a symbol which is used as the variable which toggle the minor mode,
+NAME is the name that should appear in the modeline (it should be a string
+beginning with a space), KEYMAP is a keymap to make active when the minor
+mode is active, and AFTER is the toggling symbol used for another minor
+mode.  If AFTER is non-nil, then it is used to position the new mode in the
+minor-mode alists.  TOGGLE-FUN specifies an interactive function that
+is called to toggle the mode on and off; this affects what appens when
+button2 is pressed on the mode, and when button3 is pressed somewhere
+in the list of modes.  If TOGGLE-FUN is nil and TOGGLE names an
+interactive function, TOGGLE is used as the toggle function.
+
+Example:  (add-minor-mode 'view-minor-mode \" View\" view-mode-map)"
+      (if (not (assq toggle minor-mode-alist))
+         (setq minor-mode-alist (cons (list toggle name) minor-mode-alist)))
+      (if (and keymap (not (assq toggle minor-mode-map-alist)))
+         (setq minor-mode-map-alist (cons (cons toggle keymap)
+                                          minor-mode-map-alist)))))
+
+(add-minor-mode 'w3-dired-minor-mode " W3" w3-dired-minor-mode-map)
+
+;;;###autoload
+(defun w3-dired-find-file (dir)
+  "\"Edit\" directory DIR, but with additional URL-friendly bindings."
+  (interactive "DURL Dired (directory): ")
+  (find-file dir)
+  (w3-dired-minor-mode t))
+
+;;;###autoload
+(defun turn-on-w3-dired ()
+  "Unconditionally turn on W3 Dired bindings."
+  (if (not (eq major-mode 'dired-mode))
+      (error "w3-dired-minor-mode only makes sense in dired buffers."))
+  (w3-dired-minor-mode t))
+
+(provide 'w3-dired)

commit ffb824e2aaa8b6a9d4f97d242a2934e5d07d3fc6
Author: William M. Perry <address@hidden>
Date:   Wed Dec 15 18:36:35 1999 +0000

    *** empty log message ***

diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index 9aa2e6d..5c70332 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -27,6 +27,7 @@ W3_SOURCES =                                                  
        \
        url-hotlist.el                                                  \
        w3-cfg.el                                                       \
        w3-cus.el                                                       \
+       w3-dired.el                                                     \
        w3-display.el                                                   \
        w3-e19.el                                                       \
        w3-e20.el                                                       \

commit 7984e0550e0e4626df634c22d9a2708925ffe1da
Author: William M. Perry <address@hidden>
Date:   Sat Dec 11 00:55:02 1999 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index a86fd60..94b5921 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,27 @@
+1999-12-10  William M. Perry  <address@hidden>
+
+
+1999-12-06  William M. Perry  <address@hidden>
+
+       * lisp/w3-display.el (w3-prepare-tree): Analog to
+       w3-prepare-buffer, but works on a ready-made parse tree instead of
+       parsing it on the fly.
+
+       * lisp/w3.el (w3-fetch-callback): Added in special case for
+       handling content-type of application/x-elisp-parsed-html, for when
+       we want to 
+
+       * lisp/css.el (css-handle-import): Protect against
+       url-insert-file-contents signalling an error.
+       (css-handle-import): Use url-insert-file-contents instead of the
+       old url-retrieve interface.  We cannot retrieve stylesheets
+       asynchronously (for now).
+       (css-expand-value): Nuke quotes around URL attributes.
+
 1999-12-05  William M. Perry  <address@hidden>
 
        * lisp/w3-display.el (w3-prepare-buffer): Don't do the history
-         stuff - this died a long time ago anyway.
+       stuff - this died a long time ago anyway.
 
 1999-12-05  Dave Love  <address@hidden>
 
@@ -10,16 +30,16 @@
 1999-12-05  William M. Perry  <address@hidden>
 
        * lisp/w3.el (w3-fetch): Urk, call w3-notify-when-ready if we
-         found a buffer visiting the URL, otherwise nothing happens.
-         User just silently gets no feedback about the operation.
+       found a buffer visiting the URL, otherwise nothing happens.
+       User just silently gets no feedback about the operation.
 
        * w3.el: Lots of changes to work with the new URL package.
 
        * w3-vars.el: Removed lots of old varialbes.  Updated to use new
-         URL package where necessary.
-         (w3-graphlink-menu): Removed the 'info' menu item.  Not
-         (re)implemented yet.
-         (w3-hyperlink-menu): Ditto.
+       URL package where necessary.
+       (w3-graphlink-menu): Removed the 'info' menu item.  Not
+       (re)implemented yet.
+       (w3-hyperlink-menu): Ditto.
 
        * w3-toolbar.el (w3-mouse-print-this-url): Ditto.
 
@@ -29,54 +49,54 @@
 
        * w3-menu.el: Removed LaTeX-related menu entries.
        (w3-menu-links-constructor): Expand the URL in the menu
-         constructor if necessary, don't use url-maybe-relative anymore.
+       constructor if necessary, don't use url-maybe-relative anymore.
 
        * w3-keymap.el: New separate file just for keymaps
 
        * w3-java.el: Deal with removal of old 'mm' file and use
-         mailcap.el functions.
+       mailcap.el functions.
 
        * w3-forms.el: Removed gopher query support.
 
        * w3-emulate.el: Remove arena masquerade code.  Does anybody even
-         use this masquerading code?
+       use this masquerading code?
 
        * w3-jscript.el, w3-elisp.el, w3-script.el: Removed files related
-         to scripting.
+       to scripting.
 
        * w3-xemac.el (w3-mouse-handler): Ditto.
 
        * w3-e19.el (w3-mouse-handler): Don't bother with scripting
-         elements yet.
+       elements yet.
 
        * w3-display.el: Lots of changes to deal with the new URL package
-         and using the new mailcap.el file from Gnus.
+       and using the new mailcap.el file from Gnus.
 
        * w3-cus.el: Removed lots of obsolete variables
 
        * w3-hot.el (w3-hotlist-add-document): Disable due to default use
-         of html bookmark files now.
-         (w3-hotlist-delete): Ditto.
-         (w3-hotlist-apropos): Use new URL-based hotlist interface
-         (w3-hotlist-view): Ditto.
-         (w3-use-hotlist): Now deals with html-based bookmark lists.
-         (w3-hot-convert-to-alist): New function to conver an internal
-         bookmark list to an assoc list with oddly formatted keys.
-         (w3-read-html-bookmarks): Don't set w3-html-bookmarks any more -
-         this will be the main format now.
-         (w3-hot-push-now-item): Don't push a menu-object onto the list,
-         use a regular format we can convert to a menu when necessary.
+       of html bookmark files now.
+       (w3-hotlist-delete): Ditto.
+       (w3-hotlist-apropos): Use new URL-based hotlist interface
+       (w3-hotlist-view): Ditto.
+       (w3-use-hotlist): Now deals with html-based bookmark lists.
+       (w3-hot-convert-to-alist): New function to conver an internal
+       bookmark list to an assoc list with oddly formatted keys.
+       (w3-read-html-bookmarks): Don't set w3-html-bookmarks any more -
+       this will be the main format now.
+       (w3-hot-push-now-item): Don't push a menu-object onto the list,
+       use a regular format we can convert to a menu when necessary.
 
        * url-hotlist.el: New URL-based interface for searching your
-         hotlist.
+       hotlist.
 
 1999-12-04  William M. Perry  <address@hidden>
 
        * lisp/base64.el: Updated to latest base64.el from Kyle.  Now no 
conflicts
-         between this and the Gnus-distributed version.
+       between this and the Gnus-distributed version.
 
 1999-12-03  William M. Perry  <address@hidden>
 
        * lisp/font.el (font-set-face-font-new-redisplay): Don't set the :family
-         face attribute if it is nil.  The new redisplay doesn't like that.
+       face attribute if it is nil.  The new redisplay doesn't like that.
 
diff --git a/TODO b/TODO
index 33e4fb4..d217ddc 100644
--- a/TODO
+++ b/TODO
@@ -3,6 +3,7 @@ BUGS (4.0):
 - border-color can have multiple color specifications, but we
   currently choke with 'args out of range' when we see this.
 - document how to translate Netscape foo.pac files to emacs lisp
+- Make LinuxConf URLs work (they use = and & in URLs)
 
 BUGS (4.1):
 - background colors are not heeded on table rows (<tr>).  Same
diff --git a/build-dist b/build-dist
index 19292f6..e700407 100755
--- a/build-dist
+++ b/build-dist
@@ -28,7 +28,6 @@ export CVSROOT
 
 ( cd .    ; cvs admin -s"p${version}" README )
 ( cd lisp ; cvs admin -s"p${version}" w3-vars.el )
-( cd lisp ; cvs admin -s"p${version}" url-vars.el )
 ( cd texi ; cvs admin -s"v${version}" w3.txi )
 ( cd texi ; cvs admin -s"v${version}" w3-faq.txi )
 
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index 0342667..9aa2e6d 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -17,7 +17,7 @@ URLDIR    = @URL@
 INSTALL   = @INSTALL@
 RM        = rm -f
 
-DEPS = -l $(srcdir)/docomp.el -l $(srcdir)/url-vars.el -l $(srcdir)/w3-vars.el
+DEPS = -l $(srcdir)/docomp.el -l $(URLDIR)/url-vars.el -l $(srcdir)/w3-vars.el
 
 # compile with noninteractive and relatively clean environment
 BATCHFLAGS = -batch -q -no-site-file

commit 3de00789bddca9ca167b2a8260c0753a71b5262b
Author: William M. Perry <address@hidden>
Date:   Sat Dec 11 00:54:44 1999 +0000

        * lisp/w3-display.el (w3-prepare-tree): Analog to
        w3-prepare-buffer, but works on a ready-made parse tree instead of
        parsing it on the fly.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 8d879cb..dde59f7 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 19:58:38 $
-;; Version: $Revision: 1.20 $
+;; Created: $Date: 1999/12/11 00:54:44 $
+;; Version: $Revision: 1.21 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2748,7 +2748,16 @@ Format: (((image-alt row column) . offset) ...)")
     (set-buffer-modified-p nil)
     (goto-char (min origin (point-max)))))
 
-(defun w3-prepare-buffer (&rest args)
+(defun w3-prepare-tree (parse)
+  (w3-draw-tree parse)
+  (set-buffer-modified-p nil)
+  (setq w3-current-parse parse
+       w3-current-source nil)
+  (w3-finish-drawing)
+  (w3-mode)
+  (w3-maybe-fetch-frames))
+
+(defun w3-prepare-buffer ()
   ;; The text/html viewer - does all the drawing and displaying of the buffer
   ;; that is necessary to go from raw HTML to a good presentation.
   (let* ((source (buffer-string))

commit f21d79bc28b67b406727761b050b132daadd192a
Author: William M. Perry <address@hidden>
Date:   Sat Dec 11 00:54:09 1999 +0000

        * lisp/w3.el (w3-fetch-callback): Added in special case for
        handling content-type of application/x-elisp-parsed-html, for when
        we want to

diff --git a/lisp/w3.el b/lisp/w3.el
index 72f3717..578c698 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 19:58:39 $
-;; Version: $Revision: 1.12 $
+;; Created: $Date: 1999/12/11 00:54:09 $
+;; Version: $Revision: 1.13 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -273,24 +273,27 @@ If PROMPT (the prefix), prompt for a coding system to 
use."
     (message "Downloading of `%s' complete." url)
     (w3-decode-charset)
     (url-mark-buffer-as-dead (current-buffer))
-    (if (equal (car-safe (mm-handle-type handle)) "text/html")
-       ;; Special case text/html if it comes through w3-fetch
-       (progn
-         (setq buff (generate-new-buffer " *w3-html*"))
-         (set-buffer buff)
-         (setq url-current-object (url-generic-parse-url url))
-         (mm-insert-part handle)
-         (w3-prepare-buffer)
-         (w3-notify-when-ready (current-buffer)))
-      (if (mm-inlinable-p handle)
-         ;; We can view it inline!
-         (progn
-           (setq buff (generate-new-buffer url))
-           (set-buffer buff)
-           (mm-display-part handle)
-           (w3-notify-when-ready (current-buffer)))
-       ;; Must be an external viewer
-       (mm-display-part handle)))
+    (cond
+     ((equal (car-safe (mm-handle-type handle)) "text/html")
+      ;; Special case text/html if it comes through w3-fetch
+      (setq buff (generate-new-buffer " *w3-html*"))
+      (set-buffer buff)
+      (setq url-current-object (url-generic-parse-url url))
+      (mm-insert-part handle)
+      (w3-prepare-buffer)
+      (w3-notify-when-ready (current-buffer)))
+     ((equal (car-safe (mm-handle-type handle)) 
"application/x-elisp-parsed-html")
+      ;; Also need to special-case pre-parsed representations of HTML
+      (w3-prepare-tree (read (set-marker (make-marker) 1 (mm-handle-buffer 
handle)))))
+     ((mm-inlinable-p handle)
+      ;; We can view it inline!
+      (setq buff (generate-new-buffer url))
+      (set-buffer buff)
+      (mm-display-part handle)
+      (w3-notify-when-ready (current-buffer)))
+     (t
+      ;; Must be an external viewer
+      (mm-display-part handle)))
     (mm-destroy-parts handle)))
 
 ;;;###autoload
@@ -1527,7 +1530,7 @@ No arg means whole window full.  Arg is number of lines 
to scroll."
                (setq possible (cons href possible))))
          (case (length possible)
            (0                          ; No mailto links found
-            (w3-fetch x))              ; fall back onto first 'made' link
+            (w3-fetch href))           ; fall back onto first 'made' link
            (1                          ; Only one found, get it
             (w3-fetch (car possible)))
            (otherwise

commit 2a7af17de94915f8b613c9d14e46d6a9e7ba6dd4
Author: William M. Perry <address@hidden>
Date:   Sat Dec 11 00:53:12 1999 +0000

        * lisp/css.el (css-handle-import): Protect against
        url-insert-file-contents signalling an error.
        (css-handle-import): Use url-insert-file-contents instead of the
        old url-retrieve interface.  We cannot retrieve stylesheets
        asynchronously (for now).
        (css-expand-value): Nuke quotes around URL attributes.

diff --git a/lisp/css.el b/lisp/css.el
index f0e9c3d..8d8f227 100644
--- a/lisp/css.el
+++ b/lisp/css.el
@@ -1,7 +1,7 @@
 ;;; css.el -- Cascading Style Sheet parser
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/09 19:56:30 $
-;; Version: $Revision: 1.3 $
+;; Created: $Date: 1999/12/11 00:53:12 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -521,8 +521,13 @@ For a terminal frame, the value is always 1."
         (setq value (css-expand-color value)))
        (url                            ; CSS, Section 6.4
         (declare (special url purl))
+        ;; Potentially remove url(...) from around the URL
         (if (string-match "url *(\\([^ )]+\\) *)" value)
             (setq value (match-string 1 value)))
+        ;; Nuke quotes
+        (if (string-match "\"\\([^\"]+\\)\"" value)
+            (setq value (match-string 1 value)))
+        ;; Nuke whitespace
         (if (string-match " *\\([^ ]+\\) *" value)
             (setq value (match-string 1 value)))
         (setq value (url-expand-file-name value (or url purl))))
@@ -723,14 +728,14 @@ For a terminal frame, the value is always 1."
     (setq purl url-current-object)
     (setq url (css-expand-value 'url data))
     (and url
-        (let ((url-working-buffer (generate-new-buffer-name " *styleimport*"))
-              (url-mime-accept-string
-               "text/css ; level=2")
+        (let ((url-mime-accept-string "text/css ; level=2")
               (sheet nil))
           (save-excursion
-            (set-buffer (get-buffer-create url-working-buffer))
-            (setq url-be-asynchronous nil)
-            (url-retrieve url)
+            (set-buffer (generate-new-buffer " *styleimport*"))
+            ;; ftp/file URLs can signal an error.
+            (condition-case ()
+                (url-insert-file-contents url)
+              (error nil))
             (css-clean-buffer)
             (setq sheet (buffer-string))
             (set-buffer-modified-p nil)
@@ -919,13 +924,14 @@ For a terminal frame, the value is always 1."
        (val nil)
        (device-type nil)
        (purl (url-view-url t))
+       (pobj url-current-object)
        (active-device-types (css-active-device-types (selected-device)))
        (sheet inherit))
     (if (not sheet)
        (setq sheet (make-hash-table :size 13 :test 'eq)))
     (save-excursion
-      (set-buffer (get-buffer-create
-                  (generate-new-buffer-name " *style*")))
+      (set-buffer (generate-new-buffer " *style*"))
+      (setq url-current-object pobj)
       (set-syntax-table css-syntax-table)
       (erase-buffer)
       (if url (url-insert-file-contents url))

commit 627cdc1fe0cf5d9500be6fba2ccf69f0ea59ddfa
Author: William M. Perry <address@hidden>
Date:   Sun Dec 5 19:58:34 1999 +0000

    * lisp/w3-display.el (w3-prepare-buffer): Don't do the history
      stuff - this died a long time ago anyway.
    
    * lisp/Makefile.in (W3_OBJECTS): Use W3_SOURCES, not SOURCES.
    
    * lisp/w3.el (w3-fetch): Urk, call w3-notify-when-ready if we
      found a buffer visiting the URL, otherwise nothing happens.
      User just silently gets no feedback about the operation.

diff --git a/ChangeLog b/ChangeLog
index 0d5c9d2..a86fd60 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
 1999-12-05  William M. Perry  <address@hidden>
 
+       * lisp/w3-display.el (w3-prepare-buffer): Don't do the history
+         stuff - this died a long time ago anyway.
+
+1999-12-05  Dave Love  <address@hidden>
+
+       * lisp/Makefile.in (W3_OBJECTS): Use W3_SOURCES, not SOURCES.
+
+1999-12-05  William M. Perry  <address@hidden>
+
        * lisp/w3.el (w3-fetch): Urk, call w3-notify-when-ready if we
          found a buffer visiting the URL, otherwise nothing happens.
          User just silently gets no feedback about the operation.
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index b061c77..0342667 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -57,7 +57,7 @@ UTIL_SOURCES =                                                
                \
 
 AUTO_SOURCES = auto-autoloads.el custom-load.el w3-auto.el w3-cfg.el
 
-W3_OBJECTS = $(SOURCES:.el=.elc)
+W3_OBJECTS = $(W3_SOURCES:.el=.elc)
 UTIL_OBJECTS = $(UTIL_SOURCES:.el=.elc)
 AUTO_OBJECTS = $(AUTO_SOURCES:.el=.elc)
 
diff --git a/lisp/docomp.el b/lisp/docomp.el
index 75b76cb..472e3d6 100644
--- a/lisp/docomp.el
+++ b/lisp/docomp.el
@@ -1,5 +1,7 @@
 ;;; First things first - if they do not have the WIDGETDIR environment
 ;;; variable set, choke, scream, and die.
+(require 'cl)
+
 (setq srcdir (or (getenv "W3SRCDIR") "."))
 
 (push srcdir load-path)
@@ -89,7 +91,6 @@
 (w3-load-flavors)
 (w3-setup-version-specifics)
 
-(require 'cl)
 (require 'w3-sysdp)
 (require 'w3-vars)
 (require 'url)
diff --git a/lisp/font.el b/lisp/font.el
index 568383e..fba488a 100644
--- a/lisp/font.el
+++ b/lisp/font.el
@@ -1,7 +1,7 @@
 ;;; font.el --- New font model
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:35:46 $
-;; Version: $Revision: 1.4 $
+;; Created: $Date: 1999/12/05 19:58:37 $
+;; Version: $Revision: 1.5 $
 ;; Keywords: faces
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -59,7 +59,9 @@
       "Return t if X is a face name or an internal face vector."
       (declare (special global-face-data))
       (if (not window-system)
-         nil                           ; FIXME if FSF ever does TTY faces
+         ;; FIXME if FSF ever does TTY faces
+         ;; Well, they fixed it for us by finally defining facep! 12/5/1999
+         nil
        (and (or (internal-facep face)
                 (and (symbolp face) (assq face global-face-data)))
             t))))
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 48d0673..8d879cb 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:36:02 $
-;; Version: $Revision: 1.19 $
+;; Created: $Date: 1999/12/05 19:58:38 $
+;; Version: $Revision: 1.20 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -205,7 +205,7 @@
 (defsubst w3-set-fill-prefix-length (len)
   (setq fill-prefix (if (< len (- (or w3-strict-width (window-width)) 4))
                        (w3-get-pad-string len)
-                     (url-warn
+                     (w3-warn
                       'html
                       "Runaway indentation!  Too deep for window width!")
                      fill-prefix)))
@@ -2763,14 +2763,7 @@ Format: (((image-alt row column) . offset) ...)")
            w3-current-parse parse)
       (w3-finish-drawing)
       (w3-mode))
-    (set-buffer-modified-p nil)
-    (if url-keep-history
-       (let ((url (url-view-url t)))
-         (if (not url-history-list)
-             (setq url-history-list (make-hash-table :size 131 :test 'equal)))
-         (cl-puthash url (buffer-name) url-history-list)
-         (if (fboundp 'w3-shuffle-history-menu)
-             (w3-shuffle-history-menu)))))
+    (set-buffer-modified-p nil))
   (w3-maybe-fetch-frames))
 
 (defun w3-maybe-fetch-frames ()
diff --git a/lisp/w3.el b/lisp/w3.el
index b27e908..72f3717 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/12/05 08:36:12 $
-;; Version: $Revision: 1.11 $
+;; Created: $Date: 1999/12/05 19:58:39 $
+;; Version: $Revision: 1.12 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -352,7 +352,8 @@ With prefix argument, use the URL of the hyperlink under 
point instead."
                (not (funcall url-confirmation-func
                              (format "Reuse URL in buffer %s? "
                                      (buffer-name buf)))))))
-         (url-retrieve url 'w3-fetch-callback (list url)))))))
+         (url-retrieve url 'w3-fetch-callback (list url))
+       (w3-notify-when-ready buf))))))
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

commit f92914cbc8d32c7529ea2c1142a03730fbf99a9e
Author: William M. Perry <address@hidden>
Date:   Sun Dec 5 16:44:55 1999 +0000

    Make sure to error out of configuration process if gnus or url packages are 
not found

diff --git a/ChangeLog b/ChangeLog
index 5584003..0d5c9d2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 1999-12-05  William M. Perry  <address@hidden>
 
+       * lisp/w3.el (w3-fetch): Urk, call w3-notify-when-ready if we
+         found a buffer visiting the URL, otherwise nothing happens.
+         User just silently gets no feedback about the operation.
+
        * w3.el: Lots of changes to work with the new URL package.
 
        * w3-vars.el: Removed lots of old varialbes.  Updated to use new
diff --git a/configure b/configure
index 24a951d..70414ec 100755
--- a/configure
+++ b/configure
@@ -1131,6 +1131,14 @@ echo "$ac_t"""${REBUILD_CUSTOMLOADS}"" 1>&6
 
 
 
+if test "${URL}" = "no"; then
+   { echo "configure: error: "Could not find URL package.  Please use the 
--with-url=DIRECTORY flag."" 1>&2; exit 1; }
+fi
+
+if test "${GNUS}" = "no"; then
+   { echo "configure: error: "Could not find Gnus package.  Please use the 
--with-gnus=DIRECTORY flag."" 1>&2; exit 1; }
+fi
+
 if test "${MAKEINFO}" = "no"; then
    MAKEINFO='$(EMACS) -batch -q -l texinfmt -f batch-texinfo-format'
 fi
diff --git a/configure.in b/configure.in
index 232bd6d..d632b94 100644
--- a/configure.in
+++ b/configure.in
@@ -38,6 +38,14 @@ AC_CHECK_GNUS
 AC_CHECK_URL
 AC_CHECK_CUSTOMLOADS
 
+if test "${URL}" = "no"; then
+   AC_MSG_ERROR("Could not find URL package.  Please use the 
--with-url=DIRECTORY flag.")
+fi
+
+if test "${GNUS}" = "no"; then
+   AC_MSG_ERROR("Could not find Gnus package.  Please use the 
--with-gnus=DIRECTORY flag.")
+fi
+
 if test "${MAKEINFO}" = "no"; then
    MAKEINFO='$(EMACS) -batch -q -l texinfmt -f batch-texinfo-format'
 fi

commit f410b88e6cbafa9f43fcb43ab6ae204df9e16d20
Author: William M. Perry <address@hidden>
Date:   Sun Dec 5 08:35:34 1999 +0000

    Everything now supports the new URL package, grand restructuring, etc, etc. 
 Live in fear for a while.

diff --git a/ChangeLog b/ChangeLog
index 2359ff8..5584003 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5132 +1,69 @@
-1999-11-20  William M. Perry  <address@hidden>
+1999-12-05  William M. Perry  <address@hidden>
 
-* lisp/url-news.el (url-news): Unhex article references, since netscape is
-  so dumb that they escape a '@' in an explicit article reference, which
-  is SUPPOSED TO BE HOW YOU TELL IT FROM A NEWSGROUP.  Lame.
-  (url-nntp): Ditto.
+       * w3.el: Lots of changes to work with the new URL package.
 
-* lisp/url-ldap.el (url-ldap-certificate-formatter): Make sure we require
-  ssl before calling any of the functions.
+       * w3-vars.el: Removed lots of old varialbes.  Updated to use new
+         URL package where necessary.
+         (w3-graphlink-menu): Removed the 'info' menu item.  Not
+         (re)implemented yet.
+         (w3-hyperlink-menu): Ditto.
 
-* lisp/w3-display.el (w3-insert-terminal-char): Nuke the 'face' property
-  on any inserted terminal characters, or we can get bold/red/etc table
-  borders - looks kind of odd.
+       * w3-toolbar.el (w3-mouse-print-this-url): Ditto.
 
-1999-11-14  William M. Perry  <address@hidden>
+       * w3-print.el (w3-print-this-url): Removed LaTeX as an option.
 
-* lisp/w3-display.el (w3-resurrect-hyperlinks): Skip over whitespace at
-  the beginning of hyperlinks, so mouse highlighting looks better.
-  (w3-resurrect-hyperlinks): Look for next property change from 'nd'
-  instead of 'st' - you cannot have overlapping hyperlinks, so this saves
-  quite a few iterations through the loop.
-  (w3-display-table): Nuke the w3-hyperlink-info text property on inserted
-  text.  This fixes a bug under XEmacs where hyperlinks in tables could
-  get _really_ confused when portions of the row needed to be filled -
-  hyperlinks would flow WAY past their end, and into the next row.
+       * w3-style.el, w3-parse.el: Deal with using new URL package.
 
-* Emacs/W3 4.0.46 released
+       * w3-menu.el: Removed LaTeX-related menu entries.
+       (w3-menu-links-constructor): Expand the URL in the menu
+         constructor if necessary, don't use url-maybe-relative anymore.
 
-* aclocal.m4 (AC_EMACS_LISP): work around bug in current Emacs 21.1
-  pretests where (princ "foo") crashes in batch mode.
+       * w3-keymap.el: New separate file just for keymaps
 
-1999-11-13  William M. Perry  <address@hidden>
+       * w3-java.el: Deal with removal of old 'mm' file and use
+         mailcap.el functions.
 
-* lisp/w3-cus.el (w3-use-terminal-glyphs): Changed default value to nil,
-  was causing too many weirdnesses under Emacs (I loathe MULE sometimes)
-  (w3-use-terminal-characters): Ditto.
+       * w3-forms.el: Removed gopher query support.
 
-* lisp/w3-display.el (w3-display-handle-java): Duh, give 2 arguments to
-  push.
+       * w3-emulate.el: Remove arena masquerade code.  Does anybody even
+         use this masquerading code?
 
-1999-11-12  William M. Perry  <address@hidden>
+       * w3-jscript.el, w3-elisp.el, w3-script.el: Removed files related
+         to scripting.
 
-* lisp/w3-display.el (w3-display-handle-java): Make sure that there is
-  ALWAYS a codebase attribute for java, or bad things could happen (like
-  not being able to find the classes since we write to a temp file, etc.)
+       * w3-xemac.el (w3-mouse-handler): Ditto.
 
-* lisp/w3-parse.el (w3-parse-buffer): Make sure that we expand the
-  'codebase' attribute.
+       * w3-e19.el (w3-mouse-handler): Don't bother with scripting
+         elements yet.
 
-* lisp/w3-display.el (w3-auto-run-java): New variable to control whether
-  Java applets are run 
-  (w3-display-handle-java): New function to convert our internal parse
-  structure into something that `w3-java-run-applet' can understand.
-  (w3-display-node): Use it.
+       * w3-display.el: Lots of changes to deal with the new URL package
+         and using the new mailcap.el file from Gnus.
 
-* lisp/w3-java.el: New file for running java programs in an external
-  process.
+       * w3-cus.el: Removed lots of obsolete variables
 
-1999-11-07  Markus Rost  <address@hidden>
+       * w3-hot.el (w3-hotlist-add-document): Disable due to default use
+         of html bookmark files now.
+         (w3-hotlist-delete): Ditto.
+         (w3-hotlist-apropos): Use new URL-based hotlist interface
+         (w3-hotlist-view): Ditto.
+         (w3-use-hotlist): Now deals with html-based bookmark lists.
+         (w3-hot-convert-to-alist): New function to conver an internal
+         bookmark list to an assoc list with oddly formatted keys.
+         (w3-read-html-bookmarks): Don't set w3-html-bookmarks any more -
+         this will be the main format now.
+         (w3-hot-push-now-item): Don't push a menu-object onto the list,
+         use a regular format we can convert to a menu when necessary.
 
-* lisp/url.el (url-retrieve-internally): make-local-variable
-  'track-mouse to workaround problem with `widget-button-click'.
+       * url-hotlist.el: New URL-based interface for searching your
+         hotlist.
 
-1999-11-10  William M. Perry  <address@hidden>
+1999-12-04  William M. Perry  <address@hidden>
 
-* lisp/w3-parse.el (textarea content model): Changed content model to
-  XCDATA so that markup can be included in the default text.
+       * lisp/base64.el: Updated to latest base64.el from Kyle.  Now no 
conflicts
+         between this and the Gnus-distributed version.
 
-* lisp/w3-menu.el (w3-menu-help-menu): Remove version information menu
-  item.  It hasn't been updated in years.
+1999-12-03  William M. Perry  <address@hidden>
 
-1999-11-10  "T. V. Raman" <address@hidden>
+       * lisp/font.el (font-set-face-font-new-redisplay): Don't set the :family
+         face attribute if it is nil.  The new redisplay doesn't like that.
 
-* lisp/w3-display.el (widget-convert-text): Added advice around this
-  function to preserve the 'personality' text property, otherwise
-  hyperlinks did not get the correct aural properties applied.
-
-1999-11-10  Thierry Emery <address@hidden>
-
-* lisp/w3-display.el (w3-maybe-start-image-download): typo.
-  (w3-handle-image): include row and column in hyperimage-info, to be used
-  in `w3-resurrect-images'.
-  (w3-resurrect-images): if `to-cut' gets negative, insert blanks.
-  (w3-display-node): in case of a frameset, checks rows as well.
-  (w3-frameset-dimensions-p): disregard anything containing "100%", such as
-  "100%,0".
-  (w3-display-frameset): Do not zap frameset-cardinal when computing
-  default dimensions. Memorize next window before drawing a frame, as its
-  HTML page may contain yet another (nested) frameset. Call `w3-warn' and
-  inhibit splitting the window when there is not enough room left.
-
-* lisp/mm.el (mm-parse-mailcap): Fix bad regexp for Emacs 21
-
-1999-11-09  William M. Perry  <address@hidden>
-
-* build.bat: Make sure to build custom load files and info files.
-
-* lisp/url-auth.el (url-register-auth-scheme): removed warning when
-  replacing auth methods.
-
-* lisp/url-file.el (url-file): Honor port numbers in ftp URLs.
-
-1999-11-09  James LewisMoss  <address@hidden>
-
-* lisp/mm.el (mm-parse-mailcap): Fix invalid regular expressions caused by
-  entries like "text/x-c++"
-
-1999-11-09  Andrew Mazillius  <address@hidden>
-
-* lisp/socks.el (socks-nslookup-host): Make sure that we always call
-  accept-process-output at least once.  Now deals correctly with multiple
-  addresses returned by nslookup in the format 'Addresses: ip1, ip2, ip3'
-
-1999-11-09  address@hidden (Kyotaro HORIGUCHI)
-
-* lisp/mule-sysdp.el: Patches to understand MULE 4.1
-
-1999-11-09  Alexandre Guimond  <address@hidden>
-
-* lisp/w3.el (w3-mail-document-author): Fix problem with 'Reply-To'
-  headers.  They had not been converted to the (not quite so) new plist
-  format.
-
-1999-10-15  Dave Love  <address@hidden>
-
-* lisp/w3-parse.el (char-int): Alias it to `identity' if necessary.
-
-1999-10-14  William M. Perry  <address@hidden>
-
-* lisp/url-ldap.el (url-ldap-certificate-formatter): Now uses
-  ssl-certificate-information instead of hacked up bill-specific stuff.
-
-* lisp/ssl.el (ssl-certificate-information): New function to get
-  certificate information out of a DER encoded object.
-  (ssl-program-name): Default to using OpenSSL now.
-
-1999-10-11  William M. Perry  <address@hidden>
-
-* lisp/w3-display.el (w3-fixup-eol-faces): only strip spaces off of
-  newlines, not the surrounding shitepsace.  This makes colorized table
-  cells look much better.
-
-1999-09-16  Michael Sperber [Mr. Preprocessor]  <address@hidden>
-
-* lisp/url-cache.el: 
-* lisp/w3-display.el: 
-* lisp/w3.el: Added (require 'url-parse) because of the macros
-  defined there.
-
-1999-08-07  Bob Weiner  <address@hidden>
-
-* w3-menu.el (w3-menu-make-xemacs-menubar): Fixed to work with
-  BeOpen.com InfoDock.  Old code allowed multiple 'nil's to creep into the 
-  menubar which would cause a hang in the XEmacs menubar code.
-
-1999-08-04  William M. Perry  <address@hidden>
-
-* lisp/url-cid.el (url-cid-gnus): Fixed so it will work in Emacs and
-  XEmacs 21.2
-
-1999-08-03  William M. Perry  <address@hidden>
-
-* lisp/mule-sysdp.el (mule-sysdep-version): Make
-  enable-multibyte-characters buffer-local when in XEmacs, to better mimic 
-  the Emacs 20.x behaviour.
-
-1999-07-19  William M. Perry  <address@hidden>
-
-* lisp/images.el (image-register-netpbm-utilities): Fixed typo in the ppm
-  to xpm converter.
-
-1999-06-27  William M. Perry  <address@hidden>
-
-* lisp/url-parse.el (url-generic-parse-url): Added in gross hack to
-  preserve ';' in data URLs.  The usage as a separator for content-type
-  and encoding-type clashes horribly with the ';' as an
-  attribute-separator on normal URLs.
-
-* lisp/w3-parse.el (w3-parse-hooks): New hook to be run just before
-  parsing any document.  This can theoretically be used to rip out banner
-  advertisements, etc.
-  (w3-parse-munge-ethiopic-text): Moved the old ethiopic munging stuff
-  into hook form.
-
-* lisp/url-mail.el (url-mailto): Allow adding of more 'to' headers via the 
-  query interface for mailto URLs.  Would generate corrup To: headers
-  otherwise.
-
-1999-06-15  William M. Perry  <address@hidden>
-
-* lisp/url-ldap.el (url-ldap-attribute-formatters): Format naming contexts 
-  as hyperlinks back into the directory.
-  (url-ldap-certificate-formatter): Save certificate data to a file.
-
-1999-04-29  William M. Perry  <address@hidden>
-
-* lisp/font.el (font-find-available-family): Fixes for latest version of
-  the new Emacs redisplay.
-
-1999-04-08  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0.43 released
-
-* Fixed the hackmap stuff for Emacs 19/20
-
-1999-04-08  Thierry Emery <address@hidden>
-
-* lisp/url-cookie.el (url-cookie-write-file): check
-  `url-cookies-changed-since-last-save' and that the file is writable.
-  (url-cookie-handle-set-cookie): set `url-cookies-changed-since-last-save'.
-
-* lisp/url-http.el (url-create-mime-request): Moved Proxy Authorization up
-  (before Cookie and Authorization).
-
-* lisp/url-vars.el (url-cookies-changed-since-last-save): new variable.
-
-* lisp/url.el (url-write-global-history): call `url-cookie-write-file' if
-  `url-privacy-level' tolerates cookies.
-
-1999-04-08  Thierry Emery <address@hidden>
-
-* lisp/w3-display.el (w3-resurrect-images): corrected regexp for
-  removing trailing blanks from alt.
-
-1999-04-05  William M. Perry  <address@hidden>
-
-* lisp/w3-forms.el (w3-form-keymap): Ditto for form fields.
-
-* lisp/w3-display.el (w3-resurrect-hyperlinks): Hack around lossage in
-  XEmacs' Widget package.  button3 was used to activate the widget instead
-  of popping up a context-sensitive menu like everywhere else.
-
-1999-04-03  William M. Perry  <address@hidden>
-
-* lisp/w3-display.el: Make sure we load mule-sysdp at compile time.
-
-1999-04-03  Thierry Emery  <address@hidden>
-
-* lisp/url-file.el (inline): require `w3-sysdp', necessary for
-  `add-minor-mode' in Gnu Emacs when Emacs-W3 is autoloaded through
-  `url-dired-find-file'.
-  (url-insert-possibly-compressed-file): set `url-current-mime-encoding'.
-  (url-dired-find-file): handle ange-ftp dired.
-  (url-file-asynch-callback, url-file): call
-  `url-insert-possibly-compressed-file' instead of
-  `insert-file-contents-literally'.
-  (url-file): compute `url-current-mime-type' and `viewer' from
-  `uncompressed-filename'; specify extension for
-  `mm-generate-unique-filename'.
-
-* lisp/url.el (url-file-directly-accessible-p): call
-  `url-host-is-local-p' and check that the file is not compressed.
-  (url-generate-unique-filename-counter): new variable.
-  (url-generate-unique-filename): use
-  `url-generate-unique-filename-counter' to ensure that filenames are
-  unique within an Emacs session.
-
-1999-04-03  Thierry Emery  <address@hidden>
-
-* lisp/url.el (url-write-global-history): call
-  `w3-write-explicit-encodings'.
-
-* lisp/w3-cus.el (w3-explicit-encodings-file): new user option, which
-  specifies where to save `w3-explicit-conversion-tree'.
-
-* lisp/w3-vars.el: new variables
-  w3-explicit-conversion-tree: Tree to hold explicit coding systems
-  for URLs and their superdirs:
-  ((hostN default-coding (dirN-1 default-coding (dirN-1-1 ...) ...) ...)
-    ...),
-  w3-explicit-encodings-changed-since-last-save: whether
-  `w3-explicit-conversion-tree' needs saving.
-
-* lisp/w3.el:
-  w3-convert-code-for-mule: call `w3-recall-explicit-coding-system'
-  after checking `w3-explicit-coding-system' and `mmcharset'.
-  w3-reload-document: call `w3-record-explicit-coding-system'.
-  w3-recall-explicit-coding-system, w3-find-explicit-coding-system,
-  w3-record-explicit-coding-system, w3-add-explicit-coding-system,
-  w3-write-explicit-encodings: new functions to perform retrieval and
-  storage of user-specified (through C-u g `w3-reload-document')
-  explicit coding systems.
-  w3-do-setup: load `w3-explicit-encodings-file' if it exists.
-
-1999-03-24  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0.40 released
-
-* lisp/url.el (url-do-setup): Always register the LDAP URL format.
-
-* lisp/url-ldap.el (url-ldap): Deal with non-LDAP enabled emacsen better.
-
-1999-03-22  Markus Rost <address@hidden>
-
-* lisp/w3.el (w3-fetch): Gracefully accept 'nil' as the URL.
-
-1999-03-22  Martin Schwenke <address@hidden>
-
-* lisp/w3-sysdp.el (frame-parameter): This was not defined in 19.34.
-
-1999-03-19  William Perry <address@hidden>
-
-* lisp/w3-parse.el (w3-parse-buffer): Make sure we restore the old syntax
-  table when we are done parsing.
-
-1999-03-18  Kenichi Handa <address@hidden>
-
-* lisp/w3.el (w3-viewer-filter): Do not create the 'output' buffer if the
-  length of the string received by the filter is 0.  Evidently solaris
-  sends an empty string to the filter when the process exits.
-
-1999-03-18  "T. V. Raman" <address@hidden>
-
-* lisp/w3-display.el (w3-widget-echo): Use buffer-substring --rather than
-  buffer-substring-no-properties when picking out the text under the
-  current link. 
-
-  This is good for emacspeak because you can then tell while
-  tabbing through a  page whether the link you just hit has
-  been visited.
-
-1999-01-08  William M. Perry  <address@hidden>
-
-* lisp/docomp.el (emacs-build-autoloads): Only do the autoloads one way
-  for Emacs or XEmacs.
-
-1999-01-07  William M. Perry  <address@hidden>
-
-* build.bat: More tweaking of finding EMACSDIR automatically.
-
-* lisp/w3-vars.el (w3-mode-map): Don't use read-kbd-macro
-
-1999-01-05  William M. Perry  <address@hidden>
-
-* build.bat: Make sure that we build the autoload files under windows.
-  Easier setting of the environment variables.  Also can now pass in
-  EMACSDIR on the command line.
-
-* lisp/docomp.el (byte-compile-dest-file): Downcase file names if we are
-  in windows of any flavor.  Sometimes we get foo.EL instead of foo.el and 
-  we were just naming the output file foo.EL.elc
-  (compile-it): Make sure we get *.EL from directory-files as well.
-  (emacs-build-autoloads): Ditto.  address@hidden windows file systems.
-  (emacs-build-autoloads): Deal with Emacs or XEmacs way of rebuilding
-  autoloads in lisp instead of relying on autoconf.  This will make
-  everything much happier under windows.
-
-1999-01-04  William M. Perry  <address@hidden>
-
-* Makefile.in (dotemacs): Wrap the require we stick into $(DOTEMACS) in a
-  `condition-case' for people that share their setups between emacsen or
-  machines with different installed packages.
-
-* lisp/w3-forms.el (w3-form-encode-xwfu): Don't forget to deal with the
-  new attributes if we are doing just a plain old form submission!
-
-1999-01-04  Milan Zamazal <address@hidden>
-
-* lisp/w3-forms.el (w3-submit-form): Correctly shorten the separator
-  generated... was including too few characters.
-  (w3-form-encode-helper): Added ability to specify additional attributes
-  for the `file' input type so that we can keep track of the filename.
-  (w3-form-encode-make-mime-part): Create content-disposition header
-  instead of content-id and content-length
-  (w3-form-encode-multipart/x-www-form-data): Use CRLF instead of just LF
-  for separators.
-  (w3-form-encode-multipart/x-www-form-data): Don't forget to add in the
-  separator at the end of the message.
-
-1998-01-04  William M. Perry  <address@hidden>
-
-* lisp/w3-forms.el (w3-form-encode-multipart/x-www-form-data): Better
-  separator generation.
-
-1999-01-04  Laurent Martelli <address@hidden>
-
-* lisp/w3-hotindex.el: Added autoload statements.
-
-1999-01-04  Kenichi Handa  <address@hidden>
-
-* lisp/Makefile.in (w3-auto.el): Generate w3-auto.el from
-  auto-autoloads.el just build in the current directory.
-
-1998-12-31  William M. Perry  <address@hidden>
-
-* lisp/font.el: Various mergings with the XEmacs distributed version of
-  font.el.  Lots of byte-compile warnings squashed when not building with
-  Emacs/W3.
-
-1998-12-31  Jonathan Harris  <address@hidden>
-
-* font.el: Split font-family-mappings into X and mswindows-specific
-  versions.  mswindows-font-create-[object|name]: Treat supplied size as a
-  pointsize. Added underline and strikethru handling.
-
-1998-12-30  William M. Perry  <address@hidden>
-
-* lisp/url.el (url-file-exists): If url-user is nil use anonymous ftp.
-  (url-file-size): Ditto.
-
-* lisp/w3.el (w3-find-this-file): Protect against sticking 'nil@' in the
-  filename spec when we go to retrieve something.
-
-1998-12-30  Milan Zamazal <address@hidden>
-
-* lisp/url-auth.el (url-basic-auth): Make sure to use base64-encode-string 
-  instead of base64-encode to work with new Emacs/XEmacs that have native
-  base64 encoding/decoding primitives.
-
-1998-12-29  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0pre38 released
-
-* lisp/url.el (url-file-attributes): use 'anonymous' instead of 'ftp' as
-  the username if none specified.
-
-1998-12-29  Markus Rost  <address@hidden>
-
-* url.el (url-file-attributes): If url-user is nil use anonymous ftp.
-
-1998-12-29  William M. Perry  <address@hidden>
-
-* lisp/mule-sysdp.el (mule-detect-coding-version): Doh - make sure we
-  don't blow up in XEmacs w/Mule when making sure we have a valid coding
-  system.
-
-* Emacs/W3 4.0pre37 released
-       
-* lisp/socks.el (socks-find-route): Fixed bug where we would not honor the
-  '!' at the front of the regexp to mean _do_ redirect the connection.  I
-  need to finish the socks-redirection-rules stuff sometime soon.
-
-* lisp/mule-sysdp.el (mule-detect-coding-version): Put back in the
-  ultra-anal checks to make sure that what detect-coding-region and
-  friends find is actually a coding system.  Apparently the bug where
-  bizarre combinations of CRLF and LF separators in a file make Emacs 20.3
-  return a number as a coding system is back.  Bug reported to the Emacs
-  maintainers.
-
-1998-12-28  Milan Zamazal <address@hidden>
-
-* lisp/mm.el (mm-possible-viewers): Don't reverse exact & wildcard when
-  concatenating them.  Reason: `mm-mime-data' contains mailcap entries in
-  the opposite order than they are in the mailcap file.  The function
-  `mm-possible-viewers' should return found items in the opposite order
-  again, so that the first viewer from the mailcap was invoked.  The patch
-  ensures this.
-
-* lisp/mm.el (mm-mime-data-default): New variable that holds all the
-  defaults.  mm-mime-data now holds _only_ the user supplied viewers.
-
-* lisp/mm.el (mm-mime-info): Give preference to things found in
-  mm-mime-data (the user stuff) and then fall back onto
-  mm-mime-data-default.
-
-* lisp/url-http.el (url-parse-viewer-types): Apply both mm-mime-data and
-  mm-mime-data-default when building the acceptable viewer list.
-
-1998-12-28  William M. Perry  <address@hidden>
-
-* lisp/w3-display.el (w3-prepare-buffer): Use an unwind-protect form
-  around w3-draw-tree.  This means that even if something in the drawing
-  causes an error, the buffer will still be thrown into w3-mode
-  (w3-region): Make w3-region interactive and give it a doc string.
-  (w3-pause): Mark the buffer as temporarily read-only, so that
-  self-inserting keystrokes will signal an error, which will be caught and 
-  ignored by the condition-case.
-  (w3-widget-buffer): New function to get the buffer a widget is in.
-  (w3-widget-echo): Use it, since with Gnus, it is very likely that you
-  will be in a different buffer when you are mousing around the rendered
-  HTML.
-
-* lisp/url-file.el (url-file): Modify the filename in the URL if we are
-  actually visiting a directory without a trailing '/' or '\', and we do
-  the auto-find of the index.html file.
-
-* lisp/url.el (url-looks-like-html): New function that determines whether
-  a document looks like HTML or not.  This is for ancient HTTP/0.9
-  responses for things without a file extension (ie: /, /a/b/, etc)
-  (url-retrieve-internally): Use it if we cannot find a content-type any
-  other way.
-
-* lisp/url-cid.el: Try to avoid compile-time-errors when gnus' mm-decode
-  cannot be found.
-
-1998-12-26  William M. Perry  <address@hidden>
-
-* lisp/url.el (url-expand-file-name): Make sure to normalize the 'default' 
-  value before we get to the point of bailing out if we get the empty
-  string, otherwise the vector-ized version of the URL could sneak out,
-  and the 'nil' default case would screw us too.
-
-1998-12-26  Markus Rost  <address@hidden>
-
-* w3-display.el (w3-display-get-cookie): No buffer-file-name for "
-  *cookie*" buffers.
-
-1998-12-26  William M. Perry  <address@hidden>
-
-* lisp/base64.el: Added alias for base64-encode-string -> base64-encode
-  and base64-decode-string -> base64-decode, for compatibility with
-  Emacs/XEmacs with native base64 support.
-
-* lisp/w3-about.el: Use base64-encode-string instead of base64-encode, for 
-  compatibility with Emacs/XEmacs with native base64 support.
-
-1998-12-25  William M. Perry  <address@hidden>
-
-* lisp/url-ldap.el: New file to implement LDAP support ala RFC2255
-
-* lisp/url.el (url-do-setup): Register the LDAP URL handler if the feature 
-  is present.
-
-* Emacs/W3 4.0pre36 released
-
-* lisp/url.el (url-default-expander): Make sure that we remove any query
-  strings from the URL before we remove relative links.
-  (url-remove-relative-links): Tack on a trailing '/' if necessary so that 
-  we don't fail any URL parsing tests on things like 'g/.', which should
-  be normalized to just 'g/'
-
-1998-12-24  William M. Perry  <address@hidden>
-
-* lisp/url-cookie.el (url-cookie-host-can-set-p): Fixed cookie
-  vulnerability as described in
-  http://www.paradise.net.nz/~glineham/cookiemonster.html
-
-1998-12-23  Markus Rost  <address@hidden>
-
-* w3-menu.el (w3-menu-initialize-w3-mode-menu-map): Block also
-  the global menubar entry [menubar mule].
-
-1998-12-23  William M. Perry  <address@hidden>
-
-* lisp/w3-cus.el (w3-force-conversion-alist): Mixed mismatched custom type
-  (w3-default-stylesheet): Ditto.
-  (w3-html-errors-font-lock-keywords): Ditto.
-  (w3-default-configuration-file): Ditto.
-  (w3-modeline-format): Ditto.
-
-1998-12-22  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0pre35 released
-
-* lisp/w3-display.el (w3-get-default-color): Function to get the default
-  foreground or background color, even if face-(fore|back)ground returns
-  nil, which it does under Emacs fairly often.  We fall back to getting
-  the colors out of the frame properties.  I think this is gross, but oh
-  well.
-  (w3-display-background-useless-p): Use it.
-  (w3-display-foreground-useless-p): Use it.
-
-* lisp/w3.el (w3-reload-document): Avoid using interactive spec 'Z', since 
-  it doesn't exist in older versions of Emacs (19.xx)
-
-* lisp/w3-parse.el (w3-parse-buffer): Add ',' to the `whitespace' at the
-  front of an attribute that we should skip over.  This is so that people
-  can do horrible nasty things like <input type="foo", name="bar"> and
-  still have it work.  Sometimes I feel so... unclean.
-
-* lisp/url-news.el (url-check-gnus-version): Use gnus-continuum-version if 
-  at all possible.  This way I will never have to add another string-match 
-  to the list of acceptable versions (at least not until another 15
-  releases of Gnus.
-
-1998-12-22  Dave Love <address@hidden>
-
-* lisp/w3-display.el (w3-image-alt): Pay better attention to the alt
-  specified by the document.  Don't try to special case the empty string
-  so much.
-
-1998-12-22  William Perry  <address@hidden>
-
-* lisp/css.el (css-parse): Wrap the calls to forward sexp in
-  condition-case so that an invalid stylesheet does not completely choke.
-
-1998-12-22  Milan Zamazal <address@hidden>
-
-* lisp/w3.el (w3-replace-invalid-chars): Make sure we tell replace-regexp
-  to be 'literal' so that somet hings in the invalid chars table don't
-  signal an error (ie: S\\v was looking for the regexp quote match, etc)
-
-1998-12-22  William Perry  <address@hidden>
-
-* lisp/w3-display.el (w3-display-table): Backed out old change to use less 
-  space for borderless tables - it was screwing up spacing at the
-  beginning of celles.
-
-1998-12-22  Thierry Emery <address@hidden>
-
-* lisp/url.el (url-expand-file-name): Do not remove blanks from target
-  anchors (#xxx).
-
-1998-12-21  William M. Perry  <address@hidden>
-
-* lisp/docomp.el: If WIDGETDIR is not set, or set to `no', then scream and 
-  bitch and die, to avoid more arcane errors later on.
-  (emacs-build-custom-load): Try to work around emacs19 that doesn't have
-  cus-dep installed.
-
-* lisp/w3.el (w3-fetch): Avoid use of with-current-buffer, since it
-  doesn't exist in Emacs 19.xx 
-  (w3-convert-code-for-mule): Finished rename to mule-coding-system-p
-
-1998-12-20  Bertil Askelid <address@hidden>
-
-* lisp/w3-mouse.el: Don't bind mouse-movement unless w3-track-mouse is
-  set.
-
-1998-12-19  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0pre34 released
-
-* lisp/mule-sysdp.el (mule-coding-system-p-version): Renamed and fixed
-  mule-coding-system-p for non-MULE Emacs/XEmacs.
-
-1998-12-18  Kenichi Handa  <address@hidden>
-
-* lisp/mule-sysdp.el (mule-coding-system-p-version): New function.
-  (mule-coding-system-version): Use mule-coding-system-p-version.
-  (mule-detect-coding-version): Likewise.
-  (mule-invalid-char-coding-systems): Change iso-latin-1 to iso-8859-1.
-  (mule-coding-system-with-invalid-chars): Check mule-sysdep-version
-  for XEmacs.
-
-* lisp/w3.el (w3-convert-code-for-mule): Use mule-coding-system-p-version.
-  (w3-coding-system-for-mime-charset): Likewise.
-
-1998-12-19  William M. Perry  <address@hidden>
-
-* configure.in: Ditto
-
-* aclocal.m4: Added appropriate magic to run autoconf whenever aclocal.m4
-  is modified.
-
-1998-12-18  William M. Perry  <address@hidden>
-
-* lisp/Makefile.in: No longer include auto-autoloads.el and custom-load in 
-  the distribution.  We can rebuild it anywhere now.
-
-* aclocal.m4 (AC_CHECK_CUSTOMLOADS): Use the new functions in the
-  appropriate place.
-  (EMACS_REBUILD_AUTOLOADS): Ditto.
-
-* lisp/docomp.el (emacs-build-custom-load): New function to build
-  custom-load.el under Emacs.
-  (emacs-build-autoloads): Ditto for the auto-autoloads.el file.
-
-1998-12-15  Kenichi Handa  <address@hidden>
-
-* lisp/Makefile.in (.el.elc): Set shell variable W3SRCDIR to $(srcdir).
-
-* lisp/docomp.el (load-path): Check shell variable W3SRCDIR.
-
-* lisp/w3.el (w3-convert-code-for-mule): Call
-  mule-coding-system-with-invalid-chars.
- (w3-coding-system-with-invalid-chars): This function deleted.
-
-* lisp/mule-sysdp.el (w3-mime-charset-coding-alist): Fix coding
-  system for Mule.
-  (mule-invalid-char-coding-systems): New variable.
-  (mule-coding-system-with-invalid-chars): New function.
-  (mule-write-region-no-coding-system): Fix argument of write-region for
-  Mule 2.3.
- 
-1998-12-17  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0pre32 released
-
-* lisp/font.el (font-x-font-regexp): Add a trailing dash to the
-  font-regexp.  For some reason Emacs 19.xx under 95/NT sticks a trailing
-  slash on the end.  This was the cause of the odd errors in
-  font-spatial-to-canonical since it was getting an empty font object
-  because the regexp failed to match.
-
-1998-12-16  William M. Perry  <address@hidden>
-
-* lisp/w3.el (w3-coding-system-for-mime-charset): Make sure the
-  coding-system-p is defined before we use it.
-  (w3-convert-code-for-mule): Ditto.
-
-* Makefile.in (SUPPORTFILES): Now include 'BUGS' support file in the
-  distributions.
-
-1998-12-16  Simon Josefsson <address@hidden>
-
-* lisp/mm.el (mm-parse-mailcaps): More protection against badly formed
-  MAILCAPS variable.
-
-1998-12-16  William M. Perry  <address@hidden>
-
-* lisp/w3-cus.el (w3-bullets): Fixed customization type for this option.
-  Would lead to mismatches in customize buffers.  Ick!
-  (w3-maximum-line-length): Ditto.
-
-1998-12-08  Ken'ichi HANDA <address@hidden>
-
-* lisp/mule-sysdp.el (mule-detect-coding-version): Check that
-  mule-sysdep-version is a number before comparing it to one.  Under
-  XEmacs it is a symbol `xemacs'.
-
-1998-12-03  William M. Perry  <address@hidden>
-
-* Updated all copyright dates and now specify that this _is_ a
-  part of Emacs, since it soon will be.  Maybe.  If I get ambitious.  what 
-  are the odds posted in vegas?
-
-* lisp/w3-display.el (w3-display-infer-contrasting-color): New function to 
-  chooise black or white as an appropriate color if the author of an HTML
-  page was stupid enough to do something like: <body bgcolor="white"> (ie: 
-  not specifying the foreground color as well).  If this conflicts with
-  the users foreground, the text used to be invisible.  Now it will be
-  whichever contrasts best (black on mint cream, white on dark red, etc)
-  (w3-display-node): If the foreground specified conflicts with the users' 
-  background, ignore it.
-  (w3-display-node): If the background specified conflicts with the users' 
-  foreground, infer an appropriate foreground.
-
-* Emacs/W3 4.0pre31 released
-
-* configure.in (CIDFILE): Stop spitting out a warning about
-  multipart/related stuff if we can't find Gnus at configure time.  We're
-  hacking around it in a different way now.
-
-* lisp/Makefile.in (URLSOURCES): Add url-cid.el into the definition via
-  configure substitutions ONLY.  It will still get installed because we
-  stick it in EXTRAS.  This means 1 extra file copy at install time, but
-  who cares?  The file isn't that large.
-
-* lisp/url-cid.el: New file to contain the content-id handling stuff,
-  because we cannot compile this file unless we can find a very recent
-  version of Gnus at compile time (without .emacs).
-
-* etc/default.css: Use the newer @media tags instead of @x*emacs so that
-  everything will work right with the new Emacs redisplay.
-
-* lisp/css.el (css-active-device-types): Added new @media tags.
-  multifont is now defined if the Emacsen we are running in can display
-  multiple font families and sizes correctly (new emacs redisplay or
-  XEmacs), and unifont if it cannot.
-
-* lisp/font.el (font-set-face-font-new-redisplay): New function for
-  dealing with the new Emacs redisplay font abstraction.  You can now beat 
-  the crap out of the new redisplay engine with Emacs/W3.  Ahh, feels like 
-  the heady old days of Lucid Emacs 19.10 and XEmacs 19.12.
-
-1998-12-02  Simon Josefsson <address@hidden>
-
-* lisp/mm.el (mm-parse-mailcaps): Deal gracefully with bad entries in the
-  MAILCAP list, or it would bug out with things like 'file:' where it
-  would try to open the current directory.
-
-1998-11-29  William M. Perry  <address@hidden>
-
-* lisp/docomp.el (load-path): Append the GNUSDIR environment variable to
-  the load-path, similar to how we deal with WIDGETDIR
-
-* INSTALL: Document the new --with-gnus arguments.
-
-* configure.in: Use AC_CHECK_GNUS and spit out appropriate warnings about
-  cid URLS not working when appropriate.
-
-* aclocal.m4 (AC_CHECK_GNUS): Try to find mm-get-content-id in mm-decode
-  for newer gnus releases that can handle the content-id stuff.  Also
-  added new configure switch '--with-gnus=/path/to/gnus/lisp/dir' to
-  override this, similar to how the custom stuff works.
-
-* lisp/url-misc.el (url-cid-gnus): Try to load mm-decode at compile time.
-  (url-cid-gnus): Fixed some compilation warnings.
-
-* lisp/url.el (url-cid): Ooops - forgot to add an autoload for url-cid
-
-* Emacs/W3 4.0pre30 released
-
-* lisp/url.el (url-do-setup): Duh, forgot to register the CID handler.
-  Good thing lars was doing it too.
-
-* Emacs/W3 4.0pre29 released
-
-* lisp/url-misc.el (url-cid): New URL handler for dealing with content-id
-  based references.  Able to be extended for different mail/news readers.
-  Need to coordinate with Lars and Kyle on exactly how to determine which
-  UA is invoking us, so we don't try and use Gnus functions when VM is
-  giving us the data, etc.
-  (url-cid-gnus): First implementation of CID retrieval for Pterodactyl
-  Gnus.
-
-* lisp/w3-display.el (w3-finalize-image-download): Make sure we call
-  url-uncompress in w3-finalize-image-download, or content-id and data URL 
-  based images won't get uncompressed correctly.  Arguably this should be
-  done in url-default-callback, but I'm not sure what that would fubar
-  right now.
-
-* lisp/w3-parse.el (w3-parse-buffer): Changed regexp for handling
-  NET-enabling start tags to be not so restrictive.  I don't think this
-  will have any negative side-effects
-
-1998-11-28  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0pre28 released
-
-1998-11-23  Thierry Emery <address@hidden>
-
-* lisp/mule-sysdp.el
-  (w3-mime-charset-coding-alist): completed and reordered;
-  (mule-detect-coding-version): removed MIME type parsing (already done in
-  w3-sentinel) and moved use of w3-mime-charset-coding-alist to
-  w3-coding-system-for-mime-charset;
-
-* lisp/w3.el
-  (w3-convert-code-for-mule): added call to w3-coding-system-for-mime-charset
-  for handling specified MIME charset;
-  (w3-coding-system-for-mime-charset): code moved from
-  mule-detect-coding-version, which uses w3-mime-charset-coding-alist;
-  (w3-sentinel): moved downcase of MIME type and charset to
-  w3-convert-code-for-mule call arguments and generalized it to encoding;
-  replaced hacking out "x-" in MIME charsets with proper reference to
-  w3-mime-charset-coding-alist in w3-coding-system-for-mime-charset.
-
-1998-11-20  Ken'ichi HANDA <address@hidden>
-
-* lisp/w3.el
-  (w3-explicit-coding-system): new variable for user-specified coding system
-  on C-u [w3-reload-document];
-  (w3-convert-code-for-mule, w3-reload-document): added handling of
-  w3-explicit-coding-system.
-
-1998-11-24  Kenichi Handa  <address@hidden>
-
-* lisp/mule-sysdp.el (mule-sysdep-version): Check the mule version
-  correctly.
-  (mule-coding-system-version): New function.
-  (w3-mime-charset-coding-alist): New variable.
-  (w3-url-domain-language-environment-alist): New variable.
-  (w3-url-domain-coding-alist): New variable.
-  (mule-retrieval-coding-system): Call mule-coding-system-version.
-  (mule-no-coding-system): Likewise.
-  (insert-file-contents-literally): Re-define this function for Mule
-  Ver.2.3.
-  (mule-detect-coding-version): Pay attention to
-  w3-mime-charset-coding-alist,
-  w3-url-domain-language-environment-alist, and
-  w3-url-domain-coding-alist.
-  (mule-code-convert-region): Change argument to CODE only.  If
-  default-enable-multibyte-characters is nil, does no code
-  conversion.
-
-* lisp/url-cache.el (url-store-in-cache): Write to a file with no
-  code conversion.
-
-* lisp/w3.el (w3-convert-code-for-mule): Call
-  mule-code-convert-version with one arg CODING-SYSTEM.
-
-1998-11-22  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0pre27 released
-
-* lisp/w3.el (w3-mode): ditto
-
-* lisp/w3-display.el (w3-display-node): Make sure we don't try to
-  save/restore variables in w3-persistent-variables if they are not
-  'boundp'
-
-1998-11-20  Thierry Emery  <address@hidden>
-
-* lisp/mule-sysdp.el
-  (mule-write-region-no-coding-system): added additional write-region arguments
-  and protections moved from w3-download-callback.
-
-* lisp/mm.el (mm-find-available-multiparts), lisp/url-cache.el
-  (url-store-in-cache), lisp/w3-display.el (w3-display-get-cookie,
-  w3-finalize-image-download), lisp/w3-latex.el (w3-show-dvi), lisp/w3-print.el
-  (w3-print-this-url), lisp/w3.el (w3-save-as, w3-download-callback):
-  use mule-write-region-no-coding-system.
-
-* lisp/url-vars.el, lisp/url-http.el (url-parse-mime-headers): added
-  url-current-mime-charset and url-mime-content-type-charset-regexp.
-
-* lisp/w3-cus.el (w3-force-conversion-alist): new user option, alist of URL
-  host/filename regexps and coding systems.
-
-* lisp/w3-vars.el
-  (w3-meta-content-type-charset-regexp, w3-meta-charset-content-type-regexp):
-  new variables for parsing <META Content-Type...> tag;
-
-  (w3-persistent-variables): added buffer-file-coding-system.
-
-* list/w3.el
-  (w3-mail-current-document): use buffer-file-coding-system or iso-8859-1;
-  (w3-compression-encodings, w3-no-conversion-encodings): new variables used to
-  inhibit conversion;
-  (w3-convert-code-for-mule): removed regexp matching on
-  w3-mime-list-for-code-conversion (replaced by downcase in w3-sentinel);
-  (w3-sentinel): switch to other window if in minibuffer, handle specified
-  charset (in MIME headers or META tag), handle w3-force-conversion-alist, hack
-  out "x-" in MIME charsets.
-
-1998-11-18  Kenichi Handa  <address@hidden>
-
-* Makefile.in (Makefile): Correct the dependency.  Execute
-  config.status in the current directory.
-
-* etc/Makefile.in (install): If a file is not in the current
-  directory, install that file of the source directory.
-
-* lisp/Makefile.in (w3-auto.el): Update target in the current
-  directory.
-  (auto-autoloads.el): Do the work in $(srcdir).
-  (custom-load.el): Likewise.
-  (install): If a file is not in the current directory, install that
-  file of the source directory.
-
-* lisp/docomp.el (byte-compile-dest-file): New function for
-  writing out *.elc to the current directory.
-
-1998-09-26  Gareth Jones  <address@hidden>
-
-* lisp/w3-vars.el: defvar'ed w3-current-buffer.
-
-* lisp/w3.el (w3-fetch): set w3-current-last-buffer for reused URLs.
-  (w3-pass-to-viewer): set w3-current-last-buffer to w3-current-buffer.
-  (w3-fetch): bind w3-current-buffer to (current-buffer).
-        Make history work with url-be-asynchronous t.  
-
-1998-09-25  Gareth Jones  <address@hidden>
-
-* lisp/w3-vars.el (w3-mode-map): Bind [backspace] to scroll-down.      
-
-1998-09-09  Gareth Jones  <address@hidden>
-
-* lisp/w3-emulate.el (w3-lynx-emulation-minor-mode-map): Corrected C-f
-  to be `scroll-up', added bindings for C-b, C-n and C-p.
-
-* lisp/w3-cus.el (w3-latex-use-latex2e): Documentation fix.  LaTeX
-  "generator" makes more sense than "parser".
-
-* lisp/url.el (url-do-setup): ditto for url-cookie-file and
-  url-global-history-file.     
-
-* lisp/url-cache.el (url-cache-directory): use w3-configuration-directory
-  rather than hardwire "~/.w3/"
-
-* lisp/url-news.el (url-nntp): fixed call to url-news-fetch-newsgroup with
-  only one argument.
-  (url-check-gnus-version): Added Pterodactyl Gnus to the list of
-  acceptable Gnusen.
-
-* lisp/url-mail.el (url-mailto): url-mailto would not handle %3F (`?')
-  in addresses because url-unhex-string changed match-end.
-  Added support for "body" hname.  Emit style warning for <mailto:/.*>.
-
-1998-10-29  William Perry  <address@hidden>
-
-* lisp/w3-display.el (w3-region): Make me autoloaded.
-
-1998-10-28  William M. Perry  <address@hidden>
-
-* lisp/mule-sysdp.el (mule-code-convert-region): Try to avoid lossage when 
-  point-max changes due to a set-buffer-multibyte operation.
-
-1998-10-28  Laurent Martelli <address@hidden>
-
-* Patches to add hotindex support.  It's a patch to W3/Emacs allowing you
-  to associate keywords to your  hotlist  entries.  You can then query
-  for  the entries matching a keyword. I  did  this because  I find it
-  hard  to find  a particular bookmark when  you more than  a hundred,
-  even with hotlist-apropos. And I think  that folders and subfolders
-  are not  very convenient because  an entry usually belongs to more
-  than one folder.
-
-1998-10-26  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0pre25 released
-
-* lisp/w3-display.el (w3-get-all-face-info): Fixed stupid problem where
-  w3-user-fonts-take-precedence was being used backwards!
-
-* Emacs/W3 4.0pre24 released
-
-1998-10-25  Thierry Emery <address@hidden>
-
-* lisp/w3-speak-table.el: Various patches from Thierry to help Emacspeak
-
-1998-10-23  William Perry  <address@hidden>
-
-* lisp/w3-display.el (w3-get-all-face-info): Better way to ignore font
-  family stuff if w3-user-fonts-take-precedence != nil
-
-1998-10-23  Lars Marius Garshol <address@hidden>
-
-* lisp/url-file.el (url-cleanup-file): New function for removing
-  questionable practices from file urls before we fetch them.  Should fix
-  lots of the problems where we tried to ftp when we shouldn't have.
-
-1998-10-23  William Perry  <address@hidden>
-
-* lisp/w3-display.el (w3-face-for-element): Use it.
-
-* lisp/w3-cus.el: New variable on whether to ignore document fonts or
-  not.
-
-1998-10-23  Toby Speight <address@hidden>
-
-* lisp/w3.el (w3-internal-handle-preview): Fix for previewing files under
-  windows that have UNC paths (ie: //foo/bar).  Would try to use ftp
-  otherwise.
-
-* lisp/w3-vars.el (w3-mode-map): Added keybindings for them.
-
-* lisp/w3.el (w3-prev-document): Added new function
-(w3-next-document): ditto
-
-* Added w3-hotindex.el to the contrib directory - adds keyword searching
-  to the hotlist code.
-
-1998-09-20  William M. Perry  <address@hidden>
-
-* */Makefile.in: Fixed the automatic rebuilding based on
-  configure/aclocal.m4 and config.status.  Everything should build in a
-  separate source directory now.
-
-1998-09-08  William M. Perry  <address@hidden>
-
-* lisp/font.el (define-font-keywords): build the :regular keyword with the
-  rest, for v19 emacs
-
-1998-09-08  Charles Levert <address@hidden>
-
-* lisp/w3-parse.el: Patch to deal with incredibly bad HTML that specifies
-  attributes like font="foo","bar","baz".  Ick.
-
-* lisp/w3-forms.el (w3-form-create-image): Fix for image submit buttons.
-
-1998-09-08  William M. Perry  <address@hidden>
-
-* lisp/w3-parse.el: Allow '?' in unquoted attribute values, so that CGI
-  queries in unquoted HREFs work correctly.
-
-1998-08-30  William M. Perry  <address@hidden>
-
-* lisp/docomp.el: Added approprate magic to add the
-  custom-declare-variable byte-hunk-handler so that in version of Emacs <=
-  19.34, customized variables do not show up as 'free' to the byte
-  compiler.
-
-1998-08-22  T. V. Raman <address@hidden>
-
-* lisp/w3-speak-table.el: Implemented table navigation for nested tables 
-  Also implemented emacspeak/w3 command for querying info about the
-  current cell.  cleaned up keybindings
-
-1998-06-22  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0pre23 released
-
-* lisp/w3-cfg.el.in (w3-configuration-data): Allow the cdr of the assoc
-  list to be something to be eval'd.  Allows things to work better under
-  NT/95 Emacs/XEmacs without needing to do a 'configure' run.  See new
-  file w3-cfg.nt.
-
-* lisp/w3.el (w3-viewer-filter): Start showing output from the viewer
-  program as soon as we get it instead of after it exits.  This allows
-  viewers to spit out instructions on their use (ie: imageviewer under
-  solaris says things like 'hit q to make the window disappear'.
-
-* build.bat: Copy new w3-cfg.nt file over to w3-cfg.el before doing the
-  compile for those NT/Win95 people.
-
-Wed Jun 17 18:30:11 1998  Jonathan Harris <address@hidden>
-
-* lisp/font.el (mswindows-font-create-object): various mswindows fixes -
-  please speak up if anything is broken!
-
-1998-06-18  Stefan Hornburg  <address@hidden>
-
-* lisp/url-file.el (url-file): Fixed a regexp that should match drive
-  letters.  This fixes a longstanding bug where efs/ange-ftp would get
-  invoked instead of looking locally.
-
-1998-06-13  William M. Perry  <address@hidden>
-
-* lisp/w3-hot.el (finish-submenu): Ignore empty strings when searching for 
-  sublist titles.  Reading netscape bookmark files works correctly again.
-
-1998-06-12  William M. Perry  <address@hidden>
-
-* lisp/w3-xemac.el (w3-mouse-handler): Make sure we don't do anything if
-  the current buffer is not the one our event is destined for.  Avoids
-  some weird errors in XEmacs on corner cases w/mouse movement.
-
-* lisp/w3-annotat.el: Removed some old variables - evidently nobody uses
-  this shit any more. :)
-
-* lisp/w3-menu.el (w3-menu-breakup): Moved into this file because it is
-  where it belongs.  Also changed so that 'more...' menu items are spliced 
-  in at the end of the menu where they belong.
-  All the filter menus should work under Emacs 20.3 now.
-  (w3-popup-menu): No longer use 'popup-menu' - this removes the need
-  under Emacs to (require 'lmenu), which caused lots and lots of problems
-  with invalid macros, etc.
-
-1998-06-10  William M. Perry  <address@hidden>
-
-* lisp/w3-menu.el (w3-menu-filters-supported-p): New variable to determine 
-  whether this flavor of Emacs supports the :filter keyword on
-  menus.  Emacs 20.3 will support the :filter keyword, so lets use it.
-  (w3-menu-go-menu): Use it.
-  (w3-menu-bookmark-menu): Ditto.
-  (w3-menu-html-links-constructor): Make this work with easymenu.
-  (w3-menu-hotlist-constructor): Ditto.
-  (w3-menu-links-constructor): Ditto.
-  (w3-menu-e19-show-navigate-menu): Moved from w3-e19.el
-  (w3-menu-e19-show-links-menu): Ditto.
-  (w3-menu-e19-show-hotlist-menu): Ditto.
-
-* lisp/w3-xemac.el (w3-store-in-clipboard): Make this work under mswindows 
-  devices.
-
-1998-06-09  William M. Perry  <address@hidden>
-
-* lisp/w3.el (w3-find-default-stylesheets): Use w3-configuration-data to
-  slap the 'datadir' macro into the search path for stylesheets.
-
-* lisp/w3-cfg.el.in: New file that will store information from the
-  configure run for use later.
-  (w3-configuration-data): New function to retrieve configure-time
-  information later.
-
-* lisp/url-vars.el (url-privacy-level): changed customization properties.
-
-1998-06-08  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0.pre21 released
-
-* lisp/w3-parse.el (w3-parse-buffer): Better dealing with the
-  sera-to-fidel stuff in MULE - and don't bother calling it when
-  default-enable-multibyte-characters is nil for mule 4.x
-
-* lisp/w3.el (w3-download-callback): Use
-  mule-write-region-no-coding-system so that all the MULE variations are
-  hidden within mule-sysdp.el, where they belong.
-
-1998-06-05  Dave Love  <address@hidden>
-
-* lisp/mule-sysdp.el (mule-retrieval-coding-system,
-  mule-no-coding-system, mule-detect-coding-version,
-  mule-inhibit-code-conversion, mule-encode-string,
-  truncate-string-to-width, mule-coding-system-name,
-  mule-find-coding-system): Test for mule-sysdep-version == 4.0.
-  (mule-code-convert-region, mule-make-iso-character): Test for
-  mule-sysdep-version == 4.0.  Also test
-  default-enable-multibyte-characters.
-  (mule-truncate-string): Test for mule-sysdep-version == 4.0.  Use
-  truncate-string-to-width in Emacs 20.
-
-1998-06-04  William M. Perry  <address@hidden>
-
-* lisp/url-http.el (url-create-mime-request): New behaviour wrt
-  url-mime-language-string - if it is nil, then no accept-language header
-  will be sent.  This is to work around problem when dealing with apache - 
-  the old default of '*' would cause the server to return the first
-  version of a document it could find (w3c site would typically send out
-  danish or japanese) - definitely suboptimal.  I don't know how this will 
-  impact you MULE folks though - speak up!
-
-* lisp/url-vars.el (url-mime-language-string): Better customization of
-  this - new default value of nil.
-
-1998-06-02  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0.pre20 released
-
-1998-06-02  Thierry Emery <address@hidden>
-
-* lisp/w3-display.el (w3-refresh-buffer): Try to stay as close to current
-  point as we can when you do a refresh-buffer.
-
-* lisp/w3-display.el (w3-display-table): Fix for Emacspeak table
-  traversal that was broken by the new borderless table features.
-
-* lisp/w3-display.el: Various fixes for alternate image text in tables.
-
-1998-05-25  William M. Perry  <address@hidden>
-
-* lisp/w3-menu.el (w3-menu-options-menu): Fixed problem where newest
-  easymenu (emacs 20.2.93) is a little pickier than before and dies on
-  'nil' menu entries.
-
-* lisp/mule-sysdp.el: Avoid setting enable-multibyte-characters directly
-  under Emacs 20.3-to-be, since it is now a read-only variable.  Use
-  set-buffer-multibyte instead.
-
-1998-05-24  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0pre19 released
-
-* lisp/url.el (url-file-extension): Make sure we run this through
-  url-basepath to strip out CGI queries.
-  (url-basepath): Strip out any CGI queries from a file when we get its
-  basepath.  This means that relative URLs in CGI results will work much
-  more sanely.
-
-* lisp/mule-sysdp.el (mule-detect-coding-version): Work around incredibly
-  weird bug in Emacs 20.2 where detect-coding-region can return 100%
-  insane results whcih then case code-convert-region to die a horrible
-  death.
-
-* lisp/w3.el (w3-download-callback): Don't blindly bind
-  file-name-handler-alist to nil just to get around auto-compression
-  packages, use the ugly internal knowledge of the most popular ones and
-  disable them like we do in the url-file-* routines.  Otherwise you
-  cannot download a file directory to an EFS filename.
-
-Fri May 22 14:39:52 1998  William M. Perry  <address@hidden>
-
-* lisp/w3-display.el (w3-display-table): Don't insert empty space for
-  borderless tables - this will allow you to display much more data on a
-  page.
-
-Thu May 21 16:09:57 1998  William M. Perry  <address@hidden>
-
-* lisp/w3-forms.el (w3-form-encode-helper): Fixed 'file' submissions -
-  return value of insert-file-contents-literally changed.
-
-* lisp/w3-hot.el (w3-hotlist-break-shit): Make everything interactive!
-
-1998-05-19  William M. Perry  <address@hidden>
-
-* lisp/css.el (css-contextual-match): Fixed scoping bug in CSS - you could 
-  not specify something like '.menu a { color: red }' - it was not walking 
-  up the list correctly when it found a rule with *document as the
-  element.
-
-Thu May 14 11:49:42 1998  William M. Perry  <address@hidden>
-
-* lisp/font.el (mswindows-font-create-object): Now correctly deals with
-  mswindows fonts under XEmacs thanks to Andy Piper.
-
-1998-04-17  T. V. Raman  <address@hidden>
-
-* lisp/w3-speak-table.el (w3-table-setup-keys): Base keymappings off of
-  emacspeak-prefix, instead of hardcoded C-z.
-
-1998-04-17  William M. Perry  <address@hidden>
-
-* lisp/: updated copyright statements, removed quite a few old files from
-  the tree.
-
-* lisp/xml.el: New way to parse XML documents using an external process
-  and some new support tools based upon 'expat', the XML parser from James 
-  Clark.
-
-* aclocal.m4 (AC_EMACS_PACKAGES): resurrected the --with-package-dir
-  option.
-
-1998-04-15  William M. Perry  <address@hidden>
-
-* configure.in: Changes to where it installs things by default, more
-  GNUish now.  Need to think about how packages need to be done in
-  autoconf more.
-
-* lisp/w3-cus.el (w3): Put the 'url' group within the W3 group
-  automatically.
-
-* lisp/w3-menu.el (w3-menu-options-menu): Do customize-browse instead of
-  w3-preferences-edit for Options->Edit Preferences menu item.
-
-* lisp/docomp.el: Use w3-load-flavors and w3-setup-version-specifics in
-  docomp.el, just to make sure everything works.
-
-* lisp/w3.el (w3-load-flavors): Don't bitch about XEmacs being unsupported 
-  on windows anymore, because it is again!
-
-* lisp/w3-xemac.el: Force loading of new widget/custom libraries on
-  XEmacsen that are too old, but had them dumped in, so load-path munging
-  doesn't do anything.
-
-* lisp/socks.el: Added socks v4 support.  To do this I had to change how
-  socks servers are defined - try the new customization support: C-u M-x
-  customize [RET] socks to see what has changed. 
-
-* lisp/mule-sysdp.el (mule-sysdep-version): Try to deal with MBSK Emacs
-  not really being mule, but still mostly lying about it.
-
-* lisp/w3-speak-table.el: New file to actually take advantage of the new
-  table structure.
-
-* lisp/w3-display.el: Changes from Raman and Thierry for keeping track of
-  table structure.
-
-1998-04-13  William M. Perry  <address@hidden>
-
-* lisp/w3-parse.el (w3-parse-buffer): Wrap calls to sera-to-fidel-marker
-  in a condition-case to avoid lossage on MBSK emacsen.
-
-1998-03-08  Laurent Martelli <address@hidden>
-
-* lisp/w3-hot.el (w3-hotlist-rename-entry): Could select the wrong entry
-  if one hotlist title was the same as the beginning of another one.
-
-1998-03-07  William M. Perry  <address@hidden>
-
-* lisp/docomp.el: require lmenu during compiles, or Emacs 20.x will
-  choke.
-
-1998-03-07  Greg Stark <address@hidden>
-
-* lisp/w3-forms.el (w3-form-determine-size): Fix various misalignments in
-  tables.
-
-1998-02-22  William M. Perry  <address@hidden>
-
-* lisp/docomp.el (compile-it): This should now work in v19 emacsen, since
-  they didn't support the 'files-only' final argument.
-
-1998-01-29  Dieter Maurer <address@hidden>
-
-* lisp/mm.el (mm-parse-mime-headers): Handle continuation lines in headers 
-
-1998-01-29  William M. Perry  <address@hidden>
-
-* lisp/socks.el: Fixed various int vs. char problems, made the error
-  reporting a little clearer that they were actual errors from the SOCKS
-  server, not necessarily the ultimate destination.
-
-1998-01-28  William M. Perry  <address@hidden>
-
-* lisp/url-cookie.el (url-cookie-handle-set-cookie): Allow
-  url-privacy-level == paranoid to deny all cookies.
-
-1998-01-27  William M. Perry  <address@hidden>
-
-* lisp/w3.el (w3-download-url): Fix in the case where a filename is passed
-  in - was calling the callback with the wrong # of arguments.
-
-1998-01-20  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0pre14 released
-
-* lisp/w3-toolbar.el (w3-toolbar-make-buttons): Don't die horribly if you
-  cannot make the toolbar buttons - this made TTY XEmacs 20.5beta +
-  Emacs/W3 choke big time.  all better now.
-
-1998-01-09  William M. Perry  <address@hidden>
-
-* lisp/w3-parse.el (w3-parse-buffer): Don't use insert-char for SGML
-  entities, because with the new MULE replacements for stupid windows
-  character sets, some of them are no longer single characters.
-
-1998-01-06  Laurent MARTELLI  <address@hidden
-
-* lisp/w3-menu.el (w3-menu-search-menu): Added 'ftp search' at
-  http://ftpsearch.ntnu.no/home.html to the search menu.
-
-1998-01-06  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0pre13 released
-
-* lisp/url-http.el (url-create-mime-request): Added better protection
-  around calls to getting proxy authentication when we aren't really
-  proxying anything.
-
-* lisp/w3-hot.el (w3-hotlist-refresh): Make sure w3-do-setup has been
-  run.
-
-* lisp/url-http.el (url-create-mime-request): Fixed proxy authentication
-  and excessive prompting
-
-1998-01-05  William M. Perry  <address@hidden>
-
-* lisp/w3-menu.el (w3-menu-make-xemacs-menubar): Fixed problem where
-  XEmacs would never install the 'buffers' menu
-  (w3-menu-install-menubar): Fixed test for whether to initialize the
-  menubar.
-
-1998-01-05  Laurent Martelli <address@hidden>
-
-* lisp/w3-cus.el (w3-defined-link-types): Added 'contents' and 'top' from
-  the HTML 3.2 reference spec to the predefined sets of <LINK> types.
-
-1997-12-31  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0pre12 released
-
-1997-12-29  William M. Perry  <address@hidden>
-
-* lisp/Makefile.in: don't remove the old custom-load.el and
-  auto-autoloads.el, so that people using Emacs 19/20 can muck with the
-  source and not destroy the autoloads in the process.
-
-1997-12-26  William M. Perry  <address@hidden>
-
-* lisp/url-misc.el (url-do-terminal-emulator): Removed extra ')' DUGH!
-
-1997-12-25  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0pre11 released
-
-* lisp/url.el (url-lazy-message): Don't show messages if there is an
-  active minibuffer window.
-
-* lisp/Makefile.in (w3-auto.el): removed use of $^ macro, since some SYSV
-  machines seem to croak on it.
-
-1997-12-24  Ching-Mo Chang  <address@hidden>
-
-* lisp/url-file.el (url-file): fix for stripping out leading '/' from
-  local filenames under OS/2.
-
-1997-12-24  William M. Perry  <address@hidden>
-
-* lisp/url-misc.el (url-do-terminal-emulator): Fixed for the case where
-  the user was not specified (vast majority)
-
-* lisp/w3.el (w3-save-as): Don't double latex output
-
-* lisp/w3-parse.el (w3-parse-buffer): Deal with comments slightly
-  differently - on large documents, we could hit a stack overflow in the
-  regexp engine.
-
-* lisp/css.el (css-expand-value): default to using :normal for unknown
-  weights, not :bold.
-
-1997-12-24  Vladimir Alexiev <address@hidden>
-* lisp/w3-xemac.el: Compatibility stuff for XEmacs 19.13
-
-1997-12-24  William M. Perry  <address@hidden>
-
-* lisp/w3-forms.el (w3-form-determine-size): If someone specifies a 'size'
-  of 0 for a form element, bring sanity back to the world.
-
-* lisp/w3-cus.el (w3-display-frames): Changed default to 't' to
-  automatically display frames.
-
-* lisp/w3-parse.el: Added nobr tag to %special - it should parse fine
-  now.
-
-* lisp/socks.el (socks-override-functions): New variable to control
-  whether or not to overwrite the builtin open-network-stream function
-  with one of our own.
-
-* lisp/font.el: Added explicit require of disp-table, so we will work with 
-  older XEmacsen.
-
-* lisp/w3-style.el (w3-display-stylesheet): Default to using
-  w3-user-stylesheet if w3-current-stylesheet is not set yet (ie: no page
-  loaded in current window).  Also throws an error if none of those are
-  defined yet.
-
-1997-12-22  Michael Ernst <address@hidden>
-
-* url.el (url-get-url-at-point): Strip surrounding parens from a
-  potential URL.
-
-1997-12-22  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-pause): Use a dedicated variable instead of
-  coopting cur-viewing-pos, to protect against errors.
-
-1997-12-22  Thierry Emery <address@hidden>
-
-* w3-parse.el: Deal with invalid SGML characters in mule better.
-
-1997-12-22  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0.pre10 released
-
-* lisp/w3-parse.el (w3-parse-buffer): Make sure we expand the 'background' 
-  tag, so stylesheets created after mucking with the <body> attributes
-  will work correctly.
-
-* configure.in: Disable caching of configure results - I've become
-  convinced this is the right thing to do.
-
-* Makefile.in (install): Don't automatically hack up someone's .emacs file 
-  - make them explicitly do a 'make dotemacs'
-
-* configure.in: Moved some of the --with-FOO stuff into aclocal.m4 and the
-  appropriate AC_DEFUN macros, where they belong.
-
-* aclocal.m4 (library): Fixed setting of package directory (typo).
-
-1997-12-04  Thierry Emery <address@hidden>
-
-* lisp/w3.el (w3-mail-current-document): ditto.
-
-* lisp/w3-display.el (w3-maybe-start-image-download): ditto.
-
-* lisp/url.el (url-insert-file-contents): protects url-be-asynchronous
-  against elisp errors in code sections where its default value is
-  temporarily modified.
-
-1997-11-27  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0.pre9 released
-
-1997-11-27  Cord Kielhorn <address@hidden>
-
-* lisp/w3-hot.el (w3-grok-html-bookmarks-internal): Some fixes for HTML
-  hotlists in xmosaic hotlist format 3
-
-1997-11-27  William M. Perry  <address@hidden>
-
-* lisp/w3-cus.el (w3-delay-image-loads): Default to not loading images if
-  this version of Emacs does not support any image formats other than XPM
-  or XBM.
-
-1997-11-20  William M. Perry  <address@hidden>
-
-* lisp/w3-display.el (w3-resurrect-hyperlinks): Keep track of start and
-  end of the widget, since widget-convert-text doesn't appear to.
-  (w3-display-node): Keep track of :visited and :active faces for
-  hyperlinks.
-  (w3-follow-hyperlink): Apply the :visited face to a widget after we
-  fetch it.
-
-1997-11-20  Thierry Emery  <address@hidden>
-
-* lisp/w3-display.el (w3-display-node): more frames work
-
-1997-11-07  William M. Perry  <address@hidden>
-
-* lisp/css.el (css-expand-length): Fixed percentages in css-expand-length
-
-1997-11-05  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0.pre8 released
-
-* aclocal.m4 (elisp): Use a temporary file for elisp configuration tests,
-  to avoid weirdness that gets shoved to stdout/stderr by the various
-  emacsen.
-
-* lisp/w3-cus.el (w3-image-mappings): Use imagick for everything if XEmacs 
-  was compiled with it.
-
-* lisp/w3-display.el (w3-maybe-start-image-download): Protect against bad
-  instantiation of glyphs of already loaded images.
-
-1997-11-04  Thierry Emery <address@hidden>
-
-* Support relative frameset dimensions (ie: "2*,*")
-
-* Fixed problem with doubling or tripling of image 'alt' text for images
-  in tables.
-
-1997-11-03  William M. Perry  <address@hidden>
-
-* aclocal.m4 (elisp): Simplified version of AC_EMACS_VERSION that just
-  uses AC_EMASC_LISP to print out emacs-major-version . emacs-minor-version
-
-1997-10-28  William M. Perry  <address@hidden>
-
-* lisp/url-cookie.el (url-cookie-parse-file): Fixed autoload cookie (hah)
-
-1997-10-27  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0pre7 released
-
-1997-10-27  Jens-Ulrik Holger Petersen  <address@hidden>
-
-* url.el (url-retrieve-internally): Ensure that coding system for
-  the url buffer is set to no-conversion.
-
-1997-10-23  William M. Perry  <address@hidden>
-
-* aclocal.m4: Fixed detection of how to rebuild custom-loads.el and
-  auto-autoloads.el
-
-1997-10-23  Thierry Emery <address@hidden>
-
-* lisp/w3-display.el lisp/w3-widget.el: Lots of fixes for images.
-  image hyperlinks are active, even when inside tables (thanks to a
-  w3-hyperimage-info text-property, a content for w3-resurrect-images
-  and the fact that :href and :target info are now passed on down to
-  the children widgets),
-
-  a face can be specified in the stylesheet, which will be used for
-  the `alt' tags, e.g.:
-  img:link    { color: goldenrod  }
-  img:active  { color: goldenrod  }
-  img:visited { color: firebrick  }
-       
-  the `alt' tag of image maps is displayed, to ease visual
-  recognition,
-
-  when the `alt' tag is "" and w3-auto-image-alt is non nil,
-  an `alt' tag is made from the image src file basename. (WMP change)
-
-1997-10-20  Ching-Mo Chang  <address@hidden>
-
-* lisp/url-file.el (url-host-is-local-p): recognize XXX:/ as local file
-  under NT/Win95/OS2.
-
-* lisp/url-cache.el (url-cache-extract): replace 'os2' with 'emx' when
-  comparing system-type.
-
-* lisp/w3-e19.el (w3-store-in-clipboard): Deal gracefully with
-  interprogram-cut-function being bound, but nil - we should fall back to 
-  the device-specific stuff, not just do nothing.
-
-1997-10-20  William M. Perry  <address@hidden>
-
-* texi/w3-faq.txi (Runtime FAQ): New FAQ about Mule 20.x and \201 in front 
-  of everything.
-
-1997-10-17  William M. Perry  <address@hidden>
-
-* Emacs/W3 4.0pre6 released
-
-* lisp/images.el (image-register-netpbm-utilities): Don't automatically
-  dither PNM/PPM files to 256 colors when converting to XPM - its not
-  necessary.
-
-1997-10-17  Colin Rafferty <address@hidden>
-
-* lisp/url-auth.el (url-auth-user-prompt): New function to create a pretty 
-  prompt that shows the realm or URL that the user should be
-  authenticating to.
-
-1997-10-17  William M. Perry  <address@hidden>
-
-* contrib/w3-imenu.el: New version of w3-imenu for the contrib directory.
-
-* Emacs/W3 4.0pre5 released.
-
-* lisp/w3.el (w3-find-default-stylesheets): Should now find the stylesheet
-  much more often given the new directory layout under Emacs 19.x & 20.x
-
-* lisp/Makefile.in (custom-load.el): Automatically rebuild auto-autoloads
-  and custom-load.el if any of the source files have changed.  configure
-  now auto-detects how to rebuild them.
-
-Fri Oct 17 06:27:07 1997  William M. Perry  <address@hidden>
-
-* lisp/url-cookie.el: autoload url-cookie-parse-file
-
-1997-10-16  William M. Perry  <address@hidden>
-* lisp/w3-display.el (w3-insert-terminal-char): better handling of HR
-  within borderless tables 
-
-* lisp/w3-parse.el (w3-p-s-entity): Don't cons up a string just to insert
-  a single character.
-
-* lisp/w3-display.el (w3-display-line-break): 2.3 Mule's char-before requires
-  the 'pos' argument, so always send in (point).
-
-* lisp/w3-display.el (w3-dingbats): don't crap out in mule 2.3
-
-* lisp/w3.el (w3-find-default-stylesheets): Make finding no stylesheets a
-  fatal error.
-
-1997-10-15  William M. Perry  <address@hidden>
-
-* configure.in: Deal with EMACS="t", so you can now configure Emacs/W3
-  from within an emacs shell buffer.
-
-1997-10-13  William M. Perry  <address@hidden>
-
-* lisp/w3-toolbar.el (w3-toolbar-make-buttons): Default to using text only 
-  buttons if w3-toolbar-icon-directory doesn't exist (or is nil if
-  locate-data-directory fails)
-
-1997-10-04  SL Baur  <address@hidden>
-
-* lisp/w3.el (w3-find-default-stylesheets): Use `locate-data-directory' if 
-  it exists.
-
-* lisp/w3-toolbar.el (w3-toolbar-make-buttons): Use `locate-data-directory'
-  if it exists.
-
-1997-10-03  William M. Perry  <address@hidden>
-
-* texi/Makefile.in (install): Ignore errors from the installinfo stage.
-
-1997-10-02  William M. Perry  <address@hidden>
-
-* lisp/w3.el: Added autoload for w3-version
-
-* texi/Makefile.in (install): Don't global when doing install-info
-
-1997-09-30  William M. Perry  <address@hidden>
-
-* lisp/w3.el (w3-map-links): Use the exposed widget-map-buttons function,
-  since XEmacs no longer uses overlays for its internal representation of
-  widgets.
-
-1997-09-29  William M. Perry  <address@hidden>
-
-* lisp/url-news.el (url-news-version-too-old): Deal with quassia gnus
-
-1997-09-25  William M. Perry  <address@hidden>
-
-* lisp/url-news.el (url-format-news): Use 'gnus-article-display-hook
-  instead of manually calling gnus-article-hide-headers
-  (url-format-news): Also bind gnus-article-current, because some hooks
-  might need to use it.
-
-1997-09-22  William M. Perry  <address@hidden>
-
-* lisp/url-ns.el (url-ns-prefs): Can now parse a netscape preferences.js
-  file and query items out of it.
-
-1997-09-19  William M. Perry  <address@hidden>
-
-* Emacs/W3 3.0.105 released
-
-* Removed the custom and widget libraries from the distribution.
-
-* configure.in, aclocal.m4: Lots of changes and additional macros for
-  detecting features in Emacs Lisp.  New way of detecting acceptable
-  widget/custom combinations, and warnings about where to go to get the
-  newest version.
-
-1997-09-16  William M. Perry  <address@hidden>
-
-* Updated to Widget/Custom 1.9958
-
-1997-09-16  Thierry Emery <address@hidden>
-
-* lisp/w3-display.el, lisp/w3.el: Better frame navigation -- 'q','l', etc
-  should now back up by framesets, not just by single buffers.
-
-Sat Sep 13 16:26:47 1997  Istvan Marko <address@hidden>
-
-* lisp/w3-mouse.el (w3-follow-inlined-image): Fixed
-  w3-follow-inlined-image
-
-Thu Sep 11 15:17:27 1997  William M. Perry  <address@hidden>
-
-* lisp/w3-display.el: Go back to creating the 'nil' face all the time,
-  even in Emacs - otherwise ps-print chokes.
-
-1997-09-10  William M. Perry  <address@hidden>
-
-* lisp/w3-parse.el (w3-parse-buffer): Latest Emacs 20.x has renamed the
-  sera-to-fidel-marker function to ethio-sera-to-fidel-marker, so we were
-  losing on ethiopic texts.
-
-1997-09-05  William M. Perry  <address@hidden>
-
-* Makefile.in: Now includes the 'contrib' directory in distributions.
-
-* aclocal.m4: Fixed custom detection - would sometimes set CUSTOM to the
-  directory, sometimes to the filename... ick.
-
-* Makefile.in (dotemacs): Tweaked the install of autoloads into .emacs file
-
-* lisp/font.el (font-normalize-color): Ditto
-
-* lisp/url.el (url-setup-privacy-info): Ditto
-
-* lisp/devices.el: Everything now recognizes 'w32' as an alias for the
-  'win32' device type.  This is for Emacs 20.x compatibility, which will
-  have this change.
-
-1997-09-04  William M. Perry  <address@hidden>
-
-* Updated to Widget/Custom 1.9956
-
-1997-08-25  William M. Perry  <address@hidden>
-
-* lisp/w3.el (w3-document-information): Fixed bug with empty 'meta' links.
-
-1997-08-20  William M. Perry  <address@hidden>
-
-* lisp/w3-menu.el ((fboundp 'id-menubar-set)): Avoid fset'ing
-  id-menubar-set - it was confusing oobr
-
-1997-08-19  William M. Perry  <address@hidden>
-
-* New file w3-imenu.el from T.V. Raman <address@hidden>
-
-1997-08-15  William M. Perry  <address@hidden>
-
-* Emacs/W3 3.0.102 released
-
-* lisp/Makefile.in: Fix for some buggy makes that didn't like my very long
-  substitutions on the SOURCES macro.
-
-1997-08-14  Roland McGrath <address@hidden>
-
-* lisp/md5.el (md5): protect kill-buffer from getting already dead buffers
-  by using 'buffer-name'
-
-1997-08-12  William M. Perry  <address@hidden>
-
-* lisp/w3-display.el (w3-display-nil-face): Don't make the 'nil' face
-  under Emacs 19.
-
-* lisp/wid-edit.el (widget-before-change): Allow inhbit-read-only to
-  override the before-change checks for if we are at a widget or not.
-
-* lisp/cus-face.el: Path to make cus-face.el play nice with
-  emacs 19 without X support.
-
-* lisp/w3-e19.el (w3-mode-version-specifics): Dont' do read-only 
-
-1997-08-10  Thierry Emery <address@hidden>
-
-* lisp/w3-display.el: Patch for frames on TTY devices.
-
-1997-08-08  William M. Perry  <address@hidden>
-
-* lisp/w3-display.el (w3-table-ascii-border-chars): Back to more
-  rectangular ascii art for table borders.
-
-* lisp/socks.el (socks-find-route): Allow negation of regexps by
-  prepending a ! to them for a 'proxy if they match' type rule.  The whole 
-  configuration of this module needs to change.
-
-1997-08-08  Istvan Marko <address@hidden>
-
-* lisp/url-misc.el (url-proxy): Fix for all proxy access.
-
-1997-08-08  William M. Perry  <address@hidden>
-
-* lisp/w3-display.el: Fixed compilation problems under Emacs 20.x that had
-  to do with char tables and such.
-
-* lisp/w3-e20.el (w3-e20): Added provide statement for this file - duh.
-
-1997-08-07  William M. Perry  <address@hidden>
-
-* Emacs/W3 3.0.98 released
-
-* Synch'd up to custom 1.9954
-
-Thu Aug  7 08:16:Denys Duchier <address@hidden>
-
-* lisp/w3-display.el (w3-widget-echo): Use
-  buffer-substring-no-properties for w3-widget-echo to avoid spurious
-  'attempt to change text outside editable field' errors.  Is this needed
-  with the new custom?  Doubtful, but its still a good idea. (wmp)
-
-Fri Aug  1 06:00:02 1997  Thierry Emery <address@hidden>
-
-* w3-display.el: take into account hierarchical framesets in a same page
-  and discards useless "*" values for cols or rows.
-
-Sun Jul 27 18:43:41 1997  William M. Perry  <address@hidden>
-
-* configure.in: Added --with-lispdir configure option.
-
-* lisp/url-misc.el (url-proxy): Strip out "#foo" anchors in proxy requests
-
-* configure.in: Fixed guessing of .emacs location to work in shells where
-  ~/ is not expanded.
-
-1997-07-26  SL Baur  <address@hidden>
-
-* mm.el (mm-extension-to-mime): Use `eq' for character comparison.
-
-Sun Jun 29 22:26:43 1997  William M. Perry  <address@hidden>
-
-* lisp/w3-emulate.el: Make sure we call widget-button-press not w3-follow-link
-
-* configure.in: New --enable-site-install option to control whether init
-  code goes in user's .emacs file or default.el
-
-* Makefile.in (dotemacs): New target for modifying the user's .emacs file
-  or the sitewide default init.
-  (html): New target for building html versions of the manuals.
-
-Fri Jun 27 21:08:24 1997  William M. Perry  <address@hidden>
-
-* texi/Makefile.in (%.html): Added targets for making HTML versions of the
-  info files.
-
-1997-06-27  William M. Perry  <address@hidden>
-
-* lisp/w3.el: In non-XEmacs, the version-specific stuff is loaded from
-  (format "w3-e%d" emacs-major-version), in case we need to do anything
-  special for Emacs 20.x with Mule support.
-
-* Only use one conditionalization variable - w3-running-xemacs
-
-1997-06-26  William M. Perry  <address@hidden>
-
-* Makefile.in: Make sure we recursively make usin $(MAKE), not
-  vanilla 'make'.
-
-* lisp/w3.el (w3-insert-formatted-url): Works again, forgot to update it
-  to use the new widget properties.
-  (w3-maybe-follow-link): Ditto.
-  (w3-view-this-url): Ditto.
-  (w3-follow-link): Ditto.
-  (w3-complete-link): Ditto.
-
-Wed Jun 25 07:29:46 1997  William M. Perry  <address@hidden>
-
-* lisp/w3.el (w3-find-default-stylesheets): Added more directories to the
-  stylesheet search path.
-
-* Emacs/W3 3.0.92 released
-
-* Moved lisp stuff into its own subdirectory, integrated into configure,
-  make, and install procedures.
-
-* Makefile.in (Makefile): Ditto
-
-* texi/Makefile.in: Automatically rebuilds out-of-date Makefiles
-
-* configure.in: Make sure we create texi/Makefile
-
-* w3-display.el (w3-table-ascii-border-chars): Slightly nicer rounded
-  edges for ascii borders on tables.
-
-Tue Jun 24 14:35:05 1997  William M. Perry  <address@hidden>
-
-* Emacs/W3 3.0.91 Released
-
-* Moved texinfo stuff into its own subdirectory, integrated into
-  configure, make, and install procedures.
-
-* url-file.el: Visiting directories with an index file works in asynch
-  mode now.
-
-* docomp.el (cl): Load cl during builds
-
-* w3.el (w3-find-default-stylesheets): Added more directories to the
-  stylesheet search path.
-  (w3-do-setup): Make sure we don't infinitely recurse if we are using
-  html bookmarks.  w3-parse-hotlist could call w3-parse-buffer, which will
-  call w3-do-setup if we don't set our global flag as 't'.
-
-* Makefile.in (SOURCES): Some reordering to make the stupid thing at least
-  compile with Emacs 19.
-
-Tue Jun 24 11:44:59 1997  Per Abrahamsen  <address@hidden>
-
-* w3.el (w3-mode): Avoid calling the global bindings for RET and mouse-2. 
-
-1997-06-24  William M. Perry  <address@hidden>
-
-* Synch'd up to custom/widget 1.9936
-       
-* Emacs/W3 3.0.90 released
-
-* Moved the documentation into its own subdirectory
-
-* w3-menu.el: Slightly less complete version of id-menubar-set when not in 
-  InfoDock - was causing lots of errors in XEmacs when trying to run a
-  non-existent hook.  Bleah.
-
-* configure.in: Fixed AC_CHECK_PROG for emacs/xemacs - duh.
-
-* aclocal.m4: Don't check custom sanity if it was specified on the
-  configure line
-
-1997-06-23  William M. Perry  <address@hidden>
-
-* url-file.el (url-file): Make sure we set the content-type when loading
-  files.  Was screwed when we were asynch.
-
-* Upped planned release # to 4.0
-
-* Emacs/W3 3.0.89 released.
-
-* configure.in: Fixed --with-x*emacs switches.
-
-* Emacs/W3 3.0.88 aborted.
-
-* w3-display.el (w3-display-node): deal with empty selections
-
-* Now uses autoconf to deal with all configuration issues, including
-  sanity checking the installation of the custom and widget libraries.
-
-Mon Jun 23 17:08:55 1997  Per Abrahamsen  <address@hidden>
-
-* w3.el (w3-mode): Don't call `widget-minor-mode'.
-
-* w3-vars.el (w3-mode-map): Use `make-sparse-keymap'.
-  Use `widget-keymap' as parent.
-  (wid-edit): require.
-
-Mon Jun 23 07:09:51 1997  William M. Perry  <address@hidden>
-
-* w3-parse.el (w3-parse-buffer): Make sure we always have a newline at the
-  end of the buffer before starting the parse.
-
-Fri Jun 20 11:23:28 1997  William M. Perry  <address@hidden>
-
-* Synch'd up to Widget 1.9929
-
-* w3-mouse.el: Deal with InfoDock button bindings - we don't need to bind
-  _anything_ since hyperbole knows all about hyperlinks and stuff.
-
-* w3-menu.el (w3-menu-install-menubar): Deal with InfoDock way of
-  specifying mode menubars.
-
-* w3-toolbar.el (w3-add-toolbar-to-buffer): Don't install the toolbar
-  under InfoDock - it uses different toolbars than straight XEmacs.
-
-* w3-mouse.el: Don't bind shift-button2 - this is reserved for hyperbole.
-  This is now on meta.
-
-1997-06-19  William M. Perry  <address@hidden>
-
-* w3.el (w3-map-links): Deal with new keywords.
-
-* w3-menu.el (w3-menu-links-constructor): Deal with new keywords on
-  links/images.
-  (w3-popup-menu): Ditto.
-
-* w3-display.el (w3-widget-echo): Deal with new keywords we use on widgets.
-  (w3-follow-hyperlink): Ditto.
-  (w3-balloon-help-callback): Ditto.
-  (w3-maybe-start-image-download): Ditto.
-  (w3-handle-image): Use new keywords.
-  (w3-display-convert-arglist): New function to convert an assoc list into 
-  a property list with real CL-style keywords.
-  (w3-display-node): Use it when building a hyperlink.
-  (w3-resurrect-hyperlinks): Now uses widget-convert-text instead of nasty 
-  knowledge of internals of the widget library.
-
-Tue Jun 17 21:45:06 1997  William M. Perry  <address@hidden>
-
-* custom-check: Was misusing 'tr'
-
-Sun Jun 15 22:17:01 1997  William M. Perry  <address@hidden>
-
-* Synch'd up to custom 1.9920
-
-Sat Jun 14 15:37:09 1997  William M. Perry  <address@hidden>
-
-* Synch'd up to custom 1.9918 - now distribute all of custom, just to be
-  anal.
-
-* w3-display.el (w3-display-line-break): Ebola vaccination
-  (w3-maybe-start-background-image-download): Don't try to load background
-  images in Emacs 19 or on a TTY.
-  (w3-display-node): Keep track of the active face of a hyperlink.  Need
-  to make the widget library smarter about this.
-
-Fri Jun 13 22:16:59 1997  William M. Perry  <address@hidden>
-
-* w3-parse.el:  Some stupid sites put meta tags in the middle of their
-  documents.  Sigh. Allow it, but bitch and moan.
-
-* Added custom library to the distribution.
-
-1997-06-11  William M. Perry  <address@hidden>
-
-* w3-parse.el : Allow <meta> tags in %body.content for stupid cnn.com
-  site.
-
-* Emacs/W3 3.0.87 released.
-
-* Synched up to Widget 1.9907 - you must be running this version for most
-  things to work.  Make sure you are not picking up a widget library from
-  gnus or something like that before the one in the w3 directory.
-
-* w3-display.el (w3-maybe-start-background-image-download): New function
-  that takes a URL and a face and does its best to set the background
-  pixmap of that face to the image pointed to by the URL.
-  (w3-display-node): Implemented 'background' property on 'body' or 'html' 
-  tags.
-  (w3-finalize-image-download): Changed a fair bit - shared between normal 
-  image downloads and background image downloads.
-  (w3-display-node): w3-user-colors-take-precedence now controls whether
-  background faces are retrieved or not.
-  (w3-face-for-element): Stylesheets use of background-image should almost 
-  work now.
-  (w3-display-node): Stylesheets use of background-image should work
-  completely now.
-
-Tue Jun 10 07:24:09 1997  William M. Perry  <address@hidden>
-
-* w3.el (w3-only-links): This will now use w3-map-links
-  (w3-mode): Dont' set inhibit-read-only, ever.
-  (w3-mode): back to using widget-minor-mode, since inheriting the keymap
-  doesn't seem to do much good.
-
-* w3-vars.el: Don't bind anything to widget-button-press, let
-  widget-minor-mode do that.
-
-* w3.el (w3-map-links): Revamped this to work with the new way widget is
-  using overlays instead of text properties.
-  (w3-mode): Use widget-minor-mode instead of binding a lot of
-  navigational commands ourselves.
-
-* w3-display.el: Make sure we don't try to redefine the w3-dingbats
-  character set when loading this file more than once.
-  (w3-display-node): Rearranged some of the insert-before handling so that 
-  any text inserted does _not_ have the properties of the tag on it
-  (colors on hyperlinks won't bleed anymore)
-  (w3-resurrect-hyperlinks): New semi-working way of resurrecting
-  hyperlinks
-
-Mon Jun  9 22:53:14 1997  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-display-node): Protect against stylesheet specified
-  widths on horizontal rules.
-
-Mon Jun  9 22:42:26 1997  Istvan Marko <address@hidden>
-
-* w3-hot.el (w3-hotlist-apropos): Let this work when reuse-buffers != no
-
-Mon Jun  9 22:35:04 1997  Dieter Maurer <address@hidden>
-
-* mm.el (mm-decode-quoted-printable): Fix for some multipart attachments
-  showing up empty due to badness in mm-decode-quoted-printable and
-  'ignore' not moving to the end of the region just decoded.
-
-Mon Jun  9 22:35:04 1997  William M. Perry  <address@hidden>
-
-* w3-parse.el (w3-parse-buffer): Call w3-do-setup to make sure our
-  hashtables and things are set up correctly or gnus can choke big time.
-
-Mon Jun  9 22:26:29 1997  Michael Ernst <address@hidden>
-
-* url.el (url-get-url-filename-chars): Fixed problem with bad use of a
-  hyphen in the regexp.  Would cause problems when invoking
-  url-get-url-at-point when point was in front of a hyphen.
-
-1997-05-28  William M. Perry  <address@hidden>
-
-* w3-cus.el: Use a :prefix on most of the groups to make the options look
-  nicer.
-
-Thu May 15 05:06:30 1997  William M. Perry  <address@hidden>
-
-* w3-sysdp.el: removed bogus definition of buffer-substring-no-properties
-  - will now use the more correct one that was already there.
-
-* w3-display.el (w3-pause): Now has its own mini-event loop to pass off
-  scrolling commands, etc.  Keeps buffer position constant while doing
-  incremental display.
-
-Mon May 12 08:13:27 1997  William M. Perry  <address@hidden>
-
-* w3.el (w3-view-this-url): Check the parent widget for an href if you
-  don't find one right away.  This means that all commands that act on the
-  URL at point will now work on image widgets, etc. that are hyperlinks.
-
-Sat May 10 14:37:25 1997  William M. Perry  <address@hidden>
-
-* css.el (css-parse): Deal better with newline-challenged stylesheets
-  (css-parse): Don't be so aggressive in finding block data for @xyzzy
-  directives.
-
-* mm.el (mm-viewer-passes-test): Always run the tests in the users home
-  directory.
-
-* w3-mouse.el: Use down-mouse-N in Emacs 19, to be more consistent with
-  how the XEmacs keybindings work.
-
-Fri May  9 11:32:46 1997  William M. Perry  <address@hidden>
-
-* w3.el (w3-document-information): some formatting changes
-
-Thu May  8 14:06:40 1997  William M. Perry  <address@hidden>
-
-* Emacs/W3 3.0.86 released
-
-* mule-sysdp.el (mule-code-convert-region): Try to deal gracefully with
-  the recent XEmacs 20.0 -> 20.2 renaming of the autodetect coding system
-  to automatic-conversion
-
-* w3-sysdp.el (event-point): New stub.
-
-* url-cookie.el (url-cookie-handle-set-cookie): Don't use the 'warn'
-  facility for bad cookie 'set' commands, was too annoying.
-
-* w3.el (w3-save-as): Make sure to require ps-print before trying to
-  save/mail a document as postscript.  The local binding of
-  ps-spool-buffer-name was causing the defvar not to happen, and you would 
-  get errors when trying to kill emacs later.  Ugh.
-  (w3-document-information): Make sure to escape entities for meta and
-  other info we throw in.
-
-* url-file.el (url-file): ftp/file retrieval can now be asynchronous
-  through the magic of [ange-ftp|efs]-copy-file-internal
-
-* url.el (url-sentinel): Allow a buffer as the first argument to
-  the sentinel function.
-  (url-retrieve-internally): Allow asynch ftp transfers
-
-* url-file.el (url-file): Asynchronous ftp downloads work now.
-
-* w3.el (w3-download-url): Made this function interactive.
-
-Mon Apr 28 13:31:36 1997  William M. Perry  <address@hidden>
-
-* w3.el (w3-download-url-at-point): new function to download document
-  under point.
-  (w3-download-this-url): new function to download current document.
-
-* w3-vars.el (w3-mode-map): Added 'D' and 'd' bindings for starting
-  document downloads.
-
-Thu Apr 24 08:29:34 1997  William M. Perry  <address@hidden>
-
-* Emacs/W3 3.0.85 released
-
-* w3-display.el (w3-display-table-dimensions): Deal with
-  colgroup/thead/tfoot/col better.  Before was ignoring the rest of the
-  table.  ack.
-  (w3-display-table): ditto
-
-* w3-prefs.el (w3-preferences-restore-variables): Slap things into
-  custom-land where they belong.
-
-* A few customization tweaks.
-
-Wed Apr 23 21:44:59 1997  <address@hidden>
-
-* w3-e19.el (w3-store-in-clipboard): Make this work under OS/2
-
-Tue Apr 22 07:23:51 1997  William M. Perry  <address@hidden>
-
-* devices.el: Removed defsubsts so that we should be able to share .elc
-  files again between emacs and XEmacs.
-
-* font.el: Added in code to make a face blink.  Causes lots of screen
-  flicker under Emacs 19 though, so it is turned off by default.  Turn it
-  on with ESC-: (font-blink-initialize) - should be able to optimize when
-  the callback actually does anything based on what fonts are visible in
-  the visible buffers.
-  (font-face-visible-in-window-p): New function to tell if a face is
-  visible in a buffer window.
-  (font-map-windows): New function to map a function over all visible
-  windows.
-  (font-blink-callback): Use them to optimize so that invert-face is not
-  called unless absolutely necessary.
-
-Mon Apr 21 08:58:02 1997  William M. Perry  <address@hidden>
-
-* w3-e19.el: Added in compile-time require of w3-props so that pages with
-  backgrounds don't puke and die.
-
-* w3.el (w3-find-default-stylesheets): Don't load a user's personal
-  stylesheet if we started up in '-q' mode.
-
-* Emacs/W3 3.0.84 released
-
-* w3-display.el: When using XEmacs 20.x w/mule support, we now define our
-  own special character set.  This means that the table border chars work
-  again in XEmacs/mule
-
-* devices.el: Added magic to not optimize this file under XEmacs - its not 
-  actually used, so no damage.  It wouldn't compile under XEmacs because
-  it has subrs for all these, and our declaring them as defsubsts
-  thoroughly confuses the byte-compiler.
-
-Sun Apr 20 12:19:56 1997  William M. Perry  <address@hidden>
-
-* w3-sysdp.el: Moved device stuf out into its own devices.el file so that
-  it can be correctly byte-compiled.
-  Ditto for the text properties stuff (into w3-props.el)
-
-Fri Apr 18 13:09:31 1997  William M. Perry  <address@hidden>
-
-* Emacs/W3 3.0.83 released
-
-* Synch'd up to Widget 1.89
-
-Thu Apr 17 06:20:56 1997  "T. V. Raman" <address@hidden>
-
-* default.css (pre/xmp/plaintext/key/code/tt): Changes to default
-  stylesheet for spoken output of normally `monospaced' text.
-
-Tue Apr 15 16:28:11 1997  William M. Perry  <address@hidden>
-
-* w3.el (w3-find-specific-link): Don't signal an error in a target anchor
-  (#foo) is not found.
-
-Tue Apr 15 08:22:37 1997  John Palmieri <address@hidden>
-
-* w3.el (w3-complete-link): protect against errors when hitting return
-  when point isn't on a link
-
-Mon Apr 14 16:18:43 1997  William M. Perry  <address@hidden>
-
-* mm.el (mm-parse-mailcaps): Moved ~/.mailcap to the front of the list so
-  that it gets parsed last, and has the highest priority.
-
-Sun Apr 13 20:28:30 1997  William M. Perry  <address@hidden>
-
-* w3.el (w3-complete-link): now correctly defaults to following the link
-  at point.
-
-Sat Apr 12 19:35:26 1997  William M. Perry  <address@hidden>
-
-* w3-speak.el: use widget-at instead of emacspeak-widget-at
-
-Fri Apr 11 07:39:26 1997  William M. Perry  <address@hidden>
-
-* w3-menu.el (w3-menu-edit-menu): Addded a preferences submenu with all
-  the W3 & URL customization items underneat it.
-
-* css.el (css-split-font-shorthand): Handle bad lists better
-
-* Emacs/W3 3.0.82 released
-
-* Synch'd up with Widget 1.78
-
-* w3-display.el (w3-get-face-info): Don't look for face attributes on tags
-  unless w3-user-colors-take-precedence is nil
-  (w3-display-node): Don't honor face attributes on <body> tag unless
-  w3-user-colors-take-precedence is nil
-
-* url-vars.el: Modified a few customizations to make them prettier
-
-* url-cache.el (url-cache-creation-function): Modified customization
-
-Fri Apr 11 07:03:20 1997  Hrvoje Niksic <address@hidden>
-
-* url-cache.el, url-gw.el, url-cookie.el, url-irc.el, url-vars.el, url.el:
-  All URL related variables are now customizable.
-
-Wed Apr  9 16:46:52 1997  William M. Perry  <address@hidden>
-
-* Emacs/W3 3.0.81 released
-
-* w3-xemac.el (w3-text-pixel-width): And a XEmacs specific version of it.
-
-* w3-e19.el (w3-text-pixel-width): New function to return the pixel width
-  of a piece of text.
-
-* url.el (url-handle-no-scheme): Use it.
-
-* url-vars.el (url-handle-no-scheme-hook): New hook that should expand a
-  partial url like 'gnu' to a full URL, like 'http://www.gnu.org/'.
-
-* w3-sysdp.el (run-hook-with-args-until-success): Added a stub for
-  run-hook-with-args-until-success
-
-Tue Apr  8 12:20:39 1997  William M. Perry  <address@hidden>
-
-* w3-auto.el: Added autoloads for all the functions in url-ns for proxy
-  functions, and url-mail
-
-* url-ns.el (isPlainHostName): Fixed isPlainHostName
-
-* w3-parse.el (w3-parse-buffer): now throws up a bad style warning for
-  images without ALT attributes.
-
-* mm.el (mm-parse-mailcaps): Reverse the ':|;' separated path for MAILCAPS
-  so that earlier items take precedence, like standard unix PATH-like
-  variables do.
-  (mm-parse-mimetypes): Ditto for MIMETYPES
-
-Mon Apr  7 06:23:11 1997  William M. Perry  <address@hidden>
-
-* Emacs/W3 3.0.80 released
-
-* w3-parse.el: Some more transitions - don't imply <p> after some form
-  tags.
-
-* url-misc.el (url-finger): Ditto
-
-* url-http.el (url-http): Ditto
-
-* url-gopher.el (url-gopher-retrieve): Put in a process-sentinel of
-  'ignore so that stupid 'process xxx exited with code nnn' messages are
-  not shown.
-
-* url.el (url-sentinel): Ditto
-
-* w3.el (w3-sentinel): remove call to url-clean-text - no longer needed
-
-Mon Apr  7 02:57:19 1997  Greg Stark  <address@hidden>
-
-* url.el (url-sentinel): once and for all eliminate the "first character
-  goes to wrong buffer" bug through brute force by setting the current
-  buffer to the buffer of the selected window at the end of a sentinel.
-
-* w3.el (w3-viewer-sentinel): ditto
-
-* w3-widget.el (widget-image-value-create): set tab-order to -1 on the
-  choice-items of client-side imagemaps to avoid having tab stop on them
-  three times, (it still stops on them twice) 
-
-* Makefile: add "make fast" rule to not run a bazillion emacsen
-
-* FAQ: typos
-
-* docomp.el: try setting byte-compile-dynamic to t to reduce memory usage
-
-Fri Apr  4 06:23:31 1997  William M. Perry  <address@hidden>
-
-* url-file.el (url-format-directory): Use insert-file-contents instead of
-  -literally, so that ftp index files will work.
-
-* w3-emulate.el: lots of new commands to spoof the user-agent string.  See
-  turn-[on|off]-[lynx|netscape|ie|arena]-masquerade-mode functions.
-
-Thu Apr  3 07:22:27 1997  William M. Perry  <address@hidden>
-
-* Emacs/W3 3.0.79 released
-
-* w3-parse.el: Put in <p> as part of the content-model of <ul/ol> so that
-  <p> at the front of a list doesn't cause a bogus list item to be shown.
-
-* url-http.el (url-parse-mime-headers): Make proxy authentication sort of
-  work again.
-
-* w3-display.el (w3-setup-terminal-chars): Check to see whether face is
-  actually different before trying to set its font to a terminal one.
-
-* url.el (url-buffer-visiting): Better matching of URLs - it was taking
-  the target into account - bad bad bad.
-
-Wed Apr  2 18:05:11 1997  William M. Perry  <address@hidden>
-
-* w3-forms.el (w3-form-add-element): New way to do hidden form
-  fields that retains the order information - damned idiots out there rely
-  on ordering.  !#%!@
-
-* w3.el (w3-fetch): Put some of the logic about _blank/_top frame targets
-  into w3-fetch
-
-* w3-display.el (w3-get-all-face-info): Added in support for the 'face'
-  attribute to specify font-family
-
-Wed Apr  2 13:08:36 1997  Frederic Lepied <address@hidden>
-
-* w3-print.el (w3-print-this-url): Need to run LaTeX to get the indices
-  right.
-
-Tue Apr  1 11:20:54 1997  William M. Perry  <address@hidden>
-
-* Emacs/W3 3.0.78 released
-
-* css.el (css-color-light-p): New function
-  (css-active-device-types): Use it to add a 'dark' or 'light' property to
-  the active device types as necessary
-
-Mon Mar 31 09:07:13 1997  William M. Perry  <address@hidden>
-
-* w3-parse.el: More error transitions for tables (push tr before td/th
-  just after a table)
-
-* w3-display.el (w3-display-node): Use it for body/html attribute handling
-  (w3-fix-color): New function to make sure we don't pass hex values without
-  "#" in front of them.
-
-Sun Mar 30 15:00:59 1997  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-display-node): Now honors alink/vlink/link attributes
-  on the body tag.
-  (w3-fixup-eol-faces): Fixed nuking of faces at end of line to deal with
-  bad underlining behaviour of Emacs 19.
-
-Sun Mar 30 14:28:32 1997  Greg Stark <address@hidden>
-
-* w3-e19.el (w3-mode-version-specifics): Fixed buffer read-only errors
-  when trying to set a background face.
-
-Fri Mar 28 10:41:43 1997  William M. Perry  <address@hidden>
-
-* Emacs/W3 3.0.77 released
-
-* w3-display.el (w3-display-table): Face properties specified on the
-  'table' element now propogate to table cells correctly.
-
-Fri Mar 28 07:53:48 1997  Greg Stark <address@hidden>
-
-* w3-forms.el: Make sure we set the button-face on all widgets
-
-Fri Mar 28 07:53:48 1997  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-frames): Use make-frame, not make-frame-command, so it
-  will work on XEmacs.
-
-* w3-e19.el (w3-mode-version-specifics): Now honors background/foreground
-  color requests in Emacs19 by coloring in the whole buffer.  Oh how I
-  wish Emacs 19 had buffer-local faces.
-
-* w3-display.el (w3-display-table): Tables now look better under Emacs 19
-
-Thu Mar 27 08:05:34 1997  William M. Perry  <address@hidden>
-
-* font.el (font-x-registry-and-encoding-regexp): got rid of compile
-  warning under Emacs 19
-
-* w3-display.el (w3-display-handle-list-type): manually remove faces on
-  bullet/list items
-  (w3-display-node): We were being a bit rude to inhibit-read-only -
-  sometimes would leave it 't', which is bad bad bad, some might even say
-  pure evil.
-
-* Emacs-W3 3.0.76 released
-
-* Synch'd up to Widget 1.68
-
-* w3-display.el (w3-display-node): Handles 'text' attribute correctly now
-  to set the default foreground when requested.
-
-* mm.el (mm-play-sound-file): Fixed it for new mule stuff
-
-* url-gw.el (url-gateway-nslookup-host): Added autoload for
-  gateway-nslookup-host
-
-* w3-display.el (w3-display-table): Expand each line of a table cell out
-  to the border, so that we get nicely colors backgrounds for table cells
-  now.
-
-* font.el (font-x-registry-and-encoding-regexp): New variable to match the
-  registry and encoding of a font name under X
-  (x-font-create-object): Use it to set the default registry and encoding
-  for font objects we create from font names.
-  (x-font-create-name): Grab the registry and encoding from the default
-  object for this device before defaulting back to '*'
-
-* w3-display.el (w3-setup-terminal-chars): Explicitly specify wildcard
-  registry and encoding for the table-hack-x-face, to deal with changes in
-  the font library.
-
-Wed Mar 26 06:23:51 1997  William M. Perry  <address@hidden>
-
-* custom-check: Should work better now, and spit out better instructions
-  for rebuilding correctly.
-
-* Emacs-W3 3.0.75 released
-
-* url.el (url-clean-text): Better matching of bogus process exited
-  messages.
-
-* font.el (font-rgb-color-p): No longer match "^#xxyyzz" as an rgb-color,
-  this screwed up bigtime in font-color-rgb-components.
-  (font-set-face-foreground): Do the test here instead.
-  (font-set-face-background): and here.
-
-* w3-widget.el (widget-image-value-create): For client side imagemaps,
-  make sure case-fold-search or :ignore-case is specified.
-
-* url-gw.el (url-gateway-nslookup-program): Default to using 'nslookup' as
-  url-gateway-nslookup-program
-
-Tue Mar 25 16:06:28 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.74 released
-
-Tue Mar 25 15:31:56 1997  Greg Stark <address@hidden>
-
-* url-cookie.el (url-cookie-handle-set-cookie): don't deal with address@hidden
-  microsoft web site cookies - they break good, clean, wholesome sites
-  like yahoo's stock pages.
-
-* ssl.el (ssl-program-arguments): Make sure everything gets turned into a
-  string, not an integer.
-  (open-ssl-stream): use a pipe instead of a pty if possible (why?)
-
-* w3-display.el (w3-display-node): Added back in <keygen> support
-
-* w3.el (w3-notify-when-ready): protect against bad buffer switching
-  (minibuffer as active window lossage, etc)
-
-* w3-toolbar.el (w3-toolbar-make-buttons): Don't warn about toolbar
-  directory on Emacsen that can't do toolbars!
-
-Tue Mar 25 15:31:56 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.73 released
-
-* w3-display.el (w3-get-face-info): Allow passing in a second argument
-  that means 'check this attribute of the html tag if you don't find
-  something in the stylesheet'.  This automatically enables <font color>
-  and <table|td|tr bgcolor>.
-
-Tue Mar 25 06:45:02 1997  T. V. Raman <address@hidden>
-
-* w3-forms.el (w3-form-keymap): patch to avoid lossage with emacspeak &
-  using terminal.el
-
-Tue Mar 25 06:45:02 1997  William M. Perry  <address@hidden>
-
-* ssl.el (ssl-program-arguments): Removed -quiet switch, since it requires
-  patches to s_client
-
-Mon Mar 24 10:56:11 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.72 released
-
-* w3-display.el (w3-display-node): Better handling of body and html style
-  attributes in XEmacs
-
-* w3.el (w3-mode): Removed call to kill-all-local-variables, as it
-  nukes buffer-local faces as well.
-
-* css.el (css-expand-length): Don't choke and use the wrong damn thing to
-  base percentages off of on percentage heights (ie: font-size: 80%)
-
-Mon Mar 24 07:12:52 1997  Gerry S Hayes <address@hidden>
-
-* url-gw.el (url-open-telnet): Fixed stupid typo into-to-string ->
-  int-to-string
-  (url-open-rlogin): Ditto.
-
-Sun Mar 23 09:43:24 1997  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-table-ascii-border-chars): Use a '+' in the ascii art
-  version of table borders.
-
-Sat Mar 22 00:45:34 1997  William M. Perry  <address@hidden>
-
-* w3-menu.el (w3-use-menus): Customized this variable
-
-* w3-display.el (w3-display-node): Don't run multiline text area's default
-  value through w3-normalize-spaces
-
-Thu Mar 20 23:44:50 1997  Greg Stark  <address@hidden>
-
-* w3-cus.el (w3-use-terminal-characters): New variable
-  (w3-use-terminal-characters-on-tty): New variable
-  (w3-use-terminal-glyphs): New variable
-  (w3-horizontal-rule-char): Make setting it to nil allow use of graphic
-  characters (also means people can avoid using graphic charactes for
-  horizontal rules if they wish)
-* w3-display.el (w3-handle-image): clean up whitespace in alt tags
-  (w3-table-glyph-border-chars): New variable
-  (w3-table-graphic-border-chars): New variable
-  (w3-terminal-properties): New variable
-  (w3-insert-terminal-char): New inline function
-  (w3-horizontal-rule-char): New inline function 
-  (w3-setup-terminal-chars): Set up all of these and make using graphic
-  characters work on XEmacs using text properties (and optionally use text
-  properties on FSF Emacs too). 
-  (w3-table-hack-borders): Remove, obsoleted by w3-setup-terminal-chars
-  (w3-table-unhack-borders): don't have to fiddle with
-  w3-horizontal-rule-char any more.
-  (w3-display-table): Use w3-insert-terminal-char
-  (w3-size-of-tree):  Use w3-horizontal-rule-char
-  (w3-display-node):  Use w3-horizontal-rule-char, w3-insert-terminal-char,
-  uhm, i'm not sure if it was correct to remove the handle-content
-* w3-forms.el (w3-fixup-eol-faces): try to remove mouse-face from end-of-lines 
as
-  well, uhm, this doesn't seem to work though. 
-  (w3-form-determine-size): add keygen 
-  (w3-form-encode-helper): add keygen support for the day when the ssl code
-  itself is released. 
-* w3-widget.el (widget-image-value-create): use 'item widgets instead of
-  'push-button widgets and specify the format ourselves so we don't get
-  widget.el's arbitrary formatting.
-* w3.el (w3-do-setup): call w3-setup-terminal-chars to make nice tables and
-  horizontal rules the default at least under X.
-* mm.el added x-x509-ca-cert and x-x509-user-cert viewers but the tests
-  will fail so no one should should see this change until i release the
-  functions.
-       
-Fri Mar 21 18:52:31 1997  William M. Perry  <address@hidden>
-
-* css.el (css-expand-length): Better support for percentage values in
-  lengths
-
-Thu Mar 20 06:22:29 1997  Istvan Marko <address@hidden>
-
-* Added slot for no_proxy settings under the preferences panel
-
-Thu Mar 20 06:22:29 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.71 released
-
-* w3-parse.el:Added more transitions for error handling of raw 'td' or
-  'th' outside of a 'tr' in tablebody.
-
-* url.el (url-default-callback): asynch downloads should now be cached
-
-* w3-script.el (w3-do-scripting): Customized, turned off by default
-
-Wed Mar 19 20:53:23 1997  Steven L Baur  <address@hidden>
-
-* Makefile (xemacs-w3): Special target for XEmacs Build.
-
-Wed Mar 19 05:56:56 1997  William M. Perry  <address@hidden>
-
-* font.el (x-font-families-for-device): Just in case
-  font-default-family-for-device fails under Emacs/NT, return "monospace"
-  at the front of the list.
-
-* url-vars.el (url-privacy-level): Now defaults to not sending your email
-  address in HTTP requests.
-
-Tue Mar 18 13:09:13 1997  William M. Perry  <address@hidden>
-
-* url-cookie.el (url-cookie-handle-set-cookie): Fixed variable typos -
-  doh.  Today just hasn't been my day.
-
-* Emacs-W3 3.0.70 released
-
-* We now pass all tests on the forms tester page
-  http://www.research.digital.com/nsl/formtest/home.html
-
-* w3-display.el (w3-display-node): Better handling of <select multiple>
-  and <select> in general.
-
-* w3-forms.el (w3-form-encode-xwfu): Encode : and / in xwfu, since the
-  form tester expects it.
-
-* url-cookie.el (url-cookie-trusted-urls): New variable - list of regexps
-  of URLs that you will accept cookies from without question.
-  (url-cookie-untrusted-urls): New variable - list of regexps of URLs that
-  you will _never_ accept cookies from.
-  (url-cookie-handle-set-cookie): Use them
-  (url-cookie-handle-set-cookie): When asking whether to allow a site to
-  set a cookie, show the cookies they are wanting to set.
-
-Tue Mar 18 06:47:46 1997  Thierry Emery <address@hidden>
-
-* w3-display.el: Latest round of patches for <frames> support.
-
-* w3-cus.el (w3-display-frames): can now have 4 values.
-       nil             no frame display whatsoever (currently the default)
-       'as-links       display frame hyperlinks, but do not fetch them
-       'ask            display frame hyperlinks and ask whether to fetch them
-       t               display frame hyperlinks and fetch them
-
-Tue Mar 18 06:47:46 1997  William M. Perry  <address@hidden>
-
-* w3-parse.el (w3-parse-buffer): Duh, don't do `=' comparison on results
-  of char-after, since it is nil at the end of the buffer.
-
-Mon Mar 17 08:44:46 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.69 released
-
-* w3-sysdp.el (buffer-substring-no-properties): Added stub
-
-* url-gopher.el (url-gopher-retrieve): Ditto.
-
-* url.el: Ditto
-
-* w3-parse.el: Removed all sorts of fun (following-char) commands that can
-  cause ebola warnings under XEmacs 20.x
-
-* w3.el (w3-popup-info): Default to the URL under point instead of the
-  documents URL
-
-* w3-auto.el: updated autoloads - made sure everything was interactive if
-  appropriate.
-
-* w3-menu.el (w3-popup-menu): If w3-popup-menu-on-mouse-3 is nil, call
-  whatever button3 is bound to in global-map
-
-* w3-display.el: Added XEmacs version of frame-char-height and
-  frame-char-width
-  (w3-frames): If w3-display-frames is non-nil, then do a refresh with it
-  bound locally, so everything should just work.
-
-* url.el (url-do-setup): Global history file now defaults to ~/.w3/history
-  (url-do-setup): Cookie storage now defaults to ~/.w3/cookies
-
-Mon Mar 17 06:51:07 1997  Paul Stodghill <address@hidden>
-
-* mm.el (mm-temporary-directory): Initialize variable from TMPDIR
-  environment variable
-
-Fri Mar 14 13:35:56 1997  William M. Perry  <address@hidden>
-
-* w3-forms.el (w3-form-create-custom): Fixed the 'custom' input type for
-  new filenames in the widget/custom package.
-
-* ssl.el (ssl-certificate-verification-depth): New variable to control how
-  far up a cert chain to look.
-  (ssl-view-certificate-program-name): New variable.
-  (ssl-view-certificate-program-arguments): New variable.
-  (ssl-certificate-directory-style): New variable.
-  (ssl-rehash-program-name): New variable.
-  (ssl-certificate-directory): New variable.
-  (ssl-program-arguments): Use some of them.
-  (ssl-accept-ca-certificate): Use the rest.
-
-* css.el (css-parse-args): Removed old code that could cause infinite loop
-  in stylesheet parsing on bad things like "foo=bar" instead of "foo:bar"
-
-* w3-cus.el: Added better groupings for the customization stuff.
-
-Thu Mar 13 19:54:50 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.68 released
-
-* w3-cus.el: Added customization support for Emacs-W3
-
-* w3.el (w3-mail-current-document): Use url-mail-command instead of
-  w3-mail-command
-
-Thu Mar 13 11:41:42 1997  Greg Stark  <address@hidden>
-
-* w3-prefs.el: Implemented privacy panel
-
-Wed Mar 12 10:25:38 1997  William M. Perry  <address@hidden>
-
-* w3-e19.el (w3-mode-version-specifics): Use the nasty crufty
-  buffer-access-fontify-functions to make sure that we never yank
-  read-only text out of the Emacs-W3 buffer.
-
-* Synch'd up to Widget 1.62
-
-Wed Mar 12 06:36:41 1997  Paul Stodghill <address@hidden>
-
-* base64.el (base64-decode-region): Fixed typo in calling
-  command-on-region.
-
-Tue Mar 11 07:03:48 1997  William M. Perry  <address@hidden>
-
-* w3-auto.el (w3-use-hotlist): Made autoload interactive
-
-* w3-widget.el (widget-image-value-create): Was a little too aggressive
-  about when to apply the -1 :tab-order property.  Now only images that
-  are not hyperlinks or imagemaps will not be tabbed to.
-
-* w3-prefs.el (w3-preferences-init-proxy-panel): Updated preferences panel
-  for new format of url-proxy-services
-
-* w3-vars.el (w3-hyperlink-menu): Fixed problem with calling wrong
-  bookmark function - would create a bookmark to the current document, not
-  the document under the mouse.
-  (w3-popup-menu): Added a few menu itmes (reload, show images, add bookmark)
-
-* w3-hot.el (w3-hotlist-add-document-at-point): Extract the title
-  correctly for the new widget implementation of hyperlinks.
-
-Mon Mar 10 06:31:48 1997  William M. Perry  <address@hidden>
-
-* w3-menu.el (w3-menu-options-menu): Fixed problem with XEmacs when
-  building without toolbars - would insert nil in the menu in a very wrong
-  place.
-
-* font.el (font-normalize-color): Under win32, make sure we define the
-  color before we try to use it, since Emacs doesn't support raw #RRGGBB
-  color specifications yet.
-  (font-rgb-color-p): make all #RRGGBB color specs go through
-  font-normalize-color
-
-* Emacs-W3 3.0.67 released
-
-Mon Mar 10 1997  Dave Love  <address@hidden>
-
-* w3.el (w3-do-setup): Make configuration file loading contingent
-  on init-file-user (i.e. suppressed with -q).
-
-Sun Mar  9 13:09:38 1997  William M. Perry  <address@hidden>
-
-* w3-widget.el (widget-image-value-create): Set :tab-order to -1 so the
-  latest widget library won't tab to image widgets.
-
-* w3.el (w3-mode): Make sure w3-mode-hook is run last, so that people can
-  turn off truncate-lines if they want.
-
-* ssl.el (open-ssl-stream): ssl-program-arguments is now dynamically
-  evaluated, similar to ps-lpr-switches.  The special symbols 'host' and
-  'port' are available, and bound to the hostname and port#/service we are
-  about to connect to.
-
-* w3-display.el (w3-finish-drawing): Remove all read-only properties on
-  text.
-
-* url-cache.el (url-cache-expired): fixed standalone mode
-
-Sat Mar  8 09:13:59 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.66 released.
-
-* url-cache.el (url-cache-prepare): Threw a condition-case around the
-  make-directory call, just in case we can't create the file for some
-  reason.  Also fixed bug where the file wouldn't be cached until the
-  second time you visited it.
-
-* url.el (url-retrieve-internally): Deal with https asynch
-
-* w3-xemac.el (w3-mode-version-specifics): Don't try to add the toolbar if
-  device-type == 'stream.
-
-* w3-vars.el (w3-temporary-directory): Ditto.
-
-* url-vars.el (url-temporary-directory): Initialize from TMPDIR
-  environment variable.
-
-* w3.el (w3-start-viewer): Ditto.
-
-* md5.el (md5): Ditto.
-
-* mm.el (mm-compose-type): Don't use hardcoded /bin/sh and -c - use
-  shell-file-name and shell-command-switch
-  (mm-viewer-passes-test): ditto.
-
-* w3-sysdp.el: Better device-* functions for Emacs-19 under win32 and OS/2
-
-* w3-display.el (w3-display-node): Better handling for <noframes> support.
-
-Fri Mar  7 06:13:20 1997  William M. Perry  <address@hidden>
-
-* w3-script.el (w3-script-evaluate-form): protect against bad input during
-  the read-from-string when parsing emacs-lisp scripts.
-
-* w3-auto.el (w3-preferences-edit): Make the autoload for this be
-  interactive so that the user can actually find it!
-
-* Emacs-W3 3.0.65 released.
-
-* w3.el (w3-document-information): Better handling of last-modified
-  findings.
-
-* w3-forms.el (w3-form-create-image): Try to use the value of an
-  image-input area as the label for the widget we create.
-
-* w3-elisp.el (w3-elisp-safe-eval): Throw a condition-case() around the
-  eval to catch bad forms, etc.
-
-* w3-script.el (w3-script-evaluate-form): Don't signal an error on unknown
-  scripting languages, just show a warning.
-
-Thu Mar  6 08:24:49 1997  William M. Perry  <address@hidden>
-
-* w3.el (w3-complete-link): Protect against malformed widgets (null :from
-  or :to).  Is this from delayed image widgets?
-
-* w3-vars.el (w3-mode-map): Changed binding of M-s to w3-save-as instead
-  of w3-search - does anybody use that instead of the forms interface?
-
-* w3.el (w3-document-information): Show document size
-
-* css.el (css-parse): Removed warning about old-style stuff for
-  device-dependent styles - was too annoying.  Need to just remove this
-  support totally for the 3.0 release.
-
-* w3.el (w3-internal-handle-preview): When previewing a buffer, remove all
-  text properties from the document source before doing anything.
-  (w3-mail-current-document): Bind case-fold-search when looking for where
-  to insert the <base> tag.
-  (w3-loaded-stylesheets): New variable to keep track of what stylesheets
-  were loaded at startup.
-
-* url-cache.el (url-cache-create-filename-human-readable): New function to
-  create cached filenames using the old method, that was slightly more
-  human readable.
-
-Wed Mar  5 15:38:00 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.64 released
-
-* w3-parse.el: OH god, finally got raw text inside a <tr> to push a <td>
-  onto the parse tree.  got raw text inside a <table> to push a <tr>
-  onto the parse tee.
-
-* w3-widget.el: Support 'target' in img widgets
-
-Tue Mar  4 07:55:56 1997  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-display-node): Support 'seqnum' attribute
-
-* w3.el (w3-mail-document-author): Fixed for new 'link' representation
-  (w3-document-information): If a document has a 'Last modified: blah' line,
-  use it as the last modified information as a last resort.
-
-* Synch'ed up with widget 1.50
-
-* w3-forms.el: Try to play nice with old and new versions of
-  widget-edit/wid-edit.el
-
-Tue Mar  4 06:23:41 1997  Michael Ernst <address@hidden>
-
-* url.el (url-get-url-at-point): If a possible URL starts with www., slap
-  on 'http://', as someone probably just forgot it.
-
-Tue Mar  4 06:23:41 1997  William M. Perry  <address@hidden>
-
-* w3-prefs.el (w3-preferences-hooks-variables): Removed some old variables.
-  (w3-preferences-edit): The preferences panel actually works again.  No
-  longer tries to use an imagemap - a dropdown is good enough dammit.
-
-* w3-vars.el: Removed some old variables
-
-* w3-display.el (w3-display-node): For <a> tags, do not embed a widget in
-  the buffer unless it actually has an 'href' attribute.  This helps a
-  _lot_ with <a name="blah">...</a> constructs.
-
-Tue Mar  4 06:18:06 1997  Toby Speight <address@hidden>
-
-* w3.el (w3-mail-current-document): Allow TM (if it's in use) to choose
-  the appropriate Transfer-Encoding of a mailed document.
-  (w3-mail-current-document): Try real hard to put <base> where it belongs
-  (in the <head>, if that is not found, then just after <html>, otherwise
-  just at the beginning of the document)
-
-Mon Mar  3 07:10:11 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.63 released
-
-* w3-forms.el (w3-form-field-label): Labels are now reimplemented for form
-  fields
-
-* w3-display.el (w3-parse-link): Now honors the old variable
-  w3-honor-stylesheets, which hadn't made it back onto the reimplemented
-  features list yet.
-
-* font.el: Added quite a few autoloads.  Package no longer overwrites the
-  set-face-* functions, as this was deemed evil in the extreme.
-
-* w3-display.el (w3-face-for-element): Use the font-set-face-* functions
-  instead of the raw set-face-* functions.
-
-* w3-widget.el (widget-image-inaudible-p): New variable that controls
-  whether image widgets are rendered inaudible by emacspeak or not.
-  (widget-image-value-set): Use it.
-
-* url-cache.el (url-cache-directory): New variable that controls where you
-  cache files will be stored.  Defaults to "~/.w3/cache"
-  (url-cache-creation-function): New variable that controls what function
-  will be used to create cached filenames.
-  (url-cache-create-filename-using-md5): This is now the default (and
-  only) cache-file-creation function.  Suitably fast under Emacs 19 (lisp
-  implementation), _very_ fast under XEmacs, where it is written in C.
-
-Thu Feb 27 07:27:43 1997  William M. Perry  <address@hidden>
-
-* w3-sysdp.el: Added alias of make-symbolic-link to copy-file for NTEmacs
-
-* w3-elisp.el: Removed face functions from the safe list.
-
-Wed Feb 26 16:08:08 1997  Per Abrahamsen  <address@hidden>
-
-* font.el (font-create-object): Added autoload.
-
-Wed Feb 26 08:17:37 1997  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-region): Fixed typo when binding
-  w3-display-same-buffer - no wonder it wasn't working right.
-
-* images.el (image-normalize): Bind file-coding-system to the appropriate
-  no-conversion so that running subprocesses doesn't munge the data when
-  running under MULE.
-  (image-normalize): Now uses call-process-region instead of
-  shell-command-on-region, and removed the explicit mention of '/bin/sh'
-  and friends.  Uses the ability of call-process-region to specify a
-  separate file to use for stderr - yipeee.
-
-* url.el (url-setup-privacy-info): Slight change as to how url-system-type
-  and url-os-type are set up.  No longer uses nested parens, as this seems
-  to confuse some sites that try to use the User-Agent header as a
-  state-tracker.
-
-Mon Feb 24 10:15:45 1997  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-widget-echo): Make sure that nothing that will be
-  echoed is the empty string.
-
-Sun Feb 23 08:34:18 1997  William M. Perry  <address@hidden>
-
-* url-cache.el (url-store-in-cache): fixed stupid bug in caching logic
-
-Sat Feb 22 07:21:29 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.62 released
-
-Thu Feb 20 13:40:22 1997  William M. Perry  <address@hidden>
-
-* w3-forms.el (w3-form-summarize-password): By default, don't summarize
-  password entry boxes.
-
-Thu Feb 20 07:33:59 1997  Thierry Emery <address@hidden>
-
-* w3-display.el (w3-frames): Better support for Frames
-
-Thu Feb 20 07:33:59 1997  William M. Perry  <address@hidden>
-
-* w3.el (w3-complete-link): Fixed bug in using try-completion to make sure
-  we have a match before passing a URL off to w3-fetch.
-
-* Synch'd up to widget 1.44
-
-* url.el (url-default-callback): Caching works in asynch mode now.
-
-Wed Feb 19 05:48:40 1997  William M. Perry  <address@hidden>
-
-* css.el (css-split-font-shorthand): Make sure that the subelements of the
-  'font' shorthand property get run through the property value-expansion
-  routines before getting returned.  This royally screwed up font-family,
-  font-weight, and friends.
-  (css-expand-color):  Now recognizes 'transparent' and 'none' as special
-  color names.
-  (css-expand-value): When dealing with color-shorthand, make sure
-  everything gets run through the value-expansion routines as well.  Ack.
-
-* w3-elisp.el (w3-elisp-safe-function): You can now supply a validation
-  function for the arguments of a script-enabled function, its no longer a
-  binary operation on just the function name.  You can also give it a
-  variable name, and the value of that variable at the time of execution
-  is what controls whether it is safe or not.
-
-* w3.el (w3-download-url): Finally fixed bug where w3-download-url would
-  not save in the correct directory if you just accepted the default
-  pathname it offered.
-
-* url-cache.el (url-cache-ignored-protocols): New variable controlling
-  what protocols we should never cache to disk.
-  (url-cache-cachable-p): use it.
-
-* w3.txi: Updated all nodes and menus, a few stylistic changes
-
-* w3-elisp.el: Added read-access to devices, frames, windows, buffers, and
-  property-lists.  Also added function, lambda, point, and list accessors
-  (member, memq, assoc)
-
-* w3-display.el (w3-display-node): Bind widget-push-button-gui to nil in
-  w3-display-node so that images don't run into the
-  visible-portion-of-buffer-is-not-modifiable-bug.  Ick.
-
-* w3-elisp.el: Don't allow access to 'set'-type text-property functions
-  from scripts.
-
-Tue Feb 18 15:11:08 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.61 released
-
-* w3.txi (Supported URLs): added sections on each protocol supported -
-  needs lots of fleshing out.
-
-* url-misc.el (url-info): Info URL loader now unhex's the target, so that
-  you can have something like info:w3.info#Getting%20Started
-
-* url.el (url-do-setup): Removed secure-http (SHTTP) handler - who the
-  hell cares anymore, it lost.
-
-* w3-display.el (w3-display-node): Correctly calculates right margin as
-  documented (from window-width and right-margin)
-
-* w3.el: Removed w3-batch-fetch
-
-* url-vars.el: Removed lots of old variables
-
-* url-misc.el: Removed x-exec URL handler - no interest anymore.
-
-* w3-script.el (w3-script-evaluate-form): Use it.
-(w3-do-scripting): New variable to control whether to do _any_ scripting
-or not.
-
-* The URL package now stores the current parsed URL object instead of 5 or
-  6 separate variables.
-
-* dist.Makefile: Removed old pgp and wais support, it was gross and
-  apparently nobody was using it.
-
-Tue Feb 18 06:13:03 1997  "T. V. Raman" <address@hidden>
-
-* w3-forms.el (w3-form-summarize-radio-button): Better radio button
-  summarizer.
-
-Tue Feb 18 06:13:03 1997  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-finish-drawing): Moved #blah target finding in here,
-  where it belongs.
-
-* w3-vars.el (w3-mode-map): Added binding for raw '\t' instead of relying
-  on [tab].  Apparently this keysym isn't aliased under Emacs 19 on a
-  TTY.
-
-Mon Feb 17 15:10:38 1997  William M. Perry  <address@hidden>
-
-* w3-elisp.el: Interface to Emacs-Lisp for safe scripting.
-
-* w3-script.el: Basic client-side scripting has been implemented.
-
-* w3-xemac.el (w3-mouse-handler): Ditto
-
-* w3-e19.el (w3-mouse-handler): Plugged in handling of the onMouseOver event
-
-* w3-display.el (w3-handle-string-content): Now adds a text property that
-  contains w3-display-open-element-stack, so that from anywhere in the
-  buffer you can find out where you are in the parse tree.
-
-* default.css (input): ome default stylesheet updates for input fields on
-  TTYs
-
-Sun Feb 16 09:01:18 1997  Shuji Narazaki <address@hidden>
-
-* mule-sysdp.el: Updated for mule 3.0
-
-Sat Feb 15 15:35:15 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.60 released
-
-* w3-display.el (w3-display-node): use it.
-
-* w3-vars.el (w3-display-frames): New variable for whether to show 'frame'
-  documents as a list of the subelements.
-
-* w3.txi (Speech Properties): finished this chapter.
-(Media Selection): ditto
-(Time Units): ditto
-(Angle Units): ditto
-(Properties): Explanatory text at beginnign of section
-
-Fri Feb 14 09:34:35 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.59 released
-
-* w3.txi: Lots of documentation about stylesheets, chapter layout
-  changes.
-
-Thu Feb 13 07:01:59 1997  William M. Perry  <address@hidden>
-
-* Synch'd up to widget 1.38
-
-* w3-forms.el (w3-form-resurrect-widgets): For now, don't use the nice new
-  GUI pushbuttons - they appear to suffer badly on long lines.
-
-* w3-mouse.el (w3-running-FSF19): Use new w3-popup-menu-on-mouse-3 variable
-
-* w3-vars.el: Removed _lots_ of obsolete variables
-(w3-popup-menu-on-mouse-3): New variable to control whether W3 should
-  override mouse-3 or not.
-
-* Emacs-W3 3.0.58 released
-
-* w3.txi: Added stubs for stylesheet chapters and supported URLs
-
-* images.el (image-register-netpbm-utilities): This is now safe to call
-  multiple times again.
-
-Wed Feb 12 06:26:55 1997  William M. Perry  <address@hidden>
-
-* w3-forms.el (w3-form-keymap): When binding widget-end-of-line, make sure
-  that we do not overwrite Emacspeak's prefix-key.  Now does a
-  where-is-internal to find the correct binding in global-map to
-  override.
-
-* w3-display.el (w3-display-node): bind :emacspeak-help to 'w3-widget-echo
-  in all the hypertext links.
-
-* w3-vars.el (w3-mode-map): New binding for \M-\t - this _should_ have
-  been taken care of by the [(meta tab)] definition, but evidently it
-  doesn't.  *sigh*
-
-Tue Feb 11 07:33:50 1997  William M. Perry  <address@hidden>
-
-* w3-forms.el (w3-form-create-option-list): Specify :menu-tag-get so that
-  keyboard-based-completion doesn't get confused by the fact that some
-  items will have spaces slapped in at the end.
-
-* ssl.el (ssl-program-arguments): New variable - a list of command line
-  switches to send to the SSL program in a subprocess, before the hostname
-  and port number.
-  (open-ssl-stream): Use it.
-
-Mon Feb 10 07:45:31 1997  William M. Perry  <address@hidden>
-
-* url-file.el (url-file): Removed refs to variable url-use-hypertext-dired
-
-* url-vars.el: Removed obsolete variable url-use-hypertext-dired
-
-* url-file.el (url-dired-find-file-mouse): fixed bad typo of 
-  (interactive...) spec, added documentation to a few functions.
-  (url-file): Removed refs to obsolete variable url-use-hypertext-dired
-
-* w3-xemac.el (w3-setup-version-specifics): Workaround for users of XEmacs
-  19.14 or 20.0 with the bad bad bad lossage with text properties that
-  have null values.  This  bug is fixed in XEmacs 19.15, and will be in
-  20.1 as well.  This bug would cause you to get errors like:
-       internal error: no text-prop <#extent ....> start-open
-
-* w3.el (w3-widget-button-click): Deal with new image capabilities of the
-  widget checkbox/radio-button stuff.
-
-* Synch'ed up to widget 1.31
-
-Sun Feb  9 15:39:19 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.57 released
-
-* url-file.el (url-dired-minor-mode): New minor mode that overrides a few
-  of direds keybindings to use Emacs-W3 instead of straight find-file.
-  (url-format-directory): Now just uses dired to display directory
-  listings, much more powerful than the old way.  Can copy files, act on
-  multiple files, you all know the drill.
-
-* w3.txi: Added more chapters, reorg of others.
-
-* w3-display.el (w3-maybe-start-image-download): Fixed handling of bad
-  images in the cache again.  Duh.
-  No longer log to the warnings buffer if we fail to load an image.  Just
-  use message - much less intrusive.  We just usually don't care that much
-  about failed image loads.
-
-* url-gw.el (url-open-stream): fixed typo - was calling old
-  url-nslookup-host instead of url-gateway-nslookup-host
-
-* w3.el (w3-insert-formatted-url): Now inserts markup in lowercase.
-
-Sat Feb  8 13:54:43 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.56 released.  Getting closer!
-
-* w3-forms.el (w3-form-summarize-radio-button): Finally, a decent
-  summarization of radio buttons
-  Fixed typo in specifying summarizer for hidden form fields.
-  (w3-form-keymap): Bind C-a and C-e by default.
-
-* w3-widget.el (widget-image-value-create): When using emacspeak, show
-  client side imagemaps as a table.  Need a more general solution for
-  this, but this makes us nicer than IE again. :)
-
-* Updated to widget 1.30
-
-Fri Feb  7 16:49:55 1997  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-handle-string-content): Make sure faces text
-  properties are closed, so that things don't bleed over.
-  (w3-fixup-eol-faces): New function for Emacs 19 that removes face
-  information at newlines, so that underlining will not extend from the
-  end of a line to the window edges - very ugly.
-
-* w3-menu.el (w3-menu-initialize-w3-mode-menu-map): Don't support 'emacs
-  in w3-use-menus under Emacs in Windows 95/NT.
-
-* w3-display.el (w3-finalize-image-download): Deal with bad images better.
-  (w3-finish-drawing): Better protection of putting images in.
-
-* url-gw.el (url-open-stream): Don't auto-retry connections.  Don't throw
-  an error if you fail to connect to a site.  This is for image loadings
-  that fail for some reason or another.
-
-* css.el (css-expand-length): better handling of float values and 'ex'
-  unit type.
-
-* font.el (x-font-create-object): Unconditionally make case-fold-search
-  non-nil so that we don't lose big-time.  This was the cause of the very
-  weird font-spatial-to-canonical lossage under XEmacs with font sizes of
-  something like '+12pt'
-
-* w3.el (w3-view-this-url): Use widget-echo-help if we didn't find a URL
-  under point.
-
-Fri Feb  7 15:22:25 1997  Charles Levert <address@hidden>
-
-* w3-widget.el (widget-image-notify): Bad data being fed to w3-fetch if a
-  client-side imagemap had an alt attribute (but only if the <map> came
-  _after_ the use.
-
-Fri Feb  7 15:22:25 1997  William M. Perry  <address@hidden>
-
-* font.el (font-spatial-to-canonical): protect against bad input to this
-  function.
-
-Fri Feb  7 15:19:36 1997  Toby Speight <address@hidden>
-
-* w3-parse.el (w3-parse-buffer): Parser didn't allow for the fact that
-  TAGC is optional on end-tags as well as on start-tags (i.e. "<b<i>
-  bold-italic</i</b>" is legal).
-
-Fri Feb  7 06:28:37 1997  William M. Perry  <address@hidden>
-
-* w3-forms.el (w3-form-keymap): Now inherits from widget-keymap, with a
-  few exceptions.
-
-* url.el (url-uncompress): This function now no longer looks at the file
-  extension to determine a compression/encoding method.  This is so that
-  doing searches on `foo.tar.gz' will not bogusly cause the decompression
-  steps to run.  Ick!
-
-* url-file.el (url-insert-possibly-compressed-file): This function no
-  longer atempts to decompress the file after loading it in.  Instead, it
-  sets an appropriate content-transfer-encoding header based on the
-  filename, so that this will allow url-uncompress to work correctly on the
-  buffer.
-
-Thu Feb  6 06:24:26 1997  William M. Perry  <address@hidden>
-
-* w3-print.el (w3-postscript-print-function): New variable to control what
-  function is used to generate postscript output.
-  (w3-print-this-url): Use it.
-
-* w3-display.el (w3-handle-string-content): Make all inserted text
-  read-only
-
-* w3-forms.el (w3-form-use-old-style): New variable to control whether to
-  use the old-style interaction with form fields instead of the 'type
-  directly into the buffer' method
-  (w3-form-determine-size): Use it.
-  (w3-form-create-integer): Use it.
-  (w3-form-create-float): Use it.
-  (w3-form-create-text): Use it.
-  (w3-form-create-password): Use it.
-  (w3-revert-form): Fixed error with 'reset' buttons on forms that had
-  hidden form fields.
-
-* w3-vars.el (w3-mode-map): Define [backtab] by default
-
-* w3-display.el (w3-size-of-tree): Removed some warnings
-(w3-display-table-dimensions): ditto
-
-* Updated to widget 1.26
-
-* default.css: Some default formatting changes for input fields.
-  Everything is underlined by default except submit/reset/image/button
-  fields, so that they are a little easier to spot.
-
-* w3-parse.el (w3-parse-buffer): Now slaps pseudo-elements into input
-  fields so that stylesheets can access them.
-
-Wed Feb  5 14:42:12 1997  William M. Perry  <address@hidden>
-
-* Updated to widget 1.24
-
-* Happy birthday Jenny P.
-
-Tue Feb  4 08:21:03 1997  William M. Perry  <address@hidden>
-
-* font.el (x-font-create-name): Better checking/optimizing of when to just
-  return the default font.
-
-* w3-forms.el: Make use of the new information, and pass it down to the
-  widget library appropriately.
-
-* w3-display.el (w3-display-node): Now passes in the entire list of active
-  faces to form creation functions.
-
-Mon Feb  3 07:26:18 1997  William M. Perry  <address@hidden>
-
-* w3-emulate.el (w3-lynx-emulation-minor-mode-map): Lots of new
-  keybindings for lynx emulation minor mode.
-
-* Emacs-W3 3.0.55 released
-
-* w3-forms.el (w3-form-determine-size): Fixed _STUPID_ problem where
-  option lists would lose everything but the first option in them.  I'm a
-  dumbass.  Sort modifies its list parameter! ICK ICK ICK.
-
-* url.el (url-after-change-function): Show prettier status messages.
-  Sizes are converted to bytes, k, or M, depending on how big the file
-  is.
-
-* w3.txi: Lots of documentation changes - volunteers welcome.
-
-* Removed personal annotation support, since it wasn't shown with the new
-  display engine, it needs to be rethought, and nobody had complained in
-  the entire beta cycle.
-
-* w3.el (w3-history-find-url-internal): Redid the history mechanism.
-  Toolbar and menu entries are now grayed out appropriately.
-
-* url-http.el (url-create-mime-request): Fixed cookie support if not going
-  through a proxy gateway.
-
-Sun Feb  2 22:05:41 1997  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-display-table): Fix for negative colwidth
-
-Fri Jan 31 14:28:54 1997  William M. Perry  <address@hidden>
-
-* w3.el (w3-fetch): Fixed targetted links (http://blah/#foo)
-
-Fri Jan 31 11:20:47 1997  Alf-Ivar Holm <address@hidden>
-
-* w3.el (w3-mail-current-document): Fixed problem with calling
-  w3-parse-buffer with too many arguments when mailing LaTeX-ified
-  files.
-
-Fri Jan 31 11:19:37 1997  Cord Kielhorn <address@hidden>
-
-* css.el (css-expand-length): Fixed bad regexps for percentage and
-  character based lengths
-
-Thu Jan 30 20:27:06 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.52 released
-
-* w3-display.el (w3-handle-image): When doing table auto layout, don't
-  start loading the images.
-
-Wed Jan 29 06:15:37 1997  William M. Perry  <address@hidden>
-
-* font.el (x-font-create-name): Yet another fix for not screwing up the
-  line-height in Emacs 19.
-
-* w3-display.el (w3-face-for-element): Uhh, oblique seems to work.
-
-* font.el (set-font-style-by-keywords): now deals with arguments that
-  aren't lists, for the font-style and font-variant CSS stuff
-
-* w3-display.el (w3-display-node): Reimplemented <cookie> tag.
-(w3-display-node): Reimplemented <flame> tag.
-
-* url.el (url-insert-file-contents): url-insert-file-contents now
-  decodes/uncompresses the data before returning.
-
-* w3-display.el (w3-display-node): Reimplemented <pinhead> tag
-
-Tue Jan 28 06:22:08 1997  William M. Perry  <address@hidden>
-
-* font.el (x-font-create-name): Never take font size into account under
-  Emacs - too much chance of totally screwing up the users leading by
-  choosing a bigger font than their default.  This sucks.  But I can't
-  find a better solution.
-
-* w3.el: w3-mode now turns on truncate-lines by default.
-
-* w3-forms.el (w3-form-create-image): Better image input type support.
-
-Mon Jan 27 08:21:58 1997  William M. Perry  <address@hidden>
-
-* w3-forms.el (w3-form-create-password): Now uses real password entry
-  widgets provided by 'widget' - you _MUST_USE_ the widget library that
-  comes with Emacs-W3 for this, otherwise the info won't be hidden
-  correctly.
-  (w3-form-add-element): Deal with hidden text areas better when they are
-  in forms
-
-* Synch'd up to widget 1.22
-
-Sun Jan 26 16:50:09 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.51 released
-
-* w3-forms.el (w3-form-create-text): Now uses the real text entry widgets
-  provided by 'widget' - still can't do this for password fields yet
-  though.
-
-* Synch'd up to Widget 1.20
-
-Sat Jan 25 13:38:12 1997  William M. Perry  <address@hidden>
-
-* url.el (url-expand-file-name): Now strips out spaces as well as
-  newlines/carriage returns. More fixes for that bastardized microsoft
-  home page.
-
-* url-http.el (url-create-mime-request): Make sure that we retrieve the
-  cookies for the real URL we are retrieving when going through a proxy.
-  Now the psychotic crap that is the microsoft home page should be
-  successfully retrieved if going through an HTTP proxy.
-
-* url-cookie.el (url-cookie-handle-set-cookie): Attempt to deal with
-  idiotic microsoft home page that sends out set-cookie headers that look
-  like MC1=ID=abc, and expects two cookies MC1='' and ID='abc'  *sigh*
-
-* w3-forms.el, w3-display.el: Form elements now keep all their attributes
-  with them.  Will be useful when we start allowing scripting.
-  (w3-form-create-custom): Rudimentary patches to allow embedding 'custom'
-  widgets into the buffer.  Interesting.
-
-* w3-forms.el (w3-form-determine-size): New function to calculate how big
-  a form field will be - option lists should look much better now.
-
-Thu Jan 23 08:48:59 1997  William M. Perry  <address@hidden>
-
-* Synch'ed up to custom 1.19
-
-* url-parse.el: document extra slots of url-generic-parse-url
-
-Thu Jan 23 08:34:34 1997 Joe Wells <address@hidden>
-
-* url-file.el (url-file): Patch to tell ange-ftp and/or efs the password
-  in a file/ftp URL so that you won't be prompted for the password, even
-  if one was specified in the URL 
-
-* url-parse.el (url-generic-parse-url): Fixed bug where specifying a
-  username and password in the URL would downcase the username and
-  password as well as the hostname.
-
-Wed Jan 22 08:28:13 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.50 released
-
-* base64.el (base64-encode-region): Pulled in code from VM for quicker
-  encoding/decoding
-
-* mm.el (mm-content-transfer-encodings): Better base64 decoding
-
-Wed Jan 22 07:31:03 1997  Alf-Ivar Holm <address@hidden>
-
-* w3-emulate.el (w3-lynx-emulation-minor-mode-map): Lynx [up] and [down]
-  bound to non-existing functions.
-
-* w3.el (w3-do-setup): Fixed installation of lynx emulation modes keymap.
-
-Tue Jan 21 07:56:51 1997  William M. Perry  <address@hidden>
-
-* url-misc.el (url-data): Make sure to url-decode the data before
-  inserting it into the buffer.
-
-* w3-menu.el (w3-toggle-minibuffer): better version
-
-* w3-forms.el (w3-form-create-integer): New form entry type
-  (w3-form-create-float): new form entry type
-  (w3-form-encode-helper): deal with the new integer/float types
-
-* w3-display.el (w3-display-node): Reimplemented <select multiple> as a
-  list of checkboxes
-
-Mon Jan 20 06:29:07 1997  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-display-node): Keep track of the last form's action,
-  for theoretically 'naked' input fields that we want to try and handle as
-  best we can anyway.
-
-* w3-parse.el: Much more lenient about where form elements can be found.
-
-* w3-forms.el: summarizer functions now take the widget as an extra
-  parameter.
-
-* w3.el (w3-find-etc-directory): New function - not used yet.
-
-* w3.txi: Warning!  You now need a very new version of texinfo to compile
-  the .info or .dvi file yourself.
-
-* url-mail.el (url-mail): Now tries to use message-mail if it is bound
-  instead of just plain old 'mail'.
-
-* w3-forms.el (w3-form-add-element): Duh, fix hidden form fields.
-
-* font.el (font-normalize-color): Hopefully fixed color lossage under OS/2
-  and Windows
-
-* w3-forms.el (w3-form-summarize-field): Actually 'message' the string as
-  a workaround for emacspeak 5.0
-
-Sun Jan 19 09:32:15 1997  William M. Perry  <address@hidden>
-
-* w3-xemac.el (w3-mouse-handler): Ditto
-
-* w3-e19.el (w3-mouse-handler): Protect against 'bad format string' errors
-  when showing a hexified URL
-
-* w3-forms.el (w3-form-mark-widget): Be super paranoid and mark all
-  children and their children's children, and the parents of a widget.
-  (w3-form-create-radio-button): Make sure radio button children always
-  get updated via w3-form-mark-widget.
-  (w3-form-summarize-radio-button): Slightly better summarization of radio
-  buttons.
-
-* Emacs-W3 3.0.49 released
-
-* Synch'ed up with widget 1.18
-
-Fri Jan 17 06:25:36 1997  Dave Love <address@hidden>
-
-* w3-display.el: w3-echo-link now prefers the URL to the text of a link
-
-Fri Jan 17 06:25:36 1997  William M. Perry  <address@hidden>
-
-* w3-display.el: Fixed handling of inlined styles
-
-* w3-mouse.el: Some fixes for XEmacs when built with no X support
-
-* default.css: Now uses the new @media directives instead of the old
-  :blah: stuff
-
-* css.el (css-handle-media-directive): New function to handle @media
-  directives.
-  (css-parse): Deprecate the old :mediatype: way of specifying media
-  dependent styles.
-
-* w3-style.el (w3-handle-style): Now gets passed a plist instead of an
-  assoc list.
-  (w3-handle-style): Pay attention to the new 'media' attribute on
-  stylesheet links, and don't load the stylesheet if we aren't currently
-  running on that type of media.
-
-* css.el (css-properties): Added proposed printing properties from a W3C
-  draft.
-
-Thu Jan 16 06:06:45 1997  William M. Perry  <address@hidden>
-
-* css.el (css-handle-media-directive): Implemented the @media processing
-  instruction.
-
-* w3-forms.el (w3-form-summarize-option-list): Changed the summarize
-  function for option lists.  Much saner now.
-
-* w3.el (w3-read-url-with-default): Use the URL at point before falling
-  back to http://www.
-  (w3-source-document): When sourcing a document, let set-auto-mode do the
-  right thing.  .html comes up in html-mode, or whatever now.
-
-* url-cookie.el: Fixed some compile warnings under Emacs
-
-* w3-forms.el (w3-form-summarize-option-list): Make each choice-item have
-  emacspeak-help set.
-
-* w3-speak.el (w3-widget-backward): New advice
-(w3-widget-forward): New advice
-
-* w3-forms.el (w3-form-create-option-list): Renamed function
-
-* Emacs-W3 3.0.48 released
-
-* w3-display.el (w3-face-for-element): Use background-color instead of
-  just background for css property.
-
-* w3-forms.el (w3-form-encode-helper): Fixed radio buttons, duh.
-
-* url-misc.el (url-do-terminal-emulator): Fixed bad var reference left
-  from old code.
-
-* url-gw.el: Moved all the gateway variables into their own namespace to
-  make it easier to turn this into a standalone package.
-
-* dist.Makefile (SOURCES): Added url-gw and w3 to the build targets.
-
-Wed Jan 15 08:00:37 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.47 released
-
-* url.el (url-expand-file-name): Make sure to remove \r from the URL as
-  well as \n
-
-* url-gw.el (url-open-stream): Added in 'telnet' and 'rlogin' methods for
-  url-gateway-method.  Code stolen from GNUS.  Thanks lars! :)  It would
-  be nice to make this file its own package and be able to override
-  open-network-stream so that all apps could get this for free.
-
-* url-misc.el (url-generic-emulator-loader): Consolidated the tn3270,
-  telnet, and rlogin URL loaders into one smarter function
-
-* url.el: Made cookie and auth modules autoloaded, removed some old autoloads
-(url-open-stream) Moved to url-gw.el
-
-Mon Jan 13 22:11:00 1997  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-widget-echo): w3-echo-link can now be a list, so the
-  user can explicitly control fallback behaviour.
-
-* w3.txi: Added some pointers to CSS documentation
-
-* mule-sysdp.el (mule-code-convert-region): ditto
-
-* w3.el (w3-convert-code-for-mule): Fixed bug in XEmacs 20.0 mule
-
-Mon Jan 13 11:14:29 1997  T. V. Raman <address@hidden>
-
-* w3.el (w3-widget-forward): Call widget-forward interactively so that
-  emacspeak will hook it correctly.
-
-Mon Jan 13 11:14:29 1997  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-refresh-buffer): Finally reimplemented
-  w3-refresh-buffer.
-
-Sun Jan 12 10:32:50 1997  Karl Eichwalder  <address@hidden>
-
-* w3.txi: Add @dircategory and @direntry... @end.  `install-info'
-  from texinfo-3.9 know about those.
-
-Sun Jan 12 21:49:44 1997  William M. Perry  <address@hidden>
-
-* w3.el (w3-save-as): Can now save a page as postscript again
-
-* w3-display.el (w3-display-node): inline styles work again
-
-* url-misc.el (url-data): Updated data: URL to the spec.
-  ftp://ietf.org/internet-drafts/draft-masinter-url-data-02.txt
-
-Sat Jan 11 20:47:24 1997  William M. Perry  <address@hidden>
-
-* Emacs-w3 3.0.45 released
-
-* url-misc.el (url-data): Now supports the 'data' URL type, which just
-  'fetches' everything after the data: chunk of the URL
-
-Fri Jan 10 11:49:43 1997  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-display-node): Multicolumn works, but puts things
-  across instead of down
-
-* w3-parse.el: Basic support for parsing <multicol>
-
-* w3-display.el (w3-display-node): Make our semi-widgety hyperlinks
-  start/end open under XEmacs.
-
-* w3.el (w3-complete-link): Make sure we take case into account when doing
-  link completion.  The user can use 'test' to complete to link titled
-  'Test'.  Uses try-completion for this, which seems to work since we
-  require a match.  Is this the best way to do this?  Other than not being
-  case-insensitive at this point?
-
-* w3-forms.el (w3-form-default-widget-creator): Better way of handling
-  updates to text entry fields.
-  (w3-revert-form): Everything should be reverted correctly, both in
-  internal storage and in the buffer
-  (w3-form-create-radio-button): Get a more unique identifier to store
-  radio elements by - old way could theoretically get collisions.
-
-* w3-display.el (w3-display-handle-list-type): Updated use of 'list-style'
-  to use new property 'list-style-type'
-  (w3-prepare-buffer): Now kills the source buffer before it starts
-  drawing the tree, to avoid *URL-n* buffers when not really necessary.
-
-* css.el (css-properties): Updated all the properties to the W3C's latest
-  'recommendation' level CSS specification.
-  (css-handle-import): much better handling of @import
-  (css-parse): Better handling of '@' directives in general
-  (css-expand-value): General cleanup, reference the CSS and ACSS specs
-  for how/why we are parsing something the way we are.
-
-Thu Jan  9 06:17:08 1997  William M. Perry  <address@hidden>
-
-* Updated all copyright notices.  Happy belated new year!
-
-* w3-display.el (w3-region): Fixed a few bugs with nuking too much of a
-  buffer when using w3-region
-
-* w3.el (w3-read-url-with-default): Use new variable.
-
-* w3-vars.el (w3-fetch-with-default): New variable to control whether or
-  not w3-fetch will figure out a good default value for the URL or not.
-
-* w3-forms.el (w3-form-mark-widget): New function to mark a widget and all
-  its children with an appropriate :emacspeak-help and 'w3-form-data
-  Now defines a few keywords to look more widget-y
-
-Wed Jan  8 09:27:47 1997  William M. Perry  <address@hidden>
-
-* css.el (css-expand-value): Added elevation, angle, and time units.
-
-* w3-display.el (w3-display-node): Turn on voice-lock-mode by default in
-  all w3 buffers.
-
-* css.el (css-properties): Added in new speech properties from the ACSS
-  note from the W3C.  Please see
-  http://www.w3.org/pub/WWW/Style/CSS/Speech/NOTE-ACSS for more
-  information.
-
-* w3-forms.el: Moved all the form entry summarization functions from
-  w3-speak.el into w3-forms.  Easier to keep in synch this way.
-
-* w3-display.el (w3-display-node): Reimplimented the 'keygen' form entry
-  type for netscape compatibility.
-
-Tue Jan  7 07:20:08 1997  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-region): New function that parses the HTML in a region
-  'in-place', so that things like MIME mailers/gnus readers can show HTML
-  inline a lot easier.
-
-* w3-forms.el (w3-form-resurrect-widgets): Fixed case where a widget goes
-  all the way to point-max and next-single-property-change will return
-  nil.  Would pass bad args to delete-region.
-  (w3-form-summarize-field): Moved some of the smarts about summarizing W3
-  widgets from w3-speak into the core forms code.
-
-* font.el (define-font-keywords): New function for defining keywords that
-  will actually work across Emacs and XEmacs
-
-* w3-display.el (w3-display-node): Reimplemented 'note' functionality, by
-  converting it into a two-cell table.
-  (w3-display-node): Implemented <dir> as multi-column, as-per the RFC and
-  HTML 3.x specifications
-
-* default.css: Added default display type for dir and menu
-
-Mon Jan  6 21:49:52 1997  William M. Perry  <address@hidden>
-
-* url-http.el (url-create-mime-request): Fixed yet another stupid problem
-  in Host: header handling.  Was never sending the right information if
-  you were not going through a proxy this time.  *sigh*
-
-* w3-forms.el (w3-form-add-element): Fixed hidden form fields
-
-Sun Jan  5 22:38:54 1997  William M. Perry  <address@hidden>
-
-* url-vars.el (url-proxy-services): updated documentation string
-
-* w3-widget.el (widget-image-notify): Fixed client side handling of
-imagemaps on a TTY or a delayed/broken image. Duhhh
-
-Fri Jan  3  Dave Love  <address@hidden>
-
-* w3-e19.el (w3-mouse-handler): Fix link echoing.
-
-Fri Jan  3 08:43:56 1997  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.43 released
-
-* font.el (make-font): Treat args as a plist, just for sanity's sake.
-
-Thu Jan  2 12:19:31 1997  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-table-hack-borders): Fix stupid use of 'otheriwse'
-  instead of 'otherwise' in a case statement.
-
-* w3-forms.el (w3-form-add-element): Fix stupid use of 'otheriwse'
-  instead of 'otherwise' in a case statement.
-  (w3-form-resurrect-widgets): Fixed XEmacs handling of widget recreation,
-  and also fixed problem where some widgets would be skipped.
-
-Tue Dec 31 07:37:17 1996  William M. Perry  <address@hidden>
-
-* w3-e19.el: All the menus in Emacs-19 now use the same constructors that
-  the :filter entries under XEmacs do.  This will make things much easier
-  in the future in not duplicating crufty menu-construction code once for
-  XEmacs menu-structs and once for Emacs keymaps.
-
-* w3-menu.el (w3-menu-html-links-constructor): Now works with the Emacs 19
-  implementation of property lists.
-
-Mon Dec 30 06:25:28 1996  William M. Perry  <address@hidden>
-
-* w3-menu.el (w3-popup-menu): context-sensitive menus over delayed images
-  work again 
-
-* w3-display.el (w3-parse-link): New way to store <link> information from
-  an HTML document.
-
-* w3.el (w3-search): Deal with new <link> storage
-
-* w3-menu.el (w3-menu-html-links-constructor): Deal with new way <link>
-  items are stored - now uses the 'title' attribute if present.
-
-* w3-auto.el (w3-form-resurrect-widgets): Added autoload
-
-* url-file.el (url-format-directory): Removed url-forms-based-ftp option -
-  didn't really work anyway.
-
-Sun Dec 29 15:54:21 1996  William M. Perry  <address@hidden>
-
-* w3-forms.el (w3-form-resurrect-widgets): fixed stupid problem in munging
-  of the size of form elements.
-
-* Emacs-W3 3.0.42 released
-
-* w3-display.el (w3-table-hack-borders): Deal gracefully with not finding
-  a 'terminal' font to display hacked border chars in
-
-* w3-hot.el (w3-hotlist-add-document): don't hexify a url before sticking
-  it in the hotlist buffer
-
-* w3-display.el (w3-display-node): hyperlinks with images at the start
-  will now have a button associated with the entire link, not just the
-  image part.
-
-* w3-sysdp.el (fillin-text-property): made it work under Emacs19
-
-Sun Dec 29 00:07:39 1996  Takahiro Hayata <address@hidden>
-
-* mule-sysdp.el (mule-write-region-no-coding-system): Patch for Mule 2.3 
-
-Sun Dec 29 00:07:39 1996  William M. Perry  <address@hidden>
-
-* w3-forms.el (w3-form-add-element): Only insert stubs of the right length
-  for a for element, and do munging of that text into the actual widgets
-  later.  This saves us a lot of grief and heartache when handling things
-  like radio buttons that span table elements because the markers have
-  become completely insane by the time the next widget is ready to be
-  created.
-
-Sat Dec 28 17:24:08 1996  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-display-table): Don't crap out on invalid tables where
-  table-dimensions tells us we have a 0 column or 0 row table.
-
-* w3-widget.el (widget-image-value-create): Use :action instead of :notify
-  for widget-image-callback - hyperlinked images under Emacs 19 should
-  work again.
-
-Thu Dec 26 18:26:25 1996  William M. Perry  <address@hidden>
-
-* w3.el (w3-widget-forward): Use this instead of widget-forward.
-(w3-widget-backward): Ditto.  Need to make both of these smart for w3.
-
-* w3-display.el (w3-display-node): Implemented the display class 'none'
-  for turning off the rendering of an element and its subcontent.
-
-Thu Dec 26 07:21:58 1996  William Perry  <address@hidden>
-
-* w3-parse.el (w3-parse-buffer): *sigh* Allow _ in attribute names.
-
-* Emacs-W3 3.0.41 released
-
-* url-parse.el (url-generic-parse-url): bind inhibit-read-only to 't' in
-  url parsing buffers, to avoid 'attempt to modify read-only text'
-  problems when the string passed to url-generic-parse-url has the
-  read-only text property set.
-
-* w3-e19.el (w3-setup-version-specifics): popup menus should work in
-  Emacs19 again.
-
-* css.el (css-expand-value): For margin and padding, make sure we _always_
-  convert into a valid length spec.  Setting a 'margin' or 'padding'
-  property group instead of individual margin-* or padding-* values would
-  cause the display engine to crap out.
-  (css-get): Fixed generic class-only lookups (.foo, etc)
-
-* w3-display.el (w3-display-handle-list-type): Tweaks to list indentation
-
-* w3-menu.el (w3-menu-html-links-constructor): Fixed stupid problem with
-  the new navigate menu under XEmacs.
-
-Tue Dec 24 22:46:11 1996  William M. Perry  <address@hidden>
-
-* css.el (css-expand-color): Better handling of X-style color specs -
-  convert them to internal RGB format.
-
-Tue Dec 24 02:50:08 1996  Christian Limpach  <address@hidden>
-
-* font.el (ns-font-families-for-device): added test for unbound
-  device-fonts-cache variable.
-  (ns-font-create-name): handle font-styles which are numbers.
-
-* w3-sysdp.el (try-font-name): added support for Nextstep.
-
-Tue Dec 24 06:16:33 1996  William M. Perry  <address@hidden>
-
-* w3.el (w3-open-local): Send filename through expand-file-name in
-  w3-open-local to avoid having illegal URLs like file:/~/test.html
-
-* w3-widget.el (widget-image-value-create): fixed new problem with client
-  side imagemaps.  Should really work this time.
-
-* w3.el (w3-map-links): w3-map-links and hence w3-complete-link will now
-  find images that are also hyperlinks.
-
-Mon Dec 23 22:28:58 1996  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.40 released
-
-* w3-menu.el (w3-menu-go-menu): Added 'navigate' submenu to hold the
-  predefined <link> types.
-
-* w3-widget.el (widget-image-summarize): Image widgets should now be much
-  better at identifying themselves when being tab'ed to or waggled at with
-  the mouse.
-
-* w3-prefs.el: Fixed a few references to w3-glyphp (now widget-glyphp)
-
-* w3.el (w3-url-completion-function): Fixed completion of URLs
-
-Sat Dec 21 Dave Love  <address@hidden>
-
-* w3-display.el, w3-vars.el, w3.el: Define and use
-  w3-defined-link-types to canonicalize link descriptions' case for
-  ease of use.
-
-* w3-e19.el (w3-build-FSF19-menu): Add any recognised <link> items
-  to the menu in the absence of a toolbar.
-
-Thu Dec 19 13:52:35 1996  William Perry  <address@hidden>
-
-* Emacs-W3 3.0.39 released
-       
-* w3-forms.el (w3-form-encode-xwfu): Ditto.
-
-* url.el (url-hexify-string): Updated to use url-unreserved-chars when
-  escaping, ala
-  http://www.ics.uci.edu/pub/ietf/uri/draft-fielding-url-syntax-02.txt
-
-Wed Dec 18 22:09:41 1996  William M. Perry  <address@hidden>
-
-* w3.el (w3-mode): Removed bogus setting of widget-motion-hook from way
-  back
-
-* w3-parse.el (w3-parse-buffer): Better handling of <base> tag.
-
-* w3-display.el (w3-widget-echo): Better falling-back when the preferred
-  echo method yields nil.
-
-* url.el, w3-display.el, w3.el: Remove last vestiges of url-hash.el and
-  removed it from the distribution.
-
-Wed Dec 18 08:07:32 1996  William Perry  <address@hidden>
-
-* dsssl.el: Moved the DSSSL parser and friends into its own namespace.
-
-Removed dependencies on url-hash.
-
-* custom.el: Synch'd up to custom 1.13
-
-Tue Dec 17 16:36:05 1996  William M. Perry  <address@hidden>
-
-* url.el (url-expand-file-name): If we weren't given a base object to work
-  from, and url-current-object is null, set it to the object returned by
-  parsing url-view-url.
-
-* url-http.el (url-create-mime-request): Send the right information in the
-  'Host' header field when going through a proxy.
-  (url-setup-reload-timer): Emacs 19 doesn't deal well with 0-length
-  timeouts, so protect against trying to create one when dealing with the
-  refresh header.
-
-* w3-parse.el: Removed lots of crap for the old display engine - shouldn't
-  cons up as much garbage as before.  Now it will just cons up garbage
-  that we actually need.
-
-Tue Dec 17 07:10:47 1996  William Perry  <address@hidden>
-
-* css.el (css-properties): New property type 'string-list' for font-family
-
-* w3.el (w3-find-default-stylesheets): Make sure to look in
-  data-directory/../../w3 for stylesheets
-
-Tue Dec 17 06:07:08 1996  William M. Perry  <address@hidden>
-
-* w3-toolbar.el: wrapped a condition-case around the require for
-  xpm-button and xbm-button so that it will compile under Emacs
-
-Mon Dec 16 08:19:40 1996  William Perry  <address@hidden>
-
-* Emacs-W3 3.0.38 released.
-
-* dist.Makefile (OBJECTS): Removed xpm-button and xbm-button from the
-  distribution.  Any version of XEmacs that can run the latest 3.0 stuff
-  has them already.
-
-* default.css: Make nested ol/ul items display class 'line' so they look
-  prettier.
-
-* w3-display.el (w3-display-node): EVIL hack to make the first item in a
-  nested list get indented correctly.
-
-* w3-about.el (w3-about): Fixed the about:style stylesheet to be
-  up-to-date with new CSS spec.
-
-* default.css: Turned down indentation on list items by default.
-
-* w3-display.el (w3-display-node): Mouse tracking should work under XEmacs
-  again.
-
-* dist.Makefile (all): Removed 'emacs' from dependency list.
-
-Mon Dec 16 06:03:14 1996  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-table-hack-borders): This should work on TTY's again.
-
-Sun Dec 15 14:19:53 1996  William M. Perry  <address@hidden>
-
-* Emacs-W3 3.0.37 released
-
-* w3-display.el: Better handling of paragraphs (well, any block-level
-  element within a list-item display group.
-
-* default.css (address): Changed <address> display tpye to line so that
-  right-justification will take effect.
-
-Sat Dec 14 10:24:13 1996  William M. Perry  <address@hidden>
-
-* w3-sysdp.el: Removed stubs for add-submenu - it was confusing 'custom'
-
-* dist.Makefile: More GNU-ish project makefile
-
-* url.el (url-default-find-proxy-for-url): Fixed no_proxy handling
-(url-default-find-proxy-for-url): Don't pass 'www://' links to a proxy
-
-Fri Dec 13 22:50:45 1996  William M. Perry  <address@hidden>
-
-* dist.Makefile (URLSOURCES): Added socks.el to the distribution.  Not
-  used just yet.
-
-* css.el (css-copy-stylesheet): Fixed problem with sharing the list
-  structure between the hash tables - document stylesheets would infect
-  the main w3-user-stylesheet and cause weirdness.
-
-Fri Dec 13 09:47:40 1996  William Perry  <address@hidden>
-
-* w3-style.el (w3-display-stylesheet): Fixed problem where
-  w3-display-stylesheet would override the buffer css-display was showing
-  the stylesheet in.  Duhh.
-
-* mule-sysdp.el (mule-encode-string): Fixed stupid problem on non-XEmacs
-  mule
-  (mule-sysdep-version): Ditto.
-
-Fri Dec 13 06:25:45 1996  William M. Perry  <address@hidden>
-
-* css.el (css-get): Removed bogus recursive call to css-get, and moved the
-  guts of css-get out into its own fuction, which is in turn inlined into
-  css-get.  Might even make things faster.  At the least, I expect it to
-  get rid of the 'takes two makes to make w3-display.elc' problem some
-  people have been seeing.
-
-* w3-display.el (w3-display-handle-list-type): Fixed stupid problem with
-  margin handling where list-item display items were always flush-left
-
-Fri Dec 13 02:51:24 1996  Greg Stark  <address@hidden>
-* w3-display.el (w3-display-line-break): correct right justification code
-  (w3-min-size-of-string): removed unused function that didn't work.
-  (w3-size-of-tree): maintain consistent w3-display-open-element-stack
-  don't hard code assumption that hr's are drawn with '-'
-  (w3-display-table-dimensions): major bug if the last column rowspans
-  (w3-table-lookup-char): new function
-  (w3-table-hack-borders): new function makes table borders use pretty
-  graphic characters instead of ascii characters. 
-  (w3-table-unhack-borders): new function restore lame ascii borders.
-  (w3-display-table): Major changes to support drawing better borders
-  also fix various bugs and tweak various things.
-
-* w3-parse.el: remove = from set of characters that terminate an attribute
-               when guessing about an syntactically invalid attribute. 
-              (didn't this get changed once already?)
-
-* w3.el (w3-sentinel): hack around bug that bit w3-preview-this-buffer 
-                       but I don't know what the right thing for Mule.
-
-Thu Dec 12 08:36:01 1996  William Perry  <address@hidden>
-* Synch'd up to widget 1.13
-
-* w3-display.el (w3-get-pad-string): Ack - watch for negative values in
-  w3-get-pad-string
-
-* Released 3.0.36
-
-* w3-style.el (w3-display-stylesheet): Use new css-display function
-
-* css.el (css-get): Better class checking
-  (css-display): New function to pretty-print a stylesheet that is in
-  memory.
-
-* w3-parse.el (w3-parse-buffer): *sigh* Parser now keeps track of 'base'
-  of this document.  Also normalizes 'align' attribute, as well as
-  auto-expanding any SRC or HREF attributes.
-
-* w3-display.el (w3-display-handle-list-type): Now handles text-indent
-  style property.
-  (w3-display-table): Can now specify properties on 'tr', for
-  vertical-alignment, etc.
-  (w3-display-node): Lots of changes to deal with new method of munging
-  class/align/etc in the parser.
-
-Wed Dec 11 17:37:14 1996  William M. Perry  <address@hidden>
-
-* w3-parse.el (w3-parse-buffer): Do munging of align/src/href/class
-  attributes to save time in w3-display-node and friends.
-
-* w3-prefs.el (w3-preferences-compatibility-variables): Fixed problems
-  with renaming of w3-style-ie-compatibility to css-ie-compatibility
-
-* w3-display.el (w3-display-node): fix for hyperlinks / form info in
-  tables. Duhh.
-
-Wed Dec 11 07:36:08 1996  William Perry  <address@hidden>
-
-* css.el (css-copy-stylesheet): New function
-
-* w3-display.el (w3-display-node): use it
-
-* mule-sysdp.el (mule-encode-string): Fixes for XEmacs w/mule
-(mule-decode-string): Fixes for XEmacs w/mule
-
-* w3-display.el (w3-display-node): Fixed problem in isindex handling.
-  Using forms for isindex handling should work again.
-
-* css.el (css-specificity): new function css-specificity to find how
-  specific a certain rule is. Need to use this to sort rules in css-get.
-
-Tue Dec 10 22:37:59 1996  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-get-style-info): Changes to deal with new css.el -
-  should be much much faster now.
-
-* css.el (css-get): Radically changed the internal representation of
-  stylesheets, and how they are looked up.
-
-Mon Dec  9 22:31:11 1996  William M. Perry  <address@hidden>
-
-* w3-display.el (w3-face-for-element): Fixed bug in w3-face-for-element
-  where weight of the element wasn't being taken into account.
-
-* css.el: Changed font-variant style type from string to symbol-list
-
-Mon Dec  9 12:29:59 1996  William Perry  <address@hidden>
-
-* default.css: Changed default header sizes - should look better on most
-  machines
-
-Sun Dec  8 19:21:07 1996  William M. Perry  <address@hidden>
-
-* Emacs-w3 3.0.34 Released
-
-* w3-display.el: New macro w3-get-attribute to replace
-  (cdr (assq 'blah args)), just in case I ever decide to replace the 
-  assoc list currently used.
-
-* New file mule-sysdp.el, to make supporting Mule 2.3, Mule 2.4, and
-  XEmacs 20.0 easier.
-
-* url-file.el (url-insert-possibly-compressed-file): handle mule 2.4
-
-Fri Dec  6 06:54:03 1996  William Perry  <address@hidden>
-
-* w3-parse.el: Emit warnings when people try to slap attribute/value pairs
-  on end tags.  Evil bastards.
-  Added SPAN, BDO, OBJECT, BASEFONT
-
-Fri Dec  6 04:42:24 1996  Greg Stark  <address@hidden>
-
-* default.css: add th td and caption text-align information
-
-* docomp.el: increase max-specpdl-size so it can compile w3-display
-
-* url.el (url-sentinel): avoid save-excursion around switch-buffer 
-
-* w3-display (w3-display-line-break): if we're in nowrap mode but the
-  region doesn't end on a newline insert an extra newline, otherwise <br>
-  gets ignored inside a <pre> or nowrap environment. 
-  Also protect against fill-column less than the length of fill-prefix. 
-  Also avoid infloop in right justification, and
-  fix bug that caused right justification to never be executed.
-
-* w3-display (table-cut table-dimensions w3-display-table): 
-  lots of new code to handle rowspan and autolayout.
-
-* (w3-display-fix-widgets): be more agressive adjust even markers that have
-  buffers and adjust parent markers.
-
-* w3-display (w3-display-node): These changes are important for tables
-  Don't insert insert-before on <a> tags before the class is adjusted
-  Don't insert more than one class into an <a> tag when we adjust it. 
-  Protect against a negative fill-column when drawing <hr>s
-  Set adaptive-fill-mode (what's filladapt-mode?)
-
-* w3-parse.el: remove font from %block. WARNING, i have little idea what
-  consequences this has but it seems to have the desired effect of
-  handling table cells whose first tag is a <font> without discarding the
-  implied <p> tag.
-
-* w3-parse.el: skip-chars-forward "^>" when parsing end tags 
-  (some people seem to think you can put attributes in end tags)
-
-Fri Dec  6 14:08:30 1996  William M. Perry  <address@hidden>
-
-* css.el: Better handling of text-decoration, to go along with the new version
-  of set-font-style-by-keywords
-       
-* font.el: Faster version of set-font-style-by-keywords.
-  Fixed RGB spec. problem if you used non-floats.
-
-* w3-display.el: (w3-face-for-element) Obey some font function renaming.
-  (w3-face-for-element) Changed format specification on w3-style-face-xxx
-  creation.
-  (w3-display-node) Alignment specified via attributes overrides
-  stylesheet, not vice versa.
-  (w3-display-node) Fixed stupid mistake in 'link' handling where
-  stylesheets were ignored.
-
-Thu Dec  5 17:51:37 1996  William M. Perry  <address@hidden>
-
-* url.el: (url-retrieve-internally) Can now specify an alternative
-  function to determine whether a URL should be proxied or not.  modelled
-  off the netscape auto-proxy-configuration crap, so hopefully someday we
-  can just suck down one of their files and be 'happy' with it.
-
-* w3-display.el, css.el:
-  Modified some of the css properties to not be inherited - let
-  w3-display figure it out on its own - quicker this way.  Saves a few
-  thousand lookups over the life of a parse.
-
-Mon Dec  2 20:22:12 1996  William M. Perry  <address@hidden>
-
-* w3-display.el: use better face names... avoids problems in xemacs
-  resource name checking.
-
-* w3-vars.el: Created version 3.0.33
-
-* w3-parse.el: Fixed problem parsing attribute values like <img alt=''> -
-  the regexp didn't like empty attribute values specified with single
-  quotes.
-
-* w3.el: -Patches from Dave Love
-
-* font.el: Renamed the font-set-*-p to set-font-*-p, to be more in line with
-set-face-underline-p and friends.  Fixed stupid problem in
-set-font-*-p where it would always just toggle the property, not
-actually set it.  Blah.  Added code in x-font-create-name to try
-oblique and italic versions of a font if italic is set.
-
-* default.css: Prettied up the :speech: section
-
-* w3-display.el:
-Conditionalized get-style-info calls in w3-voice-for-element on
-feature 'emacspeak
-
-* w3.el: Added code to try loading dtk-css-speech and w3-speak if the feature
-'emacspeak' is available.
-
-* css.el: Fixed a few stupid problems.
-
-* font.el:
-made tty-font-create-object return a 12pt font object, just for reference.
-
-* w3.txi: More updates to the documentation
-
-* w3.el, w3-style.el: Moved to using the new 'css' package
-
-* w3-parse.el:
-Removed some old functions.  Save some string creation by downcasing
-tag and atribute names in the buffer instead of using 'downcase'.
-
-* w3-display.el: Moved to using the new 'css' package
-
-* w3-auto.el: Removed some outdated autoloads
-
-* font.el: Added function font-set-style-by-keywords
-
-* css.el: Better handling of various entities - beter way of specifying new
-properties and how they should be handled.
-
-* default.css: *** empty log message ***
-
-* dist.Makefile: Added 'css.el' to targets
-
-* css.el: Initial revision
-
-* w3-vars.el: Renamed w3-right-border to w3-right-margin
-
-Sat Nov 30 17:42:38 1996  William M. Perry  <address@hidden>
-
-* custom-edit.el, custom.el, widget-edit.el, widget.el:
--Synch'd up to Custom/Widget 1.09
-
-Fri Nov 29 23:12:42 1996  William M. Perry  <address@hidden>
-
-* font.el: Actually try to use the 'oblique' property under X
-
-* w3-display.el:
-Fix for sometimes getting an invalid glyph error in image retrieval.
-Fixed problem where table display would pop something off the open element 
stack.
-
-* custom-edit.el, custom.el, widget-edit.el, widget.el:
--Synch'd up to Custom/Widget 1.08
-
-* w3-display.el: List filling seems to line up correctly now.
-Fixed bug in ordered list handling (wrong arg passed to a format).
-Changed the way spacing is handled.
-
-* w3-menu.el: Added new 'search' menu with common web indexes
-
-* dist.Makefile:
-Don't specify widget*.el twice in SOURCES _AND_ CUSTOMSOURCES or
-install under FreeBSD chokes.
-
-* w3-display.el: Protect against list-item display property outside of a list.
-
-* w3-sysdp.el: Fixed free var reference in make-device
-
-Thu Nov 28 23:01:11 1996  William M. Perry  <address@hidden>
-
-* w3-display.el:
-Protect against bad values of w3-last-fill-pos in w3-display-line-break
-
-* w3-e19.el, w3-menu.el:
--Patches from Dave Love <address@hidden> for using title of link in menus
-
-Wed Nov 27 22:59:56 1996  William M. Perry  <address@hidden>
-
-* w3-vars.el: Created version 3.0.32
-
-* w3.txi: Started revamping some of the documentation
-
-* url-custom.el: Initial revision
-
-* w3-display.el: Handle 'menu' list type correctly
-
-* url.el: Patch from address@hidden;
-- insert information about processes in buffer "URL Status Display"
-  instead of *URL-<i>* : added a local variable `url-status-buf' and a
-  call to `set-buffer'
-
-- changed `url-get-working-buffer' to `url-get-working-buffer-name',
-  because `url-working-buffer' is expected to be a name, not a buffer
-  (my mistake)
-
-* w3-xemac.el, w3-vars.el:
-Removed some old variables that aren't used anywhere now.
-
-* w3-e19.el:
-Patch from Dave Love <address@hidden> for 'title' version of w3-echo-link.
-
-* w3-display.el:
-Patch from Dave Love <address@hidden> for 'title' version of w3-echo-link.
-Form info is now stuck on a stack instead of in a let-bound variable.
-Only call w3-display-fix-widgets once!  recursive calls to
-w3-display-node when rendering tables caused it to happen more than it
-should.
-
-* w3-forms.el:
-Patch from Dave Love <address@hidden> to protect against bad value
-for 'next' in w3-next-widget.
-
-* dist.Makefile: Don't use `install -d', use mkdir -p if necessary
-
-Tue Nov 26 16:21:32 1996  William M. Perry  <address@hidden>
-
-* custom-edit.el, custom.el: synch'd up to custom 1.05
-
-* widget.el, widget-edit.el: *** empty log message ***
-
-* widget-edit.el, widget.el: synch'd up to widget 1.05
-
-* w3-display.el: Handles the 'dir' list type correctly now.
-
-* url.el:
-Quick patch to check for url-working-buffer being a buffer, not a string.
-
-* w3-display.el:
-Backed out _BAD BAD BAD_ change to protect against invalid values for
-w3-last-fill-pos that basically fucked everything in regards to
-vertical whitespace.
-
-Mon Nov 25 21:12:17 1996  William M. Perry  <address@hidden>
-
-* w3-display.el: *** empty log message ***
-
-* w3-display.el:
-Now only does incrememental display around block level elements.
-Does better munging of pre-formatted text CR -> LF CRLF->LF, etc.
-
-* w3.el: Protect against errors in w3-sentinel on bad buffers.
-
-* w3-vars.el: Created version 3.0.31
-
-* widget-edit.el: Fixed compile problems under emacs
-
-* w3-vars.el: *** empty log message ***
-
-* widget.el: Made widget.el compile in emacsen w/o native backquote support
-
-* w3-display.el: *** empty log message ***
-
-* w3-parse.el:
-Patch from greg stark for dealing with '=' in misquoted attribute value pairs
-
-Sun Nov 24 23:25:25 1996  William M. Perry  <address@hidden>
-
-* w3-display.el: Reimplemented targetted anchors (#foo)
-
-* url.el: *** empty log message ***
-
-* url-vars.el:
-Changed default of url-mime-language-string to '*' to make some sites happy.
-
-* w3-display.el: Protect against w3-last-fill-pos getting an invalid position
-
-* w3.el, w3-display.el, w3-vars.el:
-Patch from Dave Love <address@hidden> to add new possibility 'title'
-to w3-echo-link to show the 'title' attribute of a link if its there.
-
-* w3-speak.el: Patch from raman.
-
-* font.el:
-Patch from address@hidden to handle fontsets correctly in mule
-
-* w3-display.el: Implemented a few more CSS properties.
-list-style - control how list items are displayed.  Ordered lists are
-             now different from unordered only in their list-style.
-             Need to implement contextual selectors to get ordered
-             lists to work out of the box though.
-white-space - control whether whitespace is collapsed or not, and
-              whether text is wrapped.  <pre> <xmp> and <plaintext>
-              are now all specified to use this in the default
-              stylesheet.
-text-align - this replaces the old 'align' attribute
-
-Reimplemented inlined styles.
-
-* default.css: Varius updates to take advantage of the new CSS properties
-  white-space, list-style, etc.
-
-* w3-style.el: Handle url() and rgb() notation in color specifications
-
-* w3-vars.el: Removed a few outdated variables
-
-Sat Nov 23 02:10:37 1996  William M. Perry  <address@hidden>
-
-* w3-display.el: *** empty log message ***
-
-* dsssl.el: Got rid of yet more compilation warnings.
-
-* custom.el, custom-edit.el: Synch'd up to custom 1.0.1
-
-* w3-display.el: Better handling of <hr> and <center>, and line spacing in
-  general
-
-* default.css: Updates to default stylesheet to deal with <center> and <div>
-
-* w3.el, url.el, url-vars.el, url-http.el: Patches from Thierry Emery to
-  allow multiple asynch fetches.
-
-Fri Nov 22 22:26:35 1996  William M. Perry  <address@hidden>
-
-* widget-edit.el, widget.el: -Synch'd up to widget 1.01
-
-* w3-style.el: Fixed a few fRemoved a few free variable sets/refs
-
-* w3.el:
-When saving a document as html source, try to get into the 'head' before 
inserting the base.
-
-* w3-display.el, w3-style.el: Stylesheets now store all there information
-  as property lists instead of assoc lists.  Just easier.
-
-* font.el: Fix for font-normalize-color under nextstep
-
-Thu Nov 21 04:01:22 1996  William M. Perry  <address@hidden>
-
-* widget-edit.el, widget.el: synch'd to 1.00 of widget/custom
-
-Mon Nov 18 16:26:06 1996  William M. Perry  <address@hidden>
-
-* install.sh: Initial revision
-
-* html32.dsl: Updated to latest from jon bosak
-
-* w3-vars.el: Created version 3.0.30
-
-Thu Nov 14 22:39:36 1996  William M. Perry  <address@hidden>
-
-* w3.el: Changed this so you can actually just do a (require 'w3-sysdp)
-  and each function will check to see if it should overwrite, instead of
-  conditionalizing that on the whole file.
-
-* url.el: *** empty log message ***
-
-* images.el, font.el, docomp.el, w3-sysdp.el: Changed this so you can
-  actually just do a (require 'w3-sysdp) and each function will check to
-  see if it should overwrite, instead of conditionalizing that on the
-  whole file.
-
-* w3-display.el: Moved some macros around.
-
-* widget.el, widget-edit.el, w3-forms.el: Sync'd up to Widget 0.999
-
-* w3-auto.el, w3-menu.el: *** empty log message ***
-
-Sun Nov 10 18:08:24 1996  William M. Perry  <address@hidden>
-
-* w3-vars.el: Created version 3.0.29
-
-* dsssl.el: Various changes, starting on the actual flow object stuff
-
-Tue Nov  5 05:26:07 1996  William M. Perry  <address@hidden>
-
-* url-news.el: Updated version checking of news to deal with 'red' gnus
-
-Mon Nov  4 14:47:47 1996  William M. Perry  <address@hidden>
-
-* w3-display.el: Don't show the content of 'script' - typo
-
-Fri Nov  1 15:08:45 1996  William M. Perry  <address@hidden>
-
-* default.css: Changes from raman
-
-Thu Oct 31 18:51:52 1996  William M. Perry  <address@hidden>
-
-* widget-edit.el: -
-
-Tue Oct 29 19:53:38 1996  William M. Perry  <address@hidden>
-
-* w3-display.el: *** empty log message ***
-
-Thu Oct 24 02:25:03 1996  William M. Perry  <address@hidden>
-
-* w3-widget.el: Updated the image widget to the new widget stuff.
-
-Wed Oct 23 13:26:09 1996  William M. Perry  <address@hidden>
-
-* docomp.el: *** empty log message ***
-
-* url.el: Fixed bug in url-remove-relative-links that would choke on something
-like: /foo/bar/./../baz/ - they /../ was removed first, removing its
-parent directory, the /./ - ack.
-
-* w3-display.el: Image loading is back!
-Client-side imagemaps are back!
-Forms that span tables are working now.
-
-Mon Oct 21 21:32:33 1996  William M. Perry  <address@hidden>
-
-* w3-vars.el: Created version 3.0.28
-
-* url-mail.el: Make mail handling a little more generic.
-
-* w3-display.el:
-Fix for w3-display-fix-widgets so that links right up against each
-other don't cause it to skip every-other-one.
-
-Sun Oct 20 16:47:05 1996  William M. Perry  <address@hidden>
-
-* w3-style.el: don't map a pitch of 9 to 0.
-
-* w3-speak.el:
-Added back in the advice for url-lazy-message that provided auditory
-feedback during URL retrieval.  Also added back in the
-w3-speak-browse-page command.
-
-* w3-speak.el:
-Some patches from TV Raman to fix multiline text entry area speaking
-and a bogus call to widget-get in text entry area speaking.
-
-Fri Oct 18 12:27:04 1996  William M. Perry  <address@hidden>
-
-* w3-display.el:
-Patches from Thierry Emery <address@hidden> to
-implement 'colspan' on tables.  Patch to support align=xxx on
-arbitrary tags.
-
-Thu Oct 17 22:27:44 1996  William M. Perry  <address@hidden>
-
-* w3-vars.el: Created version 3.0.27
-
-* w3-display.el:
-fixed voicification of hyperlinks.  Fixed problem in w3-normalize-spaces
-and multi-line strings.
-
-Wed Oct 16 20:56:40 1996  William M. Perry  <address@hidden>
-
-* w3-speak.el: Fix stupid problem.  function renaming lossage.  Fun
-
-* w3-display.el:
-Fixed <select> form items that had no <option value=xxx selected>
-entry in them.  Wheee.
-
-* w3-display.el:
-Fixed <select> form items that had an <option value=xxx selected>
-entry in them.  Wheee.
-
-* w3.el: document info is now shown as a table.
-
-* w3.el: Document information is now shown as a table.
-
-* w3-display.el, w3-vars.el: Now keeps better track of the <meta> tag info
-
-* w3-vars.el: Created version 3.0.26
-
-* w3-display.el: *** empty log message ***
-
-Tue Oct 15 13:21:54 1996  William M. Perry  <address@hidden>
-
-* w3-display.el: Added back in <meta> and <link> handling.
-Fixed insert-before and insert-after for 'a' tag and pseudo-classes
-
-* w3-display.el:
-Fixed some potential runaway style inheritance - need to think about a
-better way to pop style info off the various stacks than
-(w3-handle-content node) on an empty element.
-
-* w3-display.el: Fixed <textarea> elements in forms
-
-* w3-display.el, w3-forms.el: Fixed <select> elements in forms
-
-Sun Oct 13 23:50:03 1996  William M. Perry  <address@hidden>
-
-* w3-vars.el: Created version 3.0.25
-
-* dsssl.el: Bug fixes
-
-* url-hash.el:
-Fixed bug in url-gethash where it wasn't honoring the 'default' parameter
-
-Sat Oct 12 20:32:49 1996  William M. Perry  <address@hidden>
-
-* widget.el, widget-edit.el: Synched up to widget 0.99.4
-
-Fri Oct 11 18:55:02 1996  William M. Perry  <address@hidden>
-
-* w3-display.el: fix for xemacs w/ temp faces
-
-* w3-display.el: Fixed a bug with the insert-after handling. Duhh.
-
-* default.css, w3-display.el: Implemented insert-before and insert-after
-
-Wed Oct  9 19:00:59 1996  William M. Perry  <address@hidden>
-
-* ssl.el, url-cookie.el, url-file.el, url-gopher.el, url-hash.el, url-http.el, 
url-irc.el, url-mail.el, url-misc.el, url-news.el, url-nfs.el, url-parse.el, 
url-pgp.el, url-vars.el, url-wais.el, url.el, urlauth.el, w3-about.el, 
w3-annotat.el, w3-display.el, w3-e19.el, w3-emulate.el, w3-forms.el, w3-hot.el, 
w3-imap.el, w3-keyword.el, w3-latex.el, w3-menu.el, w3-mouse.el, w3-mule.el, 
w3-parse.el, w3-prefs.el, w3-print.el, w3-speak.el, w3-style.el, w3-toolbar.el, 
w3-vars.el, w3-widget.el, w3-xem20.el, w3-xemac.el, w3.el, xbm-button.el, 
xpm-button.el, base64.el, dsssl.el, font.el, images.el, md5.el, mm.el:
--Updated copyrights/addresses
-
-Tue Oct  8 14:56:22 1996  William M. Perry  <address@hidden>
-
-* w3-display.el: Tables now default to having no border
-
-* w3-forms.el: Require w3-vars so Gnus will work
-
-* w3-vars.el: Created version 3.0.24
-
-* w3-speak.el:
-Added a few patches from raman and the latest version of emacspeak -
-everything appears to work out of the box now.
-
-* w3-style.el:
-Added in a few autoloads for getting emacspeak to work right out of the box.
-
-* w3-display.el: Added back in the :help-echo stuff on widgets
-
-Mon Oct  7 18:09:17 1996  William M. Perry  <address@hidden>
-
-* w3-display.el:
-<isindex> works again.  Automatically turns off filladapt-mode now,
-since we apparently don't play well together.
-
-* default.css: Added some margins
-
-* w3-display.el: Fix for emacs 19
-
-Fri Oct  4 17:08:51 1996  William M. Perry  <address@hidden>
-
-* dsssl.el:
-Fixed a few errors in calling w3-dsssl-check-args.  Now _EVERYTHING_
-compiles cleanly.
-
-* docomp.el: Added a few more variables to the 'expected-to-be-free' list.
-Everything but dsssl.el compiles cleanly now.
-
-* url-news.el: Fixed a few typos that resulted in free variable references.
-
-* w3-display.el: New function w3-make-face to 'do the right thing' in
-Emacs/XEmacs/Emacs-with-no-X-support.
-Implemented margin-left and margin-right.
-Fixed a few problems with runaway or insufficient application of styles.
-
-Mon Sep 30 19:43:35 1996  William M. Perry  <address@hidden>
-
-* url-hash.el:
-Nasty hack to fix the   !! error (("file \"cl-extra\" didn't define 
\"gethash\"")) stuff people are seeing under Emacs-19
-
-* w3-vars.el: Created version 3.0.23
-
-* w3-prefs.el: Updates for new widget package
-
-* w3-display.el:
-No more recursion!  Lots more shit broke though.  Lists are totally broken.
-
-* w3.el: Updates for new widget package
-
-* w3-keyword.el: *** empty log message ***
-
-Sun Sep 29 21:26:47 1996  William M. Perry  <address@hidden>
-
-* widget.el, widget-edit.el: Updated to version 0.99 of the library
-
-* widget-edit.el: Allow the :help-echo widget stuff to be a symbol
-
-* w3.el: More updates for the latest widget package
-
-* w3-sysdp.el: New functions prepend-text-property, append-text-property,
-fillin-text-property
-
-* default.css, url.el: *** empty log message ***
-
-Wed Sep 25 10:53:08 1996  William M. Perry  <address@hidden>
-
-* dist.Makefile: Removed custom.el and custom-edit.el from the distribution.
-
-Tue Sep 24 05:04:47 1996  William M. Perry  <address@hidden>
-
-* w3-vars.el: Created version 3.0.22
-
-* widget.el, widget-edit.el: Updated to latest widget stuff from Per.
-
-* w3-parse.el:
-Added <script> to %body.content so that stupid IE 3.0 demo pages would work.
-
-* w3-keyword.el:
-Added some new keyword defs to get rid of compile-time warnings
-
-* w3-forms.el, w3-display.el: Now works with newest widget stuff
-
-* url.el: New function url-parse-query-string, to return an assoc list of name
-value pairs from a URL-style query. url-unhex-string now takes an
-optional second argument for whether to allow decoding of newlines or
-not.
-
-* url-mail.el:
-Now understands netscape-style 'extensions' to the mailto: specifier.
-ie: mailto:wmperry?subject=thesubject&bcc=root
-
-* font.el:
-Now always converts to points instead of pixels, seems to give better
-results this way.
-
-Mon Sep 23 04:53:56 1996  William M. Perry  <address@hidden>
-
-* w3-vars.el: Created version 3.0.20
-
-* dsssl.el: Made dsssl depend on url-hash
-
-Sun Sep 22 05:16:06 1996  William M. Perry  <address@hidden>
-
-* w3-display.el, w3-parse.el: *** empty log message ***
-
-* w3-display.el: Some spacing changes, fix for nested lists
-
-* custom.el, widget-edit.el, widget.el: -
-
-* custom-edit.el: *** empty log message ***
-
-Fri Sep 20 05:07:12 1996  William M. Perry  <address@hidden>
-
-* w3-vars.el: Created version 3.0.19
-
-* w3-display.el: *** empty log message ***
-
-* w3-sysdp.el: Added in stub for set-keymap-parents
-
-* w3-speak.el: Patches from raman
-
-* w3-prefs.el, w3-imap.el: *** empty log message ***
-
-* w3-hot.el: Fixed w3-read-html-bookmarks to work with some parser changes.
-
-* w3-forms.el: Made forms work again.
-
-* w3-display.el: Changed how the borders on tables are drawn.
-Added back in the voice support.
-
-Thu Sep 19 05:12:49 1996  William M. Perry  <address@hidden>
-
-* w3-vars.el: Created version 3.0.18
-
-* dist.Makefile:
-Moved the URL and W3 packages back into one big distrubtion again
-
-* w3-vars.el: Created version 3.0.18
-
-* w3-vars.el: Created version 3.0.19
-
-* w3-display.el: Don't crap out on tables with 0 columns
-
-* docomp.el, url.el: *** empty log message ***
-
-Wed Sep 18 12:50:03 1996  William M. Perry  <address@hidden>
-
-* w3-vars.el: Created version 3.0.18
-
-* docomp.el: *** empty log message ***
-
-* w3-display.el: Space filling fixes
-
-* w3-auto.el: Added autoload for w3-style-post-process-stylesheet
-
-Tue Sep 17 12:50:47 1996  William M. Perry  <address@hidden>
-
-* w3-vars.el: Created version 3.0.16
-
-* w3-display.el, w3-e19.el: *** empty log message ***
-
-Mon Sep 16 04:46:18 1996  William M. Perry  <address@hidden>
-
-* custom-edit.el, custom.el, widget-edit.el, widget-example.el, widget.el:
-Initial revision
-
-Sun Sep 15 22:47:53 1996  William M. Perry  <address@hidden>
-
-* w3-vars.el: Created version 3.0.15
-
-* w3-display.el: Alignment stuff works (right, left, full, center).
-Tables can now be borderless, and if it has borders, they are all there.
-<pre>/<xmp> work.
-
-* url-vars.el: Created version 1.0.42
-
-* url-http.el: *** empty log message ***
-
-* w3-vars.el: Created version 3.0.14
-
-* html32.dsl: Initial revision
-
-* w3.el: Use the new display code.
-
-* w3-forms.el: A few changes for the latest display code
-
-* w3-vars.el: Created version 3.0.14
-
-* w3-display.el: Actually mostly works
-
-* w3-parse.el: Removed hooks into the old display engine
-
-* url.el: *** empty log message ***
-
-* w3-speak.el: Update from raman
-
-* url.el: *** empty log message ***
-
-Sat Sep 14 16:48:24 1996  William M. Perry  <address@hidden>
-
-* url-gopher.el, url.el:
-Added '...' to the downloading messages so that they do not show up in
-the message log buffer under Emacs 19.xx
-
-* w3-parse.el: Changed content-model of <script> to fix problems on some sites
-(notably netscape's) that use an unescaped </ in the script.  BAD SGML
-DAMMIT.
-
-Fri Sep 13 05:24:53 1996  William M. Perry  <address@hidden>
-
-* w3-vars.el: Created version 3.0.13
-
-* w3-forms.el: Use the new :ignore-case stuff for choice items
-
-Thu Sep 12 05:57:47 1996  William M. Perry  <address@hidden>
-
-* w3-display.el: Holy shit tables work.
-
-Tue Sep 10 03:11:55 1996  William M. Perry  <address@hidden>
-
-* w3-speak.el: Bug-fixes from raman.
-
-Mon Sep  9 05:18:37 1996  William M. Perry  <address@hidden>
-
-* dsssl.el:
-Removed a few compiler warnings and fixed a few bugs (equal, error, time
-
-* dsssl.el:
-DSSSL (define ...)'d functions are now called correctly.  Wow.  Added
-in most of the rest of the DSSSL(o) application profile functions.
-
-* dsssl.el: Initial revision
-
-* w3-parse.el: *** empty log message ***
-
-* w3-about.el, w3-annotat.el, w3-draw.el, w3-e19.el, w3-emulate.el, 
w3-forms.el, w3-hot.el, w3-imap.el, w3-keyword.el, w3-menu.el, w3-mouse.el, 
w3-mule.el, w3-prefs.el, w3-print.el, w3-speak.el, w3-style.el, w3-toolbar.el, 
w3-vars.el, w3-widget.el, w3.el, w3-xemac.el, images.el:
-Changed copyright assignment
-
-* font.el: changed copyright assignment
-
-Sun Sep  8 00:31:52 1996  William M. Perry  <address@hidden>
-
-* w3-draw.el:
-Added in a stub handler for the 'frame' tag, so that you can still get
-to frame pages written by idiots who don't use a decent 'noframe'
-subdocument.
-
-* url.el: Removed nntp-after-change-function, since it screwed up GNUS
-
-Sat Sep  7 01:45:17 1996  William M. Perry  <address@hidden>
-
-* w3-latex.el: updated email address for stephen peters
-
-Wed Sep  4 02:09:08 1996  William M. Perry  <address@hidden>
-
-* socks.el: Initial revision
-
-Sun Sep  1 16:22:50 1996  William M. Perry  <address@hidden>
-
-* w3-draw.el: Don't load images on a TTY device in XEmacs.  General speedup
-
-Thu Aug 29 04:09:40 1996  William M. Perry  <address@hidden>
-
-* w3-vars.el: Created version 3.0.12
-
-Sun Aug 25 17:12:32 1996  William M. Perry  <address@hidden>
-
-* w3-draw.el: Added some stubs for tables
-
-Mon Aug 19 03:30:47 1996  William M. Perry  <address@hidden>
-
-* w3.el: fixed bug in w3-insert-formatted-url
-
-Mon Aug 12 03:10:30 1996  William M. Perry  <address@hidden>
-
-* w3-style.el: Don't make a null voice of paul-5555 if no stuff is specified.
-
-* default.css: Added speech elements to the default stylesheet.
-
-Sun Aug 11 16:41:58 1996  William M. Perry  <address@hidden>
-
-* w3-vars.el: Created version 3.0.11
-
-* font.el:
-Fix for font-default-font-for-device under XEmacs when you use a font
-like '10x20' instead of the fully specified version
-
-Sat Aug 10 16:14:08 1996  William M. Perry  <address@hidden>
-
-* w3-forms.el:
-Do not encode the '.' in application/x-www-form-urlencoded.  Fucking
-netscape compatbility.  What _SPEC_?!  There aren't any specs on the
-web, right?!
-
-* w3-forms.el:
-Fixed problem with submissions of a form with the exact same arguments
-causes elements from both form to be submitted.  ack.
-
-Tue Aug  6 14:03:52 1996  William M. Perry  <address@hidden>
-
-* w3-parse.el:
-fixed stupid mistake in DTD I made when changing to 3.2 DTD - left
-'style' out of head's content-model so no in-document stylesheet stuff
-was getting parsed.  gack.
-
-* w3-forms.el: No longer put a 'choose' in front of option menus
-
-* w3-speak.el: fixed bugs
-
-Mon Aug  5 14:03:09 1996  William M. Perry  <address@hidden>
-
-* w3-vars.el: Created version 3.0.10
-
-* default.css: A few mild changes, and docs.
-
-Sun Aug  4 23:51:26 1996  William M. Perry  <address@hidden>
-
-* w3-speak.el: new version of w3-speak from raman
-
-* w3-draw.el: Style search alg. now looks for tag/id|name first.  Now supports
-inlined 'style' keyword on any tag.  Gack *sigh*
-
-* w3-style.el:
-Can now have periods in class names.  Fixed bug where the class would
-be normalized to lowercase as well as the tag name.  BAD BAD BAD.
-
-* w3-speak.el: some changes from raman
-
-* w3-style.el: Think I finally fixed some stylesheet weirdness
-
-* w3.el: Don't override user prefs w/w3-user-colors-take-precedence -duh
-
-* w3-parse.el: fixed graphical entities
-
-Sat Aug  3 20:09:50 1996  William M. Perry  <address@hidden>
-
-* w3-vars.el:
-Added textual representation of the 'artist formerly known as prince'
-graphical icons
-
-* md5.el: removed /bin/sh dependency in md5
-
-Fri Aug  2 14:08:38 1996  William M. Perry  <address@hidden>
-
-* url-vars.el: Created version 1.0.41
-
-* url.el:
-no longer special case file:// urls when checking for no_proxy - thats
-just stupid.
-
-Thu Aug  1 13:32:54 1996  William M. Perry  <address@hidden>
-
-* w3-vars.el: Created version 3.0.9
-
-* url.el: made url-insert-file-contents  interactive
-
-* w3-sysdp.el:
-added data-directory to sysdep version of x-library-search-path for
-emacs under windows 95/nt
-
-* w3-vars.el:
-Implemented &prince; and &princesymbol; graphical entities.  Thanks
-for the note Jamie Z!
-
-* w3-forms.el: fix for gopher searches
-
-* w3-draw.el: Added support for balloon-help
-
-Fri Jul 26 05:57:21 1996  William M. Perry  <address@hidden>
-
-* w3-display.el, w3-texinfo.el: Initial revision
diff --git a/ChangeLog.1 b/ChangeLog.1
index cefd32b..331ad92 100644
--- a/ChangeLog.1
+++ b/ChangeLog.1
@@ -1,468 +1,5142 @@
-Fri Jul 26 05:57:21 1996  William M. Perry  <address@hidden>
+1999-11-28  Andreas Jaeger <address@hidden>
 
-       * w3-display.el, w3-texinfo.el: Initial revision
+* lisp/w3-menu.el (w3-menu-install-menus): Check major-version and
+  minor-version in our menu code, otherwise Emacs 20.28 will not get menus
+  installed.
 
-       * w3-parse.el: *** empty log message ***
+1999-11-21  William M. Perry  <address@hidden>
 
-       * w3-hot.el: Should now be able to handle XMosaic style hotlist files
+* lisp/url.el: Removed netrek, gopher, and NFS URL handlers.
 
-       * w3-parse.el:
-       Added some HTML 3.2 stuff, reorged some of the content-models, et. c
+1999-11-20  William M. Perry  <address@hidden>
 
-       * w3-draw.el: few fixes to the title handling.
-       don't display any text outside the <html></html> area
+* lisp/url-news.el (url-news): Unhex article references, since netscape is
+  so dumb that they escape a '@' in an explicit article reference, which
+  is SUPPOSED TO BE HOW YOU TELL IT FROM A NEWSGROUP.  Lame.
+  (url-nntp): Ditto.
 
-       * w3-style.el:
-       Changes to w3-style-parse-css to gracefully ignore <!-- and --> in a
-       stylesheet, for those losers who insist on using SGML comments to hide
-       the <style> tag from stupid browsers.
+* lisp/url-ldap.el (url-ldap-certificate-formatter): Make sure we require
+  ssl before calling any of the functions.
 
-       * w3-parse.el:
-       Changed the content model of the <style> tag to CDATA so that idiots
-       who want to hide the style information from stupid old browsers by the 
absolutely braindead use of comments (<!-- ... -->) can.  *sigh*
+* lisp/w3-display.el (w3-insert-terminal-char): Nuke the 'face' property
+  on any inserted terminal characters, or we can get bold/red/etc table
+  borders - looks kind of odd.
 
-Thu Jul 25 05:00:55 1996  William M. Perry  <address@hidden>
+1999-11-14  William M. Perry  <address@hidden>
 
-       * w3-style.el: Fixed stupid bug in :device: handling
+* lisp/w3-display.el (w3-resurrect-hyperlinks): Skip over whitespace at
+  the beginning of hyperlinks, so mouse highlighting looks better.
+  (w3-resurrect-hyperlinks): Look for next property change from 'nd'
+  instead of 'st' - you cannot have overlapping hyperlinks, so this saves
+  quite a few iterations through the loop.
+  (w3-display-table): Nuke the w3-hyperlink-info text property on inserted
+  text.  This fixes a bug under XEmacs where hyperlinks in tables could
+  get _really_ confused when portions of the row needed to be filled -
+  hyperlinks would flow WAY past their end, and into the next row.
 
-Tue Jul 23 00:40:54 1996  William M. Perry  <address@hidden>
+* Emacs/W3 4.0.46 released
 
-       * w3-keyword.el: more keywords for speech stuff
+* aclocal.m4 (AC_EMACS_LISP): work around bug in current Emacs 21.1
+  pretests where (princ "foo") crashes in batch mode.
 
-       * docomp.el: *** empty log message ***
+1999-11-13  William M. Perry  <address@hidden>
 
-       * w3-draw.el:
-       Beginnings of support for the new and improved fucked up netscapism
-       <spacer> tag
+* lisp/w3-cus.el (w3-use-terminal-glyphs): Changed default value to nil,
+  was causing too many weirdnesses under Emacs (I loathe MULE sometimes)
+  (w3-use-terminal-characters): Ditto.
 
-       * url.el: fix for no_proxy checking for local files
+* lisp/w3-display.el (w3-display-handle-java): Duh, give 2 arguments to
+  push.
 
-Mon Jul 22 03:22:52 1996  William M. Perry  <address@hidden>
+1999-11-12  William M. Perry  <address@hidden>
 
-       * w3-sysdp.el:
-       added stub for make-local-hook - more Emacs 19.2x lossage.
+* lisp/w3-display.el (w3-display-handle-java): Make sure that there is
+  ALWAYS a codebase attribute for java, or bad things could happen (like
+  not being able to find the classes since we write to a temp file, etc.)
 
-       * w3-forms.el:
-       always encode hex strigs into uppercase for stupid broken fucking
-       braindead forms decoders!!!
+* lisp/w3-parse.el (w3-parse-buffer): Make sure that we expand the
+  'codebase' attribute.
 
-Sun Jul 21 20:10:42 1996  William M. Perry  <address@hidden>
+* lisp/w3-display.el (w3-auto-run-java): New variable to control whether
+  Java applets are run 
+  (w3-display-handle-java): New function to convert our internal parse
+  structure into something that `w3-java-run-applet' can understand.
+  (w3-display-node): Use it.
 
-       * url-vars.el: Created version 1.0.40
+* lisp/w3-java.el: New file for running java programs in an external
+  process.
 
-       * w3-vars.el: Created version 3.0.8
+1999-11-07  Markus Rost  <address@hidden>
 
-       * w3.txi: fixed a few compilation errors in w3.txi
+* lisp/url.el (url-retrieve-internally): make-local-variable
+  'track-mouse to workaround problem with `widget-button-click'.
 
-       * w3.txi:
-       Revamped a few nodes, removed the downloading/compiling notes, and
-       documented url-proxy-services and improved the proxy section in
-       general.
+1999-11-10  William M. Perry  <address@hidden>
 
-       * w3-hot.el: Should now auto-recognize HTML bookmark files
+* lisp/w3-parse.el (textarea content model): Changed content model to
+  XCDATA so that markup can be included in the default text.
 
-       * font.el: Allow a font to have a size like "+12pt"
+* lisp/w3-menu.el (w3-menu-help-menu): Remove version information menu
+  item.  It hasn't been updated in years.
 
-       * w3-draw.el:
-       Now handles <font face="xxxx"> ala Internet Exploiter and Nutscrape
+1999-11-10  "T. V. Raman" <address@hidden>
 
-       * w3.el: Added function for reloading all stylesheets
+* lisp/w3-display.el (widget-convert-text): Added advice around this
+  function to preserve the 'personality' text property, otherwise
+  hyperlinks did not get the correct aural properties applied.
 
-       * w3-menu.el:
-       Added option to the 'style' menu for reloading stylesheets
+1999-11-10  Thierry Emery <address@hidden>
 
-       * w3-forms.el:
-       fixed problem with dropwon menus with the same 'value' would show the 
first item with that value, not necessarily the one the user selected.
+* lisp/w3-display.el (w3-maybe-start-image-download): typo.
+  (w3-handle-image): include row and column in hyperimage-info, to be used
+  in `w3-resurrect-images'.
+  (w3-resurrect-images): if `to-cut' gets negative, insert blanks.
+  (w3-display-node): in case of a frameset, checks rows as well.
+  (w3-frameset-dimensions-p): disregard anything containing "100%", such as
+  "100%,0".
+  (w3-display-frameset): Do not zap frameset-cardinal when computing
+  default dimensions. Memorize next window before drawing a frame, as its
+  HTML page may contain yet another (nested) frameset. Call `w3-warn' and
+  inhibit splitting the window when there is not enough room left.
 
-       * w3-widget.el: w3-follow-inlined-image works again
+* lisp/mm.el (mm-parse-mailcap): Fix bad regexp for Emacs 21
 
-       * w3-draw.el, w3-keyword.el, w3-menu.el, w3-vars.el, w3-xemac.el, w3.el:
-       You can now load delayed images
+1999-11-09  William M. Perry  <address@hidden>
 
-       * url.el:
-       In url-after-change-function, don't change buffers if its been killed.
+* build.bat: Make sure to build custom load files and info files.
 
-Sat Jul 20 05:15:06 1996  William M. Perry  <address@hidden>
+* lisp/url-auth.el (url-register-auth-scheme): removed warning when
+  replacing auth methods.
 
-       * w3.txi: Removed 16-bit windows section.
-       removed programming interface chapter.
-       fixed Gnus accessing function docs.
-       added pointer to browse-url-browser-function.
-       removed docs of w3-delimit-emphasis / w3-delimit-links.
+* lisp/url-file.el (url-file): Honor port numbers in ftp URLs.
 
-       * w3-forms.el:
-       If a form has an invalid encoding type, issue a warning about the bad
-       html and the fall back on application/x-www-form-urlencoded
+1999-11-09  James LewisMoss  <address@hidden>
 
-       * w3-style.el:
-       @import no longer causes a 'buffer-modified, kill it anyway?' question.
-       newer CSS font shorthand supported.
-       split the font-family on commas, not spaces, ala newer CSS.
+* lisp/mm.el (mm-parse-mailcap): Fix invalid regular expressions caused by
+  entries like "text/x-c++"
 
-       * font.el: A few changes to the default font-family-mappings
+1999-11-09  Andrew Mazillius  <address@hidden>
 
-       * w3-draw.el:
-       Allow global document stuff to be specified on the 'body' tag as well
-       as the 'html' tag.
+* lisp/socks.el (socks-nslookup-host): Make sure that we always call
+  accept-process-output at least once.  Now deals correctly with multiple
+  addresses returned by nslookup in the format 'Addresses: ip1, ip2, ip3'
 
-Fri Jul 19 04:39:08 1996  William M. Perry  <address@hidden>
+1999-11-09  address@hidden (Kyotaro HORIGUCHI)
 
-       * url-vars.el: Created version 1.0.39
+* lisp/mule-sysdp.el: Patches to understand MULE 4.1
 
-       * w3-vars.el: Created version 3.0.7
+1999-11-09  Alexandre Guimond  <address@hidden>
 
-Thu Jul 18 14:20:20 1996  William M. Perry  <address@hidden>
+* lisp/w3.el (w3-mail-document-author): Fix problem with 'Reply-To'
+  headers.  They had not been converted to the (not quite so) new plist
+  format.
 
-       * default.css:
-       moved monospaced font declaration for pre/xmp into the :xemacs: section
+1999-10-15  Dave Love  <address@hidden>
 
-       * url-vars.el: duh - make url-current-server buffer local.
+* lisp/w3-parse.el (char-int): Alias it to `identity' if necessary.
 
-Tue Jul 16 02:49:55 1996  William M. Perry  <address@hidden>
+1999-10-14  William M. Perry  <address@hidden>
 
-       * w3-latex.el: Lots of patches from stephen peters.
-       * Fix to backslash handling code so that it works.
+* lisp/url-ldap.el (url-ldap-certificate-formatter): Now uses
+  ssl-certificate-information instead of hacked up bill-specific stuff.
 
-       * Fix to ~ (very important, that) so that it generates a
-         `\textasciitilde', since in a <tt> environment the previous call
-         would work incorrectly.  Similar fix for ^ characters.
+* lisp/ssl.el (ssl-certificate-information): New function to get
+  certificate information out of a DER encoded object.
+  (ssl-program-name): Default to using OpenSSL now.
 
-       * For carriage returns in a verbatim environment, use `\newline'
-         instead of `\ '.  Also adds a \nullspace command for use in <pre>
-         environments, since the existing code for <pre> tended to eat
-         leading whitespace without it.
+1999-10-11  William M. Perry  <address@hidden>
 
-       * Use `\newline' instead of `\linebreak', since \linebreak tries to
-         justify the line out to the text width.
+* lisp/w3-display.el (w3-fixup-eol-faces): only strip spaces off of
+  newlines, not the surrounding shitepsace.  This makes colorized table
+  cells look much better.
 
-       * Added `\batchmode' call at the beginning of the generated LaTeX, to
-         force attempted recovery of any errors.
+1999-09-16  Michael Sperber [Mr. Preprocessor]  <address@hidden>
 
-       * Added calls to not indent paragraphs and skip lines between
-         paragraphs.  I'm not sure whether I like this better or not, but I
-         figured that most HTML browsers currently use that formatting.  This
-         should be changed once stylesheets are working nicely, to use
-         whatever's specified in the stylesheet for LaTeX.
+* lisp/url-cache.el: 
+* lisp/w3-display.el: 
+* lisp/w3.el: Added (require 'url-parse) because of the macros
+  defined there.
 
-Mon Jul 15 17:33:19 1996  William M. Perry  <address@hidden>
+1999-08-07  Bob Weiner  <address@hidden>
 
-       * w3-draw.el:
-       tty-closest-color-matching now works for netscape-style color crap as
-       well as stylesheet stuff
+* w3-menu.el (w3-menu-make-xemacs-menubar): Fixed to work with
+  BeOpen.com InfoDock.  Old code allowed multiple 'nil's to creep into the 
+  menubar which would cause a hang in the XEmacs menubar code.
 
-       * w3-parse.el, w3-xemac.el:
-       anal retentive patch for mispelling in comments
+1999-08-04  William M. Perry  <address@hidden>
 
-Sat Jul 13 22:47:21 1996  William M. Perry  <address@hidden>
+* lisp/url-cid.el (url-cid-gnus): Fixed so it will work in Emacs and
+  XEmacs 21.2
 
-       * w3.el:
-       w3-echo-link stuff is now handled in the new widget-motion-hook 
variable.
+1999-08-03  William M. Perry  <address@hidden>
 
-       * w3-draw.el:
-       w3-echo-link stuff is now handled in the new widget-motion-hook 
variable.
-       when following a link, its color is changed correctly.
+* lisp/mule-sysdp.el (mule-sysdep-version): Make
+  enable-multibyte-characters buffer-local when in XEmacs, to better mimic 
+  the Emacs 20.x behaviour.
 
-Fri Jul 12 06:10:02 1996  William M. Perry  <address@hidden>
+1999-07-19  William M. Perry  <address@hidden>
 
-       * url.el:
-       Only match against the hostname in the URL for the no_proxy checking
+* lisp/images.el (image-register-netpbm-utilities): Fixed typo in the ppm
+  to xpm converter.
 
-       * w3-style.el: fixed problem parsing class attributes in CSS
+1999-06-27  William M. Perry  <address@hidden>
 
-       * url-hash.el: removed old aliases for w3-*hash functions
+* lisp/url-parse.el (url-generic-parse-url): Added in gross hack to
+  preserve ';' in data URLs.  The usage as a separator for content-type
+  and encoding-type clashes horribly with the ';' as an
+  attribute-separator on normal URLs.
 
-       * w3-style.el: *** empty log message ***
+* lisp/w3-parse.el (w3-parse-hooks): New hook to be run just before
+  parsing any document.  This can theoretically be used to rip out banner
+  advertisements, etc.
+  (w3-parse-munge-ethiopic-text): Moved the old ethiopic munging stuff
+  into hook form.
 
-Thu Jul 11 18:00:20 1996  William M. Perry  <address@hidden>
+* lisp/url-mail.el (url-mailto): Allow adding of more 'to' headers via the 
+  query interface for mailto URLs.  Would generate corrup To: headers
+  otherwise.
 
-       * w3-style.el: deal gracefully with device-bitplanes returning nil
+1999-06-15  William M. Perry  <address@hidden>
 
-       * w3-style.el:
-       You can now use a :speech: device section in a CSS stylesheet
+* lisp/url-ldap.el (url-ldap-attribute-formatters): Format naming contexts 
+  as hyperlinks back into the directory.
+  (url-ldap-certificate-formatter): Save certificate data to a file.
 
-       * w3-sysdp.el:
-       version of valid-color-name-p and device-class for the OS/2
-       presentation manager.
+1999-04-29  William M. Perry  <address@hidden>
 
-       * w3-e19.el: Some OS/2 hacks
+* lisp/font.el (font-find-available-family): Fixes for latest version of
+  the new Emacs redisplay.
 
-       * url.el, url-file.el: handle : in filenames gracefully
+1999-04-08  William M. Perry  <address@hidden>
 
-       * w3-draw.el:
-       sanity check the fill-prefix before setting it, and issue a warning if
-       list indentation tries to overflow the right window margin.
+* Emacs/W3 4.0.43 released
 
-       * url-vars.el: Created version 1.0.38
+* Fixed the hackmap stuff for Emacs 19/20
 
-       * w3-vars.el: Created version 3.0.6
+1999-04-08  Thierry Emery <address@hidden>
 
-Wed Jul 10 23:50:10 1996  William M. Perry  <address@hidden>
+* lisp/url-cookie.el (url-cookie-write-file): check
+  `url-cookies-changed-since-last-save' and that the file is writable.
+  (url-cookie-handle-set-cookie): set `url-cookies-changed-since-last-save'.
 
-       * w3-draw.el: fixed problem with emacspeak
+* lisp/url-http.el (url-create-mime-request): Moved Proxy Authorization up
+  (before Cookie and Authorization).
 
-       * default.css: *** empty log message ***
+* lisp/url-vars.el (url-cookies-changed-since-last-save): new variable.
 
-       * dist.Makefile: fixed install target - duh
+* lisp/url.el (url-write-global-history): call `url-cookie-write-file' if
+  `url-privacy-level' tolerates cookies.
 
-       * url-irc.el: fixed bad variable name
+1999-04-08  Thierry Emery <address@hidden>
 
-       * mm.el: require cl to avoid stupid compiler errors
+* lisp/w3-display.el (w3-resurrect-images): corrected regexp for
+  removing trailing blanks from alt.
 
-       * w3.el: some more mule fixing
+1999-04-05  William M. Perry  <address@hidden>
 
-       * url.el: new function url-remove-compressed-extensions
+* lisp/w3-forms.el (w3-form-keymap): Ditto for form fields.
 
-       * w3.el: remove compression extensions from default save-as filenames
+* lisp/w3-display.el (w3-resurrect-hyperlinks): Hack around lossage in
+  XEmacs' Widget package.  button3 was used to activate the widget instead
+  of popping up a context-sensitive menu like everywhere else.
 
-       * url-vars.el: *** empty log message ***
+1999-04-03  William M. Perry  <address@hidden>
 
-       * w3.el:
-       fixed w3-save-binary-file to set initial-contents on the call to
-       read-file-name
+* lisp/w3-display.el: Make sure we load mule-sysdp at compile time.
 
-       * mm.el: *** empty log message ***
+1999-04-03  Thierry Emery  <address@hidden>
 
-       * w3-hot.el: fixed problem with w3-hotlist-add-document-at-point
+* lisp/url-file.el (inline): require `w3-sysdp', necessary for
+  `add-minor-mode' in Gnu Emacs when Emacs-W3 is autoloaded through
+  `url-dired-find-file'.
+  (url-insert-possibly-compressed-file): set `url-current-mime-encoding'.
+  (url-dired-find-file): handle ange-ftp dired.
+  (url-file-asynch-callback, url-file): call
+  `url-insert-possibly-compressed-file' instead of
+  `insert-file-contents-literally'.
+  (url-file): compute `url-current-mime-type' and `viewer' from
+  `uncompressed-filename'; specify extension for
+  `mm-generate-unique-filename'.
 
-       * w3-parse.el: Fix for mule and character entities > 127
+* lisp/url.el (url-file-directly-accessible-p): call
+  `url-host-is-local-p' and check that the file is not compressed.
+  (url-generate-unique-filename-counter): new variable.
+  (url-generate-unique-filename): use
+  `url-generate-unique-filename-counter' to ensure that filenames are
+  unique within an Emacs session.
 
-       * url-cookie.el, url-vars.el:
-       can now control when/how/if an HTTP cookie is accepted
+1999-04-03  Thierry Emery  <address@hidden>
 
-       * w3-draw.el:
-       fixed mysterious problem of stylesheet formatting info not working
-       correctly the first time a tag was seen.  *dumb* mistake on my part.
+* lisp/url.el (url-write-global-history): call
+  `w3-write-explicit-encodings'.
 
-Tue Jul  9 21:01:15 1996  William M. Perry  <address@hidden>
+* lisp/w3-cus.el (w3-explicit-encodings-file): new user option, which
+  specifies where to save `w3-explicit-conversion-tree'.
 
-       * w3-sysdp.el: added more overlay functions
+* lisp/w3-vars.el: new variables
+  w3-explicit-conversion-tree: Tree to hold explicit coding systems
+  for URLs and their superdirs:
+  ((hostN default-coding (dirN-1 default-coding (dirN-1-1 ...) ...) ...)
+    ...),
+  w3-explicit-encodings-changed-since-last-save: whether
+  `w3-explicit-conversion-tree' needs saving.
 
-       * w3-vars.el: Created version 3.0.5
+* lisp/w3.el:
+  w3-convert-code-for-mule: call `w3-recall-explicit-coding-system'
+  after checking `w3-explicit-coding-system' and `mmcharset'.
+  w3-reload-document: call `w3-record-explicit-coding-system'.
+  w3-recall-explicit-coding-system, w3-find-explicit-coding-system,
+  w3-record-explicit-coding-system, w3-add-explicit-coding-system,
+  w3-write-explicit-encodings: new functions to perform retrieval and
+  storage of user-specified (through C-u g `w3-reload-document')
+  explicit coding systems.
+  w3-do-setup: load `w3-explicit-encodings-file' if it exists.
 
-       * url-vars.el: Created version 1.0.37
+1999-03-24  William M. Perry  <address@hidden>
 
-       * url-vars.el, mm.el, w3.el: *** empty log message ***
+* Emacs/W3 4.0.40 released
 
-       * dist.Makefile:
-       Now uses 'install' to do the copying around, instead of trying to fake 
it.
+* lisp/url.el (url-do-setup): Always register the LDAP URL format.
 
-       * dist.Makefile: *** empty log message ***
+* lisp/url-ldap.el (url-ldap): Deal with non-LDAP enabled emacsen better.
 
-       * font.el:
-       Require disp-table so that display table stuff is loaded (apparently
-       XEmacs 19.13 didn't autoload or dump it - *sigh*)
+1999-03-22  Markus Rost <address@hidden>
 
-       * url.el: autoload url-nfs
+* lisp/w3.el (w3-fetch): Gracefully accept 'nil' as the URL.
 
-       * dist.Makefile: No longer mention THIS-IS-VERSION-XX in the makefile
+1999-03-22  Martin Schwenke <address@hidden>
 
-       * url-http.el, w3.el: *** empty log message ***
+* lisp/w3-sysdp.el (frame-parameter): This was not defined in 19.34.
 
-       * mm.el: Fixed mm-save-binary-file
+1999-03-19  William Perry <address@hidden>
 
-       * w3.el: Fixed w3-save-binary-file
+* lisp/w3-parse.el (w3-parse-buffer): Make sure we restore the old syntax
+  table when we are done parsing.
 
-       * w3.el, w3-speak.el, w3-style.el, w3-draw.el:
-       voices-via-stylesheet fixes
+1999-03-18  Kenichi Handa <address@hidden>
 
-       * dtk-css-speech.el: Initial revision
+* lisp/w3.el (w3-viewer-filter): Do not create the 'output' buffer if the
+  length of the string received by the filter is 0.  Evidently solaris
+  sends an empty string to the filter when the process exits.
 
-       * url-vars.el: fix for mule stuff Emacs vs. XEmacs
+1999-03-18  "T. V. Raman" <address@hidden>
 
-       * w3-forms.el: wais submissions work again
+* lisp/w3-display.el (w3-widget-echo): Use buffer-substring --rather than
+  buffer-substring-no-properties when picking out the text under the
+  current link. 
 
-       * url-wais.el: *** empty log message ***
+  This is good for emacspeak because you can then tell while
+  tabbing through a  page whether the link you just hit has
+  been visited.
 
-       * url.el: turn off url-download-minor-mode stuff
+1999-01-08  William M. Perry  <address@hidden>
 
-       * w3-print.el:
-       fix problem with ps-print and forms printing (read-only text)
+* lisp/docomp.el (emacs-build-autoloads): Only do the autoloads one way
+  for Emacs or XEmacs.
 
-Sun Jul  7 22:04:07 1996  William M. Perry  <address@hidden>
+1999-01-07  William M. Perry  <address@hidden>
 
-       * w3-vars.el: Created version 3.0.4
+* build.bat: More tweaking of finding EMACSDIR automatically.
 
-       * w3-forms.el: <input type=radio checked> works now
+* lisp/w3-vars.el (w3-mode-map): Don't use read-kbd-macro
 
-       * w3-forms.el: Radio buttons work again.  *sigh*
+1999-01-05  William M. Perry  <address@hidden>
 
-Thu Jul  4 16:32:06 1996  William M. Perry  <address@hidden>
+* build.bat: Make sure that we build the autoload files under windows.
+  Easier setting of the environment variables.  Also can now pass in
+  EMACSDIR on the command line.
 
-       * w3-draw.el: Let stylesheets handle the w3-delimit-links stuff
+* lisp/docomp.el (byte-compile-dest-file): Downcase file names if we are
+  in windows of any flavor.  Sometimes we get foo.EL instead of foo.el and 
+  we were just naming the output file foo.EL.elc
+  (compile-it): Make sure we get *.EL from directory-files as well.
+  (emacs-build-autoloads): Ditto.  address@hidden windows file systems.
+  (emacs-build-autoloads): Deal with Emacs or XEmacs way of rebuilding
+  autoloads in lisp instead of relying on autoconf.  This will make
+  everything much happier under windows.
 
-Mon Jul  1 15:42:21 1996  William M. Perry  <address@hidden>
+1999-01-04  William M. Perry  <address@hidden>
 
-       * w3-vars.el: Created version 3.0.3
+* Makefile.in (dotemacs): Wrap the require we stick into $(DOTEMACS) in a
+  `condition-case' for people that share their setups between emacsen or
+  machines with different installed packages.
 
-       * w3-sysdp.el: Added stub for buffer-substring-no-properties
+* lisp/w3-forms.el (w3-form-encode-xwfu): Don't forget to deal with the
+  new attributes if we are doing just a plain old form submission!
 
-       * w3-menu.el:
-       Do not use menus under Emacs 19.28 - they are broken / incompatible
-       with that version of easymenu
+1999-01-04  Milan Zamazal <address@hidden>
 
-       * w3-sysdp.el: Fix to device-or-frame-type to work under Emacs 19.28
+* lisp/w3-forms.el (w3-submit-form): Correctly shorten the separator
+  generated... was including too few characters.
+  (w3-form-encode-helper): Added ability to specify additional attributes
+  for the `file' input type so that we can keep track of the filename.
+  (w3-form-encode-make-mime-part): Create content-disposition header
+  instead of content-id and content-length
+  (w3-form-encode-multipart/x-www-form-data): Use CRLF instead of just LF
+  for separators.
+  (w3-form-encode-multipart/x-www-form-data): Don't forget to add in the
+  separator at the end of the message.
 
-       * w3.el: fix for set-auto-mode lossage on null buffer-file-name
+1998-01-04  William M. Perry  <address@hidden>
 
-       * w3-sysdp.el:
-       Added in stubs for plist-put and plist-get, and an Emacs 19.2x
-       specific version of facep.  everything almost works in 19.28 now.
+* lisp/w3-forms.el (w3-form-encode-multipart/x-www-form-data): Better
+  separator generation.
 
-Sun Jun 30 22:53:02 1996  William M. Perry  <address@hidden>
+1999-01-04  Laurent Martelli <address@hidden>
 
-       * w3-vars.el: Created version 3.0.2
+* lisp/w3-hotindex.el: Added autoload statements.
 
-       * w3.txi: *** empty log message ***
+1999-01-04  Kenichi Handa  <address@hidden>
 
-       * w3.el, w3-xemac.el, w3-widget.el, w3-toolbar.el, w3-sysdp.el, 
w3-style.el, w3-speak.el, w3-print.el, w3-prefs.el, w3-parse.el, w3-mule.el, 
w3-mouse.el, w3-menu.el, w3-latex.el, w3-keyword.el, w3-imap.el, w3-hot.el, 
w3-forms.el, w3-emulate.el, w3-e19.el, w3-draw.el, w3-annotat.el, w3-about.el, 
images.el, font.el, w3-vars.el:
-       Changed email address info
+* lisp/Makefile.in (w3-auto.el): Generate w3-auto.el from
+  auto-autoloads.el just build in the current directory.
 
-       * dist.Makefile: Added w3-latex.el to the dist.Makefile
+1998-12-31  William M. Perry  <address@hidden>
 
-       * w3-vars.el, default.css: *** empty log message ***
+* lisp/font.el: Various mergings with the XEmacs distributed version of
+  font.el.  Lots of byte-compile warnings squashed when not building with
+  Emacs/W3.
 
-       * font.el: final fix for font-height lossage
+1998-12-31  Jonathan Harris  <address@hidden>
 
-       * docomp.el: added menubar-visible-p
+* font.el: Split font-family-mappings into X and mswindows-specific
+  versions.  mswindows-font-create-[object|name]: Treat supplied size as a
+  pointsize. Added underline and strikethru handling.
 
-Fri Jun 28 16:08:08 1996  William M. Perry  <address@hidden>
+1998-12-30  William M. Perry  <address@hidden>
 
-       * mm.el: Fix for stupid problem in mm-copy-tree
+* lisp/url.el (url-file-exists): If url-user is nil use anonymous ftp.
+  (url-file-size): Ditto.
 
-Wed Jun 26 16:38:12 1996  William M. Perry  <address@hidden>
+* lisp/w3.el (w3-find-this-file): Protect against sticking 'nil@' in the
+  filename spec when we go to retrieve something.
 
-       * font.el:
-       Use truncate instead of round for font sizes - usually gives better 
results
+1998-12-30  Milan Zamazal <address@hidden>
 
-       * w3-annotat.el, w3.el:
-       Patch from Darrell Kindred <address@hidden> for news problems
-       1. nnheader-init-server-buffer isn't called, so the
-            first call to nntp-open-server fails.  (Patch inserts
-            a call to nnheader-init-server-buffer in url-news-open-host.)
-         2. The `&', '<', and '>' characters don't get turned into
-            entities in news from lines, subject, body, etc.  The result
-            is that "William Perry <address@hidden>" shows up
-            as "William Perry @monolith.spry.com>".  (The patch moves
-            w3-insert-entities-in-string to url.el and renames it to
-            url-insert-entities-in-string, then calls it from url-format-news.
-         3. When displayed, news articles get an extra, empty
-            "References" entry.  (Patch inserts a `(delete "" ...)'
-            to remove the trailing empty reference from the list.)
+* lisp/url-auth.el (url-basic-auth): Make sure to use base64-encode-string 
+  instead of base64-encode to work with new Emacs/XEmacs that have native
+  base64 encoding/decoding primitives.
 
-       * url-news.el, url.el:
-       Patch from Darrell Kindred <address@hidden> for news problems
-         1. nnheader-init-server-buffer isn't called, so the
-            first call to nntp-open-server fails.  (Patch inserts
-            a call to nnheader-init-server-buffer in url-news-open-host.)
-         2. The `&', '<', and '>' characters don't get turned into
-            entities in news from lines, subject, body, etc.  The result
-            is that "William Perry <address@hidden>" shows up
-            as "William Perry @monolith.spry.com>".  (The patch moves
-            w3-insert-entities-in-string to url.el and renames it to
-            url-insert-entities-in-string, then calls it from url-format-news.
-         3. When displayed, news articles get an extra, empty
-            "References" entry.  (Patch inserts a `(delete "" ...)'
-            to remove the trailing empty reference from the list.)
+1998-12-29  William M. Perry  <address@hidden>
 
-Tue Jun 25 19:00:48 1996  William M. Perry  <address@hidden>
+* Emacs/W3 4.0pre38 released
 
-       * w3-menu.el:
-       Revamped the options menu - added the edit-preferences button.
+* lisp/url.el (url-file-attributes): use 'anonymous' instead of 'ftp' as
+  the username if none specified.
 
-       * w3.el: Fix for window-splitting with the back button
+1998-12-29  Markus Rost  <address@hidden>
 
-       * mm.el:
-       Potential fix for cl's version of copy-tree fucking things up in mm.el
+* url.el (url-file-attributes): If url-user is nil use anonymous ftp.
 
-       * w3-sysdp.el: Added bogus definition of set-marker-insertion-type
+1998-12-29  William M. Perry  <address@hidden>
 
-Mon Jun 24 14:51:18 1996  William M. Perry  <address@hidden>
+* lisp/mule-sysdp.el (mule-detect-coding-version): Doh - make sure we
+  don't blow up in XEmacs w/Mule when making sure we have a valid coding
+  system.
 
-       * w3-about.el: changed pointers for xemacs.cs.uiuc.edu to xemacs.org
+* Emacs/W3 4.0pre37 released
+       
+* lisp/socks.el (socks-find-route): Fixed bug where we would not honor the
+  '!' at the front of the regexp to mean _do_ redirect the connection.  I
+  need to finish the socks-redirection-rules stuff sometime soon.
 
-Fri Jun 14 17:45:16 1996  William M. Perry  <address@hidden>
+* lisp/mule-sysdp.el (mule-detect-coding-version): Put back in the
+  ultra-anal checks to make sure that what detect-coding-region and
+  friends find is actually a coding system.  Apparently the bug where
+  bizarre combinations of CRLF and LF separators in a file make Emacs 20.3
+  return a number as a coding system is back.  Bug reported to the Emacs
+  maintainers.
 
-       * url-cookie.el: fixed bug in cookie support
+1998-12-28  Milan Zamazal <address@hidden>
 
-       * url-cookie.el: Require cl for the def. of assoc*
+* lisp/mm.el (mm-possible-viewers): Don't reverse exact & wildcard when
+  concatenating them.  Reason: `mm-mime-data' contains mailcap entries in
+  the opposite order than they are in the mailcap file.  The function
+  `mm-possible-viewers' should return found items in the opposite order
+  again, so that the first viewer from the mailcap was invoked.  The patch
+  ensures this.
 
-       * w3-auto.el: *** empty log message ***
+* lisp/mm.el (mm-mime-data-default): New variable that holds all the
+  defaults.  mm-mime-data now holds _only_ the user supplied viewers.
 
-       * w3-vars.el, w3.el, w3-forms.el:
-       Fixes for mule from MORIOKA Tomohiko <address@hidden>
+* lisp/mm.el (mm-mime-info): Give preference to things found in
+  mm-mime-data (the user stuff) and then fall back onto
+  mm-mime-data-default.
 
-       * w3-xem20.el: Initial revision
+* lisp/url-http.el (url-parse-viewer-types): Apply both mm-mime-data and
+  mm-mime-data-default when building the acceptable viewer list.
 
-       * url-vars.el, url.el:
-       Fixes for mule from MORIOKA Tomohiko <address@hidden>
+1998-12-28  William M. Perry  <address@hidden>
 
-       * w3-prefs.el: fixed problem under FSFmacs
+* lisp/w3-display.el (w3-prepare-buffer): Use an unwind-protect form
+  around w3-draw-tree.  This means that even if something in the drawing
+  causes an error, the buffer will still be thrown into w3-mode
+  (w3-region): Make w3-region interactive and give it a doc string.
+  (w3-pause): Mark the buffer as temporarily read-only, so that
+  self-inserting keystrokes will signal an error, which will be caught and 
+  ignored by the condition-case.
+  (w3-widget-buffer): New function to get the buffer a widget is in.
+  (w3-widget-echo): Use it, since with Gnus, it is very likely that you
+  will be in a different buffer when you are mousing around the rendered
+  HTML.
 
-Thu Jun 13 14:31:38 1996  William M. Perry  <address@hidden>
+* lisp/url-file.el (url-file): Modify the filename in the URL if we are
+  actually visiting a directory without a trailing '/' or '\', and we do
+  the auto-find of the index.html file.
 
-       * w3-menu.el:
-       Extended w3-menu-save-options to save more info.  Different way of
-       turning menubar on/off in XEmacs 19.14 (menubar-visible-p specifier)
+* lisp/url.el (url-looks-like-html): New function that determines whether
+  a document looks like HTML or not.  This is for ancient HTTP/0.9
+  responses for things without a file extension (ie: /, /a/b/, etc)
+  (url-retrieve-internally): Use it if we cannot find a content-type any
+  other way.
 
-       * w3-latex.el:
-       Applied hypertext link printing patches from Stephen Peters
-       <address@hidden>
+* lisp/url-cid.el: Try to avoid compile-time-errors when gnus' mm-decode
+  cannot be found.
 
-       * w3.el: patch for imbalanced tags in w3-document-information
+1998-12-26  William M. Perry  <address@hidden>
 
-       * url-misc.el, url.el: fixed asynch stuff through a proxy
+* lisp/url.el (url-expand-file-name): Make sure to normalize the 'default' 
+  value before we get to the point of bailing out if we get the empty
+  string, otherwise the vector-ized version of the URL could sneak out,
+  and the 'nil' default case would screw us too.
 
-       * w3-prefs.el: All the panels work to some degree now
+1998-12-26  Markus Rost  <address@hidden>
 
-Wed Jun 12 04:00:39 1996  William M. Perry  <address@hidden>
+* w3-display.el (w3-display-get-cookie): No buffer-file-name for "
+  *cookie*" buffers.
 
-       * url-nfs.el: Initial revision
+1998-12-26  William M. Perry  <address@hidden>
 
-       * url.el: Added 'nfs' url type as per the WebNFS specification
+* lisp/base64.el: Added alias for base64-encode-string -> base64-encode
+  and base64-decode-string -> base64-decode, for compatibility with
+  Emacs/XEmacs with native base64 support.
 
-       * w3-prefs.el: More panels work
+* lisp/w3-about.el: Use base64-encode-string instead of base64-encode, for 
+  compatibility with Emacs/XEmacs with native base64 support.
 
-       * w3-forms.el: fix for radio button munging
+1998-12-25  William M. Perry  <address@hidden>
 
-Tue Jun 11 17:28:53 1996  William M. Perry  <address@hidden>
+* lisp/url-ldap.el: New file to implement LDAP support ala RFC2255
 
-       * url-vars.el: *** empty log message ***
+* lisp/url.el (url-do-setup): Register the LDAP URL handler if the feature 
+  is present.
 
-       * url-irc.el: Fixed bug when no channel was specified in the URL
+* Emacs/W3 4.0pre36 released
 
-       * url.el: Added IRC loader
+* lisp/url.el (url-default-expander): Make sure that we remove any query
+  strings from the URL before we remove relative links.
+  (url-remove-relative-links): Tack on a trailing '/' if necessary so that 
+  we don't fail any URL parsing tests on things like 'g/.', which should
+  be normalized to just 'g/'
 
-       * url-irc.el: Initial revision
+1998-12-24  William M. Perry  <address@hidden>
 
-       * w3.el: *** empty log message ***
+* lisp/url-cookie.el (url-cookie-host-can-set-p): Fixed cookie
+  vulnerability as described in
+  http://www.paradise.net.nz/~glineham/cookiemonster.html
 
-Mon Jun 10 18:58:03 1996  William M. Perry  <address@hidden>
+1998-12-23  Markus Rost  <address@hidden>
 
-       * md5.el: compilation warnings removed
+* w3-menu.el (w3-menu-initialize-w3-mode-menu-map): Block also
+  the global menubar entry [menubar mule].
 
-       * md5.el:
-       New version of md5.el that actually incorporates an md5 implementation
-       in lisp!  Whoah.
+1998-12-23  William M. Perry  <address@hidden>
 
-Sun Jun  9 17:32:55 1996  William M. Perry  <address@hidden>
+* lisp/w3-cus.el (w3-force-conversion-alist): Mixed mismatched custom type
+  (w3-default-stylesheet): Ditto.
+  (w3-html-errors-font-lock-keywords): Ditto.
+  (w3-default-configuration-file): Ditto.
+  (w3-modeline-format): Ditto.
 
-       * url-http.el:
-       protect against malformed HTTP URLs getting passed in via url-retrieve
+1998-12-22  William M. Perry  <address@hidden>
 
-       * w3-speak.el: more renamings that I forgot before
+* Emacs/W3 4.0pre35 released
 
-       * url.el:
-       fixed problem with writing out a history file for the first time
+* lisp/w3-display.el (w3-get-default-color): Function to get the default
+  foreground or background color, even if face-(fore|back)ground returns
+  nil, which it does under Emacs fairly often.  We fall back to getting
+  the colors out of the frame properties.  I think this is gross, but oh
+  well.
+  (w3-display-background-useless-p): Use it.
+  (w3-display-foreground-useless-p): Use it.
 
-       * url-file.el: fixed problem with ftp links
+* lisp/w3.el (w3-reload-document): Avoid using interactive spec 'Z', since 
+  it doesn't exist in older versions of Emacs (19.xx)
 
-       * w3.el: w3-find-default-stylesheets is now a little smarter (looks for
-       stylesheets in the directory it is being loaded from).  Error messages
-       when no default stylesheet can be found is much better now as well.
+* lisp/w3-parse.el (w3-parse-buffer): Add ',' to the `whitespace' at the
+  front of an attribute that we should skip over.  This is so that people
+  can do horrible nasty things like <input type="foo", name="bar"> and
+  still have it work.  Sometimes I feel so... unclean.
 
-       * dist.Makefile, clean-cache, default.css, w3.txi, descrip.mms, 
font.el, images.el, w3-about.el, w3-annotat.el, w3-auto.el, w3-draw.el, 
w3-e19.el, w3-emulate.el, w3-forms.el, w3-hot.el, w3-imap.el, w3-keyword.el, 
w3-latex.el, w3-menu.el, w3-mouse.el, w3-mule.el, w3-parse.el, w3-prefs.el, 
w3-print.el, w3-speak.el, w3-style.el, w3-sysdp.el, w3-toolbar.el, w3-vars.el, 
w3-widget.el, w3-xemac.el, w3.el, xbm-button.el, xpm-button.el, docomp.el:
-       Initial revision
+* lisp/url-news.el (url-check-gnus-version): Use gnus-continuum-version if 
+  at all possible.  This way I will never have to add another string-match 
+  to the list of acceptable versions (at least not until another 15
+  releases of Gnus.
 
-       * base64.el, md5.el, mm.el, ssl.el, url-cookie.el, url-file.el, 
url-gopher.el, url-hash.el, url-http.el, url-mail.el, url-misc.el, url-news.el, 
url-parse.el, url-pgp.el, url-vars.el, url-wais.el, url.el, urlauth.el:
-       Initial rev
+1998-12-22  Dave Love <address@hidden>
 
+* lisp/w3-display.el (w3-image-alt): Pay better attention to the alt
+  specified by the document.  Don't try to special case the empty string
+  so much.
+
+1998-12-22  William Perry  <address@hidden>
+
+* lisp/css.el (css-parse): Wrap the calls to forward sexp in
+  condition-case so that an invalid stylesheet does not completely choke.
+
+1998-12-22  Milan Zamazal <address@hidden>
+
+* lisp/w3.el (w3-replace-invalid-chars): Make sure we tell replace-regexp
+  to be 'literal' so that somet hings in the invalid chars table don't
+  signal an error (ie: S\\v was looking for the regexp quote match, etc)
+
+1998-12-22  William Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-display-table): Backed out old change to use less 
+  space for borderless tables - it was screwing up spacing at the
+  beginning of celles.
+
+1998-12-22  Thierry Emery <address@hidden>
+
+* lisp/url.el (url-expand-file-name): Do not remove blanks from target
+  anchors (#xxx).
+
+1998-12-21  William M. Perry  <address@hidden>
+
+* lisp/docomp.el: If WIDGETDIR is not set, or set to `no', then scream and 
+  bitch and die, to avoid more arcane errors later on.
+  (emacs-build-custom-load): Try to work around emacs19 that doesn't have
+  cus-dep installed.
+
+* lisp/w3.el (w3-fetch): Avoid use of with-current-buffer, since it
+  doesn't exist in Emacs 19.xx 
+  (w3-convert-code-for-mule): Finished rename to mule-coding-system-p
+
+1998-12-20  Bertil Askelid <address@hidden>
+
+* lisp/w3-mouse.el: Don't bind mouse-movement unless w3-track-mouse is
+  set.
+
+1998-12-19  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre34 released
+
+* lisp/mule-sysdp.el (mule-coding-system-p-version): Renamed and fixed
+  mule-coding-system-p for non-MULE Emacs/XEmacs.
+
+1998-12-18  Kenichi Handa  <address@hidden>
+
+* lisp/mule-sysdp.el (mule-coding-system-p-version): New function.
+  (mule-coding-system-version): Use mule-coding-system-p-version.
+  (mule-detect-coding-version): Likewise.
+  (mule-invalid-char-coding-systems): Change iso-latin-1 to iso-8859-1.
+  (mule-coding-system-with-invalid-chars): Check mule-sysdep-version
+  for XEmacs.
+
+* lisp/w3.el (w3-convert-code-for-mule): Use mule-coding-system-p-version.
+  (w3-coding-system-for-mime-charset): Likewise.
+
+1998-12-19  William M. Perry  <address@hidden>
+
+* configure.in: Ditto
+
+* aclocal.m4: Added appropriate magic to run autoconf whenever aclocal.m4
+  is modified.
+
+1998-12-18  William M. Perry  <address@hidden>
+
+* lisp/Makefile.in: No longer include auto-autoloads.el and custom-load in 
+  the distribution.  We can rebuild it anywhere now.
+
+* aclocal.m4 (AC_CHECK_CUSTOMLOADS): Use the new functions in the
+  appropriate place.
+  (EMACS_REBUILD_AUTOLOADS): Ditto.
+
+* lisp/docomp.el (emacs-build-custom-load): New function to build
+  custom-load.el under Emacs.
+  (emacs-build-autoloads): Ditto for the auto-autoloads.el file.
+
+1998-12-15  Kenichi Handa  <address@hidden>
+
+* lisp/Makefile.in (.el.elc): Set shell variable W3SRCDIR to $(srcdir).
+
+* lisp/docomp.el (load-path): Check shell variable W3SRCDIR.
+
+* lisp/w3.el (w3-convert-code-for-mule): Call
+  mule-coding-system-with-invalid-chars.
+ (w3-coding-system-with-invalid-chars): This function deleted.
+
+* lisp/mule-sysdp.el (w3-mime-charset-coding-alist): Fix coding
+  system for Mule.
+  (mule-invalid-char-coding-systems): New variable.
+  (mule-coding-system-with-invalid-chars): New function.
+  (mule-write-region-no-coding-system): Fix argument of write-region for
+  Mule 2.3.
+ 
+1998-12-17  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre32 released
+
+* lisp/font.el (font-x-font-regexp): Add a trailing dash to the
+  font-regexp.  For some reason Emacs 19.xx under 95/NT sticks a trailing
+  slash on the end.  This was the cause of the odd errors in
+  font-spatial-to-canonical since it was getting an empty font object
+  because the regexp failed to match.
+
+1998-12-16  William M. Perry  <address@hidden>
+
+* lisp/w3.el (w3-coding-system-for-mime-charset): Make sure the
+  coding-system-p is defined before we use it.
+  (w3-convert-code-for-mule): Ditto.
+
+* Makefile.in (SUPPORTFILES): Now include 'BUGS' support file in the
+  distributions.
+
+1998-12-16  Simon Josefsson <address@hidden>
+
+* lisp/mm.el (mm-parse-mailcaps): More protection against badly formed
+  MAILCAPS variable.
+
+1998-12-16  William M. Perry  <address@hidden>
+
+* lisp/w3-cus.el (w3-bullets): Fixed customization type for this option.
+  Would lead to mismatches in customize buffers.  Ick!
+  (w3-maximum-line-length): Ditto.
+
+1998-12-08  Ken'ichi HANDA <address@hidden>
+
+* lisp/mule-sysdp.el (mule-detect-coding-version): Check that
+  mule-sysdep-version is a number before comparing it to one.  Under
+  XEmacs it is a symbol `xemacs'.
+
+1998-12-03  William M. Perry  <address@hidden>
+
+* Updated all copyright dates and now specify that this _is_ a
+  part of Emacs, since it soon will be.  Maybe.  If I get ambitious.  what 
+  are the odds posted in vegas?
+
+* lisp/w3-display.el (w3-display-infer-contrasting-color): New function to 
+  chooise black or white as an appropriate color if the author of an HTML
+  page was stupid enough to do something like: <body bgcolor="white"> (ie: 
+  not specifying the foreground color as well).  If this conflicts with
+  the users foreground, the text used to be invisible.  Now it will be
+  whichever contrasts best (black on mint cream, white on dark red, etc)
+  (w3-display-node): If the foreground specified conflicts with the users' 
+  background, ignore it.
+  (w3-display-node): If the background specified conflicts with the users' 
+  foreground, infer an appropriate foreground.
+
+* Emacs/W3 4.0pre31 released
+
+* configure.in (CIDFILE): Stop spitting out a warning about
+  multipart/related stuff if we can't find Gnus at configure time.  We're
+  hacking around it in a different way now.
+
+* lisp/Makefile.in (URLSOURCES): Add url-cid.el into the definition via
+  configure substitutions ONLY.  It will still get installed because we
+  stick it in EXTRAS.  This means 1 extra file copy at install time, but
+  who cares?  The file isn't that large.
+
+* lisp/url-cid.el: New file to contain the content-id handling stuff,
+  because we cannot compile this file unless we can find a very recent
+  version of Gnus at compile time (without .emacs).
+
+* etc/default.css: Use the newer @media tags instead of @x*emacs so that
+  everything will work right with the new Emacs redisplay.
+
+* lisp/css.el (css-active-device-types): Added new @media tags.
+  multifont is now defined if the Emacsen we are running in can display
+  multiple font families and sizes correctly (new emacs redisplay or
+  XEmacs), and unifont if it cannot.
+
+* lisp/font.el (font-set-face-font-new-redisplay): New function for
+  dealing with the new Emacs redisplay font abstraction.  You can now beat 
+  the crap out of the new redisplay engine with Emacs/W3.  Ahh, feels like 
+  the heady old days of Lucid Emacs 19.10 and XEmacs 19.12.
+
+1998-12-02  Simon Josefsson <address@hidden>
+
+* lisp/mm.el (mm-parse-mailcaps): Deal gracefully with bad entries in the
+  MAILCAP list, or it would bug out with things like 'file:' where it
+  would try to open the current directory.
+
+1998-11-29  William M. Perry  <address@hidden>
+
+* lisp/docomp.el (load-path): Append the GNUSDIR environment variable to
+  the load-path, similar to how we deal with WIDGETDIR
+
+* INSTALL: Document the new --with-gnus arguments.
+
+* configure.in: Use AC_CHECK_GNUS and spit out appropriate warnings about
+  cid URLS not working when appropriate.
+
+* aclocal.m4 (AC_CHECK_GNUS): Try to find mm-get-content-id in mm-decode
+  for newer gnus releases that can handle the content-id stuff.  Also
+  added new configure switch '--with-gnus=/path/to/gnus/lisp/dir' to
+  override this, similar to how the custom stuff works.
+
+* lisp/url-misc.el (url-cid-gnus): Try to load mm-decode at compile time.
+  (url-cid-gnus): Fixed some compilation warnings.
+
+* lisp/url.el (url-cid): Ooops - forgot to add an autoload for url-cid
+
+* Emacs/W3 4.0pre30 released
+
+* lisp/url.el (url-do-setup): Duh, forgot to register the CID handler.
+  Good thing lars was doing it too.
+
+* Emacs/W3 4.0pre29 released
+
+* lisp/url-misc.el (url-cid): New URL handler for dealing with content-id
+  based references.  Able to be extended for different mail/news readers.
+  Need to coordinate with Lars and Kyle on exactly how to determine which
+  UA is invoking us, so we don't try and use Gnus functions when VM is
+  giving us the data, etc.
+  (url-cid-gnus): First implementation of CID retrieval for Pterodactyl
+  Gnus.
+
+* lisp/w3-display.el (w3-finalize-image-download): Make sure we call
+  url-uncompress in w3-finalize-image-download, or content-id and data URL 
+  based images won't get uncompressed correctly.  Arguably this should be
+  done in url-default-callback, but I'm not sure what that would fubar
+  right now.
+
+* lisp/w3-parse.el (w3-parse-buffer): Changed regexp for handling
+  NET-enabling start tags to be not so restrictive.  I don't think this
+  will have any negative side-effects
+
+1998-11-28  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre28 released
+
+1998-11-23  Thierry Emery <address@hidden>
+
+* lisp/mule-sysdp.el
+  (w3-mime-charset-coding-alist): completed and reordered;
+  (mule-detect-coding-version): removed MIME type parsing (already done in
+  w3-sentinel) and moved use of w3-mime-charset-coding-alist to
+  w3-coding-system-for-mime-charset;
+
+* lisp/w3.el
+  (w3-convert-code-for-mule): added call to w3-coding-system-for-mime-charset
+  for handling specified MIME charset;
+  (w3-coding-system-for-mime-charset): code moved from
+  mule-detect-coding-version, which uses w3-mime-charset-coding-alist;
+  (w3-sentinel): moved downcase of MIME type and charset to
+  w3-convert-code-for-mule call arguments and generalized it to encoding;
+  replaced hacking out "x-" in MIME charsets with proper reference to
+  w3-mime-charset-coding-alist in w3-coding-system-for-mime-charset.
+
+1998-11-20  Ken'ichi HANDA <address@hidden>
+
+* lisp/w3.el
+  (w3-explicit-coding-system): new variable for user-specified coding system
+  on C-u [w3-reload-document];
+  (w3-convert-code-for-mule, w3-reload-document): added handling of
+  w3-explicit-coding-system.
+
+1998-11-24  Kenichi Handa  <address@hidden>
+
+* lisp/mule-sysdp.el (mule-sysdep-version): Check the mule version
+  correctly.
+  (mule-coding-system-version): New function.
+  (w3-mime-charset-coding-alist): New variable.
+  (w3-url-domain-language-environment-alist): New variable.
+  (w3-url-domain-coding-alist): New variable.
+  (mule-retrieval-coding-system): Call mule-coding-system-version.
+  (mule-no-coding-system): Likewise.
+  (insert-file-contents-literally): Re-define this function for Mule
+  Ver.2.3.
+  (mule-detect-coding-version): Pay attention to
+  w3-mime-charset-coding-alist,
+  w3-url-domain-language-environment-alist, and
+  w3-url-domain-coding-alist.
+  (mule-code-convert-region): Change argument to CODE only.  If
+  default-enable-multibyte-characters is nil, does no code
+  conversion.
+
+* lisp/url-cache.el (url-store-in-cache): Write to a file with no
+  code conversion.
+
+* lisp/w3.el (w3-convert-code-for-mule): Call
+  mule-code-convert-version with one arg CODING-SYSTEM.
+
+1998-11-22  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre27 released
+
+* lisp/w3.el (w3-mode): ditto
+
+* lisp/w3-display.el (w3-display-node): Make sure we don't try to
+  save/restore variables in w3-persistent-variables if they are not
+  'boundp'
+
+1998-11-20  Thierry Emery  <address@hidden>
+
+* lisp/mule-sysdp.el
+  (mule-write-region-no-coding-system): added additional write-region arguments
+  and protections moved from w3-download-callback.
+
+* lisp/mm.el (mm-find-available-multiparts), lisp/url-cache.el
+  (url-store-in-cache), lisp/w3-display.el (w3-display-get-cookie,
+  w3-finalize-image-download), lisp/w3-latex.el (w3-show-dvi), lisp/w3-print.el
+  (w3-print-this-url), lisp/w3.el (w3-save-as, w3-download-callback):
+  use mule-write-region-no-coding-system.
+
+* lisp/url-vars.el, lisp/url-http.el (url-parse-mime-headers): added
+  url-current-mime-charset and url-mime-content-type-charset-regexp.
+
+* lisp/w3-cus.el (w3-force-conversion-alist): new user option, alist of URL
+  host/filename regexps and coding systems.
+
+* lisp/w3-vars.el
+  (w3-meta-content-type-charset-regexp, w3-meta-charset-content-type-regexp):
+  new variables for parsing <META Content-Type...> tag;
+
+  (w3-persistent-variables): added buffer-file-coding-system.
+
+* list/w3.el
+  (w3-mail-current-document): use buffer-file-coding-system or iso-8859-1;
+  (w3-compression-encodings, w3-no-conversion-encodings): new variables used to
+  inhibit conversion;
+  (w3-convert-code-for-mule): removed regexp matching on
+  w3-mime-list-for-code-conversion (replaced by downcase in w3-sentinel);
+  (w3-sentinel): switch to other window if in minibuffer, handle specified
+  charset (in MIME headers or META tag), handle w3-force-conversion-alist, hack
+  out "x-" in MIME charsets.
+
+1998-11-18  Kenichi Handa  <address@hidden>
+
+* Makefile.in (Makefile): Correct the dependency.  Execute
+  config.status in the current directory.
+
+* etc/Makefile.in (install): If a file is not in the current
+  directory, install that file of the source directory.
+
+* lisp/Makefile.in (w3-auto.el): Update target in the current
+  directory.
+  (auto-autoloads.el): Do the work in $(srcdir).
+  (custom-load.el): Likewise.
+  (install): If a file is not in the current directory, install that
+  file of the source directory.
+
+* lisp/docomp.el (byte-compile-dest-file): New function for
+  writing out *.elc to the current directory.
+
+1998-09-26  Gareth Jones  <address@hidden>
+
+* lisp/w3-vars.el: defvar'ed w3-current-buffer.
+
+* lisp/w3.el (w3-fetch): set w3-current-last-buffer for reused URLs.
+  (w3-pass-to-viewer): set w3-current-last-buffer to w3-current-buffer.
+  (w3-fetch): bind w3-current-buffer to (current-buffer).
+        Make history work with url-be-asynchronous t.  
+
+1998-09-25  Gareth Jones  <address@hidden>
+
+* lisp/w3-vars.el (w3-mode-map): Bind [backspace] to scroll-down.      
+
+1998-09-09  Gareth Jones  <address@hidden>
+
+* lisp/w3-emulate.el (w3-lynx-emulation-minor-mode-map): Corrected C-f
+  to be `scroll-up', added bindings for C-b, C-n and C-p.
+
+* lisp/w3-cus.el (w3-latex-use-latex2e): Documentation fix.  LaTeX
+  "generator" makes more sense than "parser".
+
+* lisp/url.el (url-do-setup): ditto for url-cookie-file and
+  url-global-history-file.     
+
+* lisp/url-cache.el (url-cache-directory): use w3-configuration-directory
+  rather than hardwire "~/.w3/"
+
+* lisp/url-news.el (url-nntp): fixed call to url-news-fetch-newsgroup with
+  only one argument.
+  (url-check-gnus-version): Added Pterodactyl Gnus to the list of
+  acceptable Gnusen.
+
+* lisp/url-mail.el (url-mailto): url-mailto would not handle %3F (`?')
+  in addresses because url-unhex-string changed match-end.
+  Added support for "body" hname.  Emit style warning for <mailto:/.*>.
+
+1998-10-29  William Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-region): Make me autoloaded.
+
+1998-10-28  William M. Perry  <address@hidden>
+
+* lisp/mule-sysdp.el (mule-code-convert-region): Try to avoid lossage when 
+  point-max changes due to a set-buffer-multibyte operation.
+
+1998-10-28  Laurent Martelli <address@hidden>
+
+* Patches to add hotindex support.  It's a patch to W3/Emacs allowing you
+  to associate keywords to your  hotlist  entries.  You can then query
+  for  the entries matching a keyword. I  did  this because  I find it
+  hard  to find  a particular bookmark when  you more than  a hundred,
+  even with hotlist-apropos. And I think  that folders and subfolders
+  are not  very convenient because  an entry usually belongs to more
+  than one folder.
+
+1998-10-26  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre25 released
+
+* lisp/w3-display.el (w3-get-all-face-info): Fixed stupid problem where
+  w3-user-fonts-take-precedence was being used backwards!
+
+* Emacs/W3 4.0pre24 released
+
+1998-10-25  Thierry Emery <address@hidden>
+
+* lisp/w3-speak-table.el: Various patches from Thierry to help Emacspeak
+
+1998-10-23  William Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-get-all-face-info): Better way to ignore font
+  family stuff if w3-user-fonts-take-precedence != nil
+
+1998-10-23  Lars Marius Garshol <address@hidden>
+
+* lisp/url-file.el (url-cleanup-file): New function for removing
+  questionable practices from file urls before we fetch them.  Should fix
+  lots of the problems where we tried to ftp when we shouldn't have.
+
+1998-10-23  William Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-face-for-element): Use it.
+
+* lisp/w3-cus.el: New variable on whether to ignore document fonts or
+  not.
+
+1998-10-23  Toby Speight <address@hidden>
+
+* lisp/w3.el (w3-internal-handle-preview): Fix for previewing files under
+  windows that have UNC paths (ie: //foo/bar).  Would try to use ftp
+  otherwise.
+
+* lisp/w3-vars.el (w3-mode-map): Added keybindings for them.
+
+* lisp/w3.el (w3-prev-document): Added new function
+(w3-next-document): ditto
+
+* Added w3-hotindex.el to the contrib directory - adds keyword searching
+  to the hotlist code.
+
+1998-09-20  William M. Perry  <address@hidden>
+
+* */Makefile.in: Fixed the automatic rebuilding based on
+  configure/aclocal.m4 and config.status.  Everything should build in a
+  separate source directory now.
+
+1998-09-08  William M. Perry  <address@hidden>
+
+* lisp/font.el (define-font-keywords): build the :regular keyword with the
+  rest, for v19 emacs
+
+1998-09-08  Charles Levert <address@hidden>
+
+* lisp/w3-parse.el: Patch to deal with incredibly bad HTML that specifies
+  attributes like font="foo","bar","baz".  Ick.
+
+* lisp/w3-forms.el (w3-form-create-image): Fix for image submit buttons.
+
+1998-09-08  William M. Perry  <address@hidden>
+
+* lisp/w3-parse.el: Allow '?' in unquoted attribute values, so that CGI
+  queries in unquoted HREFs work correctly.
+
+1998-08-30  William M. Perry  <address@hidden>
+
+* lisp/docomp.el: Added approprate magic to add the
+  custom-declare-variable byte-hunk-handler so that in version of Emacs <=
+  19.34, customized variables do not show up as 'free' to the byte
+  compiler.
+
+1998-08-22  T. V. Raman <address@hidden>
+
+* lisp/w3-speak-table.el: Implemented table navigation for nested tables 
+  Also implemented emacspeak/w3 command for querying info about the
+  current cell.  cleaned up keybindings
+
+1998-06-22  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre23 released
+
+* lisp/w3-cfg.el.in (w3-configuration-data): Allow the cdr of the assoc
+  list to be something to be eval'd.  Allows things to work better under
+  NT/95 Emacs/XEmacs without needing to do a 'configure' run.  See new
+  file w3-cfg.nt.
+
+* lisp/w3.el (w3-viewer-filter): Start showing output from the viewer
+  program as soon as we get it instead of after it exits.  This allows
+  viewers to spit out instructions on their use (ie: imageviewer under
+  solaris says things like 'hit q to make the window disappear'.
+
+* build.bat: Copy new w3-cfg.nt file over to w3-cfg.el before doing the
+  compile for those NT/Win95 people.
+
+Wed Jun 17 18:30:11 1998  Jonathan Harris <address@hidden>
+
+* lisp/font.el (mswindows-font-create-object): various mswindows fixes -
+  please speak up if anything is broken!
+
+1998-06-18  Stefan Hornburg  <address@hidden>
+
+* lisp/url-file.el (url-file): Fixed a regexp that should match drive
+  letters.  This fixes a longstanding bug where efs/ange-ftp would get
+  invoked instead of looking locally.
+
+1998-06-13  William M. Perry  <address@hidden>
+
+* lisp/w3-hot.el (finish-submenu): Ignore empty strings when searching for 
+  sublist titles.  Reading netscape bookmark files works correctly again.
+
+1998-06-12  William M. Perry  <address@hidden>
+
+* lisp/w3-xemac.el (w3-mouse-handler): Make sure we don't do anything if
+  the current buffer is not the one our event is destined for.  Avoids
+  some weird errors in XEmacs on corner cases w/mouse movement.
+
+* lisp/w3-annotat.el: Removed some old variables - evidently nobody uses
+  this shit any more. :)
+
+* lisp/w3-menu.el (w3-menu-breakup): Moved into this file because it is
+  where it belongs.  Also changed so that 'more...' menu items are spliced 
+  in at the end of the menu where they belong.
+  All the filter menus should work under Emacs 20.3 now.
+  (w3-popup-menu): No longer use 'popup-menu' - this removes the need
+  under Emacs to (require 'lmenu), which caused lots and lots of problems
+  with invalid macros, etc.
+
+1998-06-10  William M. Perry  <address@hidden>
+
+* lisp/w3-menu.el (w3-menu-filters-supported-p): New variable to determine 
+  whether this flavor of Emacs supports the :filter keyword on
+  menus.  Emacs 20.3 will support the :filter keyword, so lets use it.
+  (w3-menu-go-menu): Use it.
+  (w3-menu-bookmark-menu): Ditto.
+  (w3-menu-html-links-constructor): Make this work with easymenu.
+  (w3-menu-hotlist-constructor): Ditto.
+  (w3-menu-links-constructor): Ditto.
+  (w3-menu-e19-show-navigate-menu): Moved from w3-e19.el
+  (w3-menu-e19-show-links-menu): Ditto.
+  (w3-menu-e19-show-hotlist-menu): Ditto.
+
+* lisp/w3-xemac.el (w3-store-in-clipboard): Make this work under mswindows 
+  devices.
+
+1998-06-09  William M. Perry  <address@hidden>
+
+* lisp/w3.el (w3-find-default-stylesheets): Use w3-configuration-data to
+  slap the 'datadir' macro into the search path for stylesheets.
+
+* lisp/w3-cfg.el.in: New file that will store information from the
+  configure run for use later.
+  (w3-configuration-data): New function to retrieve configure-time
+  information later.
+
+* lisp/url-vars.el (url-privacy-level): changed customization properties.
+
+1998-06-08  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0.pre21 released
+
+* lisp/w3-parse.el (w3-parse-buffer): Better dealing with the
+  sera-to-fidel stuff in MULE - and don't bother calling it when
+  default-enable-multibyte-characters is nil for mule 4.x
+
+* lisp/w3.el (w3-download-callback): Use
+  mule-write-region-no-coding-system so that all the MULE variations are
+  hidden within mule-sysdp.el, where they belong.
+
+1998-06-05  Dave Love  <address@hidden>
+
+* lisp/mule-sysdp.el (mule-retrieval-coding-system,
+  mule-no-coding-system, mule-detect-coding-version,
+  mule-inhibit-code-conversion, mule-encode-string,
+  truncate-string-to-width, mule-coding-system-name,
+  mule-find-coding-system): Test for mule-sysdep-version == 4.0.
+  (mule-code-convert-region, mule-make-iso-character): Test for
+  mule-sysdep-version == 4.0.  Also test
+  default-enable-multibyte-characters.
+  (mule-truncate-string): Test for mule-sysdep-version == 4.0.  Use
+  truncate-string-to-width in Emacs 20.
+
+1998-06-04  William M. Perry  <address@hidden>
+
+* lisp/url-http.el (url-create-mime-request): New behaviour wrt
+  url-mime-language-string - if it is nil, then no accept-language header
+  will be sent.  This is to work around problem when dealing with apache - 
+  the old default of '*' would cause the server to return the first
+  version of a document it could find (w3c site would typically send out
+  danish or japanese) - definitely suboptimal.  I don't know how this will 
+  impact you MULE folks though - speak up!
+
+* lisp/url-vars.el (url-mime-language-string): Better customization of
+  this - new default value of nil.
+
+1998-06-02  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0.pre20 released
+
+1998-06-02  Thierry Emery <address@hidden>
+
+* lisp/w3-display.el (w3-refresh-buffer): Try to stay as close to current
+  point as we can when you do a refresh-buffer.
+
+* lisp/w3-display.el (w3-display-table): Fix for Emacspeak table
+  traversal that was broken by the new borderless table features.
+
+* lisp/w3-display.el: Various fixes for alternate image text in tables.
+
+1998-05-25  William M. Perry  <address@hidden>
+
+* lisp/w3-menu.el (w3-menu-options-menu): Fixed problem where newest
+  easymenu (emacs 20.2.93) is a little pickier than before and dies on
+  'nil' menu entries.
+
+* lisp/mule-sysdp.el: Avoid setting enable-multibyte-characters directly
+  under Emacs 20.3-to-be, since it is now a read-only variable.  Use
+  set-buffer-multibyte instead.
+
+1998-05-24  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre19 released
+
+* lisp/url.el (url-file-extension): Make sure we run this through
+  url-basepath to strip out CGI queries.
+  (url-basepath): Strip out any CGI queries from a file when we get its
+  basepath.  This means that relative URLs in CGI results will work much
+  more sanely.
+
+* lisp/mule-sysdp.el (mule-detect-coding-version): Work around incredibly
+  weird bug in Emacs 20.2 where detect-coding-region can return 100%
+  insane results whcih then case code-convert-region to die a horrible
+  death.
+
+* lisp/w3.el (w3-download-callback): Don't blindly bind
+  file-name-handler-alist to nil just to get around auto-compression
+  packages, use the ugly internal knowledge of the most popular ones and
+  disable them like we do in the url-file-* routines.  Otherwise you
+  cannot download a file directory to an EFS filename.
+
+Fri May 22 14:39:52 1998  William M. Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-display-table): Don't insert empty space for
+  borderless tables - this will allow you to display much more data on a
+  page.
+
+Thu May 21 16:09:57 1998  William M. Perry  <address@hidden>
+
+* lisp/w3-forms.el (w3-form-encode-helper): Fixed 'file' submissions -
+  return value of insert-file-contents-literally changed.
+
+* lisp/w3-hot.el (w3-hotlist-break-shit): Make everything interactive!
+
+1998-05-19  William M. Perry  <address@hidden>
+
+* lisp/css.el (css-contextual-match): Fixed scoping bug in CSS - you could 
+  not specify something like '.menu a { color: red }' - it was not walking 
+  up the list correctly when it found a rule with *document as the
+  element.
+
+Thu May 14 11:49:42 1998  William M. Perry  <address@hidden>
+
+* lisp/font.el (mswindows-font-create-object): Now correctly deals with
+  mswindows fonts under XEmacs thanks to Andy Piper.
+
+1998-04-17  T. V. Raman  <address@hidden>
+
+* lisp/w3-speak-table.el (w3-table-setup-keys): Base keymappings off of
+  emacspeak-prefix, instead of hardcoded C-z.
+
+1998-04-17  William M. Perry  <address@hidden>
+
+* lisp/: updated copyright statements, removed quite a few old files from
+  the tree.
+
+* lisp/xml.el: New way to parse XML documents using an external process
+  and some new support tools based upon 'expat', the XML parser from James 
+  Clark.
+
+* aclocal.m4 (AC_EMACS_PACKAGES): resurrected the --with-package-dir
+  option.
+
+1998-04-15  William M. Perry  <address@hidden>
+
+* configure.in: Changes to where it installs things by default, more
+  GNUish now.  Need to think about how packages need to be done in
+  autoconf more.
+
+* lisp/w3-cus.el (w3): Put the 'url' group within the W3 group
+  automatically.
+
+* lisp/w3-menu.el (w3-menu-options-menu): Do customize-browse instead of
+  w3-preferences-edit for Options->Edit Preferences menu item.
+
+* lisp/docomp.el: Use w3-load-flavors and w3-setup-version-specifics in
+  docomp.el, just to make sure everything works.
+
+* lisp/w3.el (w3-load-flavors): Don't bitch about XEmacs being unsupported 
+  on windows anymore, because it is again!
+
+* lisp/w3-xemac.el: Force loading of new widget/custom libraries on
+  XEmacsen that are too old, but had them dumped in, so load-path munging
+  doesn't do anything.
+
+* lisp/socks.el: Added socks v4 support.  To do this I had to change how
+  socks servers are defined - try the new customization support: C-u M-x
+  customize [RET] socks to see what has changed. 
+
+* lisp/mule-sysdp.el (mule-sysdep-version): Try to deal with MBSK Emacs
+  not really being mule, but still mostly lying about it.
+
+* lisp/w3-speak-table.el: New file to actually take advantage of the new
+  table structure.
+
+* lisp/w3-display.el: Changes from Raman and Thierry for keeping track of
+  table structure.
+
+1998-04-13  William M. Perry  <address@hidden>
+
+* lisp/w3-parse.el (w3-parse-buffer): Wrap calls to sera-to-fidel-marker
+  in a condition-case to avoid lossage on MBSK emacsen.
+
+1998-03-08  Laurent Martelli <address@hidden>
+
+* lisp/w3-hot.el (w3-hotlist-rename-entry): Could select the wrong entry
+  if one hotlist title was the same as the beginning of another one.
+
+1998-03-07  William M. Perry  <address@hidden>
+
+* lisp/docomp.el: require lmenu during compiles, or Emacs 20.x will
+  choke.
+
+1998-03-07  Greg Stark <address@hidden>
+
+* lisp/w3-forms.el (w3-form-determine-size): Fix various misalignments in
+  tables.
+
+1998-02-22  William M. Perry  <address@hidden>
+
+* lisp/docomp.el (compile-it): This should now work in v19 emacsen, since
+  they didn't support the 'files-only' final argument.
+
+1998-01-29  Dieter Maurer <address@hidden>
+
+* lisp/mm.el (mm-parse-mime-headers): Handle continuation lines in headers 
+
+1998-01-29  William M. Perry  <address@hidden>
+
+* lisp/socks.el: Fixed various int vs. char problems, made the error
+  reporting a little clearer that they were actual errors from the SOCKS
+  server, not necessarily the ultimate destination.
+
+1998-01-28  William M. Perry  <address@hidden>
+
+* lisp/url-cookie.el (url-cookie-handle-set-cookie): Allow
+  url-privacy-level == paranoid to deny all cookies.
+
+1998-01-27  William M. Perry  <address@hidden>
+
+* lisp/w3.el (w3-download-url): Fix in the case where a filename is passed
+  in - was calling the callback with the wrong # of arguments.
+
+1998-01-20  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre14 released
+
+* lisp/w3-toolbar.el (w3-toolbar-make-buttons): Don't die horribly if you
+  cannot make the toolbar buttons - this made TTY XEmacs 20.5beta +
+  Emacs/W3 choke big time.  all better now.
+
+1998-01-09  William M. Perry  <address@hidden>
+
+* lisp/w3-parse.el (w3-parse-buffer): Don't use insert-char for SGML
+  entities, because with the new MULE replacements for stupid windows
+  character sets, some of them are no longer single characters.
+
+1998-01-06  Laurent MARTELLI  <address@hidden
+
+* lisp/w3-menu.el (w3-menu-search-menu): Added 'ftp search' at
+  http://ftpsearch.ntnu.no/home.html to the search menu.
+
+1998-01-06  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre13 released
+
+* lisp/url-http.el (url-create-mime-request): Added better protection
+  around calls to getting proxy authentication when we aren't really
+  proxying anything.
+
+* lisp/w3-hot.el (w3-hotlist-refresh): Make sure w3-do-setup has been
+  run.
+
+* lisp/url-http.el (url-create-mime-request): Fixed proxy authentication
+  and excessive prompting
+
+1998-01-05  William M. Perry  <address@hidden>
+
+* lisp/w3-menu.el (w3-menu-make-xemacs-menubar): Fixed problem where
+  XEmacs would never install the 'buffers' menu
+  (w3-menu-install-menubar): Fixed test for whether to initialize the
+  menubar.
+
+1998-01-05  Laurent Martelli <address@hidden>
+
+* lisp/w3-cus.el (w3-defined-link-types): Added 'contents' and 'top' from
+  the HTML 3.2 reference spec to the predefined sets of <LINK> types.
+
+1997-12-31  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre12 released
+
+1997-12-29  William M. Perry  <address@hidden>
+
+* lisp/Makefile.in: don't remove the old custom-load.el and
+  auto-autoloads.el, so that people using Emacs 19/20 can muck with the
+  source and not destroy the autoloads in the process.
+
+1997-12-26  William M. Perry  <address@hidden>
+
+* lisp/url-misc.el (url-do-terminal-emulator): Removed extra ')' DUGH!
+
+1997-12-25  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre11 released
+
+* lisp/url.el (url-lazy-message): Don't show messages if there is an
+  active minibuffer window.
+
+* lisp/Makefile.in (w3-auto.el): removed use of $^ macro, since some SYSV
+  machines seem to croak on it.
+
+1997-12-24  Ching-Mo Chang  <address@hidden>
+
+* lisp/url-file.el (url-file): fix for stripping out leading '/' from
+  local filenames under OS/2.
+
+1997-12-24  William M. Perry  <address@hidden>
+
+* lisp/url-misc.el (url-do-terminal-emulator): Fixed for the case where
+  the user was not specified (vast majority)
+
+* lisp/w3.el (w3-save-as): Don't double latex output
+
+* lisp/w3-parse.el (w3-parse-buffer): Deal with comments slightly
+  differently - on large documents, we could hit a stack overflow in the
+  regexp engine.
+
+* lisp/css.el (css-expand-value): default to using :normal for unknown
+  weights, not :bold.
+
+1997-12-24  Vladimir Alexiev <address@hidden>
+* lisp/w3-xemac.el: Compatibility stuff for XEmacs 19.13
+
+1997-12-24  William M. Perry  <address@hidden>
+
+* lisp/w3-forms.el (w3-form-determine-size): If someone specifies a 'size'
+  of 0 for a form element, bring sanity back to the world.
+
+* lisp/w3-cus.el (w3-display-frames): Changed default to 't' to
+  automatically display frames.
+
+* lisp/w3-parse.el: Added nobr tag to %special - it should parse fine
+  now.
+
+* lisp/socks.el (socks-override-functions): New variable to control
+  whether or not to overwrite the builtin open-network-stream function
+  with one of our own.
+
+* lisp/font.el: Added explicit require of disp-table, so we will work with 
+  older XEmacsen.
+
+* lisp/w3-style.el (w3-display-stylesheet): Default to using
+  w3-user-stylesheet if w3-current-stylesheet is not set yet (ie: no page
+  loaded in current window).  Also throws an error if none of those are
+  defined yet.
+
+1997-12-22  Michael Ernst <address@hidden>
+
+* url.el (url-get-url-at-point): Strip surrounding parens from a
+  potential URL.
+
+1997-12-22  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-pause): Use a dedicated variable instead of
+  coopting cur-viewing-pos, to protect against errors.
+
+1997-12-22  Thierry Emery <address@hidden>
+
+* w3-parse.el: Deal with invalid SGML characters in mule better.
+
+1997-12-22  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0.pre10 released
+
+* lisp/w3-parse.el (w3-parse-buffer): Make sure we expand the 'background' 
+  tag, so stylesheets created after mucking with the <body> attributes
+  will work correctly.
+
+* configure.in: Disable caching of configure results - I've become
+  convinced this is the right thing to do.
+
+* Makefile.in (install): Don't automatically hack up someone's .emacs file 
+  - make them explicitly do a 'make dotemacs'
+
+* configure.in: Moved some of the --with-FOO stuff into aclocal.m4 and the
+  appropriate AC_DEFUN macros, where they belong.
+
+* aclocal.m4 (library): Fixed setting of package directory (typo).
+
+1997-12-04  Thierry Emery <address@hidden>
+
+* lisp/w3.el (w3-mail-current-document): ditto.
+
+* lisp/w3-display.el (w3-maybe-start-image-download): ditto.
+
+* lisp/url.el (url-insert-file-contents): protects url-be-asynchronous
+  against elisp errors in code sections where its default value is
+  temporarily modified.
+
+1997-11-27  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0.pre9 released
+
+1997-11-27  Cord Kielhorn <address@hidden>
+
+* lisp/w3-hot.el (w3-grok-html-bookmarks-internal): Some fixes for HTML
+  hotlists in xmosaic hotlist format 3
+
+1997-11-27  William M. Perry  <address@hidden>
+
+* lisp/w3-cus.el (w3-delay-image-loads): Default to not loading images if
+  this version of Emacs does not support any image formats other than XPM
+  or XBM.
+
+1997-11-20  William M. Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-resurrect-hyperlinks): Keep track of start and
+  end of the widget, since widget-convert-text doesn't appear to.
+  (w3-display-node): Keep track of :visited and :active faces for
+  hyperlinks.
+  (w3-follow-hyperlink): Apply the :visited face to a widget after we
+  fetch it.
+
+1997-11-20  Thierry Emery  <address@hidden>
+
+* lisp/w3-display.el (w3-display-node): more frames work
+
+1997-11-07  William M. Perry  <address@hidden>
+
+* lisp/css.el (css-expand-length): Fixed percentages in css-expand-length
+
+1997-11-05  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0.pre8 released
+
+* aclocal.m4 (elisp): Use a temporary file for elisp configuration tests,
+  to avoid weirdness that gets shoved to stdout/stderr by the various
+  emacsen.
+
+* lisp/w3-cus.el (w3-image-mappings): Use imagick for everything if XEmacs 
+  was compiled with it.
+
+* lisp/w3-display.el (w3-maybe-start-image-download): Protect against bad
+  instantiation of glyphs of already loaded images.
+
+1997-11-04  Thierry Emery <address@hidden>
+
+* Support relative frameset dimensions (ie: "2*,*")
+
+* Fixed problem with doubling or tripling of image 'alt' text for images
+  in tables.
+
+1997-11-03  William M. Perry  <address@hidden>
+
+* aclocal.m4 (elisp): Simplified version of AC_EMACS_VERSION that just
+  uses AC_EMASC_LISP to print out emacs-major-version . emacs-minor-version
+
+1997-10-28  William M. Perry  <address@hidden>
+
+* lisp/url-cookie.el (url-cookie-parse-file): Fixed autoload cookie (hah)
+
+1997-10-27  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre7 released
+
+1997-10-27  Jens-Ulrik Holger Petersen  <address@hidden>
+
+* url.el (url-retrieve-internally): Ensure that coding system for
+  the url buffer is set to no-conversion.
+
+1997-10-23  William M. Perry  <address@hidden>
+
+* aclocal.m4: Fixed detection of how to rebuild custom-loads.el and
+  auto-autoloads.el
+
+1997-10-23  Thierry Emery <address@hidden>
+
+* lisp/w3-display.el lisp/w3-widget.el: Lots of fixes for images.
+  image hyperlinks are active, even when inside tables (thanks to a
+  w3-hyperimage-info text-property, a content for w3-resurrect-images
+  and the fact that :href and :target info are now passed on down to
+  the children widgets),
+
+  a face can be specified in the stylesheet, which will be used for
+  the `alt' tags, e.g.:
+  img:link    { color: goldenrod  }
+  img:active  { color: goldenrod  }
+  img:visited { color: firebrick  }
+       
+  the `alt' tag of image maps is displayed, to ease visual
+  recognition,
+
+  when the `alt' tag is "" and w3-auto-image-alt is non nil,
+  an `alt' tag is made from the image src file basename. (WMP change)
+
+1997-10-20  Ching-Mo Chang  <address@hidden>
+
+* lisp/url-file.el (url-host-is-local-p): recognize XXX:/ as local file
+  under NT/Win95/OS2.
+
+* lisp/url-cache.el (url-cache-extract): replace 'os2' with 'emx' when
+  comparing system-type.
+
+* lisp/w3-e19.el (w3-store-in-clipboard): Deal gracefully with
+  interprogram-cut-function being bound, but nil - we should fall back to 
+  the device-specific stuff, not just do nothing.
+
+1997-10-20  William M. Perry  <address@hidden>
+
+* texi/w3-faq.txi (Runtime FAQ): New FAQ about Mule 20.x and \201 in front 
+  of everything.
+
+1997-10-17  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre6 released
+
+* lisp/images.el (image-register-netpbm-utilities): Don't automatically
+  dither PNM/PPM files to 256 colors when converting to XPM - its not
+  necessary.
+
+1997-10-17  Colin Rafferty <address@hidden>
+
+* lisp/url-auth.el (url-auth-user-prompt): New function to create a pretty 
+  prompt that shows the realm or URL that the user should be
+  authenticating to.
+
+1997-10-17  William M. Perry  <address@hidden>
+
+* contrib/w3-imenu.el: New version of w3-imenu for the contrib directory.
+
+* Emacs/W3 4.0pre5 released.
+
+* lisp/w3.el (w3-find-default-stylesheets): Should now find the stylesheet
+  much more often given the new directory layout under Emacs 19.x & 20.x
+
+* lisp/Makefile.in (custom-load.el): Automatically rebuild auto-autoloads
+  and custom-load.el if any of the source files have changed.  configure
+  now auto-detects how to rebuild them.
+
+Fri Oct 17 06:27:07 1997  William M. Perry  <address@hidden>
+
+* lisp/url-cookie.el: autoload url-cookie-parse-file
+
+1997-10-16  William M. Perry  <address@hidden>
+* lisp/w3-display.el (w3-insert-terminal-char): better handling of HR
+  within borderless tables 
+
+* lisp/w3-parse.el (w3-p-s-entity): Don't cons up a string just to insert
+  a single character.
+
+* lisp/w3-display.el (w3-display-line-break): 2.3 Mule's char-before requires
+  the 'pos' argument, so always send in (point).
+
+* lisp/w3-display.el (w3-dingbats): don't crap out in mule 2.3
+
+* lisp/w3.el (w3-find-default-stylesheets): Make finding no stylesheets a
+  fatal error.
+
+1997-10-15  William M. Perry  <address@hidden>
+
+* configure.in: Deal with EMACS="t", so you can now configure Emacs/W3
+  from within an emacs shell buffer.
+
+1997-10-13  William M. Perry  <address@hidden>
+
+* lisp/w3-toolbar.el (w3-toolbar-make-buttons): Default to using text only 
+  buttons if w3-toolbar-icon-directory doesn't exist (or is nil if
+  locate-data-directory fails)
+
+1997-10-04  SL Baur  <address@hidden>
+
+* lisp/w3.el (w3-find-default-stylesheets): Use `locate-data-directory' if 
+  it exists.
+
+* lisp/w3-toolbar.el (w3-toolbar-make-buttons): Use `locate-data-directory'
+  if it exists.
+
+1997-10-03  William M. Perry  <address@hidden>
+
+* texi/Makefile.in (install): Ignore errors from the installinfo stage.
+
+1997-10-02  William M. Perry  <address@hidden>
+
+* lisp/w3.el: Added autoload for w3-version
+
+* texi/Makefile.in (install): Don't global when doing install-info
+
+1997-09-30  William M. Perry  <address@hidden>
+
+* lisp/w3.el (w3-map-links): Use the exposed widget-map-buttons function,
+  since XEmacs no longer uses overlays for its internal representation of
+  widgets.
+
+1997-09-29  William M. Perry  <address@hidden>
+
+* lisp/url-news.el (url-news-version-too-old): Deal with quassia gnus
+
+1997-09-25  William M. Perry  <address@hidden>
+
+* lisp/url-news.el (url-format-news): Use 'gnus-article-display-hook
+  instead of manually calling gnus-article-hide-headers
+  (url-format-news): Also bind gnus-article-current, because some hooks
+  might need to use it.
+
+1997-09-22  William M. Perry  <address@hidden>
+
+* lisp/url-ns.el (url-ns-prefs): Can now parse a netscape preferences.js
+  file and query items out of it.
+
+1997-09-19  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.105 released
+
+* Removed the custom and widget libraries from the distribution.
+
+* configure.in, aclocal.m4: Lots of changes and additional macros for
+  detecting features in Emacs Lisp.  New way of detecting acceptable
+  widget/custom combinations, and warnings about where to go to get the
+  newest version.
+
+1997-09-16  William M. Perry  <address@hidden>
+
+* Updated to Widget/Custom 1.9958
+
+1997-09-16  Thierry Emery <address@hidden>
+
+* lisp/w3-display.el, lisp/w3.el: Better frame navigation -- 'q','l', etc
+  should now back up by framesets, not just by single buffers.
+
+Sat Sep 13 16:26:47 1997  Istvan Marko <address@hidden>
+
+* lisp/w3-mouse.el (w3-follow-inlined-image): Fixed
+  w3-follow-inlined-image
+
+Thu Sep 11 15:17:27 1997  William M. Perry  <address@hidden>
+
+* lisp/w3-display.el: Go back to creating the 'nil' face all the time,
+  even in Emacs - otherwise ps-print chokes.
+
+1997-09-10  William M. Perry  <address@hidden>
+
+* lisp/w3-parse.el (w3-parse-buffer): Latest Emacs 20.x has renamed the
+  sera-to-fidel-marker function to ethio-sera-to-fidel-marker, so we were
+  losing on ethiopic texts.
+
+1997-09-05  William M. Perry  <address@hidden>
+
+* Makefile.in: Now includes the 'contrib' directory in distributions.
+
+* aclocal.m4: Fixed custom detection - would sometimes set CUSTOM to the
+  directory, sometimes to the filename... ick.
+
+* Makefile.in (dotemacs): Tweaked the install of autoloads into .emacs file
+
+* lisp/font.el (font-normalize-color): Ditto
+
+* lisp/url.el (url-setup-privacy-info): Ditto
+
+* lisp/devices.el: Everything now recognizes 'w32' as an alias for the
+  'win32' device type.  This is for Emacs 20.x compatibility, which will
+  have this change.
+
+1997-09-04  William M. Perry  <address@hidden>
+
+* Updated to Widget/Custom 1.9956
+
+1997-08-25  William M. Perry  <address@hidden>
+
+* lisp/w3.el (w3-document-information): Fixed bug with empty 'meta' links.
+
+1997-08-20  William M. Perry  <address@hidden>
+
+* lisp/w3-menu.el ((fboundp 'id-menubar-set)): Avoid fset'ing
+  id-menubar-set - it was confusing oobr
+
+1997-08-19  William M. Perry  <address@hidden>
+
+* New file w3-imenu.el from T.V. Raman <address@hidden>
+
+1997-08-15  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.102 released
+
+* lisp/Makefile.in: Fix for some buggy makes that didn't like my very long
+  substitutions on the SOURCES macro.
+
+1997-08-14  Roland McGrath <address@hidden>
+
+* lisp/md5.el (md5): protect kill-buffer from getting already dead buffers
+  by using 'buffer-name'
+
+1997-08-12  William M. Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-display-nil-face): Don't make the 'nil' face
+  under Emacs 19.
+
+* lisp/wid-edit.el (widget-before-change): Allow inhbit-read-only to
+  override the before-change checks for if we are at a widget or not.
+
+* lisp/cus-face.el: Path to make cus-face.el play nice with
+  emacs 19 without X support.
+
+* lisp/w3-e19.el (w3-mode-version-specifics): Dont' do read-only 
+
+1997-08-10  Thierry Emery <address@hidden>
+
+* lisp/w3-display.el: Patch for frames on TTY devices.
+
+1997-08-08  William M. Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-table-ascii-border-chars): Back to more
+  rectangular ascii art for table borders.
+
+* lisp/socks.el (socks-find-route): Allow negation of regexps by
+  prepending a ! to them for a 'proxy if they match' type rule.  The whole 
+  configuration of this module needs to change.
+
+1997-08-08  Istvan Marko <address@hidden>
+
+* lisp/url-misc.el (url-proxy): Fix for all proxy access.
+
+1997-08-08  William M. Perry  <address@hidden>
+
+* lisp/w3-display.el: Fixed compilation problems under Emacs 20.x that had
+  to do with char tables and such.
+
+* lisp/w3-e20.el (w3-e20): Added provide statement for this file - duh.
+
+1997-08-07  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.98 released
+
+* Synch'd up to custom 1.9954
+
+Thu Aug  7 08:16:Denys Duchier <address@hidden>
+
+* lisp/w3-display.el (w3-widget-echo): Use
+  buffer-substring-no-properties for w3-widget-echo to avoid spurious
+  'attempt to change text outside editable field' errors.  Is this needed
+  with the new custom?  Doubtful, but its still a good idea. (wmp)
+
+Fri Aug  1 06:00:02 1997  Thierry Emery <address@hidden>
+
+* w3-display.el: take into account hierarchical framesets in a same page
+  and discards useless "*" values for cols or rows.
+
+Sun Jul 27 18:43:41 1997  William M. Perry  <address@hidden>
+
+* configure.in: Added --with-lispdir configure option.
+
+* lisp/url-misc.el (url-proxy): Strip out "#foo" anchors in proxy requests
+
+* configure.in: Fixed guessing of .emacs location to work in shells where
+  ~/ is not expanded.
+
+1997-07-26  SL Baur  <address@hidden>
+
+* mm.el (mm-extension-to-mime): Use `eq' for character comparison.
+
+Sun Jun 29 22:26:43 1997  William M. Perry  <address@hidden>
+
+* lisp/w3-emulate.el: Make sure we call widget-button-press not w3-follow-link
+
+* configure.in: New --enable-site-install option to control whether init
+  code goes in user's .emacs file or default.el
+
+* Makefile.in (dotemacs): New target for modifying the user's .emacs file
+  or the sitewide default init.
+  (html): New target for building html versions of the manuals.
+
+Fri Jun 27 21:08:24 1997  William M. Perry  <address@hidden>
+
+* texi/Makefile.in (%.html): Added targets for making HTML versions of the
+  info files.
+
+1997-06-27  William M. Perry  <address@hidden>
+
+* lisp/w3.el: In non-XEmacs, the version-specific stuff is loaded from
+  (format "w3-e%d" emacs-major-version), in case we need to do anything
+  special for Emacs 20.x with Mule support.
+
+* Only use one conditionalization variable - w3-running-xemacs
+
+1997-06-26  William M. Perry  <address@hidden>
+
+* Makefile.in: Make sure we recursively make usin $(MAKE), not
+  vanilla 'make'.
+
+* lisp/w3.el (w3-insert-formatted-url): Works again, forgot to update it
+  to use the new widget properties.
+  (w3-maybe-follow-link): Ditto.
+  (w3-view-this-url): Ditto.
+  (w3-follow-link): Ditto.
+  (w3-complete-link): Ditto.
+
+Wed Jun 25 07:29:46 1997  William M. Perry  <address@hidden>
+
+* lisp/w3.el (w3-find-default-stylesheets): Added more directories to the
+  stylesheet search path.
+
+* Emacs/W3 3.0.92 released
+
+* Moved lisp stuff into its own subdirectory, integrated into configure,
+  make, and install procedures.
+
+* Makefile.in (Makefile): Ditto
+
+* texi/Makefile.in: Automatically rebuilds out-of-date Makefiles
+
+* configure.in: Make sure we create texi/Makefile
+
+* w3-display.el (w3-table-ascii-border-chars): Slightly nicer rounded
+  edges for ascii borders on tables.
+
+Tue Jun 24 14:35:05 1997  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.91 Released
+
+* Moved texinfo stuff into its own subdirectory, integrated into
+  configure, make, and install procedures.
+
+* url-file.el: Visiting directories with an index file works in asynch
+  mode now.
+
+* docomp.el (cl): Load cl during builds
+
+* w3.el (w3-find-default-stylesheets): Added more directories to the
+  stylesheet search path.
+  (w3-do-setup): Make sure we don't infinitely recurse if we are using
+  html bookmarks.  w3-parse-hotlist could call w3-parse-buffer, which will
+  call w3-do-setup if we don't set our global flag as 't'.
+
+* Makefile.in (SOURCES): Some reordering to make the stupid thing at least
+  compile with Emacs 19.
+
+Tue Jun 24 11:44:59 1997  Per Abrahamsen  <address@hidden>
+
+* w3.el (w3-mode): Avoid calling the global bindings for RET and mouse-2. 
+
+1997-06-24  William M. Perry  <address@hidden>
+
+* Synch'd up to custom/widget 1.9936
+       
+* Emacs/W3 3.0.90 released
+
+* Moved the documentation into its own subdirectory
+
+* w3-menu.el: Slightly less complete version of id-menubar-set when not in 
+  InfoDock - was causing lots of errors in XEmacs when trying to run a
+  non-existent hook.  Bleah.
+
+* configure.in: Fixed AC_CHECK_PROG for emacs/xemacs - duh.
+
+* aclocal.m4: Don't check custom sanity if it was specified on the
+  configure line
+
+1997-06-23  William M. Perry  <address@hidden>
+
+* url-file.el (url-file): Make sure we set the content-type when loading
+  files.  Was screwed when we were asynch.
+
+* Upped planned release # to 4.0
+
+* Emacs/W3 3.0.89 released.
+
+* configure.in: Fixed --with-x*emacs switches.
+
+* Emacs/W3 3.0.88 aborted.
+
+* w3-display.el (w3-display-node): deal with empty selections
+
+* Now uses autoconf to deal with all configuration issues, including
+  sanity checking the installation of the custom and widget libraries.
+
+Mon Jun 23 17:08:55 1997  Per Abrahamsen  <address@hidden>
+
+* w3.el (w3-mode): Don't call `widget-minor-mode'.
+
+* w3-vars.el (w3-mode-map): Use `make-sparse-keymap'.
+  Use `widget-keymap' as parent.
+  (wid-edit): require.
+
+Mon Jun 23 07:09:51 1997  William M. Perry  <address@hidden>
+
+* w3-parse.el (w3-parse-buffer): Make sure we always have a newline at the
+  end of the buffer before starting the parse.
+
+Fri Jun 20 11:23:28 1997  William M. Perry  <address@hidden>
+
+* Synch'd up to Widget 1.9929
+
+* w3-mouse.el: Deal with InfoDock button bindings - we don't need to bind
+  _anything_ since hyperbole knows all about hyperlinks and stuff.
+
+* w3-menu.el (w3-menu-install-menubar): Deal with InfoDock way of
+  specifying mode menubars.
+
+* w3-toolbar.el (w3-add-toolbar-to-buffer): Don't install the toolbar
+  under InfoDock - it uses different toolbars than straight XEmacs.
+
+* w3-mouse.el: Don't bind shift-button2 - this is reserved for hyperbole.
+  This is now on meta.
+
+1997-06-19  William M. Perry  <address@hidden>
+
+* w3.el (w3-map-links): Deal with new keywords.
+
+* w3-menu.el (w3-menu-links-constructor): Deal with new keywords on
+  links/images.
+  (w3-popup-menu): Ditto.
+
+* w3-display.el (w3-widget-echo): Deal with new keywords we use on widgets.
+  (w3-follow-hyperlink): Ditto.
+  (w3-balloon-help-callback): Ditto.
+  (w3-maybe-start-image-download): Ditto.
+  (w3-handle-image): Use new keywords.
+  (w3-display-convert-arglist): New function to convert an assoc list into 
+  a property list with real CL-style keywords.
+  (w3-display-node): Use it when building a hyperlink.
+  (w3-resurrect-hyperlinks): Now uses widget-convert-text instead of nasty 
+  knowledge of internals of the widget library.
+
+Tue Jun 17 21:45:06 1997  William M. Perry  <address@hidden>
+
+* custom-check: Was misusing 'tr'
+
+Sun Jun 15 22:17:01 1997  William M. Perry  <address@hidden>
+
+* Synch'd up to custom 1.9920
+
+Sat Jun 14 15:37:09 1997  William M. Perry  <address@hidden>
+
+* Synch'd up to custom 1.9918 - now distribute all of custom, just to be
+  anal.
+
+* w3-display.el (w3-display-line-break): Ebola vaccination
+  (w3-maybe-start-background-image-download): Don't try to load background
+  images in Emacs 19 or on a TTY.
+  (w3-display-node): Keep track of the active face of a hyperlink.  Need
+  to make the widget library smarter about this.
+
+Fri Jun 13 22:16:59 1997  William M. Perry  <address@hidden>
+
+* w3-parse.el:  Some stupid sites put meta tags in the middle of their
+  documents.  Sigh. Allow it, but bitch and moan.
+
+* Added custom library to the distribution.
+
+1997-06-11  William M. Perry  <address@hidden>
+
+* w3-parse.el : Allow <meta> tags in %body.content for stupid cnn.com
+  site.
+
+* Emacs/W3 3.0.87 released.
+
+* Synched up to Widget 1.9907 - you must be running this version for most
+  things to work.  Make sure you are not picking up a widget library from
+  gnus or something like that before the one in the w3 directory.
+
+* w3-display.el (w3-maybe-start-background-image-download): New function
+  that takes a URL and a face and does its best to set the background
+  pixmap of that face to the image pointed to by the URL.
+  (w3-display-node): Implemented 'background' property on 'body' or 'html' 
+  tags.
+  (w3-finalize-image-download): Changed a fair bit - shared between normal 
+  image downloads and background image downloads.
+  (w3-display-node): w3-user-colors-take-precedence now controls whether
+  background faces are retrieved or not.
+  (w3-face-for-element): Stylesheets use of background-image should almost 
+  work now.
+  (w3-display-node): Stylesheets use of background-image should work
+  completely now.
+
+Tue Jun 10 07:24:09 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-only-links): This will now use w3-map-links
+  (w3-mode): Dont' set inhibit-read-only, ever.
+  (w3-mode): back to using widget-minor-mode, since inheriting the keymap
+  doesn't seem to do much good.
+
+* w3-vars.el: Don't bind anything to widget-button-press, let
+  widget-minor-mode do that.
+
+* w3.el (w3-map-links): Revamped this to work with the new way widget is
+  using overlays instead of text properties.
+  (w3-mode): Use widget-minor-mode instead of binding a lot of
+  navigational commands ourselves.
+
+* w3-display.el: Make sure we don't try to redefine the w3-dingbats
+  character set when loading this file more than once.
+  (w3-display-node): Rearranged some of the insert-before handling so that 
+  any text inserted does _not_ have the properties of the tag on it
+  (colors on hyperlinks won't bleed anymore)
+  (w3-resurrect-hyperlinks): New semi-working way of resurrecting
+  hyperlinks
+
+Mon Jun  9 22:53:14 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-display-node): Protect against stylesheet specified
+  widths on horizontal rules.
+
+Mon Jun  9 22:42:26 1997  Istvan Marko <address@hidden>
+
+* w3-hot.el (w3-hotlist-apropos): Let this work when reuse-buffers != no
+
+Mon Jun  9 22:35:04 1997  Dieter Maurer <address@hidden>
+
+* mm.el (mm-decode-quoted-printable): Fix for some multipart attachments
+  showing up empty due to badness in mm-decode-quoted-printable and
+  'ignore' not moving to the end of the region just decoded.
+
+Mon Jun  9 22:35:04 1997  William M. Perry  <address@hidden>
+
+* w3-parse.el (w3-parse-buffer): Call w3-do-setup to make sure our
+  hashtables and things are set up correctly or gnus can choke big time.
+
+Mon Jun  9 22:26:29 1997  Michael Ernst <address@hidden>
+
+* url.el (url-get-url-filename-chars): Fixed problem with bad use of a
+  hyphen in the regexp.  Would cause problems when invoking
+  url-get-url-at-point when point was in front of a hyphen.
+
+1997-05-28  William M. Perry  <address@hidden>
+
+* w3-cus.el: Use a :prefix on most of the groups to make the options look
+  nicer.
+
+Thu May 15 05:06:30 1997  William M. Perry  <address@hidden>
+
+* w3-sysdp.el: removed bogus definition of buffer-substring-no-properties
+  - will now use the more correct one that was already there.
+
+* w3-display.el (w3-pause): Now has its own mini-event loop to pass off
+  scrolling commands, etc.  Keeps buffer position constant while doing
+  incremental display.
+
+Mon May 12 08:13:27 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-view-this-url): Check the parent widget for an href if you
+  don't find one right away.  This means that all commands that act on the
+  URL at point will now work on image widgets, etc. that are hyperlinks.
+
+Sat May 10 14:37:25 1997  William M. Perry  <address@hidden>
+
+* css.el (css-parse): Deal better with newline-challenged stylesheets
+  (css-parse): Don't be so aggressive in finding block data for @xyzzy
+  directives.
+
+* mm.el (mm-viewer-passes-test): Always run the tests in the users home
+  directory.
+
+* w3-mouse.el: Use down-mouse-N in Emacs 19, to be more consistent with
+  how the XEmacs keybindings work.
+
+Fri May  9 11:32:46 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-document-information): some formatting changes
+
+Thu May  8 14:06:40 1997  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.86 released
+
+* mule-sysdp.el (mule-code-convert-region): Try to deal gracefully with
+  the recent XEmacs 20.0 -> 20.2 renaming of the autodetect coding system
+  to automatic-conversion
+
+* w3-sysdp.el (event-point): New stub.
+
+* url-cookie.el (url-cookie-handle-set-cookie): Don't use the 'warn'
+  facility for bad cookie 'set' commands, was too annoying.
+
+* w3.el (w3-save-as): Make sure to require ps-print before trying to
+  save/mail a document as postscript.  The local binding of
+  ps-spool-buffer-name was causing the defvar not to happen, and you would 
+  get errors when trying to kill emacs later.  Ugh.
+  (w3-document-information): Make sure to escape entities for meta and
+  other info we throw in.
+
+* url-file.el (url-file): ftp/file retrieval can now be asynchronous
+  through the magic of [ange-ftp|efs]-copy-file-internal
+
+* url.el (url-sentinel): Allow a buffer as the first argument to
+  the sentinel function.
+  (url-retrieve-internally): Allow asynch ftp transfers
+
+* url-file.el (url-file): Asynchronous ftp downloads work now.
+
+* w3.el (w3-download-url): Made this function interactive.
+
+Mon Apr 28 13:31:36 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-download-url-at-point): new function to download document
+  under point.
+  (w3-download-this-url): new function to download current document.
+
+* w3-vars.el (w3-mode-map): Added 'D' and 'd' bindings for starting
+  document downloads.
+
+Thu Apr 24 08:29:34 1997  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.85 released
+
+* w3-display.el (w3-display-table-dimensions): Deal with
+  colgroup/thead/tfoot/col better.  Before was ignoring the rest of the
+  table.  ack.
+  (w3-display-table): ditto
+
+* w3-prefs.el (w3-preferences-restore-variables): Slap things into
+  custom-land where they belong.
+
+* A few customization tweaks.
+
+Wed Apr 23 21:44:59 1997  <address@hidden>
+
+* w3-e19.el (w3-store-in-clipboard): Make this work under OS/2
+
+Tue Apr 22 07:23:51 1997  William M. Perry  <address@hidden>
+
+* devices.el: Removed defsubsts so that we should be able to share .elc
+  files again between emacs and XEmacs.
+
+* font.el: Added in code to make a face blink.  Causes lots of screen
+  flicker under Emacs 19 though, so it is turned off by default.  Turn it
+  on with ESC-: (font-blink-initialize) - should be able to optimize when
+  the callback actually does anything based on what fonts are visible in
+  the visible buffers.
+  (font-face-visible-in-window-p): New function to tell if a face is
+  visible in a buffer window.
+  (font-map-windows): New function to map a function over all visible
+  windows.
+  (font-blink-callback): Use them to optimize so that invert-face is not
+  called unless absolutely necessary.
+
+Mon Apr 21 08:58:02 1997  William M. Perry  <address@hidden>
+
+* w3-e19.el: Added in compile-time require of w3-props so that pages with
+  backgrounds don't puke and die.
+
+* w3.el (w3-find-default-stylesheets): Don't load a user's personal
+  stylesheet if we started up in '-q' mode.
+
+* Emacs/W3 3.0.84 released
+
+* w3-display.el: When using XEmacs 20.x w/mule support, we now define our
+  own special character set.  This means that the table border chars work
+  again in XEmacs/mule
+
+* devices.el: Added magic to not optimize this file under XEmacs - its not 
+  actually used, so no damage.  It wouldn't compile under XEmacs because
+  it has subrs for all these, and our declaring them as defsubsts
+  thoroughly confuses the byte-compiler.
+
+Sun Apr 20 12:19:56 1997  William M. Perry  <address@hidden>
+
+* w3-sysdp.el: Moved device stuf out into its own devices.el file so that
+  it can be correctly byte-compiled.
+  Ditto for the text properties stuff (into w3-props.el)
+
+Fri Apr 18 13:09:31 1997  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.83 released
+
+* Synch'd up to Widget 1.89
+
+Thu Apr 17 06:20:56 1997  "T. V. Raman" <address@hidden>
+
+* default.css (pre/xmp/plaintext/key/code/tt): Changes to default
+  stylesheet for spoken output of normally `monospaced' text.
+
+Tue Apr 15 16:28:11 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-find-specific-link): Don't signal an error in a target anchor
+  (#foo) is not found.
+
+Tue Apr 15 08:22:37 1997  John Palmieri <address@hidden>
+
+* w3.el (w3-complete-link): protect against errors when hitting return
+  when point isn't on a link
+
+Mon Apr 14 16:18:43 1997  William M. Perry  <address@hidden>
+
+* mm.el (mm-parse-mailcaps): Moved ~/.mailcap to the front of the list so
+  that it gets parsed last, and has the highest priority.
+
+Sun Apr 13 20:28:30 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-complete-link): now correctly defaults to following the link
+  at point.
+
+Sat Apr 12 19:35:26 1997  William M. Perry  <address@hidden>
+
+* w3-speak.el: use widget-at instead of emacspeak-widget-at
+
+Fri Apr 11 07:39:26 1997  William M. Perry  <address@hidden>
+
+* w3-menu.el (w3-menu-edit-menu): Addded a preferences submenu with all
+  the W3 & URL customization items underneat it.
+
+* css.el (css-split-font-shorthand): Handle bad lists better
+
+* Emacs/W3 3.0.82 released
+
+* Synch'd up with Widget 1.78
+
+* w3-display.el (w3-get-face-info): Don't look for face attributes on tags
+  unless w3-user-colors-take-precedence is nil
+  (w3-display-node): Don't honor face attributes on <body> tag unless
+  w3-user-colors-take-precedence is nil
+
+* url-vars.el: Modified a few customizations to make them prettier
+
+* url-cache.el (url-cache-creation-function): Modified customization
+
+Fri Apr 11 07:03:20 1997  Hrvoje Niksic <address@hidden>
+
+* url-cache.el, url-gw.el, url-cookie.el, url-irc.el, url-vars.el, url.el:
+  All URL related variables are now customizable.
+
+Wed Apr  9 16:46:52 1997  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.81 released
+
+* w3-xemac.el (w3-text-pixel-width): And a XEmacs specific version of it.
+
+* w3-e19.el (w3-text-pixel-width): New function to return the pixel width
+  of a piece of text.
+
+* url.el (url-handle-no-scheme): Use it.
+
+* url-vars.el (url-handle-no-scheme-hook): New hook that should expand a
+  partial url like 'gnu' to a full URL, like 'http://www.gnu.org/'.
+
+* w3-sysdp.el (run-hook-with-args-until-success): Added a stub for
+  run-hook-with-args-until-success
+
+Tue Apr  8 12:20:39 1997  William M. Perry  <address@hidden>
+
+* w3-auto.el: Added autoloads for all the functions in url-ns for proxy
+  functions, and url-mail
+
+* url-ns.el (isPlainHostName): Fixed isPlainHostName
+
+* w3-parse.el (w3-parse-buffer): now throws up a bad style warning for
+  images without ALT attributes.
+
+* mm.el (mm-parse-mailcaps): Reverse the ':|;' separated path for MAILCAPS
+  so that earlier items take precedence, like standard unix PATH-like
+  variables do.
+  (mm-parse-mimetypes): Ditto for MIMETYPES
+
+Mon Apr  7 06:23:11 1997  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.80 released
+
+* w3-parse.el: Some more transitions - don't imply <p> after some form
+  tags.
+
+* url-misc.el (url-finger): Ditto
+
+* url-http.el (url-http): Ditto
+
+* url-gopher.el (url-gopher-retrieve): Put in a process-sentinel of
+  'ignore so that stupid 'process xxx exited with code nnn' messages are
+  not shown.
+
+* url.el (url-sentinel): Ditto
+
+* w3.el (w3-sentinel): remove call to url-clean-text - no longer needed
+
+Mon Apr  7 02:57:19 1997  Greg Stark  <address@hidden>
+
+* url.el (url-sentinel): once and for all eliminate the "first character
+  goes to wrong buffer" bug through brute force by setting the current
+  buffer to the buffer of the selected window at the end of a sentinel.
+
+* w3.el (w3-viewer-sentinel): ditto
+
+* w3-widget.el (widget-image-value-create): set tab-order to -1 on the
+  choice-items of client-side imagemaps to avoid having tab stop on them
+  three times, (it still stops on them twice) 
+
+* Makefile: add "make fast" rule to not run a bazillion emacsen
+
+* FAQ: typos
+
+* docomp.el: try setting byte-compile-dynamic to t to reduce memory usage
+
+Fri Apr  4 06:23:31 1997  William M. Perry  <address@hidden>
+
+* url-file.el (url-format-directory): Use insert-file-contents instead of
+  -literally, so that ftp index files will work.
+
+* w3-emulate.el: lots of new commands to spoof the user-agent string.  See
+  turn-[on|off]-[lynx|netscape|ie|arena]-masquerade-mode functions.
+
+Thu Apr  3 07:22:27 1997  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.79 released
+
+* w3-parse.el: Put in <p> as part of the content-model of <ul/ol> so that
+  <p> at the front of a list doesn't cause a bogus list item to be shown.
+
+* url-http.el (url-parse-mime-headers): Make proxy authentication sort of
+  work again.
+
+* w3-display.el (w3-setup-terminal-chars): Check to see whether face is
+  actually different before trying to set its font to a terminal one.
+
+* url.el (url-buffer-visiting): Better matching of URLs - it was taking
+  the target into account - bad bad bad.
+
+Wed Apr  2 18:05:11 1997  William M. Perry  <address@hidden>
+
+* w3-forms.el (w3-form-add-element): New way to do hidden form
+  fields that retains the order information - damned idiots out there rely
+  on ordering.  !#%!@
+
+* w3.el (w3-fetch): Put some of the logic about _blank/_top frame targets
+  into w3-fetch
+
+* w3-display.el (w3-get-all-face-info): Added in support for the 'face'
+  attribute to specify font-family
+
+Wed Apr  2 13:08:36 1997  Frederic Lepied <address@hidden>
+
+* w3-print.el (w3-print-this-url): Need to run LaTeX to get the indices
+  right.
+
+Tue Apr  1 11:20:54 1997  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.78 released
+
+* css.el (css-color-light-p): New function
+  (css-active-device-types): Use it to add a 'dark' or 'light' property to
+  the active device types as necessary
+
+Mon Mar 31 09:07:13 1997  William M. Perry  <address@hidden>
+
+* w3-parse.el: More error transitions for tables (push tr before td/th
+  just after a table)
+
+* w3-display.el (w3-display-node): Use it for body/html attribute handling
+  (w3-fix-color): New function to make sure we don't pass hex values without
+  "#" in front of them.
+
+Sun Mar 30 15:00:59 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-display-node): Now honors alink/vlink/link attributes
+  on the body tag.
+  (w3-fixup-eol-faces): Fixed nuking of faces at end of line to deal with
+  bad underlining behaviour of Emacs 19.
+
+Sun Mar 30 14:28:32 1997  Greg Stark <address@hidden>
+
+* w3-e19.el (w3-mode-version-specifics): Fixed buffer read-only errors
+  when trying to set a background face.
+
+Fri Mar 28 10:41:43 1997  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.77 released
+
+* w3-display.el (w3-display-table): Face properties specified on the
+  'table' element now propogate to table cells correctly.
+
+Fri Mar 28 07:53:48 1997  Greg Stark <address@hidden>
+
+* w3-forms.el: Make sure we set the button-face on all widgets
+
+Fri Mar 28 07:53:48 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-frames): Use make-frame, not make-frame-command, so it
+  will work on XEmacs.
+
+* w3-e19.el (w3-mode-version-specifics): Now honors background/foreground
+  color requests in Emacs19 by coloring in the whole buffer.  Oh how I
+  wish Emacs 19 had buffer-local faces.
+
+* w3-display.el (w3-display-table): Tables now look better under Emacs 19
+
+Thu Mar 27 08:05:34 1997  William M. Perry  <address@hidden>
+
+* font.el (font-x-registry-and-encoding-regexp): got rid of compile
+  warning under Emacs 19
+
+* w3-display.el (w3-display-handle-list-type): manually remove faces on
+  bullet/list items
+  (w3-display-node): We were being a bit rude to inhibit-read-only -
+  sometimes would leave it 't', which is bad bad bad, some might even say
+  pure evil.
+
+* Emacs-W3 3.0.76 released
+
+* Synch'd up to Widget 1.68
+
+* w3-display.el (w3-display-node): Handles 'text' attribute correctly now
+  to set the default foreground when requested.
+
+* mm.el (mm-play-sound-file): Fixed it for new mule stuff
+
+* url-gw.el (url-gateway-nslookup-host): Added autoload for
+  gateway-nslookup-host
+
+* w3-display.el (w3-display-table): Expand each line of a table cell out
+  to the border, so that we get nicely colors backgrounds for table cells
+  now.
+
+* font.el (font-x-registry-and-encoding-regexp): New variable to match the
+  registry and encoding of a font name under X
+  (x-font-create-object): Use it to set the default registry and encoding
+  for font objects we create from font names.
+  (x-font-create-name): Grab the registry and encoding from the default
+  object for this device before defaulting back to '*'
+
+* w3-display.el (w3-setup-terminal-chars): Explicitly specify wildcard
+  registry and encoding for the table-hack-x-face, to deal with changes in
+  the font library.
+
+Wed Mar 26 06:23:51 1997  William M. Perry  <address@hidden>
+
+* custom-check: Should work better now, and spit out better instructions
+  for rebuilding correctly.
+
+* Emacs-W3 3.0.75 released
+
+* url.el (url-clean-text): Better matching of bogus process exited
+  messages.
+
+* font.el (font-rgb-color-p): No longer match "^#xxyyzz" as an rgb-color,
+  this screwed up bigtime in font-color-rgb-components.
+  (font-set-face-foreground): Do the test here instead.
+  (font-set-face-background): and here.
+
+* w3-widget.el (widget-image-value-create): For client side imagemaps,
+  make sure case-fold-search or :ignore-case is specified.
+
+* url-gw.el (url-gateway-nslookup-program): Default to using 'nslookup' as
+  url-gateway-nslookup-program
+
+Tue Mar 25 16:06:28 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.74 released
+
+Tue Mar 25 15:31:56 1997  Greg Stark <address@hidden>
+
+* url-cookie.el (url-cookie-handle-set-cookie): don't deal with address@hidden
+  microsoft web site cookies - they break good, clean, wholesome sites
+  like yahoo's stock pages.
+
+* ssl.el (ssl-program-arguments): Make sure everything gets turned into a
+  string, not an integer.
+  (open-ssl-stream): use a pipe instead of a pty if possible (why?)
+
+* w3-display.el (w3-display-node): Added back in <keygen> support
+
+* w3.el (w3-notify-when-ready): protect against bad buffer switching
+  (minibuffer as active window lossage, etc)
+
+* w3-toolbar.el (w3-toolbar-make-buttons): Don't warn about toolbar
+  directory on Emacsen that can't do toolbars!
+
+Tue Mar 25 15:31:56 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.73 released
+
+* w3-display.el (w3-get-face-info): Allow passing in a second argument
+  that means 'check this attribute of the html tag if you don't find
+  something in the stylesheet'.  This automatically enables <font color>
+  and <table|td|tr bgcolor>.
+
+Tue Mar 25 06:45:02 1997  T. V. Raman <address@hidden>
+
+* w3-forms.el (w3-form-keymap): patch to avoid lossage with emacspeak &
+  using terminal.el
+
+Tue Mar 25 06:45:02 1997  William M. Perry  <address@hidden>
+
+* ssl.el (ssl-program-arguments): Removed -quiet switch, since it requires
+  patches to s_client
+
+Mon Mar 24 10:56:11 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.72 released
+
+* w3-display.el (w3-display-node): Better handling of body and html style
+  attributes in XEmacs
+
+* w3.el (w3-mode): Removed call to kill-all-local-variables, as it
+  nukes buffer-local faces as well.
+
+* css.el (css-expand-length): Don't choke and use the wrong damn thing to
+  base percentages off of on percentage heights (ie: font-size: 80%)
+
+Mon Mar 24 07:12:52 1997  Gerry S Hayes <address@hidden>
+
+* url-gw.el (url-open-telnet): Fixed stupid typo into-to-string ->
+  int-to-string
+  (url-open-rlogin): Ditto.
+
+Sun Mar 23 09:43:24 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-table-ascii-border-chars): Use a '+' in the ascii art
+  version of table borders.
+
+Sat Mar 22 00:45:34 1997  William M. Perry  <address@hidden>
+
+* w3-menu.el (w3-use-menus): Customized this variable
+
+* w3-display.el (w3-display-node): Don't run multiline text area's default
+  value through w3-normalize-spaces
+
+Thu Mar 20 23:44:50 1997  Greg Stark  <address@hidden>
+
+* w3-cus.el (w3-use-terminal-characters): New variable
+  (w3-use-terminal-characters-on-tty): New variable
+  (w3-use-terminal-glyphs): New variable
+  (w3-horizontal-rule-char): Make setting it to nil allow use of graphic
+  characters (also means people can avoid using graphic charactes for
+  horizontal rules if they wish)
+* w3-display.el (w3-handle-image): clean up whitespace in alt tags
+  (w3-table-glyph-border-chars): New variable
+  (w3-table-graphic-border-chars): New variable
+  (w3-terminal-properties): New variable
+  (w3-insert-terminal-char): New inline function
+  (w3-horizontal-rule-char): New inline function 
+  (w3-setup-terminal-chars): Set up all of these and make using graphic
+  characters work on XEmacs using text properties (and optionally use text
+  properties on FSF Emacs too). 
+  (w3-table-hack-borders): Remove, obsoleted by w3-setup-terminal-chars
+  (w3-table-unhack-borders): don't have to fiddle with
+  w3-horizontal-rule-char any more.
+  (w3-display-table): Use w3-insert-terminal-char
+  (w3-size-of-tree):  Use w3-horizontal-rule-char
+  (w3-display-node):  Use w3-horizontal-rule-char, w3-insert-terminal-char,
+  uhm, i'm not sure if it was correct to remove the handle-content
+* w3-forms.el (w3-fixup-eol-faces): try to remove mouse-face from end-of-lines 
as
+  well, uhm, this doesn't seem to work though. 
+  (w3-form-determine-size): add keygen 
+  (w3-form-encode-helper): add keygen support for the day when the ssl code
+  itself is released. 
+* w3-widget.el (widget-image-value-create): use 'item widgets instead of
+  'push-button widgets and specify the format ourselves so we don't get
+  widget.el's arbitrary formatting.
+* w3.el (w3-do-setup): call w3-setup-terminal-chars to make nice tables and
+  horizontal rules the default at least under X.
+* mm.el added x-x509-ca-cert and x-x509-user-cert viewers but the tests
+  will fail so no one should should see this change until i release the
+  functions.
+       
+Fri Mar 21 18:52:31 1997  William M. Perry  <address@hidden>
+
+* css.el (css-expand-length): Better support for percentage values in
+  lengths
+
+Thu Mar 20 06:22:29 1997  Istvan Marko <address@hidden>
+
+* Added slot for no_proxy settings under the preferences panel
+
+Thu Mar 20 06:22:29 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.71 released
+
+* w3-parse.el:Added more transitions for error handling of raw 'td' or
+  'th' outside of a 'tr' in tablebody.
+
+* url.el (url-default-callback): asynch downloads should now be cached
+
+* w3-script.el (w3-do-scripting): Customized, turned off by default
+
+Wed Mar 19 20:53:23 1997  Steven L Baur  <address@hidden>
+
+* Makefile (xemacs-w3): Special target for XEmacs Build.
+
+Wed Mar 19 05:56:56 1997  William M. Perry  <address@hidden>
+
+* font.el (x-font-families-for-device): Just in case
+  font-default-family-for-device fails under Emacs/NT, return "monospace"
+  at the front of the list.
+
+* url-vars.el (url-privacy-level): Now defaults to not sending your email
+  address in HTTP requests.
+
+Tue Mar 18 13:09:13 1997  William M. Perry  <address@hidden>
+
+* url-cookie.el (url-cookie-handle-set-cookie): Fixed variable typos -
+  doh.  Today just hasn't been my day.
+
+* Emacs-W3 3.0.70 released
+
+* We now pass all tests on the forms tester page
+  http://www.research.digital.com/nsl/formtest/home.html
+
+* w3-display.el (w3-display-node): Better handling of <select multiple>
+  and <select> in general.
+
+* w3-forms.el (w3-form-encode-xwfu): Encode : and / in xwfu, since the
+  form tester expects it.
+
+* url-cookie.el (url-cookie-trusted-urls): New variable - list of regexps
+  of URLs that you will accept cookies from without question.
+  (url-cookie-untrusted-urls): New variable - list of regexps of URLs that
+  you will _never_ accept cookies from.
+  (url-cookie-handle-set-cookie): Use them
+  (url-cookie-handle-set-cookie): When asking whether to allow a site to
+  set a cookie, show the cookies they are wanting to set.
+
+Tue Mar 18 06:47:46 1997  Thierry Emery <address@hidden>
+
+* w3-display.el: Latest round of patches for <frames> support.
+
+* w3-cus.el (w3-display-frames): can now have 4 values.
+       nil             no frame display whatsoever (currently the default)
+       'as-links       display frame hyperlinks, but do not fetch them
+       'ask            display frame hyperlinks and ask whether to fetch them
+       t               display frame hyperlinks and fetch them
+
+Tue Mar 18 06:47:46 1997  William M. Perry  <address@hidden>
+
+* w3-parse.el (w3-parse-buffer): Duh, don't do `=' comparison on results
+  of char-after, since it is nil at the end of the buffer.
+
+Mon Mar 17 08:44:46 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.69 released
+
+* w3-sysdp.el (buffer-substring-no-properties): Added stub
+
+* url-gopher.el (url-gopher-retrieve): Ditto.
+
+* url.el: Ditto
+
+* w3-parse.el: Removed all sorts of fun (following-char) commands that can
+  cause ebola warnings under XEmacs 20.x
+
+* w3.el (w3-popup-info): Default to the URL under point instead of the
+  documents URL
+
+* w3-auto.el: updated autoloads - made sure everything was interactive if
+  appropriate.
+
+* w3-menu.el (w3-popup-menu): If w3-popup-menu-on-mouse-3 is nil, call
+  whatever button3 is bound to in global-map
+
+* w3-display.el: Added XEmacs version of frame-char-height and
+  frame-char-width
+  (w3-frames): If w3-display-frames is non-nil, then do a refresh with it
+  bound locally, so everything should just work.
+
+* url.el (url-do-setup): Global history file now defaults to ~/.w3/history
+  (url-do-setup): Cookie storage now defaults to ~/.w3/cookies
+
+Mon Mar 17 06:51:07 1997  Paul Stodghill <address@hidden>
+
+* mm.el (mm-temporary-directory): Initialize variable from TMPDIR
+  environment variable
+
+Fri Mar 14 13:35:56 1997  William M. Perry  <address@hidden>
+
+* w3-forms.el (w3-form-create-custom): Fixed the 'custom' input type for
+  new filenames in the widget/custom package.
+
+* ssl.el (ssl-certificate-verification-depth): New variable to control how
+  far up a cert chain to look.
+  (ssl-view-certificate-program-name): New variable.
+  (ssl-view-certificate-program-arguments): New variable.
+  (ssl-certificate-directory-style): New variable.
+  (ssl-rehash-program-name): New variable.
+  (ssl-certificate-directory): New variable.
+  (ssl-program-arguments): Use some of them.
+  (ssl-accept-ca-certificate): Use the rest.
+
+* css.el (css-parse-args): Removed old code that could cause infinite loop
+  in stylesheet parsing on bad things like "foo=bar" instead of "foo:bar"
+
+* w3-cus.el: Added better groupings for the customization stuff.
+
+Thu Mar 13 19:54:50 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.68 released
+
+* w3-cus.el: Added customization support for Emacs-W3
+
+* w3.el (w3-mail-current-document): Use url-mail-command instead of
+  w3-mail-command
+
+Thu Mar 13 11:41:42 1997  Greg Stark  <address@hidden>
+
+* w3-prefs.el: Implemented privacy panel
+
+Wed Mar 12 10:25:38 1997  William M. Perry  <address@hidden>
+
+* w3-e19.el (w3-mode-version-specifics): Use the nasty crufty
+  buffer-access-fontify-functions to make sure that we never yank
+  read-only text out of the Emacs-W3 buffer.
+
+* Synch'd up to Widget 1.62
+
+Wed Mar 12 06:36:41 1997  Paul Stodghill <address@hidden>
+
+* base64.el (base64-decode-region): Fixed typo in calling
+  command-on-region.
+
+Tue Mar 11 07:03:48 1997  William M. Perry  <address@hidden>
+
+* w3-auto.el (w3-use-hotlist): Made autoload interactive
+
+* w3-widget.el (widget-image-value-create): Was a little too aggressive
+  about when to apply the -1 :tab-order property.  Now only images that
+  are not hyperlinks or imagemaps will not be tabbed to.
+
+* w3-prefs.el (w3-preferences-init-proxy-panel): Updated preferences panel
+  for new format of url-proxy-services
+
+* w3-vars.el (w3-hyperlink-menu): Fixed problem with calling wrong
+  bookmark function - would create a bookmark to the current document, not
+  the document under the mouse.
+  (w3-popup-menu): Added a few menu itmes (reload, show images, add bookmark)
+
+* w3-hot.el (w3-hotlist-add-document-at-point): Extract the title
+  correctly for the new widget implementation of hyperlinks.
+
+Mon Mar 10 06:31:48 1997  William M. Perry  <address@hidden>
+
+* w3-menu.el (w3-menu-options-menu): Fixed problem with XEmacs when
+  building without toolbars - would insert nil in the menu in a very wrong
+  place.
+
+* font.el (font-normalize-color): Under win32, make sure we define the
+  color before we try to use it, since Emacs doesn't support raw #RRGGBB
+  color specifications yet.
+  (font-rgb-color-p): make all #RRGGBB color specs go through
+  font-normalize-color
+
+* Emacs-W3 3.0.67 released
+
+Mon Mar 10 1997  Dave Love  <address@hidden>
+
+* w3.el (w3-do-setup): Make configuration file loading contingent
+  on init-file-user (i.e. suppressed with -q).
+
+Sun Mar  9 13:09:38 1997  William M. Perry  <address@hidden>
+
+* w3-widget.el (widget-image-value-create): Set :tab-order to -1 so the
+  latest widget library won't tab to image widgets.
+
+* w3.el (w3-mode): Make sure w3-mode-hook is run last, so that people can
+  turn off truncate-lines if they want.
+
+* ssl.el (open-ssl-stream): ssl-program-arguments is now dynamically
+  evaluated, similar to ps-lpr-switches.  The special symbols 'host' and
+  'port' are available, and bound to the hostname and port#/service we are
+  about to connect to.
+
+* w3-display.el (w3-finish-drawing): Remove all read-only properties on
+  text.
+
+* url-cache.el (url-cache-expired): fixed standalone mode
+
+Sat Mar  8 09:13:59 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.66 released.
+
+* url-cache.el (url-cache-prepare): Threw a condition-case around the
+  make-directory call, just in case we can't create the file for some
+  reason.  Also fixed bug where the file wouldn't be cached until the
+  second time you visited it.
+
+* url.el (url-retrieve-internally): Deal with https asynch
+
+* w3-xemac.el (w3-mode-version-specifics): Don't try to add the toolbar if
+  device-type == 'stream.
+
+* w3-vars.el (w3-temporary-directory): Ditto.
+
+* url-vars.el (url-temporary-directory): Initialize from TMPDIR
+  environment variable.
+
+* w3.el (w3-start-viewer): Ditto.
+
+* md5.el (md5): Ditto.
+
+* mm.el (mm-compose-type): Don't use hardcoded /bin/sh and -c - use
+  shell-file-name and shell-command-switch
+  (mm-viewer-passes-test): ditto.
+
+* w3-sysdp.el: Better device-* functions for Emacs-19 under win32 and OS/2
+
+* w3-display.el (w3-display-node): Better handling for <noframes> support.
+
+Fri Mar  7 06:13:20 1997  William M. Perry  <address@hidden>
+
+* w3-script.el (w3-script-evaluate-form): protect against bad input during
+  the read-from-string when parsing emacs-lisp scripts.
+
+* w3-auto.el (w3-preferences-edit): Make the autoload for this be
+  interactive so that the user can actually find it!
+
+* Emacs-W3 3.0.65 released.
+
+* w3.el (w3-document-information): Better handling of last-modified
+  findings.
+
+* w3-forms.el (w3-form-create-image): Try to use the value of an
+  image-input area as the label for the widget we create.
+
+* w3-elisp.el (w3-elisp-safe-eval): Throw a condition-case() around the
+  eval to catch bad forms, etc.
+
+* w3-script.el (w3-script-evaluate-form): Don't signal an error on unknown
+  scripting languages, just show a warning.
+
+Thu Mar  6 08:24:49 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-complete-link): Protect against malformed widgets (null :from
+  or :to).  Is this from delayed image widgets?
+
+* w3-vars.el (w3-mode-map): Changed binding of M-s to w3-save-as instead
+  of w3-search - does anybody use that instead of the forms interface?
+
+* w3.el (w3-document-information): Show document size
+
+* css.el (css-parse): Removed warning about old-style stuff for
+  device-dependent styles - was too annoying.  Need to just remove this
+  support totally for the 3.0 release.
+
+* w3.el (w3-internal-handle-preview): When previewing a buffer, remove all
+  text properties from the document source before doing anything.
+  (w3-mail-current-document): Bind case-fold-search when looking for where
+  to insert the <base> tag.
+  (w3-loaded-stylesheets): New variable to keep track of what stylesheets
+  were loaded at startup.
+
+* url-cache.el (url-cache-create-filename-human-readable): New function to
+  create cached filenames using the old method, that was slightly more
+  human readable.
+
+Wed Mar  5 15:38:00 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.64 released
+
+* w3-parse.el: OH god, finally got raw text inside a <tr> to push a <td>
+  onto the parse tree.  got raw text inside a <table> to push a <tr>
+  onto the parse tee.
+
+* w3-widget.el: Support 'target' in img widgets
+
+Tue Mar  4 07:55:56 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-display-node): Support 'seqnum' attribute
+
+* w3.el (w3-mail-document-author): Fixed for new 'link' representation
+  (w3-document-information): If a document has a 'Last modified: blah' line,
+  use it as the last modified information as a last resort.
+
+* Synch'ed up with widget 1.50
+
+* w3-forms.el: Try to play nice with old and new versions of
+  widget-edit/wid-edit.el
+
+Tue Mar  4 06:23:41 1997  Michael Ernst <address@hidden>
+
+* url.el (url-get-url-at-point): If a possible URL starts with www., slap
+  on 'http://', as someone probably just forgot it.
+
+Tue Mar  4 06:23:41 1997  William M. Perry  <address@hidden>
+
+* w3-prefs.el (w3-preferences-hooks-variables): Removed some old variables.
+  (w3-preferences-edit): The preferences panel actually works again.  No
+  longer tries to use an imagemap - a dropdown is good enough dammit.
+
+* w3-vars.el: Removed some old variables
+
+* w3-display.el (w3-display-node): For <a> tags, do not embed a widget in
+  the buffer unless it actually has an 'href' attribute.  This helps a
+  _lot_ with <a name="blah">...</a> constructs.
+
+Tue Mar  4 06:18:06 1997  Toby Speight <address@hidden>
+
+* w3.el (w3-mail-current-document): Allow TM (if it's in use) to choose
+  the appropriate Transfer-Encoding of a mailed document.
+  (w3-mail-current-document): Try real hard to put <base> where it belongs
+  (in the <head>, if that is not found, then just after <html>, otherwise
+  just at the beginning of the document)
+
+Mon Mar  3 07:10:11 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.63 released
+
+* w3-forms.el (w3-form-field-label): Labels are now reimplemented for form
+  fields
+
+* w3-display.el (w3-parse-link): Now honors the old variable
+  w3-honor-stylesheets, which hadn't made it back onto the reimplemented
+  features list yet.
+
+* font.el: Added quite a few autoloads.  Package no longer overwrites the
+  set-face-* functions, as this was deemed evil in the extreme.
+
+* w3-display.el (w3-face-for-element): Use the font-set-face-* functions
+  instead of the raw set-face-* functions.
+
+* w3-widget.el (widget-image-inaudible-p): New variable that controls
+  whether image widgets are rendered inaudible by emacspeak or not.
+  (widget-image-value-set): Use it.
+
+* url-cache.el (url-cache-directory): New variable that controls where you
+  cache files will be stored.  Defaults to "~/.w3/cache"
+  (url-cache-creation-function): New variable that controls what function
+  will be used to create cached filenames.
+  (url-cache-create-filename-using-md5): This is now the default (and
+  only) cache-file-creation function.  Suitably fast under Emacs 19 (lisp
+  implementation), _very_ fast under XEmacs, where it is written in C.
+
+Thu Feb 27 07:27:43 1997  William M. Perry  <address@hidden>
+
+* w3-sysdp.el: Added alias of make-symbolic-link to copy-file for NTEmacs
+
+* w3-elisp.el: Removed face functions from the safe list.
+
+Wed Feb 26 16:08:08 1997  Per Abrahamsen  <address@hidden>
+
+* font.el (font-create-object): Added autoload.
+
+Wed Feb 26 08:17:37 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-region): Fixed typo when binding
+  w3-display-same-buffer - no wonder it wasn't working right.
+
+* images.el (image-normalize): Bind file-coding-system to the appropriate
+  no-conversion so that running subprocesses doesn't munge the data when
+  running under MULE.
+  (image-normalize): Now uses call-process-region instead of
+  shell-command-on-region, and removed the explicit mention of '/bin/sh'
+  and friends.  Uses the ability of call-process-region to specify a
+  separate file to use for stderr - yipeee.
+
+* url.el (url-setup-privacy-info): Slight change as to how url-system-type
+  and url-os-type are set up.  No longer uses nested parens, as this seems
+  to confuse some sites that try to use the User-Agent header as a
+  state-tracker.
+
+Mon Feb 24 10:15:45 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-widget-echo): Make sure that nothing that will be
+  echoed is the empty string.
+
+Sun Feb 23 08:34:18 1997  William M. Perry  <address@hidden>
+
+* url-cache.el (url-store-in-cache): fixed stupid bug in caching logic
+
+Sat Feb 22 07:21:29 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.62 released
+
+Thu Feb 20 13:40:22 1997  William M. Perry  <address@hidden>
+
+* w3-forms.el (w3-form-summarize-password): By default, don't summarize
+  password entry boxes.
+
+Thu Feb 20 07:33:59 1997  Thierry Emery <address@hidden>
+
+* w3-display.el (w3-frames): Better support for Frames
+
+Thu Feb 20 07:33:59 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-complete-link): Fixed bug in using try-completion to make sure
+  we have a match before passing a URL off to w3-fetch.
+
+* Synch'd up to widget 1.44
+
+* url.el (url-default-callback): Caching works in asynch mode now.
+
+Wed Feb 19 05:48:40 1997  William M. Perry  <address@hidden>
+
+* css.el (css-split-font-shorthand): Make sure that the subelements of the
+  'font' shorthand property get run through the property value-expansion
+  routines before getting returned.  This royally screwed up font-family,
+  font-weight, and friends.
+  (css-expand-color):  Now recognizes 'transparent' and 'none' as special
+  color names.
+  (css-expand-value): When dealing with color-shorthand, make sure
+  everything gets run through the value-expansion routines as well.  Ack.
+
+* w3-elisp.el (w3-elisp-safe-function): You can now supply a validation
+  function for the arguments of a script-enabled function, its no longer a
+  binary operation on just the function name.  You can also give it a
+  variable name, and the value of that variable at the time of execution
+  is what controls whether it is safe or not.
+
+* w3.el (w3-download-url): Finally fixed bug where w3-download-url would
+  not save in the correct directory if you just accepted the default
+  pathname it offered.
+
+* url-cache.el (url-cache-ignored-protocols): New variable controlling
+  what protocols we should never cache to disk.
+  (url-cache-cachable-p): use it.
+
+* w3.txi: Updated all nodes and menus, a few stylistic changes
+
+* w3-elisp.el: Added read-access to devices, frames, windows, buffers, and
+  property-lists.  Also added function, lambda, point, and list accessors
+  (member, memq, assoc)
+
+* w3-display.el (w3-display-node): Bind widget-push-button-gui to nil in
+  w3-display-node so that images don't run into the
+  visible-portion-of-buffer-is-not-modifiable-bug.  Ick.
+
+* w3-elisp.el: Don't allow access to 'set'-type text-property functions
+  from scripts.
+
+Tue Feb 18 15:11:08 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.61 released
+
+* w3.txi (Supported URLs): added sections on each protocol supported -
+  needs lots of fleshing out.
+
+* url-misc.el (url-info): Info URL loader now unhex's the target, so that
+  you can have something like info:w3.info#Getting%20Started
+
+* url.el (url-do-setup): Removed secure-http (SHTTP) handler - who the
+  hell cares anymore, it lost.
+
+* w3-display.el (w3-display-node): Correctly calculates right margin as
+  documented (from window-width and right-margin)
+
+* w3.el: Removed w3-batch-fetch
+
+* url-vars.el: Removed lots of old variables
+
+* url-misc.el: Removed x-exec URL handler - no interest anymore.
+
+* w3-script.el (w3-script-evaluate-form): Use it.
+(w3-do-scripting): New variable to control whether to do _any_ scripting
+or not.
+
+* The URL package now stores the current parsed URL object instead of 5 or
+  6 separate variables.
+
+* dist.Makefile: Removed old pgp and wais support, it was gross and
+  apparently nobody was using it.
+
+Tue Feb 18 06:13:03 1997  "T. V. Raman" <address@hidden>
+
+* w3-forms.el (w3-form-summarize-radio-button): Better radio button
+  summarizer.
+
+Tue Feb 18 06:13:03 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-finish-drawing): Moved #blah target finding in here,
+  where it belongs.
+
+* w3-vars.el (w3-mode-map): Added binding for raw '\t' instead of relying
+  on [tab].  Apparently this keysym isn't aliased under Emacs 19 on a
+  TTY.
+
+Mon Feb 17 15:10:38 1997  William M. Perry  <address@hidden>
+
+* w3-elisp.el: Interface to Emacs-Lisp for safe scripting.
+
+* w3-script.el: Basic client-side scripting has been implemented.
+
+* w3-xemac.el (w3-mouse-handler): Ditto
+
+* w3-e19.el (w3-mouse-handler): Plugged in handling of the onMouseOver event
+
+* w3-display.el (w3-handle-string-content): Now adds a text property that
+  contains w3-display-open-element-stack, so that from anywhere in the
+  buffer you can find out where you are in the parse tree.
+
+* default.css (input): ome default stylesheet updates for input fields on
+  TTYs
+
+Sun Feb 16 09:01:18 1997  Shuji Narazaki <address@hidden>
+
+* mule-sysdp.el: Updated for mule 3.0
+
+Sat Feb 15 15:35:15 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.60 released
+
+* w3-display.el (w3-display-node): use it.
+
+* w3-vars.el (w3-display-frames): New variable for whether to show 'frame'
+  documents as a list of the subelements.
+
+* w3.txi (Speech Properties): finished this chapter.
+(Media Selection): ditto
+(Time Units): ditto
+(Angle Units): ditto
+(Properties): Explanatory text at beginnign of section
+
+Fri Feb 14 09:34:35 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.59 released
+
+* w3.txi: Lots of documentation about stylesheets, chapter layout
+  changes.
+
+Thu Feb 13 07:01:59 1997  William M. Perry  <address@hidden>
+
+* Synch'd up to widget 1.38
+
+* w3-forms.el (w3-form-resurrect-widgets): For now, don't use the nice new
+  GUI pushbuttons - they appear to suffer badly on long lines.
+
+* w3-mouse.el (w3-running-FSF19): Use new w3-popup-menu-on-mouse-3 variable
+
+* w3-vars.el: Removed _lots_ of obsolete variables
+(w3-popup-menu-on-mouse-3): New variable to control whether W3 should
+  override mouse-3 or not.
+
+* Emacs-W3 3.0.58 released
+
+* w3.txi: Added stubs for stylesheet chapters and supported URLs
+
+* images.el (image-register-netpbm-utilities): This is now safe to call
+  multiple times again.
+
+Wed Feb 12 06:26:55 1997  William M. Perry  <address@hidden>
+
+* w3-forms.el (w3-form-keymap): When binding widget-end-of-line, make sure
+  that we do not overwrite Emacspeak's prefix-key.  Now does a
+  where-is-internal to find the correct binding in global-map to
+  override.
+
+* w3-display.el (w3-display-node): bind :emacspeak-help to 'w3-widget-echo
+  in all the hypertext links.
+
+* w3-vars.el (w3-mode-map): New binding for \M-\t - this _should_ have
+  been taken care of by the [(meta tab)] definition, but evidently it
+  doesn't.  *sigh*
+
+Tue Feb 11 07:33:50 1997  William M. Perry  <address@hidden>
+
+* w3-forms.el (w3-form-create-option-list): Specify :menu-tag-get so that
+  keyboard-based-completion doesn't get confused by the fact that some
+  items will have spaces slapped in at the end.
+
+* ssl.el (ssl-program-arguments): New variable - a list of command line
+  switches to send to the SSL program in a subprocess, before the hostname
+  and port number.
+  (open-ssl-stream): Use it.
+
+Mon Feb 10 07:45:31 1997  William M. Perry  <address@hidden>
+
+* url-file.el (url-file): Removed refs to variable url-use-hypertext-dired
+
+* url-vars.el: Removed obsolete variable url-use-hypertext-dired
+
+* url-file.el (url-dired-find-file-mouse): fixed bad typo of 
+  (interactive...) spec, added documentation to a few functions.
+  (url-file): Removed refs to obsolete variable url-use-hypertext-dired
+
+* w3-xemac.el (w3-setup-version-specifics): Workaround for users of XEmacs
+  19.14 or 20.0 with the bad bad bad lossage with text properties that
+  have null values.  This  bug is fixed in XEmacs 19.15, and will be in
+  20.1 as well.  This bug would cause you to get errors like:
+       internal error: no text-prop <#extent ....> start-open
+
+* w3.el (w3-widget-button-click): Deal with new image capabilities of the
+  widget checkbox/radio-button stuff.
+
+* Synch'ed up to widget 1.31
+
+Sun Feb  9 15:39:19 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.57 released
+
+* url-file.el (url-dired-minor-mode): New minor mode that overrides a few
+  of direds keybindings to use Emacs-W3 instead of straight find-file.
+  (url-format-directory): Now just uses dired to display directory
+  listings, much more powerful than the old way.  Can copy files, act on
+  multiple files, you all know the drill.
+
+* w3.txi: Added more chapters, reorg of others.
+
+* w3-display.el (w3-maybe-start-image-download): Fixed handling of bad
+  images in the cache again.  Duh.
+  No longer log to the warnings buffer if we fail to load an image.  Just
+  use message - much less intrusive.  We just usually don't care that much
+  about failed image loads.
+
+* url-gw.el (url-open-stream): fixed typo - was calling old
+  url-nslookup-host instead of url-gateway-nslookup-host
+
+* w3.el (w3-insert-formatted-url): Now inserts markup in lowercase.
+
+Sat Feb  8 13:54:43 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.56 released.  Getting closer!
+
+* w3-forms.el (w3-form-summarize-radio-button): Finally, a decent
+  summarization of radio buttons
+  Fixed typo in specifying summarizer for hidden form fields.
+  (w3-form-keymap): Bind C-a and C-e by default.
+
+* w3-widget.el (widget-image-value-create): When using emacspeak, show
+  client side imagemaps as a table.  Need a more general solution for
+  this, but this makes us nicer than IE again. :)
+
+* Updated to widget 1.30
+
+Fri Feb  7 16:49:55 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-handle-string-content): Make sure faces text
+  properties are closed, so that things don't bleed over.
+  (w3-fixup-eol-faces): New function for Emacs 19 that removes face
+  information at newlines, so that underlining will not extend from the
+  end of a line to the window edges - very ugly.
+
+* w3-menu.el (w3-menu-initialize-w3-mode-menu-map): Don't support 'emacs
+  in w3-use-menus under Emacs in Windows 95/NT.
+
+* w3-display.el (w3-finalize-image-download): Deal with bad images better.
+  (w3-finish-drawing): Better protection of putting images in.
+
+* url-gw.el (url-open-stream): Don't auto-retry connections.  Don't throw
+  an error if you fail to connect to a site.  This is for image loadings
+  that fail for some reason or another.
+
+* css.el (css-expand-length): better handling of float values and 'ex'
+  unit type.
+
+* font.el (x-font-create-object): Unconditionally make case-fold-search
+  non-nil so that we don't lose big-time.  This was the cause of the very
+  weird font-spatial-to-canonical lossage under XEmacs with font sizes of
+  something like '+12pt'
+
+* w3.el (w3-view-this-url): Use widget-echo-help if we didn't find a URL
+  under point.
+
+Fri Feb  7 15:22:25 1997  Charles Levert <address@hidden>
+
+* w3-widget.el (widget-image-notify): Bad data being fed to w3-fetch if a
+  client-side imagemap had an alt attribute (but only if the <map> came
+  _after_ the use.
+
+Fri Feb  7 15:22:25 1997  William M. Perry  <address@hidden>
+
+* font.el (font-spatial-to-canonical): protect against bad input to this
+  function.
+
+Fri Feb  7 15:19:36 1997  Toby Speight <address@hidden>
+
+* w3-parse.el (w3-parse-buffer): Parser didn't allow for the fact that
+  TAGC is optional on end-tags as well as on start-tags (i.e. "<b<i>
+  bold-italic</i</b>" is legal).
+
+Fri Feb  7 06:28:37 1997  William M. Perry  <address@hidden>
+
+* w3-forms.el (w3-form-keymap): Now inherits from widget-keymap, with a
+  few exceptions.
+
+* url.el (url-uncompress): This function now no longer looks at the file
+  extension to determine a compression/encoding method.  This is so that
+  doing searches on `foo.tar.gz' will not bogusly cause the decompression
+  steps to run.  Ick!
+
+* url-file.el (url-insert-possibly-compressed-file): This function no
+  longer atempts to decompress the file after loading it in.  Instead, it
+  sets an appropriate content-transfer-encoding header based on the
+  filename, so that this will allow url-uncompress to work correctly on the
+  buffer.
+
+Thu Feb  6 06:24:26 1997  William M. Perry  <address@hidden>
+
+* w3-print.el (w3-postscript-print-function): New variable to control what
+  function is used to generate postscript output.
+  (w3-print-this-url): Use it.
+
+* w3-display.el (w3-handle-string-content): Make all inserted text
+  read-only
+
+* w3-forms.el (w3-form-use-old-style): New variable to control whether to
+  use the old-style interaction with form fields instead of the 'type
+  directly into the buffer' method
+  (w3-form-determine-size): Use it.
+  (w3-form-create-integer): Use it.
+  (w3-form-create-float): Use it.
+  (w3-form-create-text): Use it.
+  (w3-form-create-password): Use it.
+  (w3-revert-form): Fixed error with 'reset' buttons on forms that had
+  hidden form fields.
+
+* w3-vars.el (w3-mode-map): Define [backtab] by default
+
+* w3-display.el (w3-size-of-tree): Removed some warnings
+(w3-display-table-dimensions): ditto
+
+* Updated to widget 1.26
+
+* default.css: Some default formatting changes for input fields.
+  Everything is underlined by default except submit/reset/image/button
+  fields, so that they are a little easier to spot.
+
+* w3-parse.el (w3-parse-buffer): Now slaps pseudo-elements into input
+  fields so that stylesheets can access them.
+
+Wed Feb  5 14:42:12 1997  William M. Perry  <address@hidden>
+
+* Updated to widget 1.24
+
+* Happy birthday Jenny P.
+
+Tue Feb  4 08:21:03 1997  William M. Perry  <address@hidden>
+
+* font.el (x-font-create-name): Better checking/optimizing of when to just
+  return the default font.
+
+* w3-forms.el: Make use of the new information, and pass it down to the
+  widget library appropriately.
+
+* w3-display.el (w3-display-node): Now passes in the entire list of active
+  faces to form creation functions.
+
+Mon Feb  3 07:26:18 1997  William M. Perry  <address@hidden>
+
+* w3-emulate.el (w3-lynx-emulation-minor-mode-map): Lots of new
+  keybindings for lynx emulation minor mode.
+
+* Emacs-W3 3.0.55 released
+
+* w3-forms.el (w3-form-determine-size): Fixed _STUPID_ problem where
+  option lists would lose everything but the first option in them.  I'm a
+  dumbass.  Sort modifies its list parameter! ICK ICK ICK.
+
+* url.el (url-after-change-function): Show prettier status messages.
+  Sizes are converted to bytes, k, or M, depending on how big the file
+  is.
+
+* w3.txi: Lots of documentation changes - volunteers welcome.
+
+* Removed personal annotation support, since it wasn't shown with the new
+  display engine, it needs to be rethought, and nobody had complained in
+  the entire beta cycle.
+
+* w3.el (w3-history-find-url-internal): Redid the history mechanism.
+  Toolbar and menu entries are now grayed out appropriately.
+
+* url-http.el (url-create-mime-request): Fixed cookie support if not going
+  through a proxy gateway.
+
+Sun Feb  2 22:05:41 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-display-table): Fix for negative colwidth
+
+Fri Jan 31 14:28:54 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-fetch): Fixed targetted links (http://blah/#foo)
+
+Fri Jan 31 11:20:47 1997  Alf-Ivar Holm <address@hidden>
+
+* w3.el (w3-mail-current-document): Fixed problem with calling
+  w3-parse-buffer with too many arguments when mailing LaTeX-ified
+  files.
+
+Fri Jan 31 11:19:37 1997  Cord Kielhorn <address@hidden>
+
+* css.el (css-expand-length): Fixed bad regexps for percentage and
+  character based lengths
+
+Thu Jan 30 20:27:06 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.52 released
+
+* w3-display.el (w3-handle-image): When doing table auto layout, don't
+  start loading the images.
+
+Wed Jan 29 06:15:37 1997  William M. Perry  <address@hidden>
+
+* font.el (x-font-create-name): Yet another fix for not screwing up the
+  line-height in Emacs 19.
+
+* w3-display.el (w3-face-for-element): Uhh, oblique seems to work.
+
+* font.el (set-font-style-by-keywords): now deals with arguments that
+  aren't lists, for the font-style and font-variant CSS stuff
+
+* w3-display.el (w3-display-node): Reimplemented <cookie> tag.
+(w3-display-node): Reimplemented <flame> tag.
+
+* url.el (url-insert-file-contents): url-insert-file-contents now
+  decodes/uncompresses the data before returning.
+
+* w3-display.el (w3-display-node): Reimplemented <pinhead> tag
+
+Tue Jan 28 06:22:08 1997  William M. Perry  <address@hidden>
+
+* font.el (x-font-create-name): Never take font size into account under
+  Emacs - too much chance of totally screwing up the users leading by
+  choosing a bigger font than their default.  This sucks.  But I can't
+  find a better solution.
+
+* w3.el: w3-mode now turns on truncate-lines by default.
+
+* w3-forms.el (w3-form-create-image): Better image input type support.
+
+Mon Jan 27 08:21:58 1997  William M. Perry  <address@hidden>
+
+* w3-forms.el (w3-form-create-password): Now uses real password entry
+  widgets provided by 'widget' - you _MUST_USE_ the widget library that
+  comes with Emacs-W3 for this, otherwise the info won't be hidden
+  correctly.
+  (w3-form-add-element): Deal with hidden text areas better when they are
+  in forms
+
+* Synch'd up to widget 1.22
+
+Sun Jan 26 16:50:09 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.51 released
+
+* w3-forms.el (w3-form-create-text): Now uses the real text entry widgets
+  provided by 'widget' - still can't do this for password fields yet
+  though.
+
+* Synch'd up to Widget 1.20
+
+Sat Jan 25 13:38:12 1997  William M. Perry  <address@hidden>
+
+* url.el (url-expand-file-name): Now strips out spaces as well as
+  newlines/carriage returns. More fixes for that bastardized microsoft
+  home page.
+
+* url-http.el (url-create-mime-request): Make sure that we retrieve the
+  cookies for the real URL we are retrieving when going through a proxy.
+  Now the psychotic crap that is the microsoft home page should be
+  successfully retrieved if going through an HTTP proxy.
+
+* url-cookie.el (url-cookie-handle-set-cookie): Attempt to deal with
+  idiotic microsoft home page that sends out set-cookie headers that look
+  like MC1=ID=abc, and expects two cookies MC1='' and ID='abc'  *sigh*
+
+* w3-forms.el, w3-display.el: Form elements now keep all their attributes
+  with them.  Will be useful when we start allowing scripting.
+  (w3-form-create-custom): Rudimentary patches to allow embedding 'custom'
+  widgets into the buffer.  Interesting.
+
+* w3-forms.el (w3-form-determine-size): New function to calculate how big
+  a form field will be - option lists should look much better now.
+
+Thu Jan 23 08:48:59 1997  William M. Perry  <address@hidden>
+
+* Synch'ed up to custom 1.19
+
+* url-parse.el: document extra slots of url-generic-parse-url
+
+Thu Jan 23 08:34:34 1997 Joe Wells <address@hidden>
+
+* url-file.el (url-file): Patch to tell ange-ftp and/or efs the password
+  in a file/ftp URL so that you won't be prompted for the password, even
+  if one was specified in the URL 
+
+* url-parse.el (url-generic-parse-url): Fixed bug where specifying a
+  username and password in the URL would downcase the username and
+  password as well as the hostname.
+
+Wed Jan 22 08:28:13 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.50 released
+
+* base64.el (base64-encode-region): Pulled in code from VM for quicker
+  encoding/decoding
+
+* mm.el (mm-content-transfer-encodings): Better base64 decoding
+
+Wed Jan 22 07:31:03 1997  Alf-Ivar Holm <address@hidden>
+
+* w3-emulate.el (w3-lynx-emulation-minor-mode-map): Lynx [up] and [down]
+  bound to non-existing functions.
+
+* w3.el (w3-do-setup): Fixed installation of lynx emulation modes keymap.
+
+Tue Jan 21 07:56:51 1997  William M. Perry  <address@hidden>
+
+* url-misc.el (url-data): Make sure to url-decode the data before
+  inserting it into the buffer.
+
+* w3-menu.el (w3-toggle-minibuffer): better version
+
+* w3-forms.el (w3-form-create-integer): New form entry type
+  (w3-form-create-float): new form entry type
+  (w3-form-encode-helper): deal with the new integer/float types
+
+* w3-display.el (w3-display-node): Reimplemented <select multiple> as a
+  list of checkboxes
+
+Mon Jan 20 06:29:07 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-display-node): Keep track of the last form's action,
+  for theoretically 'naked' input fields that we want to try and handle as
+  best we can anyway.
+
+* w3-parse.el: Much more lenient about where form elements can be found.
+
+* w3-forms.el: summarizer functions now take the widget as an extra
+  parameter.
+
+* w3.el (w3-find-etc-directory): New function - not used yet.
+
+* w3.txi: Warning!  You now need a very new version of texinfo to compile
+  the .info or .dvi file yourself.
+
+* url-mail.el (url-mail): Now tries to use message-mail if it is bound
+  instead of just plain old 'mail'.
+
+* w3-forms.el (w3-form-add-element): Duh, fix hidden form fields.
+
+* font.el (font-normalize-color): Hopefully fixed color lossage under OS/2
+  and Windows
+
+* w3-forms.el (w3-form-summarize-field): Actually 'message' the string as
+  a workaround for emacspeak 5.0
+
+Sun Jan 19 09:32:15 1997  William M. Perry  <address@hidden>
+
+* w3-xemac.el (w3-mouse-handler): Ditto
+
+* w3-e19.el (w3-mouse-handler): Protect against 'bad format string' errors
+  when showing a hexified URL
+
+* w3-forms.el (w3-form-mark-widget): Be super paranoid and mark all
+  children and their children's children, and the parents of a widget.
+  (w3-form-create-radio-button): Make sure radio button children always
+  get updated via w3-form-mark-widget.
+  (w3-form-summarize-radio-button): Slightly better summarization of radio
+  buttons.
+
+* Emacs-W3 3.0.49 released
+
+* Synch'ed up with widget 1.18
+
+Fri Jan 17 06:25:36 1997  Dave Love <address@hidden>
+
+* w3-display.el: w3-echo-link now prefers the URL to the text of a link
+
+Fri Jan 17 06:25:36 1997  William M. Perry  <address@hidden>
+
+* w3-display.el: Fixed handling of inlined styles
+
+* w3-mouse.el: Some fixes for XEmacs when built with no X support
+
+* default.css: Now uses the new @media directives instead of the old
+  :blah: stuff
+
+* css.el (css-handle-media-directive): New function to handle @media
+  directives.
+  (css-parse): Deprecate the old :mediatype: way of specifying media
+  dependent styles.
+
+* w3-style.el (w3-handle-style): Now gets passed a plist instead of an
+  assoc list.
+  (w3-handle-style): Pay attention to the new 'media' attribute on
+  stylesheet links, and don't load the stylesheet if we aren't currently
+  running on that type of media.
+
+* css.el (css-properties): Added proposed printing properties from a W3C
+  draft.
+
+Thu Jan 16 06:06:45 1997  William M. Perry  <address@hidden>
+
+* css.el (css-handle-media-directive): Implemented the @media processing
+  instruction.
+
+* w3-forms.el (w3-form-summarize-option-list): Changed the summarize
+  function for option lists.  Much saner now.
+
+* w3.el (w3-read-url-with-default): Use the URL at point before falling
+  back to http://www.
+  (w3-source-document): When sourcing a document, let set-auto-mode do the
+  right thing.  .html comes up in html-mode, or whatever now.
+
+* url-cookie.el: Fixed some compile warnings under Emacs
+
+* w3-forms.el (w3-form-summarize-option-list): Make each choice-item have
+  emacspeak-help set.
+
+* w3-speak.el (w3-widget-backward): New advice
+(w3-widget-forward): New advice
+
+* w3-forms.el (w3-form-create-option-list): Renamed function
+
+* Emacs-W3 3.0.48 released
+
+* w3-display.el (w3-face-for-element): Use background-color instead of
+  just background for css property.
+
+* w3-forms.el (w3-form-encode-helper): Fixed radio buttons, duh.
+
+* url-misc.el (url-do-terminal-emulator): Fixed bad var reference left
+  from old code.
+
+* url-gw.el: Moved all the gateway variables into their own namespace to
+  make it easier to turn this into a standalone package.
+
+* dist.Makefile (SOURCES): Added url-gw and w3 to the build targets.
+
+Wed Jan 15 08:00:37 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.47 released
+
+* url.el (url-expand-file-name): Make sure to remove \r from the URL as
+  well as \n
+
+* url-gw.el (url-open-stream): Added in 'telnet' and 'rlogin' methods for
+  url-gateway-method.  Code stolen from GNUS.  Thanks lars! :)  It would
+  be nice to make this file its own package and be able to override
+  open-network-stream so that all apps could get this for free.
+
+* url-misc.el (url-generic-emulator-loader): Consolidated the tn3270,
+  telnet, and rlogin URL loaders into one smarter function
+
+* url.el: Made cookie and auth modules autoloaded, removed some old autoloads
+(url-open-stream) Moved to url-gw.el
+
+Mon Jan 13 22:11:00 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-widget-echo): w3-echo-link can now be a list, so the
+  user can explicitly control fallback behaviour.
+
+* w3.txi: Added some pointers to CSS documentation
+
+* mule-sysdp.el (mule-code-convert-region): ditto
+
+* w3.el (w3-convert-code-for-mule): Fixed bug in XEmacs 20.0 mule
+
+Mon Jan 13 11:14:29 1997  T. V. Raman <address@hidden>
+
+* w3.el (w3-widget-forward): Call widget-forward interactively so that
+  emacspeak will hook it correctly.
+
+Mon Jan 13 11:14:29 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-refresh-buffer): Finally reimplemented
+  w3-refresh-buffer.
+
+Sun Jan 12 10:32:50 1997  Karl Eichwalder  <address@hidden>
+
+* w3.txi: Add @dircategory and @direntry... @end.  `install-info'
+  from texinfo-3.9 know about those.
+
+Sun Jan 12 21:49:44 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-save-as): Can now save a page as postscript again
+
+* w3-display.el (w3-display-node): inline styles work again
+
+* url-misc.el (url-data): Updated data: URL to the spec.
+  ftp://ietf.org/internet-drafts/draft-masinter-url-data-02.txt
+
+Sat Jan 11 20:47:24 1997  William M. Perry  <address@hidden>
+
+* Emacs-w3 3.0.45 released
+
+* url-misc.el (url-data): Now supports the 'data' URL type, which just
+  'fetches' everything after the data: chunk of the URL
+
+Fri Jan 10 11:49:43 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-display-node): Multicolumn works, but puts things
+  across instead of down
+
+* w3-parse.el: Basic support for parsing <multicol>
+
+* w3-display.el (w3-display-node): Make our semi-widgety hyperlinks
+  start/end open under XEmacs.
+
+* w3.el (w3-complete-link): Make sure we take case into account when doing
+  link completion.  The user can use 'test' to complete to link titled
+  'Test'.  Uses try-completion for this, which seems to work since we
+  require a match.  Is this the best way to do this?  Other than not being
+  case-insensitive at this point?
+
+* w3-forms.el (w3-form-default-widget-creator): Better way of handling
+  updates to text entry fields.
+  (w3-revert-form): Everything should be reverted correctly, both in
+  internal storage and in the buffer
+  (w3-form-create-radio-button): Get a more unique identifier to store
+  radio elements by - old way could theoretically get collisions.
+
+* w3-display.el (w3-display-handle-list-type): Updated use of 'list-style'
+  to use new property 'list-style-type'
+  (w3-prepare-buffer): Now kills the source buffer before it starts
+  drawing the tree, to avoid *URL-n* buffers when not really necessary.
+
+* css.el (css-properties): Updated all the properties to the W3C's latest
+  'recommendation' level CSS specification.
+  (css-handle-import): much better handling of @import
+  (css-parse): Better handling of '@' directives in general
+  (css-expand-value): General cleanup, reference the CSS and ACSS specs
+  for how/why we are parsing something the way we are.
+
+Thu Jan  9 06:17:08 1997  William M. Perry  <address@hidden>
+
+* Updated all copyright notices.  Happy belated new year!
+
+* w3-display.el (w3-region): Fixed a few bugs with nuking too much of a
+  buffer when using w3-region
+
+* w3.el (w3-read-url-with-default): Use new variable.
+
+* w3-vars.el (w3-fetch-with-default): New variable to control whether or
+  not w3-fetch will figure out a good default value for the URL or not.
+
+* w3-forms.el (w3-form-mark-widget): New function to mark a widget and all
+  its children with an appropriate :emacspeak-help and 'w3-form-data
+  Now defines a few keywords to look more widget-y
+
+Wed Jan  8 09:27:47 1997  William M. Perry  <address@hidden>
+
+* css.el (css-expand-value): Added elevation, angle, and time units.
+
+* w3-display.el (w3-display-node): Turn on voice-lock-mode by default in
+  all w3 buffers.
+
+* css.el (css-properties): Added in new speech properties from the ACSS
+  note from the W3C.  Please see
+  http://www.w3.org/pub/WWW/Style/CSS/Speech/NOTE-ACSS for more
+  information.
+
+* w3-forms.el: Moved all the form entry summarization functions from
+  w3-speak.el into w3-forms.  Easier to keep in synch this way.
+
+* w3-display.el (w3-display-node): Reimplimented the 'keygen' form entry
+  type for netscape compatibility.
+
+Tue Jan  7 07:20:08 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-region): New function that parses the HTML in a region
+  'in-place', so that things like MIME mailers/gnus readers can show HTML
+  inline a lot easier.
+
+* w3-forms.el (w3-form-resurrect-widgets): Fixed case where a widget goes
+  all the way to point-max and next-single-property-change will return
+  nil.  Would pass bad args to delete-region.
+  (w3-form-summarize-field): Moved some of the smarts about summarizing W3
+  widgets from w3-speak into the core forms code.
+
+* font.el (define-font-keywords): New function for defining keywords that
+  will actually work across Emacs and XEmacs
+
+* w3-display.el (w3-display-node): Reimplemented 'note' functionality, by
+  converting it into a two-cell table.
+  (w3-display-node): Implemented <dir> as multi-column, as-per the RFC and
+  HTML 3.x specifications
+
+* default.css: Added default display type for dir and menu
+
+Mon Jan  6 21:49:52 1997  William M. Perry  <address@hidden>
+
+* url-http.el (url-create-mime-request): Fixed yet another stupid problem
+  in Host: header handling.  Was never sending the right information if
+  you were not going through a proxy this time.  *sigh*
+
+* w3-forms.el (w3-form-add-element): Fixed hidden form fields
+
+Sun Jan  5 22:38:54 1997  William M. Perry  <address@hidden>
+
+* url-vars.el (url-proxy-services): updated documentation string
+
+* w3-widget.el (widget-image-notify): Fixed client side handling of
+imagemaps on a TTY or a delayed/broken image. Duhhh
+
+Fri Jan  3  Dave Love  <address@hidden>
+
+* w3-e19.el (w3-mouse-handler): Fix link echoing.
+
+Fri Jan  3 08:43:56 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.43 released
+
+* font.el (make-font): Treat args as a plist, just for sanity's sake.
+
+Thu Jan  2 12:19:31 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-table-hack-borders): Fix stupid use of 'otheriwse'
+  instead of 'otherwise' in a case statement.
+
+* w3-forms.el (w3-form-add-element): Fix stupid use of 'otheriwse'
+  instead of 'otherwise' in a case statement.
+  (w3-form-resurrect-widgets): Fixed XEmacs handling of widget recreation,
+  and also fixed problem where some widgets would be skipped.
+
+Tue Dec 31 07:37:17 1996  William M. Perry  <address@hidden>
+
+* w3-e19.el: All the menus in Emacs-19 now use the same constructors that
+  the :filter entries under XEmacs do.  This will make things much easier
+  in the future in not duplicating crufty menu-construction code once for
+  XEmacs menu-structs and once for Emacs keymaps.
+
+* w3-menu.el (w3-menu-html-links-constructor): Now works with the Emacs 19
+  implementation of property lists.
+
+Mon Dec 30 06:25:28 1996  William M. Perry  <address@hidden>
+
+* w3-menu.el (w3-popup-menu): context-sensitive menus over delayed images
+  work again 
+
+* w3-display.el (w3-parse-link): New way to store <link> information from
+  an HTML document.
+
+* w3.el (w3-search): Deal with new <link> storage
+
+* w3-menu.el (w3-menu-html-links-constructor): Deal with new way <link>
+  items are stored - now uses the 'title' attribute if present.
+
+* w3-auto.el (w3-form-resurrect-widgets): Added autoload
+
+* url-file.el (url-format-directory): Removed url-forms-based-ftp option -
+  didn't really work anyway.
+
+Sun Dec 29 15:54:21 1996  William M. Perry  <address@hidden>
+
+* w3-forms.el (w3-form-resurrect-widgets): fixed stupid problem in munging
+  of the size of form elements.
+
+* Emacs-W3 3.0.42 released
+
+* w3-display.el (w3-table-hack-borders): Deal gracefully with not finding
+  a 'terminal' font to display hacked border chars in
+
+* w3-hot.el (w3-hotlist-add-document): don't hexify a url before sticking
+  it in the hotlist buffer
+
+* w3-display.el (w3-display-node): hyperlinks with images at the start
+  will now have a button associated with the entire link, not just the
+  image part.
+
+* w3-sysdp.el (fillin-text-property): made it work under Emacs19
+
+Sun Dec 29 00:07:39 1996  Takahiro Hayata <address@hidden>
+
+* mule-sysdp.el (mule-write-region-no-coding-system): Patch for Mule 2.3 
+
+Sun Dec 29 00:07:39 1996  William M. Perry  <address@hidden>
+
+* w3-forms.el (w3-form-add-element): Only insert stubs of the right length
+  for a for element, and do munging of that text into the actual widgets
+  later.  This saves us a lot of grief and heartache when handling things
+  like radio buttons that span table elements because the markers have
+  become completely insane by the time the next widget is ready to be
+  created.
+
+Sat Dec 28 17:24:08 1996  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-display-table): Don't crap out on invalid tables where
+  table-dimensions tells us we have a 0 column or 0 row table.
+
+* w3-widget.el (widget-image-value-create): Use :action instead of :notify
+  for widget-image-callback - hyperlinked images under Emacs 19 should
+  work again.
+
+Thu Dec 26 18:26:25 1996  William M. Perry  <address@hidden>
+
+* w3.el (w3-widget-forward): Use this instead of widget-forward.
+(w3-widget-backward): Ditto.  Need to make both of these smart for w3.
+
+* w3-display.el (w3-display-node): Implemented the display class 'none'
+  for turning off the rendering of an element and its subcontent.
+
+Thu Dec 26 07:21:58 1996  William Perry  <address@hidden>
+
+* w3-parse.el (w3-parse-buffer): *sigh* Allow _ in attribute names.
+
+* Emacs-W3 3.0.41 released
+
+* url-parse.el (url-generic-parse-url): bind inhibit-read-only to 't' in
+  url parsing buffers, to avoid 'attempt to modify read-only text'
+  problems when the string passed to url-generic-parse-url has the
+  read-only text property set.
+
+* w3-e19.el (w3-setup-version-specifics): popup menus should work in
+  Emacs19 again.
+
+* css.el (css-expand-value): For margin and padding, make sure we _always_
+  convert into a valid length spec.  Setting a 'margin' or 'padding'
+  property group instead of individual margin-* or padding-* values would
+  cause the display engine to crap out.
+  (css-get): Fixed generic class-only lookups (.foo, etc)
+
+* w3-display.el (w3-display-handle-list-type): Tweaks to list indentation
+
+* w3-menu.el (w3-menu-html-links-constructor): Fixed stupid problem with
+  the new navigate menu under XEmacs.
+
+Tue Dec 24 22:46:11 1996  William M. Perry  <address@hidden>
+
+* css.el (css-expand-color): Better handling of X-style color specs -
+  convert them to internal RGB format.
+
+Tue Dec 24 02:50:08 1996  Christian Limpach  <address@hidden>
+
+* font.el (ns-font-families-for-device): added test for unbound
+  device-fonts-cache variable.
+  (ns-font-create-name): handle font-styles which are numbers.
+
+* w3-sysdp.el (try-font-name): added support for Nextstep.
+
+Tue Dec 24 06:16:33 1996  William M. Perry  <address@hidden>
+
+* w3.el (w3-open-local): Send filename through expand-file-name in
+  w3-open-local to avoid having illegal URLs like file:/~/test.html
+
+* w3-widget.el (widget-image-value-create): fixed new problem with client
+  side imagemaps.  Should really work this time.
+
+* w3.el (w3-map-links): w3-map-links and hence w3-complete-link will now
+  find images that are also hyperlinks.
+
+Mon Dec 23 22:28:58 1996  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.40 released
+
+* w3-menu.el (w3-menu-go-menu): Added 'navigate' submenu to hold the
+  predefined <link> types.
+
+* w3-widget.el (widget-image-summarize): Image widgets should now be much
+  better at identifying themselves when being tab'ed to or waggled at with
+  the mouse.
+
+* w3-prefs.el: Fixed a few references to w3-glyphp (now widget-glyphp)
+
+* w3.el (w3-url-completion-function): Fixed completion of URLs
+
+Sat Dec 21 Dave Love  <address@hidden>
+
+* w3-display.el, w3-vars.el, w3.el: Define and use
+  w3-defined-link-types to canonicalize link descriptions' case for
+  ease of use.
+
+* w3-e19.el (w3-build-FSF19-menu): Add any recognised <link> items
+  to the menu in the absence of a toolbar.
+
+Thu Dec 19 13:52:35 1996  William Perry  <address@hidden>
+
+* Emacs-W3 3.0.39 released
+       
+* w3-forms.el (w3-form-encode-xwfu): Ditto.
+
+* url.el (url-hexify-string): Updated to use url-unreserved-chars when
+  escaping, ala
+  http://www.ics.uci.edu/pub/ietf/uri/draft-fielding-url-syntax-02.txt
+
+Wed Dec 18 22:09:41 1996  William M. Perry  <address@hidden>
+
+* w3.el (w3-mode): Removed bogus setting of widget-motion-hook from way
+  back
+
+* w3-parse.el (w3-parse-buffer): Better handling of <base> tag.
+
+* w3-display.el (w3-widget-echo): Better falling-back when the preferred
+  echo method yields nil.
+
+* url.el, w3-display.el, w3.el: Remove last vestiges of url-hash.el and
+  removed it from the distribution.
+
+Wed Dec 18 08:07:32 1996  William Perry  <address@hidden>
+
+* dsssl.el: Moved the DSSSL parser and friends into its own namespace.
+
+Removed dependencies on url-hash.
+
+* custom.el: Synch'd up to custom 1.13
+
+Tue Dec 17 16:36:05 1996  William M. Perry  <address@hidden>
+
+* url.el (url-expand-file-name): If we weren't given a base object to work
+  from, and url-current-object is null, set it to the object returned by
+  parsing url-view-url.
+
+* url-http.el (url-create-mime-request): Send the right information in the
+  'Host' header field when going through a proxy.
+  (url-setup-reload-timer): Emacs 19 doesn't deal well with 0-length
+  timeouts, so protect against trying to create one when dealing with the
+  refresh header.
+
+* w3-parse.el: Removed lots of crap for the old display engine - shouldn't
+  cons up as much garbage as before.  Now it will just cons up garbage
+  that we actually need.
+
+Tue Dec 17 07:10:47 1996  William Perry  <address@hidden>
+
+* css.el (css-properties): New property type 'string-list' for font-family
+
+* w3.el (w3-find-default-stylesheets): Make sure to look in
+  data-directory/../../w3 for stylesheets
+
+Tue Dec 17 06:07:08 1996  William M. Perry  <address@hidden>
+
+* w3-toolbar.el: wrapped a condition-case around the require for
+  xpm-button and xbm-button so that it will compile under Emacs
+
+Mon Dec 16 08:19:40 1996  William Perry  <address@hidden>
+
+* Emacs-W3 3.0.38 released.
+
+* dist.Makefile (OBJECTS): Removed xpm-button and xbm-button from the
+  distribution.  Any version of XEmacs that can run the latest 3.0 stuff
+  has them already.
+
+* default.css: Make nested ol/ul items display class 'line' so they look
+  prettier.
+
+* w3-display.el (w3-display-node): EVIL hack to make the first item in a
+  nested list get indented correctly.
+
+* w3-about.el (w3-about): Fixed the about:style stylesheet to be
+  up-to-date with new CSS spec.
+
+* default.css: Turned down indentation on list items by default.
+
+* w3-display.el (w3-display-node): Mouse tracking should work under XEmacs
+  again.
+
+* dist.Makefile (all): Removed 'emacs' from dependency list.
+
+Mon Dec 16 06:03:14 1996  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-table-hack-borders): This should work on TTY's again.
+
+Sun Dec 15 14:19:53 1996  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.37 released
+
+* w3-display.el: Better handling of paragraphs (well, any block-level
+  element within a list-item display group.
+
+* default.css (address): Changed <address> display tpye to line so that
+  right-justification will take effect.
+
+Sat Dec 14 10:24:13 1996  William M. Perry  <address@hidden>
+
+* w3-sysdp.el: Removed stubs for add-submenu - it was confusing 'custom'
+
+* dist.Makefile: More GNU-ish project makefile
+
+* url.el (url-default-find-proxy-for-url): Fixed no_proxy handling
+(url-default-find-proxy-for-url): Don't pass 'www://' links to a proxy
+
+Fri Dec 13 22:50:45 1996  William M. Perry  <address@hidden>
+
+* dist.Makefile (URLSOURCES): Added socks.el to the distribution.  Not
+  used just yet.
+
+* css.el (css-copy-stylesheet): Fixed problem with sharing the list
+  structure between the hash tables - document stylesheets would infect
+  the main w3-user-stylesheet and cause weirdness.
+
+Fri Dec 13 09:47:40 1996  William Perry  <address@hidden>
+
+* w3-style.el (w3-display-stylesheet): Fixed problem where
+  w3-display-stylesheet would override the buffer css-display was showing
+  the stylesheet in.  Duhh.
+
+* mule-sysdp.el (mule-encode-string): Fixed stupid problem on non-XEmacs
+  mule
+  (mule-sysdep-version): Ditto.
+
+Fri Dec 13 06:25:45 1996  William M. Perry  <address@hidden>
+
+* css.el (css-get): Removed bogus recursive call to css-get, and moved the
+  guts of css-get out into its own fuction, which is in turn inlined into
+  css-get.  Might even make things faster.  At the least, I expect it to
+  get rid of the 'takes two makes to make w3-display.elc' problem some
+  people have been seeing.
+
+* w3-display.el (w3-display-handle-list-type): Fixed stupid problem with
+  margin handling where list-item display items were always flush-left
+
+Fri Dec 13 02:51:24 1996  Greg Stark  <address@hidden>
+* w3-display.el (w3-display-line-break): correct right justification code
+  (w3-min-size-of-string): removed unused function that didn't work.
+  (w3-size-of-tree): maintain consistent w3-display-open-element-stack
+  don't hard code assumption that hr's are drawn with '-'
+  (w3-display-table-dimensions): major bug if the last column rowspans
+  (w3-table-lookup-char): new function
+  (w3-table-hack-borders): new function makes table borders use pretty
+  graphic characters instead of ascii characters. 
+  (w3-table-unhack-borders): new function restore lame ascii borders.
+  (w3-display-table): Major changes to support drawing better borders
+  also fix various bugs and tweak various things.
+
+* w3-parse.el: remove = from set of characters that terminate an attribute
+               when guessing about an syntactically invalid attribute. 
+              (didn't this get changed once already?)
+
+* w3.el (w3-sentinel): hack around bug that bit w3-preview-this-buffer 
+                       but I don't know what the right thing for Mule.
+
+Thu Dec 12 08:36:01 1996  William Perry  <address@hidden>
+* Synch'd up to widget 1.13
+
+* w3-display.el (w3-get-pad-string): Ack - watch for negative values in
+  w3-get-pad-string
+
+* Released 3.0.36
+
+* w3-style.el (w3-display-stylesheet): Use new css-display function
+
+* css.el (css-get): Better class checking
+  (css-display): New function to pretty-print a stylesheet that is in
+  memory.
+
+* w3-parse.el (w3-parse-buffer): *sigh* Parser now keeps track of 'base'
+  of this document.  Also normalizes 'align' attribute, as well as
+  auto-expanding any SRC or HREF attributes.
+
+* w3-display.el (w3-display-handle-list-type): Now handles text-indent
+  style property.
+  (w3-display-table): Can now specify properties on 'tr', for
+  vertical-alignment, etc.
+  (w3-display-node): Lots of changes to deal with new method of munging
+  class/align/etc in the parser.
+
+Wed Dec 11 17:37:14 1996  William M. Perry  <address@hidden>
+
+* w3-parse.el (w3-parse-buffer): Do munging of align/src/href/class
+  attributes to save time in w3-display-node and friends.
+
+* w3-prefs.el (w3-preferences-compatibility-variables): Fixed problems
+  with renaming of w3-style-ie-compatibility to css-ie-compatibility
+
+* w3-display.el (w3-display-node): fix for hyperlinks / form info in
+  tables. Duhh.
+
+Wed Dec 11 07:36:08 1996  William Perry  <address@hidden>
+
+* css.el (css-copy-stylesheet): New function
+
+* w3-display.el (w3-display-node): use it
+
+* mule-sysdp.el (mule-encode-string): Fixes for XEmacs w/mule
+(mule-decode-string): Fixes for XEmacs w/mule
+
+* w3-display.el (w3-display-node): Fixed problem in isindex handling.
+  Using forms for isindex handling should work again.
+
+* css.el (css-specificity): new function css-specificity to find how
+  specific a certain rule is. Need to use this to sort rules in css-get.
+
+Tue Dec 10 22:37:59 1996  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-get-style-info): Changes to deal with new css.el -
+  should be much much faster now.
+
+* css.el (css-get): Radically changed the internal representation of
+  stylesheets, and how they are looked up.
+
+Mon Dec  9 22:31:11 1996  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-face-for-element): Fixed bug in w3-face-for-element
+  where weight of the element wasn't being taken into account.
+
+* css.el: Changed font-variant style type from string to symbol-list
+
+Mon Dec  9 12:29:59 1996  William Perry  <address@hidden>
+
+* default.css: Changed default header sizes - should look better on most
+  machines
+
+Sun Dec  8 19:21:07 1996  William M. Perry  <address@hidden>
+
+* Emacs-w3 3.0.34 Released
+
+* w3-display.el: New macro w3-get-attribute to replace
+  (cdr (assq 'blah args)), just in case I ever decide to replace the 
+  assoc list currently used.
+
+* New file mule-sysdp.el, to make supporting Mule 2.3, Mule 2.4, and
+  XEmacs 20.0 easier.
+
+* url-file.el (url-insert-possibly-compressed-file): handle mule 2.4
+
+Fri Dec  6 06:54:03 1996  William Perry  <address@hidden>
+
+* w3-parse.el: Emit warnings when people try to slap attribute/value pairs
+  on end tags.  Evil bastards.
+  Added SPAN, BDO, OBJECT, BASEFONT
+
+Fri Dec  6 04:42:24 1996  Greg Stark  <address@hidden>
+
+* default.css: add th td and caption text-align information
+
+* docomp.el: increase max-specpdl-size so it can compile w3-display
+
+* url.el (url-sentinel): avoid save-excursion around switch-buffer 
+
+* w3-display (w3-display-line-break): if we're in nowrap mode but the
+  region doesn't end on a newline insert an extra newline, otherwise <br>
+  gets ignored inside a <pre> or nowrap environment. 
+  Also protect against fill-column less than the length of fill-prefix. 
+  Also avoid infloop in right justification, and
+  fix bug that caused right justification to never be executed.
+
+* w3-display (table-cut table-dimensions w3-display-table): 
+  lots of new code to handle rowspan and autolayout.
+
+* (w3-display-fix-widgets): be more agressive adjust even markers that have
+  buffers and adjust parent markers.
+
+* w3-display (w3-display-node): These changes are important for tables
+  Don't insert insert-before on <a> tags before the class is adjusted
+  Don't insert more than one class into an <a> tag when we adjust it. 
+  Protect against a negative fill-column when drawing <hr>s
+  Set adaptive-fill-mode (what's filladapt-mode?)
+
+* w3-parse.el: remove font from %block. WARNING, i have little idea what
+  consequences this has but it seems to have the desired effect of
+  handling table cells whose first tag is a <font> without discarding the
+  implied <p> tag.
+
+* w3-parse.el: skip-chars-forward "^>" when parsing end tags 
+  (some people seem to think you can put attributes in end tags)
+
+Fri Dec  6 14:08:30 1996  William M. Perry  <address@hidden>
+
+* css.el: Better handling of text-decoration, to go along with the new version
+  of set-font-style-by-keywords
+       
+* font.el: Faster version of set-font-style-by-keywords.
+  Fixed RGB spec. problem if you used non-floats.
+
+* w3-display.el: (w3-face-for-element) Obey some font function renaming.
+  (w3-face-for-element) Changed format specification on w3-style-face-xxx
+  creation.
+  (w3-display-node) Alignment specified via attributes overrides
+  stylesheet, not vice versa.
+  (w3-display-node) Fixed stupid mistake in 'link' handling where
+  stylesheets were ignored.
+
+Thu Dec  5 17:51:37 1996  William M. Perry  <address@hidden>
+
+* url.el: (url-retrieve-internally) Can now specify an alternative
+  function to determine whether a URL should be proxied or not.  modelled
+  off the netscape auto-proxy-configuration crap, so hopefully someday we
+  can just suck down one of their files and be 'happy' with it.
+
+* w3-display.el, css.el:
+  Modified some of the css properties to not be inherited - let
+  w3-display figure it out on its own - quicker this way.  Saves a few
+  thousand lookups over the life of a parse.
+
+Mon Dec  2 20:22:12 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: use better face names... avoids problems in xemacs
+  resource name checking.
+
+* w3-vars.el: Created version 3.0.33
+
+* w3-parse.el: Fixed problem parsing attribute values like <img alt=''> -
+  the regexp didn't like empty attribute values specified with single
+  quotes.
+
+* w3.el: -Patches from Dave Love
+
+* font.el: Renamed the font-set-*-p to set-font-*-p, to be more in line with
+set-face-underline-p and friends.  Fixed stupid problem in
+set-font-*-p where it would always just toggle the property, not
+actually set it.  Blah.  Added code in x-font-create-name to try
+oblique and italic versions of a font if italic is set.
+
+* default.css: Prettied up the :speech: section
+
+* w3-display.el:
+Conditionalized get-style-info calls in w3-voice-for-element on
+feature 'emacspeak
+
+* w3.el: Added code to try loading dtk-css-speech and w3-speak if the feature
+'emacspeak' is available.
+
+* css.el: Fixed a few stupid problems.
+
+* font.el:
+made tty-font-create-object return a 12pt font object, just for reference.
+
+* w3.txi: More updates to the documentation
+
+* w3.el, w3-style.el: Moved to using the new 'css' package
+
+* w3-parse.el:
+Removed some old functions.  Save some string creation by downcasing
+tag and atribute names in the buffer instead of using 'downcase'.
+
+* w3-display.el: Moved to using the new 'css' package
+
+* w3-auto.el: Removed some outdated autoloads
+
+* font.el: Added function font-set-style-by-keywords
+
+* css.el: Better handling of various entities - beter way of specifying new
+properties and how they should be handled.
+
+* default.css: *** empty log message ***
+
+* dist.Makefile: Added 'css.el' to targets
+
+* css.el: Initial revision
+
+* w3-vars.el: Renamed w3-right-border to w3-right-margin
+
+Sat Nov 30 17:42:38 1996  William M. Perry  <address@hidden>
+
+* custom-edit.el, custom.el, widget-edit.el, widget.el:
+-Synch'd up to Custom/Widget 1.09
+
+Fri Nov 29 23:12:42 1996  William M. Perry  <address@hidden>
+
+* font.el: Actually try to use the 'oblique' property under X
+
+* w3-display.el:
+Fix for sometimes getting an invalid glyph error in image retrieval.
+Fixed problem where table display would pop something off the open element 
stack.
+
+* custom-edit.el, custom.el, widget-edit.el, widget.el:
+-Synch'd up to Custom/Widget 1.08
+
+* w3-display.el: List filling seems to line up correctly now.
+Fixed bug in ordered list handling (wrong arg passed to a format).
+Changed the way spacing is handled.
+
+* w3-menu.el: Added new 'search' menu with common web indexes
+
+* dist.Makefile:
+Don't specify widget*.el twice in SOURCES _AND_ CUSTOMSOURCES or
+install under FreeBSD chokes.
+
+* w3-display.el: Protect against list-item display property outside of a list.
+
+* w3-sysdp.el: Fixed free var reference in make-device
+
+Thu Nov 28 23:01:11 1996  William M. Perry  <address@hidden>
+
+* w3-display.el:
+Protect against bad values of w3-last-fill-pos in w3-display-line-break
+
+* w3-e19.el, w3-menu.el:
+-Patches from Dave Love <address@hidden> for using title of link in menus
+
+Wed Nov 27 22:59:56 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.32
+
+* w3.txi: Started revamping some of the documentation
+
+* url-custom.el: Initial revision
+
+* w3-display.el: Handle 'menu' list type correctly
+
+* url.el: Patch from address@hidden;
+- insert information about processes in buffer "URL Status Display"
+  instead of *URL-<i>* : added a local variable `url-status-buf' and a
+  call to `set-buffer'
+
+- changed `url-get-working-buffer' to `url-get-working-buffer-name',
+  because `url-working-buffer' is expected to be a name, not a buffer
+  (my mistake)
+
+* w3-xemac.el, w3-vars.el:
+Removed some old variables that aren't used anywhere now.
+
+* w3-e19.el:
+Patch from Dave Love <address@hidden> for 'title' version of w3-echo-link.
+
+* w3-display.el:
+Patch from Dave Love <address@hidden> for 'title' version of w3-echo-link.
+Form info is now stuck on a stack instead of in a let-bound variable.
+Only call w3-display-fix-widgets once!  recursive calls to
+w3-display-node when rendering tables caused it to happen more than it
+should.
+
+* w3-forms.el:
+Patch from Dave Love <address@hidden> to protect against bad value
+for 'next' in w3-next-widget.
+
+* dist.Makefile: Don't use `install -d', use mkdir -p if necessary
+
+Tue Nov 26 16:21:32 1996  William M. Perry  <address@hidden>
+
+* custom-edit.el, custom.el: synch'd up to custom 1.05
+
+* widget.el, widget-edit.el: *** empty log message ***
+
+* widget-edit.el, widget.el: synch'd up to widget 1.05
+
+* w3-display.el: Handles the 'dir' list type correctly now.
+
+* url.el:
+Quick patch to check for url-working-buffer being a buffer, not a string.
+
+* w3-display.el:
+Backed out _BAD BAD BAD_ change to protect against invalid values for
+w3-last-fill-pos that basically fucked everything in regards to
+vertical whitespace.
+
+Mon Nov 25 21:12:17 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: *** empty log message ***
+
+* w3-display.el:
+Now only does incrememental display around block level elements.
+Does better munging of pre-formatted text CR -> LF CRLF->LF, etc.
+
+* w3.el: Protect against errors in w3-sentinel on bad buffers.
+
+* w3-vars.el: Created version 3.0.31
+
+* widget-edit.el: Fixed compile problems under emacs
+
+* w3-vars.el: *** empty log message ***
+
+* widget.el: Made widget.el compile in emacsen w/o native backquote support
+
+* w3-display.el: *** empty log message ***
+
+* w3-parse.el:
+Patch from greg stark for dealing with '=' in misquoted attribute value pairs
+
+Sun Nov 24 23:25:25 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: Reimplemented targetted anchors (#foo)
+
+* url.el: *** empty log message ***
+
+* url-vars.el:
+Changed default of url-mime-language-string to '*' to make some sites happy.
+
+* w3-display.el: Protect against w3-last-fill-pos getting an invalid position
+
+* w3.el, w3-display.el, w3-vars.el:
+Patch from Dave Love <address@hidden> to add new possibility 'title'
+to w3-echo-link to show the 'title' attribute of a link if its there.
+
+* w3-speak.el: Patch from raman.
+
+* font.el:
+Patch from address@hidden to handle fontsets correctly in mule
+
+* w3-display.el: Implemented a few more CSS properties.
+list-style - control how list items are displayed.  Ordered lists are
+             now different from unordered only in their list-style.
+             Need to implement contextual selectors to get ordered
+             lists to work out of the box though.
+white-space - control whether whitespace is collapsed or not, and
+              whether text is wrapped.  <pre> <xmp> and <plaintext>
+              are now all specified to use this in the default
+              stylesheet.
+text-align - this replaces the old 'align' attribute
+
+Reimplemented inlined styles.
+
+* default.css: Varius updates to take advantage of the new CSS properties
+  white-space, list-style, etc.
+
+* w3-style.el: Handle url() and rgb() notation in color specifications
+
+* w3-vars.el: Removed a few outdated variables
+
+Sat Nov 23 02:10:37 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: *** empty log message ***
+
+* dsssl.el: Got rid of yet more compilation warnings.
+
+* custom.el, custom-edit.el: Synch'd up to custom 1.0.1
+
+* w3-display.el: Better handling of <hr> and <center>, and line spacing in
+  general
+
+* default.css: Updates to default stylesheet to deal with <center> and <div>
+
+* w3.el, url.el, url-vars.el, url-http.el: Patches from Thierry Emery to
+  allow multiple asynch fetches.
+
+Fri Nov 22 22:26:35 1996  William M. Perry  <address@hidden>
+
+* widget-edit.el, widget.el: -Synch'd up to widget 1.01
+
+* w3-style.el: Fixed a few fRemoved a few free variable sets/refs
+
+* w3.el:
+When saving a document as html source, try to get into the 'head' before 
inserting the base.
+
+* w3-display.el, w3-style.el: Stylesheets now store all there information
+  as property lists instead of assoc lists.  Just easier.
+
+* font.el: Fix for font-normalize-color under nextstep
+
+Thu Nov 21 04:01:22 1996  William M. Perry  <address@hidden>
+
+* widget-edit.el, widget.el: synch'd to 1.00 of widget/custom
+
+Mon Nov 18 16:26:06 1996  William M. Perry  <address@hidden>
+
+* install.sh: Initial revision
+
+* html32.dsl: Updated to latest from jon bosak
+
+* w3-vars.el: Created version 3.0.30
+
+Thu Nov 14 22:39:36 1996  William M. Perry  <address@hidden>
+
+* w3.el: Changed this so you can actually just do a (require 'w3-sysdp)
+  and each function will check to see if it should overwrite, instead of
+  conditionalizing that on the whole file.
+
+* url.el: *** empty log message ***
+
+* images.el, font.el, docomp.el, w3-sysdp.el: Changed this so you can
+  actually just do a (require 'w3-sysdp) and each function will check to
+  see if it should overwrite, instead of conditionalizing that on the
+  whole file.
+
+* w3-display.el: Moved some macros around.
+
+* widget.el, widget-edit.el, w3-forms.el: Sync'd up to Widget 0.999
+
+* w3-auto.el, w3-menu.el: *** empty log message ***
+
+Sun Nov 10 18:08:24 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.29
+
+* dsssl.el: Various changes, starting on the actual flow object stuff
+
+Tue Nov  5 05:26:07 1996  William M. Perry  <address@hidden>
+
+* url-news.el: Updated version checking of news to deal with 'red' gnus
+
+Mon Nov  4 14:47:47 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: Don't show the content of 'script' - typo
+
+Fri Nov  1 15:08:45 1996  William M. Perry  <address@hidden>
+
+* default.css: Changes from raman
+
+Thu Oct 31 18:51:52 1996  William M. Perry  <address@hidden>
+
+* widget-edit.el: -
+
+Tue Oct 29 19:53:38 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: *** empty log message ***
+
+Thu Oct 24 02:25:03 1996  William M. Perry  <address@hidden>
+
+* w3-widget.el: Updated the image widget to the new widget stuff.
+
+Wed Oct 23 13:26:09 1996  William M. Perry  <address@hidden>
+
+* docomp.el: *** empty log message ***
+
+* url.el: Fixed bug in url-remove-relative-links that would choke on something
+like: /foo/bar/./../baz/ - they /../ was removed first, removing its
+parent directory, the /./ - ack.
+
+* w3-display.el: Image loading is back!
+Client-side imagemaps are back!
+Forms that span tables are working now.
+
+Mon Oct 21 21:32:33 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.28
+
+* url-mail.el: Make mail handling a little more generic.
+
+* w3-display.el:
+Fix for w3-display-fix-widgets so that links right up against each
+other don't cause it to skip every-other-one.
+
+Sun Oct 20 16:47:05 1996  William M. Perry  <address@hidden>
+
+* w3-style.el: don't map a pitch of 9 to 0.
+
+* w3-speak.el:
+Added back in the advice for url-lazy-message that provided auditory
+feedback during URL retrieval.  Also added back in the
+w3-speak-browse-page command.
+
+* w3-speak.el:
+Some patches from TV Raman to fix multiline text entry area speaking
+and a bogus call to widget-get in text entry area speaking.
+
+Fri Oct 18 12:27:04 1996  William M. Perry  <address@hidden>
+
+* w3-display.el:
+Patches from Thierry Emery <address@hidden> to
+implement 'colspan' on tables.  Patch to support align=xxx on
+arbitrary tags.
+
+Thu Oct 17 22:27:44 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.27
+
+* w3-display.el:
+fixed voicification of hyperlinks.  Fixed problem in w3-normalize-spaces
+and multi-line strings.
+
+Wed Oct 16 20:56:40 1996  William M. Perry  <address@hidden>
+
+* w3-speak.el: Fix stupid problem.  function renaming lossage.  Fun
+
+* w3-display.el:
+Fixed <select> form items that had no <option value=xxx selected>
+entry in them.  Wheee.
+
+* w3-display.el:
+Fixed <select> form items that had an <option value=xxx selected>
+entry in them.  Wheee.
+
+* w3.el: document info is now shown as a table.
+
+* w3.el: Document information is now shown as a table.
+
+* w3-display.el, w3-vars.el: Now keeps better track of the <meta> tag info
+
+* w3-vars.el: Created version 3.0.26
+
+* w3-display.el: *** empty log message ***
+
+Tue Oct 15 13:21:54 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: Added back in <meta> and <link> handling.
+Fixed insert-before and insert-after for 'a' tag and pseudo-classes
+
+* w3-display.el:
+Fixed some potential runaway style inheritance - need to think about a
+better way to pop style info off the various stacks than
+(w3-handle-content node) on an empty element.
+
+* w3-display.el: Fixed <textarea> elements in forms
+
+* w3-display.el, w3-forms.el: Fixed <select> elements in forms
+
+Sun Oct 13 23:50:03 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.25
+
+* dsssl.el: Bug fixes
+
+* url-hash.el:
+Fixed bug in url-gethash where it wasn't honoring the 'default' parameter
+
+Sat Oct 12 20:32:49 1996  William M. Perry  <address@hidden>
+
+* widget.el, widget-edit.el: Synched up to widget 0.99.4
+
+Fri Oct 11 18:55:02 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: fix for xemacs w/ temp faces
+
+* w3-display.el: Fixed a bug with the insert-after handling. Duhh.
+
+* default.css, w3-display.el: Implemented insert-before and insert-after
+
+Wed Oct  9 19:00:59 1996  William M. Perry  <address@hidden>
+
+* ssl.el, url-cookie.el, url-file.el, url-gopher.el, url-hash.el, url-http.el, 
url-irc.el, url-mail.el, url-misc.el, url-news.el, url-nfs.el, url-parse.el, 
url-pgp.el, url-vars.el, url-wais.el, url.el, urlauth.el, w3-about.el, 
w3-annotat.el, w3-display.el, w3-e19.el, w3-emulate.el, w3-forms.el, w3-hot.el, 
w3-imap.el, w3-keyword.el, w3-latex.el, w3-menu.el, w3-mouse.el, w3-mule.el, 
w3-parse.el, w3-prefs.el, w3-print.el, w3-speak.el, w3-style.el, w3-toolbar.el, 
w3-vars.el, w3-widget.el, w3-xem20.el, w3-xemac.el, w3.el, xbm-button.el, 
xpm-button.el, base64.el, dsssl.el, font.el, images.el, md5.el, mm.el:
+-Updated copyrights/addresses
+
+Tue Oct  8 14:56:22 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: Tables now default to having no border
+
+* w3-forms.el: Require w3-vars so Gnus will work
+
+* w3-vars.el: Created version 3.0.24
+
+* w3-speak.el:
+Added a few patches from raman and the latest version of emacspeak -
+everything appears to work out of the box now.
+
+* w3-style.el:
+Added in a few autoloads for getting emacspeak to work right out of the box.
+
+* w3-display.el: Added back in the :help-echo stuff on widgets
+
+Mon Oct  7 18:09:17 1996  William M. Perry  <address@hidden>
+
+* w3-display.el:
+<isindex> works again.  Automatically turns off filladapt-mode now,
+since we apparently don't play well together.
+
+* default.css: Added some margins
+
+* w3-display.el: Fix for emacs 19
+
+Fri Oct  4 17:08:51 1996  William M. Perry  <address@hidden>
+
+* dsssl.el:
+Fixed a few errors in calling w3-dsssl-check-args.  Now _EVERYTHING_
+compiles cleanly.
+
+* docomp.el: Added a few more variables to the 'expected-to-be-free' list.
+Everything but dsssl.el compiles cleanly now.
+
+* url-news.el: Fixed a few typos that resulted in free variable references.
+
+* w3-display.el: New function w3-make-face to 'do the right thing' in
+Emacs/XEmacs/Emacs-with-no-X-support.
+Implemented margin-left and margin-right.
+Fixed a few problems with runaway or insufficient application of styles.
+
+Mon Sep 30 19:43:35 1996  William M. Perry  <address@hidden>
+
+* url-hash.el:
+Nasty hack to fix the   !! error (("file \"cl-extra\" didn't define 
\"gethash\"")) stuff people are seeing under Emacs-19
+
+* w3-vars.el: Created version 3.0.23
+
+* w3-prefs.el: Updates for new widget package
+
+* w3-display.el:
+No more recursion!  Lots more shit broke though.  Lists are totally broken.
+
+* w3.el: Updates for new widget package
+
+* w3-keyword.el: *** empty log message ***
+
+Sun Sep 29 21:26:47 1996  William M. Perry  <address@hidden>
+
+* widget.el, widget-edit.el: Updated to version 0.99 of the library
+
+* widget-edit.el: Allow the :help-echo widget stuff to be a symbol
+
+* w3.el: More updates for the latest widget package
+
+* w3-sysdp.el: New functions prepend-text-property, append-text-property,
+fillin-text-property
+
+* default.css, url.el: *** empty log message ***
+
+Wed Sep 25 10:53:08 1996  William M. Perry  <address@hidden>
+
+* dist.Makefile: Removed custom.el and custom-edit.el from the distribution.
+
+Tue Sep 24 05:04:47 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.22
+
+* widget.el, widget-edit.el: Updated to latest widget stuff from Per.
+
+* w3-parse.el:
+Added <script> to %body.content so that stupid IE 3.0 demo pages would work.
+
+* w3-keyword.el:
+Added some new keyword defs to get rid of compile-time warnings
+
+* w3-forms.el, w3-display.el: Now works with newest widget stuff
+
+* url.el: New function url-parse-query-string, to return an assoc list of name
+value pairs from a URL-style query. url-unhex-string now takes an
+optional second argument for whether to allow decoding of newlines or
+not.
+
+* url-mail.el:
+Now understands netscape-style 'extensions' to the mailto: specifier.
+ie: mailto:wmperry?subject=thesubject&bcc=root
+
+* font.el:
+Now always converts to points instead of pixels, seems to give better
+results this way.
+
+Mon Sep 23 04:53:56 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.20
+
+* dsssl.el: Made dsssl depend on url-hash
+
+Sun Sep 22 05:16:06 1996  William M. Perry  <address@hidden>
+
+* w3-display.el, w3-parse.el: *** empty log message ***
+
+* w3-display.el: Some spacing changes, fix for nested lists
+
+* custom.el, widget-edit.el, widget.el: -
+
+* custom-edit.el: *** empty log message ***
+
+Fri Sep 20 05:07:12 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.19
+
+* w3-display.el: *** empty log message ***
+
+* w3-sysdp.el: Added in stub for set-keymap-parents
+
+* w3-speak.el: Patches from raman
+
+* w3-prefs.el, w3-imap.el: *** empty log message ***
+
+* w3-hot.el: Fixed w3-read-html-bookmarks to work with some parser changes.
+
+* w3-forms.el: Made forms work again.
+
+* w3-display.el: Changed how the borders on tables are drawn.
+Added back in the voice support.
+
+Thu Sep 19 05:12:49 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.18
+
+* dist.Makefile:
+Moved the URL and W3 packages back into one big distrubtion again
+
+* w3-vars.el: Created version 3.0.18
+
+* w3-vars.el: Created version 3.0.19
+
+* w3-display.el: Don't crap out on tables with 0 columns
+
+* docomp.el, url.el: *** empty log message ***
+
+Wed Sep 18 12:50:03 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.18
+
+* docomp.el: *** empty log message ***
+
+* w3-display.el: Space filling fixes
+
+* w3-auto.el: Added autoload for w3-style-post-process-stylesheet
+
+Tue Sep 17 12:50:47 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.16
+
+* w3-display.el, w3-e19.el: *** empty log message ***
+
+Mon Sep 16 04:46:18 1996  William M. Perry  <address@hidden>
+
+* custom-edit.el, custom.el, widget-edit.el, widget-example.el, widget.el:
+Initial revision
+
+Sun Sep 15 22:47:53 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.15
+
+* w3-display.el: Alignment stuff works (right, left, full, center).
+Tables can now be borderless, and if it has borders, they are all there.
+<pre>/<xmp> work.
+
+* url-vars.el: Created version 1.0.42
+
+* url-http.el: *** empty log message ***
+
+* w3-vars.el: Created version 3.0.14
+
+* html32.dsl: Initial revision
+
+* w3.el: Use the new display code.
+
+* w3-forms.el: A few changes for the latest display code
+
+* w3-vars.el: Created version 3.0.14
+
+* w3-display.el: Actually mostly works
+
+* w3-parse.el: Removed hooks into the old display engine
+
+* url.el: *** empty log message ***
+
+* w3-speak.el: Update from raman
+
+* url.el: *** empty log message ***
+
+Sat Sep 14 16:48:24 1996  William M. Perry  <address@hidden>
+
+* url-gopher.el, url.el:
+Added '...' to the downloading messages so that they do not show up in
+the message log buffer under Emacs 19.xx
+
+* w3-parse.el: Changed content-model of <script> to fix problems on some sites
+(notably netscape's) that use an unescaped </ in the script.  BAD SGML
+DAMMIT.
+
+Fri Sep 13 05:24:53 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.13
+
+* w3-forms.el: Use the new :ignore-case stuff for choice items
+
+Thu Sep 12 05:57:47 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: Holy shit tables work.
+
+Tue Sep 10 03:11:55 1996  William M. Perry  <address@hidden>
+
+* w3-speak.el: Bug-fixes from raman.
+
+Mon Sep  9 05:18:37 1996  William M. Perry  <address@hidden>
+
+* dsssl.el:
+Removed a few compiler warnings and fixed a few bugs (equal, error, time
+
+* dsssl.el:
+DSSSL (define ...)'d functions are now called correctly.  Wow.  Added
+in most of the rest of the DSSSL(o) application profile functions.
+
+* dsssl.el: Initial revision
+
+* w3-parse.el: *** empty log message ***
+
+* w3-about.el, w3-annotat.el, w3-draw.el, w3-e19.el, w3-emulate.el, 
w3-forms.el, w3-hot.el, w3-imap.el, w3-keyword.el, w3-menu.el, w3-mouse.el, 
w3-mule.el, w3-prefs.el, w3-print.el, w3-speak.el, w3-style.el, w3-toolbar.el, 
w3-vars.el, w3-widget.el, w3.el, w3-xemac.el, images.el:
+Changed copyright assignment
+
+* font.el: changed copyright assignment
+
+Sun Sep  8 00:31:52 1996  William M. Perry  <address@hidden>
+
+* w3-draw.el:
+Added in a stub handler for the 'frame' tag, so that you can still get
+to frame pages written by idiots who don't use a decent 'noframe'
+subdocument.
+
+* url.el: Removed nntp-after-change-function, since it screwed up GNUS
+
+Sat Sep  7 01:45:17 1996  William M. Perry  <address@hidden>
+
+* w3-latex.el: updated email address for stephen peters
+
+Wed Sep  4 02:09:08 1996  William M. Perry  <address@hidden>
+
+* socks.el: Initial revision
+
+Sun Sep  1 16:22:50 1996  William M. Perry  <address@hidden>
+
+* w3-draw.el: Don't load images on a TTY device in XEmacs.  General speedup
+
+Thu Aug 29 04:09:40 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.12
+
+Sun Aug 25 17:12:32 1996  William M. Perry  <address@hidden>
+
+* w3-draw.el: Added some stubs for tables
+
+Mon Aug 19 03:30:47 1996  William M. Perry  <address@hidden>
+
+* w3.el: fixed bug in w3-insert-formatted-url
+
+Mon Aug 12 03:10:30 1996  William M. Perry  <address@hidden>
+
+* w3-style.el: Don't make a null voice of paul-5555 if no stuff is specified.
+
+* default.css: Added speech elements to the default stylesheet.
+
+Sun Aug 11 16:41:58 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.11
+
+* font.el:
+Fix for font-default-font-for-device under XEmacs when you use a font
+like '10x20' instead of the fully specified version
+
+Sat Aug 10 16:14:08 1996  William M. Perry  <address@hidden>
+
+* w3-forms.el:
+Do not encode the '.' in application/x-www-form-urlencoded.  Fucking
+netscape compatbility.  What _SPEC_?!  There aren't any specs on the
+web, right?!
+
+* w3-forms.el:
+Fixed problem with submissions of a form with the exact same arguments
+causes elements from both form to be submitted.  ack.
+
+Tue Aug  6 14:03:52 1996  William M. Perry  <address@hidden>
+
+* w3-parse.el:
+fixed stupid mistake in DTD I made when changing to 3.2 DTD - left
+'style' out of head's content-model so no in-document stylesheet stuff
+was getting parsed.  gack.
+
+* w3-forms.el: No longer put a 'choose' in front of option menus
+
+* w3-speak.el: fixed bugs
+
+Mon Aug  5 14:03:09 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.10
+
+* default.css: A few mild changes, and docs.
+
+Sun Aug  4 23:51:26 1996  William M. Perry  <address@hidden>
+
+* w3-speak.el: new version of w3-speak from raman
+
+* w3-draw.el: Style search alg. now looks for tag/id|name first.  Now supports
+inlined 'style' keyword on any tag.  Gack *sigh*
+
+* w3-style.el:
+Can now have periods in class names.  Fixed bug where the class would
+be normalized to lowercase as well as the tag name.  BAD BAD BAD.
+
+* w3-speak.el: some changes from raman
+
+* w3-style.el: Think I finally fixed some stylesheet weirdness
+
+* w3.el: Don't override user prefs w/w3-user-colors-take-precedence -duh
+
+* w3-parse.el: fixed graphical entities
+
+Sat Aug  3 20:09:50 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el:
+Added textual representation of the 'artist formerly known as prince'
+graphical icons
+
+* md5.el: removed /bin/sh dependency in md5
+
+Fri Aug  2 14:08:38 1996  William M. Perry  <address@hidden>
+
+* url-vars.el: Created version 1.0.41
+
+* url.el:
+no longer special case file:// urls when checking for no_proxy - thats
+just stupid.
+
+Thu Aug  1 13:32:54 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.9
+
+* url.el: made url-insert-file-contents  interactive
+
+* w3-sysdp.el:
+added data-directory to sysdep version of x-library-search-path for
+emacs under windows 95/nt
+
+* w3-vars.el:
+Implemented &prince; and &princesymbol; graphical entities.  Thanks
+for the note Jamie Z!
+
+* w3-forms.el: fix for gopher searches
+
+* w3-draw.el: Added support for balloon-help
+
+Fri Jul 26 05:57:21 1996  William M. Perry  <address@hidden>
+
+* w3-display.el, w3-texinfo.el: Initial revision
diff --git a/ChangeLog.3 b/ChangeLog.3
new file mode 100644
index 0000000..7565780
--- /dev/null
+++ b/ChangeLog.3
@@ -0,0 +1,8487 @@
+Thu Jun  6 15:03:15 1996  William Perry  <address@hidden>
+
+
+* w3-auto.el: Added autoload for w3-show-dvi
+
+* w3-latex.el: w3-parse-tree-to-latex now takes optional URL argument.
+<pre> and <xmp> text now work correctly.
+Added a known-bugs section.
+Added a variable for whether to print hyperlinks as footnotes or not.
+
+
+* w3-annotat.el, w3-e19.el, w3-forms.el, w3-hot.el, w3-prefs.el, w3-xemac.el, 
w3.el:
+Replaced w3-insert w/insert - no longer needed
+
+* w3-latex.el: Added footnotes for hypertext links
+
+Wed Jun  5 20:18:36 1996  William Perry  <address@hidden>
+
+* w3-latex.el:
+Changed some things to be more like w3-draw in how it gets formatting
+informatino for each chunk
+
+* w3.el:
+Merged in new latex printing code from Stephen Peters <address@hidden>
+
+* w3-print.el: Stephen Peters <address@hidden>
+
+* w3-auto.el:
+Merged in new latex printing code from Stephen Peters <address@hidden>
+
+* w3-latex.el: Initial revision
+
+* w3-parse.el: patch from jbw for eveil <! comment syntax
+
+Mon Jun  3 20:43:37 1996  William Perry  <address@hidden>
+
+* w3-parse.el, w3-vars.el:
+added flag for whether to honor netscape style <! > comments.
+
+
+* w3-parse.el, w3-vars.el: Added alt text capabilities to w3-graphic-entities
+
+* w3-menu.el: Toggling menubar from Emacs->W3 works again
+
+* w3.el: w3-map-links works again, so does w3-complete-link
+
+* w3-e19.el, w3-xemac.el: removed old def. of w3-map-links
+
+* w3-draw.el: fixed url expansion
+
+* w3-forms.el:
+More fixes for netscape compatibility with single-text entry form
+submissions
+
+* w3-speak.el:
+Added a few patches from Raman (folding-mode stuff) and definition of
+advice for w3-scroll-up
+
+* w3-prefs.el:
+Got rid of some compiler warnings about free variables, and removed
+some bogus variables that I can get elsewhere now
+(w3-preferences-numglyphs)
+
+* w3-prefs.el: Added hooks for setting up the prefs buffer, and ok/cancel/reset
+hooks.  Fixed saving of proxy information
+
+* descrip.mms: Updated VMS MMS file
+
+* dist.Makefile: Added w3-prefs to the distribution
+
+Sun Jun  2 20:09:22 1996  William Perry  <address@hidden>
+
+* w3-draw.el: a few more emacspeak extensions
+
+
+* w3-e19.el: Fixed compile-time errors re: w3-form-element-* functions
+
+* w3-draw.el: fixed bug in w3-valid-voice-p
+
+
+* w3-speak.el: fixed some compiler warnings
+
+
+* dist.Makefile: Added w3-speak.el to the distribution
+
+* w3-speak.el:
+Move some functionality of the w3-fetch defadvice into a w3-mode-hook
+that is automatically added by w3-speak-use-voice-locking
+
+* w3-speak.el: Wow, I think it will work
+
+* w3-draw.el: reimplemented w3-echo-link
+
+* w3.el: fixed problem of not resetting the user's value of url-be-asynchronous
+in the new version of w3-download-url
+
+* w3.el: Made w3-download-url asynchronous by default, and make sure it asks
+for the filename before it starts the download.
+
+Sat Jun  1 20:04:22 1996  William Perry  <address@hidden>
+
+* w3.el: Fixed w3-download-url
+
+* w3-parse.el: Fixed graphic entities to use normal entity expansion instead of
+'STARTTAG - see commentary in the code for why exactly.
+
+* w3.el: Fixed w3-mail-document-author to do the right thing for 'made' links
+again.  Now searches for mail(to|server) links first.  If none found,
+takes the first 'made' link and fetches that.  If one found, fetch it.
+If more than one mail(to|server) link is found, present the user with
+a list and let them choose.
+
+* w3-speak.el: Initial revision
+
+Fri May 31 21:34:19 1996  William Perry  <address@hidden>
+
+* w3-draw.el, w3-style.el: Basic support for emacspeak out of the box
+
+* w3.el: Fixed typo in w3-popup-info
+
+* w3-parse.el: Fixed bug in graphic entity creation
+
+* w3.el: Added new function w3-describe-entities that lists all the entities
+currently defined.
+
+* w3-parse.el: Added in new definitions for graphic entities - they live again!
+
+* w3-vars.el: Added in new definitions for graphic entities
+
+
+Thu May 30 17:32:36 1996  William Perry  <address@hidden>
+
+
+* w3-prefs.el:
+Changed to only using one buffer instead of two stacked buffers - was
+too big a pain in the ass to navigate w/o the mouse.
+
+* w3-forms.el: fixed form submission changes
+
+* w3-draw.el:
+Supports target'ed windows to some extent (external, _blank, _top)
+
+* w3.el: delete-other-windows in w3-fetch-other-frame
+
+* w3-draw.el:
+the hyperlnk widgets now keep _all_ attributes that are specified on a
+link in them as widget properties.  This will eventually allow us to
+do targetted windows, etc.
+
+
+* w3-prefs.el: protect against errors in widget-forward
+
+* w3-prefs.el:
+Ok, cancel, and save buttons work.  Proxy configuration screen is
+complete.  Old window configuration restored when exiting.  Now
+selects the prefs window after choosing something from the toolbar
+
+* w3-sysdp.el: Added symbol-value-in-buffer
+
+
+* w3-draw.el, w3-forms.el: Single-entry form auto-submission now works again
+
+* w3-sysdp.el: Added insert-file-contents-literally function
+
+Wed May 29 21:52:40 1996  William Perry  <address@hidden>
+
+* w3-prefs.el: proxy panel sort of works
+
+* w3-print.el: Few patches to the latex printing by Stephen Peters
+<address@hidden>
+
+* w3-mouse.el: w3-follow-inlined-image works again
+
+* w3-draw.el:
+Fixed problem with paragraph filling screwups after <xmp></xmp> sections
+
+* w3-vars.el:
+new keybinding for return so that return doesn't self-insert when not
+on a hyperlink
+
+
+* font.el: don't error out on bad rgb color values
+
+* font.el: Don't error out if you cannot find the rgb.txt file
+
+* w3-parse.el:
+Supports stupid address@hidden netscape-style <! > `comments'.  What complete
+and utter horseshit.
+
+* w3-draw.el: fixed read-only errors once and for all. :)
+
+* w3-e19.el: removed old bogus definition of w3-follow-inlined-image-mouse
+
+
+* w3-prefs.el: progress
+
+* w3.el: Now correctly looks for 'stylesheet' in w3-configuration-directory.
+Avoid infinite recursion if url-be-asynch == t when
+w3-find-default-stylesheets is called
+
+* w3.el: fix for http 0.9 servers and asynchronous transfers
+
+* w3-widget.el:
+Actually added w3-image-widget-callback so 'href images work right
+
+Tue May 28 22:35:46 1996  William Perry  <address@hidden>
+
+* w3-prefs.el: Initial revision
+
+
+* w3-menu.el: Put the correct Emacs/XEmacs in the menubar toggle
+
+* w3-draw.el:
+fixed problems with badly specifid colors in netscape-crap <body> attributes
+
+* w3-forms.el: <input type=image> works minimally
+
+* w3-forms.el:
+Fixed a problem with option lists in forms.  The forms validator is cool
+
+* w3.el: previewing buffers now works much _MUCH_ better
+
+* w3.el: Added stub for w3-find-file, a more intuitive name for w3-open-local
+
+* w3-draw.el: Link-echoing now works
+
+* widget.el, widget-edit.el:
+Changed widget-forward to honor a new :help-echo property
+
+
+* widget-edit.el:
+Fix for widget-forward when widgets are _RIGHT_ on top of each other
+
+* w3.el: Fixed stupid problem on my part
+
+* w3-draw.el:
+Fix problem with <pre> segments from Mac-based web servers (^M only, no ^J)
+
+* w3.el: Don't do set-auto-mode under mule, as it wigs out with null filenames
+
+* w3.el: Fixes for www: hrefs
+
+* w3.el: Fix for file information & last-modified
+
+Mon May 27 23:08:26 1996  William Perry  <address@hidden>
+
+* w3-draw.el: problem in 19.30
+
+* w3-forms.el:
+Fixed problem with 'submit' button on forms _always_ being sent to the
+server - overanxious with making sure everything had a 'name' field at
+widget creation time.  Gack.
+
+* w3-xemac.el:
+Beginnings of a mode-motion-handler to do spiffy handling of client
+side imagemaps, etc.
+
+
+Sun May 26 01:17:31 1996  William Perry  <address@hidden>
+
+* images.el: removed duplicate converter
+
+Fri May 24 18:19:16 1996  William Perry  <address@hidden>
+
+* w3-draw.el: file: urls for images work now
+
+* w3.el: Fixed missing paren in configuration-file warning code
+
+* w3.el: New version of w3-version from "Robert J. Chassell"
+<address@hidden> that will let you do C-u M-x w3-version to insert
+the version information into the buffer at point.
+
+* w3.el, w3-hot.el, w3-forms.el, w3-emulate.el, w3-annotat.el:
+No longer use mm-insert-file-contents lossage
+
+* images.el: Added p[np]m<->ps converters
+
+
+* w3-widget.el: No more newlines after images w/alt text & no hyperlink
+
+* w3.el: Moved where w3-default-configuration gets loaded so that you can set
+some variables in it and have them honored by the rest of w3-do-setup
+
+Thu May 23 16:08:23 1996  William Perry  <address@hidden>
+
+
+* w3-draw.el:
+Now only grabs images with the same URL/SRC once per page, instead of
+starting up multiple transfers for the same one.  Yeah.
+
+* w3-menu.el: context-sensitive menus now work again on images
+
+* w3-sysdp.el: synching up with XEmacs 19.14's version
+
+* w3-sysdp.el: Added lots more device functions
+
+Wed May 22 17:08:21 1996  William Perry  <address@hidden>
+
+
+* w3-widget.el: Now checks for invalid glyphs before removing the textual
+representation from the buffer.
+
+* w3.el: Removed w3-beta from the distribution - functionality moved elsewhere
+
+* w3-widget.el:
+Better handling of images that are hyperlinks that have no 'alt' text.
+
+* w3-draw.el:
+Some stuff from the old w3-beta, image fixes, initial color of html page 
should be better.
+
+
+* dist.Makefile:
+Removed w3-beta from the distribution - functionality moved elsewhere
+
+* w3-emulate.el: Moved w3-read-netscape-config into w3-emulate
+
+* w3-widget.el: Few screwups w/markers fixed
+
+Tue May 21 05:31:56 1996  William Perry  <address@hidden>
+
+* w3-draw.el, w3-forms.el, w3.el: Some XEmacs 20.0 MULE changes
+
+* w3-xem20.el: Initial revision
+
+
+Mon May 20 16:17:37 1996  William Perry  <address@hidden>
+
+* w3-draw.el: Asynch image loading works!
+
+* w3-widget.el: Put a help-echo property on the image extent when necessary
+
+* w3-imap.el: Removed lots of stuff into the new image widget
+
+* w3-widget.el:
+Make sure you always use a marker for the 'where' of an image widget
+
+* w3.el: w3-my-safe-copy-face is now a little more paranoid so that it will not
+bomb on TTYs
+
+Sat May 18 22:44:53 1996  William Perry  <address@hidden>
+
+* widget-edit.el: some text property munging for XEmacs
+
+* w3-widget.el: Yet more bug fixes for ye olde image widget
+
+* w3-widget.el:
+reorded some checks in the image widget callback so that client side
+imagemaps got done correctly.
+
+* w3-draw.el:
+Fixed bug in the use of the new image widget when it was _not_ used
+like <a href=foo>test<img src=blah>test</a>
+
+* w3-forms.el: Support <input type=button> ala netscape
+
+* w3-forms.el: Give default labels to submit and reset buttons
+
+
+Fri May 17 19:52:49 1996  William Perry  <address@hidden>
+
+* w3-draw.el: Now uses the new image widget
+
+* w3-widget.el: Various fixes
+
+* dist.Makefile: Added w3-widget to the distribution
+
+* w3-forms.el:
+Fixed radio button formatting problems (similar to choice options)
+
+* w3-menu.el:
+Don't put the hide location and hide statusbar menu entries in under
+Emacs 19 just yet.
+
+* w3-imap.el: Few fixes for Emacs 19 in tty mode
+
+* w3-forms.el:
+Option lists now no longer insert a newline unconditionally.  Ack.
+
+* w3-draw.el: inhibit-read-only for some Emacs 19 lossage
+
+Thu May 16 16:15:01 1996  William Perry  <address@hidden>
+
+* w3-menu.el: Better fix for XEmacs w/no menus
+
+* w3-mouse.el:
+Do not use button keysyms if no X support is compiled in (button1, etc)
+
+* w3-xemac.el:
+Don't make toolbar buttons if not (featurep 'toolbar).  Don't add our
+help stuff to the help menu unless (featurep 'menubar)
+
+* w3-menu.el:
+Don't install menus under XEmacs unless (featurep 'menubar), otherwise it will 
bomb on a TTY-only XEmacs.
+
+Tue May 14 16:32:16 1996  William Perry  <address@hidden>
+
+* w3-widget.el: Initial revision
+
+* font.el: Strikethru stuff works again.
+
+* default.css: added some netscapisms in the default stylesheets
+
+* w3-style.el: Added a require 'cl for 'case' handling
+
+* w3-parse.el: Added 'strike' tag to %font in the DTD ala HTML 3.2
+
+Mon May 13 20:56:52 1996  William Perry  <address@hidden>
+
+* dist.Makefile: Removed w3.ad from the distribution, as it is no longer used.
+
+Fri May 10 16:28:13 1996  William Perry  <address@hidden>
+
+
+* w3-imap.el: Now displays client-side imagemaps pretty sweetly under Emacs 19
+(drop-down list of destinations)... Whoo hoo!
+
+
+* default.css: few changes to default stylesheet - nothing major
+
+
+* w3-draw.el: fixed problem in w3-decode-area-coords
+
+Thu May  9 13:46:42 1996  William Perry  <address@hidden>
+
+
+Wed May  8 17:52:10 1996  William Perry  <address@hidden>
+
+* w3.el: Avoid creating bad html in w3-document-information
+
+
+Tue May  7 16:06:20 1996  William Perry  <address@hidden>
+
+
+* w3-vars.el: New keybinding C-A-t for listing open network transfers
+
+
+* w3-draw.el, w3-forms.el, w3-parse.el: Support <keygen> tags in the parser
+
+Mon May  6 18:03:06 1996  William Perry  <address@hidden>
+
+* images.el: fixed image converter for tiff->pnm and pnm->tiff.  Also added
+converter for JBIG (?!) image type
+
+* w3-forms.el:
+Fall back to using old-style looking stuff for text entry areas - some
+HTML was truly confusing where the widget ended and began.  Gack.
+
+Thu May  2 16:24:12 1996  William Perry  <address@hidden>
+
+
+* dist.Makefile: now installs default.css
+
+* w3-imap.el:
+image order fixed on pages with consecutive images with no text in between.
+
+* w3.el: Now looks in the data-directory and data-directory/w3/ subdir for
+stylesheet files.  Now looks for several stylesheet files, not just
+the first one it finds.
+
+Wed May  1 21:36:37 1996  William Perry  <address@hidden>
+
+* w3-e19.el: fixed mouse waggling under fsf
+
+* w3-vars.el: Added default for w3-source-file-hook ... automatically goes into
+html-mode (should probably do font-lock as well to get netscap'y look)
+
+* w3-draw.el: Fixed <body> tags yet again... god am I stupid
+
+* w3-e19.el: Fixed mouse movement under FSF
+
+
+* w3.el: auto-autoload w3-do-setup
+
+* w3-vars.el: changed w3-documentation-root
+
+* w3-menu.el, w3-xemac.el, w3-toolbar.el, w3-mouse.el:
+
+* w3-menu.el:
+Now use w3-default-configuration-file for saving options from the menubar
+
+* w3-auto.el: removed a few autoloads due to the forms revamping
+
+* docomp.el: few more stub variables
+
+* w3-vars.el: More forms fixes
+
+* w3.el: Some jka-compr fixes
+
+* w3-style.el: removed annoying 'applying style hints' messages
+
+* w3-draw.el: Fixed the handling of default attributes on <body> tag for text
+coloring, etc.  Wasn't using the new syntax the stylesheet parser was
+expecting.
+
+* w3-hot.el, w3-menu.el: In XEmacs, changed the hotlist menu constructor to use
+w3-html-bookmarks instead of adding a separate menu item for it.
+Consitent with how it has to be done under Emacs19
+
+
+Tue Apr 30 20:45:20 1996  William Perry  <address@hidden>
+
+* w3-mouse.el: In netscape emulation mode, emulate the mouse bindings as well.
+
+* font.el:
+Now takes care of setting a display-table on the face for smallcaps and bigcaps
+
+* w3-forms.el: more fixes
+
+* w3-sysdp.el: Added definition of alist-to-plist
+
+* w3-draw.el: fixed some <select> issues
+
+* w3-forms.el: New round of cleanup of the forms code continues
+
+Sat Apr 27 04:31:57 1996  William Perry  <address@hidden>
+
+* widget-edit.el: fixed typo in the 'sexp' widget
+
+* w3-auto.el: autoload widget-forward/backward
+
+* widget-edit.el: Fix for file widget
+use 'keymap property when in xemacs, 'local-map when in fsf
+
+* w3-menu.el:
+Don't put the toggle toolbar menu item up in Emacs or a XEmacs with no
+toolbar support
+
+* w3-draw.el: More efficient handling of end of hyperlink
+
+* w3-beta.el: w3 buffers are no longer read only
+
+* w3-forms.el, w3.el, w3-mouse.el:
+Make middle-mouse-button run w3-widget-button-click, that will not
+call widget-button-click if there is no widget under the event - this
+avoids being able to paste into the buffer, etc.  Gack!
+
+
+* w3-vars.el:
+no longer show the read-only/modified status in the modeline for w3 buffers
+
+* w3-vars.el: Yet more key shuffling for the widget stuff
+
+Fri Apr 26 23:09:10 1996  William Perry  <address@hidden>
+
+* widget-edit.el, widget.el: Initial revision
+
+* w3-forms.el:
+Only set the face of a form element if one has been explicitly defined
+
+* w3-imap.el:
+Removing alt text from the buffer when loading images works again... yahhh
+
+* w3.el, w3-forms.el, w3-auto.el, w3-e19.el, w3-menu.el:
+Fixed the 'links' menu for both XEmacs and Emacs
+
+* w3-keyword.el:
+elc files should now be portable between XEmacs and Emacs again... as
+long as you don't use the byte-compile-dynamic stuff.
+
+* w3-draw.el:
+Fixed problem of w3-handle-hyperlink-end being a little too aggressive
+about putting the highlight and link properties on empty <a> tags.
+
+Thu Apr 25 19:08:45 1996  William Perry  <address@hidden>
+
+
+* w3-xemac.el, w3-vars.el, w3-style.el, w3-menu.el, w3-imap.el, w3-forms.el, 
w3-e19.el, w3-draw.el, w3.el:
+Lots and lots of changes...
+- config files are now all in ~/.w3/, ala netscape
+- everything is now done via the excellent 'widget' package and text
+  properties... most of the code in w3-e19 and w3-xemac is now gone
+- 90% of the forms code is gone, subsumed by widget
+- some stylesheet changes for the latest CSS level 1 draft
+- general cleanup of lots of other code
+- many changes all over the place to deal with the new widget package
+  and text-property representation
+
+* w3-auto.el: more autoloads
+
+
+* w3-hot.el: New way of extracting the default title of a link under point
+
+* w3-beta.el: No longer call w3-mule-attribute-zones
+
+
+* w3-emulate.el: No more special casing of keysyms based on emacs version...
+
+* w3-toolbar.el: Changed the default toolbar type to 'both
+
+
+* dist.Makefile: added w3-mouse.el to the distribution
+
+* w3-mouse.el: Initial revision
+
+* w3-menu.el:
+Moved new, unified version of context sensitive menu code into w3-menu
+
+
+* w3-mule.el: Removed lots of old crap
+
+
+* w3-keyword.el: Initial revision
+
+* font.el:
+Now tags colors that are actually vectors as [rgb #r #g #b] instead of
+just [#r #g #b]
+
+Mon Apr 22 16:48:31 1996  William Perry  <address@hidden>
+
+* docomp.el: Added bogus def of has-modeline-p to shut up emacs-19
+
+* w3-auto.el: renamed w3-annotate.el to w3-annotat.el
+
+
+Fri Apr 19 20:40:46 1996  William Perry  <address@hidden>
+
+* w3-auto.el: Added autoloads for widget package
+
+Thu Apr 18 12:57:47 1996  William Perry  <address@hidden>
+
+
+Wed Apr 17 13:35:41 1996  William Perry  <address@hidden>
+
+* w3-e19.el:
+Don't send the truncated URL that is used for displaying menus to the
+actual function.  D'oh!
+
+Tue Apr 16 17:37:59 1996  William Perry  <address@hidden>
+
+* w3-merge.el: Initial revision
+
+Mon Apr 15 21:24:04 1996  William Perry  <address@hidden>
+
+
+* w3-draw.el: Use temporary faces in XEmacs, so people don't puke when they do
+edit-faces and see all the crappy face names.
+
+Sat Apr 13 01:07:49 1996  William Perry  <address@hidden>
+
+* w3.el: New function w3-popup-image-info that displays info about an image ala
+netscape 2.x
+
+* w3-menu.el:
+slight re-ordering of the options menu.  Can now turn off the modeline
+and minibuffer
+
+* w3-e19.el, w3-xemac.el:
+When the menubar is turned off, add a turn menubar back on option to
+all context sensitive menus
+
+* w3-vars.el: Shortened the context-sensitive menu over hyperlinks
+
+Fri Apr 12 03:51:20 1996  William Perry  <address@hidden>
+
+
+Thu Apr 11 17:43:48 1996  William Perry  <address@hidden>
+
+* w3-draw.el: Now handles set-cookie commands from <meta> tags
+
+Wed Apr 10 14:30:19 1996  William Perry  <address@hidden>
+
+
+* w3-vars.el, w3-draw.el, w3.el:
+Set the variable list-buffers-directory appropriately to show the URL
+for all the various W3 buffers via list-buffers.
+
+Tue Apr  9 20:52:52 1996  William Perry  <address@hidden>
+
+* w3-e19.el:
+url-truncate-url-for-viewing can now take an optional width parameter.
+If an unknown URL type is found, put quotes around it in the error
+message so that its easier to know what exactly wasn't recognized.
+
+
+* w3-parse.el: Various patches from jbw.
+1. Parser-side fix for <XMP> duplication.
+2. Percentages would get way out of wack on large files
+
+Mon Apr  8 22:40:47 1996  William Perry  <address@hidden>
+
+* w3-draw.el: fixed problem in w3-decode-area-coords that would mess up on some
+client side imagemaps (namely www.excite.com)
+
+Wed Apr  3 15:45:43 1996  William Perry  <address@hidden>
+
+* images.el: more tcsh crap... please make it stop.
+
+* w3.el: Added new w3-fetch-other-window command
+
+Tue Apr  2 17:16:23 1996  William Perry  <address@hidden>
+
+* w3-sysdp.el: Some extent functions for emacs19
+
+* w3-imap.el: Client-side image mapping polygons work now.
+
+* images.el: Hopefully final fix for csh/tcsh
+
+Mon Apr  1 18:58:49 1996  William Perry  <address@hidden>
+
+
+* images.el: fixes for csh/tcsh shells, yet _AGAIN_!
+
+
+* w3-menu.el: Can now toggle the menubars from the options menu
+
+Thu Mar 28 20:04:03 1996  William Perry  <address@hidden>
+
+
+* docomp.el: fix for emacs 19.28 griping because of those address@hidden@ 
defsubsts.
+If you ar eusing 19.28, please please upgrade.
+
+* w3-menu.el: New 'style' menu item to control the IE 3.0 compatiblitiy parsing
+
+
+* w3-style.el:
+now :normal: or :default: in a stylesheet end a device-specific section
+
+* w3-style.el:
+CSS now handles C++ style // comments like the unreleased IE 3.0 with
+stylesheets.  Oh, the joy of compatibility!
+
+Wed Mar 27 19:44:12 1996  William Perry  <address@hidden>
+
+* images.el:
+Possible fix for image loading problems seen when people have csh or
+tcsh as their default shell.  Good lord, are these people insane?  See
+http://www.cs.ruu.nl/wais/html/na-faq/unix-faq-shell-csh-whynot.html
+for details.
+
+* w3-forms.el:
+fixed problem with some forms that don't deal well with following the
address@hidden@ing spec for application/x-www-form-urlencoded.  Now does not
+escape the _ character. address@hidden@address@hidden@#%!~@ - wow, its lucky we
+passed the CDA or someone might have gotten offended here.
+
+* w3-draw.el:
+now handles xmp slightly differently - waiting for patches from jbw
+for the parser end of the fix.
+
+* w3-style.el:
+You can now have emacsen specific sections of a CSS stylesheet by
+using the device-specific stuff.  Use :emacs: or :xemacs: as the
+device type and away you go.
+
+Tue Mar 26 21:14:19 1996  William Perry  <address@hidden>
+
+
+* w3-e19.el: Fixed the 'submit form to nil' bug in mouse movement
+
+
+* w3.el, w3-hot.el: HTML bookmark parsing now actually works.
+
+Mon Mar 25 14:53:56 1996  William Perry  <address@hidden>
+
+* w3-sysdp.el, w3-about.el:
+Changed some pointers to ben wing and pearl software.
+
+Wed Mar 20 15:50:50 1996  William Perry  <address@hidden>
+
+
+* w3.el:
+Prefix arg to w3-quit now kills all w3 buffers, not just the current one.
+
+* w3-draw.el: fixed a problem with ^M in <XMP> and <PRE> sections
+
+* w3-imap.el: protect against passing invalid data to make-glyph
+
+Sun Mar 17 23:20:14 1996  William Perry  <address@hidden>
+
+
+Tue Mar 12 18:23:12 1996  William Perry  <address@hidden>
+
+* w3-draw.el: Stubs for math mode
+
+Sat Mar  9 17:47:21 1996  William Perry  <address@hidden>
+
+* w3-toolbar.el:
+Should now work correctly with no toolbar support compiled into XEmacs.
+
+Wed Mar  6 01:52:32 1996  William Perry  <address@hidden>
+
+
+* w3-imap.el:
+Fixed problem with button2 usage in w3-imap.el when compiling with FSFMacs
+
+Fri Feb 23 01:58:21 1996  William Perry  <address@hidden>
+
+
+Wed Feb 21 17:06:00 1996  William Perry  <address@hidden>
+
+* w3-draw.el:
+Now outputs a warning when it runs into a table, just so people know
+its not my fault if it looks like crap. :)
+
+* w3.el: Now uses the real add-minor-mode
+
+* w3-sysdp.el: Added stub for add-minor-mode
+
+* w3.el: Now set buffer-file-truename and buffer-file-name to nil when sourcing
+a document.
+
+* w3-draw.el, w3-sysdp.el:
+Few fixes for #%!@ damn emacsen that don't sanely deal with make-face et. al
+on a TTY interface.
+
+
+Tue Feb 20 14:12:27 1996  William Perry  <address@hidden>
+
+
+Mon Feb 19 15:13:55 1996  William Perry  <address@hidden>
+
+* w3-e19.el:
+Changed binding of mouse-2 to 'ignore instead of 'undefined - more polite.
+
+Sun Feb 18 19:11:45 1996  William Perry  <address@hidden>
+
+* RelNotes2.3: Initial revision
+
+Sat Feb 17 23:50:00 1996  William Perry  <address@hidden>
+
+* w3.el: fixed loading of default stylesheet stuff.  gack.
+
+* w3-auto.el: fixed autoloading of css parser
+
+
+* w3.txi: manual formatting changes - wheee.
+
+
+* w3-menu.el:
+Now explicitly require easymenu for FSF19 - some older versions don't
+autoload it.  *sigh*
+
+Fri Feb 16 21:39:19 1996  William Perry  <address@hidden>
+
+
+Thu Feb 15 22:56:04 1996  William Perry  <address@hidden>
+
+* w3.el: w3-fetch now defaults to http://www. if you are not in a w3 buffer
+
+* w3-menu.el: Added menu item for incremental display
+
+Mon Feb  5 17:01:39 1996  William Perry  <address@hidden>
+
+* w3-draw.el:
+Fixed bug in the <font> handling if all you are doing is setting a color
+
+Tue Jan 30 15:16:43 1996  William Perry  <address@hidden>
+
+* w3.txi: Added section on emulation.  Updated copyright info and dates.
+
+Sun Jan 28 06:17:55 1996  William Perry  <address@hidden>
+
+* w3-menu.el: Fleshed out the doc string of w3-use-menus some more.
+
+Sat Jan 27 18:59:57 1996  William Perry  <address@hidden>
+
+* w3-style.el: Made more of the functions names be saner... don't pollute the
+namespace for when we support more stylesheet notations.  Need to
+extrapolate it some more and have a registry of acceptable notations.
+
+Fri Jan 26 18:40:42 1996  William Perry  <address@hidden>
+
+* w3-xemac.el: No longer adds WWW options submenu to the main options menu
+
+
+* w3.el, w3-xemac.el:
+Lots of changes for new client-side imagemap support and cleanup of old code.
+
+
+* w3-menu.el: New `style' menu
+
+* w3-imap.el:
+Lots of changes for new client-side imagemap support and cleanup of old code.
+
+* w3-emulate.el:
+Added keybindings for left & right arrow keys under netscape emulation.
+
+* w3-draw.el:
+Lots of changes for new client-side imagemap support and cleanup of old code.
+Removed inlined mpeg code, waiting for XEmacs 19.15 to support it again.
+
+* descrip.mms: Updated the VMS makefile for the new files
+
+* dist.Makefile: Added w3-menu.el to the distribution
+
+Thu Jan 25 17:51:39 1996  William Perry  <address@hidden>
+
+* w3-xemac.el:
+Moved over to new, more robust menu specifications - mainly stolen from VM.
+
+* w3.el, w3-vars.el, w3-emulate.el:
+Moved w3-search-* functions out of w3-emulate.el into w3.el where they belong.
+Moved some variables out as well.
+
+* w3-e19.el: Removed w3-emacs19-hack-faces-p support.
+Moved over to new, more robust menu specifications - mainly stolen from VM.
+
+* w3-menu.el:
+Menus now appear to work under both emacs19 and XEmacs.  Fixed problem
+where 'Search Again' was always available, even if no search had been
+done yet.
+
+
+* w3-menu.el: Initial revision
+
+Tue Jan 23 18:05:08 1996  William Perry  <address@hidden>
+
+* font.el: Fixed problem with latest XEmacs 19.14 beta
+
+
+* w3-emulate.el:
+lynx/netscape emulation now uses new w3-search-forward function
+
+* w3-toolbar.el: Toolbar now uses new w3-search-forward function
+
+* w3-imap.el: Work around small bug in the 19.14 beta byte compiler
+
+* w3.el: Don't choke and die if you can't find ange-ftp
+
+Mon Jan 22 16:15:42 1996  William Perry  <address@hidden>
+
+* dist.Makefile: Added w3-emulate.el to distribution
+
+* w3.el, w3-vars.el: Moved the emulation stuff into a separate file
+
+* w3-emulate.el: Initial revision
+
+Sun Jan 21 19:16:33 1996  William Perry  <address@hidden>
+
+
+* dist.Makefile: Added w3-imap.el to the distribution
+
+Sun Jan 14 01:00:30 1996  William Perry  <address@hidden>
+
+* w3.txi: updated w3.org mailing list addresses
+
+* w3.txi: Added section on reporting bugs... needs finishing
+
+Sat Jan 13 08:30:06 1996  William Perry  <address@hidden>
+
+
+Fri Jan 12 19:42:17 1996  William Perry  <address@hidden>
+
+* w3-parse.el: Added parsing stuff for client-side imagemaps
+
+* w3-draw.el, w3-vars.el, w3-imap.el:
+Client-side imagemaps parse correctly now, and the data is stored.
+
+* w3-e19.el:
+Make the options button look a little more like a button under emacs 19
+
+* w3.txi: Combined some of the indices to make it easier to find stuff.
+
+* w3-imap.el: Fixed macros x-coord and y-coord
+
+* w3-imap.el:
+Added definitions for point-in-rectangle|circle functions, and stub
+for point-in-polygon function
+
+* w3-imap.el: Initial revision
+
+Wed Jan 10 13:32:30 1996  William Perry  <address@hidden>
+
+* w3.el: Renamed w3-store-in-x-clipboard to w3-store-in-clipboard
+
+* w3-xemac.el: New version of w3-store-in-clipboard
+
+* w3-e19.el: Renamed w3-store-in-x-clipboard to w3-store-in-clipboard
+
+* w3-e19.el: w3-store-in-x-clipboard now uses x-select-text instead of
+x-set-selection, which is more correct as a good X citizen I guess.
+
+Sun Jan  7 17:03:38 1996  William Perry  <address@hidden>
+
+* w3.el: only check current-prefix-arg if interactive-p.  Otherwise we hose up
+things in ffap.el and probably lots of other things nobody has found
+yet.
+
+Wed Jan  3 19:47:47 1996  William Perry  <address@hidden>
+
+* w3-vars.el, w3.el:
+New netscape emulation minor mode that sets up a lot of keybindings.
+
+* font.el: Made set-face-background|foreground|font interactive again.
+
+* docomp.el: Now adds urldir to the load path
+
+* dist.Makefile: Now copies the THIS-IS-VERSION-* files when installing
+
+* docomp.el:
+Now adds URLDIR to load-path instead of unconditionally using ../url
+
+* dist.Makefile:
+Now puts URLDIR in the environment of the compiling emacsen so that
+docomp.el can get at it.
+
+Tue Jan  2 17:52:14 1996  William Perry  <address@hidden>
+
+* w3.el: Renamed a few things from style-sheet to stylesheet, to be consistent
+
+
+Wed Dec 20 18:21:29 1995  William Perry  <address@hidden>
+
+* w3-hot.el: Removed compile-time warnings
+
+* dist.Makefile: removed w3-srch.el from distribution
+
+* w3-hot.el:
+Basic handling of html hotlists... converts into XEmacs-style menu currently
+
+* w3-beta.el: Added definition of w3-normalize-spaces
+
+* font.el: Definition of define-new-mask macro should now work on older emacs
+19.2x that don't understand native backquoting.
+
+* w3-parse.el:
+No longer throw up a warning for <hr> in <pre> - it really is legal HTML 2.0
+
+* w3-xemac.el: Now stores the parse _tree_ in w3-current-parse.
+Modified the view-parse-tree menu item to show this (not just 
w3-last-parse-tree
+
+* w3-parse.el:
+Made w3-display-parse-tree able to take a parse tree as an argument
+
+* w3-beta.el:
+Make w3-refresh-buffer signal an error for now - not yet reimplemented.
+
+
+* w3-vars.el: Added entities
+     (sim         . 126)
+    (le          . "<=")
+    (agr         . "alpha")
+    (rdquo       . "''")
+    (ldquo       . "``")
+
+
+* w3-parse.el: Now allows <hr> inside of <pre>
+
+Tue Dec 19 22:21:15 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed textarea default input handling
+
+* w3-vars.el, w3-parse.el: Added variable w3-maximum-line-length
+
+Mon Dec 18 22:30:38 1995  William Perry  <address@hidden>
+
+* w3.el: Offer to save to disk if an external viewer fails
+
+* w3.el: If w3-fetch is given a prefix arg, dump to disk.
+
+* w3.el:
+Now defaults to using ~/.netscape/preferences instead of ~/.MCOM-preferences
+
+Sun Dec 17 21:26:41 1995  William Perry  <address@hidden>
+
+
+* w3-draw.el, w3-vars.el, w3.txi:
+Changed w3-link-delimiter-info to w3-link-info-display-function
+
+Sat Dec 16 17:23:39 1995  William Perry  <address@hidden>
+
+* font.el: fixed typo in tty-font-create-plist
+
+* font.el: Fixed stupid mistake in font-tty-find-closest-color
+
+Thu Dec 14 22:34:32 1995  William Perry  <address@hidden>
+
+* font.el: Now uses linethru if on XEmacs
+
+* default.css: Moved to new CSS comment syntax
+Added new stuff for TTYs
+
+
+Wed Dec 13 15:49:44 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: Removed a bunch of old code for XEmacs <= 19.13
+
+* w3-xemac.el: Now registers all netpbm utilities by default
+
+* font.el: Added a few new bitmasks (overline linethrough)
+
+* w3-style.el:
+Now handles the new CSS style syntax - will they every address@hidden decide
+on one and stick with it?!!?!?
+
+
+Tue Dec 12 22:53:43 1995  William Perry  <address@hidden>
+
+* w3.el: fixed problem in w3-insert-entities-in-string under XEmacs
+
+
+* w3-forms.el: Few form fixes
+
+* w3-vars.el: Modified the default stylesheet
+
+
+* font.el: Bold now works on ttys
+
+* w3-sysdp.el:
+Added stubs for make-face set-face-foreground and set-face-background
+for non-X emacsen
+
+
+Mon Dec 11 22:52:38 1995  William Perry  <address@hidden>
+
+* font.el: Some emacs19 patches
+
+* font.el: Changed all the style stuff to use bitmasks for speed.
+More TTY changes
+If no size specified for font, defaults to size of default font for device.
+If no family specified  for font, defaults to family of default font for 
device.
+
+* w3-style.el: All stylesheet stuff now uses the new font package
+
+Sun Dec 10 17:55:13 1995  William Perry  <address@hidden>
+
+* font.el: Some of the font stuff now works on TTYs (bold/dim/etc)
+
+* w3-sysdp.el: Added stubs for face-property and set-face-property
+
+* w3-parse.el: Added wired
+
+Sat Dec  9 23:36:21 1995  William Perry  <address@hidden>
+
+* font.el:
+Added definition of x-font-regexp for emacs19 that has everything font.el
+needs in it.
+
+Fri Dec  8 18:05:48 1995  William Perry  <address@hidden>
+
+
+* w3-draw.el:
+Better handling of links - now keeps _all_ links with the same rel or rev
+
+* w3.el: New presentation of document information
+
+
+* w3-xemac.el, images.el: Can now compile under Emacs19
+
+Wed Dec  6 14:37:12 1995  William Perry  <address@hidden>
+
+* w3-vars.el, w3.el: Now comes with a global fallback stylesheet
+
+
+* w3-style.el: No longer make '/' a 'string' type in the syntax-table - it was
+screwing up non-quoted URLs big time.
+
+* font.el: If running under emacs19, always condition-case where we do a
+set-face-font, since it handles different fonts badly right now.
+
+Tue Dec  5 22:29:28 1995  William Perry  <address@hidden>
+
+* w3-vars.el:
+New image/hyperlink/default context-sensitive menus.  Can now have a
+'%s' in the w3-graphlink and w3-hyperlink-menu entries that will be
+replaced by the URL under point
+
+* w3-xemac.el: Now merges context-sensitive menus when appropriate
+
+* w3-vars.el: Added image mapping for image/png to 'png
+
+* images.el: Modified the pnm and ppm to gif converters to actually work now.
+
+* images.el: Added converters for PNG
+
+Mon Dec  4 19:22:26 1995  William Perry  <address@hidden>
+
+
+* w3-xemac.el: XBM images now work again - gross
+
+
+* w3-parse.el:
+defvar of w3-sgml-md-syntax-table no longer uses an eval-when-compile
+form, since this makes MULE and XEmacs 20.0 croak, and makes the .elc
+files non-portable, now that Emacs 19.30 uses a separate data type for
+them.
+
+* default.css: More fun stylesheet things
+
+* w3.el: When dumping to disk, only send "*/*" in the acceptheader
+
+* w3-vars.el: Now uses the new 'images' package for image conversion.
+
+* w3-xemac.el: Now uses the new 'images' package for image conversion.
+Removed some stuff for old lemacsen
+
+
+* images.el: Wow, it works
+
+* new.el: Now handles pre-formatted sections correctly
+
+* font.el: Default to 12pt font
+
+
+Sat Dec  2 16:55:58 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Applied some patches from joe wells.
+
+* w3-parse.el: Applied some patches from joe wells.
+1. Added error transitions to infer <TBODY>, <TR>, and <TD> when seeing
+   bad stuff inside a TABLE.  A lot of people write shit like this:
+   <TABLE> Text to be centered in a pretty frame in Netscape </TABLE>
+2. Took out a particular error transition for P start tags in the state
+   transition table that was leading to horrible handling of some bad
+   HTML I was seeing.  I had thought this transition would improve
+   handling of bad HTML, but I hadn't seen this particular kind of bad
+   HTML.
+3. Fixed a use of w3-invalid-sgml-chars (that didn't work at all) and
+   fixed its documentation string.
+
+Fri Dec  1 16:25:58 1995  William Perry  <address@hidden>
+
+* images.el: Initial revision
+
+Thu Nov 30 14:33:14 1995  William Perry  <address@hidden>
+
+
+Wed Nov 29 15:06:58 1995  William Perry  <address@hidden>
+
+* w3-sysdp.el: Define x-font-regexp-foundry-and-family for Emacs 19
+
+* dist.Makefile:
+No longer compile w3-sysdp.el - was causing problems in emacs 19.29/19.30
+
+* w3-auto.el: Added autoload for w3-form-format-unknown
+
+Tue Nov 28 16:33:12 1995  William Perry  <address@hidden>
+
+* w3-toolbar.el: Finally fixed nil specifier problem in w3-toggle-toolbar
+
+
+* font.el: Added a new generic font family 'elfin'.  New keyword :oblique.  New
+function font-create-object that converts a window-system-dependent
+font specification into our internal representation
+
+* new.el: Shit, it works!
+
+* w3-style.el: Now intern's the 'break' items, for faster comparison later.
+
+Mon Nov 27 22:21:04 1995  William Perry  <address@hidden>
+
+
+Sun Nov 26 01:31:44 1995  William Perry  <address@hidden>
+
+
+Sat Nov 25 04:47:31 1995  William Perry  <address@hidden>
+
+* new.el: Initial revision
+
+Fri Nov 24 22:53:55 1995  William Perry  <address@hidden>
+
+* w3.txi: Lots of changes and restructuring
+
+* w3.txi:
+Documented the recent keymap changes for history/annotation/hotlist actions
+
+* w3-vars.el: Moved history commands onto their own keymap
+
+* w3-vars.el:
+Moved all hotlist and annotation functions into their own keymap 'h'
+and 'a' respectively.  Comments on the new keybindings are welcome.
+
+* w3-style.el:
+font-size-index now scales by 1.44 instead of 1.2, as CSSv5 recommends
+
+Thu Nov 23 22:33:22 1995  William Perry  <address@hidden>
+
+
+* default.css: Few piddly changes
+
+* w3.txi: Lots of documentation changes.  Thanks to jon konrath
+
+* w3-style.el: Fixed typo in w3-style-font-size-for-index
+
+* w3-draw.el: Can now handle <font color=xxx>
+
+* w3-style.el: The output device specific stuff works now
+
+* w3-draw.el:
+Fixed conversion of netscape <body> attributes into a CSS stylesheet
+
+Wed Nov 22 16:49:32 1995  William Perry  <address@hidden>
+
+* w3-style.el: Now correctly parses the ":foo:" stuff in CSS to handle multiple
+media. Doesn't actually do anything with it yet, but at least it
+doesn't make the thing choke and die any more.
+
+Tue Nov 21 16:33:37 1995  William Perry  <address@hidden>
+
+* default.css: Various tweaks and changes to the default stylesheet
+
+* w3-style.el: Removed old cssv3 stuff - is now completely cssv5
+Added correct handling of comments
+
+* w3-draw.el: Setting default background works again
+
+* w3-xemac.el:
+Added a debugging menu for right now to show the last parse tree and the
+current stylesheet.
+
+* font.el: Few changes to not always default to 'medium' font weight, for those
+fonts that don't have one.
+
+Mon Nov 20 14:14:06 1995  William Perry  <address@hidden>
+
+* w3-about.el: Converted about:style to CSSv5
+
+* w3.txi: Started revamping some sections
+
+Sun Nov 19 22:13:17 1995  William Perry  <address@hidden>
+
+
+* w3-e19.el: Fixed w3-overlays-at
+
+
+* w3-beta.el, w3-draw.el, w3-e19.el, w3-forms.el:
+Everything and its grandmother now uses a default stylesheet - no more
+Xresources!
+
+* w3-mule.el: Fixed a few MULE bugs
+
+* w3-style.el:
+w3-generate-stylesheet-faces does not actually create any of the faces
+now - delays that until they are actually needed/used in
+w3-face-for-element
+
+* w3-vars.el:
+Everything and its grandmother now uses a default stylesheet - no more
+Xresources!
+
+* w3.el: Everything and its grandmother now uses a default stylesheet - no more
+Xresources!
+Much faster version of w3-insert-entities-in-string.
+Now binds require-final-newline to nil when saving a binary file.
+Fixed a few MULE bugs with coding systems and www: URLs
+Fixed reading of initial stylesheet.
+
+* w3-xemac.el:
+Everything and its grandmother now uses a default stylesheet - no more
+Xresources!
+
+* w3-auto.el: Now autoloads w3-generate-stylesheet-faces
+
+* docomp.el: Moved some variable stubs around
+
+* w3-parse.el: Several patches from jbw to the new parser
+
+Sat Nov 18 02:54:18 1995  William Perry  <address@hidden>
+
+
+* w3-vars.el: Fixed typo in one of the new defvars
+
+* w3-vars.el: Changed the format of w3-list-chars-assoc and w3-style-tags-assoc
+
+* w3-draw.el: Removed conversion of old style entity stuff
+
+* w3-vars.el: Moved w3-html-entities variable
+
+* w3.el: Now correctly generates stylesheet faces for the user stylesheet.
+w3-insert-entities-in-string should now be more efficient.
+
+* w3-parse.el: Moved w3-html-entities variable
+
+Fri Nov 17 18:42:54 1995  William Perry  <address@hidden>
+
+* w3-auto.el: Added autoload for w3-parse-arena-stylesheet
+
+* w3.el: Fixed hashtable stuff under XEmacs - the key of a hashtable must be
+able to compare with 'eq', not 'equal', so had to change it to use
+symbols instead of the url string.
+
+* w3-beta.el:
+No longer bind pop-up-windows to nil through all of w3-prepare-buffer
+
+* dist.Makefile:
+Now requires that the URL package be installed before continuing
+
+* w3-parse.el: Added the 'label' tag.
+
+* w3-draw.el: Fixed dumb mistake in the handling of
+w3-visited-node-style/w3-node-style for links under a window system.
+
+* w3-forms.el: Removed old bogus code
+
+
+* w3-parse.el: Fixed bug in the new entity expansion
+
+* w3-style.el:
+Fixed a problem with the font-weight keyword in style specs.  Now
+stores the font specification in the stylesheet as well
+
+* w3.el: No longer unconditionally load w3-sysdp.el
+
+* w3-draw.el: Fixed some spacing problems
+
+* w3-parse.el: Various patches from jbw
+
+Thu Nov 16 18:52:56 1995  William Perry  <address@hidden>
+
+* w3-parse.el: Added in the emacs-w3 easter eggs to the DTD
+
+* w3-parse.el: Allow '_' in attribute names
+
+Wed Nov 15 23:10:23 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Fixed list items with new implied paragraph breaks immediately after
+
+* w3-draw.el: Fixed the yogsothoth handling
+
+* w3-xemac.el: Fixed image loading problem
+
+* w3-parse.el:
+Fixed w3-sgml-name-to-string to be a macro instead of a true function.
+Since it was wrapped within an eval-when-compile, all calls to it
+later on would be fucked due to an undefined function
+
+* w3-draw.el: Removed some dead code
+
+* font.el:
+Can now correctly combine any number of fonts with font-combine-fonts
+
+* w3-draw.el:
+Fixed problem with not swallowing newlines when necessary due to new parser
+
+
+* w3-forms.el: Moved lots of stuff out into new auxiliary files
+
+* w3-auto.el: Initial revision
+
+* w3.el: Moved lots of stuff out into new auxiliary files
+
+* w3-annotat.el: Initial revision
+
+* w3-hot.el: Removed the old, unused air mosaic hotlist parser
+
+
+* w3-parse.el, w3-draw.el:
+Make a display-table for use globally for things in the windows character set
+
+* w3-parse.el: The whole new parser from joe wells.  M-x amen
+
+* w3-draw.el: Few changes for the new parser
+
+Mon Nov 13 15:56:58 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed the <font size=+x> handling
+
+* w3-draw.el:
+Implemented messaging the 'title' of a link instead of just the naked URL
+Now honors the nasty netscapism 'seqnum' attribute on <li> tags
+
+* w3-vars.el, w3-xemac.el, w3-e19.el:
+Implemented messaging the 'title' of a link instead of just the naked URL
+
+* w3-toolbar.el: Activated the w3-toolbar-stop-icon stuff
+
+Fri Nov 10 17:30:43 1995  William Perry  <address@hidden>
+
+* w3.el:
+Fixed problem with application/x-www-form-urlencoding of names of form fields
+
+Thu Nov  9 20:56:02 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Few fixes for ordered lists in alpha and roman style
+
+* w3.el: Catch malformed www: URLs
+
+Fri Nov  3 21:34:35 1995  William Perry  <address@hidden>
+
+
+* w3-style.el, w3-draw.el:
+Can now specify alignment and textalignment in stylesheets for <hr>
+
+Thu Nov  2 22:25:50 1995  William Perry  <address@hidden>
+
+* w3-style.el:
+Fixed problem in stylesheet parser calling (char-after) at point-max
+
+
+* w3-hot.el: Now requires w3-vars, so that w3-setup-done is bound.
+
+Wed Nov  1 15:39:06 1995  William Perry  <address@hidden>
+
+* w3.el: More work on allowing the user to do a completing-read on the
+annotations of a buffer to delete one.  Fixed a few potential screwups
+in the annotations code with regard to improperly entity-ized strings.
+no longer refetches a text/plain document from the server when you do
+a document-source on it.
+
+* w3-hot.el:
+Don't leave backup copies of w3-hotlist-file or url-global-history-file
+
+Tue Oct 31 06:20:43 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Fixed stupid problem introduced when changing w3-set-fill-prefix-length to 
defsubst instead of defmacro
+
+* w3-draw.el, w3-e19.el, w3-vars.el, w3-xemac.el, w3.el:
+Now handles empty containers with name/id attributes
+
+* w3-beta.el: Different formatting for annotations
+
+* w3.el: Base of allowing the user to choose what annotation to delete when
+w3-delete-personal-annotation is called from a non-PAN
+
+* w3-parse.el, w3-beta.el, w3-vars.el, w3-draw.el: Few performance tweaks
+
+
+Sun Oct 29 02:14:10 1995  William Perry  <address@hidden>
+
+* w3-hot.el, w3.el:
+Removed old HTML <div1> so that the new display engine doesn't gripe
+
+* w3-vars.el, w3.el: Made w3-source-document honor w3-reuse-buffers.  Also made
+w3-reuse-buffers default to `reuse'
+
+* w3-draw.el: Fixed the form handling for isindex fields.
+
+* w3-draw.el: Include a working version of center-line for emacs 19.29
+
+* dist.Makefile: Now uses an implicit target.
+
+Sat Oct 28 04:16:16 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed stupid typos
+
+* w3-e19.el, w3-xemac.el:
+Now signals an error in w3-find-specific-link if the #link could not
+be found
+
+* w3.el: w3-show-history-list now works again
+
+
+* w3-draw.el: Fixed the <option value=xxx> handling
+
+* w3-draw.el: Make headers nuke <p> alignments on the stack
+
+
+* w3-parse.el: No longer swallows all the trailing '>' after a tag.  So
+<h1>>>>>></h1> will show up correctly.  Hmmmm... is this right?
+Comments anyone?
+
+* w3-draw.el:
+first paragraph breaks within a list item are now filled correctly
+
+
+Fri Oct 27 13:41:16 1995  William Perry  <address@hidden>
+
+
+* w3-style.el:
+Now correctly keeps track of the tags that something applies-to -
+correct handling of context and new level 2 attribute references
+instead of the old naive way.
+
+* w3-style.el: Now implements @import for stylesheets ala CSS v4
+
+Thu Oct 26 15:11:29 1995  William Perry  <address@hidden>
+
+* font.el: Fixed problem in Emacs 19.29 with the font-set-face-font stuff -
+copy-face sends us in the internal vector instead of the face symbol.
+Bleah!
+
+Wed Oct 25 22:35:42 1995  William Perry  <address@hidden>
+
+* w3.el: Fixed following a link to a fragment "#foo" does not add that URL to
+url-global-history-completion-list (and thus it will not be shown as a
+link that has been followed) if the base URL is already in a buffer.
+
+* default.css: Updated to new (unreleased) CSS v5 specification
+
+* font.el: Removed some old function definitions that are no longer used.
+
+* w3-draw.el:
+Will now create the face storage variables if make-face is not bound.
+Was causing some of the stuff later on in the display engine to crap
+out and die.
+
+Tue Oct 24 16:42:24 1995  William Perry  <address@hidden>
+
+* w3-draw.el, w3-style.el: More CSS hacks
+
+* w3-style.el: Some CSS v5 stuff
+
+* font.el: Added definition of font-warn
+
+* w3-style.el: No longer get everything set to a nil/nil/nil/nil font
+
+Mon Oct 23 23:49:51 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Now honors the special `link' and `visited' classes for anchor tags
+
+
+* w3-style.el: Now honors old back.color syntax
+
+* w3.el: Now honors the $html-source CSS special
+
+Thu Oct 19 21:12:50 1995  William Perry  <address@hidden>
+
+
+Wed Oct 18 22:20:59 1995  William Perry  <address@hidden>
+
+* w3-draw.el: few formatting tweaks.
+
+* w3-style.el: Few various tweaks for font-style
+
+
+Tue Oct 17 21:47:49 1995  William Perry  <address@hidden>
+
+* w3-xemac.el, w3-e19.el: Fixed form entries
+
+
+Mon Oct 16 20:35:42 1995  William Perry  <address@hidden>
+
+
+* w3.el: Fixed applicatin/x-www-form-urlencoded crap
+
+* font.el:
+Don't die if the set-face-xxxx functions are undefined when font.el[c]
+is loaded
+
+Sun Oct 15 23:33:49 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed handling of add.before and add-after
+
+* w3-style.el: Don't bomb out on ttys
+
+* w3-parse.el: Patch from jbw to handle more bad HTML
+
+* w3-parse.el:
+Correct handling of things like &quot; in an attribute/value pair
+
+
+* w3-beta.el: Better handling of personal annotations
+
+* w3-draw.el:
+Fixed fig and ol handling to be consistent with the new symbol-based
+argument lists
+
+* w3-parse.el:
+Moved default parameters for ol into w3-draw where they belong, courtesy of jbw
+
+* w3.el: Patches for personal annotations by jbw
+
+
+* w3.el: fixed some fuckups in the history list
+
+
+* w3.el: Check return value of url-get-url-at-point in w3-follow-url-at-point
+before passing to w3-fetch.
+
+* w3-vars.el: Fixed documentation for w3-header-chars-assoc
+
+Thu Oct 12 13:59:58 1995  William Perry  <address@hidden>
+
+* w3-e19.el: Implemented w3-active-link-color for emacs 19
+
+Tue Oct 10 16:17:52 1995  William Perry  <address@hidden>
+
+* w3-style.el: Some more CSS v4 stuff
+
+* w3-draw.el, w3-xemac.el, w3-vars.el: Now has w3-active-node-style
+
+
+Mon Oct  9 02:59:55 1995  William Perry  <address@hidden>
+
+* w3-about.el: Updated the about stylesheet to the new v4 syntax
+
+* default.css: Updated the default stylesheet to the new v4 syntax
+
+Sun Oct  8 23:48:10 1995  William Perry  <address@hidden>
+
+* w3-style.el:
+Now keeps track of address@hidden' directives - still need to actually do
+something sensible with them though.
+
+* w3-style.el:
+Now understands CSS v4 syntax.  Can handle either v3 or v4, based upon
+some state in the parser.
+
+
+Mon Oct  2 18:07:36 1995  William Perry  <address@hidden>
+
+* w3-vars.el: Removed some epoch stuff
+
+
+* w3-draw.el, w3-about.el, w3-vars.el, w3.el: Removed some epoch stuff
+
+
+Sun Oct  1 17:34:43 1995  William Perry  <address@hidden>
+
+
+Thu Sep 28 13:25:59 1995  William Perry  <address@hidden>
+
+* w3-e19.el:
+Disabled w3-shuffle-history-menu for now, since it cannot copy with
+url-history-list being a hashtable.
+
+* w3-xemac.el: The url-history-list is now really a hashtable
+
+* w3-beta.el, w3.el:
+Fixed a few problems in the hotlist and history handling where it was
+not escaping URLs correctly of < > &, etc.
+
+
+Wed Sep 27 21:44:58 1995  William Perry  <address@hidden>
+
+* font.el: Don't make the rgb.txt buffer visible to the user.
+
+
+Tue Sep 26 14:59:14 1995  William Perry  <address@hidden>
+
+* RelNotes: Initial revision
+
+Mon Sep 25 21:59:10 1995  William Perry  <address@hidden>
+
+
+* w3-xemac.el: No longer tries to auto-detect giftopnm or giftoppm
+
+
+* w3-style.el: Only create font objects when necessary
+
+* w3-style.el, w3-draw.el: New stylesheet mechanism
+
+
+* font.el: Added lots of color stuff
+
+Sun Sep 24 17:13:14 1995  William Perry  <address@hidden>
+
+* w3-sysdp.el: Added def of find-face
+
+* font.el: Various tweaks
+
+Sat Sep 23 04:04:14 1995  William Perry  <address@hidden>
+
+* w3-draw.el, w3-xemac.el, descrip.mms, dist.Makefile:
+
+* w3-toolbar.el: Moved all the toolbar specific stuff out into its own file
+
+
+* w3-toolbar.el: Initial revision
+
+Fri Sep 22 15:08:48 1995  William Perry  <address@hidden>
+
+
+Thu Sep 21 17:21:24 1995  William Perry  <address@hidden>
+
+
+Wed Sep 20 14:07:46 1995  William Perry  <address@hidden>
+
+
+* w3-hash.el: Initial revision
+
+Tue Sep 19 13:48:09 1995  William Perry  <address@hidden>
+
+* w3.el: Fixed fill out forms
+
+Mon Sep 18 18:13:14 1995  William Perry  <address@hidden>
+
+
+* w3.el: A few fixes for w3-url-completion-function to make sure
+url-global-history-hash-table is really a hashtable
+
+
+Sun Sep 17 18:04:25 1995  William Perry  <address@hidden>
+
+
+* w3-parse.el: fixed typo
+
+* w3-parse.el: Avoid lots of string-creation in w3-parse-args
+
+* w3.el: Use all-completions directly in emacs-19 in w3-url-completion-function
+for raw speed.
+
+* w3-draw.el: Fixed some _STUPID_ problems
+
+
+* w3-sysdp.el:
+make-hashtable now finds the next highest prime for the initial size.
+
+* w3-draw.el:
+Everything from w3-parse-args is now a symbol, so that the faster assq
+can be used when retrieving.  It is possible something was missed -
+keep an eye out for things getting fucked.
+
+
+* w3-vars.el, w3-draw.el:
+Now caches whether a URL has been visited or not between calls to
+w3-handle-hype and w3-handle-hyperlink-end, for speed
+
+* w3.el: Changes to w3-url-completion-function to handle the new internal
+representation of the global history.  Performance might suffer here
+(in XEmacs), but the majority of people don't ever notice the url
+completion anyway. :)
+
+* w3-sysdp.el: Added def of clrhash
+
+
+* w3-sysdp.el: Added hashtable functions
+
+Sat Sep 16 01:37:54 1995  William Perry  <address@hidden>
+
+* w3.el: Some MULE stuff
+
+* w3-beta.el: Fixed bug in finding #xxx links
+
+* w3-draw.el:
+Catch error in centering a horizontal rule due to brokenness in emacs 19.29
+
+
+* w3-vars.el, w3-parse.el, w3-draw.el:
+Lots of performance tweaks from address@hidden (Joe Wells)
+
+Mon Sep 11 14:32:40 1995  William Perry  <address@hidden>
+
+
+Sun Sep 10 23:26:47 1995  William Perry  <address@hidden>
+
+* w3-sysdp.el: Added defvar for x-library-search-path
+
+Sat Sep  9 03:17:37 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: Added options menu item for honroing stylesheets
+
+
+Wed Sep  6 15:12:24 1995  William Perry  <address@hidden>
+
+
+Tue Sep  5 17:41:31 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed stupid problem with new def of w3-warn
+
+Mon Sep  4 18:10:03 1995  William Perry  <address@hidden>
+
+
+* w3-vars.el: Added SGI rgb inlined image converter
+
+* w3-parse.el:
+Fixed problem where something like <a href=^M "foo" would use the ^M
+as the href value.  Bleah!
+
+
+* w3-beta.el: Integrated new version of w3-prepare-buffer from Shuji NARAZAKI
+<address@hidden> that gets rid of the horrid
+'asynchronous retrieval finishes when in minibuffer' lossage.  Yeah!
+
+* w3.el: Redirects should now no longer screw up the history list.
+
+
+Sun Sep  3 21:53:09 1995  William Perry  <address@hidden>
+
+* w3.el: Only do the absolute minimum setup necessary in
+w3-read-url-with-default - this yields faster response time upon first
+starting up via w3-fetch.  Uses custom completion routine to only do
+the url setup routines when the user requests completion on a URL.
+
+* w3-sysdp.el: fixed typo in device-mm-width
+
+Fri Sep  1 02:47:29 1995  William Perry  <address@hidden>
+
+* w3.el: Treat bogus METHODs on forms like GET, but still put up a warning
+buffer
+
+
+Thu Aug 31 23:59:33 1995  William Perry  <address@hidden>
+
+
+* default.css: Initial revision
+
+
+* w3-draw.el: Put in special test for CR or LF in name of a input field so that
+spaces would not be inserted and screw up cgi scripts that aren't
+expecting it.
+
+* w3-xemac.el: Fixed various toolbar problems
+
+Wed Aug 30 20:36:17 1995  William Perry  <address@hidden>
+
+* w3.el: Incorrectly 'typed' input types now default to `text'
+
+
+* w3.el: Applied patch from address@hidden (Joe Wells) for the extremely
+annoying ` Wrong type argument: overlayp, (w3form (("enctype"
+. "application/x- ...' stuff.
+
+Mon Aug 28 21:15:50 1995  William Perry  <address@hidden>
+
+
+* xbm-button.el: Initial revision
+
+
+* w3-xemac.el: Now uses xbm-button-create when necessary
+
+* w3-xemac.el: Fixed save options bug
+
+
+* w3-draw.el: Fixed bug where 'plain' lists would not be indented at all.
+
+
+* font.el: Initial revision
+
+Sun Aug 27 01:10:25 1995  William Perry  <address@hidden>
+
+
+Sat Aug 26 06:21:20 1995  William Perry  <address@hidden>
+
+* w3-sysdp.el: Added split-string
+
+Fri Aug 25 18:56:55 1995  William Perry  <address@hidden>
+
+* w3-sysdp.el: Added definition of try-font-name
+
+
+* w3-style.el, w3-xemac.el, w3-vars.el, w3-e19.el, w3-draw.el:
+Can now specify the default face in style sheets
+
+
+Thu Aug 24 19:08:16 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Changed w3-munge-color-XXX to strip spaces out of color names passed
+in.
+
+* w3-style.el: Some fixes for the arena 0.97 type style sheets
+
+Mon Aug 21 21:12:22 1995  William Perry  <address@hidden>
+
+
+* w3-style.el: Style sheet stuff now more up-to-snuff with CSS v3.  Also now
+normalizes all colors to their RGB tuples, so that faces can be shared
+between stylesheets that refer to them by different names (#FFF ->
+black -> #FFFFFF -> etc)
+
+
+Sun Aug 20 23:34:37 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed typo
+
+
+* w3-util.el: Added doc strings for the w3-hyperlink-element-xxxx functions
+
+* w3-util.el: Added a provide statement
+
+* w3-util.el: Initial revision
+
+* w3.el: New version of w3|url-warn
+
+* w3-draw.el, w3-e19.el, w3-epoch.el, w3-parse.el, w3-style.el, w3-xemac.el, 
w3.el:
+Use new warnings facility.  Reimplemented most of w3-debug-html
+
+* w3.el, w3-draw.el: Now stores the ID attribute of input elements
+
+
+* w3-parse.el: Nuke entities inside of a <textarea>
+
+* w3-parse.el, w3-draw.el:
+Don't parse any markup that occurs inside of a <TEXTAREA>
+
+* w3-vars.el:
+Removed textarea and textargs from w3-state-vector and 
w3-state-locator-variable
+
+* w3-draw.el: Fixed O-T-M-P error
+
+* w3-draw.el: Background bitmaps working again
+
+* w3-about.el: fixed typo
+
+
+Sat Aug 19 23:39:01 1995  William Perry  <address@hidden>
+
+* w3.el: Made the netpbm stuff come after the loading of the emacs-specific
+file, and now checks to see if w3-insert-graphic is bound before doing
+any of its checking, so that Emacs 19 etc users won't get the warning.
+Also now checks for either pbmtoxbm or ppmtoxbm, since NETPBM doesn't
+have ppmtoxpm
+
+* docomp.el: Added stub for emx-binary-mode
+
+Fri Aug 18 15:28:14 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: Hack to let old xpm icons work for now
+
+Thu Aug 17 23:46:58 1995  William Perry  <address@hidden>
+
+* w3-vars.el, w3-draw.el: Basic support for raman's <label> stuff for forms
+
+* w3.el: Fixed typo in w3-batch-fetch
+
+Mon Aug 14 15:00:37 1995  William Perry  <address@hidden>
+
+* w3.el, w3-xemac.el, w3-draw.el: Can now specify width and height on mpegs
+
+* w3-xemac.el: Use new version of xpm-button.el
+
+* xpm-button.el: New version from kyle
+
+* w3.el: Fixed typo in warning about netpbm utilities
+
+Sun Aug 13 17:50:20 1995  William Perry  <address@hidden>
+
+* xpm-button.el: Made it so it doesn't bomb out on a tty
+
+* dist.Makefile: added xpm-button to the distribution
+
+* xpm-button.el: Initial revision
+
+* w3-style.el: fixed a few typos
+
+
+* w3-xemac.el:
+Now uses the xpm-button program to make textual toolbar icons when necessary
+
+Sat Aug 12 02:33:49 1995  William Perry  <address@hidden>
+
+* w3-about.el: Added about:license and about:warranty URL nodes
+
+* w3-draw.el: Catch errors when making w3-graphic-face
+
+* w3.el: Changed the behaviour of url-keep-history - the history list is only
+saved to disk if this is eq to `t'.  Setting it to anything else
+(usually a number) will keep the list in memory so that
+w3-show-history-list can still work.
+
+* w3.el: Don't add the initial page to the history list, so hitting 'B' in the
+first W3 buffer won't take you out of any w3-mode buffers.
+
+* w3-beta.el, w3-hot.el, w3-style.el, w3.el:
+Always set coding-system to *noconv* in MULE when inserting file contents
+
+Fri Aug 11 13:43:14 1995  William Perry  <address@hidden>
+
+* w3-beta.el, w3-draw.el:
+Moved w3-show-invisible-href into w3-draw to avoid invalid macro stuff
+
+* w3-parse.el, w3-draw.el: Don't swallow spaces after <XMP>
+
+
+* w3-xemac.el:
+New function w3-start-image-cache-timer that will time out all images
+after 5 minutes and cause a garbage-collect so that the pixmaps get
+returned to the windowing system.  This function will get smarter
+soon.
+
+* w3-xemac.el:
+New variable w3-toolbar-type to control waht the toolbar looks like.
+Can be 'pictures' 'text' or 'both' for icons only, text only, or
+captioned icons repsectively.
+
+Thu Aug 10 23:15:44 1995  William Perry  <address@hidden>
+
+* w3.el: Put up a big ugly warning if cannot find any of the netpbm utilities
+at startup
+
+
+* w3-draw.el:
+The size of a <SELECT> area is now defined by the maximum of all the
+lengths of the displayed strings or the SIZE attribute.
+
+* w3-draw.el: No longer picks up the last item of a <SELECT> form area when no
+<OPTION DEFAULT> is present
+
+* w3-xemac.el: Asynch during images should be correctly turned off now
+
+Sun Aug  6 15:58:35 1995  William Perry  <address@hidden>
+
+
+Sat Aug  5 06:11:02 1995  William Perry  <address@hidden>
+
+* w3.el, w3-vars.el: New binding of space to w3-scroll-up
+
+
+* w3.el, w3-draw.el, w3-beta.el, w3-vars.el: More stuff from the MULE folks
+
+
+* w3-xemac.el: Added separators between toolbar buttons
+
+Sat Jul 29 19:13:33 1995  William Perry  <address@hidden>
+
+
+Sat Jul 22 02:51:16 1995  William Perry  <address@hidden>
+
+* w3-e19.el:
+Don't choke if w3-mode-go-menu is not a keymap in w3-create-hotlist-menu
+
+Fri Jul 21 13:44:30 1995  William Perry  <address@hidden>
+
+* w3-parse.el:
+Added let bninding around the call to sera-to-fidel-marker to bind
+sera-being-called-by-w3 so that all is well with the world when using
+it with mule 2.2.3 for ethiopic text
+
+Thu Jul 20 04:06:34 1995  William Perry  <address@hidden>
+
+* w3.el: Fixed doc string for w3-open-local - also added autoloads for the
+w3-maybe-follow-* functions
+
+Tue Jul 18 13:24:39 1995  William Perry  <address@hidden>
+
+* w3-beta.el, w3-hot.el:
+Moved all the hotlist stuff out into w3-hot.el, in preparation for writing
+more robust hotlist handling (HTML files, etc, as hotlists).
+
+Mon Jul 17 14:05:31 1995  William Perry  <address@hidden>
+
+* w3-draw.el: <HR> handling now inserts fill-prefix/etc if in lists.
+
+Wed Jul 12 12:42:03 1995  William Perry  <address@hidden>
+
+* w3-xemac.el:
+Patch from chuck to use XBM version of toolbar icons if XPM support
+not available.
+
+Tue Jul 11 00:01:49 1995  William Perry  <address@hidden>
+
+
+Mon Jul  3 15:28:33 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Fixed problem with multiple <textarea> tags would 'merge' the default
+contents.  Blah.
+
+
+* w3-draw.el:
+Fixed a slight formatting problem for <select multiple> lists when
+within a centered area - looked like crap.
+
+* w3-draw.el: Don't load background images if w3-delay-image-loads=nil
+
+Sun Jul  2 03:35:07 1995  William Perry  <address@hidden>
+
+* dist.Makefile: Added new target for w3-hot.elc
+
+* w3.el: Extracted hotlist functions into w3-hot.el
+
+* w3-hot.el: Initial revision
+
+* w3-vars.el, w3.el: Changed *-hooks to be *-hook'
+
+Sat Jul  1 17:14:23 1995  William Perry  <address@hidden>
+
+* w3-mule.el: Fixed problem in w3-convert-code-for-mule
+
+Thu Jun 29 16:27:33 1995  William Perry  <address@hidden>
+
+* dist.Makefile: Few more tweaks to the makefile
+
+* dist.Makefile: Now tries to create INFODIR if it doesn't exist
+
+* w3-e19.el, w3-mule.el, w3-vars.el, w3.el:
+Various patches from  Katsumi Yamaoka <address@hidden> Katsumi Yamaoka 
<address@hidden> for MULE stuff
+]
+
+* w3.el: Fixed a hidden forms problem.
+
+Tue Jun 27 04:17:59 1995  William Perry  <address@hidden>
+
+
+Mon Jun 26 02:29:33 1995  William Perry  <address@hidden>
+
+* w3-wemac.el, w3-xemac.el, w3-e19.el: Fixed problem pointing to w3_toc.html
+
+Sun Jun 25 22:28:28 1995  William Perry  <address@hidden>
+
+* w3-e19.el: Fixed problem in 19.29 where there were two help menus.
+
+
+* w3-sysdp.el: Some more device-* functions
+
+* w3-sysdp.el: More NS problems resolved
+
+* w3-xemac.el: Removed autoload for Info-goto-node
+
+* w3-sysdp.el: Fixed problem in w3-device-class on NeXTstep
+
+* w3-draw.el: Fixed problem in w3-get-resource on NeXTstep
+
+* w3-beta.el, w3-draw.el, w3-epoch.el, w3-mule.el, w3-srch.el, w3-style.el, 
w3-sysdp.el, w3-xemac.el, w3.el:
+Continue movement to using w3-sysdp.el defined functions instead of
+url-* funcs
+
+* dist.Makefile: Removed extraneous w3-sysdp.el from SOURCES macro
+
+Wed Jun 21 20:04:44 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: Few changes for 19.12
+
+* w3-draw.el: New version of w3-pause for XEmacs
+
+* w3-draw.el: Fixed blinking
+
+Tue Jun 20 14:10:49 1995  William Perry  <address@hidden>
+
+* w3-parse.el: <listing> now works.
+
+* w3-draw.el: Fixed <secret> handlig ng when not in XEmacs 19.12
+
+Mon Jun 19 15:12:18 1995  William Perry  <address@hidden>
+
+
+* w3-sysdp.el: Fixed problem in device-class with arg not being optional
+
+Sun Jun 18 21:41:36 1995  William Perry  <address@hidden>
+
+* w3-sysdp.el:
+Fixed bug in emacs-19 version of device-class on non-color displays
+
+* w3-sysdp.el: Rewrote device-class
+Added device-pixel-width and device-pixel-height
+
+* w3-xemac.el: New function w3-ensure-toolbar-visible
+
+
+* w3-draw.el: Moved valid-color-name-p definition over into w3-sysdp.el
+
+Sat Jun 17 17:50:44 1995  William Perry  <address@hidden>
+
+* docomp.el: More toolbar stuff
+
+* docomp.el: Removed lots of stuff that isn't necessary now that we are using
+w3-sysdp.el all over the place
+
+* w3-sysdp.el: Few more bugfixes
+
+
+* w3-sysdp.el: Fixes for nextstep
+
+* w3-sysdp.el:
+Fixed definition of device-class so that it won't choke and die under
+NeXTstep.
+
+* w3-draw.el:
+If w3-delimit-links is non-nil, put delimiters around submit/reset
+form areas.
+
+* w3-xemac.el, w3-e19.el:
+New options in menu to control honoring of refresh headers and color requests
+
+Fri Jun 16 21:52:39 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Now honors multiple <title></title> crap like netscape.
+
+* w3.el: Fixed handling of refresh header if url-honor-refresh-requests == 'ask
+
+* w3.el: Ask the user before submitting a bug.
+
+* w3-sysdp.el: Removed scrollbar functions.
+
+Thu Jun 15 23:42:26 1995  William Perry  <address@hidden>
+
+* dist.Makefile: Always use @echo so it doesn't show up twice.
+
+
+* w3-xemac.el: More <link>-controlled toolbar stuff
+
+
+* w3-xemac.el: Don't call device-type with an argument.
+
+* w3-beta.el, w3-draw.el:
+Fixed a few problems with compatibility with FSF19 in X mode
+
+
+* dist.Makefile: Added urlauth to makefile
+
+* w3-epoch.el: Fixed problem in w3-map-links
+
+
+Wed Jun 14 23:38:46 1995  William Perry  <address@hidden>
+
+
+* w3.el: Removed a few things that are now in w3-sysdp.el
+
+* w3-sysdp.el:
+Changed sysdep-defalias to make sure that 'def' is fboundp if its a
+symbol, so that bogus defs of make-frame, etc, are not created in
+emacs18
+
+* w3.el: Few things to get a nice clean compile using w3-sysdp
+
+* w3-xemac.el:
+Removed loading of w3-sysdp, since it is loaded for everything now.
+
+* w3-sysdp.el: More functions added
+
+* w3-print.el, w3-epoch.el, w3-emacs.el, w3-e19.el, w3-draw.el:
+Few things to get a nice clean compile using w3-sysdp
+
+* docomp.el: Now loads w3-sysdp during compilation
+
+* w3-xemac.el: Stubs for <LINK> specific toolbar stuff.
+
+* w3-parse.el: Rewrote w3-can-safely-ignore as a macro
+
+Tue Jun 13 15:38:32 1995  William Perry  <address@hidden>
+
+
+* w3-xemac.el:
+Moved some stuff over into w3-sysdp.el for a truly clean compile.
+Fixed the new 'privacy' menu item
+
+* w3.el: Added back in text/plain encoder for forms
+
+* w3-xemac.el:
+make sure that when we add our options/help menus to the menubar, we
+do it to the global menubar, not just the current one, which could be
+anything, but usually GNUS or VM if not the default.
+
+* w3-xemac.el: Fixed w3-x-poup-menu bug.
+
+* w3-xemac.el:
+Fixed problem skip was having at http://www.calendars.com/concerts/
+
+Mon Jun 12 20:32:04 1995  William Perry  <address@hidden>
+
+* w3-wemac.el: Added back in crufty old menu definitions for use in WinEmacs
+
+* w3-xemac.el: New 'save options' item
+
+
+* descrip.mms, dist.Makefile, w3.el:
+Added back in the requiring of w3-wemac - just too much different
+stuff between it and even 19.10.
+
+* w3-xemac.el:
+Check for what type of menu we are displaying in w3-sensitize menu, or
+some weird stuff could happen (like adding 'go' and 'view' menus to
+the 'Emacs' type menubar.
+
+* w3-xemac.el: Reordered some functions to avoid warnings in byte compiler
+
+* w3-xemac.el:
+Added a button ala VM to swap between the global menubar and the W3 one.
+
+* w3.txi: Added stub for VMS section of documentation
+
+* w3.el: Various patches from Richard Levitte <address@hidden>.
+(w3-do-setup): expand VMS Mosaic files correctly.
+
+* docomp.el: Various patches from Richard Levitte <address@hidden>.
+start with inserting the current directory into load-path.
+(hack-dot-emacs): remove the two first items from
+command-line-args-left.  Otherwise, Emacs tries to work on them when
+hack-dot-emacs is done.
+
+* descrip.mms:
+Added the VMS build file from Richard Levitte <address@hidden>
+
+* descrip.mms: Initial revision
+
+Sun Jun 11 22:50:50 1995  William Perry  <address@hidden>
+
+
+* w3.txi:
+Added in section on disk caching, filled out the Digest authentication
+mechanism and SSL sections as well.  Only things left to do are the
+sections on non-unix platforms.
+
+* w3-xemac.el:
+Deal gracefully with markers passed into w3-add-zone (for WinEmacs)
+
+
+* w3-draw.el:
+Fixed stupid FSF 19 lossage where x-color-defined-p signals an error
+in a tty instead of failing gracefully.  Robustness?  Whassat?
+
+
+* w3-draw.el:
+Fixed problem in w3-handle-paragraph where re-search-forward could signal an 
error because 'NOERROR' was not t.
+
+* w3.el: Fixed w3-find-this-file
+
+Sat Jun 10 23:19:30 1995  William Perry  <address@hidden>
+
+* w3.el: Fixed stupid screwup
+
+* w3.el: Run the value of a submit button through url-hexify-string
+
+* w3-vars.el, w3-draw.el:
+Renamed w3-user-colors-take-preference -> w3-user-colors-take-precedence
+
+* w3-draw.el, w3.el: IMAGE inputs in forms now work (sortof)
+
+Fri Jun  9 15:01:05 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed problem with unterminated <a> refs.
+
+Thu Jun  8 14:44:35 1995  William Perry  <address@hidden>
+
+
+* w3-draw.el: Fixed plaintext handling.
+
+Mon Jun  5 15:12:17 1995  William Perry  <address@hidden>
+
+* w3-e19.el: Added color printing toggle to emacs19 menus
+
+* w3-xemac.el: Added color printing toggle to xemacs menus
+
+* w3.el: After reading a form entry area, make sure we mark the buffer as not
+modified.
+
+
+* w3-draw.el:
+fixed w3-handle-paragraph to handle weird circumstances where it could
+try to make-string with a negative first arg.
+
+* w3.el: Patches from address@hidden for his local file handling
+stuff
+
+Sun Jun  4 20:58:40 1995  William Perry  <address@hidden>
+
+
+Sat Jun  3 17:07:32 1995  William Perry  <address@hidden>
+
+* dist.Makefile:
+Patch from Skip Montanaro <address@hidden> to make sure we delete
+old copies of the .el and info files, since they are read only by
+default, and this would cause the installation to fail.
+
+* w3-xemac.el:
+Make sure we don't try to set the X selection from a tty only xemacs -
+it signals a wrong-device-type error.
+
+
+Fri Jun  2 13:58:01 1995  William Perry  <address@hidden>
+
+* w3-beta.el:
+Removed dependence on url-grok-url from the netscape cache importing
+
+Tue May 30 16:29:16 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Now recognizes <link rel="style"> as well as <link rel="stylesheet">
+
+* w3.el: Fixed bug in w3-hotlist-delete that would choke and die on items named
+'hotlist' - fixed the regular expression it was working with.
+
+
+* w3.el: Few fixes
+
+
+* w3-draw.el: Nuke all faces when leaving a <pre> segment
+
+
+Mon May 29 18:24:04 1995  William Perry  <address@hidden>
+
+
+* w3-style.el, w3-print.el, w3-parse.el, w3-e19.el, w3-beta.el, w3-about.el, 
w3.el, w3-draw.el:
+Removed lots of function documentation and left it as comments.  These
+functions are not meant to be seen by everyone, and this saves space
+in the .elc files.
+
+* w3.el: Made w3-save-binary-file default to a sane filename
+
+
+* w3-10646.el:
+Removed bogus copyright, added back in the real one from Erik Naggum.
+gotta hate cut & paste
+
+* w3-xemac.el:
+Make sure the links menu is broken up when using the filter method in 19.12
+
+
+* w3.el, w3-xemac.el, w3-epoch.el, w3-draw.el:
+Now deals with the removal of url-parse-relative-link
+
+Sun May 28 22:28:55 1995  William Perry  <address@hidden>
+
+
+* w3.el, w3-about.el: Use the new url-register-protocol interface
+
+* w3-vars.el: Fixed w3-modeline-format to look nicer
+
+
+Sat May 27 22:00:15 1995  William Perry  <address@hidden>
+
+* dist.Makefile: Removed w3-wemac from the distribution and makefile rules
+
+* w3.el: No longer require w3-wemac if running under windows - the standard
+w3-xemac package should handle it now.
+
+* w3-vars.el, w3.el:
+New variable w3-modeline-format that controls the modeline look when
+in w3-mode buffers.
+
+* w3-vars.el: Removed crufty old menu definitions
+
+* w3-draw.el:
+The new color-frobbing stuff works in older versions of lemacs/xemacs
+
+* w3-xemac.el: First pass at a merger of w3-wemac.el and w3-xemac.el
+
+
+* w3-xemac.el:
+Add the options and help menus to the main menubar in all versions of
+xemacs
+
+Fri May 26 23:42:29 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: More patches from chuck for the next great xemacs beta
+
+* w3-style.el, w3-draw.el:
+Avoid calling of set-face-xxx functions directly, use 'apply' to avoid
+Emacs-19 lossage of defsubsts that makes .elc files non-portable to
+XEmacs.
+
+* w3-draw.el: Honor the <base> tag stuff when doing forms.
+
+* w3-vars.el: Few fixes for the latest beta of XEmacs 19.12
+
+Thu May 25 19:44:48 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+The body color handling stuff now deals gracefully with bad colors
+
+* w3.el: Few fixes for VRML
+
+* w3-style.el: Can now compile under Emacs 18 again.
+
+Wed May 24 13:47:17 1995  William Perry  <address@hidden>
+
+* w3-e19.el: Rearranged some of the menus to be like the XEmacs counterparts
+
+Tue May 23 14:30:05 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: More renamings for XEmacs 19.12
+
+Mon May 22 12:20:36 1995  William Perry  <address@hidden>
+
+* w3-xemac.el, w3-e19.el:
+Renamed url-automatic-cacheing -> url-automatic-caching
+
+* w3-xemac.el: Removed call to bogus exit-emacs func.
+
+Wed May 17 16:20:46 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: Support the newer way of doing toolbars in XEmacs 19.12
+
+* w3-xemac.el: Patch from chuck for latest XEmacs 19.12 toolbar stuff
+
+
+Tue May 16 20:18:40 1995  William Perry  <address@hidden>
+
+* w3.el: VRML stuff
+
+
+Mon May 15 03:38:36 1995  William Perry  <address@hidden>
+
+* w3.el: If no last-modified, don't try to refetch the head info if not in file
+or ftp mode.
+
+
+* w3-style.el:
+New w3-spatial-to-canonical function that can convert something like
+1in or 12pt to a pixel-based representation.
+
+* w3-xemac.el: Changed menus when under Lemacs 19.10 look just like 19.12
+
+Sun May 14 17:37:35 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Fixed problem with <p align="xxx"> .... <p> not properly terminating
+the alignment
+
+
+* w3-about.el: hehe
+
+* w3.el: Better cleanup of the temp directory.
+
+
+Sat May 13 21:03:14 1995  William Perry  <address@hidden>
+
+
+* w3-draw.el: Finished up cookie interface
+
+* w3-draw.el:
+Stub for interface to the cookie() function of emacs from within an HTML
+document.
+
+* w3-about.el: New stylesheet for about: pages
+
+* w3.el: Make w3-reload-document not recenter the window
+
+* w3-draw.el: Fixed isindex handling for prompt=xxx and action=xxx
+
+* w3-draw.el:
+Make sure the emphasis on quotes (<q></q>) includes _both_ quote chars.
+
+* w3-e19.el:
+Don't blindly set the mouse-face on anything with 'w3 in the property
+list.  would cause things like <a name=xxx> to highlight.
+
+
+* w3-xemac.el: XEmacs 19.12 tweaks
+
+* w3-about.el:
+New authors page that doesn't crap out in XEmacs 19.11 / Lemacs 19.10
+
+* w3-xemac.el: Few more tweaks to the menus
+
+* docomp.el: More garbage for a clean compile
+
+* w3-xemac.el, w3-draw.el, w3.el: Few fixes for the latest beta of XEmacs 19.12
+
+Thu May 11 16:32:17 1995  William Perry  <address@hidden>
+
+
+* w3-xemac.el: Added buffers menu to w3 menu
+
+Wed May 10 22:19:25 1995  William Perry  <address@hidden>
+
+* w3-xemac.el:
+Don't set up the toolbar if w3-toolbar-orientation is not 'top 'left
+'right or 'bottom.  Don't set the menubar for the w3 buffer if there
+is no default one.  Copy the options menu into the main options menu
+if in XEmacs 19.12
+
+* w3-xemac.el: Fixed images in 19.12
+
+* w3.txi: Lots of changes
+
+* w3.el: Added some stuff from the texinfo docs
+
+Tue May  9 16:43:46 1995  William Perry  <address@hidden>
+
+
+Mon May  8 21:45:28 1995  William Perry  <address@hidden>
+
+* w3-emacs.el:
+Fix from Michael Welsh Duggan <address@hidden> for w3-back-link
+in emacs 18
+
+* dist.Makefile: Added ssl.el file
+
+* w3-draw.el:
+Fixed problem with <br> in indented areas inserting the indentation twice
+
+* docomp.el: Turn off new emacs19 dynamic loading gunk
+
+Sun May  7 23:33:18 1995  William Perry  <address@hidden>
+
+
+* w3-style.el: Few fixed for XEmacs 19.12
+
+* w3-style.el: More style hackings
+
+* w3-parse.el:
+Gracefully handles stuff like '< ' in a document - this should be
+shown.  Screw document authors that do stuff like '< a' - its wrong.
+
+* w3.el: Make w3-mark-link-as-followed be a no-op if w3-emacs19-hack-faces-p is
+non-nil, otherwise weird things happen with too many spaces inserted
+in the buffer, and there was really no difference between the two
+renderings in that nasty mode anyway.
+
+* w3-xemac.el: Fixed typo in spiffy new menus for xemacs 19.12
+
+* w3.el: Let w3-notify-when-ready deal gracefully with a null argument
+
+* w3-draw.el: Make </pre> without matching <pre> act like <p>
+
+* w3-draw.el: Added the <flame> tag
+
+* RelNotes2.2: Initial revision
+
+* w3-draw.el: Only set w3-last-tag if non-text
+
+* w3-draw.el: Reverted to old <dt> handling - looks better.
+
+* w3-about.el: Removed a few dependencies on the old 'b64-xxxx' functions
+
+* w3-style.el:
+New stylesheet parser - can handle the new grammar agreed upon by
+H&kon and I.
+
+* dist.Makefile: Added new base64 package
+
+Sat May  6 21:46:21 1995  William Perry  <address@hidden>
+
+
+* w3-xemac.el: Now puts help-echo property on images that are links
+
+* w3.el: Now includes a mime-version header for mailed documents
+
+
+* w3-emacs.el: New version of w3-forward-link and w3-back-link that skip over
+'w3-graphic zones.
+
+* w3-draw.el: <tab id=xxx> and <tab to=xxx> work now
+
+* w3.el: Fixed problem with command-line-args-left being unbound when not in
+startup phase
+
+
+* w3-draw.el: New way to handle secrets fixed in old versions of emacs.
+Default background pixmap to nil
+
+* w3-about.el: New text for easter egg tag #1
+
+* w3-xemac.el: Image-type selector menu is back.
+
+
+* w3-xemac.el:
+Changed mouse activation for image links to button2 to be consistent
+
+* w3.txi: Few spelling changes
+
+Fri May  5 23:05:39 1995  William Perry  <address@hidden>
+
+* w3.el: Can now do:
+emacs -f w3-fetch [url]
+
+* w3.el: Can now have 'PUT' as the method for a form.
+
+* w3-xemac.el: Return the bitmap
+
+* w3-draw.el: Now handles the 'background' bitmap tag of netscape
+
+* w3-vars.el, w3-draw.el: Few changes to make the 'secret' tag work better.
+
+
+* w3-xemac.el: Reordering of defvars to make sure we can get a clean compile
+
+* w3-xemac.el: Use glyph-width if its available.
+
+
+* w3-draw.el: Netscape body tags would choke emacs18
+
+* w3.el: Do w3-setup in w3-batch-fetch
+
+
+* w3.el:
+w3-save-as can now take an optional argument to tell it what to save as
+
+Thu May  4 23:58:53 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: Cool new menus for XEmacs
+
+* w3-draw.el: Fixed bug in handling of multiple <dt> elements before a <dd>
+
+Mon May  1 20:10:36 1995  William Perry  <address@hidden>
+
+* w3-e19.el, w3-vars.el: Use the new about: pages
+
+* w3-draw.el: Fixed <link rel="stylesheet" href="xxxx"> handling
+
+* w3-style.el: fixed style handling from a URL/href
+
+Sun Apr 30 20:57:17 1995  William Perry  <address@hidden>
+
+
+* w3-xemac.el: New glyph interface for XEmacs 19.12
+
+* w3-about.el: More about: docs.
+
+* w3-epoch.el, w3-draw.el: More fixes for epoch
+
+* w3.el: Fixed links of just images in XEmacs
+
+Sat Apr 29 22:25:33 1995  William Perry  <address@hidden>
+
+* docomp.el, w3-epoch.el, w3-draw.el: More epoch fixes
+
+* w3-draw.el: The netscape background/foreground body colors work in epoch now.
+
+* w3-epoch.el: All the face stuff now works in epoch again.
+
+* w3-parse.el: Use w3-10646 if available
+
+
+* w3-10646.el: New keywords
+
+* w3-10646.el: Initial revision
+
+Fri Apr 28 22:52:46 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Implemented teh 'add.before' and 'add.after' stylesheet mechanism
+
+* w3.el: Fixed case where return would pop up an x-menu in emacs19
+
+* w3-style.el: Fixed problem with leading whitespace
+
+* w3.el: Added about URL handling
+
+* w3-draw.el: Fix to jnetscape body tags
+
+* w3-about.el: Initial revision
+
+
+Thu Apr 27 01:40:39 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Few updates for XEmacs 19.12
+
+Wed Apr 26 17:59:03 1995  William Perry  <address@hidden>
+
+
+Tue Apr 25 22:15:55 1995  William Perry  <address@hidden>
+
+* w3.el: w3-in-assoc now silently skips nonstrings in the car
+
+* w3-draw.el: Can now use regexps in stylesheets (h[1-6], etc)
+
+* w3-style.el: Added DSSSL-lite parser
+
+
+* w3-draw.el: Now handle <link rel=stylesheet href=xxxx>
+
+* w3-style.el: Modify the accept headers when retrieving a URL for a stylesheet
+
+Mon Apr 24 07:52:37 1995  William Perry  <address@hidden>
+
+* w3-print.el: Wrap w3-convert-html-to-latex in case-fold-search == t
+
+* w3-vars.el: Added w3-node-style and w3-visited-node-style to the persistent
+variables list - this is necessary for letting
+w3-mark-link-as-followed to work with the netscape body tags.
+
+* w3-vars.el: Make w3-node-style and w3-visited-node-style buffer-local, or the
+netscape tags on <body> screw up subsequent documents!
+
+* w3-parse.el: Removed a condition-case in w3-nuke-entities-in-region
+
+* w3-xemac.el: Few more toolbar fixes.
+Fixed autoload for Info-goto-node
+
+Sun Apr 23 22:01:08 1995  William Perry  <address@hidden>
+
+* w3.el: Fixed w3-backward-in-history
+
+* w3-style.el:
+New function w3-create-x-font to create a font based on the family,
+style, and size.
+
+* w3-xemac.el:
+New variable w3-toolbar-orientation to control what side of the frame
+the toolbar appears on.
+
+* w3-draw.el: New way of getting info from stylesheets to synch up with the new
+stuff from H&kon.
+
+* w3-xemac.el: Added button for hotlists in the toolbar
+
+* w3-xemac.el: Various and sundry toolbar stuff.
+
+* dist.Makefile: Now makes the install directory if it doesn't exist.
+
+* w3-draw.el: <blink> now works on tty's in XEmacs.
+Scaling of fonts in a tty-only XEmacs works also.
+
+Sat Apr 22 13:42:25 1995  William Perry  <address@hidden>
+
+* w3-print.el, w3.el, w3.txi: Changed references to info.cern.ch to w3.org
+
+
+Fri Apr 21 19:34:47 1995  William Perry  <address@hidden>
+
+* w3.el: Removed a few old variables
+
+* w3-draw.el:
+Don't set attributes on default face if they are nil - bad things man.
+
+* w3-epoch.el, w3-e19.el, w3-wemac.el: Removed a few old variables
+
+* w3-xemac.el:
+Finally fixed problem in lemacs/xemacs form entry where every once in
+a while it would choke with a 'wrong-type-argument stringp (wierd
+list)' error.
+
+* w3-draw.el: Fixed problem with the <body> attributes when in Emacs 19
+
+* w3-vars.el, w3-draw.el:
+New variable w3-user-colors-take-preference to control whether the
+netscape tags on <body> are honored or not.
+
+* w3-xemac.el: Provide a definition of add-submenu for older XEmacsen
+
+* w3.el, w3-vars.el: Removed a few old variables
+
+* w3-draw.el: Now honor the netscape attributes on <body>
+
+* w3-vars.el: Added keybinding for w3-mail-document-author
+
+* w3-beta.el: Reimplemented the w3-show-headers stuff.
+
+Thu Apr 20 20:23:06 1995  William Perry  <address@hidden>
+
+* w3.el: w3-document-information now looks much prettier
+
+* w3.el: Fixed w3-mail-to-author and Renamed it to w3-mail-document-author to
+avoid confusion about what 'author' we are mailing to - the documents,
+or Emacs-w3's
+
+
+* w3.el: Revamped the forward and backward history handling
+
+* w3-draw.el: Got <p nowrap> working
+
+Wed Apr 19 17:01:58 1995  William Perry  <address@hidden>
+
+
+* clean-cache: Initial revision
+
+* w3.el: Revamped how <link> is handled.  Added printing of <link> data in
+w3-document-information
+
+* w3-draw.el:
+Revamped how <link> is handled.  Fixed a bug in meta handling - was
+not downcasing the http-equiv, so it could not always find an old
+value in url-current-mime-headers to replace.
+
+* w3-vars.el: changed w3-list-chars-assoc to use symbols instead of strings
+
+* w3.txi: Documented change in w3-list-chars-assoc
+
+* w3-draw.el: Converting w3-list-chars-assoc won't die if you do it twice
+
+* w3-sysdp.el: Updated to latest version from XEmacs
+
+* w3-sysdp.el: Removed keywords
+
+Sun Apr 16 22:41:11 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed problem in w3-handle-emphasis-end
+
+* w3-draw.el: Added code to fixup spaces are . and !
+
+* w3-beta.el: Now parses out the link commands in the mime headers
+
+* w3.el: Issue an error if they chose a link type (rel or rev) that the
+document did not contain when in w3-use-links
+
+* w3-style.el:
+Make the buffer not modified before killing it when parsing a style sheet
+
+* w3.el: Fixed parsing of default stylesheet
+
+* w3.el: Fix for form field reversals in submissions
+
+Sat Apr 15 23:33:36 1995  William Perry  <address@hidden>
+
+* w3-beta.el: Can now import netscape bookmark files
+
+* w3-draw.el:
+Now handles <q></q> differently - inserts "" around the material, and
+you can specify the start and end quotes in stylesheets with:
+q: startquote=``
+q: endquote=''
+
+* w3-draw.el:
+Was not expanding relative URLs before checking whether they had been
+visited with w3-delimit-links non-nil.  This would lead to weird
+looking links like [[something}} - not very pretty.
+
+* w3-vars.el, w3.el: Now reads in a default stylesheet for the user if
+w3-default-stylesheet is non-nil.  This can be a URL.
+
+
+* w3.el: Made w3-pass-to-viewer be more like man when in asynchronous mode.
+
+* w3-vars.el: New variable w3-notify
+
+* w3-parse.el:
+Fixed problem in pre/xmp handling where it would choke if there were
+extra endtags and swallow-newlines went negative.
+
+Fri Apr 14 23:52:51 1995  William Perry  <address@hidden>
+
+* w3.el, w3-xemac.el, w3-wemac.el, w3-vars.el, w3-style.el, w3-srch.el, 
w3-print.el, w3-parse.el, w3-next.el, w3-mule.el, w3-mac.el, w3-epoch.el, 
w3-emacs.el, w3-e19.el, w3-draw.el, w3-beta.el:
+Changed keywords
+
+* w3-vars.el: removed old variable w3-global-history-completion-list
+
+
+* w3-draw.el: No inherent maxlength on <textarea> fields
+
+* w3.el: Added alias for w3-popup-info
+
+* w3.el: Always goto (point-min) in w3-document-information and w3-popup-info
+
+* w3-vars.el: Added keybindings for w3-document-information and w3-popup-info
+
+Thu Apr 13 21:12:33 1995  William Perry  <address@hidden>
+
+
+* w3-style.el: w3-blend-colors now works in XEmacs 19.12
+
+* w3-style.el: Added function w3-blend-colors (FSF Emacs-19 specific)
+
+* w3-parse.el:
+Make sure to clear the minibuffer when done parsing - otherwise it
+could leave a 'Parsed x of y (zz%)' message, which can make people
+think it is hung.
+
+* w3-draw.el, w3.el: Fixed <link> handling
+
+Wed Apr 12 03:24:02 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Fixed a few problems with stylesheets losing the alignment info from
+headers too soon.
+
+* w3-draw.el:
+<p></p>, <div></div>, and <note></note> can all specify the face to
+use for an element via the 'class' attribute.
+
+* w3-draw.el: Fixed a bug in using the 'class' attribute to add faces to text.
+Would forget what tag would end the current face, so faces went on
+forever.  Ugh!
+
+* w3-draw.el: The 'class' attribute can now be used to add faces to text.
+
+* w3-style.el: Changed how style sheet faces are regenerated.  Now stores the
+face-name as an item in w3-current-stylehseet (assoc "face" ...) to
+get it.
+
+Tue Apr 11 23:11:58 1995  William Perry  <address@hidden>
+
+* w3-sysdp.el: Added some more stuff from chuck
+
+* w3-draw.el: Fixed popping the alignment from an address tag if
+w3-right-justify-address is non-nil
+
+* w3-draw.el: Redid w3-get-default-style-info macro
+
+
+Mon Apr 10 22:46:14 1995  William Perry  <address@hidden>
+
+
+* w3-draw.el: Added thge marca sound for <hype> tag.
+
+* w3-draw.el: Now honors the 'class' attribute on any style-sheetable tag
+
+* w3-style.el:
+Few tweaks to how the style sheet is stored, to make using the 'class'
+attribute on tags quicker (stores an intern'd symbol and a string in
+the list)
+
+* w3.el: Fixed problem where inlined images on the local disk could get trashed
+because buffer-file-name was not nil in the buffer.
+
+
+* w3-draw.el: Fixed <font size=-x> handling
+
+* w3-parse.el: Call sera-to-fidel-marker if in mule.
+
+Sun Apr  9 18:37:24 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed <div> </div> handling
+
+* w3-draw.el:
+Use copy-tree on w3-use-stylesheet so we don't side-effect the original list
+
+
+* w3-xemac.el: Added in the code to create the toolbar.
+
+* w3-beta.el: Fixed the importing of netscape cache files
+
+
+* w3-draw.el:
+Changed w3-push-alignment to be a little smarter - if align is null,
+don't bother pushing it on the stack.
+
+* w3-parse.el:
+Fixed a spacing problem that would show up when doing progressive
+rendering but not a w3-refresh-buffer.  Ugh.
+
+
+Sat Apr  8 23:34:06 1995  William Perry  <address@hidden>
+
+* w3.el: Made w3-generate-error check the contents of the ' *url-error*' buffer
+and use it as part of the error message.
+
+* w3-draw.el:
+Got rid of bad use of concat in w3-handle-font, and better handling of
+the font scaling.
+
+Fri Apr  7 22:59:07 1995  William Perry  <address@hidden>
+
+
+* w3-e19.el: Remove the files menu in emacs 19.29
+
+* w3.el: Fixed problem in mule with w3-save-binary-file
+
+* dist.Makefile: Added -no-site-file to BATCHFLAGS
+
+* dist.Makefile: More renaming for DOS lossage
+
+Wed Apr  5 19:59:33 1995  William Perry  <address@hidden>
+
+* w3.el: Fixed w3-fetch for working in buffers with no default url... d'ohhh
+
+
+* w3-draw.el:
+Fixed screwup in w3-handle-p that would push an alignment onto the
+stack twice for headers
+
+* w3.el: w3-fetch now has a 'silent' default - it doesn't insert the default as
+the default option - it checks if the user presses return, and uses
+the default if they did.
+
+* w3-draw.el: Now uses a stack of alignments, and honors the <div></div> tag.
+
+Tue Apr  4 17:29:32 1995  William Perry  <address@hidden>
+
+* dist.Makefile: Makefile now works in Windows and NT
+
+* w3.el: Removed anonymous lambda from w3-hotlist-apropos
+
+* w3.txi: Fixed typo in texinfo node
+
+Mon Apr  3 23:03:19 1995  William Perry  <address@hidden>
+
+
+* hype.au: Initial revision
+
+Sun Apr  2 20:17:02 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed <meta> handling
+
+* w3.el: Fixed w3-popup-info
+
+
+* w3.txi: Basic documentation of the style sheet mechanism
+
+* w3-draw.el:
+Fixed the align=indent problem where first line of the indented region
+was not indented.
+
+* dist.Makefile: Renamed w3.texinfo to w3.txi, for 8.3 losingness
+
+
+* w3.txi: Removed all the 'WORK' areas except for the non-unix systems nodes.
+Put out a call for assistance to w3-beta and gnu-emacs-help for these
+areas.
+
+Tue Mar 28 23:36:30 1995  William Perry  <address@hidden>
+
+* w3.el: Fixed a few more concat'ing integer problems
+
+* w3-draw.el: Can now specify OL styles in stylesheets.
+
+
+* w3.el:
+Added w3-hotlist-apropos function from address@hidden (Michelangelo Grigni)
+
+* w3-xemac.el, w3-e19.el: Fixed concat'ing of ints
+
+Mon Mar 27 22:05:19 1995  William Perry  <address@hidden>
+
+* w3.el: Now requires w3-print
+
+* w3-draw.el: Only mangle headers if w3-delimit-emphasis is non-nil
+
+
+Sun Mar 26 19:50:16 1995  William Perry  <address@hidden>
+
+
+* dist.Makefile: Removed w3-main from the distribution - renamed to w3
+
+* w3.el: Moved w3-upcase-region into w3-draw.
+Now requires w3-style and all the new dipslay engine chunks.
+
+* w3-draw.el:
+Now initializes the current stylesheet to the user stylesheet before
+any drawing starts.
+
+* w3-vars.el:
+Made w3-header-chars-assoc work with the new display engine (mostly),
+and added a few more things to the state variables.
+
+* w3-style.el:
+Can now do font scaling in style sheets.  smarter about font.type.
+Only thing left is font.family
+
+
+* docomp.el: More var decls.
+
+* w3-wemac.el: Fixed w3-mouse-handler for windows
+
+* w3-draw.el:
+Make all face storage variables buffer-local for style-sheet stuff.
+
+* w3-style.el: Now handles fonts/colors in style sheets - whooo hooo!
+
+Sat Mar 25 23:38:49 1995  William Perry  <address@hidden>
+
+* w3-vars.el: Renamed w3-state-garbage-variable
+
+* w3-draw.el:
+Now uses style sheets to find alignment and width for the various tags
+before falling back on its defaults.
+
+
+* w3-parse.el:
+Fix for stupid people who don't use &amp; instead of & in the middle
+of a doc.
+
+
+* w3-xemac.el: Added w3-center-spaces and w3-right-spaces for
+centering/right-justifying pixmaps
+
+* w3-xemac.el, w3-sysdp.el:
+A few new functions for the latest and greatest beta
+
+* w3-vars.el: Changed a few of the menu names
+
+* w3-style.el: Now actually parses and stores the style sheet information
+
+* w3-draw.el: Handle case where tag is a list
+
+Fri Mar 24 14:36:09 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: Now uses device-type for XEmacs 19.12
+
+Wed Mar 22 21:14:30 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed a few spacing problems
+
+* w3-e19.el:
+Fixed w3-forward-link for links that were right up on top of each other.
+
+* w3-parse.el:
+Fixed screwup with unterminated quoted chars in attribute/value pairs
+
+
+* dist.Makefile: Removed w3-old
+
+* w3-draw.el: Fixed stupid typo when checking for faces.  d'ohhhh!
+
+Mon Mar 20 23:23:34 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: Fixed problem with w3-extend-zone and detached extents
+
+* w3-draw.el: <option selected> now works again
+
+
+* w3-xemac.el:
+Set the help-echo property when showing form elements if possible.
+
+* w3-vars.el, w3-beta.el, w3-draw.el:
+Redid how state is kept - now uses a vector, which should be faster,
+and is able to be buffer-local.
+
+* w3-parse.el:
+w3-nuke-entities-in-region should no longer choke in odd circumstances
+with just '&' in a document.
+
+* dist.Makefile: Removed w3-forms - it has been assimilated
+
+* dist.Makefile: Added a few new dependencies
+
+
+* w3-draw.el: Added message when scaling fonts, just to keep the user informed
+
+* w3-wemac.el, w3-xemac.el, w3-e19.el:
+When moving the mouse over a submit button in a form, shows where the
+form will be submitted.
+
+* w3-draw.el: Fixed emacs-18 lossage in skip-chars-backward
+
+* w3-draw.el: Another fix to make sure <li><p> construct doesn't look like crap
+
+* w3-draw.el:
+Split the handling of the refresh header out into its own function so
+that it can be used from the drawing/parsing code for META commands
+
+Sun Mar 19 02:12:24 1995  William Perry  <address@hidden>
+
+* w3-parse.el: Fixed problem with window focus.
+
+* w3.el: Few fixes for passing to viewers
+
+* w3-parse.el: Set fill-column in w3-preparse-document
+
+Sat Mar 18 23:47:37 1995  William Perry  <address@hidden>
+
+* w3-parse.el: If parsing, do incremental display as well
+
+* w3-draw.el: Removed ugly hacks from w3-pause for emacs19 - just too ugly.
+
+
+* dist.Makefile, docomp.el:
+Take LISPDIR on the command line for hack-emacs-file
+
+* dist.Makefile: Removed EMACSTEMPLATE
+
+* dist.Makefile, docomp.el: hack-dot-emacs now takes a command line argument
+
+* w3-draw.el: links in tty mode won't show [[/{{
+
+* w3-vars.el: All graphical entities now have textual alternativs
+
+* w3-draw.el: Added graphic entities back in.
+
+* w3-draw.el: Able to embed a few more types
+
+* w3-parse.el, w3-draw.el: Added the base functionality for the embed tag
+
+Fri Mar 17 15:44:16 1995  William Perry  <address@hidden>
+
+* dist.Makefile: Removed some old targets, added new ones for new files
+
+* w3-style.el: Initial revision
+
+
+* w3-parse.el: Special handling for the <style> argument.
+
+* w3-vars.el, w3-draw.el: Moved variables into w3-vars.el
+
+* w3-parse.el, w3-draw.el: Basis for the <style></style> notation done
+
+Thu Mar 16 19:44:12 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Fixed scaling of fonts, now handles cryptopt blocks for secure-http
+
+
+* w3-draw.el:
+Now no whitespace between link delimiters and the actual text of the link
+
+
+* dist.Makefile: Added md5 target
+
+* w3-parse.el, w3-draw.el, w3-beta.el:
+Now draws each signel item as it is parsed..
+
+Wed Mar 15 23:27:55 1995  William Perry  <address@hidden>
+
+
+* w3.el: Fixed a problem in w3-pass-to-viewer
+
+* w3-draw.el:
+Fixed problem with headers being hosed because of new way to do faces.
+
+* w3-draw.el, w3-xemac.el: Imagemaps work now
+
+Tue Mar 14 16:04:04 1995  William Perry  <address@hidden>
+
+
+* w3-draw.el: A few general performance increases
+
+Mon Mar 13 05:51:41 1995  William Perry  <address@hidden>
+
+* w3-beta.el, w3-draw.el, w3-e19.el, w3-mac.el, w3-next.el, w3-old.el, 
w3-vars.el, w3-xemac.el:
+Lots and lots of doc fixes to meet FSF/GNU guidelines.
+
+* w3-parse.el, w3.el, w3-e19.el, w3-draw.el: Few doc string fixes
+
+
+* w3-vars.el, w3.el:
+Now guess the value of w3-color-use-reducing based on values of
+x-display-visual-class and x-display-planes.
+
+* w3-draw.el:
+Fixed problem with indenting being lost in a list item after a sublist
+terminates.
+
+* w3-draw.el: Redid some of the font stuff.
+
+Sun Mar 12 17:31:59 1995  William Perry  <address@hidden>
+
+
+* w3-draw.el: Some basic table-drawing support put in.
+
+* w3-tables.el: Initial revision
+
+* w3.txi: Use active voice in keybinding descriptions.
+
+Sat Mar 11 22:20:21 1995  William Perry  <address@hidden>
+
+* w3-draw.el: More state kept - ugh.
+
+* w3-forms.el:
+Removed dependence on STREAM being defined - will make going totally asynch 
much easier
+
+* w3-vars.el, w3-parse.el, w3.el, w3-emacs.el: Removed 'backslashitis'
+
+* w3-e19.el: Removed a few unused variables
+
+* w3-draw.el: Optimized face stuff.
+
+* w3-beta.el: Removed 'backslashitis'
+
+* w3-vars.el, w3-e19.el: Change to the popup menu
+
+* w3-draw.el: Few fixes for blinking and wired text
+
+Fri Mar 10 23:18:30 1995  William Perry  <address@hidden>
+
+* w3-draw.el, w3-xemac.el: Fixed images as linkx
+
+
+* w3-draw.el: Fixed <br> in <dl> after a <dt> being indented too far
+
+* w3-draw.el: Fixed <br> in <ol> not being indented enough
+
+* w3-old.el: Now provides itself
+
+* w3-draw.el: New variable to turn off incremental display.
+
+* w3-draw.el: Does not display <certs> elements now.
+
+Thu Mar  9 20:35:12 1995  William Perry  <address@hidden>
+
+* w3-xemac.el, w3-epoch.el, w3-e19.el:
+Don't make so many faces if using the new display engine - we don't
+need any of the w3-xxxx-style ones.
+
+* w3-beta.el:
+Nuke w3-delayed-images and w3-delayed-movies in w3-refresh-buffer, or
+multiple images would get loaded!
+
+* w3-draw.el: Avoid calling w3-pause as often - speeds up redisplay a lot.
+
+* dist.Makefile:
+No longer byte-compile w3-sysdp - was causing too many problems.
+
+* w3-beta.el:
+No longer (goto-char (point-min)) in w3-show-buffer so that movement
+done while drawing is still honored.
+
+* w3-draw.el: Added a save-excursion around the last handle-paragraph so that
+movement done while drawing is still honored.
+
+* w3-xemac.el:
+Use copy-tree when available for menu copying - much more reliable
+
+* w3-mac.el: Added a provide for w3-mac
+
+* w3-xemac.el: Fixed problem with extents becoming detached in 19.12
+
+* w3-forms.el: Few forms fixes.
+
+* w3-beta.el: Added w3-install-latest from address@hidden
+
+* w3-beta.el: Fixed MCOM->netscape stuff.
+
+* w3-forms.el: Fixed misplaced parentheses
+
+Mon Mar  6 23:29:59 1995  William Perry  <address@hidden>
+
+
+Sat Mar  4 15:33:08 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Now handles images like in the old display engine if not in XEmacs/Lucid
+
+* w3-e19.el: Only create air hotlist menu if w3-air-hotlists is non-nil
+
+Fri Mar  3 16:01:38 1995  William Perry  <address@hidden>
+
+
+Thu Mar  2 15:50:57 1995  William Perry  <address@hidden>
+
+* w3.el: Run w3-add-hotlist-menu first time a hotlist is loaded in.
+
+* w3-e19.el: Let w3-add-hotlist-menu run even if not in w3-mode
+
+Wed Mar  1 16:22:46 1995  William Perry  <address@hidden>
+
+* w3-sysdp.el: Removed function call causing problems
+
+* w3-xemac.el: Don't load pictures if current frame is on a tty
+
+* w3-draw.el: Added back in a call to mule-attribute-zones
+
+* w3-parse.el:
+Don't nuke the windows chars for quote and trademark when in MULE
+
+Sun Feb 26 19:17:38 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Removed message about 'unknown tag <%s> skipped' - was causing
+confusion for some people.
+
+
+* W3.ad: Initial revision
+
+Sat Feb 25 23:53:08 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed incremental display in emacs 18.xx
+
+* w3-draw.el: Fixed paragraph spacing problem.
+
+* dist.Makefile: Made beta display engine the default.
+
+* w3.el: Removed LCD archive entry, moved into w3.el
+
+* w3-wemac.el: Various fixes for new display engine into WinEmacs
+
+* w3-vars.el: Don't die if cannot load 'annotations'
+
+* w3-sysdp.el:
+Removed anonymous lambda without 'function' wrapper for WinEmacs and
+early versoins of lucid emacs.
+
+* w3-srch.el: Provide w3-srch
+
+* w3.el: Changed _W3 on dos machines to W3.INI
+New function w3-force-reload-document to reload even if in standalone mode
+Added a default for w3-complete-link
+Provide w3-main
+
+* w3-draw.el:
+Defvard w3-last-fill-pos and w3-last-tag to better facilitate drawing
+in 2 buffers at once.
+Fixes for messed up percentages in WinEmacs/XEmacs < 19.12
+Fixed <br> and <p> in blockquotes and align=indent
+
+Mon Feb 20 04:54:30 1995  William Perry  <address@hidden>
+
+* w3.el, w3-vars.el: Removed w3-color-planes and w3-color-display variables.
+
+* w3-vars.el, w3.el: New variables w3-netscape-configuration-file and
+w3-use-netscape-configuration-file, for whether to parse and honor the
+options in a Netscape/X style configuration file.
+
+Sun Feb 19 22:27:00 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: Don't change menubar if current-menubar is nil.
+
+* w3.el: Now shows whether you are using the beta version in the bug reports
+
+
+* w3-draw.el, w3-parse.el, w3-print.el, w3.el:
+Removed references to w3-working-buffer
+
+Sat Feb 18 19:51:53 1995  William Perry  <address@hidden>
+
+* docomp.el: Reworked the autoloads/defvars
+
+* dist.Makefile: Removed w3-lemac.el
+
+* w3.el, w3-draw.el, w3-vars.el:
+Removed variable w3-running-lemacs, since w3 now uses sysdep.el for
+[XL]emacs, so there is no distinction between lemacs and xemacs
+
+* w3-e19.el: Fixed problem with unquoted lambda in w3-e19-options-menu
+
+* w3-xemac.el:
+This version should theoretically work with lemacs and xemacs both
+
+* w3-draw.el: Fixed incremental display in xemacs.
+
+* w3-sysdp.el: Initial revision
+
+Thu Feb 16 15:58:44 1995  William Perry  <address@hidden>
+
+* w3.el: Changed messaging of viewer - would barf on undefined escape sequences
+in crufty mailcap-related stuff.
+
+Sun Feb 12 23:09:40 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Better event handling while drawing HTML
+
+* w3-beta.el: Fixed personal annotations.
+
+* w3-draw.el: Removed proclaim-inline calls.
+
+
+* w3.txi: Added docs for new 'label' and 'textalign' attributes of <hr>
+
+* w3-e19.el:
+Fixed problem in emacs 19 with mouse-selecting a link would sometimes
+say there was not a link, but selecting it with 'return' would work.
+Now both work.
+
+* w3-parse.el: fixed problems with entity-resolution in attribute values.
+
+* w3-draw.el:
+More spacing stuff, added 'label' and 'textalign' attributes to <hr>
+
+* w3-forms.el: Remove spaces at beginning of options.
+
+Sat Feb 11 22:10:46 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Removed dependence on 'stream' from title handling.  This will make it
+easier to do totally streamed drawing, RSN.
+
+* w3-draw.el: Fixed more spacing problems.
+
+* w3-parse.el, w3-draw.el:
+Fixed various spacing bugs - seem to be all gone now!!!!
+
+* w3-vars.el: New function to read a netscape-style configuration file.
+
+* w3-parse.el: w3-nuke-entities-in-region can now accept null args.
+
+
+* w3-beta.el: New function to read a netscape-style configuration file.
+
+Fri Feb 10 06:19:26 1995  William Perry  <address@hidden>
+
+
+Tue Feb  7 15:51:23 1995  William Perry  <address@hidden>
+
+* w3-e19.el:
+Removed the file-name-handler-alist, to put it in url.el where it belongs.
+
+* w3.el:
+Finding the source of a url that is already in a buffer should work now.
+
+* w3-draw.el, w3-beta.el:
+Now will always get a 'completed' message when drawing/imaging.
+
+Mon Feb  6 02:13:31 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fix for emacs 18
+
+* w3-forms.el, w3-parse.el:
+Optimized the calling of w3-nuke-entities-in-region.  Parsing _much_
+faster, drawing only slightly slower, so its a win.
+
+* w3-draw.el: Semi-incremental display now works in all emacsen, and recognizes
+scroll-up and C-c to interrupt.
+
+* w3-draw.el: Fixed plaintext handling.
+
+Sun Feb  5 23:41:28 1995  William Perry  <address@hidden>
+
+
+* w3-e19.el, w3-vars.el: Fixed view menu.
+
+* w3-vars.el, w3.el:
+Let w3-color-filter be a string, for people brave enough to want to
+set it themselves.
+
+* w3-epoch.el: Now works with new display engine.
+
+* w3-draw.el: Few problems for epoch fixed, <br> in <dl> looks right now.
+
+* w3-draw.el: Reimplemented w3-link-delimiter-info
+
+* w3-draw.el: Re-implemented the 'linkname value of w3-delimit-emphasis
+
+
+* dist.Makefile:
+Removed hack to change w3.texinfo on the fly when creating info file.
+
+Sat Feb  4 18:11:14 1995  William Perry  <address@hidden>
+
+* w3.el: Removed setting of default-directory because it causes call-process to
+die a hideous death and not let you do anything like M-| lpr in the
+source buffers.
+
+
+* w3.el: Replaced w3-confirmation-func with url-confirmation-func
+
+Fri Feb  3 13:42:35 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+fixed insertion of w3-link-end-delimiter - was always inserting the
+'not visited' part.c
+
+Tue Jan 31 20:45:19 1995  William Perry  <address@hidden>
+
+* w3-e19.el: Right-mouse-menu now works
+
+Mon Jan 30 04:52:26 1995  William Perry  <address@hidden>
+
+* w3.txi: Added non-unix OS sections.  Need to flesh them out more.
+
+Sun Jan 29 22:15:48 1995  William Perry  <address@hidden>
+
+* w3-vars.el: Added w3-style-tags-assoc
+
+* w3-draw.el, w3-vars.el:
+Added new variable w3-right-justify-address to control whether
+text within an <address> tag is right justified.  Defaults to t.
+
+* w3-vars.el: Few new variables for fsf19
+
+* w3.el: Removed special cases for fsf19 to use the old lmenu package.
+
+* w3-e19.el: No longer needs the lmenu package.
+
+* w3-draw.el: Fixed typo
+
+* w3-epoch.el: Made all arguments to w3-make-face optional.
+
+* w3-draw.el: Few more fixes for epoch.  No longer have to remove \n\n, so
+incremental display looks better.  w3-delimit-emphasis now works in
+the new display engine.
+
+
+* w3.txi: Lots of cleanup work, addition of netscape extensions, new HTML 3.0
+stuff, variable name changes, xresource changes, all for the new
+display engine.
+
+Sat Jan 28 23:07:36 1995  William Perry  <address@hidden>
+
+* w3.el: Deal with url-get-url-at-point possibly returning nil.
+
+* w3-epoch.el: Got rid of error in new display engine.
+
+* w3-draw.el: w3-draw.el will now compile with emacs 18 again - the incremental
+display was messing it up.
+
+* w3-beta.el, w3-draw.el, w3-e19.el, w3-emacs.el, w3-epoch.el, w3-forms.el, 
w3-lemac.el, w3-mac.el, w3-mule.el, w3-next.el, w3-old.el, w3-parse.el, 
w3-print.el, w3-srch.el, w3-vars.el, w3-wemac.el, w3-xemac.el, w3.el:
+Added headers for finder package
+
+* w3-draw.el: Make sure w3-link-end-delimiter is never on a line by itself
+
+Thu Jan 26 04:56:42 1995  William Perry  <address@hidden>
+
+* w3-vars.el:
+moved w3-mule-retrieval-coding-system to url-mule-retrieval-coding-system
+
+Wed Jan 25 15:38:50 1995  William Perry  <address@hidden>
+
+* w3-beta.el:
+Added definition for (abs x) if none exists (for emacs 18, epoch, compat.)
+
+Mon Jan 23 03:32:40 1995  William Perry  <address@hidden>
+
+* w3.txi: Removed w3-bad-server-alist
+
+Sun Jan 22 21:53:19 1995  William Perry  <address@hidden>
+
+
+* w3-draw.el: Fixed space problems, hopefully for good.
+
+* w3-e19.el: New options item for relying solely on the cache
+
+Sat Jan 21 20:27:22 1995  William Perry  <address@hidden>
+
+* w3.el: Fixed problem where default-directory would sometimes be set to nil -
+bad things man!
+
+* w3-beta.el: replaced all occurances of htmlplus with html
+
+* w3-draw.el:
+Fixed problem with plaintext and embed.  <lit> now acts like <pre>,
+but with no mono-spaced font.  Fixed problem with null titles (empty
+string invalid for buffer name error).  <blink> works on xemacs 19.12
+in tty mode.  Small problem with <pre> segments with whitespace at
+beginning fixed.  A few small hacks to handle some pythia markup.
+
+* w3-e19.el:
+Protect against copying menu-bar-help-menu if in tty mode.  Also no
+longer disable the edit menu when in w3-mode.
+
+* w3-parse.el:
+Fixed problem with plaintext and embed.  <lit> now acts like <pre>,
+but with no mono-spaced font.
+
+* w3.el: replaced all occurances of htmlplus with html
+
+Wed Jan 18 02:31:59 1995  William Perry  <address@hidden>
+
+* w3-parse.el:
+fixed bug in w3-nuke-entities-in-region if nonterminated entity was
+last thing in a buffer (ie: &lt[EOB]);
+
+* w3.el: Remove duplicate links from links-alist when doing a completing-read
+on the links.
+
+Tue Jan 17 13:18:13 1995  William Perry  <address@hidden>
+
+* dist.Makefile: Make install should now copy w3.elc to the dest. directory
+
+Mon Jan 16 03:52:57 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Better handling of faces.
+
+* w3.el: Implemented <input type=file>
+
+Sat Jan 14 22:40:58 1995  William Perry  <address@hidden>
+
+* w3-parse.el: More spacing taken care of
+
+* w3-draw.el: Few fixes to <pre></pre> presentation
+
+Thu Jan 12 15:39:37 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed formatting problem with <dd>
+
+Mon Jan  9 23:20:05 1995  William Perry  <address@hidden>
+
+* w3-print.el: Few fixes for ps-print 1.6 and 1.10
+
+* w3-parse.el: Recognizes the <embed> tag and treats it like XMP for parsing.
+
+
+Sun Jan  8 19:07:28 1995  William Perry  <address@hidden>
+
+* w3-draw.el, w3-emacs.el, w3-parse.el:
+Various changes to make the new display engine work under emacs 18.xx
+
+* docomp.el: more defvars for cleaner compile
+
+* w3-draw.el: Fixed more of the spacing problems
+
+* w3-e19.el:
+Fixed some of the spacing problems when using w3-emacs19-hack-faces-p
+
+* w3.el: Added w3-follow-url-at-point-other-frame
+
+Sat Jan  7 20:29:06 1995  William Perry  <address@hidden>
+
+* w3-parse.el:
+Fix for odd problem where an entity at the very end of a line (or
+flush against the next tag) would get left out of the parse structure.
+Ugh!
+
+* w3.el: Added new variable url-inhibit-uncompression for use when dumping to
+disk - very wasteful to uncompress it, store it in a buffer, then
+recompress when it got written out to disk.  Also changed the file:
+and ftp: handling to use copy-file when w3-dump-to-disk is bound and
+non-nil, so we can hopefully get asynchronous dumping-to-disk done.
+
+* w3-draw.el: More fixes for funky spacing
+
+* w3-old.el, w3-parse.el:
+Remove \r's in <pre> and <xmp> segments, for ugly DOSisms.
+
+Fri Jan  6 18:31:07 1995  William Perry  <address@hidden>
+
+* w3-draw.el, w3-parse.el:
+Can now change the index of an ordered list item (<li value=xxx>0
+
+* w3-print.el:
+w3-print-with-ps-print now works with ps-print 1.6, and uses the headers, etc.
+
+* w3-draw.el, w3-e19.el: Fixed links menu in v19
+Few drawing fixes
+
+Thu Jan  5 20:50:06 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Now does 'lazy' creation of faces... this reduces the memory
+requirements when in X, since a lot of the faces will probably never
+be used.
+
+* w3-parse.el: Fixed weird spacing problem after <font> tags finally.
+
+* w3.el: Make sure that facep is defined in all versions of emacs
+
+* w3-vars.el:
+Changed the mail and print menus to be pull-right for xemacs/lemacs
+
+* w3-e19.el:
+Fixed the links menu to gracefully do nothing if there are no links on
+the page (was giving an 'Empty menu' error)
+
+Mon Jan  2 21:51:34 1995  William Perry  <address@hidden>
+
+* w3-e19.el: changed default of the mouse-face for links
+
+* w3.el: Removed extraneous newline from mail headers
+
+
+* w3-e19.el, w3.el:
+w3-mail-current-document can now take an optional 'format' parameter
+so that the mail menus can be pull-right.  Spiffy, eh?  Also now
+sticks in content-type and content-transfer-encoding headers.
+
+* w3-print.el:
+w3-print-this-url can now take an optional 'format' parameter so that
+the print menus can be pull-right.  Spiffy, eh?
+
+* w3-draw.el: Quicker way of right-justifying something.
+
+* w3.el, w3-beta.el, w3-print.el:
+Moved all the printing code into w3-print.el, and added the postscript
+option.  Changed the makefile to concatenate all the appropriate files
+for the beta or old version, sort of like VM.
+
+
+* w3-draw.el:
+Added <menu> and <dir> tags back in, as well as a few hacks to make
+Jamie Z.'s page look prettier. :)
+
+* w3-beta.el: Fixed importing of netscape cache
+
+* w3-beta.el: Added w3-import-netscape-cache, to convert a netscape-style cache
+directory to the emacs-w3 style.
+
+Sun Jan  1 09:59:25 1995  William Perry  <address@hidden>
+
+* w3-vars.el: Made w3-e19-links-menu buffer-local
+
+* w3-e19.el: Reinstituted the 'Links' submenu.
+
+
+Sat Dec 31 07:13:21 1994  William Perry  <address@hidden>
+
+* w3-parse.el: Various cleanups
+
+* w3.el: w3-mail-to-author now checks for the 'Reply-To' header of an HTTP/1.0
+response before checking the 'link' tags.
+
+Fri Dec 30 17:04:45 1994  William Perry  <address@hidden>
+
+* w3-old.el: Removed use of w3-last to avoid having to use cl.
+
+* w3.el: Added checks to see if url-view-url returned nil instead of file:nil
+Removed definition of w3-last
+
+* w3-draw.el: Fixed <secret> tag.
+
+Thu Dec 29 16:03:40 1994  William Perry  <address@hidden>
+
+* w3-parse.el:
+Added more stuff to get rid of windows-specific character references.
+
+* w3.el, w3-old.el: Moved defadvice stuff to w3-old
+
+* w3-e19.el:
+Totally reworked the menus as emacs19 keymaps.  This speeds them up.
+Also added routines to add AIR Mosaic hotlists to the menus
+automatically.  Works well.  First time through causes a bit of a
+slowdown for lots of hotlists, but this is emacs' problem since it
+needs to scan all the keymaps to create the menu.
+
+* w3-draw.el:
+New variable w3-indent-level to control how many spaces to indent list
+items, blockquotes, etc.  This is necessary so that the user doesn't
+have to change tab-width or tab-stop-list to change this formatting
+(so <pre> segments that use tabs will still be formatted correctly).
+
+Also made </pre> close out all character-level formatting attributes
+ala Arena.
+
+<pre> will also cause a paragraph break - chunks of text before a
+<pre> segment weren't getting filled correctly.
+
+Made <dt> tags cause a paragraph break.  Formatting now looks better,
+and beginning of <dl> list is separated better from the rest of the
+document.
+
+Fixed problem with w3-list-chars-assoc causing an error with the new
+display engine.
+
+Fixed problem where &gt; followed immediately by another tag wasn't
+showing up in the new display.
+
+* w3-beta.el: Added parser for AIR Mosaic style hotlists.
+
+Tue Dec 27 21:24:37 1994  William Perry  <address@hidden>
+
+
+* w3-beta.el, w3-e19.el:
+Added a dropdown history list that shows the last 5 homepages visited
+under the 'Go' menu
+
+* w3.el: Changed the viewer handling so that temp files have a correct filename
+extension (for broken things like Frame that won't read in a file
+without the 'correct' file extension).
+
+Mon Dec 26 18:18:43 1994  William Perry  <address@hidden>
+
+
+* w3-beta.el:
+(New display engine) Fixed bug in the new personal annotations code
+that ws not closing the list.
+
+* w3-forms.el:
+(New display engine) Fixed bug in <select> handling where it would
+never find the correct name.  Also put back in support for <select
+multiple>.
+
+
+* w3-vars.el: Added in all the rest of the entities
+
+* w3-vars.el:
+Fixed problem where reloading of a page would set the 'Referer' field
+of an HTTP/1.0 request to the url of the page being loaded.
+
+
+* w3.el: Changed gopher searches and ask block submissions to use the enctyp
+attribute like other types of searching.  More extensible/easier to
+maintain.
+
+* w3-draw.el, w3-beta.el:
+Personal annotations now work in the new display engine.  Visible
+headers will work soon also.
+
+* w3-beta.el, w3-draw.el, w3-e19.el, w3-emacs.el, w3-epoch.el, w3-forms.el, 
w3-lemac.el, w3-mac.el, w3-mule.el, w3-next.el, w3-old.el, w3-parse.el, 
w3-srch.el, w3-vars.el, w3-wemac.el, w3-xemac.el, w3.el:
+Updated copyright notices for 1995
+
+Sun Dec 25 22:30:16 1994  William Perry  <address@hidden>
+
+* dist.Makefile:
+Renamed w3.el to w3-main.el and create w3.elc from w3-main.elc and
+either w3-beta.elc or w3-old.elc
+
+
+* w3-e19.el, w3-lemac.el, w3-wemac.el, w3-xemac.el, w3.el: More menu changes
+
+* w3-print.el: Initial revision
+
+* w3-beta.el: Changed w3-face-type to return 'both if a face is bold and italic
+
+
+* w3-beta.el: Initial revision
+
+* w3-parse.el, w3-forms.el, w3-draw.el:
+Added provide statements for easier loading
+
+* w3.el: Moved loads of old code into w3-old.el
+
+* dist.Makefile: Added new targets beta and old.
+
+* w3-old.el: Initial revision
+
+* w3-draw.el: Made new display engine honor the w3-list-chars-assoc header.
+
+* w3-vars.el: Moved some old vars out to w3-old.el
+
+Sat Dec 24 20:41:46 1994  William Perry  <address@hidden>
+
+* w3-e19.el: Fixed w3-mouse-handler to work with the new display engine.
+
+Fri Dec 23 22:40:38 1994  William Perry  <address@hidden>
+
+* w3-forms.el, w3.el: Added in handler for <input type=range size="min,max">
+
+
+* w3-draw.el: Added function comments.
+
+* w3-draw.el:
+Rearranged the file a lot, and added support for the named BASE tags
+from HTML 3.0 - pretty cool stuff. :)
+
+Thu Dec 22 23:53:59 1994  William Perry  <address@hidden>
+
+
+* w3-draw.el: Various fixes to the parser to deal with bad html.  Automatically
+include the alt tag for an image if it is a link target, regardless of
+the setting of w3-auto-image-alt.
+
+* w3-parse.el: Various fixes to the parser to deal with bad html
+
+Mon Dec 19 00:30:38 1994  William Perry  <address@hidden>
+
+
+* w3-e19.el: Added 'xterms' as a terminal type.
+
+* w3.el: Changed w3-submit-bug to only send truly useful info.
+
+Sun Dec 18 23:42:30 1994  William Perry  <address@hidden>
+
+* docomp.el: Stifle more warnings in new xemacs
+
+* w3-vars.el, w3.el, w3-draw.el:
+Changed the behavior of w3-auto-image-alt so that it could be a string
+for 'format'.
+
+* docomp.el: Stifle more warnings
+
+* w3-parse.el, w3-draw.el:
+Changed w3-handle-unknown-tag to check if 'w3-handle-<tag>' is
+defined, and if so, to record that function as the handle for that
+tag.  This will cut down on maintenance of the top block of code that
+just does a lot of (put 'w3-formatters 'xxxx 'w3-handle-xxxx).  XMP
+sections will now also work correctly.
+
+* w3-parse.el:
+Now deals with comments properly, and can handle the old (broken)
+comments of Mosaic/X
+
+Fri Dec 16 19:23:35 1994  William Perry  <address@hidden>
+
+* w3-e19.el: More fixes to w3-forward-link
+
+* w3-draw.el: Fixed a few things with faces
+
+Thu Dec 15 23:08:54 1994  William Perry  <address@hidden>
+
+* w3-e19.el: Fixed w3-forward-link to work better with the new display engine.
+
+Wed Dec 14 17:55:30 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed a few problems with forms and the new display engine.
+
+* w3-xemac.el: Name changes (screen->frame)
+
+Tue Dec 13 17:56:45 1994  William Perry  <address@hidden>
+
+* w3-draw.el: Added a few optimizations for the <blink> tag.
+
+* w3-draw.el: Added in creation of 'underline' face if it is not defined.
+
+* w3-forms.el, w3.el:
+Changed the maxlength to being unlimited if unspecified, to conform to
+the new HTML 2.0 spec.
+
+* w3.el: Fixed bug in w3-document-informatino where it was relying on
+url-current-mime-headers when it wasn't guaranteed to be the same.
+
+Mon Dec 12 23:22:21 1994  William Perry  <address@hidden>
+
+* w3-vars.el, w3.el: Added function w3-document-information
+
+* w3-vars.el, w3-wemac.el, w3-xemac.el, w3-e19.el, w3-lemac.el:
+Added new 'view' menu.
+
+* w3.txi: Removed hook for gnus-article-prepare-hook - was corrupting uuencoded
+articles.
+
+
+* w3-xemac.el, w3-lemac.el:
+Fixed problem with image menus if graphic was a link
+
+* w3-epoch.el, w3-lemac.el, w3-xemac.el:
+More stuff to deal with changed names, and crypt++/jka-compr
+
+* w3.el: Fixed big problem in reset buttons on forms.
+
+* w3.el: Now supports the 'action', 'src', and 'prompt' attributes on the
+isindex element.  (new display engine only)
+
+* w3-draw.el: Now supports the 'action', 'src', and 'prompt' attributes on the
+isindex element.
+
+* w3-vars.el: Changed lots of the version variables so that they don't rely on
+having the RCS headers in them.
+
+* w3.el: Changed w3-mode so that if it is called interactively it will act like
+w3-preview-this-buffer.
+
+* w3.el: Changed w3-source-document so that it can reuse source buffers if the
+users wants to.
+
+Sun Dec 11 08:41:52 1994  William Perry  <address@hidden>
+
+
+* w3-draw.el:
+Added in code to scale fonts for <h[1-6]> so they are bigger, etc, if in 
XEmacs/Lemacs
+
+* w3.el: Few changes for asynch mode.
+
+
+Sat Dec 10 01:07:05 1994  William Perry  <address@hidden>
+
+* w3-xemac.el:
+Added some stuff to optimize the echoing of the URL in the minibuffer
+(not so many calls to mode-motion-hook, all done in the mouse-handler
+by using the 'help-echo property).  Is smart enough to notice if
+'help-echo is not defined and still use the old way if necessary.
+Also changed the image code so that it sets the 'detachable property
+so that images won't get nuked if the text they are attached to is
+deleted.
+
+Fri Dec  9 22:34:04 1994  William Perry  <address@hidden>
+
+* w3-draw.el: Few tweaks
+
+* w3-forms.el:
+Fixed problem with other markup (especially other form info) within a <select>.
+
+* w3-parse.el: Added status messages to parsing.
+
+* docomp.el: More vars to get rid of warnings.
+
+Thu Dec  8 21:16:09 1994  William Perry  <address@hidden>
+
+* w3-draw.el: Added in lots of the 'top ten' html tags. :)
+
+* w3-draw.el: Added <blink> stuff, and rewrote the init-state function.
+
+* w3-vars.el: Added w3-do-blinking to control whether <blink> </blink> works
+
+* w3-draw.el: Handle pinhead
+
+Wed Dec  7 15:47:47 1994  William Perry  <address@hidden>
+
+* w3.el: Fixes to wais stuff
+
+* w3-draw.el: Added indenting for blockquote tags.
+
+* w3-epoch.el, w3-wemac.el, w3-lemac.el, w3-xemac.el, w3-emacs.el, w3-e19.el:
+Let w3-back-link and w3-forward-link accept negative arguments and
+call each other if they get one.
+
+Tue Dec  6 22:16:34 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed typo in docs.
+
+* w3.el:
+Fixed w3-source-document so it will issue an error if done in a non-w3 buffer.
+
+* w3-vars.el: Fixed typo in docs.
+
+* w3.el: Patch from Michael Erns (address@hidden) to make
+w3-complete-link act like w3-follow-link when no menu item is
+specified.  That makes it act more like Info mode, and so is more
+intuitive to users used to it.
+
+* w3.el: Now set default-directory when sourcing a document
+
+* w3-forms.el: Added error checking to the <textarea> handling to deal with
+non-terminated textareas.
+
+* w3-forms.el:
+Added error checking to all the forms code to make sure you are within
+a <form> before doing anything.
+
+* w3-draw.el: Added support for the 'fig tag.
+
+* w3-draw.el: Changed how the <title> tag is handled.
+
+
+* w3-draw.el: Added SPRY align tag.
+
+* w3-forms.el: Trimmed lots of crap that is duplicated from w3.el
+
+* w3-draw.el:
+<pre> and <xmp> segments within a list item will now be indented correctly.
+
+* w3-draw.el: Fixed list filling after headers and br's
+
+* w3-draw.el: Few changes to the <hr> handling
+
+* w3.el, w3-draw.el:
+New variable w3-auto-image-alt that controls whether emacs-w3 will
+automatically generate the 'alt' text on an image where it was not
+specified.
+
+
+Mon Dec  5 23:54:51 1994  William Perry  <address@hidden>
+
+
+* w3-draw.el, w3-e19.el, w3-parse.el:
+Misc Changes to get around idiotic font tag
+
+
+* w3-draw.el: Center tag will now override header/paragraph stuff.
+
+* w3-draw.el: More image work.
+
+* w3-parse.el: Fixed problem if a tag was flush against a newline.
+
+* w3-vars.el: Added jpegs as a default inlined image type.
+
+* w3-xemac.el, w3-lemac.el: fixed problem with new parser and xemacs/lemacs
+
+* w3-parse.el: Fixed problem with entities.
+
+* w3-e19.el, w3-srch.el: more name changes
+
+* w3.el: Fixed problem if w3-default-homepage was nil.
+
+* w3-draw.el: <link> tags now work correctly.
+
+Sat Dec  3 23:05:24 1994  William Perry  <address@hidden>
+
+* w3-parse.el: Problem with entities lt and gt fixed a little.
+
+* w3.el: More naming changes.
+
+* w3-draw.el: <select> and <option> tags now work correctly.
+
+* w3-emacs.el: Added a few checks in for the amiga 18.5x emacs.
+
+* w3-forms.el: <select> and <option> tags now work correctly.
+
+* w3-draw.el: Added support for the 'note' tag.
+
+Fri Dec  2 18:05:31 1994  William Perry  <address@hidden>
+
+* w3.el:
+Fixed bug in w3-view-this-url that would message 'nil' in the minibuffer.
+
+* w3-draw.el: Now remembers "id" and "name" attributes on any tag.
+
+* w3-draw.el: Various fixes to painting.
+
+* w3-draw.el, w3-epoch.el, w3-forms.el, w3-parse.el, w3-srch.el:
+More name changes, handling or PRE/XMP
+
+* w3.el: Fixed problem in w3-fetch if url-request-method was nil.
+
+* w3-draw.el: Now correctly handles pre,/pre,xmp,and /xmp
+
+Thu Dec  1 17:21:34 1994  William Perry  <address@hidden>
+
+* w3-draw.el: Added new tags
+
+Wed Nov 30 18:48:41 1994  William Perry  <address@hidden>
+
+* w3-e19.el: Added vt300 to the hack-faces stuff.
+
+Mon Nov 28 17:11:38 1994  William Perry  <address@hidden>
+
+* w3-epoch.el, w3-lemac.el: More misc. name changes
+
+Wed Nov 23 21:12:59 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem when posting to a form, w3-reuse-buffers would reuse the
+'source' of the form.  Ugh.
+
+Tue Nov 22 15:37:02 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem in 'isindex' forms processing.
+
+Sun Nov 20 04:44:42 1994  William Perry  <address@hidden>
+
+* w3-draw.el, w3-forms.el, w3-mule.el, w3-vars.el, w3-xemac.el, w3.el:
+Lots of name changes from w3-* to use the native url-* functions
+
+Fri Nov 18 22:46:59 1994  William Perry  <address@hidden>
+
+* w3-vars.el: Added binding of Shift-tab for w3-back-link
+
+Thu Nov 17 20:52:03 1994  William Perry  <address@hidden>
+
+* w3-mule.el: Fixes for mule 2.1 from Shin-ya Sato <address@hidden>
+
+Mon Nov 14 17:02:29 1994  William Perry  <address@hidden>
+
+* w3-new.el: Initial revision
+
+Tue Nov  8 17:57:57 1994  William Perry  <address@hidden>
+
+
+* w3.el: Fixed handling of base tag
+
+Mon Nov  7 22:09:35 1994  William Perry  <address@hidden>
+
+* w3-draw.el: Correctly reset the state when going into w3-draw-html
+
+* w3-parse.el: Misc. fixes
+
+Sun Nov  6 07:19:52 1994  William Perry  <address@hidden>
+
+* w3-draw.el: Relative links work correctly now
+
+* w3-draw.el, w3-forms.el, w3-parse.el: Initial revision
+
+Fri Nov  4 22:43:44 1994  William Perry  <address@hidden>
+
+* w3.el: Support for STYLE attribute on ordered lists.  Supports i, I, a, A.
+Also still supports the HTML+ 'ROMAN' attribute.  Supports the VALUE
+attribute on the LI tag to change the value of a list item and all
+following items.
+
+* w3.el: Changed the advice for w3-*-link to use deactivate-mark if it is
+bound.  This gets rid of the problem of w3-*-link highlighting the
+region if in emacs-19 and in transient-mark-mode.
+
+Thu Nov  3 23:50:47 1994  William Perry  <address@hidden>
+
+* w3-epoch.el, w3-lemac.el, w3-xemac.el:
+Only send Accept: lines for the inlined images we accept when
+transferring an image
+
+Wed Nov  2 00:47:38 1994  William Perry  <address@hidden>
+
+* w3.el: Let the variable shell-file-name take precedence over environment
+variables and guessing
+
+* w3-e19.el, w3-vars.el:
+Added w3-echo-link to control what is displayed in the minibuffer in
+emacs-19.  'url, 'text, or nil.
+
+* w3.el: Added encoding type of application/ramp to forms
+
+Tue Nov  1 18:36:08 1994  William Perry  <address@hidden>
+
+
+* w3-vars.el: Removed definition of w3-using-proxy
+
+* w3.el:
+Fixed w3-find-this-file to work correctly for users other than anonymous
+
+* w3.el: Fixed problem where sentences ending with ! or ? had the ! or ? eaten.
+
+* w3.el: Added check for checkboxes/radio boxes that are turned off.
+
+Mon Oct 31 23:16:04 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed a stupid bug in the ....-other-frame
+
+* w3-e19.el: Changed binding from [shift mouse-2] to [S-mouse-2] -ugh
+
+* w3.el: Added functions w3-follow-link-other-frame and w3-fetch-other-frame
+
+* w3-lemac.el, w3-xemac.el, w3-e19.el:
+Added shift-middle-button default binding to be follow-link in other frame.
+
+Fri Oct 28 22:42:10 1994  William Perry  <address@hidden>
+
+* w3-vars.el: Can now pass parameters to url-current-callback-func
+
+Thu Oct 27 19:14:08 1994  William Perry  <address@hidden>
+
+* w3.el: Strip spaces off of the title after truncating it to 50 characters.
+
+Wed Oct 26 15:41:14 1994  William Perry  <address@hidden>
+
+* w3-vars.el: A few changes to how the entities are interpreted
+
+* w3.el: Now correctly strips off spaces from the front of a URL
+when in w3-fetch
+
+Tue Oct 25 17:28:43 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed <option value=xxx> handling for multiple selection lists.
+
+* w3.el: Fixed handling of the SIZE attribute of a SELECT tag.  Select MULTIPLE
+will now also allow different OPTION tags to have the SELECTED
+attribute.  Changed w3-insert-entities-in-string to use
+w3-html-entities, so it gets all the entities, not just the 6 or 7
+that were hardcoded in.
+
+Wed Oct 12 16:22:05 1994  William Perry  <address@hidden>
+
+
+Tue Oct 11 23:11:34 1994  William Perry  <address@hidden>
+
+* w3.el: More spacing at end of sentences hacks for ? and !
+
+* w3-vars.el: No longer rebind C-k - bad thing.
+
+* w3.el: Don't double-space after Prof.
+
+Tue Oct  4 01:17:33 1994  William Perry  <address@hidden>
+
+
+* w3.el, w3-vars.el:
+Changed w3-reuse-buffers to accept 'yes/no 'reuse/reload and 'always/never
+
+Mon Oct  3 14:04:15 1994  William Perry  <address@hidden>
+
+* w3-vars.el, w3.el:
+Patch for the inlined image processing for the buggy current release
+of ppmdither and viewing black and white gifs.  Also added comments to all
+the html entities in w3-html-entities.
+
+Fri Sep 30 21:28:54 1994  William Perry  <address@hidden>
+
+* w3.el:
+Fixed problem with paragraph just after an <hr> not being filled correctly.
+
+* w3-vars.el: Added more HTML entities
+
+Thu Sep 29 20:13:53 1994  William Perry  <address@hidden>
+
+* w3.el: Removed problem with first header having a blank line in it.
+
+* w3-e19.el, w3-emacs.el, w3-mule.el, w3-vars.el, w3.el:
+Lots of patches from Shin-ya Sato <address@hidden> to make
+w3 work with mule 2.0
+
+Tue Sep 27 23:58:36 1994  William Perry  <address@hidden>
+
+* w3.el: Now sends the NAME and VALUE of submit buttons if the submit button
+has a NAME.
+
+
+Mon Sep 26 18:51:52 1994  William Perry  <address@hidden>
+
+* w3.el: Change to w3-form-encode-multipart/x-www-form-data to include the
+content-length of each item
+
+Fri Sep 23 16:14:50 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem in w3-backward-in-history       when no back link was 
found.
+
+* w3-vars.el:
+Fixed setting of w3-running-FSF19 to take into account XEmacs 19.12
+
+Thu Sep 22 23:24:48 1994  William Perry  <address@hidden>
+
+* w3-lemac.el: Fixed problem in w3-insert-graphic where it would always do a
+url-file-attributes, even if we had the image loaded. (with
+url-be-anal-about-file-attributes == t, it would do a HEAD, which was
+stupid)
+
+* w3.el: Fixed forms doubling problem in FSF emacs 19 when doing a reset.
+
+* w3-vars.el, w3.el:
+New variable w3-track-last-buffer.  If non-nil, M-x w3 will take you
+to the last w3 buffer you fetched, instead of loading your home page.
+If the last buffer has been killed, then it acts normally and loads
+the home page.
+
+* w3.el: Changed w3-submit-bug
+
+
+* w3.el: patch from address@hidden to fix reporter problems in
+emacs 19.xx
+
+Wed Sep 21 17:25:16 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed small bug in DL handling when no <dt> items present
+
+
+* w3.el: Fixed problem in w3-pass-to-viewer if "/" is the filename, would get
+"" as the buffer-name, which would choke.
+
+* w3.el:
+Fixed bug in w3-delimit-emphasis w/headers that had spaces/newlines in them
+
+Tue Sep 20 18:04:03 1994  William Perry  <address@hidden>
+
+
+* w3.el:
+Fixed handling of blockquote's so they have a <p> at the beginning and end.
+
+
+Sun Sep 18 20:15:42 1994  William Perry  <address@hidden>
+
+* w3.txi: Few minor changes
+
+* w3.el: Changed w3-upcase-region so that it will take care of entities in the
+region.  ie: &auml; -> &Auml;, etc.
+
+* w3-e19.el:
+Fixed problem where the URL was not shown in the minibuffer if you hit
+'f' from a point in the document that was not a link.
+
+Fri Sep 16 17:18:03 1994  William Perry  <address@hidden>
+
+* w3-mac.el, w3.el: Lots of little fixes
+
+* w3-vars.el: Removed the old, redundant w3-gateway-x variables
+
+* w3-hypb.el: Removed all the code, since Hyperbole 3.12 handles it for you.
+
+Thu Sep  8 15:54:36 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem where the o/*/etc at the front of <dt> items would be
+upper-cased sometimes
+
+* w3.el: Started using reporter.el instead of rolling my own error logging
+routines.
+
+* w3-e19.el: w3-emacs19-unhack-faces now turns w3-delimit-emphasis and
+w3-delimit-links on.
+
+* w3-e19.el:
+w3-forward-link and w3-backward-link now ignore links without href's
+
+* w3.el: w3-complete-link now ignores links without href's
+
+* w3-vars.el, w3.el:
+Added new variable w3-source-file-hooks that is run after sourcing a document.
+
+* w3.el: Fixed problem with not quoting an align attribute when filling in
+defaults in w3-fix-paragraphs-in-region
+
+* w3.el: Fixed formatting problem with <dl>s finally
+
+Wed Sep  7 23:22:21 1994  William Perry  <address@hidden>
+
+
+* w3.el: Patch for not putting 2 spaces after Mr/Ms/Mrs.
+
+* w3-e19.el, w3.el:
+Lots of fixes brought about by Axel Boldt <address@hidden>
+
+
+* w3.el: Fixed problem in w3-finish-text-entry when deleting the sole window
+
+* w3-e19.el, w3-lemac.el, w3-wemac.el, w3-xemac.el, w3.el:
+Fix from address@hidden for converting newlines in
+menu entries/completions on links to spaces.
+
+
+* w3.el: Fixed dl attribute munging in w3-fixup-bad-html
+
+* w3-e19.el, w3-mule.el, w3.el: Misc. changes for Mule 2.0
+
+Tue Sep  6 21:07:16 1994  William Perry  <address@hidden>
+
+* w3-e19.el, w3-emacs.el, w3-epoch.el, w3-lemac.el, w3-xemac.el:
+Got rid of code to not interfere with hyperboles mouse-bindings, since
+it has changed to only use shift-clicks
+
+Sat Sep  3 21:50:09 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem where if url-be-asynchronous was non-nil,
+w3-show-history and w3-show-hotlist would fail.
+
+Fri Sep  2 18:42:25 1994  William Perry  <address@hidden>
+
+* w3.el: url-buffer-visiting now strips off the #xxx links.
+If reusing a buffer, the #xxx works will now work also.
+
+* w3-vars.el: Used real symbol for (TM) (&trade;)
+
+Sun Aug 28 22:41:15 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem with <dl> lists when there were no <dt> items.
+
+* w3.el: Fixed bug where hotlist urls were getting hexified too often
+
+
+Thu Aug 25 17:15:52 1994  William Perry  <address@hidden>
+
+* w3.txi: Few fixes to @cindex areas
+
+Tue Aug 23 12:30:18 1994  William Perry  <address@hidden>
+
+* w3.el: Added code to automatically call w3-update-hotlist-menu after all
+hotlist modification functions
+
+Mon Aug 22 02:30:51 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem with the new w3-fix-unknown-tags
+
+Sun Aug 21 23:34:49 1994  William Perry  <address@hidden>
+
+* w3.el: The isindex tag can now have an action=xxx specifier.  Works the same
+as link rel=index
+
+* w3.el: Don't include the [[ and ]] in w3-complete-link
+
+
+* w3-vars.el, w3.el:
+Added a 'debug' mode.  If w3-debug-html is non-nil, then display
+all semi-buggy html with error messages in a separate buffer
+that is displayed at the end of the parse.
+
+* w3-lemac.el, w3-vars.el, w3-wemac.el, w3.el:
+Added w3-xemac.el for the upcoming XEmacs 19.12 release
+
+* w3-xemac.el: Initial revision
+
+* dist.Makefile: Added w3-xemac.el
+
+
+* w3-vars.el: Changed how w3-version-number is created.
+
+* w3.txi: Added section on inlined images/mpegs
+
+* w3.el: w3-goto-last-buffer now works if w3-be-asynchronous == t
+
+* w3.el, w3-e19.el:
+Fixed emacs-19 forms problem - overlays would run together and mess up
+form entry.  Also fixed problem in the highlighting of links.
+
+Sat Aug 20 22:21:06 1994  William Perry  <address@hidden>
+
+
+* w3.txi, w3.el: Lots of changes suggested by Axel Boldt.
+
+* w3-e19.el: w3-forward-link and w3-back-link will show the link under point
+
+Thu Aug 18 12:56:43 1994  William Perry  <address@hidden>
+
+
+* w3-e19.el, w3-mac.el, w3.el: removed need for w3-quotify-percent hack
+
+Mon Aug 15 03:57:29 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed multipart viewer
+
+Sun Aug 14 22:50:31 1994  William Perry  <address@hidden>
+
+* w3.el: Made w3-popup-info interactive
+
+* w3-hypb.el: More error checking in hwww:start.
+
+* w3-vars.el: Added view source to the hyperlink-menu
+
+* w3-wemac.el, w3.el: More fixes to work under DOS/Windows
+
+
+* w3.el: Fixed x-www-form-urlencoded encoding.  Was stripping off the first
+character sometimes when it shouldn't have been.
+
+* w3-vars.el: Removed  bogus definition of w3-directory-format
+
+* w3-lemac.el, w3-e19.el:
+Fixed w3-mouse-handler so it doesn't need to muck with the % signs anymore.
+
+* w3-lemac.el, w3-e19.el: New links menu constructor
+
+* w3.el: Default URL for w3-fetch is now smarter.
+
+* w3.el: Fixed w3-complete-link so that it will not show extraneous markup in
+the completing-read
+
+* w3-srch.el, w3-lemac.el, w3-wemac.el, w3-epoch.el, w3-emacs.el, w3-e19.el:
+New w3-map-links - now passes the start and end positions to the
+appropriate function
+
+
+* w3.el: Forms fix for MAXSIZE, message when storing into the kill ring so the
+user has some sort of feedback, <P ID=xxx> works now.
+
+* w3-vars.el: New hotlist key bindings.
+
+Fri Aug 12 13:26:02 1994  William Perry  <address@hidden>
+
+* w3-lemac.el: Removed the * .5 so w3-lemac.el can compile under emacs 18
+
+* w3.el: Few fixes for using under windows.
+
+* w3.el: Fixed problem with directory-files with no <title> causing
+rename-buffer to fail.
+
+Thu Aug 11 13:56:35 1994  William Perry  <address@hidden>
+
+* w3.txi: Changes to the VM/Rmail nodes.
+
+* w3.el: Fixed dumbass problem in both types of forms submission that would
+always submit every checkbox and every radio button, regardless of its
+checked state.
+
+Wed Aug 10 13:51:18 1994  William Perry  <address@hidden>
+
+
+Tue Aug  9 03:39:45 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem with cleaning up of w3-temporary-directory and
+url-temporary-directory
+
+* w3-e19.el: Fixed a few problems with the loading of lmenu.
+
+Mon Aug  8 12:59:14 1994  William Perry  <address@hidden>
+
+* w3-e19.el: Made binding of track-mouse buffer-local
+
+Sat Aug  6 16:32:18 1994  William Perry  <address@hidden>
+
+
+* dist.Makefile:
+Removed viewers.el from the dist, since it has been moved into mm.el
+
+* w3-wemac.el, w3-lemac.el:
+New url-flush-cache function to remove all entries from the cache.
+Menu item in lemacs/wemacs for it.
+
+* w3.el: Fixed problem if </title> is malformed/nonexistent.
+
+* w3.el: Fixed problem with some </pre> markup sometimes leaving a trailing >
+in the parsed code.
+
+* w3.el: Fixed problem with mac web pages that use ^M instead of ^J as the
+newline char.
+
+Wed Aug  3 04:15:06 1994  William Perry  <address@hidden>
+
+
+* w3-vars.el, w3.el: Moved setting of w3-documents-menu-file,
+w3-personal-annotation-directory, and w3-hotlist-file into
+w3-do-setup, since they used expand-file-name and ~/, it would mess up
+if you dumped w3 with emacs.
+
+* w3-wemac.el:
+Do correct setting of the address@hidden up .mosaic-xxx-xxx filenames when in 
windows.
+
+* w3-wemac.el:
+Fix the setting of the mailcap/mime-types file list so that it won't
+choke on invalid filenames in windows.  Also do smart-checking of the
+TEMP environment variable if w3-temporary-directory or
+url-temporary-directory doesn't exist.
+
+* w3-lemac.el, w3.el:
+Fixed a problem in w3-kill-emacs-func when w3-temporary-directory
+didn't exist.  Also moved some stuff from w3-do-setup to
+w3-setup-version-specifics (mostly lemacs image stuff, etc)
+
+* w3.el: Load w3-wemac if running WinEmacs
+
+* w3.el: Highlighting of links is back...
+
+* w3-wemac.el: Initial revision
+
+Mon Aug  1 13:32:35 1994  William Perry  <address@hidden>
+
+* dist.Makefile:
+Removed sample-mailcap from distribution - everything is defaulted in
+lisp now.
+
+
+Sun Jul 31 23:53:36 1994  William Perry  <address@hidden>
+
+* w3.el: Accept --!> as the ending of an SGML comment.  UGH!
+
+
+* w3.el: Now sends off the value parameter of an <option> tag in a form.
+
+
+* w3.el: Use error in w3-save-url if there is no URL.  Moved loading of ~/.w3
+higher in w3-do-setup.
+
+* w3.txi: Fixed lots of grammatical mistakes, all stuff now uses the present
+tense instead of "will", and no more first-person crap.  Email
+addresses are handled in a standard way.
+
+* w3.el: Added support for the multipart/x-www-form-data enctype.  Also
+revamped forms support to be easily expandable for the enctype
+attribute.  Just need to have a function named
+w3-form-encode-<content-type> defined.  If this returns a cons pair,
+then the car is used as the "separator=xxx" chunk in the content-type,
+and the cdr is the body of the request.  If it returns a string, it
+just sends that as the body of the message.
+
+
+* w3.el, w3-vars.el: Rewrote the popup-info functions
+
+
+Sat Jul 30 22:55:31 1994  William Perry  <address@hidden>
+
+* w3-e19.el:
+Will no highlight the region that matches the ID of a #XXX search in a document
+
+
+Fri Jul 29 04:33:03 1994  William Perry  <address@hidden>
+
+* w3.txi: Few typos
+
+* w3.el, w3.txi:
+Misc. patches from address@hidden - doc/info fixes
+
+Thu Jul 28 13:52:49 1994  William Perry  <address@hidden>
+
+* w3.el: Rewrote DL handling
+
+Tue Jul 26 13:39:24 1994  William Perry  <address@hidden>
+
+
+* w3.el: Fixed dumb mistake in w3-personal-annotation-finish where I didn't
+insert the actual text of the annotation before finishing up.
+
+Mon Jul 25 14:04:09 1994  William Perry  <address@hidden>
+
+* add-to-dot-emacs: Added a few new autoloads
+
+
+* w3.txi: Fixed a few typos.
+
+* w3.el: Fixed problem with the rel=useindex support.
+
+* w3.el: Fixed small formatting problem with w3-delimit-links = 'linkname
+
+Sun Jul 24 20:19:18 1994  William Perry  <address@hidden>
+
+
+* w3-lemac.el:
+Several ugly hacks to get the image menus to work for images that
+downloaded successfully.
+
+* w3-lemac.el: New link and graphic specific menus enabled.
+
+* w3-vars.el: The popup menu has been trimmed down.
+
+
+* w3.el: A few changes for the new hyperlink-specific menus
+
+* w3-e19.el: Rewrote w3-forward-link - should not get stuck on links anymore
+
+* w3-e19.el: Implemented popup-menus on a linktype basis.  Can change the popup
+menu that shows up when you right-click on a hyperlink or an image.
+Default menus include viewing headers, dumping to disk, mailing,
+printing, and copying the url.
+
+* w3-vars.el, w3.el:
+New personal annotation entry code.  Uses a minor mode, and you can
+specify what major mode is used.  Set the variable w3-annotation-mode
+to the name of the major mode.  If set to nil, it will use
+default-major-mode.
+
+* w3-e19.el, w3-emacs.el, w3-epoch.el, w3-hypb.el, w3-lemac.el, w3-mac.el, 
w3-mule.el, w3-next.el, w3-vars.el, w3.el:
+Changed all references to address@hidden to use w3-bug-address
+instead.  Changed all copyright notices to use my new email address
+also.
+
+
+* w3.txi:
+Lots of changes to variable names, some new sections.  Should be about
+90% up-to-date now.
+
+
+* w3-vars.el: Removed definition of w3-passwd-entry-func - obsolete.
+
+
+* w3.el: Moved running of w3-mode-hooks to be after the resetting of
+w3-persistent-variables.
+
+
+* w3.el: Added in support for using <link rel=useindex href=xxx> for searching
+instead of the <ISINDEX> tag.  <ISINDEX> is still supported.
+
+Sat Jul 23 21:26:57 1994  William Perry  <address@hidden>
+
+* w3-e19.el: Rewrote the options menu
+
+* w3-e19.el: Removed image options from emacs 19 menubar
+
+
+* w3.el: Fixed problem with nested style tags.
+
+* w3-lemac.el: Fixed problem with images not appearing
+
+* w3.el: Fixed problem with first lines not being wrapped if no
+header/paragraph tags before them in the document.  Also added support
+for broken base tags - seems like some people are using <base=url>
+instead of <base href=url>
+
+
+* w3.el: PRE segments now get correctly put in the w3-tt-style face.
+
+Fri Jul 22 03:59:40 1994  William Perry  <address@hidden>
+
+
+Thu Jul 21 04:46:03 1994  William Perry  <address@hidden>
+
+* w3.el: Changed behavior of w3-show-headers.  If 't', then show all headers.
+Fixed bug in w3-in-assoc if there was a blank entry in the alist.
+
+* w3.el: Patch from address@hidden for not putting nil in the
+kill ring with w3-save-url.
+
+Sun Jul 17 17:17:19 1994  William Perry  <address@hidden>
+
+
+* w3-vars.el: New variable w3-dump-to-disk that will automatically download
+retrieved files to disk.
+
+* w3-lemac.el: Added 'dump to disk' item in options->www menu
+
+* w3-lemac.el: Added option for color filtering to the options->www menu
+
+* w3-lemac.el: Only read in the url-file-attributes of an image if
+w3-image-size-restriction is non-nil and a number.
+
+Sat Jul 16 18:55:24 1994  William Perry  <address@hidden>
+
+
+* w3.el: With prefix-arg, w3-fetch will default to the URL of link under point
+if any, otherwise default to current documents url if in w3-mode,
+otherwise default to url-get-url-at-point
+
+* w3.el: With prefix-arg, w3-follow-link will dump the file straight to disk
+
+Fri Jul 15 14:42:39 1994  William Perry  <address@hidden>
+
+* w3.el: Automatically switch to using giftoppm if giftopnm is not found on the
+system.
+
+
+Tue Jul 12 04:38:47 1994  William Perry  <address@hidden>
+
+
+Mon Jul 11 05:28:40 1994  William Perry  <address@hidden>
+
+* w3.el: w3-version now returns all the version #s of URL, WWW, and MM
+
+
+Sun Jul 10 19:14:06 1994  William Perry  <address@hidden>
+
+* w3.el: Only use w3-default-style in epoch
+
+
+* w3.el, w3-vars.el: w3-show-headers now takes regexps instead of exact matches
+
+Fri Jul  8 01:49:25 1994  William Perry  <address@hidden>
+
+
+Wed Jul  6 13:56:47 1994  William Perry  <address@hidden>
+
+* w3.el: Patches to make the history work again, as well as keep w3
+from trying to re-select deleted buffers
+
+Tue Jul  5 07:38:00 1994  William Perry  <address@hidden>
+
+* w3.el: No longer delete the zone when making an ALT tag hot, since there
+could have been other text in the link
+
+* w3.el:
+If an IMG is within a <A> tag, then the alt tag will be a hyperlink also.
+
+* w3.el: Fixed finding of url#xxx links from w3-fetch
+
+Mon Jul  4 23:48:07 1994  William Perry  <address@hidden>
+
+* w3.el: Forms submissions can now have ? embedded in them, for recursive
+creation of subsequent forms.
+
+
+* w3.el: Fixed formatting problems with nested lists, etc.
+
+* w3-vars.el: Removed C-q binding
+
+* w3-e19.el: Automatically turn on track-mouse if w3-track-mouse is non-nil.
+
+* w3.el: Various patches from Alastair Burt
+
+* w3-lemac.el: Create w3-superscript-style correctly
+
+Sun Jul  3 05:05:43 1994  William Perry  <address@hidden>
+
+
+* w3.el: Fixed a problem with fetching of #xxx links.
+
+* w3.el: Applied patch from Darrell Kindred <address@hidden> that
+fixed quite a few problems in the news handling.  Should be
+a lot faster now.
+
+* w3.txi: Fixed a few problems in the VM, RMAIL, and GNUS sections
+
+Sat Jul  2 18:31:50 1994  William Perry  <address@hidden>
+
+* w3-vars.el: Removed bogus entry in w3-persistent-variables
+
+* w3.el: Fixed storing of w3-current-last-buffer and w3-goto-last-buffer
+
+Thu Jun 30 23:39:02 1994  William Perry  <address@hidden>
+
+* w3-vars.el:
+Changed definition of w3-running-lemacs to take WinEmacs into account.
+
+* w3-lemac.el:
+Changed references to string-to-number to string-to-int for older
+lemacs versions
+
+Wed Jun 29 05:24:53 1994  William Perry  <address@hidden>
+
+* w3-lemac.el, w3-e19.el:
+Added an option for local cacheing of files to the Options menu
+
+Mon Jun 27 15:03:12 1994  William Perry  <address@hidden>
+
+* w3-e19.el:
+Added check for whether menu-bar-help-menu was bound before defining
+keys in it
+
+Tue Jun 14 12:25:09 1994  William Perry  <address@hidden>
+
+* w3-e19.el: Fixed problem with the menu
+
+Mon Jun 13 14:13:56 1994  William Perry  <address@hidden>
+
+* w3.el: Made sure everywhere w3 does a completing-read binds
+completion-ignore-case to t
+
+* w3.el: Few fixes from using url-maybe-relative
+
+Thu Jun  9 12:51:03 1994  William Perry  <address@hidden>
+
+* w3-e19.el: Activated the Help menu in FSF v19 again.
+
+Wed Jun  8 01:20:36 1994  William Perry  <address@hidden>
+
+
+Tue Jun  7 20:08:20 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem with empty titles.
+
+* w3-lemac.el:
+Fixed references to w3-use-hypertext-gopher and w3-directory-format variables
+
+* w3.el: Hacked up w3-submit-bug to be able to use mh-smail
+
+
+* w3.el: Changed the color-reducing process to be optional
+
+Mon Jun  6 19:56:46 1994  William Perry  <address@hidden>
+
+* w3-vars.el: More HTML+ latin1 entities
+
+Sun May 29 02:26:30 1994  William Perry  <address@hidden>
+
+* w3-vars.el: More HTML+ entities
+
+Sat May 28 14:14:19 1994  William Perry  <address@hidden>
+
+* w3-e19.el:
+Fixed problem with w3-back-link.  Could not go back to the only link
+in a buffer if you were past its endpoint
+
+* w3.el: w3-preview-buffer should work again, along with
+w3-show-hotlist/history-list, etc.
+
+* w3-vars.el: Yet more HTML+ entities.  Only 22 left to figure out.
+
+* w3-vars.el: Added more of the HTML+ entities
+
+Fri May 27 19:54:49 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed a problem with PRE fixing
+
+Sat May 21 10:23:16 1994  William Perry  <address@hidden>
+
+
+* w3.el: Fixed the URL completion
+
+* w3.el: Fixed a problem with the <embed> tag and the url package
+
+
+* w3-e19.el, w3-emacs.el, w3-epoch.el, w3-lemac.el, w3-mac.el, w3-mule.el, 
w3-srch.el, w3-vars.el, w3.el:
+Lots and lots of changes to use the new url.el package
+
+Fri May 20 16:20:59 1994  William Perry  <address@hidden>
+
+* w3-lemac.el: Fixed problem where graphic entities were disappearing
+
+Thu May 19 12:18:41 1994  William Perry  <address@hidden>
+
+* w3.txi: Fixed a few bad pointers
+
+* add-to-dot-emacs: Initial revision
+
+
+* w3-lemac.el:
+Moved back in the old code for w3-insert, w3-fix-extent-endpoints to
+get around bug in lucid emacs 19.10 with 'start-open and 'end-open
+extent properties.
+
+Wed May 18 20:30:24 1994  William Perry  <address@hidden>
+
+
+* w3.el: Now can have a max # of password entry attempts before bombing out and
+displaying the error message from the server.  w3-max-password-attempts
+
+
+* w3.el: Fixed problem in w3-mail-document-under-point
+
+
+* dist.Makefile: The great name change to 8.3 compatible
+
+
+* w3.el: Fixed problem in file/ftp handling if there was no file in the url
+(ftp://host.domain), etc.
+
+* w3-e19.el: Provide w3-e19
+
+* w3.txi: Added chapter/example for interfacing with RMAIL
+
+* w3-lemac.el:
+Added definition of emacs-major-version and emacs-minor-version if
+they aren't already defined.  Use this to merge w3-lemacs.el and
+w3-old-lemacs.el
+
+* w3-vars.el: Removed references to w3-running-old-lemacs
+
+
+Tue May 17 23:30:23 1994  William Perry  <address@hidden>
+
+
+* w3.el: Honor the new nametemplate mailcap clause
+
+* w3-e19.el, w3-lemac.el, w3-vars.el, w3.el:
+Removed the annotations menu.  moved to one entry in the main WWW menu
+Cleaned up some of the annotation code.
+
+* w3-e19.el:
+Only allow use of overlays in emacs19, due to some bugfixes in 19.23
+
+* w3-lemac.el: Disabled graphics in lemacs 19.9, since I switched to using
+annotations, and they don't exist in 19.9
+
+Mon May 16 20:49:09 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem with an old mm-mime-viewer call that didn't get fixed,
+and a work around for the autoloading of ange-ftp in emacs19
+
+* w3.el: Change to w3-grok-file-href to check for whether a file exists, even
+if a // is in the string (for something like file://usr/local/ blah
+blah blah.  Thanks to David Hughes for the patch.
+
+* w3.el: Removed group annotation code.
+Sped up the removal of whitespace by using subst-char-in-region
+instead of replace-regexp .
+
+* w3-lemac.el:
+Changed the options menu -> delay by image type to be actual toggle items.
+
+
+* w3.el: Removed klunky caching strategy.
+w3-current-mime-viewer now holds the complete information returned by
+mm-mime-info.
+The viewer code now only shows the output of commands if it gets any.
+No more prompting or setting of w3-always-show-output is necessary.
+
+* w3-vars.el: Removed obsolete w3-always-show-output
+
+Sun May 15 19:23:57 1994  William Perry  <address@hidden>
+
+* dist.Makefile: Now distribute mm.el
+
+
+* w3-lemac.el:
+Now add options menu before the Save Options menu in lemacs 19.10
+
+
+* w3.el: Switched to using my new mm.el package for mime stuff.
+
+* w3-vars.el: Removed old w3-xxx vars related to mailcap and mimetype parsing.
+
+* w3-mac.el: The Macintosh menus now work.
+
+Fri May 13 20:45:39 1994  William Perry  <address@hidden>
+
+* w3-vars.el: Added ` to the syntax table as a quote operator
+
+* w3-vars.el: Switched from giftoppm to giftopnm
+
+* w3.el: Changed the x-exec handling so that it can't mess up the
+process-environment by accident (thanks to Jamie Zawinski) for the
+info.  Also changed it so that the environment is only messed with if
+the executable is actually found somewhere in w3-local-exec-path.
+Save a few conses and string creations.
+
+Thu May 12 18:11:51 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed a few problems in the cleanup of unrecognized tags, as well as
+header handling.
+
+* w3-lemac.el: Fixed a few image-related quirks.
+
+
+* w3-lemac.el: Removed cursor changing code.
+
+
+* w3.el: Forgot to (widen) after the new MIME parasing code.
+
+
+* w3.el: Rewrote w3-parse-mime-headers to extract its information from the
+buffer instead of doing lots of work on strings/etc.  Also rewrote
+part of the guessing of mime-types when no content-type explicitly
+given.
+
+* w3.el: The no_proxy environment variable can now hold a unix-shell-type
+comma-separated list of wildcards, and it will be transformed into a
+real regular expression.
+
+* w3.el: Will now send Pragma: no-cache when doing a reload. . .
+Also now supports the no_proxy environment variable.
+
+* w3.el:
+Fixed a few places where w3-insert-graphic was still called the old way.
+Also fixed problem where local images weren't being converted correctly.
+
+* w3-lemac.el, w3.el: Fixed various compilation errors
+
+* w3-lemac.el:
+Basis for ismap image clicking enabled.  Sends off quite the wrong
+area (x,y relative to emacs frame, not the image).  Should be trivial
+to fix with a few additions to the C code.
+
+
+* w3.el:
+Seem to have fixed the problem of inlined images not being used as links.
+
+
+* w3-lemac.el:
+w3-find-specific-link will now highlight the correct extent until
+input is available.
+
+* w3.el: Finally really fixed the bug in the infinite recursion when building
+lists.  Problem was with unterminated lists.
+
+* w3.el: Following a named link (#XXX) will now push the mark so you can get
+back to it with C-u C-space
+
+Wed May 11 22:35:33 1994  William Perry  <address@hidden>
+
+
+* w3.el: Fixed problem of remote files being formatted incorrectly.
+w3-buffer-is-hypertext was not always returning the correct value.
+
+
+* w3.el: Links within headers should look better now.
+
+* w3-e19.el: New versions of the overlay-specific functions, plus changed the
+default under emacs19 to be using overlays.
+
+* w3-e19.el: Few patches for highlighting headers.
+
+* w3.el: No longer assume temporary files go in /tmp... now uses
+w3-temporary-directory and expand-file-name for all temporary file
+creations
+
+
+* w3.el: Patches from Bob Weiner to get asynchronous retrieval through a 'host
+gateway working.
+
+* w3.el:
+Hopefully fixed the not-guessing-if-a-buffer-is-html bug for remote file access
+
+* w3.el: Fixed problem in w3-follow-link with NAMEd links with no href.
+
+* w3.el: Fixed problem with infinite recursion during list building.
+
+* w3-vars.el:
+w3-mime-viewers has been trimmed down a lot, will depend on the users
+mailcap much more.
+
+* dist.Makefile: Can now 'make mailcap'
+
+* w3.el: w3-parse-mailcap can now take a URL.
+
+* w3.el: Killing of HTML comments will now make sure there is whitespace where
+the comment used to be. ie: (some text<!-- ack -->more text ==> some
+text more text)
+
+* w3.el: Fixed problem where text immediately after a </pre> tag but before a
+<p> tag weren't filled correctly.
+
+* w3.el: Changed w3-mailcap-entry-passes-test to check for the common "test -n
+$DISPLAY" cases and handle them automatically in elisp instead of
+shelling out to check the return status.
+
+* w3.el: Changed all after-hook-function references to be after-hook-functions,
+and use add-hook instead of explicit setq's
+
+* w3.el: The mailcap parsing routine now honors the 'test' clause
+
+* w3.el: fixed problem in w3-parse-args
+
+Tue May 10 23:56:29 1994  William Perry  <address@hidden>
+
+* w3-lemac.el: Few changes to the extent handling code.  No more hacks for
+w3-fix-extent-endpoints or w3-insert
+
+* w3.txi: Few bug fixes to the docs.
+
+Mon May  9 20:41:03 1994  William Perry  <address@hidden>
+
+* w3-lemac.el:
+If an image is more than 1/2 the size of the current screen, it will
+be moved down onto a line by itself.
+
+* w3.el: Fixed bug in title handling if there was an end tag like <title >
+
+* w3-lemac.el:
+Workaround for bug in lucid emacs where deleting text in map-extents
+would do _very_ bad things.  Loading inlined images/mpegs would
+sometimes cause it to crash.
+
+* w3-lemac.el: More changes to the image handling
+
+Sun May  8 17:46:14 1994  William Perry  <address@hidden>
+
+* w3-lemac.el: Changed to using annotations for inlined images
+
+Sat May  7 16:22:58 1994  William Perry  <address@hidden>
+
+
+* w3.el: Changed w3-file-attributes to not use HTTP/1.0 to HEAD a file unless
+w3-be-anal-about-file-attributes is non-nil
+
+* w3-lemac.el:
+Can now filter inlined image loads based on MIME type and/or file size.
+
+Thu May  5 16:26:19 1994  William Perry  <address@hidden>
+
+* w3-lemac.el: New submenu for lemacs - restrict image loads by type.
+
+* w3.el: Fixed problem in the after-change-function yet again.
+
+
+* w3.el: Few changes to the after-change-function handling, as well as changes
+to the mpeg loading code
+
+* w3-lemac.el:
+New menu items for showing inlined mpegs or not, as well as functions
+to load single and multiple delayed mpegs.
+
+* w3-vars.el: New variable w3-delay-mpeg-loads
+
+* w3-e19.el:
+Builtin support for mouse-movement keys, if 19.23 ever works with them...
+
+Tue May  3 20:25:40 1994  William Perry  <address@hidden>
+
+* w3-lemac.el, w3-vars.el, w3.el:
+Lucid emacs 19.10 or higher can now display inlined mpegs by default.
+Use <embed src="url of mpeg to play" type="video/mpeg"> to try it out.
+
+Mon May  2 22:02:21 1994  William Perry  <address@hidden>
+
+* w3.txi:
+Added in documentation of the emacs19 faces hacking for dumb terminals
+
+* w3-lemac.el: Applied patch by Alastair Burt to fix dumb typo on my part.
+
+* w3.el: Few changes to the 'host gateway code
+
+* w3-e19.el: Fixed problem in w3-find-specific-link in emacs19
+
+* w3.el: Changed w3-parse-args to extract the information out f the original
+buffer instead of wasting 2 or 3 string/buffer creations
+
+* w3-vars.el: Changes to the w3-parse-args-syntax-table
+
+Sun May  1 22:58:34 1994  William Perry  <address@hidden>
+
+* w3.el:
+Fixed problem in w3-after-change-function and escaping % from w3-lazy-message
+
+Fri Apr 29 21:48:26 1994  William Perry  <address@hidden>
+
+* w3-vars.el: New variables for keeping track of status messages better
+
+* w3.el: New way of doing the HTTP transfer status messages.  Now uses the
+after-change-function if available.  This way even asynchronous
+transfers get the good XXX of YYY (ZZ%) transfer messages.  Also now
+support the Status: header, which will be shown instead of the normal
+XXX bytes message.
+
+* w3-vars.el: More HTML+ entities
+
+Thu Apr 28 14:51:32 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed a few problems with the x-exec stuff.
+
+* w3-emacs.el: Fixed problem in v18 mouse support
+
+Wed Apr 27 16:14:01 1994  William Perry  <address@hidden>
+
+* w3-vars.el:
+New variables w3-mime-editors, w3-mime-bitmaps, w3-mime-composers, and
+w3-mime-printers that are initialized from the entries in the mailcap
+file
+
+* w3.el: Rewrote w3-parse-mailcap so that it keeps a _LOT_ more information
+from the mailcap file, including composers, editors, labels, and
+bitmaps.
+
+* w3-e19.el: Few changes to the options and popup menus
+
+* w3-lemac.el: New options menu for new lemacs
+
+* w3-vars.el: Revamped the main menu and popup menus to be shorter
+
+* w3-lemac.el:
+Changed w3-zone-at and w3-zone-data to use new 'w3delayed for delayed images.
+
+* w3.el: Reworked who delayed image processing works.  You can now click on a
+delayed image and it will load just that image.  Similar to how the
+Mosaic clients work.  Also, the ALT tag is inserted if available.  It
+is deleted from the buffer when the image is loaded.
+
+Tue Apr 26 21:33:26 1994  William Perry  <address@hidden>
+
+
+Mon Apr 25 21:16:33 1994  William Perry  <address@hidden>
+
+* w3-lemac.el:
+Should have fixed the ugly interaction between emacs-vers.el and lemacs 19.9
+
+* w3.el: Fixed problem in w3-fix-unknown-tags
+
+Sun Apr 24 19:30:51 1994  William Perry  <address@hidden>
+
+* w3.el:
+A few fixes to the native wais handling - still a little broken though.
+
+* w3-vars.el:
+Changed the help on xxxx menu item to fetch the .html files instead of
+the ones with no extensions - our server sends text/plain with no
+extension - ugh
+
+
+Sat Apr 23 18:57:30 1994  William Perry  <address@hidden>
+
+
+* w3.el: Fixed a problem in w3-parse-relative-link that would cause #X links to
+be doubled to #X#X
+
+* w3-e19.el:
+Can now choose whether you want to use overlays or text properties for
+keeping track of the internal w3 information.  Try
+(put 'w3-emacs19 'use-overlays t) in your .emacs to try it out.
+
+Fri Apr 22 14:53:15 1994  William Perry  <address@hidden>
+
+* w3-e19.el: Removed ugly emacs 19.23 hack that could mess up buffers
+
+* w3.el: Added a function to generate a FORM for posting/mailing a reply to a
+newsgroup.
+
+* w3-lemac.el: Added w3-view-ppm to view p[bp]m files in an xwindow glyph
+
+Thu Apr 21 20:37:24 1994  William Perry  <address@hidden>
+
+* w3-vars.el: Redid the help menu
+
+* w3-lemac.el:
+Changed button binding and menu stuff to conform to new lucid emacs style
+
+* w3.el: Changed w3-prepare-buffer to return the title of the document
+
+Tue Apr 19 23:17:48 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed up w3-parse-args so that it can deal with no trailing " or ' on
+an attribute that started with one.
+
+* w3-lemac.el: Fixed a few of the w3-toggle-xxxx
+
+* w3.el: Made epoch use the old V18-style kill-emacs-hook
+
+* w3.el: Fixed problem with headers having the last char moved down onto a new
+line when using w3-emacs19-hack-faces-p
+
+
+* w3.el: Try using .newsrc-SERVERNAME before just plain old .newsrc.
+
+* docomp.el: More defvar's
+
+* w3.el:
+Backed out one optimization of w3-parse-args that caused emacs19 to barf.
+
+* w3.el: w3-news-server now consults gnus-default-nntp-server,
+gnus-nntp-server, and nntp-server-name if they're bound and non-nil
+and != "".
+
+* w3-e19.el:
+Use glyphs in the display table so that emacs doesn't get as confused
+about the cursor position when using w3-emacs19-hack-faces-p
+
+
+* w3.el: Moved the finding of #xxx links after the loading of images, just in
+case point gets confused.  If no #xxx link, make sure to go to
+(point-min)
+
+Mon Apr 18 23:40:19 1994  William Perry  <address@hidden>
+
+* w3.el:
+Optimized w3-parse-args some more.  Thanks to address@hidden for the input
+
+* w3.el: Fixed problems with ../ as the first part of a relative url
+
+* w3-lemac.el:
+Wrapped the new definition of the options menu in a check for the
+latest version of lemacs
+
+* w3-lemac.el:
+Changed the menus to use the new 19.10 method of menus so that it uses
+Toggle buttons, etc.
+
+* w3.el: Finished implementing the SRC attribute for SUBMIT buttons
+
+* w3-e19.el: Added a hack-vt102 function
+
+* w3.el: New w3-parse-args
+
+
+* w3.el: Added support for a SRC attribute to the submit button
+
+Sun Apr 17 22:28:08 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed error message in w3-hotlist-add-entry, and added function
+w3-hotlist-refresh.
+
+* w3.txi: New hotlist func
+
+Fri Apr 15 21:25:21 1994  William Perry  <address@hidden>
+
+
+* w3-vars.el: Removed some obsolete variables
+
+* w3.el: Fixed the history mechanisms
+
+
+* w3-vars.el: Moved defvar of w3-emacs19-hack-faces-p into main variables file.
+Also moved the default setting of w3-delimit-emphasis and
+w3-delimit-links into w3-do-setup so they will be set correctly if
+dumped with emacs.
+
+
+* w3-e19.el: Can now hack faces for xterm and linux console
+
+* w3.el: Added in support for user:address@hidden ftp URLs
+
+
+* w3-e19.el: Fixed problems in w3-mouse-handler
+
+* w3-e19.el: If you are using VT100's and emacs 19.22, you CAN GET BOLD AND
+UNDERLINED text now.  Please try setting the variable
+w3-emacs19-hack-faces-p to non-nil.  To get rid of it, use M-x
+w3-emacs19-unhack-vt100
+
+
+* w3.el:
+Fixed bug in w3-parse-relative-link that could cause major problems with
+~ and w3-current-file = nil.
+
+Thu Apr 14 22:28:06 1994  William Perry  <address@hidden>
+
+* w3-lemac.el:
+Removed colorize-pixmap call since lemacs takes care of that now.
+
+* w3.el: Fixed problem in w3-search where it did not nuke the last search term
+from the url before appending the latest search string.
+
+* w3.el: the x-exec URL handler will now make sure that all returned messages
+are HTTP/1.0 messages, using the return value of call-process-region
+to get the HTTP/1.0 return status code if one is not explicitly given
+by the script.
+
+* w3.el: Include definition of emacs19-ism 'setenv' for old versions of emacs.
+This function is required to use the x-exec URL.
+
+* w3.el: Fixed some odd formatting of <hr>
+
+
+* w3.el: Added support for the x-exec url
+
+Wed Apr 13 21:58:09 1994  William Perry  <address@hidden>
+
+
+* w3.el: Fixed problem in w3-fix-proxy
+
+* w3-e19.el:
+Fixed a problem with emacs 19.23 and the previous-single-property-change
+
+* w3-lemac.el: Fixed w3-insert to deal with extent-start > extent-end
+
+* w3.el: Fixed the proxy support so that w3-view-url will show the url of the
+proxy'd document, not the entiry 'proxyservice''realurl' garbage
+
+* w3.el: Fixed w3-parse-args yet again...
+
+* w3.el: Few fixes to the newsrc parsing (unbound variables from cut&paste)
+
+* w3.el: Lots more news work.  Now supports parsing the newsrc and only showing
+unread articles in newsgroups, as well as displaying a list of all the
+newsgroups (distinguishes subscribed and unsubscribed groups).
+
+* w3.el: Added links to post to the newsgroup and reply to the author in news
+handling
+
+* w3-vars.el: Added newspost to the list of allowable link types
+
+* w3.el: w3-view-url now works with news: urls
+w3-parse-relative-link now works with news: urls
+w3-format-whole-newsgroup now spits out valid HTML+, and better looking too
+w3-format-news now spits out valid HTML+, looks like GNUS under lucid
+
+Tue Apr 12 08:01:20 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem where using a gateway could screw up the recognition of
+an http/1.0 response
+
+* w3-e19.el, w3-emacs.el, w3-epoch.el, w3-lemac.el:
+Changed w3-forward-link and w3-back-link to take a prefix-arg for
+how many links to go forward.
+
+* w3.el:
+Fixed a bug in w3-parse-relative-link that would expand ~/ when it shouldn't
+
+Mon Apr 11 23:27:43 1994  William Perry  <address@hidden>
+
+* w3.el: Revamped w3-create-multipart-request to only use valid separator chars
+
+
+* w3.el: Fixed problem in w3-parse-docs-menu.  Added code to create a MIME
+multi-part request.
+
+* w3.el: Fixed problem in w3-form-encode for name=isindex when it wasn't the
+only entry area in the form (a submit button, etc)
+
+* w3.el: fixed problem in list-expansion
+
+* w3.el: Fixed problem in w3-parse-args if something was (read) as a number
+instead of a string.
+
+* w3.el: Fixed a problem in w3-parse-args with emacs19
+
+Sun Apr 10 21:51:40 1994  William Perry  <address@hidden>
+
+* w3-e19.el: w3-add-zone now uses the mouse-face property in emacs 19.23
+
+* w3-e19.el: Fixed various problems related to lmenu in emacs 19.23
+
+* w3.el: Fix to the mosaic docs-menu parsing
+
+* w3.el: No longer send the SUBMIT button when submitting forms
+
+* w3.el: New code to parse the Mosaic documents.menu file to add user-specified
+menus in lucid/FSF19
+
+
+Sat Apr  9 20:49:30 1994  William Perry  <address@hidden>
+
+* w3.el: Rewrote the SGML-comment killing code... should work better now.  Not
+sure if it is still compatible with the Mosaic way of killing
+comments, but Mosaic is broken in that regard, so I don't really
+care. :)
+
+* w3.el: w3-show-hotlist will show the hotlist entries in the same order that
+they were stored, instead of the old reverse-order behavior.  Also
+changed some of the automatically generated HTML to be strictly
+correct HTML+.
+
+* w3-vars.el:
+Also removed www.cis.ohio-state.edu from the bad-server-list... is now
+an HTTP/1.0 server
+
+* w3-vars.el:
+Removed cs.indiana.edu from the w3-bad-server-list, as we have finally
+upgraded to plexus.
+
+* w3.el: w3-submit-bug now sends me the URL of the current buffer (if any)
+
+* w3.el: Fixed a problem with file:./foo being interpreted wrong.
+
+* w3.el: Rewrote w3-basepath and w3-parse-relative-link to use
+expand-file-name, file-name-nondirectory, and file-name-directory.
+More reliable than the old regular expressions
+
+
+* w3.txi: Fixed more texinfo bugs.
+
+* w3-srch.el: Few tweaks in searching.
+
+* w3.el: Another bugfix to w3-parse-args
+
+* w3.el: Generate errors for non-existent local files now
+
+Fri Apr  8 23:10:20 1994  William Perry  <address@hidden>
+
+* w3-vars.el: Fixed all the missing HTML entities, and fixed several others.
+
+* w3.el: Fixed problem in w3-insert-entities-in-string using &nsp; instead of
+&ensp;
+
+* w3.el: Added a 'binary' option to w3-save-as
+
+* w3.el: New w3-parse-args
+
+
+* w3.txi: Wrote the PGP/PEM doc. (well, borrowed them from address@hidden).
+
+* w3.txi: Wrote the using with vm and using with gnus nodes.
+
+* w3.el: Added an autoload for w3-follow-link
+
+* w3.txi: Fixed a few reference problems.
+
+* w3.txi: Lots of variable definitions added.
+
+Thu Apr  7 22:32:06 1994  William Perry  <address@hidden>
+
+* w3.txi: Actually wrote the gateway/firewall documentation.
+
+* w3-e19.el: Fix-extent-endpoints will now work better.
+
+* w3.el: Fixed a problem with w3-create-mime-request and interaction with the
+CMU-BEAK server
+
+* w3.el: Fixed w3-parse-args for good I hope... now infers missing "s
+
+* w3.txi: Fixed some validation errors
+
+* w3.el: Ignore case in completing-read in w3-use-links
+
+<hr> parsing should now be more robust.  Paragraph filling after the
+<hr> will no longer be hosed.
+
+* w3.el: More work on w3-parse-args - think I got it right this time.
+
+* w3.txi: Fixed problem with setting the info filename
+
+* w3.txi: Fixed a few heirarchy bugs
+
+* w3.el: Rewrote w3-insert-entities-in-string to use mapconcat - quicker/more
+efficient than lots of string-matches and substrings, especially for
+small strings.
+
+Fixed problem in w3-parse-args that would swallow multiple spaces,
+even from quoted attributes (ALT=" " => ALT=" ")
+
+* w3-vars.el: Added &lt back into the w3-html-entities list.
+
+* w3.el: Fixed bug in the single-form-entry-in-a-form submission.  Was only
+sending the form value, not the name/value pair.
+
+Reworded the 'fixing bad html' messages to be 'checking for bad html'
+so that it wouldn't confuse people and make them log a bug.
+
+* w3.el: New way to retrieve wais doc-ids... doesn't work all the time
+  though - why not?
+* w3.el: Removed the call to dps-display-color-cells, as it causes a
+  coredump in all the versions I have ever tried on the NeXT.
+* w3-lemacs.el: Fixed problem with quoting percents in w3-track-mouse.
+
+Thu Mar  3 18:57:03 1994  William M. Perry  (address@hidden)
+* w3.el: Fixed problem in new header handling.
+* w3.el: w3-file-attributes will no longer choke if given a null argument.
+* w3-search.el: Remove all '#XXXX' references from URLs, so it is easier
+  to tell if we have visited them before
+* w3-vars.el: Changed w3-header-chars-assoc to use characters instead of
+  strings, and use make-string to make the header delimiters the same size
+  as the header.  This can still mess up on headers with inlined images,
+  but all in all it looks much better.  Thanks to Jared Rhine for the
+  suggestion.
+* w3.el: Changed lots of functions to use mapcar instead of while loops -
+  sould be slightly faster.
+* w3.el: Added hook to kill-emacs-hook to write out the global history if
+  necessary.  Also rewrote part of w3-write-global-history 
+
+Wed Mar  2 21:57:44 1994  William M. Perry  (address@hidden)
+* w3.el: Fixed problem with w3-file-attributes and non-existend
+  local/remote files.
+* dist.Makefile: Added mac and searching files to the distribution.
+* w3.el: w3-retrieve now updates w3-global-history-completion-list
+* w3.el: w3-fetch now does a completing read so that you can have
+  completion based on your .mosaic-global-history file.
+* w3-search.el: w3-do-search can now take an optional BASE argument, that
+  is the url to start searching from.  The search function also now checks
+  to see if there is a buffer visiting a url in the queue before
+  retrieving it.
+* w3.el: w3-save-as now uses w3-current-source if possible.  Saves time on
+  retrieval.
+* w3-vars.el: Fixed menu entry for 'View Source' that was still calling
+  old function names.
+* w3-lemacs.el: If w3-track-mouse is non-nil, and w3-link-cursor is
+  defined, change the mouse cursor to w3-link-cursor when over a link.
+  w3-link-cursor defaults to "hand2".  w3-link-cursor is set up in
+  w3-do-setup only if w3-link-cursor is a string, so the user can set it
+  to a pixmap in their .emacs file if they wish.
+* w3.el: <BR>s in lists now handled better.
+* w3.el: The new graphic entity support now honors the
+  w3-delay-image-loads variable
+
+Tue Mar  1 23:55:50 1994  William M. Perry  (address@hidden)
+* w3-lemacs.el, w3-epoch.el: Added binding of w3-source to 't' so that
+  w3-retrieve will always grab a buffer for retrieving inlined images
+* w3-search.el: Miscellaneous fixes...
+* w3.el: More changes to w3-file-attributes to compensate for HTTP/1.0
+  servers that don't implement HEAD
+* w3.el: Fixed error in determining if a URL exists or not in
+  w3-file-attributes
+* w3.el: w3-file-attributes won't send a HEAD request to a known
+  non-http/1.0 server
+* w3-search.el: Can now specify the search term as a function, and it will
+  be funcall'd with the URL as an argument.  RESTRICTION can be either a
+  regular expression or a function name - if string-match or funcall
+  against the URL fails, don't insert it into the queue.  Also now smarter
+  about not visiting the same URL multiple times.
+* w3.el: Fixed a dumb mistake in w3-file-attributes
+* w3-search.el: The searching functions work now.  Takes a regular
+  expression and a max-hops argument.  Returns a list of URLs that the
+  regular expression was found in.
+* w3-emacs19.el: Fixed problem with radio buttons/checkboxes at the end of
+  lines in emacs19
+* w3.el: Don't send the referer: field if using as a home-page or manually
+  requested URL
+
+Mon Feb 28 22:12:18 1994  William M. Perry  (address@hidden)
+* w3-emacs19.el, w3-lemacs.el, w3-old-lemacs.el, w3-vars.el: Removed
+  redundant definitions of w3-XXXX-menu.  w3-options-menu is still in each
+  file, since new lucid emacs has some extra features I can use in it.
+* w3.el: Will no longer copy local files into a buffer, then into /tmp
+  when passing to an external viewer - creates a symbolic link instead.
+
+Mon Feb 28 03:24:33 1994  William M. Perry  (address@hidden)
+* Release of v2.0.22
+* w3.texinfo: Description of new proxy services.
+* w3.el: Fixed problem in w3-fix-ampersands
+
+Sun Feb 27 23:37:53 1994  William M. Perry  (address@hidden)
+* w3-vars.el: Fixed un-escaped "s in defvar for w3-proxy-services
+* w3.el: Changed gopher/ftp/file directory handling to use the new
+  graphical entities instead of IMG
+* w3-vars.el: New variable w3-graphics-entities-alist holds an assoc list
+  of entities and the names of bitmaps to replace them with.
+  w3-icon-directory is appended to the front of each filename
+  automatically.
+  New variable w3-gopher-icons which holds the new graphic entity
+  references to describe each type of object.
+* w3.el: Tweaks to wais code... seems to be working now.
+* w3.el: Fixed stupid problem in the basic authorization code where I
+  wasn't setting the variable in a while loop to (cdr var)
+* w3.el: Added in proxy gateway support as put forth by Lou Montulli and
+  others.  Uses the new ACCESS_proxy environment variables.
+* w3.el: Multiline text entry boxes now reset correctly when
+  w3-revert-form is called
+* w3.el: Single input-area forms now submit themselves after you enter the
+  data.  No need for a submit button.
+* w3.el: Fixed error in w3-http, where it was sending the output of
+  w3-view-this-url instead of w3-view-url to w3-create-mime-request.
+  Referer: fields will work better now.
+  Basic authorization will now work with inheritance from protected
+  directories. (/foo/bar/baz.html is protected, then so is
+  /foo/bar/quuux.html, as is /foo/bar/baz/temp.html, etc)
+* w3.el: Wais support seems to be working...
+* w3.el: More fixes to the wais searching functions.
+
+Sat Feb 26 20:44:39 1994  William M. Perry  (address@hidden)
+* w3.el: Changed w3-prepare-buffer to take an optional argument,
+  no-display, which if t will keep it from renaming the buffer and
+  displaying it.
+* w3-vars.el: Added &lt and &gt to the list of entities, even though they
+  are wrong, since so many people seem to be using them.
+* w3.el: Strip out port numbers in ftp requests.
+* w3-lemacs.el: Spaces are now inserted after a graphic in lucid, and the
+  graphic extent is only on that one space.
+* w3-emacs19.el, w3-lemacs.el, w3-old-lemacs.el: Changed w3-zone-at to
+  return the extent, not the data.
+* w3.el: Better cleaning of telnet buffers before parsing.
+* w3.el: Fully implemented the Referer: field.  Also, w3-mime-response-p
+  should be a little more robust.  Should also kill an http request when
+  using the gateway support.
+* w3-vars.el: New variable w3-telnet-header-regexp that takes the place of
+  w3-telnet-header-length.  Addition of dvi, tex, and texinfo files to the
+  w3-mime-extensions list.
+* w3.el: Few changes to w3-format-directory in case file-attributes
+  returns nil
+* w3-emacs.el: w3-map-links will actually work in emacs 18 now.
+
+Fri Feb 25 23:17:51 1994  William M. Perry  (address@hidden)
+* w3-lemacs.el: Another dumb mistake in w3-zone-at
+* w3-emacs.el, w3-emacs19.el, w3-lemacs.el, w3-old-lemacs.el, w3.el: Fixed
+  dumb mistakes in w3-zone-at and the newly rewritten commands
+* w3.el: Fixed a few typos in w3-source-document
+* w3-emacs.el, w3-emacs19.el, w3-epoch.el, w3-lemacs.el, w3-old-lemacs.el,
+  w3.el: Rewrote w3-load-delayed-images, w3-view-this-url, and
+  w3-follow-link to use the generic w3-zone-at/w3-zone-data functions, so
+  they won't have to be in the emacs-specific files anymore.  Much easier
+  to maintain them this way.
+* w3-emacs.el, w3-emacs19.el, w3-epoch.el, w3-lemacs.el, w3-old-lemacs.el,
+  w3.el: Removed all emacs-specific versions of w3-complete-link, and put
+  w3-complete-link into w3.el and have it use the new w3-map-links.
+  Easier to maintain.
+* w3-emacs.el, w3-emacs19.el, w3-lemacs.el, w3-old-lemacs.el: New function
+  w3-map-links that calls a specified function on all the links in a
+  certain buffer.
+* w3-mac.el: Basic support for Macintosh menus... wrote a function to use
+  the lucid style menu descriptions.
+* w3-lemacs.el: Fixed problem with bad add-menu structure when the Options
+  menu already exists.
+
+Thu Feb 24 22:37:32 1994  William M. Perry  (address@hidden)
+* w3.texinfo: New chapter on future directions
+* w3-epoch.el: Fixed epoch graphics handling so it won't get a buffer
+  read-only-error, and also won't always look in w3-working-buffer, in
+  case the buffer has been renamed by the time it gets called.
+* w3.el: Renamed several functions so that it will be easier for new users
+  to do command completion (all hotlist stuff is w3-hotlist-XXX, etc).
+  Also several new functions to operate on the url the cursor is on
+  (w3-mail-document-under-point, w3-source-document-at-point, others).
+* w3-vars.el: Changed lots of keybindings.  General rule is now that
+  lowercase keys act on the current URL, and uppercase works on the url
+  under point. Major changes:
+  s -> document source, NOT SEARCH
+  M-s -> search document
+  p -> print document, NOT back link
+  Q -> w3-leave-buffer
+* w3.el: Rewrote w3-store-in-cache so that it stores info on disk instead
+  of in memory - can have a larger cache this way and not use up all your
+  memory.
+* w3-lemacs.el: New function w3-write-zones that creates lisp expressions
+  that restores extents when it is eval'd.
+
+Wed Feb 23 03:50:06 1994  William M. Perry  (address@hidden)
+* w3.el: A few more changes to the wais code
+* w3.el: More refinements to the WAIS code... now outputs URLs that are
+  like lynx/Mosaic, and also compatible with the WAIS gateway that NCSA
+  provides.
+
+Tue Feb 22 23:39:43 1994  William M. Perry  (address@hidden)
+* w3-old-lemacs.el: Fixed a few nesting errors in w3-view-this-url
+* w3-emacs19.el: Few fixes to file-name-handler stuff
+* w3.el: WAIS handling can now output an html document of a search.
+  Outputs the score and the file name.  Also function to retrieve a
+  document given its doc-id.
+* w3-emacs19.el: Patch for setting up the file-name-handler-alist from
+  address@hidden
+* w3.el: New function to parse out the .mosaic-global-history file and
+  store it in an assoc list for use in completion.
+* w3-mac.el: Initial revision
+* w3.el: More changes to the wais handling code.
+* w3-vars.el: New variable w3-waisq-prog that controls where the waisq
+  executable is looked for.
+* w3.el: Small change to w3-convert-html-to-latex to have slightly better
+  stripping of unknown tags.
+  Skeleton of wais support - requires waisq from Thinking Machines Corp's
+  wais8-5b1.
+
+Mon Feb 21 17:36:25 1994  William M. Perry  (address@hidden)
+* w3.el: New function w3-quotify-attributes to try and fix bad html docs.
+* w3.el: Added a few changes to convert-html-to-latex to honor
+  w3-latex-docstyle, and also allows inlining of postscript images.
+  Thanks to address@hidden (Benno Blumenthal) for the
+  batches.
+
+* w3-vars.el: New variable w3-latex-docstyle that controls what
+  documentstyle a latex document has.  Useful for going into two-column
+  mode or doublesided, etc.
+* w3-lemacs.el: Changed w3-back-link to go to 1+ the extent start position
+  to get around (extent-at) bug
+* w3-vars.el: Added www to the nonrelative link regular expression so that
+  links of that type will be parsed correctly.  New variable
+  w3-current-source holds the HTML source of a document.
+* w3.el: Most of the automatically generated html can now be referenced
+  with URLs like WWW://type/data.  Errors are generated this way, and you
+  can get the source for things like hotlists, history lists, help items,
+  etc.
+  Now stores the complete source of a document in a buffer-local variable,
+  so printing/mailing HTML and/or LaTeX is _MUCH_ faster, as is getting
+  the documents source - never any need to refetch it.  w3-reload-document
+  still does a fresh fetch though.
+* w3-emacs.el: w3-next-zone and w3-previous-zone now skip 'w3graphic zones
+* w3.el: Fixed small bug in re-insertion of SELECT menu items.  Stuck too
+  many spaces at the end of it.
+* w3-emacs.el: Make sure that x-popup-menu is bound before fset'ing
+  w3-x-popup-menu to it when in emacs 18
+
+Fri Feb 18 02:50:42 1994  William M. Perry  (address@hidden)
+* w3.el: Fixed problem in the textarea handling... misplaced a )...
+
+Thu Feb 17 19:38:50 1994  William M. Perry  (address@hidden)
+* w3.el: Fixed problem with w3-quotify-percents and null arguments...
+* w3-emacs.el, w3-emacs19.el, w3-lemacs.el, w3-old-lemacs.el, w3.el: Use
+  w3-quotify-percents in the (format ...) command in w3-view-this-url and
+  w3-view-url so that form queries don't mess up the format command` and
+  make it think it needs more arguments.
+* w3-emacs.el: Use insert-before markes in emacs 18
+* w3.el: Append fill-prefix to the paragraph parsing code.
+
+Wed Feb 16 21:47:33 1994  William M. Perry  (address@hidden)
+* w3-emacs19.el: Fixed dumb mistake in the setting up of
+  file-name-handler-alist... losing because of a misplaced ')'.  Gotta
+  love lisp :)
+* w3.el: Lots more file-ish type functions that will work with URLs.
+  w3-directory-p, real file-attributes, and stubs for more.
+* w3-emacs19.el: Redid the file-name-handler functions.  Stole
+  layout/ideas from the ange-ftp stuff from v19.
+* w3.el: Will check if running on a mono display and do dithering if it
+  is. Fixed problem with <LINK> parsing where it would delete too many
+  chars. Fixed problem with queries in w3-form-encode... too many &'s
+  Few more NeXTstep changes.
+* w3-lemacs.el: Lemacs menu's should no longer nuke people's Options menu
+  if it already exists.  Will add a submenu called 'WWW' to the
+  already-existing menu.
+* w3-emacs19.el: Added file-name-handler-alist support for emacs 19.
+  Works for find-file-other-window, find-file-other-screen, file-exists-p,
+  file-readable-p, file-executable-p, file-attributes, and
+  file-directory-p.
+* w3.el: Added new functions w3-file-size and w3-file-exists.
+* w3-emacs19.el: A few changes for NeXTstep emacs 19.  Menus now work,
+  storing URLS into the kill ring/NeXT clipboard, and loading of lmenu if
+  in dps. Still no [x|dps]-popup-menu though.
+
+Tue Feb 15 03:42:45 1994  William M. Perry  (address@hidden)
+* w3.el: Fixed w3-form-encode so that it actually returns the correct
+  query string if in a gopher or isindex form area...
+
+Mon Feb 14 19:12:31 1994  William M. Perry  (address@hidden)
+* w3.el: Multiline text area entry should now work in emacs 18 (put the
+  w3-do-text-entry outside of the save-excursion)
+* w3.el: Make w3-prepare-buffer mark the buffer as not modified.
+* w3-lemacs.el: Change w3-insert to insert-before-markers so that inlined
+  images will show up in the right place more often.
+
+Sat Feb 12 03:15:46 1994  William M. Perry  (address@hidden)
+* w3.el: Fixed a read-only buffer problem when fetching images...
+* w3-lemacs.el: New version of w3-track-mouse that doesn't need to move
+  (point) in the buffer... should be faster.
+
+Thu Feb 10 21:47:56 1994  William M. Perry  (address@hidden)
+* w3.el: Moved the image parsing until after everything else has been
+  parsed... this should fix everyones problems with inlined images
+  disappearing sometimes - they were attached to parts of the buffer that
+  was removed by other parsing routines.
+* dist.Makefile: The making of w3.info now changes the setfilename
+  directive in w3.texinfo to point to INFODIR.
+* w3-lemacs.el: Set end-open and start-open extent properties if setting
+  up a form.
+* w3.el: Fixed a type in one of the mule/forms patches.
+* w3-mule.el, w3-vars.el, w3.el: Miscellaneous fixes from Shin-ya Sato
+  <address@hidden> that make forms work much better in Mule.
+
+Wed Feb  9 23:37:11 1994  William M. Perry  (address@hidden)
+* w3-lemacs.el: Don't mess with graphic extents in w3-fix-extent-endpoints
+* w3-epoch.el, w3-lemacs.el, w3-vars.el, w3.el: More error checking in the
+  image code
+* w3.el: Fixed typo in w3-fetch-with-pgp...
+* w3.el: Slightly more intelligent way of doing w3-form-encode.
+
+Mon Feb  7 03:31:17 1994  William M. Perry  (address@hidden)
+* w3.texinfo: miscellaneous fixes/grammatical fixups
+* w3-epoch.el, w3-lemacs.el: Removed stupid message about possibly failing
+  to load an image because of the color map.
+
+Sun Feb  6 19:24:27 1994  William M. Perry  (address@hidden)
+* w3-vars.el: Changed w3-default-homepage to be defvar'd to nil, so that
+  w3-do-setup will grab the WWW_HOME variable if it can.
+* w3.texinfo: Fixed a few stupid bugs in @node structures that occurred
+  because I removed a node.
+* w3.el: Fix entity references in <TITLE> of documents.
+
+Sat Feb  5 02:55:05 1994  William M. Perry  (address@hidden)
+* Version 2.0 released.
+* w3.el: w3-public-key-exists will actually work now.
+* w3.el: Moved the w3-handle-graphics call within the let binding of
+  w3-handle-base, so that inlined images will work with <BASE> tags.  This
+  also fixes the problem of not being able to select the link an image is
+  covering with an ALT tag.
+* w3.el: Renamed w3-lemacs-19.8 to w3-old-lemacs because of problems with
+  v18 byte compiler.
+
+Fri Feb  4 17:11:03 1994  William M. Perry  (address@hidden)
+* w3-vars.el: Change w3-running-lemacs and w3-running-new-lucid to be
+  w3-running-old-lemacs and w3-running-lemacs, respectively.
+* w3-epoch.el, w3-lemacs.el, w3-vars.el, w3.el: Revamped some of the
+  w3-insert-graphic code so the conversion functions can be shared between
+  epoch & lucid.  Also added in code so that people with only XBM support
+  can use the inlined image code.
+* w3.el: Added functions to grab the servers public key from finger
+  information if possible when using PGP and PEM encryption
+* w3-html+.el: Much better table parsing routines - still not finished yet.
+
+Thu Feb  3 22:17:19 1994  William M. Perry  (address@hidden)
+* w3.el: Allow ~s in urls in w3-get-url-at-point
+* w3.el: Moved just the variable definitions to an outside file to ease
+  byte-compiling.  No longer loads whole w3.el just to get variable
+  definitions
+* w3.el: Moved w3-load-flavors into w3-do-setup
+
+Wed Feb  2 22:41:48 1994  William M. Perry  (address@hidden)
+* w3.el: w3-make-sequence now returns the sequence in ascending order.
+* w3.el: Changed the nntp/flee handling in w3-nntp-stat-newsgroup so that
+  it won't hang indefinitely.
+* w3.el: Made a few changes to the require functions so that mailcrypt and
+  nntp are not required until absolutely necessary.
+* w3-hyperbole.el: New version from address@hidden
+* w3-mule.el: Changed w3-grok-gopher-url to w3-grok-gopher-href
+* w3-docomp.el, w3-new-lucid.el: More compiler warnings fixed
+
+Tue Feb  1 21:47:04 1994  William M. Perry  (address@hidden)
+* w3.el: Fixed a few problems in w3-grok-http-href
+* w3.el: Support for the <BASE> tag.  New w3-grok-*-href functions that
+  can be used anywhere and return lists of server/port/file/etc.
+
+Mon Jan 31 22:32:52 1994  William M. Perry  (address@hidden)
+* w3-new-lucid.el: Fixed a free variable reference in w3-insert-graphics
+* w3-emacs.el, w3-emacs19.el, w3-epoch.el, w3-lucid.el, w3-new-lucid.el,
+  w3-next.el, w3.el: Moved some version-specific stuff out of the
+  definition of w3-mode and into the function w3-mode-version-specifics in
+  the w3-*.el files.
+* w3.el: Set w3-delimit-emphasis and w3-delimit-links to nil when doing
+  batch fetches.
+* w3.el: Mailing and batch-fetching now insert a <BASE> tag if
+  sending/saving the raw HTML.
+* w3.el: Fixed a few typos in w3-tn3270
+* w3-emacs19.el: Fixed a misplaced ( so that w3-follow-inlined-image works
+  in emacs19
+* w3.el: Added more descriptive function documentation to the autoloaded
+  functions.
+* w3.el: New variable w3-use-transparent.  If t, then it will use
+  transparent.el to do telnet/tn3270 links.  This is automatically set to
+  nil if you are in lucid emacs, epoch, or in a windowing system.
+* w3-mule.el: Added function w3-m2psbuffer that will print a buffer as
+  postscript in mule.
+* Renamed w3.texi to w3.texinfo
+* w3.el: Replaced <= with equal in case file size is nil...
+
+Sun Jan 30 18:40:16 1994  William M. Perry  (address@hidden)
+* w3.el: Added support for PGP and PEM encryption of requests.  Requires
+  the excellent mailcrypt.el by Jin S Choi (address@hidden)
+* w3.el: Added autoloads for 'gopher-dispatch-object and 'html-mode if
+  they didn't already exist.  Also added a patch from Jamie Zawinski that
+  fixes the ###autoload statements used by autoload.el
+* w3.texi: Now creates .info files just fine from makeinfo.
+
+Sat Jan 29 23:35:59 1994  William M. Perry  (address@hidden)
+* w3-emacs19.el, w3-epoch.el, w3-lucid.el, w3-new-lucid.el, w3.el: Added
+  an (fset 'w3-insert 'insert) to all but the epoch file, and used the
+  w3-insert written by Henry A. Rowley that will keep the zones intact.
+  Replaced all occurences of (insert) with (w3-insert)
+* w3-epoch.el: Getting the resource for underlining should work now.
+* w3.el: w3-add-document-to-hotlist now checks to see if the current
+  document is already in the hotlist.  If it is, it signals an error.
+* w3-new-lucid.el: Fixed problem in converting xbitmaps - left out a ' in
+  the sed command
+* w3-epoch.el, w3-new-lucid.el, w3.el: Changed how the
+  w3-graphic-converter-alist is specified.  Must now leave off the
+  ppmtoxpm command, and leave a stray '| ' at the en end of the
+  conversion.  The contents of the variable w3-ppmtoxpm-command are
+  appended to this string.
+* w3.el: Added a w3-convert-code-for-mule call in w3-sentinel if
+  w3-be-asynchronous is t.
+* w3-new-lucid.el: Several changes suggested by Jamie Zawinski
+  (address@hidden) More errror checking for the image loading, and display
+  a buffer describing each error in a buffer after parsing the buffer.
+  Also, if the image load fails, put a 'w3graphic zone over the [alt] tag.
+* w3.el: Several changes suggested by Jamie Zawinski (address@hidden) The
+  small extent made for graphics has the 'w3graphic property, so using
+  w3-follow-inlined-image on it will retrieve the full picture (for things
+  like lucid where it gets clipped to the line height).  No longer shows
+  'read 1 byte' messages - will only show a message when it has acually
+  received some info.
+* w3.el: Removed assumption that /usr/lib/X11/rgb.txt exists when using
+  ppmtoxpm
+
+Fri Jan 28 13:39:11 1994  William M. Perry  (address@hidden)
+* w3.el: Applied patch from address@hidden (Dong Liu) that fixed
+  a stupid problem with the w3-use-starting-points function.
+
+Wed Jan 26 23:36:02 1994  William M. Perry  (address@hidden)
+* w3-new-lucid.el: Changed w3-add-zone to always set end-open and
+  start-open - need more data for bug fixes.
+* w3-new-lucid.el: Added patch from Alastair Burt <address@hidden> to
+  fix not being able to get past graphic extents in 19.9
+* w3.el: The w3-nonrelative-link regexp now includes wais link types.
+* w3-emacs.el: Added a patch from address@hidden that fixed yet another dumb
+  mistake on my part in the emacs 18 w3-follow-link function.
+* w3.el: Basics of w3-pem-auth for the new httpd pgp/pem security
+* w3.texi: Documentation mime-types parsing, and viewer specifications.
+* w3.el: Viewers can now be lists, in which case it will be passed thru
+  'eval'.
+
+Tue Jan 25 20:33:15 1994  William M. Perry  (address@hidden)
+* w3-emacs.el: Fix from address@hidden for a problem in w3-follow-link for
+  emacs 18
+* w3-new-lucid.el: The problem with coredumps with lots of empty links in
+  lemacs 19.9 should (hopefully) be fixed.
+* w3.el: Added wais gateway support - not sure if it  works, but I get the
+  same results as I do with Mosaic, so good enough.
+* w3.el: Asynchronous retrieval over http works again.
+* w3-new-lucid.el, w3-epoch.el: Made sure w3-insert-graphic retrieved
+  graphics synchronously.
+
+Mon Jan 24 23:30:40 1994  William M. Perry  (address@hidden)
+* w3.el: Added w3-use-starting-documents and w3-show-starting-documents
+  that display the contents of the hotlist-type w3-starting-documents
+  variable.
+* w3.el: Added function w3-insert-formatted-url... inserts a formatted <A
+  HREF...></A> construct in a buffer.  Url is the url of the current
+  buffer (or link under point with prefix arg), text of the link defaults
+  to the title of the buffer or the text of the link under cursor.  Buffer
+  to insert into is prompted for.
+* w3-emacs19.el, w3-epoch.el, w3-lucid.el, w3-new-lucid.el: Added function
+  w3-zone-at that returns the zone at the position passed to the function
+  (can be point or marker).
+* w3.el: Changed the inlined images to have the highlight attribute if
+  possible.
+* w3-emacs.el, w3-emacs19.el, w3-new-lucid.el, w3.el: Rewrote lots of
+  functions so that inlined images are stored in their own zone, and
+  control-middle-mouse-button or M-x w3-follow-inlined-image will fetch
+  the inlined image and send it to an external viewer. w3-follow-link will
+  also get an inlined image if it cannot find a hyperlink or a form entry
+  area under cursor.
+* w3-emacs.el: Added w3-zone-eq for emacs 18 so that radio buttons will
+  work.
+* w3.el: Changed w3-handle-graphics so that if w3-delay-image-loads is t,
+  use a marker instead of an absolute (point) reference.
+* w3-new-lucid.el: Fixed a problem in the delayed image loading - would
+  always try to find w3-working-buffer, which would (should) not exist
+  when doing a delayed load.
+* w3-new-lucid.el: Added missing interactive spec to
+  w3-load-delayed-images
+* w3-new-lucid.el: Added function w3-load-delayed-images, and activated
+  the delay image load menu choice, added load delayed images menu choice.
+* w3.el: A few changes to the gopher support - should recognize gopher
+  directories more reliably.
+* dist.Makefile: Fixed distribution makefile to use the new system of 1
+  large file.
+* w3.el: Fixed problem with radio buttons - if more than one was set due
+  to bad use of the CHECKED argument, then it would not let you turn one
+  of them off.
+
+Sat Jan 22 12:36:28 1994  William M. Perry  (address@hidden)
+* w3.el: Fixed problem where unknown tags in a <PRE> or <XMP> segment were
+  getting nuked - bad when trying to show source code with < and > in them
+  - large chunks would disappear.  Thanks to Magnus Y Alvestad
+  <address@hidden> for noticing the problem.
+
+Fri Jan 21 20:52:24 1994  William M. Perry  (address@hidden)
+* w3.el: Merged most of the files into one large one.
+* w3.el: Parse out mime-types file if it exists at startup.
+* w3-epoch.el: Changed epoch to use the class name Emacs instead of emacs.
+* w3.texi: Fixed dumb mistake in documentation about w3-mode-hooks and
+  list indentation
+* w3.el: Keep/restore tab-stop-list when going into w3-mode
+* w3-new-lucid.el, w3-lucid.el, w3-emacs19.el: Renamed a few menu items,
+  and activated 'forward' and 'back' buttons.
+
+Thu Jan 20 23:27:31 1994  William M. Perry  (address@hidden)
+* w3-epoch.el: No longer remove numbers and periods from zones in
+  w3-fix-extent-endpoints
+* dist.Makefile: Fixed the 'make install' target.
+
+Thu Jan 20 15:55:04 1994  William M. Perry  (address@hidden)
+* w3-parse.el: Did a bit of cleaning up in the parsing code -
+  obsolete/short functions removed or merged.
+
+Wed Jan 19 20:15:14 1994  William M. Perry  (address@hidden)
+* w3.el: Added version # of efs/ange-ftp to the bug report template.
+* w3-new-lucid.el: Took out deletion of region when conversion of pixmaps
+  failed . . . don't need it in lucid
+* w3-new-lucid.el: Put in quick hack to go to 1+ extent-start-position to
+  get around bug in lemacs 19.9
+* w3-new-lucid.el, w3-epoch.el: Changes to the graphics code to work with
+  the new w3-request-* variables
+* w3-forms.el, w3-mime.el, w3-misc.el, w3-url.el, w3-vars.el: Using new
+  variables to control extra headers in MIME requests, as well as
+  specifying methods/data.
+
+Tue Jan 18 15:13:33 1994  William M. Perry  (address@hidden)
+* w3-mime.el: Changed mailcap parsing to strip out leading/trailing spaces
+* w3-forms.el: Changed w3-form-encode to check if the query is empty
+  before doing a substring.  Thanks to Michael Jankowski for noticing the
+  problem
+* w3-forms.el: Applied patch from Michael Jankowski to fix a problem in
+  w3-finish-text-entry in emacs 19 - tried to change text properties in a
+  read-only buffer
+* w3-misc.el, w3-mule.el, w3-url.el, w3-viewers.el: Miscellaneous patches
+  by Shin-ya Sato <address@hidden> for MULE support
+* w3-lucid.el, w3-new-lucid.el: Removed reference to 'value' from
+  w3-x-popup-menu - might not always be bound.
+* w3-url.el: Changed newsgroup handling yet again - can now work with
+  either Flee's nntp or the original nntp.el by Umeda.  No longer
+  require's gnus.
+* w3-new-lucid.el: Wrapped the make-pixmap call in a condition-case for
+  safety.
+* w3-epoch.el: Changed w3-insert-graphic to insert a '^' to attach the
+  graphic to.
+* w3-new-lucid.el: Changed w3-insert-graphic to create a larger extent
+  instead of using '^' - looks much better now.
+* w3-parse.el: Changed w3-handle-graphics to not insert a '^' for each
+  graphic - leave that up to w3-insert-graphic if it needs it.
+
+Mon Jan 17 22:32:40 1994  William M. Perry  (address@hidden)
+* w3-vars.el: Added image/x-xbitmap to the list of graphics converters.
+* w3-lists.el, w3-parse.el: Changed handling of <LI SRC> to only check if
+  w3-insert-graphic is defined, not hardcoded just for epoch.
+* w3-url.el: Directory listings in local file and ftp access now have
+  icons.
+* w3-epoch.el: Cacheing of images will now only store the image once, not
+  once for every time it is used.
+* w3-new-lucid.el: Graphics work now - image/xbm's are translated into the
+  foreground and background color of the 'default face.
+* w3-gopher.el: Gopher handling now spits out icons with appropriate ALT
+  refs.
+* w3-epoch.el: w3-insert-graphic is now only defined if epoch was compiled
+  with graphic zone support.
+
+Sat Jan 15 20:20:59 1994  William M. Perry  (address@hidden)
+* w3-gopher.el: Added patch to w3-grok-gopher-link from Alastair Burt.
+  Also added support for gopher urls with searches embedded in them
+  (Mosaic-style searches with '?' instead of tab.
+* w3.el: Added printing of whether you are in Mule, and the window system
+  andd window system version in w3-submit-bug.
+
+Fri Jan 14 22:37:42 1994  William M. Perry  (address@hidden)
+* w3-mime.el: Fixed authentication - was looking for the wrong header.
+  Also added support for using the URI: field instead of the Location:
+  field to get in sync with the latest HTTP/1.0 specification.
+* w3-lists.el: Few more message->w3-lazy-message conversion
+
+Thu Jan 13 23:15:36 1994  William M. Perry  (address@hidden)
+* w3-gopher.el: Added patches to w3-gopher.el from Alastair Burt
+  <address@hidden> that fixed a few problems.
+* w3-mule.el, w3-url.el: Miscellaneous mule enhancements
+
+Wed Jan 12 19:41:05 1994  William M. Perry  (address@hidden)
+* w3-new-lucid.el: Fixed problem with my misunderstanding of the 'end-open
+  and 'start-open extent properties.
+* w3-lucid.el, w3-new-lucid.el: Added patch by Alastair Burt
+  <address@hidden> that changes w3-x-popup-menu to do a
+  completing-read if the last event was not a button/menu event.
+* w3-viewers.el: Fixed w3-save-binary-file
+* w3-mime.el: Changed w3-parse-mailcap to use new variable
+  w3-mime-mailcap-overrides.  If t, then entries in the users mailcap file
+  will replace the defaults in w3-mime-viewers.
+* w3-misc.el: Changed w3-upcase-region so that it will not touch entity
+  declarations either.
+
+Mon Jan 10 22:43:51 1994  William M. Perry  (address@hidden)
+* w3-parse.el: REL and REV attributes of links can now be comma-separated
+  lists.
+* w3-parse.el: Fixed broken regular expression in <LINK> parsing
+* w3-lists.el: Fixed problem of paragraphs within lists having the
+  highlighting stripped from the first character.
+* w3-parse.el, w3-url.el: Changed most of the unimportant 'message's to
+  use w3-lazy-message instead.
+* w3-url.el: Added variable w3-show-status.  If nil, no messages will be
+  shown in the modeline showing where the current retrieval/parse is at.
+* w3-parse.el: Added patch by Rainer Pruy
+  <address@hidden> that shows the SRC attribute of
+  IMG tags if no ALT tag is given.
+* w3-emacs.el: Added mouse support for emacs 18
+
+Sat Jan  8 20:32:46 1994  William M. Perry  (address@hidden)
+* w3-url.el: more support for bad HTTP: links
+* w3-misc.el, w3-mule.el, w3-viewers.el: Applied a patch from Shin-ya Sato
+  <address@hidden> that keeps MULE from encoding binary data it
+  receives from subprocesses, etc.
+* w3.el: Added tab-width to the list of variables saved in w3-mode.
+* w3-gopher.el: CSO searching now works.
+* w3-vars.el: Changed default value of w3-delimit-emphasis to take MULE
+  into account.
+* w3-url.el: Added function w3-build-url that will build a URL in stages.
+  Not used anywhere yet.  Thanks to T.V. Raman for suggesting it.
+* w3-gopher.el: Fixed gopher support for using gateways.  Won't give
+  errors at top and bottom of buffer.
+* w3-misc.el: Changed w3-hexify-string so that it won't hex slashes in the
+  string.
+* w3.el: Another check for efs-auto added
+
+Fri Jan  7 23:53:19 1994  William M. Perry  (address@hidden)
+* w3.el: Changed checking of efs/ange-ftp to also check for efs-auto
+  before loading ange-ftp.
+* w3-emacs19.el, w3-lucid.el, w3-new-lucid.el: Changed menu handling to
+  ignore links with nil HREFs when making the 'links...' menu.
+* w3-gopher.el: Changed w3-convert-ask-to-form for better handling of
+  SELECT boxes that have no choices.
+* w3.el: Added w3-leave-buffer.  Does a bury-buffer on the current buffer
+  instead of killing it.
+* w3-mime.el: Fixed problem where using telnet in a subprocess would chop
+  off lots of front of incoming data.  Bad kill-line in
+  w3-is-mime-response.
+* w3-misc.el, w3-url.el, w3-viewers.el: Changed all yes-or-no-p/y-or-n-p
+  functions to use the function specified by w3-confirmation-func
+
+Thu Jan  6 23:58:37 1994  William M. Perry  (address@hidden)
+* w3-gopher.el: Changed gopher parsing routines to print the type of the
+  link in the listing.  The text describing the link is configurable by
+  the variable w3-gopher-labels.
+* w3-gopher.el: More tweaks for more mosaic-like behavior
+* w3-parse.el: Searchable gopher objects no longer become inlined forms -
+  selecting them creates the form, as in Mosaic.
+* w3-gopher.el, w3-url.el: Switched gopher handling to use Mosaic's type
+  of double-typing.  This makes it much easier to get searching done right
+  (whether it needs a 7/ or not, etc).
+
+Wed Jan  5 14:15:02 1994  William M. Perry  (address@hidden)
+* w3-typecheck.el: Use new variable w3-passwd-entry-func instead of
+  hard-coding ange-ftp-read-passwd.
+* w3.el: Reworked some of w3-do-setup, and added comments
+* w3.el: Changed to only require 'ange-ftp if not using efs.
+* w3-lists.el: Did some work on the DL handling
+* w3-url.el: Directory formatting routine will now include last file
+  modification date and size if possible.  If not date data is returned by
+  file-attributes, or current-time-string does not take a parameter, then
+  no date is shown.  Size is usually shown (almost always if you use EFS
+  instead of ange-ftp)
+* w3.texi: Round and round he texinfo's, where he stops, noone knows.
+
+Tue Jan  4 23:00:35 1994  William M. Perry  (address@hidden)
+* w3-gopher.el: Fixed problem in handling of gopher text files . . . were
+  always being parsed as HTML.
+* w3-forms.el: Fixed dumb problem in encoding a gopher+ ASK form.
+* w3.texi: Initial revision
+
+Mon Jan  3 19:06:17 1994  William M. Perry  (address@hidden)
+* All files: Updated copyright notices
+* w3-lists.el: UL and OL lists can now have <LI ALT="some text" SRC="some
+  image">
+* w3-misc.el: Renamed w3-rassq-with-equal to w3-rassoc
+* w3-emacs.el, w3-emacs19.el: Fixed stupid problem where I was trying to
+  call the x-store-cut-buffer function even if not in X
+
+Sun Jan  2 22:47:02 1994  William M. Perry  (address@hidden)
+* w3-misc.el: Added a function to break up a menu description into smaller
+  chunks and submenus.
+* w3-gopher.el: Now smarter about when to parse out a gopher object as a
+  directory listing
+* w3-emacs19.el, w3-lucid.el, w3-new-lucid.el, w3-emacs.el, w3-epoch.el:
+  Added function w3-store-in-x-clipboard
+* w3.el: w3-save-url will now copy the url into the X clipboard
+* w3.el: Added autoloads that autoload.el can understand.
+* w3-forms.el: Forms links will now highlight when the mouse moves over
+  them in lucid emacs (and any other flavor that eventually supports them
+  in its version of w3-add-zone)
+* w3-gopher.el: Fixed dumb problem where parts of the gopher+ selector
+  string were being left in w3-current-file, so things like w3-view-url,
+  etc were getting the wrong information.
+* w3-gopher.el: Fixed stupid problem where I didn't convert the gopher
+  selector strings into url encoding before creating the <A> tags in
+  w3-format-gopher-link.  This caused gopher links with spaces/tabs/etc to
+  not be parsed correctly.  Thanks to John Ladwig <address@hidden>
+  for noticing the problem.
+
+Sat Jan  1 20:08:19 1994  William M. Perry  (address@hidden)
+* w3-parse.el: Added support for showing some of the HTTP/1.0 headers in a
+  buffer. Controlled by the new variable w3-show-headers.  Should be a
+  list of HTTP/1.0 headers (all lowercase) to include at the end of the
+  buffer. If nil, nothing will be shown.  Thanks to Jared Rhine for
+  suggesting it.
+* w3-gopher.el: Removed multiple definitions of w3-parse-gopher, and
+  revamped the handling of gopher titles. 
+* w3-misc.el: Changed w3-batch-fetch to be more robust - is now able to
+  retrieve any type of information, and the user can specify whether they
+  want formatted text, raw HTML, or transfer in binary mode.
+* w3-parse.el: Changed the fill-column and <HR> calculation routines to
+  honor the new variable w3-strict-width.
+* w3-misc.el: Removed some useless variables from w3-get-url-at-point in
+  the eternal quest for less compilation warnings.
+* w3-misc.el: Fixed problem in w3-strip-leading-spaces and
+  w3-eat-trailing-space
+* w3-parse.el: The link building code will now remove all entity
+  references in the link text before storing it in the zone - this means
+  that the menu building code and w3-complete-link will no longer have
+  unresolved entities in them looking nasty.
+* w3-misc.el: Added function w3-fix-entities-in-string.  Takes any string
+  and removes all entity references within it, and replaces it with normal
+  text (uses the w3-html-entities assoc list).
+* w3-new-lucid.el, w3-lucid.el: Added function w3-x-popup-dialog
+
+Fri Dec 31 21:45:04 1993  William M. Perry  (address@hidden)
+* w3-new-lucid.el, w3-lucid.el: Fixed problem in w3-fix-extent-endpoints
+* w3-misc.el: Fixed problem in w3-eat-trailing-space that would always
+  remove one too many spaces.
+* w3-mosaic.el: Added function w3-rename-hotlist-entry to give a new title
+  to an item in your hotlist.  Will not let you use a title that is
+  already a member of the hotlist.
+* w3-emacs19.el, w3-lucid.el, w3-new-lucid.el: Added a few options to the
+  navigation menu
+* w3-url.el: Added a patch from Fran Litterio <address@hidden> that
+  adds variable w3-reuse-buffers.  Also changed the buffer reusing code
+  will skip over w3-working-buffer in its search for a matching url.
+* w3-url.el: Fixed problem in passing things off to gopher-mode with blank
+  selector strings - was not defining a good type (type was set to 0
+  instead of ?1).
+* w3-url.el: Fixed typo in gopher handling
+* w3-gopher.el: Added % retrieved messages when retrieving a gopher+
+  object, fixed problem in gopher parsing for emacs 19.
+
+Thu Dec 30 23:58:19 1993  William M. Perry  (address@hidden)
+* w3-gopher.el: Fixed dumb problem in gopher formatting - didn't check if
+  the selector string was longer than 1 character before trying to extract
+  the first char.
+* w3-misc.el: Fixed major problems with w3-strip-leading-spaces and
+  w3-eat-trailing-space again.
+* w3-forms.el: Added support for submitting gopher+ ASK blocks
+* w3-url.el: Changed gopher support/url parsing routines to handle gopher+
+  and gopher ASK blocks without warping the URLs too much.
+* w3-gopher.el: Added in gopher+ support
+* w3.el: Fixed viewing of gopher links for new storage format.
+* w3-gopher.el, w3-url.el: Revamping gopher
+* w3-vars.el: Added variable w3-gopher-to-mime
+* w3-vars.el: Added variable w3-gopher-types
+
+Thu Dec 30 13:57:53 1993  William M. Perry  (address@hidden)
+* Added support for Mule (Multi-Lingual Emacs), mainly highlighting of
+  links.  Thanks to address@hidden for the patches.
+* w3-next.el: Added provide 'w3-next
+* w3-parse.el: Might have fixed the over-run into other words/spaces
+  in link highlighting.
+
+Wed Dec 29 23:33:07 1993  William M. Perry  (address@hidden)
+* w3-misc.el: Added function w3-fetch-url-at-point... thanks to Torre
+  J. Wenaus <address@hidden> for the code.
+* w3-parse.el: Back to using window-width as starting point for
+  w3-right-border.
+* w3-vars.el: Removed variable w3-hypertext-extns
+* w3-mosaic.el:  Removed support for adding old gopher-mode pages to
+  the hotlist.  Trying to get people to use hypertext-gopher-mode.
+* w3-next.el: Initial revision
+* w3-gopher+.el: Added new function w3-convert-ask-to-form that
+  converts a Gopher+ ASK block into an HTML form.
+* w3-forms.el: Value and default value are now reset for each SELECT
+  area in forms.
+* w3-vars.el: Changed default gopher handling to be in hypertext.
+
+Tue Dec 28 17:41:51 1993  William M. Perry  (address@hidden)
+* w3-url.el: Can now handle http:/somefile - it will substitute the
+  server and port of the current document to make a complete url.
+* w3-forms.el: Names in INPUT tags can be empty
+* w3-auth.el, w3-emacs.el, w3-emacs19.el, w3-epoch.el, w3-forms.el,
+  w3-lists.el, w3-mime.el, w3-misc.el, w3-parse.el, w3-typecheck.el,
+  w3-url.el, w3-vars.el, w3.el: Removed lots of references to bound
+  but unreferenced variables.
+* w3-misc.el, w3-url.el, w3-vars.el, w3.el: Added new variables
+  w3-mail-command and w3-mail-other-window-command. These variables
+  will control what functions are called when w3 needs to send mail.
+  W3 tries w3-mail-other-window-command only if w3-mutable-windows is
+  t, then w3-mail-command if this function is not bound.  Then goes to
+  mail-other-window, then just to mail.
+
+Fri Dec 24 03:21:58 1993  William M. Perry  (address@hidden)
+* w3-url.el: Formatting directories now gives a progress indicator in
+  % of files converted to hypertext listing.
+* w3-url.el: Added code to check for whether a file is a symbolic
+  link.  If it is, then put in an arrow and the name of the link (like
+  ls -l).
+
+Thu Dec 23 18:53:54 1993  William M. Perry  (address@hidden)
+* w3-epoch.el, w3-misc.el, w3-parse.el, w3-typecheck.el, w3-vars.el:
+  Replaced long regular expressions for checking whether a URL is
+  relative  or not with a variable w3-nonrelative-link to save
+  space/typing, and it will be easier to change in the future.
+* w3-misc.el: Added function w3-batch-fetch to retrieve all the urls
+  passed to it on the command line and save them as text files.
+  Thanks to Jared Rhine for suggesting it.
+* w3-parse.el: Removed use of screen-width/window-width when computing
+  fill column.  Uses old value of fill-column.
+* w3-mosaic.el: Fixed problem in new personal annotation parsing code
+  that would barf if you didn't have any personal annotations.
+
+Thu Dec 23 16:28:22 1993  William M. Perry  (address@hidden)
+* w3-mosaic.el: Made lots of changes to the personal annotation
+  handling.  Deletion will work properly now (won't mess up the
+  internal representation of the annotations), support for the real
+  Mosaic annotation format (more than one annotation on a url yields
+  only one line in the annotation LOG file), figures out the highest
+  annotation number instead of using the last line in the file +1.
+* w3-emacs.el: Added definition of w3-create-faces.
+* w3-gopher+.el: Initial revision
+* w3-gopher.el: Fixed quite a few problems with gopher support.
+
+Tue Dec 21 06:47:50 1993  William M. Perry  (address@hidden)
+* w3-parse.el: Fixed idiotic problem where no PRE segments were being
+  rendered.  *sigh*
+
+Sat Dec 18 15:03:59 1993  William M. Perry  (address@hidden)
+* w3-url.el, w3-gopher.el, w3-forms.el: Added support for searching in
+  gopher.  Transforms into a special type of form, like <ISINDEX>
+  tags.  Only works if retrieved from a gopher listing right now.
+* w3-vars.el: Changed default viewer for text/plain to be w3-mode
+* w3-parse.el: Fixed problem with recursive filling of paragraphs - if
+  there were too many <PRE> segments, then it would die from recursing
+  too much. Thanks to Tom Tromey <address@hidden> for pointing
+  out the problem.
+
+Fri Dec 17 23:01:57 1993  William M. Perry  (address@hidden)
+* w3-url.el: Changed the display of XX of YY bytes transferred in
+  HTTP/1.0 responses to be optional.  Would mess some people up that
+  are behind gateways using telnet, etc.  Variable is
+  w3-show-http2-transfer.
+* w3-lists.el: Added support for <LI SRC="blahblahblah"> for list
+  items with icons, etc.
+* w3-epoch.el:  Rewrote the resource fetching routines to me
+  consistent with emacs 19 and lucid emacs.
+* w3-lucid.el, w3-emacs19.el, w3-epoch.el, w3-new-lucid.el: Moved all
+  face creation stuff into w3-create-faces.
+* w3-vars.el: Fixed typo in w3-graphic-converter-alist
+* w3-vars.el: Added keybindings > & < to go to end/beginning of
+  document.  Added functions w3-end-of-document and
+  w3-start-of-document to go the end and beginning of a document
+  respectively.
+* w3-forms.el: Fixed a problem in the new text area support.
+* w3-forms.el, w3-typecheck.el: Reworked quite a bit of stuff to get
+  forms submissions working correctly. You no longer have to keep
+  buffers around until you submit the form, and the default text (or
+  the current value of the button) is inserted each time you edit the
+  form area.
+* w3-mime.el:  Changed w3-parse-mime-viewers to split the Accept:
+  string onto one or more lines as appropriate, as the NCSA server
+  doesn't seem to like the long Accept: line when POSTing a form.
+* w3.el: Merged in support for NeXT emacs from Laurent Dami
+  <address@hidden> (emacs 18.58 on NeXTstep)
+* w3-emacs.el, w3-emacs19.el, w3-epoch.el, w3-lucid.el,
+  w3-new-lucid.el: Added function w3-setup-version-specifics that will
+  do any required fiddling for each version of emacs.
+
+Thu Dec 16 23:22:08 1993  William M. Perry  (address@hidden)
+* w3-new-lucid.el: Fixed problem with w3-fix-extent-endpoints failing
+  when an extent was completey spaces/newlines
+* w3-forms.el: Changed regular expressions to allow one or more =
+  signs in name/value tags.
+* w3-forms.el: Made input tags with NAME of isindex do an automatic
+  submission, ala Mosaic, and address@hidden's suggestion on
+  www-talk that browsers should standardize on this hack.
+* w3-parse.el: Changed form-based searching to use an input tag of
+  NAME isindex like Mosaic.
+* w3-parse.el: Fixed error in new header routines. Would bomb if a
+  header was not terminated correctly.
+* w3-parse.el: No longer remove tabs at the beginning of the buffer -
+  was messing up lists.  Still removes spaces/newlines
+* w3-forms.el, w3-parse.el: Added real support for TEXTAREA tags, and
+  wrap TEXTAREA input tags in PRE segments.
+* w3-forms.el: Fixed bad regular expression in forms mode that would
+  cause tags with VALUE="" to be drawn wrong.
+* w3-newparse.el, w3-url.el: Use new function w3-lazy-message instead
+  of message.  Will not update the modeline if called more than once a
+  second.  Thanks to Jamie Zawinski <address@hidden> for the patches.
+* w3-viewers.el: Starting viewers no longer starts an interactive
+  shell & exec.  Thanks to Jamie Zawinski for showing me that it was a
+  dumb thing to do :)
+* w3-new-lucid.el: Initial revision
+* w3-vars.el, w3.el, w3-lists.el: Changed occurences of w3-running-era
+  to w3-running-new-lucid
+* w3.el: Moved creation of w3-mime-accept-string into w3-do-setup
+* w3-epoch.el: Fixed problem in epoch form entry.
+* w3-forms.el: Changed assignment to free variable method in w3-handle-forms.
+* w3-forms.el: Fixed the revert button bugs in emacs 19.
+* w3-emacs19.el: changed w3-delete-zone to use remove-text-properties
+  instead of putting nil text properties.
+* w3-emacs19.el: Changed w3-delete-zone to remove the face and
+  mouse-face properties. 
+
+Wed Dec 15 22:56:43 1993  William M. Perry  (address@hidden)
+* w3-lists.el: Added a 't' to calls to replace-match so that the case
+  is preserved.
+* w3-vars.el: Added variable w3-list-chars-assoc for specifying what
+  characters to insert at the front of lists.
+* w3-lists.el: Can now control what characters are inserted at the
+  front of a list. See w3-list-chars-assoc for details.
+
+Wed Dec 15 20:41:02 1993  William M. Perry  (address@hidden)
+* Version 1.7.14
+* w3-forms.el: Fixed problem with resetting popdown menus to the
+  defaults.
+* w3-epoch.el: Rewrote w3-fix-extent-endpoints to remove
+  newlines/whitespace from front of zones also, as well as numbers &
+  periods.  This will fix lists, but might mess up real links once in a
+  while.  Oh well, epoch won't be around much longer anyway.
+* w3-mosaic.el: Fixed bug in w3-write-global-history where 'nil' in
+  the history would cause it to choke.  Thanks to address@hidden
+  for noticing the problem.
+* w3-emacs.el: Changed the w3-fix-extent-endpoints to remove
+  newlines/whitespace from the front of zones also.
+* w3-lists.el: Changed the list handling code to use
+  insert-before-markers if using emacs 18.  This keeps the
+  indentation/numbering to not become part of the zones.
+* w3-emacs19.el: Fixed a few errors with the new forms/link movement
+  code
+* w3-emacs19.el: Changed w3-follow-link to not die on links with no
+  data.
+* w3-emacs19.el: Changed w3-forward-link and w3-back-link to honor
+  forms entry areas.
+* w3-vars.el: Changed definition of w3-header-char-assoc to use BR correctly
+* w3-parse.el: <BR> tags are rendered a little better now - no extra
+  spaces from the fill-region will make them look odd.
+  
+Tue Dec 14 21:41:29 1993  William M. Perry  (address@hidden)
+* w3-url.el: Added checking to w3-fetch to see if a buffer visiting a
+  URL already exists before fetching it.  Offers to reuse the old one if
+  found.
+* w3.el: Changed w3-save-url to be more consistent with the other
+  commands that muck with URLs.  C-k grabs the current URL into the kill
+  ring, and C-k with a prefix arg grabs the URL under pt into the kill
+  ring.  Thanks to Jared Rhine for pointing out the inconsistency.
+* w3-mosaic.el: Added function w3-append-hotlist.  This will append a
+  hotlist to the one currently in memory.
+* w3-parse.el: Fixed problem where <P> breaks after a header item were
+  not being erased.
+* w3-misc.el: Added function w3-upcase-region that will convert a
+  region of text to uppercase, but ignore any text in it that is between
+  < and >.  This will stop it from changing the links references within
+  <A> tags.
+* w3-vars.el: Changed the header assoc list to use w3-upcase-region
+  instead of upcase region.  Was causing links in headers to point to
+  the wrong files.
+* w3-era.el, w3-lucid.el: Added patch from Alastair Burt that fixes a
+  few problems in the lucid menu handling code (malformed, plus trims
+  the menu items to w3-lucid-max-item-size so that they don't shoot off
+  the sides of your screen.
+* w3-url.el: Added a space at the end of the prompt in w3-open-local
+* w3.el: Changed w3-reload-document so that it remembers where you
+  were in the buffer and repositions you there.
+* w3-mime.el: Changed the format of w3-mime-accept-string so that it
+  can be used in other places.
+* w3-misc.el: Added functions w3-forward-in-history and
+  w3-backward-in-history.  This will first try to find the actual buffer
+  recorded in the history list, then any buffer with the same URL, then
+  goes to point in those buffers.
+* w3-vars.el: Added new variable w3-current-next-link and
+  w3-current-last-link that are buffer-local.  These store the history
+  information for this buffer.
+* w3.el: Changed a few functions to use the new history mechanism
+* w3-url.el: Modified w3-fetch to store history items in the new
+  variables
+  
+Mon Dec 13 23:39:20 1993  William M. Perry  (address@hidden)
+* w3-emacs.el: Finished function w3-fix-extent-endpoints, but need to
+  do something about the markers moving in front of list items.
+  w3-fix-extent-startpoints or something similar.
+* w3-lucid.el: Added missing function 'w3-delete-zone Fixed menu
+  generation error
+* w3-misc.el: Changed w3-maybe-relative and a few other functions to
+  take an optional 'DATA' parameter for using the POST command,etc.
+* w3-forms.el: Fixed a few problems with non-POSTing forms submissions
+* w3-parse.el: Removed code to eat newlines/whitespace at the
+  beginning/end of links.  Was causing errors if links were within PRE
+  segmens (actually, only if a link was the last thing in a PRE segment,
+  and it had whitespace after it, and before the </PRE>
+* w3-forms.el: Fixed problem with forms <SELECTION MULTIPLE> support.
+  Wasn't giving the fake checkboxes any 'value's, so it was reported as
+  'ON' to the server, not the name of what was selected.  Also fixed a
+  problem where the option variable in SELECTION handling wasn't being
+  set to nil each time, so each successive SELECTION tag would get more
+  and more choices.
+* w3-parse.el: Added call to function w3-fix-extent-endpoints.  Should
+  fix the problem with forms eating newlines/spaces at the end of form
+  entry areas when new data is entere.
+* w3-forms.el: Fixed problem in forms submission.  Would die if the
+  first item in a form was a SELECTION - it was not storing the
+  method/actionurl if it was.
+
+Sun Dec 12 20:54:44 1993  William M. Perry  (address@hidden)
+* w3-epoch.el: Added function w3-fix-extent-endpoints
+* w3-emacs.el, w3-emacs19.el, w3-era.el, w3-lucid.el: Added new
+  function w3-fix-extent-endpoints.  Makes extents smaller if they have
+  newlines/whitespace at the end.  This will keep the forms support from
+  killing newlines whenever you do a form entry.
+* w3-cache.el: Added code to store stuff in cache as compressed
+  (gzipped) data.
+* w3-url.el: HTTP links like http://cs.indiana.edu are now recognized
+  (no longer needs the trailing '/'
+* w3-lists.el: Fixed problem where alternating <P> tags would
+  disappear within lists.  Over-aggressive regular expression.
+* w3-url.el: Changed the handling of content-length - using
+  w3-parse-mime-headers was causing an infinite loop in redirection.
+* w3-mime.el: Fixed a few problems in the redirection handling because
+  of switching to lower-case headers in w3-current-mime-headers.
+* w3-url.el: Added support for using the content-length header in
+  HTTP/1.0 responses to show how big the file is in the minibuffer.
+* w3-mime.el: Changed the MIME parsing routines to save the header
+  fields in lowercase.
+* w3-emacs.el: Fixed dumb problem in w3-complete-link for emacs 18.
+  Left out a call to w3-zone-data.
+* w3-url.el, w3-forms.el: Replaced use of member with w3-member.
+* w3-forms.el: Fixed error in regular expression where buttons with
+  spaces in their VALUE fields would not be rendered.
+* w3-viewers.el: New way to specify whether to view process output or
+  not.  w3-working-buffer is always destroyed if a viewer is invoked.
+* w3-vars.el: Added variable w3-always-show-output.
+* w3-vars.el: Changed def. of &yuml; to be ?\377 instead of the actual
+  character 377.  Was causing problems with CVS.
+* w3-parse.el: Whitespace at the beginning of buffers will now be
+  erased.  Headers will now be a little more intelligent about how they
+  do line/paragraph breaks.  Headers can now be shown on text terminals
+  by the variable w3-header-chars-assoc.  Thanks to Jared Rhine for the
+  suggestion.
+* w3-parse.el: Added support for user-customizable text before and
+  after headers
+* w3-misc.el: Changed w3-eat-trailing-spaces and
+  w3-strip-leading-spaces to get ride of newlines too.
+* w3-vars.el: Added the variable w3-header-chars-assoc to have
+  formatting of headers on dumb terminals.
+
+Fri Dec 10 21:14:07 1993  William M. Perry  (address@hidden)
+* w3-lists.el: Fixed bug where lowercase list tags (ol instead of OL)
+  would cause an infinite loop if there were within another list.  Left
+  out an (upcase (..))
+  
+Thu Dec  9 23:24:10 1993  William M. Perry  (address@hidden)
+* w3-forms.el: Changed the handling of MULITPLE selections in option
+  lists to be a <UL> of the options, all checkboxes with the same name.
+
+Wed Dec  8 22:46:07 1993  William M. Perry  (address@hidden)
+* w3-lists.el: Fixed a bug where PRE segments within lists would be
+  ignored and filled.
+* w3-forms.el: Added support for the SEVERAL/MULTIPLE attribute on the
+  SELECT input tag.  Rendered as a preformatted list of checkboxes.
+* w3-misc.el: Added function w3-eat-trailing-space
+* w3-mime.el: Fixed a dumb problem where I forgot a "%s" in a format
+  string and so wasn't sending any data during a POST forms submission
+* w3-forms.el: Added support for POST submission of forms
+* w3-mime.el: Added a 'data' field to the w3-create-mime-request
+  function.  This will make it easy to implement post in a more
+  generalized way later.
+* w3-url.el: Added ability to send arbitrary data down through
+  w3-fetch, w3-retrieve, and w3-http.  Useful for POST method.
+* w3-emacs19.el: Removed patch for double-skipping of links in early
+  versions of emacs.  People using < 19.21 should upgrade.
+* w3-lists.el: Nested lists should now be a little quicker.  Also
+  fixed the problem where paragraphs within lists would have an extra
+  space at the beginning of the first line.
+* w3-forms.el: Changed w3-do-form-entry to do w3-delete-zone before
+  deleting the text contained by the zone.  Previous behavior would make
+  emacs19 bomb with an error.
+* w3-typecheck.el: Changed the option reading so that it checks
+  whether w3-x-popup-menu returns a cons pair or a plain string and acts
+  accordingly.
+* w3-docomp.el: Added lots of autoloads to get rid of compilation errors
+* w3-mime.el: Changed the header parsing to get _ALL_ the headers and
+  store them in an assoc list instead of just getting the 3 or 4 I need
+  now.  Will make it easier to expand on later when the HTTP/1.0 spec
+  grows.
+* w3-vars.el: New variable w3-current-mime-headers, which is an assoc
+  list of MIME headers for each document.
+* w3-url.el: Changed w3-retrieve so that if a response it not an
+  HTTP/1.0 response, add its name to w3-bad-server-list if it is not
+  already a 'member'.
+* w3-mime.el: Added support for the new '204 NoResponse' HTTP/1.0
+  response.  No new document is displayed.
+
+Tue Dec  7 21:09:21 1993  William M. Perry  (address@hidden)
+* w3-forms.el: Some revisions to try and make the radio button
+  toggling faster.  Will now only change the radio button(s) that are
+  set to be off, and the one that is supposed to be on, on.
+* w3-lucid.el, w3-epoch.el, w3-era.el, w3-emacs19.el: Added function
+  w3-zone-eq
+* w3-era.el: Fixed typo in w3-zone-data that was causing forms to
+  screw up.
+* w3-forms.el, w3-newparse.el: Use 'intern' instead of read
+* w3-emacs19.el: Removed the local-map from the text properties.  Put
+  it in the distribution by mistake.
+* w3-emacs19.el: applied patch from <address@hidden> to fix
+  skipping 2 links when going backwards.
+* w3-html+.el: Fixed a missing ) or two
+* w3-cache.el: Initial revision
+* w3-vars.el: Added variables for document caching.
+* w3-html+.el: Trying to get tables working better
+
+Mon Dec  6 23:04:01 1993  William M. Perry  (address@hidden)
+* w3-era.el: Fixed dumb error where w3-follow-link would try to fetch
+  the text of the link, not the url of the link.
+* w3-emacs19.el: Fixed a few things with the new text properties
+  support.
+* w3-forms.el: Removed reference to free variable prompt in
+  w3-do-form-entry.  Cut & pasted a few too many lines.
+* w3-forms.el: Changed all the form handling routines that reformatted
+  the buffer to use w3-form-format-<input-tag-type> instead of reusing
+  the code.  Was causing some inconsistent redraws.  Thanks to Arup
+  Mukherjee <address@hidden> for noticing the problem.
+* w3-parse.el: Styles will now work again in epoch.  Needed to
+  re-apply a patch that got lost in a hard drive crash.  Thanks to Henry
+  A. Rowley <address@hidden> for the patch.
+* w3-emacs19.el: Fixed problem in the making of menus.  Had a (list
+  ...) that included the 'displayable' option in the menu vectors.
+  Thanks to Jorge Sousa Pinto <address@hidden> for noticing the
+  problem.
+* w3-emacs19.el: Fixed a cut&paste error - multiply defined functions
+  and a lot of typos in w3-complete-link
+* w3-misc.el: Added function w3-strip-leading-spaces
+* w3-era.el: Changed the w3-complete-link routine to strip spaces from
+  the front of links so that all of them will be visible.
+* w3-lucid.el, w3-epoch.el, w3-emacs19.el, w3-emacs.el: Changed the
+  w3-complete-link routine to strip spaces from the front of links so
+  that all of them will be visible.
+* w3-vars.el: A few revisions to the default settings of
+  w3-style-chars-assoc
+* w3-vars.el: Added the variables w3-style-chars-assoc and
+  w3-delimit-emphasis for doing text-based markup.
+* w3-parse.el: Added the ability to have characters that define the
+  start and end of a region of formatting (ie: * surrounds bold text, _
+  surrounds underlined text, etc).  Controlled by w3-style-chars-assoc
+  and w3-delimit-emphasis variables.  Thanks to Jared Rhine for
+  suggesting it.
+
+Sun Dec  5 21:38:23 1993  William M. Perry  (address@hidden)
+* w3-url.el: fixed typo in w3-open-local-internal.
+* w3-url.el: Disabled use of w3-be-asynchronous for now
+* w3-era.el: Enabling/disabling of Era menus now cleaner than in lucid
+* w3.el: Menus will now be created when running in Era
+* w3-vars.el: Added face-specific stuff for Era, and modified the
+  default value of w3-delimit-links to take the w3-running-era variable
+  into account.
+* w3-vars.el: Better checking of the various w3-running-* variables.
+  I long for the day when they will all merge. :)
+* w3-era.el: Added support for 'viewing' a form entry area with
+  w3-view-this-url Will message the name and type of the form entry
+  area, but returns nil if called with no-show 't'.
+* w3-era.el: More changes to be era-specific
+* w3-era.el: Basic switch to era-specific functions from the lucid
+  cust. file
+* w3-epoch.el: Added alias w3-delete-zone (to epoch::delete-zone)
+* w3-emacs19.el: Added function w3-delete-zone
+* w3-forms.el: Use function w3-delete-zone instead of a large (cond
+  (...)) for using delete-zone, etc.  Easier to add support for new
+  flavors of emacs.
+* w3-vars.el: Added the variable w3-running-era
+* w3.el: Added loading of specific routines for 'era' - the
+  epoch/lucid merge
+* w3-era.el: Initial revision
+* w3-emacs19.el: Fixed a problem in w3-only-links that would return
+  the wrong position if the link was only one character long.
+* w3-misc.el: Added the function w3-reload-all-files.  This will
+  remove all the 'features' 'provided by w3, and then do a (require 'w3)
+  so that the files will all be reloaded.
+* w3-mime.el: Changed the w3-is-mime-response function so that it will
+  remove the HTTP/1.0 request if it has been echoed to the screen,
+  either by telnet or by the tcp.el emulation package.  Thanks to
+  everyone who reported the bug.
+* w3-parse.el: Moved handling of telnet header lines into
+  w3-is-mime-response
+* w3-emacs19.el: Believe I have fixed the w3-complete-links to work
+  with the new use of text properties instead of overlays.  This should
+  fix the problem of the links menu not showing up in X also.  Thanks to
+  T V Raman <address@hidden> for noticing it was broken.
+* w3-mime.el: Framework for '204 No Response' put in
+* w3-auth.el: Removed function w3-encode-password, and put the code
+  into the actual w3-basic-auth, since future versions will probably use
+  different encodings for the username/password pair.
+
+Sat Dec  4 12:54:43 1993  William M. Perry  (address@hidden)
+* w3-forms.el (w3-handle-selections): Added <OPTION SELECTED> support.
+  Thanks to Darrell Kindred for telling me to do it.
+* w3-mime.el (w3-parse-mime-headers): Fixed a problem where redirection of
+  URLS would lose the content-type and other headers of the URL it was
+  redirected to.  Thanks to Jared Rhine for noticing the problem.
+* w3-forms.el (w3-do-form-entry): Fixed a problem where form submission
+  buffers would not stay on top of the buffer stack.  Moved the submit
+  code outside the save-excursion.  Thanks to Darrell Kindred for the
+  suggestion on how to fix it.
+* w3-lists.el (w3-fill-paragraphs-in-list): Dumb problem with too many
+  newlines in paragraphs within lists.  Thanks to Jared Rhine for noticing
+  the problem.
+* w3-parse.el (w3-fix-paragraphs): Fixed a problem where paragraphs before
+  the last <HR> in a buffer were not filled.  Thanks to Jared Rhine and
+  Darrell Kindred for fixes.
+* w3-typecheck.el (w3-read-correct-format): Added a default type checker
+  for unknown tag types.
+* w3-emacs19.el (w3-follow-link): This no longer signals an error if there
+  is no link under point.
+* w3-mime.el (w3-parse-mime-headers): Changed the regexp to extract the
+  Location header from an HTTP/1.0 response so that newlines are stripped
+  from it correctly.  Thanks to Darrell Kindred for sending me the patch.
+* w3-misc.el (w3-open-stream): Added a pause in when connections failed.
+  Thanks to Jost Krieger <address@hidden> for
+  suggesting it.
+* w3-emacs.el (w3-add-zone): Fixed a problem in normal emacs where
+  highlighted text <CODE>TEXT</CODE> would be interpreted as a link.
+  Thanks to T V Raman <address@hidden> for noticing the problem.
+* w3-vars.el (w3-mime-extensions): Changed the default MIME content type
+  to be text/html so that pages like http://cs.indiana.edu/ will be
+  formatted when they don't have a file extension.
+* w3-forms.el: Applied a path from Darrell Kindred that fixed some very
+  odd radio button behavior.
+* w3-forms.el: Believe I have fixed the problem in lucid emacs where
+  choosing a form entry box would eat the character immediately after the
+  input tag.
+* w3-forms.el: Fixed a regexp that would gobble newlines/paragraph breaks
+  after an input tag.  Thanks to Skip Montanaro
+  <address@hidden> for noticing the problem.
+* w3-lists.el: Dumb error in a regexp that would make all <DL> lists
+  disappear was fixed.
+* w3-lists.el: Added roman numeral handing to ordered lists.  Thanks to
+  Tom Loos (address@hidden) for explaining the algorithm and writing
+  some C code I could translate into lisp.
+
+Fri Dec  3 12:04:18 1993  William M. Perry  (address@hidden)
+* w3-lucid.el: Fixed stupid problem where going backwards by 1 link always
+  took you to the first link of a buffer.   Mispaced ) in
+  w3-previous-extent. 
+* w3-emacs19.el: Changed everything to use text-properties instead of
+  overlays.
+* w3-emacs19.el (w3-add-zone): Added preliminary support for just typing
+  into the emacs19 forms.  Will talk to jwz about adding this
+  functionality to lucid emacs.
+
+Wed Dec  1 08:05:02 1993  William M. Perry  (address@hidden)
+* w3-newparse.el: Created this file - has new parsing routines.  Very
+  experimental.  Don't use unless you want it to choke, and then figure
+  out why it choked. :)
+
+Fri Nov 26 03:52:19 1993  William M. Perry  (address@hidden)
+* w3-forms.el: Changed the forms handling routines so that it handles
+  METHOD, ACTION, and ENCTYPE attributes of the <FORM> tag.  METHOD and
+  ENCTYPE aren't used yet.  Thanks to Darrell Kindred for noticing the
+  problem.
+* w3-parse.el: Fixed a formatting problem with the ISINDEX forms
+  replacements.  Was doing a fixed-case replace.  Thanks to Jared Rhine
+  <address@hidden> for noticing the problem.
+* w3-parse.el: Fixed a formatting error with <BR> tags - sometimes spaces
+  were left at the beginning of the continued line.  Thanks to Erich
+  Schneider  <address@hidden> for noticing the problem.
+* w3-misc.el (w3-lookup-style): Fixed dumb bug where I was not
+  de-referencing the variables to the actual #<style> value in epoch.
+  Thanks to Paul Furnanz <address@hidden> for the initial fix.
+  I generalized it a little.
+* w3-parse.el: Added a check to make sure that long URLs don't show up as
+  extremely long buffer names.  Thanks to Heiko Muenkel
+  <address@hidden> for noticing the problem.
+* w3-lucid.el: Added a patch from Sjoerd Mullender
+  <address@hidden> to add a menu bar to lucid emacs if there
+  wasn't one by default.
+* w3-emacs19.el: Added a few patches from Jin S Choi (address@hidden).
+  Mostly fixed the hotlist menu updating code, as well as a few cosmetic
+  changes to the FSF19 menus.
+* w3-epoch.el: Added a few patches from Henry Rowley <address@hidden> to
+  fix a few functions that assumed epoch was compiled with
+  add-graphic-zone.
+* w3-lists.el (w3-fill-paragraphs-in-list): Fixed a stupid bug where the
+  first letter of every paragraph would be removed when filling.  Thanks
+  to Arup Mukherjee <address@hidden> for noticing the problem, and Darrell
+  Kindred for the fix.
+
+Tue Nov 16 10:55:56 1993  William M. Perry  (address@hidden)
+* Makefile (install): Fixed problem where I was only copying W3FILES to
+  the install directory, and should have used W3FILES and W3BINS.
+* w3-forms.el: Stupid problem where I was always trying to call
+  w3-form-format-unknown.  Simple 'not' around a statement to fix.
+* w3-forms.el: Yet another stupid typo - w3-format-unkown instead of
+  w3-format-unknown.  Thanks to Dan Sullivan
+  <address@hidden> for the fix.
+
+Mon Nov 15 21:02:50 1993  William M. Perry  (address@hidden)
+* Various small changes (wrote over the new ChangeLog when doing a restore
+  of some files).
+* w3-vars.el: Changed the order of w3-html-entities so that &amp; is at
+  the end.  This was causing the entities later in the list to be messed
+  up if they occurred in the same document.
+* w3-lucid.el: Changed the w3-extent-at, w3-find-specific-link, and
+  w3-next-extent to not use a free variable.  Thanks to Jamie Zawinksi
+  <address@hidden> for the patch.  Dumb oversite on my part.
+* w3-forms.el: Made the forms formatting very extensible.  The formatting
+  function is determined by reading in lisp expression from a formatted
+  string.  w3-form-format-<type> will now be called and expected to return
+  a string to use as the prompt.
+* w3-emacs19.el: Fixed dumb problem where emacs19 on a tty would not be
+  able to find a list of links in the current document for
+  w3-complete-link.
+* w3-lists.el: Fixed the filling of paragraphs within lists.  No longer
+  inserts too many newlines.
+* Fixed a few problems where w3-do-setup was not being called correctly at
+  startup.  This would result in an error about w3-style-regexp being nil.
+* w3-mosaic.el: Fixed a problem with the hotlist handling code.  Mistake
+  in a regular expression.  Thanks to Jin S Choi (address@hidden) for
+  reporting the problem and sending a fix.
+
+Fri Nov 12 07:31:36 1993  William M. Perry  (address@hidden)
+* w3.el: The mailcap entries are now parsed at startup.
+* Made changes to several files so that the new NeXTstep port of emacs 19
+  will use faces, and not think its on a dumb terminal.  Mostly involved
+  changing a bunch of (eq window-system 'x) to an or (eq window-system
+  'dps).  While I was at it I also changed the statements so that the
+  Presentation Manager port of emacs 19 under OS/2 will use faces, etc.
+
+Thu Nov 11 07:20:13 1993  William M. Perry  (address@hidden)
+* Realized I should get sick more often - I seem to get more done. :)
+* w3-vars.el: Added the ABSTRACT, QUOTE, and BYLINE tags to the list of
+  emphasis tags.
+* w3-parse.el (w3-handle-notes): Added support for the HTML+ NOTE tags.
+  Handles any role, and also honors the SRC= for the warning image.
+* w3-parse.el (w3-handle-footnotes): Added support for the HTML+ footnote
+  and margin-note tags.  Handles as links to footnotes at the end of the
+  document. 
+* w3-parse.el (w3-fix-render-hints): Added support for the HTML+ RENDER
+  tag to extend the set of logical emphasis roles on a per-document basis.
+* w3-parse.el: Changed the emphasis handling to be more extensible.  New
+  variables w3-style-assoc and w3-style-regexp.  w3-style-assoc maps tags
+  onto style names.
+* w3-parse.el: Added ability to have IDS within headers.   This is in
+  conformance with the HTML+ specification.
+* w3-lists.el: Added ability to have IDs within <P> tags.  This is in
+  conformance with the HTML+ specification.
+* w3-lists.el: Added function w3-fill-paragraphs-in-list.  This will fill
+  all paragraphs within any type of list.  This allows for <P> elements
+  within lists without odd looking results.
+* w3-forms.el (w3-split): Changed this so that it no longer puts strings
+  with only spaces and tabs in the assoc list that is returned.  This
+  error caused every popup FORM item to have a blank line at the end.
+* Added new variable w3-default-action.  This specifies the lisp function
+  to run instead of w3-prepare-buffer when W3 can't figure out the MIME
+  type by looking at the file extension.  (Things like .README or .patch
+  would be parsed as HTML - not good).  Thanks to Alastair Burt
+  <address@hidden> for noticing the problem.
+
+Wed Nov 10 08:02:31 1993  William M. Perry  (address@hidden)
+* General cleanup, better documentation in all files.  Trying to merge
+  files so that there are fewer dependencies between files.  Thank
+  goodness for the optimizing byte compiler and call-trees. :)
+* w3-parse.el: Removed the handling of <EM> tags.  No longer part of the
+  HTML+ specification.
+* w3-vars.el: Excercise in anal-retentiveness. :)  Organized and
+  alphabetized all the variables and added to quite a few documentation
+  strings.  Yeah yeah yeah, but it needed it! :)
+* w3-vars.el: Added a few more new keybindings from Tom Tromey
+  <address@hidden>.
+* w3-misc.el (w3-maybe-eval): Added new MIME type application/emacs-lisp
+  along with a viewer that asks whether to evaluate it after viewing it.
+* w3-url.el (w3-open-local): Made this a stub to call w3-fetch with file:
+  prepended to the filename you type in.  w3-open-local-internal now does
+  all the work.  Thanks to Bill Benedetto <address@hidden> for
+  noticing it was bombing out when called non-interactively.
+* w3-url.el (w3-news): Added the ability to specify a news server in the
+  news url in the proposed news://server:port/article|newsgroup method.
+* w3-typecheck.el (w3-optionp): Changed this to correctly handle when you
+  don't select anything from the menu.  Would mess up the page and remove
+  the link before dying on an error.  Thanks to Jin S. Choi <address@hidden>
+  for noticing the problem.
+
+Tue Nov  9 14:59:59 1993  William M. Perry  (address@hidden)
+* w3-url.el (w3-file): Added proper handling of ftp://address@hidden commands.
+* w3-forms.el (w3-revert-form): Fixed this function so it will work if
+  there are pull-down lists in the form.  Also changed the forms parsing
+  code to use the first item in a list as the default.
+* w3-forms.el (w3-submit-form): TEXTAREA's will now be submitted
+  correctly.  The buffer containing the information you typed in must not
+  be killed though.  I need to find a better way to store it.  Maybe a new
+  major mode?  But then how to relay the info back to the w3-typecheck
+  function as the value?
+
+Mon Nov  8 13:05:29 1993  William M. Perry  (address@hidden)
+* Added function w3-complete-link to do a completing-read on all the links
+  in a buffer.  Should work in all emacsen.
+* Changed printing, saving, and mailing of documents so that you can
+  print/mail/save LaTeX, formatted text, or HTML source.
+* w3-url.el, w3-gopher.el: Changed the reading.... messages to display the
+  actual number of bytes retrieved.
+
+Sun Nov  7 11:37:53 1993  William M. Perry  (address@hidden)
+* w3-url.el (w3-http): Fixed a problem where fetching something that had a
+  viewer associated with it when the connection was down or the file was
+  not found would still drop you into the viewer... often with odd
+  results.
+* w3-lucid.el: Fixed a few bugs in the new lucid menus - was adding a nil
+  menu item (buffers with no links, no hotlist in memory, etc).  Caused
+  system crashes on linux, headaches on other operating systems.  Thanks
+  to Alastair Burt <address@hidden> and Arup Mukherjee
+  <address@hidden> for noticing the problem and for the initial
+  patches.
+* w3-mosaic.el: Think I fixed a problem with the hotlist parsing code.
+  Thanks to Jin S. Choi <address@hidden> for noticing the problem.
+
+Wed Nov  3 21:35:44 1993  William M. Perry  (address@hidden)
+* w3-lucid.el: Completely reworked the menu setup.  Several different
+  menus, mirroring the setup of Xmosaic.
+* w3-vars.el: Assigned a few new keybindings to make w3 a little closer to
+  info mode.  Also redefined the M-C-v and M-b keys to use the C-c prefix
+  as they should.
+
+Mon Nov  1 09:42:18 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-build-links-list): Changed this so that it no longer
+  puts the delimiters around links with no HREFs. Thanks to Ivan Herman
+  <address@hidden> for noticing that it was still broken.
+* w3-epoch.el (w3-insert-graphic): Changed this function to redirect
+  the output into the file instead of outputting it to STDOUT and then
+  saving it in a buffer and then writing the buffer.  Faster,
+  especially for large files, and don't have to worry about how many
+  lines to delete at the top of the buffer.
+
+Sun Oct 31 10:31:04 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-build-links-list): Think I've fixed the problem of
+  links in headers being formatted with newlines.
+* w3.el (w3-parse-relative-link): Fixed a problem where links of the
+  type "#something" would retrieve the current directory.  Stupid
+  mistake.  Thanks to address@hidden for noticing it.
+* w3-forms.el: Fixed quite a few problems with the Emacs 18 support.
+  Problem was with using markers as start and end positions to
+  creating new zones - they got set to nil when the whole region was
+  deleted, so subsequent delete-regions failed.  This also caused a
+  problem when trying to use the submit or reset buttons.
+* w3-typecheck.el (w3-read-correct-format): Fixed a problem with the
+  pulldown menu support in emacs 18.  The last-input-event variable
+  doesn't exist, so wrapped its use in an if boundp ..., etc.
+* w3-gopher.el (w3-do-gopher): Fixed problem where links like
+  gopher://somesite/11/etc/etc/ would not get parsed - was seeing 11
+  and thinking it wasn't a directory.
+* w3-url.el (w3-gopher): Fixed a problem where a match-beginning got
+  lost because of a misplaced w3-unhex-string.  Thanks to   Arup
+  Mukherjee <address@hidden> for noticing the problem.
+* w3-emacs.el: Changed the forward and backward link handling code so
+  that it will skip white space at the beginning of a link.  Thanks to
+  Arup Mukherjee <address@hidden> for noticing the problem.
+* w3-parse.el (w3-handle-comments): Fixed this function to handle either
+  comments written according to the HTML spec (with a trailing -->) or the
+  Xmosaic-handled way (with no --).  Thanks to Darrell Kindred
+  <address@hidden> for noticing the problem.
+* w3-mosaic.el (w3-parse-hotlist): Applied a patch by Arup Mukherjee
+  <address@hidden> and Darrell Kindred <address@hidden> to fix
+  an annoying problem where the first page you retrieved in a w3 session
+  would not be shown, and the buffer you started out in would be put into
+  w3-mode.
+
+Sat Oct 30 13:38:43 1993  William M. Perry  (address@hidden)
+* w3-misc.el (w3-preview-this-buffer): Fixed this so that it does a
+  buffer-file-name instead of just buffer-name so that it will be able
+  to reload documents correctly.
+* w3-epoch.el: Fixed stupid problem in w3-follow-link where it called
+  w3-do-form-entry with the arguments in the wrong order.
+* w3-emacs19.el: Removed requirement of cl.  Took up lots of space - was
+  old anyway.  'last' is no longer needed.
+* Applied patches to Makefile from Jamie Zawinskie <address@hidden> so it
+  will compile in a better way.
+* Added full GNU copyleft notice to all the source files so that it can be
+  distributed with Lucid Emacs.  Also changed lots of functions to make the
+  files compile with fewer warnings about unbound variables.
+
+Wed Oct 27 07:10:56 1993  William M. Perry  (address@hidden)
+* w3-forms.el (w3-handle-selections): Added this function to handle the
+  new <SELECT> tag in HTML+.  Supercedes the TYPE="OPTION" tag.  This also
+  handles the scrolling list boxes and multiple pick lists.  Multiple pick
+  lists don't work correctly yet though.
+* w3-mime.el (w3-parse-mailcap): New function to parse the .mailcap file
+  used by Mosaic/metamail/etc.  Appends it to the w3-mime-viewers assoct
+  list - format is preserved correctly.  If the MIME type is already in
+  the assoc list, then it is skipped.
+
+Tue Oct 26 08:39:23 1993  William M. Perry  (address@hidden)
+* w3-epoch.el (w3-follow-link): Fixed a problem where w3-follow-link
+  would not work correctly - needed to wrap the 't' start of an if
+  statement with a progn.
+* w3-epoch.el (w3-create-hrule): Created this function to generate a
+  pixmap the size of the current window width to use for horizontal
+  rules.  Also changed the parser to use add-graphic-zone if it is in
+  epoch and it finds an <HR>, otherwise it will use the dashes.
+
+Mon Oct 25 17:15:05 1993  William M. Perry  (address@hidden)
+* w3-vars.el (w3-mime-extensions): Added _LOTS_ more MIME types +
+  descriptions of _ALL_ of them.
+* w3-lucid.el (w3-mouse-handler): Changed this to use the new function
+  w3-link-info.  Is a little easier to use.
+* w3-misc.el (w3-link-info): New function to give an intelligent guess of
+  what the link is pointing to.  ie: 'A hypertext file on the local file
+  system' or 'A newsgroup (comp.infosystems.www) from NNTP server
+  usenet.ucs.indiana.edu'
+* w3-url.el (w3-open-local): Fixed a problem where opening a local file as
+  ~/..../fname.html would cause an error if you had a relative reference
+  past the ~/ point.  Thanks to Benjamin Pierce <address@hidden> for
+  noticing the problem.
+* w3.el (w3-search): Changed this function to make sure that only 1 '?' is
+  appeneded to the url when searching.  Thanks to Arup Mukherjee
+  <address@hidden> for noticing the problem.
+
+Sat Oct 23 10:25:32 1993  William M. Perry  (address@hidden)
+* w3-epoch.el: Fixed w3-follow-link so it will work again - was
+  messing up once in a while because of the new code to let images be
+  used as links.
+* w3-epoch.el: Using images as links should work now.  Need to have it
+  check for failure of reading the XPM and use the ALT attribute if it
+  does.
+* w3-url.el (w3-format-news): Fixed this function so that it will no
+  longer call w3-sentinel on its own.  Also changed it so that the <TITLE>
+  is set to the subject, not the newsgroup name.
+* w3-epoch.el: redid the image code to limit the images to 40 colors.
+  This allows more images to be read in before the conversions start
+  failing.  Can change this arbitrary limit by changing the argument
+  to ppmquant in w3-graphic-converter-alist.
+* w3-misc.el (w3-hexify-string): Fixed this function - it would mess
+  up when sending hex codes < F.  (ie: %F instead of %0F).
+
+Fri Oct 22 12:37:26 1993  William M. Perry  (address@hidden)
+* w3-url.el: Removed all the references to &optional source in all the
+  different retrieval areas (w3-http, w3-file, w3-gopher, etc).  This will
+  all be handled in w3-build-continuation from now on.  Also changed it so
+  that printing/sourcing a document doesn't explicitly set the w3-source
+  variable or w3-print-next, it just wraps the calls to w3-sentinel in a
+  let statement.
+* w3-url.el (w3-http): Changed w3-http to insert an error message into
+  w3-working-buffer if it couldn't connect to the server.  Thanks to 
+  Bengt Andersson <address@hidden> for noticing the problem.
+
+Thu Oct 21 06:31:09 1993  William M. Perry  (address@hidden)
+* w3-mime.el (w3-parse-mime-headers): Changed the detection of circular
+  redirection to insert a warning at the end of whatever it did retrieve
+  instead of signalling an error.  This way people will know who to
+  contact for the problem.
+* w3-epoch.el (w3-insert-graphic): Added support for ALIGN attribute
+  of the IMG tag.
+* w3-parse.el (w3-fix-paragraphs-in-region): Fixed stupid problem where
+  ordered lists would not be filled correctly if unordered lists were
+  positioned before them in the buffer.  Thanks to Bengt Andersson
+  <address@hidden> for noticing the problem.
+
+Wed Oct 20 11:35:40 1993  William M. Perry  (address@hidden)
+* w3-auth.el (w3-basic-auth): Fixed a stupid problem in a regular
+  expression that caused it to only do access-authorization lookups on the
+  first part of the path.  Now passes all cern tests successfully.  On to
+  pubkey!
+* w3-mime.el (w3-create-mime-request): Took out all the \r's.  Was
+  screwing up Cern's experimental authorization server.
+* w3-forms.el: Fixed problem in the handling of TEXT input tags when the
+  initial value was longer than the visible size. Also fixed problem where
+  typing in a password longer than the visible size caused an error.
+* w3-url.el (w3-open-local): Changed this function to call w3-sentinel
+  if it was called interactively.  This way 'o' in a w3 buffer still
+  works.
+* w3-epoch.el (w3-insert-graphic): Completely rewrote this function.
+  It should be able to get graphics over any type of protocol (it
+  goes thru w3-retrieve).  w3-graphic-converter-alist also now goes by
+  MIME types.
+
+Tue Oct 19 10:12:49 1993  William M. Perry  (address@hidden)
+* w3-misc.el (w3-use-links): New function to do a completing read on the
+  <LINK> tags in the current document.  No keybinding yet.
+* w3-misc.el (w3-mail-to-author): New function to send mail to the author
+  of a document.  Uses the <LINK> tag with REV=made if any is found.
+* w3-parse.el: Added storage of the <LINK> attributes.  w3-mail-to-author
+  will send mail to the author if the 'made' LINK is found.
+* w3-url.el (w3-fetch): Added in check to see if w3-working-buffer exists
+  before calling w3-sentinel.  Would give error "No such buffer  *W3*" if
+  you followed a telnet/tn3270/rlogin link.
+* w3-gopher.el: Changed the hypertext gopher support to just return raw
+  HTML like all the other functions now.
+* w3.el (w3-parse-relative-link): Changed w3-relative-link to just call
+  w3-fetch on the results of this function so I could use it in
+  w3-parse-mime-headers for redirection.
+* w3-url.el (w3-retrieve): Moved everything from w3-fetch into this
+  function.  It just returns the name of the buffer the raw HTML is put
+  into - no processing is done.  w3-fetch is now just a call to this
+  function and then w3-sentinel.  HTTP/1.0 redirection and authorization
+  are handled before exiting.
+* w3-auth.el: Added an optional argument to the w3-XXX-auth functions.  If
+  third argument OVERWRITE is non-nil, and a password is found, it is
+  ignored and a new user/pass combination are prompted for.
+
+Mon Oct 18 08:38:00 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-prepare-buffer): Moved the call to w3-handle-forms to be
+  after w3-restore-pre so that forms inside <PRE> segments would turn out
+  right.  Not part of the spec, but useful.  Thanks to Rob Tillotson
+  <address@hidden> for noticing the problem and suggesting the
+  fix.
+* w3-auth.el (w3-b64-encoding): Actually wrote the base 64 encoding
+  function in lisp.  Much faster than using the subprocess.
+* w3-lucid.el (x-popup-menu): Added this function to do a blocking popup
+  menu.  Thanks to Jamie Zawinski (address@hidden) for telling me where to
+  look - its a hacked up version of yes-or-no-p-dialog-box from
+  prim/menubar.el.
+* w3-mime.el (w3-create-mime-request): Added in checking for authorization
+  into the MIME request.  If a match is found using w3-basic-auth, then a
+  new line is added with the encoded password.
+* w3-auth.el (w3-basic-auth): This now takes an optional parameter PROMPT,
+  that if non-nil and a server and/or directory is not found in the list,
+  then the user is prompted for a username/password.  If nil, it just
+  returns nil if not user/pass found.
+* w3-auth.el (w3-encode-password): Due to some problems with numbers
+  getting too large when doing base64 encoding, have reworked this
+  function to call a program in a subprocess.  Program is specified by the
+  variable w3-b64-encoder, and defaults to b64encode, from
+  ftp://cs.utk.edu/pub/MIME/b64encode.c.
+
+Sun Oct 17 10:21:06 1993  William M. Perry  (address@hidden)
+* w3-auth.el (w3-encode-password): I think this does base64 encoding
+  correctly now.  Have to test it more though.
+* w3-auth.el: Started work on 'Basic' authentication.  Not working yet,
+  but storage of servers/usernames/passwords/paths works.  Subdirectories
+  of 'protected' directories will find the username/password for the
+  parent directory, as per the specification (/foo/bar/baz.html will
+  locate the password entered before for /foo/test.html or / if any were
+  entered).
+* w3-mime.el (w3-parse-mime-headers): Added error checking into the server
+  redirection to see if something points to itself.
+* w3-typecheck.el (w3-floatp): Fixed regular expression problem where
+  floating point numbers would not be parsed correctly.
+* w3-typecheck.el (w3-urlp): Wrote this function to do basic typechecking
+  of URLS that are input into a <FORM>.
+* w3-mime.el (w3-parse-mime-headers): Added support for server-side
+  redirection (301, 302) and the Method: header also (303).
+* w3-forms.el (w3-set-radio-button): First pass at doing Radio buttons the
+  correct way.  Works (to a point) - it doesn't delete one of the zones
+  after changing their values though.  Not sure why.
+
+Sat Oct 16 14:55:39 1993  William M. Perry  (address@hidden)
+* w3-forms.el: Added support for PASSWORD input tag.  Will use
+  ange-ftp-read-passwd and display '*****' as the value.
+* w3-forms.el: Added support for OPTIONS INPUT tag.  If in Xwindows and
+  able to use x-popup-menu it will pop up a menu.  If not in Xwindows,
+  will use a completing read of the possible options.
+
+Fri Oct 15 16:15:59 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-nuke-unsupported): Changed this so that it will support
+  the ALT tag in IMG statements.
+* w3-gopher.el: Changed the gopher handling so that it will pass
+  everything but directories off to the main viewer-handling procedures.
+
+Thu Oct 14 18:26:55 1993  William M. Perry  (address@hidden)
+* w3.el (w3-save-url): Fixed problem in w3-save-url where the text was
+  saved in the kill-ring, but the kill-ring-yank-pointer was not updated.
+  Thanks to Bengt Andersson <address@hidden> for noticing
+  it.
+* w3.el (w3-quit): Fixed a problem where quitting from links would take
+  you back one level of buffers too far.  Thanks to Bill Benedetto
+  <address@hidden> for noticing it.
+
+Wed Oct 13 07:10:04 1993  William M. Perry  (address@hidden)
+* w3.el (w3-quit): Added the variable w3-keep-old-buffers.  If t, old w3
+  buffers are kept.  If nil, w3 buffers are deleted after you follow a
+  link from them.  Need to work on getting the parent of a w3 buffer now
+  though.
+* w3-lucid.el (w3-extent-at): Fixed problem where Lucid would not realize
+  that you were on a link if it was at the first character.
+* w3-url.el (w3-build-continuation): Fixed problem where a file with no
+  MIME viewer would die - just a misplaced set of parentheses.
+* w3-parse.el (w3-check-index): Changed this function so it only inserts
+  the <FORM> tags if protocol is HTTP.
+
+Mon Oct 11 07:19:59 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-prepare-buffer): Ordered lists will now have their
+  numbers aligned correctly.
+* w3-misc.el (w3-fix-fake-urls): This function will turn 'fake' urls like
+  ftp://somesite/some/file/ into real links like <A
+  HREF="ftp://somesite/some/file/";> - the text of the link is the text it
+  replaces.  Will be useful for mail/news reading hooks.
+
+Sat Oct  9 08:14:45 1993  William M. Perry  (address@hidden)
+* w3.el (w3-quit): fixed a problem where quitting from a 'previewed'
+  buffer would signal an error.
+* w3-parse.el (w3-prepare-buffer): Fixed this so that <PLAINTEXT> can
+  appear anywhere in a buffer, and will be treated appropriately.  Thanks
+  to Darrell Kindred (address@hidden) for noticing the problem.
+
+Fri Oct  8 08:51:37 1993  William M. Perry  (address@hidden)
+* Changed all the (set buffer " *W3*") to now use the variable
+  w3-work-buffer instead - this will allow me to have multiple receives
+  going at the same time.  Also allow me to parse out different buffers
+  for urls and not have to copy back and forth to " *W3*". Not fully
+  implemented yet.
+
+Tue Oct  5 11:56:30 1993  William M. Perry  (address@hidden)
+* w3-misc.el (w3-in-assoc): Changed this funcion so that it returns the
+  first match.  Was messing up on some of the wildcards in the default
+  MIME viewers.
+* w3-viewers.el: Several bugfixese/enhancements to the MIME viewer
+  handling.  Everything (including printing, sourcing, and presentation of
+  hypertext) is now handled by the MIME viewers.
+* w3.el: Will now load the file "~/.w3" if it exists.  Will let you store
+  all your w3 variables in the same place.  Only loaded after all the
+  different modules.
+* w3-viewers.el, w3-url.el: Changed the viewer handling to be by MIME
+  content-types all the time.  A new variable, w3-mime-extensions,
+  controls how file extensions are mapped onto MIME content-types.
+  Inspired by the way MacMosaic handles its viewers.  Should be easier to
+  maintain just one viewer list.
+
+Mon Oct  4 06:19:10 1993  William M. Perry  (address@hidden)
+* w3-viewers.el: Changed the viewing to ask if you wish to view the output
+  of the process.  Generates unique buffer names, etc.  Thanks to T.V.
+  Raman <address@hidden> for suggesting it.
+* w3-viewers.el: Moved all the external/internal viewer handling into this
+  file.
+* w3.el (w3-quit): Fixed problem where w3 would signal an error when you
+  quit and the buffer that preceded it has been killed.  Just goes to the
+  next buffer now.  Thanks to Bengt Andersson
+  <address@hidden> for noticing it.
+* w3-lucid.el: Applied patch from Darrell Kindred
+  <address@hidden> which fixed a problem with finding tags of
+  hyperlinks when it had other attributes (<ADDRESS>,<B>, etc) as well.
+
+Fri Oct  1 06:29:37 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-fix-paragraphs-in-region):  Added support for the <HR>
+  tag (horizontal rule).
+* w3-mime.el (w3-mime-viewer): Fixed a problem where this returned a cons
+  where it should have returned a string.  Thanks to Bengt Andersson
+  <address@hidden> for noticing it (yet again).
+
+* w3-gopher.el: Fixed a few problems with searching
+* w3-url.el: removed newlines from regexps - were messing up <PRE>
+  segments.
+* w3-url.el: changed mailto to include the url that it was sent from.
+
+Mon Sep 27 13:57:34 1993  William M. Perry  (address@hidden)
+* w3-typecheck.el (w3-intp): Changed the function to check whether an
+  integer was valid.  Would mess up in emacs19, where 12.5 is a good
+  parameter to string-to-int.
+
+Sat Sep 25 06:48:55 1993  William M. Perry  (address@hidden)
+* w3-typecheck.el: Added this file to control typechecking of forms entry
+  fields.  Checks dates, ints, floats, urls, and text.
+* w3-forms.el (w3-do-form-entry): changed so that it will use the new
+  typechecking functions.
+
+Fri Sep 24 14:01:54 1993  William M. Perry  (address@hidden)
+* w3-lucid.el: completely rewrote the forward and backward link movement.
+  Works a lot better now.
+
+Thu Sep 23 11:36:35 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-prepare-buffer): fixed <TITLE> handling so it takes out
+  leading and trailing spaces/tabs.  Could make it difficult to find a
+  buffer when the name began with a space.
+* w3-parse.el (w3-build-links-list): Fixed problem where link names would
+  be too long (would include part of the HREF) when the HREF was not
+  quoted.  Thanks to Dong-Ping Deng (address@hidden) for noticing
+  it.
+
+Wed Sep 22 10:49:37 1993  William M. Perry  (address@hidden)
+* w3-misc.el (w3-maybe-relative): Fixed stupid bug where I didn't add the
+  new tn3270 link type to a few regular expressions.
+
+Tue Sep 21 10:51:09 1993  William M. Perry  (address@hidden)
+* w3-url.el: Added support for tn3270://... links.  Thanks to T V Raman
+  <address@hidden> for noticing its lack.
+* w3-parse.el (w3-check-index): Added variable w3-use-forms-index.  If
+  non-nil, will replace <ISINDEX> tags with a very short <FORM> for
+  searching.  Default is t, like Xmosaic.
+* w3-vars.el: Added more styles for the <EM> tag.
+
+Mon Sep 20 07:02:28 1993  William M. Perry  (address@hidden)
+* w3-emacs19.el (w3-find-specific-link): Emacs19 can now find #identifier
+  marks in documents.
+* w3-gopher.el (w3-gopher-retrieve): Fixed a problem with gopher sending
+  more than one character 'description' to the server.  Would result in
+  'Can't open 1/whatever' in some cases.
+* w3-misc.el (w3-show-hotlist): Added this function to show the hotlist in
+  a hypertext form.  Thanks to Stephen Simpson (address@hidden) for
+  suggesting it.
+* w3-forms.el: Added in support for emacs 18
+* w3-emacs.el: Added in support for deleting an arbitrary zone.  This
+  was needed to make forms support work correctly.
+* w3-vars.el (w3-be-asynchronous): added this variable to control whether
+  documents would be retrieved in a non-blocking way over HTTP.
+
+Sun Sep 19 14:15:39 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-handle-em-tags): Fixed problem where emacs18 would
+  die on handling any <EM> tag.  Thanks to address@hidden
+  (Michael Richardson) for pointing it out.
+* w3-mime.el (w3-mime-viewer): Fixed problem with the viewer finder - was
+  trying to do a car of a string Keith Waclena
+  <address@hidden> for sending me the fix.
+
+Fri Sep 17 09:23:08 1993  William M. Perry  (address@hidden)
+* w3-mosaic.el: fixed problem where deleting or adding hotlist entries
+  would not update the menubar.  Thanks to address@hidden for noticing the
+  problem.
+
+Mon Sep 13 06:40:35 1993  William M. Perry  (address@hidden)
+* Added the <REMOVED> and <ADDED> tags (both as containers and roles of
+  the <EM> tag.
+* w3-parse.el: took out the conversion of IMG tags to hyperlinks - was
+  messing up when links were nested - need to work on it.
+* w3-lists.el (w3-build-table): tables should now handle <DD> with no
+  matching <DT> a little better.  Don't know why people bother writing
+  HTML this bad, but oh well.
+* w3-mime.el (w3-parse-mime-headers): Had a problem parsing out the mime
+  headers if there wasn't a crlf at each endline, which broke parsing
+  NCSA's new 1.0 server.  Fixed now.
+
+Fri Sep 10 05:52:06 1993  William M. Perry  (address@hidden)
+* w3-emacs19.el: took out blank definition of w3-submit-form that
+  would screw up submitting forms.  (Emacs19.el got loaded after
+  w3-forms.el so would have a blank definition)
+
+Thu Sep  9 07:57:58 1993  William M. Perry  (address@hidden)
+* w3-parse.el: Added support for <SP> (nonbreaking spaces), and <BR>
+  (force line breaks), and <EM> tags - the EM tags don't allow multiple
+  tags right now (ala <EM B I> </EM>, but nesting of <EM> tags works.)
+
+Wed Sep  8 11:58:21 1993  William M. Perry  (address@hidden)
+* w3-url.el (w3-build-continuation): the fetching of grouop annotations
+  has been removed, as the experiment at NCSA has ended.
+* w3-forms.el (w3-revert-form): finished this function - now works
+  correctly. 
+* Added code to all emacs-specific files to call w3-do-form-entry if
+  w3-follow-link is called on a zone that is tagged with 'w3form.
+* I have serious doubts whether the form support will work in emacs18 - I
+  need to write a delete-zone function for it, but that might be a bear.
+  Will toy with it later.
+
+Tue Sep  7 07:13:36 1993  William M. Perry  (address@hidden)
+* w3-forms.el: added a (delete-overlay zone) if running FSF19 so that not
+  all edits are sent when you submit a form.
+* w3-forms.el: now, if a checkbox's VALUE/DEFAULT field is empty, it is
+  sent as name=PRIMED, ala xmosaic.
+* w3-forms.el: fixed bug where the maxlength would be set to 20 instead of
+  unlimited if it was not specified.  (Actually, its set to 10,000 but I
+  think that should be enough for a while. :)
+
+Mon Sep  6 08:59:43 1993  William M. Perry  (address@hidden)
+* w3-forms.el: Eureka!  They actually work now.  Successfully submits to
+  the NCSA server/demo pages.  Still a little kludgey, but cleaning it up
+  should be too difficult.
+* w3-forms.el: forms now keyed by number so it will be easier to submit
+  them back to the server.  Also changed the submit and reset buttons to
+  take their button labels from the VALUE tag as xmosaic does.
+
+Sun Sep  5 09:17:42 1993  William M. Perry  (address@hidden)
+* w3-forms.el: more work on forms support - can now click on check boxes
+  and enter text in the entry areas.
+* w3-forms.el: added support for the parsing of forms
+
+Sat Sep  4 11:06:12 1993  William M. Perry  (address@hidden)
+* w3-mime.el: Fixed a problem where mime viewers would not work correctly
+  - tried to do a car() on a string.
+* w3-mosaic.el (w3-add-document-to-hotlist): fixed a bug in the creation
+  of gopher hotlist entries.  Thanks to Erik Ostrom
+  (address@hidden) for noticing and patching it.
+* w3-gopher.el: more work on trying to get searching to work - almost
+  there. 
+
+Wed Sep  1 09:17:00 1993  William M. Perry  (address@hidden)
+* w3-gopher.el: Did quite a bit of work on the gopher support.  Lots of
+  ideas, some code from the original gopher.el, but this keeps it in
+  hypertext - can print, get the document source, add to hotlist, etc.
+  Searching still does not work.
+
+Tue Aug 31 10:03:04 1993  William M. Perry  (address@hidden)
+* w3-misc.el: Changed the viewer handling so that it creates unique
+  filenames - if you viewed several things at once, it would write over
+  the old file, and kill the old viewers.  Also fixed problem where it
+  wouldn't delete the w3-tmp file when it was done viewing.
+
+Mon Aug 30 10:19:07 1993  William M. Perry  (address@hidden)
+* w3-url.el (w3-gopher): added variable w3-use-hypertext-gopher.  If 't'
+  use the gopher interface I just wrote, or use Scott Snyder's gopher
+  mode.  (The gopher mode is a slightly more complete, but mine preserves
+  the hypertext feel)
+* w3-gopher.el: added this file - rolled my own gopher interface this
+  afternoon.  Needs more work, but seems functional.
+* w3-misc.el: changed the viewer handling so that it handles the viewers
+  asynchronously again.
+
+Fri Aug 27 07:06:39 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-handle-address): address handling handles newlines
+  before and after ADDRESS tags better - so multiple ADDRESS tags
+  following each other don't have more than one newline, etc.
+
+Thu Aug 26 14:49:28 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-fix-paragraphs-in-region): fixed problem where the
+  fleading spaces/tabs of a line in a PRE or XMP segment would get
+  nuked.  Thanks to Bob Olson (address@hidden) for noticing it.
+
+Tue Aug 24 22:49:38 1993  William M. Perry  (address@hidden)
+* w3-epoch.el: fixed a typo - left out a " in a defvar which caused the
+  compiles to fail.  Thanks to Andrew Violette (address@hidden) for
+  noticing it. 
+
+Mon Aug 23 07:12:05 1993  William M. Perry  (address@hidden)
+* w3-misc.el (w3-lookup-style): Fixed stupid mistake where emacs19
+  wouldn't return any styles from this function
+* w3-parse.el: Fixed a problem where it would not fill paragraphs
+  correctly after the last PRE segment of the text.
+* w3-parse.el: Made the parser a lot less destructive (not as many
+  delete-regions) - this should make it handle overlapping formatting
+  better in most cases.  And maybe a little faster, since it doesn't have
+  to create as many strings and do as many re-insertions.
+
+Sun Aug 22 09:25:14 1993  William M. Perry  (address@hidden)
+* w3-emacs19.el: rewrote w3-view-this-url and w3-follow-link so that they
+  won't sometimes choke on links at the end of bold/italic/whatever zones.
+* w3-url.el (w3-http): now prints outi ts reading status (Reading.....)
+* w3-lucid.el: Took out the copying of a non-existent 'underline face. 
+
+Wed Aug 18 06:27:12 1993  William M. Perry  (address@hidden)
+* w3-mosaic.el (w3-write-global-history): fixed this so it actually works
+  again - forgot to change it when I changed the format of w3-history-list
+  to be an assoc list.
+
+Tue Aug 17 18:01:00 1993  William M. Perry  (address@hidden)
+* w3-mosaic.el (w3-fetch-annotations): Fixe problem where the annotation
+  fetch would die if the server couldn't be contacted.
+
+Mon Aug 16 17:04:23 1993  William M. Perry  (address@hidden)
+* w3-emacs19.el: took out the xresource reading - will depend on
+  emacs*w3-XXX-style.AttributeFont like the lucid emacs stuff.
+* w3-lucid.el, w3-emacs19.el: changed these so that if the newly created
+  faces aren't set up in the xdefaults, it will copy the appropriate face
+  (header-style copies 'bold-italic, etc).  Thanks Michael J. Lamoureux
+  (address@hidden)
+
+Sun Aug 15 09:22:52 1993  William M. Perry  (address@hidden)
+* w3-url.el: Added #linkname finding for local files and ftp html files.
+* w3.latex: added a section on going through firewalls/telnet, and using
+  the new tcp.c and tcp.el package.
+* w3.el: Changed the w3-help function to make sure a function is defined
+  before checking for documentation strings, etc.  Also changed it so that
+  it puts it in a hypertext buffer.  This opens up the idea of putting
+  links in the documentation strings. :)
+* Made tcp.c and tcp.el part of the 'extras' distribution.
+* w3-mosaic.el: Fixed problem where it would try to send the annotation
+  request to a string if w3-open-stream failed.
+* w3-misc.el: changed the telnet handling so that it will return 'nil' if
+  telnet could not connect to the remote host.
+* w3-vars.el (w3-color-display): this will now be set correctly in emacs19
+  - had spelled a function name wrong.
+* w3-url.el: Change w3-open-local and w3-file to respect new variable
+  w3-directory-format, which tells it whether to have a hypertext
+  directory listing, or just pass off to dired.
+
+Fri Aug 13 07:50:50 1993  William M. Perry  (address@hidden)
+* w3-mosaic.el: Fixed problem with not killing the "Process *anno*
+  finished" in http bufffers.
+* w3-lists.el: Fixed bug where w3-sublists-exist would bomb in epoch.
+  Epoch's re-search-forward returns t or nil, not the point of the
+  match like lucid/emac18/emacs19.  Several people pointed it out.
+
+Thu Aug 12 17:51:09 1993  William M. Perry  (address@hidden)
+* w3-misc.el (w3-pass-to-viewer): Fixed problem where this would not
+  display a picture if you were in Xwindows - flaw in a logical statement.
+  Thanks to Phil Kime (address@hidden) for noticing it.
+* w3-parse.el (w3-build-links-list): Added a few patches from Erik Ostrom
+  (fiicmds04.tu-graz.ac.at) - fixes bug with only recognizing NAMEd hrefs
+  when the NAMEs are quoted, and botching of relative #links.
+* w3-url.el: changed w3-http and w3-gopher to check the port # - if it is
+  in w3-bad-port-list, ask for confirmation before opening the connection.
+
+Tue Aug 10 13:07:04 1993  William M. Perry  (address@hidden)
+* New variable w3-bad-server-list, that is a list of HTTP/0.9 servers that
+  can barf on HTTP/1.0 requests.  Generally just servers that have a
+  decent amount of lag from your site (or that completely barf on
+  HTTP/1.0, like the TeXinfo gateway at ohio-state).
+* w3-mime.el: changed w3-create-mime-request to check w3-bad-server-list
+  for the current server and the value of w3-use-http2.  If both are
+  false, then generate an HTTP/1.0 request, otherwise HTTP/0.9
+* w3-url.el: changed w3-http to always use w3-create-mime-request.
+
+Mon Aug  9 08:52:10 1993  William M. Perry  (address@hidden)
+* w3.el: Added w3-documents-menu, an assoc list of titls and urls to turn
+  into a menu if you are in lemacs or emacs19.  Add support for running it
+  on dumb terminals via completing-read later.
+* w3.el: Ripped out all the variable definitions into w3-vars.el
+* w3-mime.el: fixed quite a few problems with w3-create-mime-request
+* w3-misc.el: think I finally got the truncated pages problem fixed.
+  (yeah, right :)
+* w3.el: Added code from Erik Ostrom (address@hidden) to
+  patch gopher-mode to throw you back into w3 when encountering a WWW link
+  in gopher.  Hopefully these will make it back into the main gopher.el.
+* w3-emacs19.el (w3-back-link): Added fix from Erik Ostrom
+  (address@hidden) so it won't give you an error in files
+  with only 1 link when you try to move backward.
+* w3-epoch.el: fixed a typo where you wouldn't be able to retrieve
+  images over http.
+
+Sun Aug  8 13:56:11 1993  William M. Perry  (address@hidden)
+* w3-url.el: added support for file://localhost urls.  Thanks to
+  address@hidden for pointing out that they didn't work
+* w3-emacs.el: took out the searching forward for '[' in the
+  goto-start-of-zone routine.  Would fail if w3-delimit-links was nil.
+  Thanks to address@hidden for pointing it out.
+* Revamped w3-url.el, w3-mosaic.el, and w3-misc.el to get the telnet
+  support working better.  No more mucking around with filters, etc.
+* w3-parse.el (w3-build-links-list): Changed the link routine so that it
+  will default to putting the end of a link at the end of the current line
+  if none is found normally.
+* w3-url.el: Local directories are now put into a hypertext buffer, and
+  parsed by w3.  Not sure if I should leave it this way or not.
+
+Sat Aug  7 03:28:58 1993  William M. Perry  (address@hidden)
+* w3-lists.el (w3-build-table): Changed it so you don't need to have a
+  DT in a DL list.
+* w3-mime.el (w3-mime-viewer): fixed this function to actually work! :)
+  (Was returning a list of the viewer, had to add a (car).)
+* Applied several patches from Jin S Choi (address@hidden), fixing
+  several stupid mistakes I had made. :)  Including, too many ')' in
+  emacs19, bad font setting in emacs19, noticed truncated pages via http2,
+  underlining of headings is off by default now.
+* w3-url.el: no longer print out "Reading..." when receiving documents -
+  would sometimes scramble the document.
+* w3-misc.el: w3-open-stream no longer errors when it can't connect to a
+  server - this would cause w3 to bomb if the annotation server were down.
+  Thanks to Jin S Choi (address@hidden) for noticing it.
+* w3-misc.el: w3-send-string should be a little better about not sending
+  mulitple lines to the server now, especially in emacs19 & epoch(?) where
+  accept-process-output accepts a timeout.
+
+Fri Aug  6 14:45:20 1993  William M. Perry  (address@hidden)
+* w3-url.el: changed the gopher handling to pass off everything to gopher
+  mode, so it can now handle gifs, images, etc.
+* w3-lists.el: Made DL be compact by default until I get the code to
+  change it based on DL COMPACT working right.
+* w3.el: removed the w3-useful-documents function - not really worth
+  having.
+* w3-lists.el: Totally rewrote the main loop so its not recursive, and
+  doesn't use save-restriction.  Much faster now.  Also truly fixed
+  problem with not nesting correctly.
+* w3-html+.el: a few tweaks, not ready for prime time yet though. 
+
+Thu Aug  5 08:22:16 1993  William M. Perry  (address@hidden)
+* w3-parse.el: Fixed bug in w3-fix-paragraphs that would cause it to loop
+  indefinitely if there were more than 2 PRE sections in a document.
+* w3-misc.el: Will now print out "Reading....." when receiving input.
+* w3-misc.el: w3-open-stream will now try to open the stream
+  w3-connection-retries times until it receives a valid connection.
+
+Wed Aug  4 08:49:44 1993  William M. Perry  (address@hidden)
+* w3-html+.el: can now include links as data table elements.  Don't wrap
+  stuff onto next lines yet though.
+
+Tue Aug  3 00:39:50 1993  William M. Perry  (address@hidden)
+* w3-lists.el: nested lists don't indent too far now.  Normal lists are
+  only indented 1 tab.
+* w3-html+.el: started work on this file to contain experimental HTML+
+  parsing routines.  Will probably eventually rewrite most of the parser.
+  Mostly support for tables in right now.  Will release soon.
+
+Mon Aug  2 09:21:23 1993  William M. Perry  (address@hidden)
+* w3-parse.el: Added support for arbitrary tags (!ENTITY ...), and
+  support for endash and emdash entities.
+* w3-parse.el: Fixed problem where links with no HREF field would bomb out
+  the parser (trying to string-match on nil).
+
+Thu Jul 29 10:35:06 1993  William M. Perry  (address@hidden)
+* w3-lists.el: found major bug with nesting multiple ULs inside of an
+  OL  Seems to be fixed now though.
+
+Wed Jul 28 08:29:31 1993  William M. Perry  (address@hidden)
+* w3.latex: revamped this so I can now use the latex2html perl script by N
+  F Drakos (address@hidden).  This will (almost) guarantee that the
+  online documentation is as up-to-date as the latex files.
+* w3-parse.el: Will now be able to find titles that don't have TITLE and
+  /TITLE on the same line.
+* w3-parse.el: Now stores the full url in each link's data zone - this
+  will allow print-url-under-point to work, and will make it easier to
+  write something that prints out a string of html documents.
+* w3-lists.el: Added this file.  Contains new functions to do better
+  nesting of lists.  Shouldn't hang emacs, but if it does, let me know
+  right away and I'll try to fix it.  Works great on the NCSA demo
+  document - and it has DLs inside ULs inside DLs inside ULs, so I figured
+  it was a good torture test for it. :)
+* w3-mosaic.el: changed the hotlist parsing code to remove empty lines so
+  you won't get a document type of ^Jhttp: if there are spurious blank
+  lines in the hotlist file.
+
+Mon Jul 26 09:45:34 1993  William M. Perry  (address@hidden)
+* w3-emacs19.el: Fixed forward and backward link movement.
+* w3-parse.el: Now transforms IMG ... tags into HREFs.
+
+Sun Jul 25 15:00:43 1993  William M. Perry  (address@hidden)
+* w3-misc.el: added function w3-find-this-file, which will do a find file
+  on the current w3 documents source (if in FTP or local file mode).  Will
+  be able to do it over HTTP when HTTP/1.0 becomes supported.  Thanks to
+  Heiko Muenkel (address@hidden) for suggesting it.
+* w3-misc.el (w3-send-string): Added a sit-for statement so it will wait
+  for process output - if the process is closed, then don't send any more
+  lines of the request.  This seems to have stopped the truncation of
+  pages.
+
+Fri Jul 23 07:23:05 1993  William M. Perry  (address@hidden)
+* w3.el: Added patches by address@hidden  Fixed a problem with a
+  non-existent gopher directory in w3-interesting-docs, and a typo.
+* w3-url.el (w3-unhex): Added patches by address@hidden  This
+  should give the correct values now.  Was off by 6.
+
+Thu Jul 22 12:05:17 1993  William M. Perry  (address@hidden) 
+* w3.el: Added new variable w3-use-http2.  If 't', w3 will use the
+  HTTP/1.0 support that for some reason truncates pages.  Default is t
+* Makefile: fixed stupid mistake where I left out a ${LISPDIR} so it
+  always tried to install in the root directory (/)
+
+Tue Jul 20 11:52:33 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-fix-paragraphs): This function now respects PRE and XMP
+  segments and won't fill paragraphs in them.
+
+Mon Jul 19 09:22:17 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-build-links-list): Fixed a problem where the text from
+  the last link would be used if there was a newline before the closing
+  /A in a link.  Also fixed several places where a link listing would
+  inherit items from the last link if they weren't defined (METHOD, URN,
+  etc)
+
+Sat Jul 17 11:36:31 1993  William M. Perry  (address@hidden)
+* Started work on adding NeXT mouse support in w3-emacs.el
+* Disabled the HTTP/1.0 support - was truncating pages for some reason.
+* w3-mosaic.el (w3-grok-annotation-format): Won't bomb if one of the
+  PAN-###.html files doesn't exist.
+
+Fri Jul 16 07:32:54 1993  William M. Perry  (address@hidden)
+* w3-mosaic.el (w3-do-personal-annotation): this will now correctly create
+  the LOG file in the personal annotation directory if it doesn't exist.
+* w3-parse.el (w3-prepare-buffer): Wrapped all the parsing stuff in a 
+  (let ((case-fold-search t)) ,,,) so that lowercase tags will be
+  recognized correctly.  Thanks to address@hidden for noticing it
+  still messed up on lowercase tags.
+
+Thu Jul 15 11:11:34 1993  William M. Perry  (address@hidden)
+* w3-docomp.el (compile-w3): Added w3-mime.el to the list of files to
+  compile. 
+* w3.el: Added lines to make w3-current-mime-* buffer local 
+* w3-parse.el (w3-prepare-buffer): Added variable w3-right-border to
+  control indentation on the right hand side of the buffer.  (Thanks to
+  Nathan Torkington (address@hidden) for suggesting it.
+* w3-misc.el (w3-basepath): This will no longer bomb if you are in a
+  scratch buffer (Thanks to Nathan Torkington
+  (address@hidden) for reporting it.
+* Release Version .9b
+* w3.el (w3-viewer-alist): The command to execute should now include a
+  '%s' wherever you want a filename to appear.  
+* Should now send all the right headers to a server, and act correctly.
+  (Won't bomb if server doesn't send make a MIME-ified document)
+* w3-mime.el: Can now create a valid HTRQ, parse a document's response
+  headers, and figure out if a document is a MIME-ified response.
+* w3-mime.el: First crack at making w3 mime compliant.
+
+Wed Jul 14 03:42:08 1993  William M. Perry  (address@hidden)
+* w3.el (w3-useful-documents): Added an 'interesting-docs' assoc list.
+  Similar to Xmosaics 'Documents' menu - just interesting interfaces that
+  are in the web.
+* w3-parse.el (w3-prepare-buffer): Took the file viewing code out of this
+  function - should never be evaluated.
+* w3.el (w3-viewer-assoc-list): No longer automatically append
+  auto-mode-alist to this - will mess up finding of hypertext files if you
+  have html-mode in your list.
+* w3-url.el: several changes to this file to actually make the external
+  viewers actually work again.
+
+Tue Jul 13 12:36:34 1993  William M. Perry  (address@hidden)
+* w3-url.el (w3-telnet): Changed this to use terminal-emulator instead of
+  transparent-window, since it won't work in emacs19 or lucid.
+* w3-url.el (w3-file): Will now correctly remember the name of the last
+  buffer when retrieving files via ftp.  Thanks to Dong-Ping Deng
+  (address@hidden) for noticing it didn't.
+* w3-mosaic.el (w3-parse-personal-annotations): no longer bombs if the
+  annotation directory doesn't exist.  Thanks to Heiko Muenkel
+  (address@hidden) for noticing.
+* w3-parse.el (w3-build-table): Building of definitions list is forgiving
+  if there is no DD.
+
+Mon Jul 12 07:08:38 1993  William M. Perry  (address@hidden)
+* w3.el: changed add-hook to use w3-member.  Thanks to Larry Masinter
+  (address@hidden) for suggesting it.
+* w3-parse.el & w3.el: fixed the run-hooks calls so they will actually
+  work.  Thanks to Larry Masinter (address@hidden) for pointing
+  out my mistake.
+* Makefile: fixed a few problems - thanks to address@hidden
+  for pointing them out. (Things like not compiling hyperbole, can now
+  configure what file to update the autloads and stuff in.)
+* w3-parse.el (w3-balance-XXX): fixed stupid mistake where I didn't remove
+  calls to string-to-int after redefining another function.
+* w3-misc.el (w3-count-occurences): added this function so "XX matches"
+  does not flash in the minibuffer when balancing PRE and XMP segments.
+  Directly from the emacs19 how-many function, but with no message at the
+  end.
+* w3-url.el (w3-mailto): changed syntax of mailto support to be
+  mailto:any-address-compliant-with-rfc822.  It just pops up a mail buffer
+  and sticks the rest of the url after mailto: in the To: line.  mailto
+  also now honors the variable w3-mutable-windows.
+* w3-parse.el (w3-balance-xmp): added this function to balance XMP
+  segments just like PRE segments.
+
+Sun Jul 11 08:08:44 1993  William M. Perry  (address@hidden)
+* w3-print.el (w3-convert-latex-to-html): added this function to convert
+  LaTeX documents to HTML.  Not sure why - was just bored. :)
+* w3-url.el (w3-mailto): added this function to support a new link type.
+  mailto://host/user will create a mail buffer and mail to address@hidden  The
+  syntax for this may change since it is not standard.
+* w3-parse.el (w3-build-table): fixed problem for when there was no
+  corresponding DD for a DT in a definition list.  A few documents at
+  CERN are like this.
+
+Sat Jul 10 08:55:35 1993  William M. Perry  (address@hidden)
+* w3.latex: did lots of work updating the documentation.
+* w3-emacs19.el (w3-emacs19-setup-faces): made function w3-try-make-XXX so
+  that w3 will still load and run, even if you use a font like '6x13' that
+  it can't make bold or italic.
+* w3-parse.el: PRE and ADDRESS tags now look a little better.
+* w3-mosaic.el: changed the annotation functions to set the
+  w3-current-annotation _AFTER_ calling html-mode, which will nuke all
+  buffer-local variables.
+* w3-mosaic.el (w3-add-personal-annotation): Now supports adding personal
+  annotations.
+* w3-mosaic.el (w3-add-group-annotation): now inserts /PRE as the first
+  line so that you can use all the formatting characteristics of HTML.
+  
+Fri Jul  9 07:31:20 1993  William M. Perry  (address@hidden)
+* w3-mosaic.el (w3-delete-personal-annotation): delete the current
+  annotation from your personal directory.
+* w3-mosaic.el (w3-fetch-personal-annotations): fixed dumb mistake in
+  formatting the url of each annotation.
+* w3-parse.el (w3-prepare-buffer): Will now check for any personal
+  annotations and put them at the end of the buffer (after group
+  annotations, if any).
+* w3-mosaic.el: added functions for reading the personal annotations from
+  w3-personal-annotation-directory.  No support for addition or deletion
+  of personal annotations yet.
+* w3.el (w3-mode.el): Delete group annotation option is only available in
+  lucid when user is in an annotation.
+* w3-[lucid|emacs19].el: changed menus to include deleting and adding
+  group|personal annotations
+* w3-mosaic.el: started working on adding personal annotation support.
+
+Thu Jul  8 15:32:45 1993  William M. Perry  (address@hidden)
+* w3-mosaic.el (w3-add-group-annotation): changed this so that it will
+  load up html-mode and have C-c C-c send the annotation.
+* w3-mosaic.el: Annotations are now fetched if w3-group-annotation-server
+  is defined.
+* w3-mosaic.el: Annotations can now be deleted - no key binding yet.
+* w3-mosaic.el: Annotations can now be added.  No key binding yet
+  
+Wed Jul  7 13:16:21 1993  William M. Perry  (address@hidden)
+* w3-emacs19.el (w3-back-link): Fixed w3-back-link so that the cursor will
+  be at the beginning of the link.
+* w3-emacs19.el: changed all the functions to use native emacs19 overlay
+  functions, instead of hacked up lucid-like syntax.  (Menus are still
+  done in lucid-style though)
+
+Tue Jul  6 12:41:03 1993  William M. Perry  (address@hidden)
+* w3-mosaic.el: Started work on w3-add-annotation and w3-fetch-annotations
+  to implement the NCSA group annotation facilities.  Don't work right now
+  - not sure why.  Need good docs (which don't exist) for the server. :)
+* w3.el (w3-view-url): Fixed problem where this function would put too
+  many '/' in the url.
+* w3-emacs19.el: Made a few changes to forward and backward movement among
+  links.  Still a few bugs, but can now find links in headers.
+
+Mon Jun 28 12:46:09 1993  William M. Perry  (address@hidden)
+* Added the variables w3-link-start-delimiter and
+  w3-link-end-delimiter so you don't have to edit the code to surround
+  links with something other than '[[' and ']]'.  Thanks to Andrew
+  Violett (address@hidden) for suggesting this.
+
+Sun Jun 27 14:54:50 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-balance-pre): added this function to insert missing
+  /PRE tags.  Several documents on info.cern.ch leave these out and
+  cause the browser to crash (args out of range -5,1 or some such).
+* w3.el (w3-quit): Fixed bug if running in emacs19 without X, would cause
+  terminal to lock up indefinitely.
+* w3.el: w3-view-url now takes optional argument no-show.  If you pass it
+  an argument from a lisp function, it will return the current url without
+  message'ing it in the minibuffer.
+* w3-(lucid|emacs|emacs19|epoch).el: w3-view-this-url now acts the same as
+  w3-view url (doesn't flash the url in the minibuffer).
+* w3-(lucid|emacs19).el: Added some items to the menu, and a separator
+  between the links lists and the normal commands.
+
+Sat Jun 26 11:47:52 1993  William M. Perry  (address@hidden)
+* w3-emacs19.el: slight modifications.  Nothing really noticeable.
+* w3-print.el (w3-print-this-url): fixed this so ftp files will print
+  correctly.  Also had to change w3-file.
+
+Thu Jun 24 09:02:23 1993  William M. Perry  (address@hidden)
+* w3-url.el (w3-parse-buffer): Check to see if a url is already in the
+  history list before storing.  (Also check for bogus ones like
+  file:historylist.
+* w3-misc.el (w3-show-history-list): Added this function to show the
+  history list to the user in hypertext form.  I just use w3-history list
+  and make a hypertext buffer of it on the fly.  Thanks to Matthew Newhook
+  (address@hidden) for suggesting it.
+* w3-url.el: no longer store the URL in the history list here.  Do it in
+  w3-parse-buffer so I can store the TITLE of the document also.
+
+Tue Jun 22 10:18:54 1993  William M. Perry  (address@hidden)
+* w3.el (w3-document-source): Fixed stupid problem where I put http in
+  twice when building url of current document.  Thanks to Denys Duchier
+  (address@hidden) for noticing/fixing it.
+
+Mon Jun 21 12:38:23 1993  William M. Perry  (address@hidden)
+* w3-url.el (w3-telnet): Will actually work now.  Was bombing when the url
+  was not of the form address@hidden:port.  Would try to extract the
+  username, even though it wouldn't exist.  Thanks to Phil Molloy
+  (address@hidden) for noticing it.
+* w3-parse.el (w3-build-links-list): Fixed a problem where a newline right
+  after after the > in a url would cause the text of the link not to show
+  up.  Thanks to Dirk Husemann (address@hidden)
+  for the code to fix it (slightly modified).
+* w3.el (w3-doc-variables): Moved a paren in w3-doc-variables so that
+  w3-xterm will be documented.  Thanks to Denys Duchier
+  (address@hidden) for noticing.
+* w3-misc.el (w3-uncompress): Changed this so it actually works.  Was
+  passing a list instead of the cdr to the shell-command.  Thanks to
+  Phil Molloy (address@hidden) for noticing.
+
+Sun Jun 20 08:14:28 1993  William M. Perry  (address@hidden)
+* w3.el: Added function to store the current URL in the kill ring.  Thanks
+  to Mark Eichin (address@hidden) for the idea/code.
+* w3.el: Changed w3-help so that it will work under emacs 19.
+* w3-emacs19.el: only require lmenu & lucid when in X, otherwise emacs
+  compiled without X will die.  Thanks to Erik Ostrom
+  (address@hidden) for noticing it.
+* w3.el: only call w3-build-menu if in emacs19 & in x . . .
+* w3.el: Changed searching code so that it replaces all spaces with '+'.
+  Was causing some servers to time out if it didn't.  Thanks to Jin S Choi
+  (address@hidden) for pointing this out.
+* w3-parse.el: added a check in w3-fix-paragraphs and
+  w3-build-ordered-lists to see if emacs19 is running.  If so, add an
+  extra newline, since v19 seems to fill paragraphs differently than the
+  other flavors.
+* w3-emacs.el: added (defvar w3-default-style nil), so the code that hides
+  HREF's with no links won't barf.
+* w3-emacs19.el: changed 1 line defuns to defsubst, since function calls
+  are expensive.
+* w3-emacs19.el: Finding of #linknum should work now . . . no map-extents
+  in the lucid emulation package - will probably write one later.
+* w3-emacs19.el: Wrapped all the font stuff in an (if (eq window-system 'x)
+  so it wouldn't barf if emacs19 was loaded while emacs was on a dumb
+  terminal.
+* w3.el: added variable w3-running-FSF19, and have it load w3-emacs19.el
+  if set to t.  (Determined by emacs-version > 19, and not running lucid)
+
+Sat Jun 19 16:09:28 1993  William M. Perry  (address@hidden)
+* w3-emacs19.el: Changed bindings on the mouse buttons to react to a
+  mouse-up event instead of the mouse-down event, because it would try to
+  paste into the buffer on the mouse-up.  Bleah. :)
+* w3-url.el: Modified the ftp: support so that it will parse out html
+  files, and will also be able to follow relative links within ftp'd html
+  docs.
+
+Sat Jun 19 10:01:45 1993  William M. Perry  (address@hidden)
+* Fix stupid bugs in Makefile from where I delete some things when
+  it was on my linux box
+* Support for some ISO chars by Ulrich Pfeifer 
+  (address@hidden).
+
+Fri Jun 18 13:03:12 1993  William M. Perry  (address@hidden)
+* Release v.5b
+
+Thu Jun 17 14:58:32 1993  William M. Perry  (address@hidden)
+* Better emacs 19 support from address@hidden
+* URLS that are just for reference (no HREF, but has a title) are no longer
+  highlighted, so people won't be tempted to click on them.  Thanks to
+  Erik Ostrom (address@hidden) for pointing this out.
+
+Fri Jun 11 12:14:47 1993  William M. Perry  (address@hidden)
+* Fixed problem with PRE handling - would fill paragraphs and replace
+  spaces.  Stupid misplacement of a 't'.
+* Added .gz extension for gzip to w3-uncompressor-alist
+* Trial run of emacs 19 support for fonts, etc from Jin S Choi
+  (address@hidden).  Not sure everything works yet.
+
+Mon Jun  7 12:42:48 1993  William M. Perry  (address@hidden)
+* Fixed printing from local files.
+* Added variables w3-telnet-prog and w3-telnet-header-length, for using
+  things like telnet+term from linux.
+
+Thu Jun  3 13:34:48 1993  William M. Perry  (address@hidden)
+* Fixed problems with gopher, and unhexing of escaped characters.  Thanks
+  to Larry Masinter (address@hidden) for the patches.
+* Beginning of emacs-19 support - not functional yet though.  Feel free to
+  fix it. :)
+* More stuff with w3-continuation, etc, etc.
+* Added (require 'nntp)
+
+Fri May 28 14:06:27 1993  William M. Perry  (address@hidden)
+* Fixed w3-print.
+
+Mon May 17 12:55:45 1993  William M. Perry  (address@hidden)
+* Can now specify uncompressors in an assoc list
+* Added better handling of stringing things along (ie: uncompress,
+  convert, then print, etc etc)
+
+Fri May  7 08:52:30 1993  William M. Perry  (address@hidden)
+* Release .31b
+* Fixed major problem with w3-fetch.  Would bomb with stringp = nil if
+  done interactively.
+
+Mon May  3 08:16:35 1993  William M. Perry  (address@hidden)
+* Can now print the url under point - no key binding yet.
+* Added the ability to store a gopher link into the hotlist - thanks
+  to scott snyder (address@hidden) for patching gopher-mode to
+  support this.  No key binding yet.
+* Added the 'links' menu back into lucid emacs.
+
+Fri Apr 30 11:56:57 1993  William M. Perry  (address@hidden)
+* Fixed a problem with viewing local files with w3-viewer-alist
+
+Thu Apr 29 11:43:13 1993  William M. Perry  (address@hidden)
+* w3-fetch now defaults to the url of the current document if the
+  document you invoke it from is in w3-mode.
+* Added ability to find links of just #link - doesn't need to reload
+  the whole document.
+* Applied several patches fro Alastair Burt (address@hidden)
+  * Better updating of menu bar in Lucid
+  * Updates the interal w3-hotlist when you delete a hotlist entry
+  * Problem with the w3-viewer-alist - it tried to play
+    Something.Thesaurus
+* Fixed problems with w3-graphics-converter-alist, and lots of
+  problems with the w3-hypertext-extns.
+* Fixed problem with finding files for dired-mode - would still try to
+  do the viewing, etc.
+
+Wed Apr 28 07:23:56 1993  William M. Perry  (address@hidden)
+* Fixed problem with dired-ing remote ftp files.  Removed lots of
+  useless if file-directory-p [...], and just did a find-file - let
+  ange-ftp and dired take care of it - they know how better.
+* Fixed problem where w3-epoch-frob-resources would not set the
+  defaults if no Xresources were specified - thanks to Luis Miguel
+  Silveira (address@hidden) for noticing it.
+* Changed the w3-delimit-links variable so that you can specify
+  'linkname as its value, and have the old style "Link text
+  here[link#here]" style of showing links.  Nil shows nothing,
+  non-nil, non-linkname shows [[ & ]] around link text.
+
+Tue Apr 27 15:37:18 1993  William M. Perry  (address@hidden)
+* Fixed problem in gopher handling - if no port was specified, it
+  would get completely confused.
+
+Mon Apr 26 17:06:33 1993  William M. Perry  (address@hidden)
+* v.2b
+* Fixed problem with putting remote dirs into dired-mode with a bad
+  default-filename.  Thanks to Larry Masinter
+  (address@hidden) for noticing, and for the fix.
+* Added newest nntp.el to the extras tar file
+* Fixed problem where w3-current-last-buffer was not set correctly
+  when reading news.
+* Added support for news: links - single articles as well as whole
+  groups are supported.
+
+Sun Apr 25 15:36:55 1993  William M. Perry  (address@hidden)
+* Fixed recursive make install bug - thanks to Larry Masinter
+  (address@hidden) for noticing it.
+* Fixed problem with no default gopher object type.  Thanks to Larry
+  Masinter (address@hidden) for noticing it.
+* Fixed problem with no default gopher port.
+* Fixed the auto-documenter so that it would insert "M-x funcname"
+  if no bindings were found in the keymap. Thanks to Larry Masinter
+  (address@hidden) for noticing it.
+* Fixed problem with w3-file not passing to a viewer correctly.
+
+Thu Apr 22 13:22:53 1993  William M. Perry  (address@hidden)
+* Fixed the handling of URL#link finding . . . depends on which
+  emacs you are using, due to the weirdness of zones, etc, in each.
+* Split the files up again.  Figure with >2000 lines, it should be
+  done. :)
+* No longer need w3-links-list - store all relevant information in the
+  data segment of a zone.  Changed every function to use this new
+  structure.
+
+Wed Apr 21 08:24:35 1993  William M. Perry  (address@hidden)
+* Added variables w3-use-html2latex, w3-html2latex-prog, and
+  w3-html2latex-args.  If w3-use-html2latex is non-nil, then
+  w3-html2latex-prog is called in a subprocess with the flags defined
+  by w3-html2latex-args, with the html source as standard input.
+  Default is to do my (bad) regular expression matching to convert.
+
+Tue Apr 20 08:51:19 1993  William M. Perry  (address@hidden)
+* Can now specify regular expressions as the car of
+  w3-viewer-assoc-list 
+* fixed problem where epoch would not defvar the styles - just moved
+  them out of w3-epoch-frob-resources, and it works.  Weird.
+* Fixed several bugs in the w3-convert-html-to-latex function - now
+  handles addresses and &amp; correctly.
+* Fixed yet another dumb bug in the insertion of PLAINTEXT in
+  non-hypertext documents.
+* Added w3-member, instead of builtin (or predefined) member, since
+  some definitions don't use equal for comparison like they are
+  supposed to.
+
+Mon Apr 19 07:48:56 1993  William M. Perry  (address@hidden)
+* v.1b
+* Added LaTeXing of w3 documents, and automatic printing.  Just an
+  edit of the sed script to be a lot of replace-regexps, then a shell
+  command to latex a temp file and print it out.
+* Added w3-goto-last-buffer, which will take you to the last buffer
+  you visited before (kind of like gopher-mode).  Changed w3-quit to
+  use this also.
+* Fixed a bug in w3-reload-document that would make it bomb on local
+  file reloads.
+* Better nesting of lists.
+
+Sun Apr 18 13:50:38 1993  William M. Perry  (address@hidden)
+* Added variable w3-mutable-windows - if t, w3 pops up buffers in
+  another window.
+* Added a default-style for w3 buffers
+
+Wed Apr 14 10:18:01 1993  William M. Perry  (address@hidden)
+* Fixed several problems with the epcoh Xresources reading code
+* Added global history, for compatability with xmosaic
+* Added deletion of hotlist entries
+* Changed w3-viewer-alist to automatically include the auto-mode-alist
+* Viewers can now include lisp calls (ie: ("txt" . view-mode)) to put
+  in files.
+* file:// links will now put directories in dired-mode.  Thanks to
+  address@hidden for the fixes.
+* Finally fixed relative-links - .. & . are removed correctly
+* Fixed relative links for graphics also.
+
+Tue Apr 13 08:30:58 1993  William M. Perry  (address@hidden)
+* Added support for reading Xdefaults within Epoch.
+* v.04b
+* Fixed graphic support to work over http links (Epoch Only)
+* Fixed graphic support so it will figure out if the conversion failed
+  or not - warning message if it did.
+  
+Mon Apr 12 07:35:40 1993  William M. Perry  (address@hidden)
+* v.03b
+* Fixed lemacs support so it doesn't nuke your xdefaults.  Also fixed
+  the passing of face-objects, since they are screen-specific, and
+  therefore a Bad Thing.  Thanks to Jamie Zawinski (address@hidden)
+* Changed menu code so that it put the link # in there also.  Helpful
+  for when the links are unnamed, or named 'here' or 'this'.  Thanks
+  to Jamie Zawinski (address@hidden) for saying the menus were hosed.
+
+Sun Apr 11 16:30:44 1993  William M. Perry  (address@hidden)
+* Fixed graphics support for epoch - would only do 1 image per page.
+* Fixed a few typos - thanks to address@hidden
+
+Fri Apr  9 00:18:47 1993  William M. Perry  (address@hidden)
+* Added graphics support for epoch (doesn't work over http, pretty
+  much hardwired for me right now - commented out in the release)
+* v.02b
+* Several bug fixes (link finding, name fixing, others) - thanks to
+  address@hidden for the fixes.
+* Added address@hidden's zone-imitation functions for normal emacs.
+  Also wrote corresponding forward&back link code.  I wrote the forward&
+  back code for epoch&lemacs.
+
+Thu Apr  8 13:23:27 1993  William M. Perry  (address@hidden)
+* Fixed being able to jump forward over non-links in []s. Thanks to
+  address@hidden
+* Fixed telnet handling - thanks to address@hidden for noticing
+  it and for a preliminary fix.  Refined his fix.  Problem was that
+  telnet wasn't getting enough time to start before I sent it a
+  command.
+* Fixed a few regular expressions - thanks to address@hidden
+* Fixed bug in w3-add-document-hotlist which caused an error if the
+  hotlist file didn't already exist.  Thanks to address@hidden
+  for noticing it.
+
+Wed Apr  7 00:08:53 1993  William M. Perry  (address@hidden)
+* Split the files into 4 different files for easier editing.
+* Modified Makefile to work with the new file structure.
+* Fixed a problem with the links code that cropped up with blank HREFS
+* HREFs of the form .....#link will now go to 'link' within the target
+  document.
+* v.01beta - fourth release
+* Can now type #### RETURN to go the the ###th link in the current buffer.
+* Fixed a bug in XMP handling
+* Fixed bugs in the logical/physical styles in definition lists
+* Improved indentation of all lists
+* Wrapped (require 'ange-ftp) in a (not noninteractive) so it wouldn't
+  screw up the compiles.
+* Fixed a few problems in the Makefile
+* Revamped the way it looks for links in dumb emacs mode.  (Actually,
+  all I did was add a .* to the beginning and a parenthesized part of
+  the regexp - real rough. :)
+* Added support for physical and logical styles.  Looks great in lucid,
+  not so hot in epoch (had to use colors, not actual styles).  Suggestions
+  welcome.
+
+Tue Apr  6 21:14:14 1993  William M. Perry  (address@hidden)
+* Supports nested definition lists (only 1 deep, and only in ordered lists)
+* Now supports nested lists (only 1 deep, and only inside ordered lists)
+
+Mon Apr  5 13:34:00 1993  William M. Perry  (address@hidden)
+* v.008beta - third release
+* Fixed ADDRESS support
+* Added auto-documentation features.
+* Added ordered list support - does not support nested lists at all yet.
+* Added automatic bug submission
+* Added popup-menu for lucid emacs
+* Added support for links nested in headers.
+* v.007beta - second release
+* Revamped local files - now use file:/ instead of nonstandard local:/
+* Added better handling of definition lists.  (No support for Compact
+  ones now though)
+
+Fri Apr  2 10:28:08 1993  William M. Perry  (address@hidden)
+* Definition lists now keep their zones/extents so they are highlighted
+  correctly. 
+* Fixed bug in PRE handling - left out a (goto-char (point-min))
+
+Wed Mar 31 08:51:04 1993  William M. Perry  (address@hidden)
+* Did work on resolving ./ & ../ links (only works for one level right
+  now.  Will work on getting it recursive later.
+* Changed data field in extents/zones to be (w3 . type) so I
+  wouldn't grab a wrong item.
+* Fixed a bug in title handling.  Left something out of an if
+  statement and it would try to delete a region that (probably) didn't
+  exist.
+* Fixed bug in w3-follow-link (added a ':' to end of regexp).  Would
+  cause it to screw up on a url like http.html.  Thanks to Erik Ostrom
+  (address@hidden)
+* Changed requires to autoloads where possible
+* Wrapped require of transparent.el so it won't get loaded if in X
+* Fixed bug in lemacs mouse links.
+* Applied numerous patches from address@hidden & address@hidden to fix
+  compilation problems with lemacs & epoch.
+
+Tue Mar 30 15:05:01 1993  William M. Perry  (address@hidden)
+* Added mouse support for following links in epoch & lucid emacs
+  Store the link # in the data segment of the zone.  If mouse is
+  clicked in a zone, extract the data, assoc it with w3-links-list and
+  call w3-follow-link with it.  Hacky but works. :)
+* Added (provide 'w3) for easier loading, etc.
+* Fixed problems with epoch highlihting
+* Fixed makefile problem (some files left out)
+
+Sun Mar 28 13:04:12 1993  William M. Perry  (address@hidden)
+* Added auto-viewing of ps/gif/jpg/etc files
+* Added uncompression and gunzipping auto-recognition
+
+Sat Mar 27 12:32:54 1993  William M. Perry  (address@hidden)
+* v.004beta - first release
+* Few changes to the parser
+* Fixed PRE Handling so it parses out urls inside.
+* Added handling of &#XXX to insert ascii value of XXX.
+
+Fri Mar 26 11:27:52 1993  William M. Perry  (address@hidden)
+* Completed document source command.
+* Changed it so it won't barf if you try to fetch the same document twice.
+* Added w3-reload-document to reload the current file.
+
+Wed Mar 24 16:37:22 1993  William M. Perry  (address@hidden)
+* v.003beta - put on ftp archive
+* Added support for the xmosaic style of hotlist.  Goto and add are
+  supported.
+* Changed searching a little
+* Fixed bug in XMP/PRE handling that reinserted everything in all caps.
+  Was very annoying.
+* Added lemacs menu of hotlist items.
+
+Tue Mar 23 08:46:12 1993  William M. Perry  (address@hidden)
+* v.002beta - put on ftp archive
+* Added menus to the lucid emacs code.  Looks a little weird when
+  links are named 'here', but not bad.
+* Added to the searching code
+* Fixed bug in renumbering system (forgot to increment bogus-num)
+* Completely rewrote the parser (yet again).  Finally got the HTML
+  specs, so it now handles every item possible (hopefully).
+* Added support for small things like DL COMPACT, PLAINTEXT, PRE.
+* Added code to delete outdated information (HEADER, BODY, etc)
+* Added w3-preview-this-buffer, which feeds the current buffer into
+  the w3-preprocessor and spits out a formatted buffer.  I use this
+  mainly to see if I can break anything, but might be useful when
+  writing real html documents.
+* Added code to delete useless (to us) HTML headers (NEXTID, etc)
+* Added support for index searching.  Mode line is changed to reflect
+  this.  Need to use something more noticeable though.
+  
+Mon Mar 22 07:43:10 1993  William M. Perry  (address@hidden)
+* Broke highlighting in definition lists.  Not sure how to get around
+  this and still have the DLs formatted correctly.
+* Little tweaks
+* Cleaned up ^Ms that appeared sometimes
+* Added a default port for http links (http://moose/info instead of
+  http://moose:80/info)
+
+Sun Mar 21 13:44:02 1993  William M. Perry  (address@hidden)
+* Forgot to include Menu and DL lists, added them.
+* Added support for embedded plain text (XMP directive)
+* Added 'cacheing' of old info - just made variables buffer-local, and
+  save them before kill-all-local-variables, then restore.  Need to figure
+  out some way to kill old buffers (only keep last 5, etc)  
+* Fine tuned local file support
+* Added ftp support - just a link to ange-ftp
+* Fixed unNAMEd links yet again - should work better
+* Added support for lucid emacs & epoch (highlight links, headers,etc)
+  Borrowed code from html-mode.el by address@hidden
+* "Fixed" unNAME'd links.  Big Kludge. Needs work.
+
+Sat Mar 20 14:10:12 1993  William M. Perry  (address@hidden)
+* v.001beta
+* Complete rewrite of the parsing code.  Still not pretty, but much
+  faster, better paragraph filling.
+* Defined w3-mode
+* Forward and backward searching for links - still needs lots of work
+
+Fri Mar 19 08:00:03 1993  William M. Perry  (address@hidden)
+* v.000alpha
+* Support for gopher, telnet, http, and local file access
+* First attempt
diff --git a/TODO b/TODO
index 4b1ae5a..33e4fb4 100644
--- a/TODO
+++ b/TODO
@@ -2,9 +2,6 @@ BUGS (4.0):
 - trim down w3-sysdp.el to be just the stuff it really needs
 - border-color can have multiple color specifications, but we
   currently choke with 'args out of range' when we see this.
-- widget appears to be stealing button3 to mean 'activate' - this is
-  bogus!  We lose all context-sensitive menus because of this.
-- We still seem to be growing the line size under Emacs 19.x/20.x
 - document how to translate Netscape foo.pac files to emacs lisp
 
 BUGS (4.1):
@@ -39,10 +36,6 @@ FEATURES (4.1)
     additional methods to automatically index documents.
 
     * Multi keyword search
-- w3-(un)?plugged, w3-toggle-plugged to control url-standalone-mode in
-  a convenient, user-friendly way.
-- Nice custom-y way to create an HTTP request.  This would allow
-  people to use HTTP PUT to upload documents to HTTP servers, etc.
 - cache a formatted version of documents, with enough info to recreate
   the widgets in them.
 - keystrokes and supporting infrastructure to prefetch URLs from
@@ -57,17 +50,10 @@ FEATURES (4.1)
   it would solve most of the problem.
 - When fetching images for viewing (not inlining), W3 should at least
   have an option of displaying it inline, ala Netscape.
-- Widget library merging
-  - Write a font selection widget
-  - Write a voice selection widget
-  - Write a mailcap entry widget
-- Custom library merging
-  - Add custom support for MM
 - Hotlist handling
   - Abstract out current support
   - Do something similar to GNUS 'backends' to provide easy way to add new
     bookmark formats, etc.
-- Write a new major mode for handling CSS style sheets
 
 FEATURES (5.0)
 - Emacspeak Integration
@@ -84,7 +70,6 @@ FEATURES (5.0)
     - TeXinfo
 - Display code
   - implement <spacer> from netscape 3.0b5
-  - reimplement w3-show-headers
   - Handle math environment using the calc library
   - Better integration with the parser
 
diff --git a/aclocal.m4 b/aclocal.m4
index 58e7a0c..80b602b 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -8,8 +8,10 @@ if test -z "$3"; then
 fi
 AC_CACHE_VAL(EMACS_cv_SYS_$1,[
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
+       echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if 
(stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& AC_FD_CC 
2>&1  
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& AC_FD_CC 
2>&1
        retval=`cat ${OUTPUT}`
+       echo "=> ${retval}" >& AC_FD_CC 2>&1
        rm -f ${OUTPUT}
        EMACS_cv_SYS_$1=$retval
 ])
@@ -103,10 +105,13 @@ if test -z "$3"; then
        AC_MSG_CHECKING(for $2 in $1)
 fi
 library=`echo $1 | tr _ -`
-AC_EMACS_LISP($1,(progn (fmakunbound '$2) (condition-case nil (progn (require 
'$library) (fboundp '$2)) (error nil))),"noecho")
+AC_EMACS_LISP($1,(progn (fmakunbound '$2) (condition-case nil (progn (require 
'$library) (fboundp '$2)) (error (prog1 nil (message \"$library not 
found\"))))),"noecho")
 if test "${EMACS_cv_SYS_$1}" = "nil"; then
        EMACS_cv_SYS_$1=no
 fi
+if test "${EMACS_cv_SYS_$1}" = "t"; then
+       EMACS_cv_SYS_$1=yes
+fi
 HAVE_$1=${EMACS_cv_SYS_$1}
 AC_SUBST(HAVE_$1)
 if test -z "$3"; then
@@ -176,13 +181,38 @@ if test "${EMACS_cv_ACCEPTABLE_GNUS}" = "yes"; then
        EMACS_cv_ACCEPTABLE_GNUS=$EMACS_cv_SYS_gnus_dir
 fi
 ])
-   AC_ARG_WITH(gnus,           --with-gnus             Specify where to find 
the gnus package, [ EMACS_cv_ACCEPTABLE_GNUS=`( cd $withval && pwd || echo 
"$withval" ) 2> /dev/null` ])
+   AC_ARG_WITH(gnus,           --with-gnus               Specify where to find 
the gnus package, [ EMACS_cv_ACCEPTABLE_GNUS=`( cd $withval && pwd || echo 
"$withval" ) 2> /dev/null` ])
    GNUS=${EMACS_cv_ACCEPTABLE_GNUS}
    AC_SUBST(GNUS)
    AC_MSG_RESULT("${GNUS}")
 ])
 
 dnl
+dnl Perform sanity checking and try to locate the URL package
+dnl
+AC_DEFUN(AC_CHECK_URL, [
+AC_MSG_CHECKING(for recent URL version)
+AC_CACHE_VAL(EMACS_cv_ACCEPTABLE_URL,[
+AC_EMACS_CHECK_LIB(url_methods, url-scheme-get-property,"noecho")
+if test "${HAVE_url_methods}" = "yes"; then
+       EMACS_cv_ACCEPTABLE_URL=yes
+else
+       EMACS_cv_ACCEPTABLE_URL=no
+fi
+
+if test "${EMACS_cv_ACCEPTABLE_URL}" = "yes"; then
+       AC_EMACS_LISP(url_dir,(file-name-directory (locate-library 
\"url-methods\")),"noecho")
+       EMACS_cv_ACCEPTABLE_URL=$EMACS_cv_SYS_url_dir
+fi
+])
+   AC_ARG_WITH(url,             --with-url                Specify where to 
find the URL package, [ EMACS_cv_ACCEPTABLE_URL=`( cd $withval && pwd || echo 
"$withval" ) 2> /dev/null` ])
+   URL=${EMACS_cv_ACCEPTABLE_URL}
+   AC_SUBST(URL)
+   AC_MSG_RESULT("${URL}")
+])
+
+
+dnl
 dnl Figure out how we can rebuild the custom-load.el files
 dnl
 AC_DEFUN(AC_CHECK_CUSTOMLOADS, [
@@ -199,9 +229,3 @@ fi
 AC_MSG_RESULT("${REBUILD_CUSTOMLOADS}")
 AC_SUBST(REBUILD_CUSTOMLOADS)
 ])
-
-dnl (aclocal.m4) Local variables:
-dnl (aclocal.m4) eval: (make-local-hook 'kill-buffer-hook)
-dnl (aclocal.m4) eval: (defun w3-rebuild-configure-files () (if 
(file-newer-than-file-p (buffer-file-name) (expand-file-name "configure" 
(file-name-directory (buffer-file-name)))) (shell-command "autoreconf")))
-dnl (aclocal.m4) eval: (add-hook 'kill-buffer-hook 'w3-rebuild-configure-files 
nil t)
-dnl (aclocal.m4) End: ***
diff --git a/configure b/configure
index 9417378..24a951d 100755
--- a/configure
+++ b/configure
@@ -24,9 +24,9 @@ ac_help="$ac_help
 ac_help="$ac_help
 --with-lispdir            Where to install lisp files"
 ac_help="$ac_help
---with-custom             Specify where to find the custom package"
+--with-gnus               Specify where to find the gnus package"
 ac_help="$ac_help
---with-gnus             Specify where to find the gnus package"
+--with-url                Specify where to find the URL package"
 
 # Initialize some variables set by options.
 # The variables have the same names as the options, with
@@ -792,8 +792,10 @@ fi
 
 
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
+       echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if 
(stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1  
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
        retval=`cat ${OUTPUT}`
+       echo "=> ${retval}" >& 5 2>&1
        rm -f ${OUTPUT}
        EMACS_cv_SYS_xemacsp=$retval
 
@@ -814,18 +816,20 @@ fi
 
   if test "$prefix" = "NONE"; then
        echo $ac_n "checking prefix for your Emacs""... $ac_c" 1>&6
-echo "configure:818: checking prefix for your Emacs" >&5
+echo "configure:820: checking prefix for your Emacs" >&5
        
 elisp="(expand-file-name \"..\" invocation-directory)"
 if test -z ""noecho""; then
        echo $ac_n "checking for prefix""... $ac_c" 1>&6
-echo "configure:823: checking for prefix" >&5
+echo "configure:825: checking for prefix" >&5
 fi
 
 
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
+       echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if 
(stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1  
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
        retval=`cat ${OUTPUT}`
+       echo "=> ${retval}" >& 5 2>&1
        rm -f ${OUTPUT}
        EMACS_cv_SYS_prefix=$retval
 
@@ -845,7 +849,7 @@ if test "${with_lispdir+set}" = set; then
 fi
 
   echo $ac_n "checking where .elc files should go""... $ac_c" 1>&6
-echo "configure:849: checking where .elc files should go" >&5
+echo "configure:853: checking where .elc files should go" >&5
   if test -z "$lispdir"; then
         theprefix=$prefix
     if test "x$theprefix" = "xNONE"; then
@@ -866,18 +870,20 @@ echo "configure:849: checking where .elc files should go" 
>&5
 
 
 echo $ac_n "checking for emacs version""... $ac_c" 1>&6
-echo "configure:870: checking for emacs version" >&5
+echo "configure:874: checking for emacs version" >&5
 
 elisp="(and (boundp 'emacs-major-version) (format \"%d.%d\" 
emacs-major-version emacs-minor-version))"
 if test -z ""noecho""; then
        echo $ac_n "checking for version""... $ac_c" 1>&6
-echo "configure:875: checking for version" >&5
+echo "configure:879: checking for version" >&5
 fi
 
 
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
+       echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if 
(stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1  
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
        retval=`cat ${OUTPUT}`
+       echo "=> ${retval}" >& 5 2>&1
        rm -f ${OUTPUT}
        EMACS_cv_SYS_version=$retval
 
@@ -893,227 +899,205 @@ EMACS_VERSION=${EMACS_cv_SYS_version}
 echo "$ac_t""${EMACS_VERSION}" 1>&6
 
 
-echo $ac_n "checking for acceptable custom library""... $ac_c" 1>&6
-echo "configure:898: checking for acceptable custom library" >&5
+echo $ac_n "checking for recent gnus version""... $ac_c" 1>&6
+echo "configure:904: checking for recent gnus version" >&5
 
 
 
 if test -z ""noecho""; then
-       echo $ac_n "checking for widget-convert-text in widget""... $ac_c" 1>&6
-echo "configure:904: checking for widget-convert-text in widget" >&5
+       echo $ac_n "checking for mm-get-content-id in mm_decode""... $ac_c" 1>&6
+echo "configure:910: checking for mm-get-content-id in mm_decode" >&5
 fi
-library=`echo widget | tr _ -`
+library=`echo mm_decode | tr _ -`
 
-elisp="(progn (fmakunbound 'widget-convert-text) (condition-case nil (progn 
(require '$library) (fboundp 'widget-convert-text)) (error nil)))"
+elisp="(progn (fmakunbound 'mm-get-content-id) (condition-case nil (progn 
(require '$library) (fboundp 'mm-get-content-id)) (error (prog1 nil (message 
\"$library not found\")))))"
 if test -z ""noecho""; then
-       echo $ac_n "checking for widget""... $ac_c" 1>&6
-echo "configure:911: checking for widget" >&5
+       echo $ac_n "checking for mm_decode""... $ac_c" 1>&6
+echo "configure:917: checking for mm_decode" >&5
 fi
 
 
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
+       echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if 
(stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1  
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
        retval=`cat ${OUTPUT}`
+       echo "=> ${retval}" >& 5 2>&1
        rm -f ${OUTPUT}
-       EMACS_cv_SYS_widget=$retval
-
-
-widget=${EMACS_cv_SYS_widget}
-if test -z ""noecho""; then
-       echo "$ac_t""$widget" 1>&6
-fi
-
-if test "${EMACS_cv_SYS_widget}" = "nil"; then
-       EMACS_cv_SYS_widget=no
-fi
-HAVE_widget=${EMACS_cv_SYS_widget}
-
-if test -z ""noecho""; then
-       echo "$ac_t""$HAVE_widget" 1>&6
-fi
-
+       EMACS_cv_SYS_mm_decode=$retval
 
-if test -z ""noecho""; then
-       echo $ac_n "checking for widget-convert-text in wid_edit""... $ac_c" 
1>&6
-echo "configure:939: checking for widget-convert-text in wid_edit" >&5
-fi
-library=`echo wid_edit | tr _ -`
 
-elisp="(progn (fmakunbound 'widget-convert-text) (condition-case nil (progn 
(require '$library) (fboundp 'widget-convert-text)) (error nil)))"
+mm_decode=${EMACS_cv_SYS_mm_decode}
 if test -z ""noecho""; then
-       echo $ac_n "checking for wid_edit""... $ac_c" 1>&6
-echo "configure:946: checking for wid_edit" >&5
+       echo "$ac_t""$mm_decode" 1>&6
 fi
 
-
-       OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
-       retval=`cat ${OUTPUT}`
-       rm -f ${OUTPUT}
-       EMACS_cv_SYS_wid_edit=$retval
-
-
-wid_edit=${EMACS_cv_SYS_wid_edit}
-if test -z ""noecho""; then
-       echo "$ac_t""$wid_edit" 1>&6
+if test "${EMACS_cv_SYS_mm_decode}" = "nil"; then
+       EMACS_cv_SYS_mm_decode=no
 fi
-
-if test "${EMACS_cv_SYS_wid_edit}" = "nil"; then
-       EMACS_cv_SYS_wid_edit=no
+if test "${EMACS_cv_SYS_mm_decode}" = "t"; then
+       EMACS_cv_SYS_mm_decode=yes
 fi
-HAVE_wid_edit=${EMACS_cv_SYS_wid_edit}
+HAVE_mm_decode=${EMACS_cv_SYS_mm_decode}
 
 if test -z ""noecho""; then
-       echo "$ac_t""$HAVE_wid_edit" 1>&6
+       echo "$ac_t""$HAVE_mm_decode" 1>&6
 fi
 
-if test "${HAVE_widget}" = "yes"; then
-       EMACS_cv_ACCEPTABLE_CUSTOM=yes
+if test "${HAVE_mm_decode}" = "yes"; then
+       EMACS_cv_ACCEPTABLE_GNUS=yes
 else
-       if test "${HAVE_wid_edit}" != "no"; then
-               EMACS_cv_ACCEPTABLE_CUSTOM=yes
-       else
-               EMACS_cv_ACCEPTABLE_CUSTOM=no
-       fi
+       EMACS_cv_ACCEPTABLE_GNUS=no
 fi
-if test "${EMACS_cv_ACCEPTABLE_CUSTOM}" = "yes"; then
+
+if test "${EMACS_cv_ACCEPTABLE_GNUS}" = "yes"; then
        
-elisp="(file-name-directory (locate-library \"widget\"))"
+elisp="(file-name-directory (locate-library \"mm-decode\"))"
 if test -z ""noecho""; then
-       echo $ac_n "checking for widget_dir""... $ac_c" 1>&6
-echo "configure:985: checking for widget_dir" >&5
+       echo $ac_n "checking for gnus_dir""... $ac_c" 1>&6
+echo "configure:958: checking for gnus_dir" >&5
 fi
 
 
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
+       echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if 
(stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1  
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
        retval=`cat ${OUTPUT}`
+       echo "=> ${retval}" >& 5 2>&1
        rm -f ${OUTPUT}
-       EMACS_cv_SYS_widget_dir=$retval
+       EMACS_cv_SYS_gnus_dir=$retval
 
 
-widget_dir=${EMACS_cv_SYS_widget_dir}
+gnus_dir=${EMACS_cv_SYS_gnus_dir}
 if test -z ""noecho""; then
-       echo "$ac_t""$widget_dir" 1>&6
+       echo "$ac_t""$gnus_dir" 1>&6
 fi
 
-       EMACS_cv_ACCEPTABLE_CUSTOM=$EMACS_cv_SYS_widget_dir
+       EMACS_cv_ACCEPTABLE_GNUS=$EMACS_cv_SYS_gnus_dir
 fi
 
 
-   # Check whether --with-custom or --without-custom was given.
-if test "${with_custom+set}" = set; then
-  withval="$with_custom"
-   EMACS_cv_ACCEPTABLE_CUSTOM=`( cd $withval && pwd || echo "$withval" ) 2> 
/dev/null` 
+   # Check whether --with-gnus or --without-gnus was given.
+if test "${with_gnus+set}" = set; then
+  withval="$with_gnus"
+   EMACS_cv_ACCEPTABLE_GNUS=`( cd $withval && pwd || echo "$withval" ) 2> 
/dev/null` 
 fi
 
-   CUSTOM=${EMACS_cv_ACCEPTABLE_CUSTOM}
+   GNUS=${EMACS_cv_ACCEPTABLE_GNUS}
    
-   echo "$ac_t"""${CUSTOM}"" 1>&6
+   echo "$ac_t"""${GNUS}"" 1>&6
 
 
-echo $ac_n "checking for recent gnus version""... $ac_c" 1>&6
-echo "configure:1017: checking for recent gnus version" >&5
+echo $ac_n "checking for recent URL version""... $ac_c" 1>&6
+echo "configure:992: checking for recent URL version" >&5
 
 
 
 if test -z ""noecho""; then
-       echo $ac_n "checking for mm-get-content-id in mm_decode""... $ac_c" 1>&6
-echo "configure:1023: checking for mm-get-content-id in mm_decode" >&5
+       echo $ac_n "checking for url-scheme-get-property in url_methods""... 
$ac_c" 1>&6
+echo "configure:998: checking for url-scheme-get-property in url_methods" >&5
 fi
-library=`echo mm_decode | tr _ -`
+library=`echo url_methods | tr _ -`
 
-elisp="(progn (fmakunbound 'mm-get-content-id) (condition-case nil (progn 
(require '$library) (fboundp 'mm-get-content-id)) (error nil)))"
+elisp="(progn (fmakunbound 'url-scheme-get-property) (condition-case nil 
(progn (require '$library) (fboundp 'url-scheme-get-property)) (error (prog1 
nil (message \"$library not found\")))))"
 if test -z ""noecho""; then
-       echo $ac_n "checking for mm_decode""... $ac_c" 1>&6
-echo "configure:1030: checking for mm_decode" >&5
+       echo $ac_n "checking for url_methods""... $ac_c" 1>&6
+echo "configure:1005: checking for url_methods" >&5
 fi
 
 
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
+       echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if 
(stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1  
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
        retval=`cat ${OUTPUT}`
+       echo "=> ${retval}" >& 5 2>&1
        rm -f ${OUTPUT}
-       EMACS_cv_SYS_mm_decode=$retval
+       EMACS_cv_SYS_url_methods=$retval
 
 
-mm_decode=${EMACS_cv_SYS_mm_decode}
+url_methods=${EMACS_cv_SYS_url_methods}
 if test -z ""noecho""; then
-       echo "$ac_t""$mm_decode" 1>&6
+       echo "$ac_t""$url_methods" 1>&6
 fi
 
-if test "${EMACS_cv_SYS_mm_decode}" = "nil"; then
-       EMACS_cv_SYS_mm_decode=no
+if test "${EMACS_cv_SYS_url_methods}" = "nil"; then
+       EMACS_cv_SYS_url_methods=no
 fi
-HAVE_mm_decode=${EMACS_cv_SYS_mm_decode}
+if test "${EMACS_cv_SYS_url_methods}" = "t"; then
+       EMACS_cv_SYS_url_methods=yes
+fi
+HAVE_url_methods=${EMACS_cv_SYS_url_methods}
 
 if test -z ""noecho""; then
-       echo "$ac_t""$HAVE_mm_decode" 1>&6
+       echo "$ac_t""$HAVE_url_methods" 1>&6
 fi
 
-if test "${HAVE_mm_decode}" = "yes"; then
-       EMACS_cv_ACCEPTABLE_GNUS=yes
+if test "${HAVE_url_methods}" = "yes"; then
+       EMACS_cv_ACCEPTABLE_URL=yes
 else
-       EMACS_cv_ACCEPTABLE_GNUS=no
+       EMACS_cv_ACCEPTABLE_URL=no
 fi
 
-if test "${EMACS_cv_ACCEPTABLE_GNUS}" = "yes"; then
+if test "${EMACS_cv_ACCEPTABLE_URL}" = "yes"; then
        
-elisp="(file-name-directory (locate-library \"mm-decode\"))"
+elisp="(file-name-directory (locate-library \"url-methods\"))"
 if test -z ""noecho""; then
-       echo $ac_n "checking for gnus_dir""... $ac_c" 1>&6
-echo "configure:1066: checking for gnus_dir" >&5
+       echo $ac_n "checking for url_dir""... $ac_c" 1>&6
+echo "configure:1046: checking for url_dir" >&5
 fi
 
 
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
+       echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if 
(stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1  
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
        retval=`cat ${OUTPUT}`
+       echo "=> ${retval}" >& 5 2>&1
        rm -f ${OUTPUT}
-       EMACS_cv_SYS_gnus_dir=$retval
+       EMACS_cv_SYS_url_dir=$retval
 
 
-gnus_dir=${EMACS_cv_SYS_gnus_dir}
+url_dir=${EMACS_cv_SYS_url_dir}
 if test -z ""noecho""; then
-       echo "$ac_t""$gnus_dir" 1>&6
+       echo "$ac_t""$url_dir" 1>&6
 fi
 
-       EMACS_cv_ACCEPTABLE_GNUS=$EMACS_cv_SYS_gnus_dir
+       EMACS_cv_ACCEPTABLE_URL=$EMACS_cv_SYS_url_dir
 fi
 
 
-   # Check whether --with-gnus or --without-gnus was given.
-if test "${with_gnus+set}" = set; then
-  withval="$with_gnus"
-   EMACS_cv_ACCEPTABLE_GNUS=`( cd $withval && pwd || echo "$withval" ) 2> 
/dev/null` 
+   # Check whether --with-url or --without-url was given.
+if test "${with_url+set}" = set; then
+  withval="$with_url"
+   EMACS_cv_ACCEPTABLE_URL=`( cd $withval && pwd || echo "$withval" ) 2> 
/dev/null` 
 fi
 
-   GNUS=${EMACS_cv_ACCEPTABLE_GNUS}
+   URL=${EMACS_cv_ACCEPTABLE_URL}
    
-   echo "$ac_t"""${GNUS}"" 1>&6
+   echo "$ac_t"""${URL}"" 1>&6
 
 
 echo $ac_n "checking how to rebuild custom autoloads""... $ac_c" 1>&6
-echo "configure:1098: checking how to rebuild custom autoloads" >&5
+echo "configure:1080: checking how to rebuild custom autoloads" >&5
 
 
 
 if test -z ""noecho""; then
        echo $ac_n "checking for Custom-make-dependencies in cus_dep""... 
$ac_c" 1>&6
-echo "configure:1104: checking for Custom-make-dependencies in cus_dep" >&5
+echo "configure:1086: checking for Custom-make-dependencies in cus_dep" >&5
 fi
 library=`echo cus_dep | tr _ -`
 
-elisp="(progn (fmakunbound 'Custom-make-dependencies) (condition-case nil 
(progn (require '$library) (fboundp 'Custom-make-dependencies)) (error nil)))"
+elisp="(progn (fmakunbound 'Custom-make-dependencies) (condition-case nil 
(progn (require '$library) (fboundp 'Custom-make-dependencies)) (error (prog1 
nil (message \"$library not found\")))))"
 if test -z ""noecho""; then
        echo $ac_n "checking for cus_dep""... $ac_c" 1>&6
-echo "configure:1111: checking for cus_dep" >&5
+echo "configure:1093: checking for cus_dep" >&5
 fi
 
 
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
+       echo ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if 
(stringp x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))" >& 5 2>&1  
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x 'ignore) (prin1-to-string x)) nil \"${OUTPUT}\"nil 5))" >& 5 2>&1
        retval=`cat ${OUTPUT}`
+       echo "=> ${retval}" >& 5 2>&1
        rm -f ${OUTPUT}
        EMACS_cv_SYS_cus_dep=$retval
 
@@ -1126,6 +1110,9 @@ fi
 if test "${EMACS_cv_SYS_cus_dep}" = "nil"; then
        EMACS_cv_SYS_cus_dep=no
 fi
+if test "${EMACS_cv_SYS_cus_dep}" = "t"; then
+       EMACS_cv_SYS_cus_dep=yes
+fi
 HAVE_cus_dep=${EMACS_cv_SYS_cus_dep}
 
 if test -z ""noecho""; then
@@ -1166,22 +1153,6 @@ CIDFILE=url-cid.el
 
 fi
 
-if test "${CUSTOM}" = "no"; then
-echo "configure: warning: " "" 1>&2
-echo "configure: warning: No usable version of the widget/custom libraries 
have been" 1>&2
-echo "configure: warning: detected on your system.  This version of Emacs/W3 
requires" 1>&2
-echo "configure: warning: features present in newer versions of the widget 
library." 1>&2
-echo "configure: warning: " "" 1>&2
-echo "configure: warning: Please upgrade to the latest version of custom 
available." 1>&2
-echo "configure: warning: This package is included with Emacs 20.1 and XEmacs 
20.3" 1>&2
-echo "configure: warning: or from http://www.dina.kvl.dk/~abraham/custom/"; 1>&2
-echo "configure: warning: or 
/ftp.dina.kvl.dk:/pub/Staff/Per.Abrahamsen/custom/" 1>&2
-echo "configure: warning: " "" 1>&2
-echo "configure: warning: You may still continue, but you must modify 
lisp/Makefile" 1>&2
-echo "configure: warning: to have the correct WIDGETDIR setting." 1>&2
-echo "configure: warning: " "" 1>&2
-fi
-
 trap '' 1 2 15
 
 trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 
2 15
@@ -1298,11 +1269,10 @@ address@hidden@%$XEMACS%g
 address@hidden@%$EMACS_FLAVOR%g
 address@hidden@%$lispdir%g
 address@hidden@%$EMACS_VERSION%g
address@hidden@%$HAVE_widget%g
address@hidden@%$HAVE_wid_edit%g
address@hidden@%$CUSTOM%g
 address@hidden@%$HAVE_mm_decode%g
 address@hidden@%$GNUS%g
address@hidden@%$HAVE_url_methods%g
address@hidden@%$URL%g
 address@hidden@%$HAVE_cus_dep%g
 address@hidden@%$REBUILD_CUSTOMLOADS%g
 address@hidden@%$INSTALL%g
@@ -1438,4 +1408,3 @@ echo "$ac_t""" "" 1>&6
 echo "$ac_t"""To finish building Emacs/W3 type \'make\' now."" 1>&6
 echo "$ac_t"""To install Emacs/W3 type \'make install\'."" 1>&6
 echo "$ac_t"""To create autoloads in \'${DOTEMACS}\' type \'make dotemacs\'"" 
1>&6
-
diff --git a/configure.in b/configure.in
index f51a05a..232bd6d 100644
--- a/configure.in
+++ b/configure.in
@@ -34,8 +34,8 @@ AC_EMACS_PACKAGES
 AC_PATH_LISPDIR
 
 AC_EMACS_VERSION
-AC_CHECK_CUSTOM
 AC_CHECK_GNUS
+AC_CHECK_URL
 AC_CHECK_CUSTOMLOADS
 
 if test "${MAKEINFO}" = "no"; then
@@ -60,22 +60,6 @@ CIDFILE=url-cid.el
 AC_SUBST(CIDFILE)
 fi
 
-if test "${CUSTOM}" = "no"; then
-AC_MSG_WARN(" ")
-AC_MSG_WARN(No usable version of the widget/custom libraries have been)
-AC_MSG_WARN(detected on your system.  This version of Emacs/W3 requires)
-AC_MSG_WARN(features present in newer versions of the widget library.)
-AC_MSG_WARN(" ")
-AC_MSG_WARN(Please upgrade to the latest version of custom available.)
-AC_MSG_WARN(This package is included with Emacs 20.1 and XEmacs 20.3)
-AC_MSG_WARN(or from http://www.dina.kvl.dk/~abraham/custom/)
-AC_MSG_WARN(or /ftp.dina.kvl.dk:/pub/Staff/Per.Abrahamsen/custom/)
-AC_MSG_WARN(" ")
-AC_MSG_WARN([You may still continue, but you must modify lisp/Makefile])
-AC_MSG_WARN(to have the correct WIDGETDIR setting.)
-AC_MSG_WARN(" ")
-fi
-
 AC_OUTPUT(Makefile
          etc/Makefile
          texi/Makefile
@@ -94,9 +78,3 @@ AC_MSG_RESULT(" ")
 AC_MSG_RESULT("To finish building Emacs/W3 type \'make\' now.")
 AC_MSG_RESULT("To install Emacs/W3 type \'make install\'.")
 AC_MSG_RESULT("To create autoloads in \'${DOTEMACS}\' type \'make dotemacs\'")
-
-dnl (aclocal.m4) Local variables:
-dnl (aclocal.m4) eval: (make-local-hook 'kill-buffer-hook)
-dnl (aclocal.m4) eval: (defun w3-rebuild-configure-files () (if 
(file-newer-than-file-p (buffer-file-name) (expand-file-name "configure" 
(file-name-directory (buffer-file-name)))) (shell-command "autoreconf")))
-dnl (aclocal.m4) eval: (add-hook 'kill-buffer-hook 'w3-rebuild-configure-files 
nil t)
-dnl (aclocal.m4) End: ***
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index f4969bc..b061c77 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -12,8 +12,8 @@ VPATH=$(srcdir)
 # Have to preload a few things to get a nice clean compile
 
 EMACS     = @EMACS@
-WIDGETDIR = @CUSTOM@
 GNUSDIR   = @GNUS@
+URLDIR    = @URL@
 INSTALL   = @INSTALL@
 RM        = rm -f
 
@@ -22,37 +22,53 @@ DEPS = -l $(srcdir)/docomp.el -l $(srcdir)/url-vars.el -l 
$(srcdir)/w3-vars.el
 # compile with noninteractive and relatively clean environment
 BATCHFLAGS = -batch -q -no-site-file
 
-URLSOURCES = \
-       url-nfs.el url-file.el url-cookie.el url-parse.el url-irc.el    \
-       url-gopher.el url-http.el url-mail.el url-misc.el url-news.el   \
-       url-vars.el url-auth.el mm.el md5.el url-gw.el ssl.el base64.el \
-       url.el socks.el url-cache.el url-ns.el url-ldap.el @CIDFILE@
-
-URLOBJECTS    = $(URLSOURCES:.el=.elc)
-
-SOURCES =                                                              \
-       mule-sysdp.el w3-widget.el devices.el w3-imap.el css.el         \
-       dsssl.el dsssl-flow.el font.el images.el w3-vars.el w3-cus.el   \
-       w3-style.el w3-keyword.el w3-forms.el w3-emulate.el             \
-       w3-props.el w3-menu.el w3-mouse.el w3-toolbar.el                \
-       w3-speak.el w3-latex.el w3-parse.el w3-display.el w3-print.el   \
-       w3-about.el w3-hotindex.el w3-hot.el w3-e19.el w3-xemac.el      \
-       w3.el w3-script.el w3-jscript.el w3-elisp.el w3-e20.el          \
-       w3-speak-table.el w3-java.el
-
-OBJECTS = $(SOURCES:.el=.elc)
-
-AUTOSOURCES = auto-autoloads.el custom-load.el w3-auto.el w3-cfg.el
-AUTOOBJECTS = $(AUTOSOURCES:.el=.elc)
+W3_SOURCES =                                                           \
+       css.el                                                          \
+       url-hotlist.el                                                  \
+       w3-cfg.el                                                       \
+       w3-cus.el                                                       \
+       w3-display.el                                                   \
+       w3-e19.el                                                       \
+       w3-e20.el                                                       \
+       w3-emulate.el                                                   \
+       w3-forms.el                                                     \
+       w3-hot.el                                                       \
+       w3-hotindex.el                                                  \
+       w3-imap.el                                                      \
+       w3-java.el                                                      \
+       w3-keymap.el                                                    \
+       w3-keyword.el                                                   \
+       w3-menu.el                                                      \
+       w3-mouse.el                                                     \
+       w3-parse.el                                                     \
+       w3-print.el                                                     \
+       w3-props.el                                                     \
+       w3-speak-table.el                                               \
+       w3-speak.el                                                     \
+       w3-style.el                                                     \
+       w3-toolbar.el                                                   \
+       w3-vars.el                                                      \
+       w3-widget.el                                                    \
+       w3-xemac.el                                                     \
+       w3.el
+
+UTIL_SOURCES =                                                                 
\
+       base64.el devices.el font.el images.el md5.el socks.el ssl.el
+
+AUTO_SOURCES = auto-autoloads.el custom-load.el w3-auto.el w3-cfg.el
+
+W3_OBJECTS = $(SOURCES:.el=.elc)
+UTIL_OBJECTS = $(UTIL_SOURCES:.el=.elc)
+AUTO_OBJECTS = $(AUTO_SOURCES:.el=.elc)
 
 # Some makes appear to choke if I try to do a substitution on a really
 # large macro like SOURCES when it included all of these, so lets combine
 # everything now that it has been appropriately munged in smaller chunks.
-ALLSOURCES = $(SOURCES) $(URLSOURCES) $(AUTOSOURCES)
-ALLOBJECTS = $(OBJECTS) $(URLOBJECTS) $(AUTOOBJECTS)
+ALLSOURCES = $(W3_SOURCES) $(UTIL_SOURCES) $(AUTO_SOURCES)
+ALLOBJECTS = $(W3_OBJECTS) $(UTIL_OBJECTS) $(AUTO_OBJECTS)
 
 # Warning!  Currently, the following file can _NOT_ be bytecompiled.
-EXTRAS = w3-sysdp.el docomp.el url-cid.el
+EXTRAS = w3-sysdp.el docomp.el
 
 .SUFFIXES: .elc .el
 
@@ -60,18 +76,18 @@ EXTRAS = w3-sysdp.el docomp.el url-cid.el
        co -q $<
 
 .el.elc:
-       GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) W3SRCDIR=$(srcdir) $(EMACS) 
$(BATCHFLAGS) $(DEPS) -f batch-byte-compile $<
+       GNUSDIR=$(GNUSDIR) URLDIR=$(URLDIR) W3SRCDIR=$(srcdir) $(EMACS) 
$(BATCHFLAGS) $(DEPS) -f batch-byte-compile $<
 
-all:   $(AUTOSOURCES) w3
+all:   $(AUTO_SOURCES) w3
 
 w3-auto.el: auto-autoloads.el
-       GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) W3SRCDIR=$(srcdir) $(EMACS) 
$(BATCHFLAGS) -l $(srcdir)/docomp.el -f emacs-batch-build-autoloads $(srcdir) 
auto-autoloads.el
+       GNUSDIR=$(GNUSDIR) URLDIR=$(URLDIR) W3SRCDIR=$(srcdir) $(EMACS) 
$(BATCHFLAGS) -l $(srcdir)/docomp.el -f emacs-batch-build-autoloads $(srcdir) 
auto-autoloads.el
 
-auto-autoloads.el: $(SOURCES) $(URLSOURCES)
-       GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) W3SRCDIR=$(srcdir) $(EMACS) 
$(BATCHFLAGS) -l $(srcdir)/docomp.el -f emacs-batch-build-autoloads $(srcdir) 
auto-autoloads.el
+auto-autoloads.el: $(SOURCES)
+       GNUSDIR=$(GNUSDIR) URLDIR=$(URLDIR) W3SRCDIR=$(srcdir) $(EMACS) 
$(BATCHFLAGS) -l $(srcdir)/docomp.el -f emacs-batch-build-autoloads $(srcdir) 
auto-autoloads.el
 
-custom-load.el: $(SOURCES) $(URLSOURCES)
-       GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) W3SRCDIR=$(srcdir) 
@REBUILD_CUSTOMLOADS@
+custom-load.el: $(SOURCES)
+       GNUSDIR=$(GNUSDIR) URLDIR=$(URLDIR) W3SRCDIR=$(srcdir) 
@REBUILD_CUSTOMLOADS@
        if [ -f cus-load.el ]; then mv cus-load.el custom-load.el; fi
 
 w3-cfg.el: $(srcdir)/w3-cfg.el.in ../config.status
@@ -84,7 +100,7 @@ xemacs-w3: $(ALLSOURCES) $(ALLOBJECTS)
        @echo Build of w3 complete...
 
 fast:  $(ALLSOURCES) $(EXTRAS)
-       GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) W3SRCDIR=$(srcdir) $(EMACS) 
$(BATCHFLAGS) $(DEPS) -f batch-byte-compile $(ALLSOURCES)
+       GNUSDIR=$(GNUSDIR) URLDIR=$(URLDIR) W3SRCDIR=$(srcdir) $(EMACS) 
$(BATCHFLAGS) $(DEPS) -f batch-byte-compile $(ALLSOURCES)
        @echo Build of w3 complete...
 
 autoloads:
@@ -102,17 +118,11 @@ install: all
        done;
 
 distclean: clean
-       $(RM) config.* Makefile w3-cfg.el w3-auto.el $(AUTOSOURCES)
+       $(RM) config.* Makefile w3-cfg.el w3-auto.el $(AUTO_SOURCES)
 
 clean:
        $(RM) *.elc *~
 
-w3-vars.elc: w3-cus.elc w3-vars.el
-w3-display.elc: w3-display.el css.elc font.elc w3-imap.elc
-css.elc: css.el font.elc
-w3.elc: css.elc w3-vars.elc w3.el
-dsssl.elc: dsssl.el dsssl-flow.elc
-
 # Automatic makefile rebuilding
 Makefile: $(srcdir)/Makefile.in ../config.status
        ( cd .. ; CONFIG_FILES=lisp/Makefile ./config.status )
@@ -127,4 +137,4 @@ $(top_srcdir)/configure: $(top_srcdir)/configure.in 
$(top_srcdir)/aclocal.m4
 version: $(ALLSOURCES) $(EXTRAS) descrip.mms
        test -d $(DIRNAME)/lisp || mkdir -p $(DIRNAME)/lisp
        for x in descrip.mms $(ALLSOURCES) $(EXTRAS) w3-cfg.el.in w3-cfg.nt 
Makefile.in; do $(INSTALL) -m 644 $$x $(DIRNAME)/lisp; done
-       cd $(DIRNAME)/lisp && $(RM) $(AUTOSOURCES)
+       cd $(DIRNAME)/lisp && $(RM) $(AUTO_SOURCES)
diff --git a/lisp/base64.el b/lisp/base64.el
index c04a528..6c0b7c0 100644
--- a/lisp/base64.el
+++ b/lisp/base64.el
@@ -1,7 +1,7 @@
 ;;; base64.el,v --- Base64 encoding functions
 ;; Author: Kyle E. Jones
-;; Created: $Date: 1999/03/25 05:30:03 $
-;; Version: $Revision: 1.3 $
+;; Created: 1997/03/12 14:37:09
+;; Version: 1.6
 ;; Keywords: extensions
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -73,9 +73,13 @@ base64-encoder-program.")
       (setq p (cdr p)))
     v))
 
+(defvar base64-binary-coding-system 'binary)
+
 (defun base64-run-command-on-region (start end output-buffer command
                                           &rest arg-list)
-  (let ((tempfile nil) status errstring)
+  (let ((tempfile nil) status errstring default-process-coding-system 
+       (coding-system-for-write base64-binary-coding-system)
+       (coding-system-for-read base64-binary-coding-system))
     (unwind-protect
        (progn
          (setq tempfile (make-temp-name "base64"))
@@ -94,29 +98,21 @@ base64-encoder-program.")
                     (setq errstring (buffer-string))
                     (kill-buffer nil)
                     (cons status errstring)))))
-      (condition-case ()
-         (delete-file tempfile)
-       (error nil)))))
-
-(defun base64-insert-char (char &optional count ignored buffer)
-  (condition-case nil
-      (progn
-       (insert-char char count ignored buffer)
-       (fset 'base64-insert-char 'insert-char))
-    (wrong-number-of-arguments
-     (fset 'base64-insert-char 'base64-xemacs-insert-char)
-     (base64-insert-char char count ignored buffer))))
+      (ignore-errors
+       (delete-file tempfile)))))
 
-(defun base64-xemacs-insert-char (char &optional count ignored buffer)
-  (if (and buffer (eq buffer (current-buffer)))
-      (insert-char char count)
-    (save-excursion
-      (set-buffer buffer)
-      (insert-char char count))))
+(if (string-match "XEmacs" emacs-version)
+    (defalias 'base64-insert-char 'insert-char)
+  (defun base64-insert-char (char &optional count ignored buffer)
+    (if (or (null buffer) (eq buffer (current-buffer)))
+       (insert-char char count)
+      (with-current-buffer buffer
+       (insert-char char count))))
+  (setq base64-binary-coding-system 'no-conversion))
 
 (defun base64-decode-region (start end)
   (interactive "r")
-  (message "Decoding base64...")
+  ;;(message "Decoding base64...")
   (let ((work-buffer nil)
        (done nil)
        (counter 0)
@@ -143,7 +139,7 @@ base64-encoder-program.")
               ((> (skip-chars-forward base64-alphabet end) 0)
                (setq lim (point))
                (while (< inputpos lim)
-                 (setq bits (+ bits 
+                 (setq bits (+ bits
                                (aref base64-alphabet-decoding-vector
                                      (char-int (char-after inputpos)))))
                  (setq counter (1+ counter)
@@ -162,7 +158,7 @@ base64-encoder-program.")
                    (error "at least %d bits missing at end of base64 encoding"
                           (* (- 4 counter) 6)))
                (setq done t))
-              ((= (char-after (point)) ?=)
+              ((eq (char-after (point)) ?=)
                (setq done t)
                (cond ((= counter 1)
                       (error "at least 2 bits missing at end of base64 
encoding"))
@@ -179,9 +175,10 @@ base64-encoder-program.")
          (insert-buffer-substring work-buffer)
          (delete-region (point) end))
       (and work-buffer (kill-buffer work-buffer))))
-  (message "Decoding base64... done"))
+  ;;(message "Decoding base64... done")
+  )
 
-(defun base64-encode-region (start end)
+(defun base64-encode-region (start end &optional no-line-break)
   (interactive "r")
   (message "Encoding base64...")
   (let ((work-buffer nil)
@@ -218,7 +215,8 @@ base64-encoder-program.")
                      (aref alphabet (logand bits 63))
                      1 nil work-buffer)
                     (setq cols (+ cols 4))
-                    (cond ((= cols 72)
+                    (cond ((and (= cols 72)
+                                (not no-line-break))
                            (base64-insert-char ?\n 1 nil work-buffer)
                            (setq cols 0)))
                     (setq bits 0 counter 0))
@@ -237,8 +235,9 @@ base64-encoder-program.")
                (base64-insert-char (aref alphabet (logand (lsh bits -6) 63))
                                    1 nil work-buffer)
                (base64-insert-char ?= 1 nil work-buffer)))
-           (if (> cols 0)
-               (base64-insert-char ?\n 1 nil work-buffer)))
+           (if (and (> cols 0)
+                    (not no-line-break))
+               (base64-insert-char ?\n 1 nil work-buffer)))
          (or (markerp end) (setq end (set-marker (make-marker) end)))
          (goto-char start)
          (insert-buffer-substring work-buffer)
@@ -269,9 +268,9 @@ base64-encoder-program.")
     (delete-region (point-max) (point))
     (prog1
        (buffer-string)
-      (kill-buffer (current-buffer)))))  
+      (kill-buffer (current-buffer)))))
 
-(defalias 'base64-encode-string 'base64-encode)
-(defalias 'base64-decode-string 'base64-decode)
+(fset 'base64-decode-string 'base64-decode)
+(fset 'base64-encode-string 'base64-encode)
 
 (provide 'base64)
diff --git a/lisp/docomp.el b/lisp/docomp.el
index 982677b..75b76cb 100644
--- a/lisp/docomp.el
+++ b/lisp/docomp.el
@@ -1,80 +1,14 @@
 ;;; First things first - if they do not have the WIDGETDIR environment
 ;;; variable set, choke, scream, and die.
-(if (or (not (getenv "WIDGETDIR"))
-       (string= (getenv "WIDGETDIR") "no"))
-    (progn
-      (message "Could not find custom libraries.")
-      (message "Please rerun `configure' in the top level directory, and")
-      (message "provide the `--with-custom=XXX' flag.")
-      (kill-emacs 1)))
+(setq srcdir (or (getenv "W3SRCDIR") "."))
 
-(setq load-path (append (list (expand-file-name 
-                              (or (getenv "W3SRCDIR") "./"))
-                             "."
-                             (or (getenv "WIDGETDIR")
-                                 (expand-file-name "../widget"))
-                             (or (getenv "GNUSDIR")
-                                 (expand-file-name "../gnus"))
-                             )
-                       load-path))
+(push srcdir load-path)
+(push (or (getenv "GNUSDIR") (expand-file-name "../gnus/lisp/" srcdir)) 
load-path)
+(push (or (getenv "URLDIR") (expand-file-name "../url/lisp/" srcdir)) 
load-path)
 
 (setq max-specpdl-size (* 10 max-specpdl-size)
       max-lisp-eval-depth (* 10 max-lisp-eval-depth))
 
-(defun w3-declare-variables (&rest args)
-  (while args
-    (eval (list 'defvar (car args) nil ""))
-    (setq args (cdr args))))
-
-;; For Emacs 19
-(w3-declare-variables 'track-mouse 'menu-bar-help-menu 'menu-bar-mode
-                     'global-face-data)
-
-;; For XEmacs/Lucid
-(w3-declare-variables 'current-menubar 'default-menubar 'extent
-                     'mode-motion-hook 'mode-popup-menu 'sound-alist
-                     'menubar-visible-p
-                     'inhibit-help-echo 'default-toolbar
-                     'bottom-toolbar-height 'top-toolbar-height
-                     'toolbar-buttons-captioned-p
-                     'right-toolbar-width 'left-toolbar-width
-                     'top-toolbar 'bottom-toolbar 'right-toolbar
-                     'left-toolbar 'device-fonts-cache
-                     'has-modeline-p 'baud-rate)
-
-;; For MULE
-(w3-declare-variables '*noconv* '*autoconv* '*euc-japan* '*internal*
-                     'w3-mime-list-for-code-conversion 'lc-ltn1
-                     'mule-version 'enable-multibyte-characters
-                     'mc-flag 'charset-latin-iso8859-1
-                     'default-enable-multibyte-characters
-                     'buffer-file-coding-system
-                     'file-coding-system-for-read 'file-coding-system)
-
-;; For TM
-(w3-declare-variables 'mime/editor-mode-flag 'mime-tag-format)
-                         
-;; For NNTP
-(w3-declare-variables 'nntp-server-buffer 'nntp-server-process 'nntp/connection
-                     'gnus-nntp-server 'nntp-server-name 'nntp-version
-                     'gnus-default-nntp-server)
-
-;; For xpm-button
-(w3-declare-variables 'x-library-search-path)
-
-;; For emacspeak
-(w3-declare-variables 'dtk-voice-table 'dtk-punctuation-mode)
-
-;; For a few internal things
-(w3-declare-variables 'tag 'w3-working-buffer 'proxy-info 'args
-                     'w3-image-widgets-waiting 'w3-form-info
-                     'w3-last-parse-tree 'command-line-args-left
-                     'standard-display-table 'w3-html-bookmarks
-                     'browse-url-browser-function 'widget-keymap)
-
-;; GNUS
-(w3-declare-variables 'gnus-group-buffer 'gnus-version)                      
-
 ;; If we are building w3 in a different directory than the source
 ;; directory, we must read *.el from source directory and write *.elc
 ;; into the building directory.  For that, we define this function
@@ -97,22 +31,9 @@
 
 ;; Emacs 19 byte compiler complains about too much stuff by default.
 ;; Turn off most of the warnings here.
-(setq byte-compile-warnings '(free-vars)
+(setq byte-compile-warnings nil
       byte-optimize t)
 
-;; This is part of bytecomp.el in 19.35: Without it, any defvar'd
-;; variables show up as 'free variables' to the byte compiler, which
-;; is bogus.
-(if (not (get 'custom-declare-variable 'byte-hunk-handler))
-    (progn
-      (put 'custom-declare-variable 'byte-hunk-handler
-          'byte-compile-file-form-custom-declare-variable)
-      (defun byte-compile-file-form-custom-declare-variable (form)
-       (if (memq 'free-vars byte-compile-warnings)
-           (setq byte-compile-bound-variables
-                 (cons (nth 1 (nth 1 form)) byte-compile-bound-variables)))
-       form)))
-
 (defun compile-it ()
   (let ((files (directory-files "." t ".*.[eE][lL]$" nil)))
     (while files
@@ -172,4 +93,3 @@
 (require 'w3-sysdp)
 (require 'w3-vars)
 (require 'url)
-(require 'mm)
diff --git a/lisp/dsssl-flow.el b/lisp/dsssl-flow.el
deleted file mode 100644
index 33614a8..0000000
--- a/lisp/dsssl-flow.el
+++ /dev/null
@@ -1,124 +0,0 @@
-;;; dsssl-flow.el --- DSSSL flow objects
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:07 $
-;; Version: $Revision: 1.1 $
-;; Keywords: 
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996, 1997 by William M. Perry <address@hidden>
-;;; Copyright (c) 1997 - 1998 by Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defstruct flow-object
-  (type 'unknown :read-only t)         ; Name of this flow object
-  (properties nil)
-  (children nil)
-  (parent nil)
-  )
-
-(defstruct dsssl-flow-processor
-  (name 'unknown :read-only t)         ; Name of this processing backend
-  (init nil)                           ; initialize the backend
-  (handler nil)                                ; handle a single flow object
-  (sizeof nil)                         ; get size of a single flow object
-  (clean nil)                          ; cleanup instance of backend
-  )
-
-(defvar dsssl-flow-active-faces nil)
-(defvar dsssl-flow-active-voices nil)
-(make-variable-buffer-local 'dsssl-flow-active-faces)
-(make-variable-buffer-local 'dsssl-flow-active-voices)
-
-(defun dsssl-flow-display (flows processor)
-  (let ((handler (dsssl-flow-processor-handler processor))
-       (flow-stack (list flows))
-       (content nil)
-       (node nil)
-       (last-object nil)
-       )
-    (while flow-stack
-      (setq content (pop flow-stack))
-      (dsssl-flow-progress-meter)
-      ;; Handle the element's content
-      (while content
-       (dsssl-flow-progress-meter)
-       (if (stringp (car content))
-           (dsssl-flow-handle-string-content (pop content))
-         (setq node (pop content))
-         ;; todo: collect all information about this flow object for faster
-         ;; lookup later.
-         (push (dsssl-flow-face-for-element node) dsssl-flow-active-faces)
-         (push (dsssl-flow-voice-for-element node) dsssl-flow-active-voices))
-         (case (flow-object-type node)
-           ;; Core DSSL components  basic flow object classes
-           (sequence                   ; 12.6.1
-            )
-           (display-group              ; 12.6.2
-            )
-           (paragraph                  ; 12.6.6
-            )
-           (paragraph-break            ; 12.6.7
-            )
-           (external-graphic           ; 12.6.15
-            )
-           ;; DSSSL options required in DSSSL online
-           ;; Simple page flow object class
-           (simple-page-sequence       ; 12.6.3
-            )
-           ;; Table flow object classes
-           (table                      ; 12.6.27.1
-            )
-           (table-part                 ; 12.6.27.2
-            )
-           (table-column               ; 12.6.27.3
-            )
-           (table-row                  ; 12.6.27.5
-            )
-           (table-border               ; 12.6.27.7
-            )
-           (table-cell                 ; 12.6.27.6
-            ;; Do we need to handle table-cell at this level, or is that
-            ;; something that the display backend needs to handle, and we
-            ;; just query that in the `table-row' processor?
-            )
-           ;; Online display flow object classes
-           (vertical-scroll            ; 12.6.28.1
-            )
-           (multi-mode                 ; 12.6.28.2
-            )
-           (marginalia                 ; 12.6.28.4
-            )
-           ;; Emacs/W3 specific flow objects
-           (applet                     ; Wow, Java
-            )
-           (script                     ; Scripts
-            )
-           (form-element               ; Any form element
-            )
-           ;; pinhead, flame, and cookie can now all be handled by
-           ;; a stud-muffing DSSSL stylesheet - hooray!
-
-           ;; Generic formatting - all things that can be fully specified
-           ;; by a CSS stylesheet.
-           (otherwise
-            ;; handle the content
-            (dsssl-flow-handle-content node)))))))
-
-(provide 'dsssl-flow)
diff --git a/lisp/dsssl.el b/lisp/dsssl.el
deleted file mode 100644
index 54708f1..0000000
--- a/lisp/dsssl.el
+++ /dev/null
@@ -1,492 +0,0 @@
-;;; dsssl.el --- DSSSL parser
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:07 $
-;; Version: $Revision: 1.1 $
-;; Keywords: 
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996, 1997 by William M. Perry <address@hidden>
-;;; Copyright (c) 1997 - 1998 by Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'cl)
-(require 'dsssl-flow)
-
-(if (not (fboundp 'cl-copy-hashtable))
-    (defun cl-copy-hashtable (h)
-      (let ((new (make-hash-table)))
-       (cl-maphash (function (lambda (k v) (cl-puthash k v new))) h)
-       new)))
-
-(defconst dsssl-builtin-functions
-  '(not boolean\?  case equal\?  null\?  list\?  list length append
-       reverse list-tail list-ref member symbol\?  keyword\?  quantity\?
-       number\?  real\?  integer\?  = < > <= >= + * - / max min abs quotient
-       modulo remainder floor ceiling truncate round number->string
-       string->number char\?  char=\?  char-property string\?  string
-       string-length string-ref string=\?  substring string-append
-       procedure\?  apply external-procedure make time time->string quote
-       char-downcase identity error let)
-  "A list of all the builtin DSSSL functions that we support.")
-
-(defsubst dsssl-check-args (args expected)
-  ;; Signal an error if we don't have the expected # of arguments
-  (or (= (length args) expected)
-      (error "Wrong # arguments (expected %d): %d" expected (length args))))
-
-(defsubst dsssl-min-args (args min)
-  (or (>= (length args) min)
-      (error "Wrong # arguments (expected at least %d): %d" min
-            (length args))))
-
-(defun dsssl-call-function (func args)
-  (declare (special defines units))
-  (let ((old-defines nil)
-       (old-units nil)
-       (func-args (nth 1 func))
-       (real-func (nth 2 func))
-       (retval nil))
-    ;; Make sure we got the right # of arguments
-    (dsssl-check-args args (length func-args))
-
-    ;; make sure we evaluate all the arguments in the old environment
-    (setq args (mapcar 'dsssl-eval args))
-
-    ;; Save the old environment
-    (setq old-defines (cl-copy-hashtable defines)
-         old-units (cl-copy-hashtable units))
-    
-    ;; Create the function's environment
-    (while func-args
-      (cl-puthash (car func-args) (car args) defines)
-      (setq func-args (cdr func-args)
-           args (cdr args)))
-
-    ;; Now evaluate the function body, returning the value of the last one
-    (while real-func
-      (setq retval (dsssl-eval (car real-func))
-           real-func (cdr real-func)))
-
-    ;; Restore the previous environment
-    (setq defines old-defines
-         units old-units)
-
-    ;; And we are out of here baby!
-    retval))
-
-(defun dsssl-eval (form)
-  ;; We expect to have a 'defines' and 'units' hashtable floating around
-  ;; from higher up the call stack.
-  (declare (special defines units))
-  (cond
-   ((consp form)                       ; A function call
-    (let ((func (car form))
-         (args (cdr form)))
-      (case func
-       (cons
-        (dsssl-check-args args 2)
-        (cons (dsssl-eval (pop args)) (dsssl-eval (pop args))))
-       (cdr
-        (dsssl-check-args args 1)
-        (cdr (dsssl-eval (pop args))))
-       (car
-        (dsssl-check-args args 1)
-        (car (dsssl-eval (pop args))))
-       (not
-        (dsssl-check-args args 1)
-        (not (dsssl-eval (car args))))
-       (boolean\?
-        (dsssl-check-args args 1)
-        (and (symbolp (car args))
-             (memq (car args) '(\#f \#t))))
-       (if
-        (dsssl-min-args args 2)
-        (let ((val (dsssl-eval (pop args))))
-          (if val
-              (dsssl-eval (nth 0 args))
-            (if (nth 1 args)
-                (dsssl-eval (nth 1 args))))))
-       (let                            ; FIXME
-        )
-       (case
-        (dsssl-min-args args 2)
-        (let* ((val (dsssl-eval (pop args)))
-               (conditions args)
-               (done nil)
-               (possibles nil)
-               (cur nil))
-          (while (and conditions (not done))
-            (setq cur (pop conditions)
-                  possibles (nth 0 cur))
-            (if (or (and (listp possibles)
-                         (member val possibles))
-                    (equal val possibles)
-                    (memq possibles '(default otherwise)))
-                (setq done (dsssl-eval (nth 1 cur)))))
-          done))
-       (equal\?
-        (dsssl-check-args args 2)
-        (equal (dsssl-eval (car args)) (dsssl-eval (cadr args))))
-       (null\?
-        (dsssl-check-args args 1)
-        (null (dsssl-eval (car args))))
-       (list\?
-        (dsssl-check-args args 1)
-        (listp (dsssl-eval (car args))))
-       (list
-        (mapcar 'dsssl-eval args))
-       (length
-        (dsssl-check-args args 1)
-        (length (dsssl-eval (car args))))
-       (append
-        (apply 'append (mapcar 'dsssl-eval args)))
-       (reverse
-        (dsssl-check-args args 1)
-        (reverse (dsssl-eval (car args))))
-       (list-tail
-        (dsssl-check-args args 2)
-        (nthcdr (dsssl-eval (car args)) (dsssl-eval (cadr args))))
-       (list-ref
-        (dsssl-check-args args 2)
-        (nth (dsssl-eval (car args)) (dsssl-eval (cadr args))))
-       (member
-        (dsssl-check-args args 2)
-        (member (dsssl-eval (car args)) (dsssl-eval (cadr args))))
-       (symbol\?
-        (dsssl-check-args args 1)
-        (symbolp (dsssl-eval (car args))))
-       (keyword\?
-        (dsssl-check-args args 1)
-        (keywordp (dsssl-eval (car args))))
-       (quantity\?
-        (dsssl-check-args args 1)
-        (error "%s not implemented yet." func))
-       (number\?
-        (dsssl-check-args args 1)
-        (numberp (dsssl-eval (car args))))
-       (real\?
-        (dsssl-check-args args 1)
-        (let ((rval (dsssl-eval (car args))))
-          (and (numberp rval)
-               (/= (truncate rval) rval))))
-       (integer\?
-        (dsssl-check-args args 1)
-        (let ((rval (dsssl-eval (car args))))
-          (and (numberp rval)
-               (= (truncate rval) rval))))
-       ((= < > <= >=)
-        (dsssl-min-args args 2)
-        (let ((not-done t)
-              (initial (dsssl-eval (car args)))
-              (next nil))
-          (setq args (cdr args))
-          (while (and args not-done)
-            (setq next (dsssl-eval (car args))
-                  args (cdr args)
-                  not-done (funcall func initial next)
-                  initial next))
-          not-done))
-       ((+ *)
-        (dsssl-min-args args 2)
-        (let ((acc (dsssl-eval (car args))))
-          (setq args (cdr args))
-          (while args
-            (setq acc (funcall func acc (dsssl-eval (car args)))
-                  args (cdr args)))
-          acc))
-       (-
-        (dsssl-min-args args 1)
-        (apply func (mapcar 'dsssl-eval args)))
-       (/
-        (dsssl-min-args args 1)
-        (if (= (length args) 1)
-            (/ 1 (dsssl-eval (car args)))
-          (apply func (mapcar 'dsssl-eval args))))
-       ((max min)
-        (apply func (mapcar 'dsssl-eval args)))
-       (abs
-        (dsssl-check-args args 1)
-        (abs (dsssl-eval (car args))))
-       (quotient                       ; FIXME
-        (error "`%s' not implemented yet!" func))
-       (modulo
-        (dsssl-check-args args 2)
-        (mod (dsssl-eval (car args)) (dsssl-eval (cadr args))))
-       (remainder
-        (dsssl-check-args args 2)
-        (% (dsssl-eval (car args)) (dsssl-eval (cadr args))))
-       ((floor ceiling truncate round)
-        (dsssl-check-args args 1)
-        (funcall func (dsssl-eval (car args))))
-       (number->string
-        (dsssl-min-args args 1)
-        (if (= (length args) 1)
-            (number-to-string (dsssl-eval (car args)))
-          (if (= (length args) 2)      ; They gave us a radix
-              (error "Radix arg not supported yet.")
-            (dsssl-check-args args 1))))
-       (string->number
-        (dsssl-min-args args 1)
-        (if (= (length args) 1)
-            (string-to-number (dsssl-eval (car args)))
-          (if (= (length args) 2)      ; They gave us a radix
-              (error "Radix arg not supported yet.")
-            (dsssl-check-args args 1))))
-       (char\?
-        (dsssl-check-args args 1)
-        (characterp (dsssl-eval (car args))))
-       (char=\?
-        (dsssl-check-args args 2)
-        (char-equal (dsssl-eval (car args)) (dsssl-eval (cadr args))))
-       (char-downcase
-        (dsssl-check-args args 1)
-        (downcase (dsssl-eval (car args))))
-       (char-property                  ; FIXME
-        (error "`%s' not implemented yet!" func))
-       (string\?
-        (dsssl-check-args args 1)
-        (stringp (dsssl-eval (car args))))
-       (string
-        (dsssl-min-args args 1)
-        (mapconcat 'char-to-string (mapcar 'dsssl-eval args) ""))
-       (string-length
-        (dsssl-check-args args 1)
-        (length (dsssl-eval (car args))))
-       (string-ref
-        (dsssl-check-args args 2)
-        (aref (dsssl-eval (car args)) (dsssl-eval (cadr args))))
-       (string=\?
-        (dsssl-check-args args 2)
-        (string= (dsssl-eval (car args)) (dsssl-eval (cadr args))))
-       (substring
-        (substring (dsssl-eval (pop args))
-                   (dsssl-eval (pop args))
-                   (dsssl-eval (pop args))))
-       (string-append
-        (let ((rval ""))
-          (while args
-            (setq rval (concat rval (dsssl-eval (pop args)))))
-          rval))
-       (procedure\?
-        (dsssl-check-args args 1)
-        (let* ((sym (dsssl-eval (car args)))
-               (def (cl-gethash sym defines)))
-          (or (memq sym dsssl-builtin-functions)
-              (and def (listp def) (eq (car def) 'lambda)))))
-       (apply                          ; FIXME
-        )
-       (external-procedure             ; FIXME
-        )
-       (make
-        (let* ((type (dsssl-eval (pop args)))
-               (symname nil)
-               (props nil)
-               (tail nil)
-               (children nil)
-               (temp nil)
-               )
-          ;; Massage :children into the last slot
-          (setq props (mapcar 'dsssl-eval args)
-                tail (last props)
-                children (car tail))
-          (if (consp tail) 
-              (setcar tail nil))
-          (if (not (car props))
-              (setq props nil))
-          (setq temp (- (length props) 1))
-          ;; Not sure if we should really bother with this or not, but
-          ;; it does at least make it look more common-lispy keywordish
-          ;; and such.  DSSSL keywords look like font-weight:, this makes
-          ;; it :font-weight
-          (while (>= temp 0)
-            (setq symname (symbol-name (nth temp props)))
-            (if (string-match "^\\(.*\\):$" symname)
-                (setf (nth temp props) 
-                      (intern (concat ":" (match-string 1 symname)))))
-            (setq temp (- temp 2)))
-
-          ;; Create the actual flow object
-          (make-flow-object :type type
-                            :children children
-                            :properties props)
-          )
-        )
-       (time
-        (mapconcat 'int-to-string (current-time) ":"))
-       (time->string
-        (dsssl-check-args args 1)
-        (current-time-string
-         (mapcar 'string-to-int
-                 (split-string (dsssl-eval (car args)) ":"))))
-       (quote
-        (dsssl-check-args args 1)
-        (car args))
-       (identity
-        (dsssl-check-args args 1)
-        (dsssl-eval (car args)))
-       (error
-        (apply 'error (mapcar 'dsssl-eval args)))
-       (otherwise
-        ;; A non-built-in function - look it up
-        (let ((def (cl-gethash func defines)))
-          (if (and def (listp def) (eq (car def) 'lambda))
-              (dsssl-call-function def args)
-            (error "Symbol's function definition is void: %s" func))))
-       )
-      )
-    )
-   ((symbolp form)                     ; A variable
-    ;; A DSSSL keyword!
-    (if (string-match ":$" (symbol-name form))
-       form
-      (let ((val (cl-gethash form defines 'ThIS-Is_A_BOgUs-VariuhhBBLE)))
-       (if (not (eq val 'ThIS-Is_A_BOgUs-VariuhhBBLE))
-           val
-         ;; Ok, we got a bogus variable, but maybe it is really a UNIT
-         ;; dereference.  Check.
-         (let ((name (symbol-name form))
-               (the-units nil)
-               (number nil)
-               (conversion nil))
-           (if (not (string-match "^\\([0-9.]+\\)\\([a-zA-Z]+\\)$" name))
-               (error "Symbol's value as variable is void: %s" form)
-             (setq number (string-to-int (match-string 1 name))
-                   the-units  (intern (downcase (match-string 2 name)))
-                   conversion (cl-gethash the-units units))
-             (if (or (not conversion) (not (numberp conversion)))
-                 (error "Symbol's value as variable is void: %s" form)
-               (* number conversion))))))))
-   (t
-    form)
-   )
-  )
-
-(defsubst dsssl-predeclared ()
-  (declare (special defines units))
-  (cl-puthash '\#f nil defines)
-  (cl-puthash 'nil nil defines)
-  (cl-puthash '\#t t defines)
-  ;; NOTE: All units are stored internally as points.
-  (cl-puthash 'in (float 72) units)
-  (cl-puthash 'mm (float (* 72 25.4)) units)
-  (cl-puthash 'cm (float (* 72 2.54)) units)
-  )
-
-(defun dsssl-parse (buf)
-  ;; Return the full representation of the DSSSL stylesheet as a series
-  ;; of LISP objects.
-  (let ((defines (make-hash-table :size 13))
-       (units   (make-hash-table :size 13))
-       (buf-contents nil))
-    (dsssl-predeclared)
-    (save-excursion
-      (setq buf-contents (if (or (bufferp buf) (get-buffer buf))
-                            (progn
-                              (set-buffer buf)
-                              (buffer-string))
-                          buf))
-      (set-buffer (generate-new-buffer " *dsssl-style*"))
-      (insert buf-contents)
-      (goto-char (point-min))
-      (skip-chars-forward " \t\n\r")
-      (if (looking-at "<!")            ; DOCTYPE present
-         (progn
-           ;; This should _DEFINITELY_ be smarter
-           (search-forward ">" nil t)
-           ))
-      (let ((result nil)
-           (temp nil)
-           (save-pos nil))
-       (while (not (eobp))
-         (condition-case ()
-             (setq save-pos (point)
-                   temp (read (current-buffer)))
-           (invalid-read-syntax
-            ;; This disgusting hack is in here so that we can basically
-            ;; extend the lisp reader to gracefully deal with converting
-            ;; DSSSL #\A to Emacs-Lisp ?A notation.  If you know of a
-            ;; better way, please feel free to send me some email.
-            (setq temp nil)
-            (backward-char 1)
-            (if (looking-at "#\\\\")
-                (replace-match "?")
-              (insert "\\"))
-            (goto-char save-pos))
-           (error nil))
-         (cond
-          ((null temp)
-           nil)
-          ((listp temp)
-           (case (car temp)
-                 (define-unit
-                   (cl-puthash (cadr temp) (dsssl-eval (caddr temp))
-                               units))
-                 (define
-                   (if (listp (cadr temp))
-                       ;; A function
-                       (cl-puthash (caadr temp)
-                                    (list 'lambda
-                                          (cdadr temp)
-                                          (cddr temp)) defines)
-                     ;; A normal define
-                     (cl-puthash (cadr temp)
-                                  (dsssl-eval (caddr temp)) defines)))
-                 (otherwise
-                  (setq result (cons temp result)))))
-          (t
-           (setq result (cons temp result))))
-         (skip-chars-forward " \t\n\r"))
-       (kill-buffer (current-buffer))
-       (list defines units (nreverse result))))))
-
-(defun dsssl-test (x)
-  (let* ((result (dsssl-parse x))
-        (defines (nth 0 result))
-        (units   (nth 1 result))
-        (forms   (nth 2 result)))
-    (mapcar 'dsssl-eval forms)))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; The flow object classes.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defmacro flow-object-property (obj prop &optional default)
-  "Return property PROP of the DSSSL flow object OBJ.
-OBJ can be any flow object class, as long as it was properly derived
-from the base `flow-object' class."
-  (` (plist-get (flow-object-properties (, obj)) (, prop) (, default))))
-
-;; Now for specific types of flow objects
-;; Still to do:
-;;; display-group
-;;; paragraph
-;;; sequence
-;;; line-field
-;;; paragraph-break
-;;; simple-page-sequence
-;;; score
-;;; table
-;;; table-row
-;;; table-cell
-;;; rule
-;;; external-graphic
-
-
-(provide 'dsssl)
diff --git a/lisp/font.el b/lisp/font.el
index 14e5b62..568383e 100644
--- a/lisp/font.el
+++ b/lisp/font.el
@@ -1,7 +1,7 @@
 ;;; font.el --- New font model
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/04/29 15:46:58 $
-;; Version: $Revision: 1.3 $
+;; Created: $Date: 1999/12/05 08:35:46 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: faces
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -987,8 +987,9 @@ for use in the 'weight' field of an mswindows font string.")
                        :underline (font-underline-p font)
                        :weight (or (cdr-safe (assoc (font-weight font)
                                                     
font-new-redisplay-weight-mappings))
-                                   'normal)
-                       :family (font-find-available-family font))
+                                   'normal))
+    (if (font-find-available-family font)
+       (set-face-attribute :family (font-find-available-family font)))
     (if (font-size font)
        (set-face-attribute face nil
                            :height (* 10 (font-spatial-to-canonical (font-size 
font))))))
@@ -1043,17 +1044,13 @@ for use in the 'weight' field of an mswindows font 
string.")
 (cond
  ((fboundp 'display-warning)
   (fset 'font-warn 'display-warning))
- ((fboundp 'w3-warn)
-  (fset 'font-warn 'w3-warn))
- ((fboundp 'url-warn)
-  (fset 'font-warn 'url-warn))
  ((fboundp 'warn)
   (defun font-warn (class message &optional level)
     (warn "(%s/%s) %s" class (or level 'warning) message)))
  (t
   (defun font-warn (class message &optional level)
     (save-excursion
-      (set-buffer (get-buffer-create "*W3-WARNINGS*"))
+      (set-buffer (get-buffer-create "*FONT-WARNINGS*"))
       (goto-char (point-max))
       (save-excursion
        (insert (format "(%s/%s) %s\n" class (or level 'warning) message)))
diff --git a/lisp/mm.el b/lisp/mm.el
deleted file mode 100644
index b4307c9..0000000
--- a/lisp/mm.el
+++ /dev/null
@@ -1,1311 +0,0 @@
-;;; mm.el,v --- Mailcap parsing routines, and MIME handling
-;; Author: wmperry
-;; Created: 1996/05/28 02:46:51
-;; Version: 1.96
-;; Keywords: mail, news, hypermedia
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1994, 1995, 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Generalized mailcap parsing and access routines
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;
-;;; Data structures
-;;; ---------------
-;;; The mailcap structure is an assoc list of assoc lists.
-;;; 1st assoc list is keyed on the major content-type
-;;; 2nd assoc list is keyed on the minor content-type (which can be a regexp)
-;;;
-;;; Which looks like:
-;;; -----------------
-;;; (
-;;;  ("application"
-;;;   ("postscript" . <info>)
-;;;  )
-;;;  ("text"
-;;;   ("plain" . <info>)
-;;;  )
-;;; )
-;;;
-;;; Where <info> is another assoc list of the various information
-;;; related to the mailcap RFC.  This is keyed on the lowercase
-;;; attribute name (viewer, test, etc).  This looks like:
-;;; (("viewer" . viewerinfo)
-;;;  ("test"   . testinfo)
-;;;  ("xxxx"   . "string")
-;;; )
-;;;
-;;; Where viewerinfo specifies how the content-type is viewed.  Can be
-;;; a string, in which case it is run through a shell, with
-;;; appropriate parameters, or a symbol, in which case the symbol is
-;;; funcall'd, with the buffer as an argument.
-;;;
-;;; testinfo is a list of strings, or nil.  If nil, it means the
-;;; viewer specified is always valid.  If it is a list of strings,
-;;; these are used to determine whether a viewer passes the 'test' or
-;;; not.
-;;;
-;;; The main interface to this code is:
-;;;
-;;; To set everything up:
-;;;
-;;;  (mm-parse-mailcaps [path])
-;;;
-;;;  Where PATH is a unix-style path specification (: separated list
-;;;  of strings).  If PATH is nil, the environment variable MAILCAPS
-;;;  will be consulted.  If there is no environment variable, then a
-;;;  default list of paths is used.
-;;;
-;;; To retrieve the information:
-;;;  (mm-mime-info st [nd] [request])
-;;;
-;;;  Where st and nd are positions in a buffer that contain the
-;;;  content-type header information of a mail/news/whatever message.
-;;;  st can optionally be a string that contains the content-type
-;;;  information.
-;;;
-;;;  Third argument REQUEST specifies what information to return.  If
-;;;  it is nil or the empty string, the viewer (second field of the
-;;;  mailcap entry) will be returned.  If it is a string, then the
-;;;  mailcap field corresponding to that string will be returned
-;;;  (print, description, whatever).  If a number, then all the
-;;;  information for this specific viewer is returned.
-;;;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Variables, etc
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(eval-and-compile
-  (require 'cl)
-  (require 'devices))
-
-(defconst mm-version (let ((x "1.96"))
-                      (if (string-match "Revision: \\([^ \t\n]+\\)" x)
-                          (substring x (match-beginning 1) (match-end 1))
-                        x))
-  "Version # of MM package")
-
-(defvar mm-parse-args-syntax-table
-  (copy-syntax-table emacs-lisp-mode-syntax-table)
-  "A syntax table for parsing sgml attributes.")
-
-(modify-syntax-entry ?' "\"" mm-parse-args-syntax-table)
-(modify-syntax-entry ?` "\"" mm-parse-args-syntax-table)
-(modify-syntax-entry ?{ "(" mm-parse-args-syntax-table)
-(modify-syntax-entry ?} ")" mm-parse-args-syntax-table)
-
-(defvar mm-mime-data-default
-  '(
-    ("multipart"   . (
-                     ("alternative". (("viewer" . mm-multipart-viewer)
-                                      ("type"   . "multipart/alternative")))
-                     ("mixed"      . (("viewer" . mm-multipart-viewer)
-                                      ("type"   . "multipart/mixed")))
-                     (".*"         . (("viewer" . mm-save-binary-file)
-                                      ("type"   . "multipart/*")))
-                     )
-     )
-    ("application" . (
-                     ("x-x509-ca-cert" . (("viewer" . ssl-view-site-cert)
-                                          ("test" . (fboundp 
'ssl-view-site-cert))
-                                          ("type" . 
"application/x-x509-ca-cert")))
-                     ("x-x509-user-cert" . (("viewer" . ssl-view-user-cert)
-                                            ("test" . (fboundp 
'ssl-view-user-cert))
-                                            ("type" . 
"application/x-x509-user-cert")))
-                     ("octet-stream" . (("viewer" . mm-save-binary-file)
-                                        ("type" ."application/octet-stream")))
-                     ("dvi"        . (("viewer" . "open %s")
-                                      ("type"   . "application/dvi")
-                                      ("test"   . (eq (device-type) 'ns))))
-                     ("dvi"        . (("viewer" . "xdvi %s")
-                                      ("test"   . (eq (device-type) 'x))
-                                      ("needsx11")
-                                      ("type"   . "application/dvi")))
-                     ("dvi"        . (("viewer" . "dvitty %s")
-                                      ("test"   . (not (getenv "DISPLAY")))
-                                      ("type"   . "application/dvi")))
-                     ("emacs-lisp" . (("viewer" . mm-maybe-eval)
-                                      ("type"   . "application/emacs-lisp")))
-;                    ("x-tar"      . (("viewer" . tar-mode)
-;                                     ("test"   . (fboundp 'tar-mode))
-;                                     ("type"   . "application/x-tar")))
-                     ("x-tar"      . (("viewer" . mm-save-binary-file)
-                                      ("type"   . "application/x-tar")))
-                     ("x-latex"    . (("viewer" . tex-mode)
-                                      ("test"   . (fboundp 'tex-mode))
-                                      ("type"   . "application/x-latex")))
-                     ("x-tex"      . (("viewer" . tex-mode)
-                                      ("test"   . (fboundp 'tex-mode))
-                                      ("type"   . "application/x-tex")))
-                     ("latex"      . (("viewer" . tex-mode)
-                                      ("test"   . (fboundp 'tex-mode))
-                                      ("type"   . "application/latex")))
-                     ("tex"        . (("viewer" . tex-mode)
-                                      ("test"   . (fboundp 'tex-mode))
-                                      ("type"   . "application/tex")))
-                     ("texinfo"    . (("viewer" . texinfo-mode)
-                                      ("test"   . (fboundp 'texinfo-mode))
-                                      ("type"   . "application/tex")))
-                     ("zip"        . (("viewer" . mm-save-binary-file)
-                                      ("type"   . "application/zip")
-                                      ("copiousoutput")))
-                     ("pdf"        . (("viewer" . "acroread %s")
-                                      ("type"   . "application/pdf")))
-                     ("postscript" . (("viewer" . "open %s")
-                                      ("type"   . "application/postscript")
-                                      ("test"   . (eq (device-type) 'ns))))
-                     ("postscript" . (("viewer" . "ghostview %s")
-                                      ("type" . "application/postscript")
-                                      ("test"   . (eq (device-type) 'x))
-                                      ("needsx11")))
-                     ("postscript" . (("viewer" . "ps2ascii %s")
-                                      ("type" . "application/postscript")
-                                      ("test" . (not (getenv "DISPLAY")))
-                                      ("copiousoutput")))
-                     ))
-    ("audio"       . (
-                     ("x-mpeg" . (("viewer" . "maplay %s")
-                                  ("type"   . "audio/x-mpeg")))
-                     (".*" . (("viewer" . mm-play-sound-file)
-                              ("test"   . (or (featurep 'nas-sound)
-                                              (featurep 'native-sound)))
-                              ("type"   . "audio/*")))
-                     (".*" . (("viewer" . "showaudio")
-                              ("type"   . "audio/*")))
-                     ))
-    ("message"     . (
-                     ("rfc-*822" . (("viewer" . vm-mode)
-                                    ("test"   . (fboundp 'vm-mode))
-                                    ("type"   . "message/rfc-822")))
-                     ("rfc-*822" . (("viewer" . w3-mode)
-                                    ("test"   . (fboundp 'w3-mode))
-                                    ("type"   . "message/rfc-822")))
-                     ("rfc-*822" . (("viewer" . view-mode)
-                                    ("test"   . (fboundp 'view-mode))
-                                    ("type"   . "message/rfc-822")))
-                     ("rfc-*822" . (("viewer" . fundamental-mode)
-                                    ("type"   . "message/rfc-822")))
-                     ))
-    ("image"       . (
-                     ("x-xwd" . (("viewer"  . "xwud -in %s")
-                                 ("type"    . "image/x-xwd")
-                                 ("compose" . "xwd -frame > %s")
-                                 ("test"    . (eq (device-type) 'x))
-                                 ("needsx11")))
-                     ("x11-dump" . (("viewer" . "xwud -in %s")
-                                    ("type" . "image/x-xwd")
-                                    ("compose" . "xwd -frame > %s")
-                                    ("test"   . (eq (device-type) 'x))
-                                    ("needsx11")))
-                     ("windowdump" . (("viewer" . "xwud -in %s")
-                                      ("type" . "image/x-xwd")
-                                      ("compose" . "xwd -frame > %s")
-                                      ("test"   . (eq (device-type) 'x))
-                                      ("needsx11")))
-                     (".*" . (("viewer" . "open %s")
-                              ("type"   . "image/*")
-                              ("test"   . (eq (device-type) 'ns))))
-                     (".*" . (("viewer" . "xv -perfect %s")
-                              ("type" . "image/*")
-                              ("test"   . (eq (device-type) 'x))
-                              ("needsx11")))
-                     ))
-    ("text"        . (
-                     ("plain" . (("viewer"  . w3-mode)
-                                 ("test"    . (fboundp 'w3-mode))
-                                 ("type"    . "text/plain")))
-                     ("plain" . (("viewer"  . view-mode)
-                                 ("test"    . (fboundp 'view-mode))
-                                 ("type"    . "text/plain")))
-                     ("plain" . (("viewer"  . fundamental-mode)
-                                 ("type"    . "text/plain")))
-                     ("enriched" . (("viewer" . enriched-decode-region)
-                                    ("test"   . (fboundp
-                                                 'enriched-decode-region))
-                                    ("type"   . "text/enriched")))
-                     ("html"  . (("viewer" . w3-prepare-buffer)
-                                 ("test"   . (fboundp 'w3-prepare-buffer))
-                                 ("type"   . "text/html")))
-                     ))
-    ("video"       . (
-                     ("mpeg" . (("viewer" . "mpeg_play %s")
-                                ("type"   . "video/mpeg")
-                                ("test"   . (eq (device-type) 'x))
-                                ("needsx11")))
-                     ))
-    ("x-world"     . (
-                     ("x-vrml" . (("viewer"  . "webspace -remote %s -URL %u")
-                                  ("type"    . "x-world/x-vrml")
-                                  ("description"
-                                   "VRML document")))))
-    ("archive"     . (
-                     ("tar"  . (("viewer" . tar-mode)
-                                ("type" . "archive/tar")
-                                ("test" . (fboundp 'tar-mode))))
-                     ))
-    )
-  "*The mailcap structure is an assoc list of assoc lists.
-1st assoc list is keyed on the major content-type
-2nd assoc list is keyed on the minor content-type (which can be a regexp)
-
-Which looks like:
------------------
-(
- (\"application\"
-  (\"postscript\" . <info>)
- )
- (\"text\"
-  (\"plain\" . <info>)
- )
-)
-
-Where <info> is another assoc list of the various information
-related to the mailcap RFC.  This is keyed on the lowercase
-attribute name (viewer, test, etc).  This looks like:
-((\"viewer\" . viewerinfo)
- (\"test\"   . testinfo)
- (\"xxxx\"   . \"string\")
-)
-
-Where viewerinfo specifies how the content-type is viewed.  Can be
-a string, in which case it is run through a shell, with
-appropriate parameters, or a symbol, in which case the symbol is
-funcall'd, with the buffer as an argument.
-
-testinfo is a list of strings, or nil.  If nil, it means the
-viewer specified is always valid.  If it is a list of strings,
-these are used to determine whether a viewer passes the 'test' or
-not.")
-
-(defvar mm-mime-data ()
-  "Parsed mailcap entries.
-It has the same format as `mm-mime-data-default'.")
-
-(defvar mm-content-transfer-encodings
-  '(("base64"     . base64-decode-region)
-    ("7bit"       . ignore)
-    ("8bit"       . ignore)
-    ("binary"     . ignore)
-    ("x-compress" . ("uncompress" "-c"))
-    ("x-gzip"     . ("gzip" "-dc"))
-    ("compress"   . ("uncompress" "-c"))
-    ("gzip"       . ("gzip" "-dc"))
-    ("x-hqx"      . ("mcvert" "-P" "-s" "-S"))
-    ("quoted-printable" . mm-decode-quoted-printable)
-    )
-  "*An assoc list of content-transfer-encodings and how to decode them.")
-
-(defvar mm-download-directory nil
-  "*Where downloaded files should go by default.")
-
-(defvar mm-temporary-directory (or (getenv "TMPDIR") "/tmp")
-  "*Where temporary files go.")
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; A few things from w3 and url, just in case this is used without them
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defun mm-generate-unique-filename (&optional fmt)
-  "Generate a unique filename in mm-temporary-directory"
-  (if (not fmt)
-      (let ((base (format "mm-tmp.%d" (user-real-uid)))
-           (fname "")
-           (x 0))
-       (setq fname (format "%s%d" base x))
-       (while (file-exists-p
-               (expand-file-name fname mm-temporary-directory))
-         (setq x (1+ x)
-               fname (concat base (int-to-string x))))
-       (expand-file-name fname mm-temporary-directory))
-    (let ((base (concat "mm" (int-to-string (user-real-uid))))
-         (fname "")
-         (x 0))
-      (setq fname (format fmt (concat base (int-to-string x))))
-      (while (file-exists-p
-             (expand-file-name fname mm-temporary-directory))
-       (setq x (1+ x)
-             fname (format fmt (concat base (int-to-string x)))))
-      (expand-file-name fname mm-temporary-directory))))
-
-(if (and (fboundp 'copy-tree)
-        (subrp (symbol-function 'copy-tree)))
-    (fset 'mm-copy-tree 'copy-tree)
-  (defun mm-copy-tree (tree)
-    (if (consp tree)
-       (cons (mm-copy-tree (car tree))
-             (mm-copy-tree (cdr tree)))
-      (if (vectorp tree)
-         (let* ((new (copy-sequence tree))
-                (i (1- (length new))))
-           (while (>= i 0)
-             (aset new i (mm-copy-tree (aref new i)))
-             (setq i (1- i)))
-           new)
-       tree))))
-
-(require 'mule-sysdp)
-
-(if (not (fboundp 'w3-save-binary-file))
-    (defun mm-save-binary-file ()
-      ;; Ok, this is truly fucked.  In XEmacs, if you use the mouse to select
-      ;; a URL that gets saved via this function, read-file-name will pop up a
-      ;; dialog box for file selection.  For some reason which buffer we are in
-      ;; gets royally screwed (even with save-excursions and the whole nine
-      ;; yards).  SO, we just keep the old buffer name around and away we go.
-      (let ((old-buff (current-buffer))
-           (file (read-file-name "Filename to save as: "
-                                 (or mm-download-directory "~/")
-                                 (file-name-nondirectory (url-view-url t))
-                                 nil
-                                 (file-name-nondirectory (url-view-url t))))
-           (require-final-newline nil))
-       (set-buffer old-buff)
-       (mule-write-region-no-coding-system (point-min) (point-max) file)
-       (kill-buffer (current-buffer))))
-  (fset 'mm-save-binary-file 'w3-save-binary-file))
-
-(defun mm-maybe-eval ()
-  "Maybe evaluate a buffer of emacs lisp code"
-  (if (yes-or-no-p "This is emacs-lisp code, evaluate it? ")
-      (eval-buffer (current-buffer))
-    (emacs-lisp-mode)))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; The mailcap parser
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun mm-viewer-unescape (format &optional filename url)
-  (save-excursion
-    (set-buffer (get-buffer-create " *mm-parse*"))
-    (erase-buffer)
-    (insert format)
-    (goto-char (point-min))
-    (while (re-search-forward "%\\(.\\)" nil t)
-       (let ((escape (aref (match-string 1) 0)))
-        (replace-match "" t t)
-        (case escape
-          (?% (insert "%"))
-          (?s (insert (or filename "\"\"")))
-          (?u (insert (or url "\"\""))))))
-    (buffer-string)))
-
-(defun mm-in-assoc (elt list)
-  ;; Check to see if ELT matches any of the regexps in the car elements of LIST
-  (let (rslt)
-    (while (and list (not rslt))
-      (and (car (car list))
-          (string-match (car (car list)) elt)
-          (setq rslt (car list)))
-      (setq list (cdr list)))
-    rslt))
-
-(defun mm-replace-regexp (regexp to-string)
-  ;; Quiet replace-regexp.
-  (goto-char (point-min))
-  (while (re-search-forward regexp nil t)
-    (replace-match to-string t nil)))
-
-(defun mm-parse-mailcaps (&optional path)
-  ;; Parse out all the mailcaps specified in a unix-style path string PATH
-  (cond
-   (path nil)
-   ((getenv "MAILCAPS") (setq path (getenv "MAILCAPS")))
-   ((memq system-type '(ms-dos ms-windows windows-nt))
-    (setq path (mapconcat 'expand-file-name '("~/mail.cap" "~/etc/mail.cap")
-                         ";")))
-   (t (setq path (mapconcat 'expand-file-name
-                           '("~/.mailcap"
-                             "/etc/mailcap:/usr/etc/mailcap"
-                             "/usr/local/etc/mailcap") ":"))))
-  (let ((fnames (reverse
-                (mm-string-to-tokens path
-                                     (if (memq system-type
-                                               '(ms-dos ms-windows windows-nt))
-                                         ?;
-                                       ?:))))
-       fname)
-    (while fnames
-      (setq fname (car fnames))
-      (if (and fname
-              (file-exists-p fname)
-              (file-readable-p fname)
-              (file-regular-p fname))
-         (mm-parse-mailcap (car fnames)))
-      (setq fnames (cdr fnames)))))
-
-(defun mm-parse-mailcap (fname)
-  ;; Parse out the mailcap file specified by FNAME
-  (let (major                          ; The major mime type (image/audio/etc)
-       minor                           ; The minor mime type (gif, basic, etc)
-       save-pos                        ; Misc saved positions used in parsing
-       viewer                          ; How to view this mime type
-       info                            ; Misc info about this mime type
-       )
-    (save-excursion
-      (set-buffer (get-buffer-create " *mailcap*"))
-      (erase-buffer)
-      (insert-file-contents fname)
-      (set-syntax-table mm-parse-args-syntax-table)
-      (mm-replace-regexp "#.*" "")              ; Remove all comments
-      (mm-replace-regexp "\n+" "\n")         ; And blank lines
-      (mm-replace-regexp "\\\\[ \t\n]+" " ") ; And collapse spaces
-      (mm-replace-regexp "\\+" "\\\\+") ; and +s
-      (mm-replace-regexp (concat (regexp-quote "\\") "[ \t]*\n") "")
-      (goto-char (point-max))
-      (skip-chars-backward " \t\n")
-      (delete-region (point) (point-max))
-      (goto-char (point-min))
-      (while (not (eobp))
-       (skip-chars-forward " \t\n")
-       (setq save-pos (point)
-             info nil)
-       (skip-chars-forward "^/;")
-       (downcase-region save-pos (point))
-       (setq major (buffer-substring save-pos (point)))
-       (skip-chars-forward "/ \t\n")
-       (setq save-pos (point))
-       (skip-chars-forward "^;")
-       (downcase-region save-pos (point))
-       (setq minor
-             (cond
-              ((= ?* (or (char-after save-pos) 0)) ".*")
-              ((= (point) save-pos) ".*")
-              (t (buffer-substring save-pos (point)))))
-       (skip-chars-forward "; \t\n")
-       ;;; Got the major/minor chunks, now for the viewers/etc
-       ;;; The first item _must_ be a viewer, according to the
-       ;;; RFC for mailcap files (#1343)
-       (skip-chars-forward "; \t\n")
-       (setq save-pos (point))
-       (skip-chars-forward "^;\n")
-       (if (= (or (char-after save-pos) 0) ?')
-           (setq viewer (progn
-                          (narrow-to-region (1+ save-pos) (point))
-                          (goto-char (point-min))
-                          (prog1
-                              (read (current-buffer))
-                            (goto-char (point-max))
-                            (widen))))
-         (setq viewer (buffer-substring save-pos (point))))
-       (setq save-pos (point))
-       (end-of-line)
-       (setq info (nconc (list (cons "viewer" viewer)
-                               (cons "type" (concat major "/"
-                                                    (if (string= minor ".*")
-                                                        "*" minor))))
-                         (mm-parse-mailcap-extras save-pos (point))))
-       (mm-mailcap-entry-passes-test info)
-       (mm-add-mailcap-entry major minor info)))))
-
-(defun mm-parse-mailcap-extras (st nd)
-  ;; Grab all the extra stuff from a mailcap entry
-  (let (
-       name                            ; From name=
-       value                           ; its value
-       results                         ; Assoc list of results
-       name-pos                        ; Start of XXXX= position
-       val-pos                         ; Start of value position
-       done                            ; Found end of \'d ;s?
-       )
-    (save-restriction
-      (narrow-to-region st nd)
-      (goto-char (point-min))
-      (skip-chars-forward " \n\t;")
-      (while (not (eobp))
-       (setq done nil)
-       (skip-chars-forward " \";\n\t")
-       (setq name-pos (point))
-       (skip-chars-forward "^ \n\t=")
-       (downcase-region name-pos (point))
-       (setq name (buffer-substring name-pos (point)))
-       (skip-chars-forward " \t\n")
-       (if (/= (or (char-after (point)) 0)  ?=) ; There is no value
-           (setq value nil)
-         (skip-chars-forward " \t\n=")
-         (setq val-pos (point))
-         (if (memq (char-after val-pos) '(?\" ?'))
-             (progn
-               (setq val-pos (1+ val-pos))
-               (condition-case nil
-                   (progn
-                     (forward-sexp 1)
-                     (backward-char 1))
-                 (error (goto-char (point-max)))))
-           (while (not done)
-             (skip-chars-forward "^;")
-             (if (= (or (char-after (1- (point))) 0) ?\\ )
-                 (progn
-                   (subst-char-in-region (1- (point)) (point) ?\\ ? )
-                   (skip-chars-forward ";"))
-               (setq done t))))
-         (setq value (buffer-substring val-pos (point))))
-       (setq results (cons (cons name value) results)))
-      results)))  
-
-(defun mm-string-to-tokens (str &optional delim)
-  "Return a list of words from the string STR"
-  (setq delim (or delim ? ))
-  (let (results y)
-    (mapcar
-     (function
-      (lambda (x)
-       (cond
-        ((and (= x delim) y) (setq results (cons y results) y nil))
-        ((/= x delim) (setq y (concat y (char-to-string x))))
-        (t nil)))) str)
-    (nreverse (cons y results))))
-
-(defun mm-mailcap-entry-passes-test (info)
-  ;; Return t iff a mailcap entry passes its test clause or no test
-  ;; clause is present.
-  (let (status                         ; Call-process-regions return value
-       (test (assoc "test" info)); The test clause
-       )
-    (setq status (and test (mm-string-to-tokens (cdr test))))
-    (if (and (assoc "needsx11" info) (not (getenv "DISPLAY")))
-       (setq status nil)
-      (cond
-       ((and (equal (nth 0 status) "test")
-            (equal (nth 1 status) "-n")
-            (or (equal (nth 2 status) "$DISPLAY")
-                (equal (nth 2 status) "\"$DISPLAY\"")))
-       (setq status (if (getenv "DISPLAY") t nil)))
-       ((and (equal (nth 0 status) "test")
-            (equal (nth 1 status) "-z")
-            (or (equal (nth 2 status) "$DISPLAY")
-                (equal (nth 2 status) "\"$DISPLAY\"")))
-       (setq status (if (getenv "DISPLAY") nil t)))
-       (test nil)
-       (t nil)))
-    (and test (listp test) (setcdr test status))))
-
-(defun mm-parse-args (st &optional nd nodowncase)
-  ;; Return an assoc list of attribute/value pairs from an RFC822-type string
-  (let (
-       name                            ; From name=
-       value                           ; its value
-       results                         ; Assoc list of results
-       name-pos                        ; Start of XXXX= position
-       val-pos                         ; Start of value position
-       )
-    (save-excursion
-      (if (stringp st)
-         (progn
-           (set-buffer (get-buffer-create " *mm-temp*"))
-           (set-syntax-table mm-parse-args-syntax-table)
-           (erase-buffer)
-           (insert st)
-           (setq st (point-min)
-                 nd (point-max)))
-       (set-syntax-table mm-parse-args-syntax-table))
-      (save-restriction
-       (narrow-to-region st nd)
-       (goto-char (point-min))
-       (while (not (eobp))
-         (skip-chars-forward "; \n\t")
-         (setq name-pos (point))
-         (skip-chars-forward "^ \n\t=;")
-         (if (not nodowncase)
-             (downcase-region name-pos (point)))
-         (setq name (buffer-substring name-pos (point)))
-         (skip-chars-forward " \t\n")
-         (if (/= (or (char-after (point)) 0)  ?=) ; There is no value
-             (setq value nil)
-           (skip-chars-forward " \t\n=")
-           (setq val-pos (point)
-                 value
-                 (cond
-                  ((or (= (or (char-after val-pos) 0) ?\")
-                       (= (or (char-after val-pos) 0) ?'))
-                   (buffer-substring (1+ val-pos)
-                                     (condition-case ()
-                                         (prog2
-                                             (forward-sexp 1)
-                                             (1- (point))
-                                           (skip-chars-forward "\""))
-                                       (error
-                                        (skip-chars-forward "^ \t\n")
-                                        (point)))))
-                  (t
-                   (buffer-substring val-pos
-                                     (progn
-                                       (skip-chars-forward "^;")
-                                       (skip-chars-backward " \t")
-                                       (point)))))))
-         (setq results (cons (cons name value) results))
-         (skip-chars-forward "; \n\t"))
-       results))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; The action routines.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun mm-possible-viewers (major minor)
-  ;; Return a list of possible viewers from MAJOR for minor type MINOR
-  (let ((exact '())
-       (wildcard '()))
-    (while major
-      (cond
-       ((equal (car (car major)) minor)
-       (setq exact (cons (cdr (car major)) exact)))
-       ((string-match (car (car major)) minor)
-       (setq wildcard (cons (cdr (car major)) wildcard))))
-      (setq major (cdr major)))
-    (nconc exact wildcard)))
-
-(defun mm-unescape-mime-test (test type-info)
-  (let ((buff (get-buffer-create " *unescape*"))
-       save-pos save-chr subst)
-    (cond
-     ((symbolp test) test)
-     ((and (listp test) (symbolp (car test))) test)
-     ((or (stringp test)
-         (and (listp test) (stringp (car test))
-              (setq test (mapconcat 'identity test " "))))
-      (save-excursion
-       (set-buffer buff)
-       (erase-buffer)
-       (insert test)
-       (goto-char (point-min))
-       (while (not (eobp))
-         (skip-chars-forward "^%")
-         (if (/= (- (point)
-                    (progn (skip-chars-backward "\\\\")
-                           (point)))
-                 0) ; It is an escaped %
-             (progn
-               (delete-char 1)
-               (skip-chars-forward "%."))
-           (setq save-pos (point))
-           (skip-chars-forward "%")
-           (setq save-chr (char-after (point)))
-           (cond
-            ((null save-chr) nil)
-            ((= save-chr ?t)
-             (delete-region save-pos (progn (forward-char 1) (point)))
-             (insert (or (cdr (assoc "type" type-info)) "\"\"")))
-            ((= save-chr ?M)
-             (delete-region save-pos (progn (forward-char 1) (point)))
-             (insert "\"\""))
-            ((= save-chr ?n)
-             (delete-region save-pos (progn (forward-char 1) (point)))
-             (insert "\"\""))
-            ((= save-chr ?F)
-             (delete-region save-pos (progn (forward-char 1) (point)))
-             (insert "\"\""))
-            ((= save-chr ?{)
-             (forward-char 1)
-             (skip-chars-forward "^}")
-             (downcase-region (+ 2 save-pos) (point))
-             (setq subst (buffer-substring (+ 2 save-pos) (point)))
-             (delete-region save-pos (1+ (point)))
-             (insert (or (cdr (assoc subst type-info)) "\"\"")))
-            (t nil))))
-       (buffer-string)))
-     (t (error "Bad value to mm-unescape-mime-test. %s" test)))))
-
-(defun mm-viewer-passes-test (viewer-info type-info)
-  ;; Return non-nil iff the viewer specified by VIEWER-INFO passes its
-  ;; test clause (if any).
-  (let* ((test-info   (assoc "test"   viewer-info))
-        (test (cdr test-info))
-        (viewer (cdr (assoc "viewer" viewer-info)))
-        (default-directory (expand-file-name "~/"))
-        status
-        parsed-test
-       )
-    (cond
-     ((not test-info) t)               ; No test clause
-     ((not test) nil)                  ; Already failed test
-     ((eq test t) t)                   ; Already passed test
-     ((and (symbolp test)              ; Lisp function as test
-          (fboundp test))
-      (funcall test type-info))
-     ((and (symbolp test)              ; Lisp variable as test
-          (boundp test))
-      (symbol-value test))
-     ((and (listp test)                        ; List to be eval'd
-          (symbolp (car test)))
-      (eval test))
-     (t
-      (setq test (mm-unescape-mime-test test type-info)
-           test (list shell-file-name nil nil nil shell-command-switch test)
-           status (apply 'call-process test))
-      (= 0 status)))))
-
-(defun mm-add-mailcap-entry (major minor info)
-  (let ((old-major (assoc major mm-mime-data)))
-    (if (null old-major)               ; New major area
-       (setq mm-mime-data
-             (cons (cons major (list (cons minor info)))
-                   mm-mime-data))
-      (let ((cur-minor (assoc minor old-major)))
-       (cond
-        ((or (null cur-minor)          ; New minor area, or
-             (assoc "test" info))      ; Has a test, insert at beginning
-         (setcdr old-major (cons (cons minor info) (cdr old-major))))
-        ((and (not (assoc "test" info)); No test info, replace completely
-              (not (assoc "test" cur-minor)))
-         (setcdr cur-minor info))
-        (t
-         (setcdr old-major (cons (cons minor info) (cdr old-major)))))))))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; The main whabbo
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun mm-viewer-lessp (x y)
-  ;; Return t iff viewer X is more desirable than viewer Y
-  (let ((x-wild (string-match "[*?]" (or (cdr-safe (assoc "type" x)) "")))
-       (y-wild (string-match "[*?]" (or (cdr-safe (assoc "type" y)) "")))
-       (x-lisp (not (stringp (or (cdr-safe (assoc "viewer" x)) ""))))
-       (y-lisp (not (stringp (or (cdr-safe (assoc "viewer" y)) "")))))
-    (cond
-     ((and x-lisp (not y-lisp))
-      t)
-     ((and (not y-lisp) x-wild (not y-wild))
-      t)
-     ((and (not x-wild) y-wild)
-      t)
-     (t nil))))
-
-(defun mm-mime-info (st &optional nd request)
-  "Get the mime viewer command for HEADERLINE, return nil if none found.
-Expects a complete content-type header line as its argument.  This can
-be simple like text/html, or complex like text/plain; charset=blah; foo=bar
-
-Third argument REQUEST specifies what information to return.  If it is
-nil or the empty string, the viewer (second field of the mailcap
-entry) will be returned.  If it is a string, then the mailcap field
-corresponding to that string will be returned (print, description,
-whatever).  If a number, then all the information for this specific
-viewer is returned."
-  (let (
-       major                           ; Major encoding (text, etc)
-       minor                           ; Minor encoding (html, etc)
-       info                            ; Other info
-       save-pos                        ; Misc. position during parse
-       major-info                      ; (assoc major mm-mime-data)
-       major-info-default              ; (assoc major mm-mime-data-default)
-       minor-info                      ; (assoc minor major-info)
-       test                            ; current test proc.
-       viewers                         ; Possible viewers
-       viewers-default                 ; Possible W3 default viewers
-       passed                          ; Viewers that passed the test
-       passed-default                  ; W3 viewers that passed the test
-       viewer                          ; The one and only viewer
-       )
-    (save-excursion
-      (cond
-       ((null st)
-       (set-buffer (get-buffer-create " *mimeparse*"))
-       (erase-buffer)
-       (insert "text/plain")
-       (setq st (point-min)))
-       ((stringp st)
-       (set-buffer (get-buffer-create " *mimeparse*"))
-       (erase-buffer)
-       (insert st)
-       (setq st (point-min)))
-       ((null nd)
-       (narrow-to-region st (progn (goto-char st) (end-of-line) (point))))
-       (t (narrow-to-region st nd)))
-      (goto-char st)
-      (skip-chars-forward ": \t\n")
-      (buffer-enable-undo)
-      (setq viewer
-           (catch 'mm-exit
-             (setq save-pos (point))
-             (skip-chars-forward "^/")
-             (downcase-region save-pos (point))
-             (setq major (buffer-substring save-pos (point)))
-             (setq major-info (cdr (assoc major mm-mime-data))
-                   major-info-default (cdr (assoc major
-                                                  mm-mime-data-default)))
-             (if (and (not major-info)
-                      (not major-info-default))
-                 (throw 'mm-exit nil))
-             (skip-chars-forward "/ \t\n")
-             (setq save-pos (point))
-             (skip-chars-forward "^ \t\n;")
-             (downcase-region save-pos (point))
-             (setq minor (buffer-substring save-pos (point)))
-             (setq viewers (mm-possible-viewers major-info minor)
-                   viewers-default (mm-possible-viewers
-                                    major-info-default minor))
-             (if (and (not viewers)
-                      (not viewers-default))
-                 (throw 'mm-exit nil))
-             (skip-chars-forward "; \t")
-             (if (eolp)
-                 nil                           ; No qualifiers
-               (setq save-pos (point))
-               (end-of-line)
-               (setq info (mm-parse-args save-pos (point)))
-               )
-             (while viewers
-               (if (mm-viewer-passes-test (car viewers) info)
-                   (setq passed (cons (car viewers) passed)))
-               (setq viewers (cdr viewers)))
-             (setq passed (sort (nreverse passed) 'mm-viewer-lessp))
-             (while viewers-default
-               (if (mm-viewer-passes-test (car viewers-default) info)
-                   (setq passed-default
-                         (cons (car viewers-default) passed-default)))
-               (setq viewers-default (cdr viewers-default)))
-             (setq passed-default (sort (nreverse passed-default)
-                                        'mm-viewer-lessp))
-             (if (or (not passed)
-                     (and passed-default
-                          (not (stringp
-                                (or (cdr-safe (assoc
-                                               "viewer" (car passed-default)))
-                                    "")))))
-                 (car passed-default)
-               (car passed))))
-      (if (and (stringp (cdr (assoc "viewer" viewer)))
-              passed)
-         (setq viewer (car passed)))
-      (widen)
-      (cond
-       ((and (null viewer) (not (equal major "default")))
-       (mm-mime-info "default" nil request))
-       ((or (null request) (equal request ""))
-       (mm-unescape-mime-test (cdr (assoc "viewer" viewer)) info))
-       ((stringp request)
-       (if (or (string= request "test") (string= request "viewer"))
-           (mm-unescape-mime-test (cdr-safe (assoc request viewer)) info)))
-       (t
-       ;; MUST make a copy *sigh*, else we modify mm-mime-data
-       (setq viewer (mm-copy-tree viewer))
-       (let ((view (assoc "viewer" viewer))
-             (test (assoc "test" viewer)))
-         (if view (setcdr view (mm-unescape-mime-test (cdr view) info)))
-         (if test (setcdr test (mm-unescape-mime-test (cdr test) info))))
-       viewer)))))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Experimental MIME-types parsing
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defvar mm-mime-extensions
-  '(
-    (""          . "text/plain")
-    (".abs"      . "audio/x-mpeg")
-    (".aif"      . "audio/aiff")
-    (".aifc"     . "audio/aiff")
-    (".aiff"     . "audio/aiff")
-    (".ano"      . "application/x-annotator")
-    (".au"       . "audio/ulaw")
-    (".avi"      . "video/x-msvideo")
-    (".bcpio"    . "application/x-bcpio")
-    (".bin"      . "application/octet-stream")
-    (".cdf"      . "application/x-netcdr")
-    (".cpio"     . "application/x-cpio")
-    (".csh"      . "application/x-csh")
-    (".dvi"      . "application/x-dvi")
-    (".el"       . "application/emacs-lisp")
-    (".eps"      . "application/postscript")
-    (".etx"      . "text/x-setext")
-    (".exe"      . "application/octet-stream")
-    (".fax"      . "image/x-fax")
-    (".gif"      . "image/gif")
-    (".hdf"      . "application/x-hdf")
-    (".hqx"      . "application/mac-binhex40")
-    (".htm"      . "text/html")
-    (".html"     . "text/html")
-    (".icon"     . "image/x-icon")
-    (".ief"      . "image/ief")
-    (".jpg"      . "image/jpeg")
-    (".macp"     . "image/x-macpaint")
-    (".man"      . "application/x-troff-man")
-    (".me"       . "application/x-troff-me")
-    (".mif"      . "application/mif")
-    (".mov"      . "video/quicktime")
-    (".movie"    . "video/x-sgi-movie")
-    (".mp2"      . "audio/x-mpeg")
-    (".mp2a"     . "audio/x-mpeg2")
-    (".mpa"      . "audio/x-mpeg")
-    (".mpa2"     . "audio/x-mpeg2")
-    (".mpe"      . "video/mpeg")
-    (".mpeg"     . "video/mpeg")
-    (".mpega"    . "audio/x-mpeg")
-    (".mpegv"    . "video/mpeg")
-    (".mpg"      . "video/mpeg")
-    (".mpv"      . "video/mpeg")
-    (".ms"       . "application/x-troff-ms")
-    (".nc"       . "application/x-netcdf")
-    (".nc"       . "application/x-netcdf")
-    (".oda"      . "application/oda")
-    (".pbm"      . "image/x-portable-bitmap")
-    (".pdf"      . "application/pdf")
-    (".pgm"      . "image/portable-graymap")
-    (".pict"     . "image/pict")
-    (".png"      . "image/png")
-    (".pnm"      . "image/x-portable-anymap")
-    (".ppm"      . "image/portable-pixmap")
-    (".ps"       . "application/postscript")
-    (".qt"       . "video/quicktime")
-    (".ras"      . "image/x-raster")
-    (".rgb"      . "image/x-rgb")
-    (".rtf"      . "application/rtf")
-    (".rtx"      . "text/richtext")
-    (".sh"       . "application/x-sh")
-    (".sit"      . "application/x-stuffit")
-    (".snd"      . "audio/basic")
-    (".src"      . "application/x-wais-source")
-    (".tar"      . "archive/tar")
-    (".tcl"      . "application/x-tcl")
-    (".tcl"      . "application/x-tcl")
-    (".tex"      . "application/x-tex")
-    (".texi"     . "application/texinfo")
-    (".tga"      . "image/x-targa")
-    (".tif"      . "image/tiff")
-    (".tiff"     . "image/tiff")
-    (".tr"       . "application/x-troff")
-    (".troff"    . "application/x-troff")
-    (".tsv"      . "text/tab-separated-values")
-    (".txt"      . "text/plain")
-    (".vbs"      . "video/mpeg")
-    (".vox"      . "audio/basic")
-    (".vrml"     . "x-world/x-vrml")
-    (".wav"      . "audio/x-wav")
-    (".wrl"      . "x-world/x-vrml")
-    (".xbm"      . "image/xbm")
-    (".xpm"      . "image/x-pixmap")
-    (".xwd"      . "image/windowdump")
-    (".zip"      . "application/zip")
-    (".ai"       . "application/postscript")
-    (".jpe"      . "image/jpeg")
-    (".jpeg"     . "image/jpeg")
-    )
-  "*An assoc list of file extensions and the MIME content-types they
-correspond to.")
-
-(defun mm-parse-mimetypes (&optional path)
-  ;; Parse out all the mimetypes specified in a unix-style path string PATH
-  (cond
-   (path nil)
-   ((getenv "MIMETYPES") (setq path (getenv "MIMETYPES")))
-   ((memq system-type '(ms-dos ms-windows windows-nt))
-    (setq path (mapconcat 'expand-file-name
-                         '("~/mime.typ" "~/etc/mime.typ") ";")))
-   (t (setq path (mapconcat 'expand-file-name
-                           '("~/.mime-types"
-                             "/etc/mime-types:/usr/etc/mime-types"
-                             "/usr/local/etc/mime-types"
-                             "/usr/local/www/conf/mime-types") ":"))))
-  (let ((fnames (reverse
-                (mm-string-to-tokens path
-                                     (if (memq system-type
-                                               '(ms-dos ms-windows windows-nt))
-                                         ?;
-                                       ?:))))
-       fname)
-    (while fnames
-      (setq fname (car fnames))
-      (if (and (file-exists-p fname) (file-readable-p fname))
-         (mm-parse-mimetype-file (car fnames)))
-      (setq fnames (cdr fnames)))))
-
-(defun mm-parse-mimetype-file (fname)
-  ;; Parse out a mime-types file
-  (let (type                           ; The MIME type for this line
-       extns                           ; The extensions for this line
-       save-pos                        ; Misc. saved buffer positions
-       )
-    (save-excursion
-      (set-buffer (get-buffer-create " *mime-types*"))
-      (erase-buffer)
-      (insert-file-contents fname)
-      (mm-replace-regexp "#.*" "")
-      (mm-replace-regexp "\n+" "\n")
-      (mm-replace-regexp "[ \t]+$" "")
-      (goto-char (point-max))
-      (skip-chars-backward " \t\n")
-      (delete-region (point) (point-max))
-      (goto-char (point-min))
-      (while (not (eobp))
-       (skip-chars-forward " \t\n")
-       (setq save-pos (point))
-       (skip-chars-forward "^ \t")
-       (downcase-region save-pos (point))
-       (setq type (buffer-substring save-pos (point)))
-       (while (not (eolp))
-         (skip-chars-forward " \t")
-         (setq save-pos (point))
-         (skip-chars-forward "^ \t\n")
-         (setq extns (cons (buffer-substring save-pos (point)) extns)))
-       (while extns
-         (setq mm-mime-extensions
-               (cons
-                (cons (if (= (string-to-char (car extns)) ?.)
-                          (car extns)
-                        (concat "." (car extns))) type) mm-mime-extensions)
-               extns (cdr extns)))))))
-
-(defun mm-extension-to-mime (extn)
-  "Return the MIME content type of the file extensions EXTN"
-  (if (and (stringp extn)
-          (not (eq (string-to-char extn) ?.)))
-      (setq extn (concat "." extn)))
-  (cdr (assoc (downcase extn) mm-mime-extensions)))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Editing/Composition of body parts
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun mm-compose-type (type)
-  ;; Compose a body section of MIME-type TYPE.
-  (let* ((info (mm-mime-info type nil 5))
-        (fnam (mm-generate-unique-filename))
-        (comp (or (cdr (assoc "compose" info))))
-        (ctyp (cdr (assoc "composetyped" info)))
-        (buff (get-buffer-create " *mimecompose*"))
-        (typeit (not ctyp))
-        (retval "")
-        (usef nil))
-    (setq comp (mm-unescape-mime-test (or comp ctyp) info))
-    (while (string-match "\\([^\\\\]\\)%s" comp)
-      (setq comp (concat (substring comp 0 (match-end 1)) fnam
-                        (substring comp (match-end 0) nil))
-           usef t))
-    (call-process shell-file-name nil
-                 (if usef nil buff)
-                 nil shell-command-switch comp)
-    (setq retval
-         (concat
-          (if typeit (concat "Content-type: " type "\r\n\r\n") "")
-          (if usef
-              (save-excursion
-                (set-buffer buff)
-                (erase-buffer)
-                (insert-file-contents fnam)
-                (buffer-string))
-            (save-excursion
-              (set-buffer buff)
-              (buffer-string)))
-          "\r\n"))
-    retval))   
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Misc.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun mm-type-to-file (type)
-  "Return the file extension for content-type TYPE"
-  (rassoc type mm-mime-extensions))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Miscellaneous MIME viewers written in elisp
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun mm-play-sound-file (&optional buff)
-  "Play a sound file in buffer BUFF (defaults to current buffer)"
-  (setq buff (or buff (current-buffer)))
-  (let ((fname (mm-generate-unique-filename "%s.au"))
-       (synchronous-sounds t))         ; Play synchronously
-    (mule-write-region-no-coding-system (point-min) (point-max) fname)
-    (kill-buffer (current-buffer))
-    (play-sound-file fname)
-    (condition-case ()
-       (delete-file fname)
-      (error nil))))
-    
-(defun mm-parse-mime-headers (&optional no-delete)
-  "Return a list of the MIME headers at the top of this buffer.  If
-optional argument NO-DELETE is non-nil, don't delete the headers."
-  (let* ((st (point-min))
-        (nd (progn
-              (goto-char (point-min))
-              (skip-chars-forward " \t\n")
-              (if (re-search-forward "^\r*$" nil t)
-                  (1+ (point))
-                (point-max))))
-        save-pos
-        status
-        hname
-        hvalu
-        result
-        search
-        )
-    (narrow-to-region st (min nd (point-max)))
-    (goto-char (point-min))
-    (while (not (eobp))
-      (skip-chars-forward " \t\n\r")
-      (setq save-pos (point))
-      (skip-chars-forward "^:\n\r")
-      (downcase-region save-pos (point))
-      (setq hname (buffer-substring save-pos (point)))
-      (skip-chars-forward ": \t ")
-      (setq save-pos (point))
-      (skip-chars-forward "^\n\r")
-      (setq search t)
-      (while search
-       (skip-chars-forward "^\n\r")
-       (save-excursion
-         (skip-chars-forward "\n\r")
-         
-         (setq search
-               (string-match "[ \t]"
-                             (char-to-string
-                              (or (char-after (point)) ?a)))))
-       (if search
-           (skip-chars-forward "\n\r")))
-      (setq hvalu (buffer-substring save-pos (point))
-           result (cons (cons hname hvalu) result)))
-    (or no-delete (delete-region st nd))
-    result))
-
-(defun mm-find-available-multiparts (separator &optional buf)
-  "Return a list of mime-headers for the various body parts of a 
-multipart message in buffer BUF with separator SEPARATOR.
-The different multipart specs are put in `mm-temporary-directory'."
-  (let ((sep (concat "^--" separator "\r*$"))
-       headers
-       fname
-       results)
-    (save-excursion
-      (and buf (set-buffer buf))
-      (goto-char (point-min))
-      (while (re-search-forward sep nil t)
-       (let ((st (set-marker (make-marker)
-                             (progn
-                               (forward-line 1)
-                               (beginning-of-line)
-                               (point))))
-             (nd (set-marker (make-marker)
-                             (if (re-search-forward sep nil t)
-                                 (1- (match-beginning 0))
-                               (point-max)))))
-         (narrow-to-region st nd)
-         (goto-char st)
-         (if (looking-at "^\r*$")
-             (insert "Content-type: text/plain\n"
-                     "Content-length: " (int-to-string (- nd st)) "\n"))
-         (setq headers (mm-parse-mime-headers)
-               fname (mm-generate-unique-filename))
-         (let ((x (or (cdr (assoc "content-type" headers)) "text/plain")))
-           (if (string-match "name=\"*\\([^ \"]+\\)\"*" x)
-               (setq fname (expand-file-name
-                            (substring x (match-beginning 1)
-                                       (match-end 1))
-                            mm-temporary-directory))))
-         (widen)
-         (if (assoc "content-transfer-encoding" headers)
-             (let ((coding (cdr
-                            (assoc "content-transfer-encoding" headers)))
-                   (cmd nil))
-               (setq coding (and coding (downcase coding))
-                     cmd (or (cdr (assoc coding
-                                         mm-content-transfer-encodings))
-                             (read-string
-                              (concat "How shall I decode " coding "? ")
-                              "cat")))
-               (if (string= cmd "") (setq cmd "cat"))
-               (if (stringp cmd)
-                   (shell-command-on-region st nd cmd t)
-                 (funcall cmd st nd))
-               (or (eq cmd 'ignore) (set-marker nd (point)))))
-         (mule-write-region-no-coding-system st nd fname nil 5)
-         (delete-region st nd)
-         (setq results (cons
-                        (cons
-                         (cons "mm-filename" fname) headers) results)))))
-    results))
-
-(defun mm-format-multipart-as-html (&optional buf type)
-  (if buf (set-buffer buf))
-  (let* ((boundary (if (string-match
-                       "boundary[ \t]*=[ \t\"]*\\([^ \"\t\n]+\\)"
-                       type)
-                      (regexp-quote
-                       (substring type (match-beginning 1) (match-end 1)))))
-        (parts    (mm-find-available-multiparts boundary)))
-    (erase-buffer)
-    (insert "<html>\n"
-           " <head>\n"
-           "  <title>Multipart Message</title>\n"
-           " </head>\n"
-           " <body>\n"
-           "   <h1> Multipart message encountered </h1>\n"
-           "   <p> I have encountered a multipart MIME message.\n"
-           "       The following parts have been detected.  Please\n"
-           "       select which one you want to view.\n"
-           "   </p>\n"
-           "   <ul>\n"
-           (mapconcat 
-            (function (lambda (x)
-                        (concat "    <li> <a href=\"file:"
-                                (cdr (assoc "mm-filename" x))
-                                "\">"
-                                (or (cdr (assoc "content-description" x)) "")
-                                "--"
-                                (or (cdr (assoc "content-type" x))
-                                    "unknown type")
-                                "</a> </li>")))
-            parts "\n")
-           "   </ul>\n"
-           " </body>\n"
-           "</html>\n"
-           "<!-- Automatically generated by MM v" mm-version "-->\n")))
-
-(defun mm-multipart-viewer ()
-  (mm-format-multipart-as-html
-   (current-buffer)
-   (cdr (assoc "content-type" url-current-mime-headers)))
-  (let ((w3-working-buffer (current-buffer)))
-    (w3-prepare-buffer)))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Transfer encodings we can decrypt automatically
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun mm-decode-quoted-printable (&optional st nd)
-  (interactive)
-  (setq st (or st (point-min))
-       nd (or nd (point-max)))
-  (save-restriction
-    (narrow-to-region st nd)
-    (save-excursion
-      (let ((buffer-read-only nil))
-       (goto-char (point-min))
-       (while (re-search-forward "=[0-9A-F][0-9A-F]" nil t)
-         (replace-match 
-          (char-to-string 
-           (+
-            (* 16 (mm-hex-char-to-integer 
-                   (char-after (1+ (match-beginning 0)))))
-            (mm-hex-char-to-integer
-             (char-after (1- (match-end 0))))))))))
-    (goto-char (point-max))))
-
-;; Taken from hexl.el.
-(defun mm-hex-char-to-integer (character)
-  "Take a char and return its value as if it was a hex digit."
-  (if (and (>= character ?0) (<= character ?9))
-      (- character ?0)
-    (let ((ch (logior character 32)))
-      (if (and (>= ch ?a) (<= ch ?f))
-         (- ch (- ?a 10))
-       (error (format "Invalid hex digit `%c'." ch))))))
-
-
-(require 'base64)
-(provide 'mm)
diff --git a/lisp/mule-sysdp.el b/lisp/mule-sysdp.el
deleted file mode 100644
index 71608c8..0000000
--- a/lisp/mule-sysdp.el
+++ /dev/null
@@ -1,382 +0,0 @@
-;;; mule-sysdp.el --- consolidate MULE-version dependencies in one file.
-
-;; Copyright (c) 1996 - 1999 William Perry
-
-;; Author: William Perry <address@hidden>
-;; Keywords: lisp, tools
-
-;; The purpose of this file is to eliminate the cruftiness that
-;; would otherwise be required of packages that want to run on multiple
-;; versions of Emacs with and without Mule support.
-
-(require 'cl)
-
-(defconst mule-sysdep-version (if (featurep 'mule)
-                                 (cond
-                                  ((string-match "XEmacs" emacs-version)
-                                   (if (boundp 'enable-multibyte-characters)
-                                       (make-variable-buffer-local 
'enable-multibyte-characters))
-                                   'xemacs)
-                                  ((and
-                                    (boundp 'mule-version)
-                                    (string-match "[0-9]+\\.[0-9]+"
-                                                  mule-version))
-                                   (if (or (fboundp 'kinsoku)
-                                           (boundp 'kinsoku-ascii))
-                                       (string-to-number (substring
-                                                          mule-version
-                                                          (match-beginning 0)
-                                                          (match-end 0)))
-                                     0))
-                                  (t 2.3))
-                               0)
-  "What version of mule we are running under.")
-
-;; MULE variants
-;; XEmacs 20.x  - 'xemacs
-;; MULE 2.3/2.4 - 2.3 -or- 2.4 (2.4 exists only in beta versions)
-;; Emacs 20.x   - 3.0
-;; Emacs 20.3+  - 4.0 (with character encapsulation)
-
-;; Return non-nil if CODING-SYSTEM is a valid coding system system.
-(defun mule-coding-system-p (coding-system)
-  (case mule-sysdep-version
-    (xemacs
-     (find-coding-system coding-system))
-    (0
-     nil)
-    (otherwise
-     (coding-system-p coding-system))))
-
-;; Return the first valid coding system in the list ARGS.
-(defun mule-coding-system-version (&rest args)
-  (if (featurep 'mule)
-      (progn
-       (while (and args (not (mule-coding-system-p (car args))))
-         (setq args (cdr args)))
-       (car args))))
-
-(defconst w3-mime-charset-coding-alist
-  `(("big5" . ,(mule-coding-system-version 'cn-big5 '*big5*))
-    ("euc-jp" . ,(mule-coding-system-version 'euc-jp '*euc-japan*))
-    ("euc-kr" . ,(mule-coding-system-version 'euc-kr '*euc-korea*))
-    ("gb" . ,(mule-coding-system-version 'cn-gb-2312 '*euc-china*))
-    ("iso-2022-jp" . ,(mule-coding-system-version 'iso-2022-jp '*iso-2022-jp*))
-    ("iso-2022-kr" . ,(mule-coding-system-version 'iso-2022-kr '*iso-2022-kr*))
-    ("iso-8859-1" . ,(mule-coding-system-version 'iso-8859-1 '*ctext*))
-    ("koi-8" . ,(mule-coding-system-version 'koi8))
-    ("koi8-r" . ,(mule-coding-system-version 'koi8))
-    ("x-ctext" . ,(mule-coding-system-version 'ctext '*ctext*))
-    ("x-sjis" . ,(mule-coding-system-version 'shift_jis '*sjis*))
-    ("x-shiftjis" . ,(mule-coding-system-version 'shift_jis '*sjis*))
-    )
-  "Alist of MIME-charset parameter regexps vs the corresponding coding 
systems.")
-
-(defconst w3-url-domain-language-environment-alist
-  '(("\\.jp$" . "Japanese")
-    ("\\.cn$" . "Chinese-GB")
-    ("\\.tw$" . "Chinese-BIG5")
-    ("\\.hk$" . "Chinese-BIG5")
-    ("\\.sg$" . "Chinese-GB")
-    ("\\.kr$" . "Korean")
-    ("\\.ru$" . "Cyrillic-KOI8")
-    ("\\.su$" . "Cyrillic-KOI8")
-    )
-  "Alist of regexps of URL vs the corresponding language environemnt.
-While detecting a coding system of a document whose URL matches some of
-the regular expressions, the coding system priorities defined in
-the corresponding language environment is used.
-
-This facility can be used only in Emacs 20.3 or later.")
-
-(defconst w3-url-domain-coding-alist
-  `(("\\.th$" . ,(mule-coding-system-version 'th-tis620 '*tis620*))
-    ("\\.kr$" . ,(mule-coding-system-version 'euc-kr '*euc-korea*))
-    ("\\.cn$" . ,(mule-coding-system-version 'cn-gb-2312 '*euc-china*))
-    ("\\.sg$" . ,(mule-coding-system-version 'cn-gb-2312 '*euc-china*))
-    ("\\.tw$" . ,(mule-coding-system-version 'cn-big5 '*big5*))
-    ("\\.hk$" . ,(mule-coding-system-version 'cn-big5 '*big5*))
-    ("\\.su$" . ,(mule-coding-system-version 'koi8))
-    ("\\.il$" . ,(mule-coding-system-version 'iso-8859-8 '*iso-8859-8*))
-    ("\\.fr$" . ,(mule-coding-system-version 'iso-8859-1 '*ctext*)))
-  "Alist of regexps of URL vs the corresponding coding systems.
-While decoding a document whose URL matches some of
-the regeular expressions, the corresponding coding system is used.")
-
-(defconst mule-retrieval-coding-system
-  (mule-coding-system-version 'euc-japan '*euc-japan* 'coding-system-euc-japan)
-  "Default retrieval coding system for packages that use this package.")
-
-(defconst mule-no-coding-system
-  (mule-coding-system-version 'no-conversion '*noconv*)
-  "Coding system that means no coding system should be used.")
-
-;; With Mule of version 2.3, insert-file-contents-literally is defined
-;; but performs code conversion.  Thus, we re-define it here to avoid
-;; the code conversion.
-(if (and (numberp mule-sysdep-version) (= mule-sysdep-version 2.3))
-    (defun insert-file-contents-literally
-      (file &optional visit beg end replace)
-      "Like `insert-file-contents', q.v., but only reads in the file.
-A buffer may be modified in several ways after reading into the buffer due
-to advanced Emacs features, such as file-name-handlers, format decoding,
-find-file-hooks, etc.
-  This function ensures that none of these modifications will take place."
-      (let ((file-name-handler-alist nil)
-           (find-file-hooks nil)
-           (input-coding-system mule-no-coding-system))
-       (insert-file-contents file visit beg end replace))))
-
-;; List of coding systems that require calling
-;; w3-replace-invalid-chars after decoding a text by them.
-(defconst mule-invalid-char-coding-systems
-  (list (mule-coding-system-version 'raw-text '*noconv*)
-       (mule-coding-system-version 'iso-8859-1 '*ctext*)))
-
-;; Return non-nil if CODING-SYSTEM requires calling
-;; w3-replace-invalid-chars after decoding a text.
-(defun mule-coding-system-with-invalid-chars (coding-system)
-  (or (null coding-system)
-      (progn
-       (if (listp coding-system)
-           (setq coding-system (car coding-system)))
-       (case mule-sysdep-version
-         ((2.3 2.4)
-          (while (not (vectorp (get coding-system 'coding-system)))
-            (setq coding-system (get coding-system 'coding-system))))
-         (3.0
-          (setq coding-system (coding-system-base coding-system))))
-       (memq coding-system mule-invalid-char-coding-systems))))
-
-(defun mule-detect-coding-version (host st nd)
-  "Return a coding system of the current data."
-  (let ((coding-system nil))
-    ;; The facility of detecting a coding system by language
-    ;; environment is provided only in Emacs 20.3 (Mule 4.0) or later.
-    (if (and host
-            (numberp mule-sysdep-version)
-            (>= mule-sysdep-version 4.0))
-       (let ((l w3-url-domain-language-environment-alist))
-         (while l
-           (if (string-match (car (car l)) host)
-               (setq coding-system
-                     (funcall 'detect-coding-with-language-environment
-                              st nd (cdr (car l)))
-                     l nil)
-             (setq l (cdr l))))))
-    ;; Next, check if the data is from some domain which prefer a
-    ;; specific coding system.
-    (if (and (not coding-system)
-            host)
-       (let ((l w3-url-domain-coding-alist))
-         (while l
-           (if (string-match (car (car l)) host)
-               (setq coding-system (if (mule-coding-system-p
-                                        (cdr (car l)))
-                                       (cdr (car l)))
-                     l nil)
-             (setq l (cdr l))))))
-    ;; At last, try to detect a coding system from the data itself.
-    (if (not coding-system)
-       (setq coding-system
-             (case mule-sysdep-version
-               (2.3 (code-detect-region st nd))
-               ((2.4 xemacs)
-                (detect-coding-region st nd))
-               (3.0
-                ;; Emacs 20.2 returns bogus information from
-                ;; detect-coding-region sometimes.  This is fixed in
-                ;; 20.3 (aka Mule 4.x)
-                (let ((possible (detect-coding-region st nd)))
-                  (if (not (symbolp (car-safe possible)))
-                      '(undecided-unix)
-                    possible)))
-               ((4.0 4.1)
-                ;; We can use HIGHEST arg t for faster detection.
-                (detect-coding-region st nd t))
-               (otherwise nil))))
-    (if (and (not (listp coding-system))
-            (not (mule-coding-system-p coding-system)))
-       (setq coding-system mule-no-coding-system))
-    coding-system))
-
-(defun mule-code-convert-region (code)
-  (if (and (listp code) (car code))
-      (setq code (car code)))
-  (case mule-sysdep-version
-    (2.3
-     (set 'mc-flag t)
-     (code-convert-region (point-min) (point-max) code *internal*)
-     (set-file-coding-system code))
-    (2.4
-     (set (make-local-variable 'enable-multibyte-characters) t)
-     (if (memq code '(autodetect coding-system-automatic))
-        nil
-       (decode-coding-region (point-min) (point-max) code)
-       (set-buffer-file-coding-system code)))
-    (3.0
-     (when default-enable-multibyte-characters
-       (set (make-local-variable 'enable-multibyte-characters) t)
-       (if (memq code '(autodetect automatic-conversion))
-          nil
-        (or code (setq code 'automatic-conversion))
-        (decode-coding-region (point-min) (point-max) code)
-        (set-buffer-file-coding-system code))))
-    (4.0
-     (when default-enable-multibyte-characters
-       (set-buffer-multibyte t)
-       (if (memq code '(autodetect automatic-conversion))
-          nil
-        (or code (setq code 'automatic-conversion))
-        (decode-coding-region (point-min) (point-max) code)
-        (set-buffer-file-coding-system (symbol-value 
'last-coding-system-used)))))
-    (xemacs
-     (if (and (listp code) (not (car code)))
-        (progn
-          (setq code 'autodetect)
-          (condition-case ()
-              (get-coding-system 'autodetect)
-            (error (setq code 'automatic-conversion)))))
-     (decode-coding-region (point-min) (point-max) code)
-     (set-file-coding-system code))
-    (otherwise
-     nil)))
-
-(defun mule-inhibit-code-conversion (proc)
-  (if (process-buffer proc)
-      (save-excursion
-       (set-buffer (process-buffer proc))
-       (set 'mc-flag nil)
-       (if (fboundp 'set-buffer-multibyte)
-           (set-buffer-multibyte nil)
-         (set 'enable-multibyte-characters nil))))
-  (case mule-sysdep-version
-    ((3.0 4.0 4.1 2.4 2.3)
-     (set-process-coding-system proc mule-no-coding-system
-                               mule-no-coding-system))
-    (xemacs
-     (set-process-input-coding-system proc mule-no-coding-system)
-     (set-process-input-coding-system proc mule-no-coding-system))))
-
-(defun mule-write-region-no-coding-system (st nd file &optional append visit 
lockname)
-  (let ((coding-system-for-write mule-no-coding-system)
-       (file-coding-system mule-no-coding-system)
-       (buffer-file-coding-system mule-no-coding-system)
-       (mc-flag t)
-       (require-final-newline nil)
-       ;;(file-name-handler-alist nil)
-       (crypt-encoding-alist nil)
-       (jka-compr-compression-info-list nil)
-       (jam-zcat-filename-list nil)
-       (write-file-hooks nil)
-       (write-contents-hooks nil)
-       (file-coding-system-alist nil))
-    (case mule-sysdep-version
-      (2.3
-       (write-region st nd file append visit lockname mule-no-coding-system))
-      (3.0
-       (let ((enable-multibyte-characters t))
-        (write-region st nd file append visit lockname)))
-      ((4.0 4.1)
-       (write-region st nd file append visit lockname))
-      (otherwise
-       (write-region st nd file append visit lockname)))))
-
-(defun mule-encode-string (str)
-  (case mule-sysdep-version
-    (2.3
-     (code-convert-string str *internal* mule-retrieval-coding-system))
-    ((2.4 3.0 xemacs)
-     (encode-coding-string str mule-retrieval-coding-system))
-    ((4.0 4.1)
-     (if default-enable-multibyte-characters
-        (encode-coding-string str mule-retrieval-coding-system)
-       str))
-    (otherwise
-     str)))
-
-(defun mule-decode-string (str)
-  (and str
-       (case mule-sysdep-version
-        ((2.4 3.0 xemacs)
-         (decode-coding-string str mule-retrieval-coding-system))
-        (2.3
-         (code-convert-string str *internal* mule-retrieval-coding-system))
-        ((4.0 4.1)
-         (if default-enable-multibyte-characters
-             (decode-coding-string str mule-retrieval-coding-system)
-           str))
-        (otherwise
-         str))))
-
-(defun mule-truncate-string (str len &optional pad)
-  "Truncate string STR so that string-width of STR is not greater than LEN.
- If width of the truncated string is less than LEN, and if a character PAD is
- defined, add padding end of it."
-  (case mule-sysdep-version
-    ((3.0 4.0 4.1)
-     (truncate-string-to-width str len 0 pad))
-    (2.4
-     (let ((cl (string-to-vector str)) (n 0) (sw 0))
-       (if (<= (string-width str) len) str
-        (while (<= (setq sw (+ (char-width (aref cl n)) sw)) len)
-          (setq n (1+ n)))
-        (string-match (make-string n ?.) str)
-        (setq str (substring str 0 (match-end 0))))
-       (if pad (concat str (make-string (- len (string-width str)) pad)) str)))
-    (2.3
-     (let ((cl (string-to-char-list str)) (n 0) (sw 0))
-       (if (<= (string-width str) len) str
-        (while (<= (setq sw (+ (char-width (nth n cl)) sw)) len)
-          (setq n (1+ n)))
-        (string-match (make-string n ?.) str)
-        (setq str (substring str 0 (match-end 0))))
-       (if pad (concat str (make-string (- len (string-width str)) pad)) str)))
-    (otherwise
-     (concat (if (> (length str) len) (substring str 0 len) str)
-            (if (or (null pad) (> (length str) len))
-                ""
-              (make-string (- len (length str)) pad))))))
-
-(defun mule-find-charset-region (beg end &optional table)
-  (case mule-sysdep-version
-    (2.3 (code-detect-region beg end))
-    ((2.4 3.0 4.0 4.1) (find-charset-region beg end table))
-    (xemacs (charsets-in-region beg end))
-    (otherwise '(no-conversion))))
-
-(defun mule-coding-system-name (codesys)
-  (case mule-sysdep-version
-    ((3.0 4.0 4.1) nil)
-    (xemacs (coding-system-name codesys))))
-
-(defun mule-find-coding-system (sys)
-  (case mule-sysdep-version
-    ((2.3 2.4) nil)
-    ((3.0 4.0 4.1) (if (get sys 'coding-system) sys nil))
-    (xemacs (find-coding-system sys))
-    (otherwise nil)))
-     
-(defun mule-make-iso-character (char)
-  (if (<= char 127)
-      char
-    (case mule-sysdep-version
-      (2.3 (make-character lc-ltn1 char))
-      (2.4 (make-char charset-latin-iso8859-1 char))
-      (3.0 (make-char 'latin-iso8859-1 char))
-      ((4.0 4.1) (if default-enable-multibyte-characters
-                    (make-char 'latin-iso8859-1 char)
-                  char))
-      (xemacs char)
-      (otherwise char))))
-
-(case mule-sysdep-version
-  ((2.3 2.4 3.0 4.0 4.1 xemacs) nil)
-  (otherwise (fset 'string-width 'length)))
-
-(and
- (boundp 'MULE)
- (not (featurep 'mule))
- (provide 'mule))
-
-(provide 'mule-sysdp)
diff --git a/lisp/url-auth.el b/lisp/url-auth.el
deleted file mode 100644
index 107c87f..0000000
--- a/lisp/url-auth.el
+++ /dev/null
@@ -1,313 +0,0 @@
-;;; url-auth.el --- Uniform Resource Locator authorization modules
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/09 14:52:18 $
-;; Version: $Revision: 1.3 $
-;; Keywords: comm, data, processes, hypermedia
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'url-vars)
-(require 'url-parse)
-
-(defsubst url-auth-user-prompt (url realm)
-  "String to usefully prompt for a username."
-  (concat "Username [for "
-         (or realm (url-truncate-url-for-viewing
-                    (url-recreate-url url)
-                    (- (window-width) 10 20)))
-         "]: "))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Basic authorization code
-;;; ------------------------
-;;; This implements the BASIC authorization type.  See the online
-;;; documentation at
-;;; http://www.w3.org/hypertext/WWW/AccessAuthorization/Basic.html
-;;; for the complete documentation on this type.
-;;;
-;;; This is very insecure, but it works as a proof-of-concept
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defvar url-basic-auth-storage nil
-  "Where usernames and passwords are stored.  Its value is an assoc list of
-assoc lists.  The first assoc list is keyed by the server name.  The cdr of
-this is an assoc list based on the 'directory' specified by the url we are
-looking up.")
-
-(defun url-basic-auth (url &optional prompt overwrite realm args)
-  "Get the username/password for the specified URL.
-If optional argument PROMPT is non-nil, ask for the username/password
-to use for the url and its descendants.  If optional third argument
-OVERWRITE is non-nil, overwrite the old username/password pair if it
-is found in the assoc list.  If REALM is specified, use that as the realm
-instead of the pathname inheritance method."
-  (let* ((href (if (stringp url)
-                  (url-generic-parse-url url)
-                url))
-        (server (url-host href))
-        (port (or (url-port href) "80"))
-        (path (url-filename href))
-        user pass byserv retval data)
-    (setq server (concat server ":" port)
-         path (cond
-               (realm realm)
-               ((string-match "/$" path) path)
-               (t (url-basepath path)))
-         byserv (cdr-safe (assoc server url-basic-auth-storage)))
-    (cond
-     ((and prompt (not byserv))
-      (setq user (read-string (url-auth-user-prompt url realm)
-                             (user-real-login-name))
-           pass (funcall url-passwd-entry-func "Password: ")
-           url-basic-auth-storage
-           (cons (list server
-                       (cons path
-                             (setq retval
-                                   (base64-encode-string
-                                    (format "%s:%s" user pass)))))
-                 url-basic-auth-storage)))
-     (byserv
-      (setq retval (cdr-safe (assoc path byserv)))
-      (if (and (not retval)
-              (string-match "/" path))
-         (while (and byserv (not retval))
-           (setq data (car (car byserv)))
-           (if (or (not (string-match "/" data)) ; Its a realm - take it!
-                   (and
-                    (>= (length path) (length data))
-                    (string= data (substring path 0 (length data)))))
-               (setq retval (cdr (car byserv))))
-           (setq byserv (cdr byserv))))
-      (if (or (and (not retval) prompt) overwrite)
-         (progn
-           (setq user (read-string (url-auth-user-prompt url realm)
-                                   (user-real-login-name))
-                 pass (funcall url-passwd-entry-func "Password: ")
-                 retval (base64-encode-string (format "%s:%s" user pass))
-                 byserv (assoc server url-basic-auth-storage))
-           (setcdr byserv
-                   (cons (cons path retval) (cdr byserv))))))
-     (t (setq retval nil)))
-    (if retval (setq retval (concat "Basic " retval)))
-    retval))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Digest authorization code
-;;; ------------------------
-;;; This implements the DIGEST authorization type.  See the internet draft
-;;; ftp://ds.internic.net/internet-drafts/draft-ietf-http-digest-aa-01.txt
-;;; for the complete documentation on this type.
-;;;
-;;; This is very secure
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defvar url-digest-auth-storage nil
-  "Where usernames and passwords are stored.  Its value is an assoc list of
-assoc lists.  The first assoc list is keyed by the server name.  The cdr of
-this is an assoc list based on the 'directory' specified by the url we are
-looking up.")
-
-(defun url-digest-auth-create-key (username password realm method uri)
-  "Create a key for digest authentication method"
-  (let* ((info (if (stringp uri)
-                  (url-generic-parse-url uri)
-                uri))
-        (a1 (md5 (concat username ":" realm ":" password)))
-        (a2 (md5 (concat method ":" (url-filename info)))))
-    (list a1 a2)))
-
-(defun url-digest-auth (url &optional prompt overwrite realm args)
-  "Get the username/password for the specified URL.
-If optional argument PROMPT is non-nil, ask for the username/password
-to use for the url and its descendants.  If optional third argument
-OVERWRITE is non-nil, overwrite the old username/password pair if it
-is found in the assoc list.  If REALM is specified, use that as the realm
-instead of hostname:portnum."
-  (if args
-      (let* ((href (if (stringp url)
-                      (url-generic-parse-url url)
-                    url))
-            (server (url-host href))
-            (port (or (url-port href) "80"))
-            (path (url-filename href))
-            user pass byserv retval data)
-       (setq path (cond
-                   (realm realm)
-                   ((string-match "/$" path) path)
-                   (t (url-basepath path)))
-             server (concat server ":" port)
-             byserv (cdr-safe (assoc server url-digest-auth-storage)))
-       (cond
-        ((and prompt (not byserv))
-         (setq user (read-string (url-auth-user-prompt url realm)
-                                 (user-real-login-name))
-               pass (funcall url-passwd-entry-func "Password: ")
-               url-digest-auth-storage
-               (cons (list server
-                           (cons path
-                                 (setq retval
-                                       (cons user
-                                             (url-digest-auth-create-key
-                                              user pass realm
-                                              (or url-request-method "GET")
-                                              url)))))
-                     url-digest-auth-storage)))
-        (byserv
-         (setq retval (cdr-safe (assoc path byserv)))
-         (if (and (not retval)         ; no exact match, check directories
-                  (string-match "/" path)) ; not looking for a realm
-             (while (and byserv (not retval))
-               (setq data (car (car byserv)))
-               (if (or (not (string-match "/" data))
-                       (and
-                        (>= (length path) (length data))
-                        (string= data (substring path 0 (length data)))))
-                   (setq retval (cdr (car byserv))))
-               (setq byserv (cdr byserv))))
-         (if (or (and (not retval) prompt) overwrite)
-             (progn
-               (setq user (read-string (url-auth-user-prompt url realm)
-                                       (user-real-login-name))
-                     pass (funcall url-passwd-entry-func "Password: ")
-                     retval (setq retval
-                                  (cons user
-                                        (url-digest-auth-create-key
-                                         user pass realm
-                                         (or url-request-method "GET")
-                                         url)))
-                     byserv (assoc server url-digest-auth-storage))
-               (setcdr byserv
-                       (cons (cons path retval) (cdr byserv))))))
-        (t (setq retval nil)))
-       (if retval
-           (let ((nonce (or (cdr-safe (assoc "nonce" args)) "nonegiven"))
-                 (opaque (or (cdr-safe (assoc "opaque" args)) "nonegiven")))
-             (format
-              (concat "Digest username=\"%s\", realm=\"%s\","
-                      "nonce=\"%s\", uri=\"%s\","
-                      "response=\"%s\", opaque=\"%s\"")
-              (nth 0 retval) realm nonce (url-filename href)
-              (md5 (concat (nth 1 retval) ":" nonce ":"
-                           (nth 2 retval))) opaque))))))
-
-(defvar url-registered-auth-schemes nil
-  "A list of the registered authorization schemes and various and sundry
-information associated with them.")
-
-;;;###autoload
-(defun url-get-authentication (url realm type prompt &optional args)
-  "Return an authorization string suitable for use in the WWW-Authenticate
-header in an HTTP/1.0 request.
-
-URL    is the url you are requesting authorization to.  This can be either a
-       string representing the URL, or the parsed representation returned by
-       `url-generic-parse-url'
-REALM  is the realm at a specific site we are looking for.  This should be a
-       string specifying the exact realm, or nil or the symbol 'any' to
-       specify that the filename portion of the URL should be used as the
-       realm
-TYPE   is the type of authentication to be returned.  This is either a string
-       representing the type (basic, digest, etc), or nil or the symbol 'any'
-       to specify that any authentication is acceptable.  If requesting 'any'
-       the strongest matching authentication will be returned.  If this is
-       wrong, its no big deal, the error from the server will specify exactly
-       what type of auth to use
-PROMPT is boolean - specifies whether to ask the user for a username/password
-       if one cannot be found in the cache"
-  (if (not realm)
-      (setq realm (cdr-safe (assoc "realm" args))))
-  (if (stringp url)
-      (setq url (url-generic-parse-url url)))
-  (if (or (null type) (eq type 'any))
-      ;; Whooo doogies!
-      ;; Go through and get _all_ the authorization strings that could apply
-      ;; to this URL, store them along with the 'rating' we have in the list
-      ;; of schemes, then sort them so that the 'best' is at the front of the
-      ;; list, then get the car, then get the cdr.
-      ;; Zooom zooom zoooooom
-      (cdr-safe
-       (car-safe
-       (sort
-        (mapcar
-         (function
-          (lambda (scheme)
-            (if (fboundp (car (cdr scheme)))
-                (cons (cdr (cdr scheme))
-                      (funcall (car (cdr scheme)) url nil nil realm))
-              (cons 0 nil))))
-         url-registered-auth-schemes)
-        (function
-         (lambda (x y)
-           (cond
-            ((null (cdr x)) nil)
-            ((and (cdr x) (null (cdr y))) t)
-            ((and (cdr x) (cdr y))
-             (>= (car x) (car y)))
-            (t nil)))))))
-    (if (symbolp type) (setq type (symbol-name type)))
-    (let* ((scheme (car-safe
-                   (cdr-safe (assoc (downcase type)
-                                    url-registered-auth-schemes)))))
-      (if (and scheme (fboundp scheme))
-         (funcall scheme url prompt
-                  (and prompt
-                       (funcall scheme url nil nil realm args))
-                  realm args)))))
-
-;;;###autoload
-(defun url-register-auth-scheme (type &optional function rating)
-  "Register an HTTP authentication method.
-
-TYPE     is a string or symbol specifying the name of the method.   This
-         should be the same thing you expect to get returned in an Authenticate
-         header in HTTP/1.0 - it will be downcased.
-FUNCTION is the function to call to get the authorization information.  This
-         defaults to `url-?-auth', where ? is TYPE
-RATING   a rating between 1 and 10 of the strength of the authentication.
-         This is used when asking for the best authentication for a specific
-         URL.  The item with the highest rating is returned."
-  (let* ((type (cond
-               ((stringp type) (downcase type))
-               ((symbolp type) (downcase (symbol-name type)))
-               (t (error "Bad call to `url-register-auth-scheme'"))))
-        (function (or function (intern (concat "url-" type "-auth"))))
-        (rating (cond
-                 ((null rating) 2)
-                 ((stringp rating) (string-to-int rating))
-                 (t rating)))
-        (node (assoc type url-registered-auth-schemes)))
-    (if (not (fboundp function))
-       (url-warn 'security
-                 (format (eval-when-compile
-                           "Tried to register `%s' as an auth scheme"
-                           ", but it is not a function!") function)))
-
-    (if node
-       (setcdr node (cons function rating))
-      (setq url-registered-auth-schemes
-           (cons (cons type (cons function rating))
-                 url-registered-auth-schemes)))))
-
-(defun url-auth-registered (scheme)
-  ;; Return non-nil iff SCHEME is registered as an auth type
-  (assoc scheme url-registered-auth-schemes))
-
-(provide 'urlauth)
diff --git a/lisp/url-cache.el b/lisp/url-cache.el
deleted file mode 100644
index 85e885a..0000000
--- a/lisp/url-cache.el
+++ /dev/null
@@ -1,272 +0,0 @@
-;;; url-cache.el --- Uniform Resource Locator retrieval tool
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/10/12 14:14:47 $
-;; Version: $Revision: 1.2 $
-;; Keywords: comm, data, processes, hypermedia
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(require 'url-parse)
-(require 'md5)
-(require 'mule-sysdp)
-
-(defcustom url-cache-directory
-  (expand-file-name "cache" w3-configuration-directory)
-  "*The directory where cache files should be stored."
-  :type 'directory
-  :group 'url-file)
-
-;; Cache manager
-(defun url-cache-file-writable-p (file)
-  "Follows the documentation of file-writable-p, unlike file-writable-p."
-  (and (file-writable-p file)
-       (if (file-exists-p file)
-           (not (file-directory-p file))
-         (file-directory-p (file-name-directory file)))))
-                
-(defun url-cache-prepare (file)
-  "Makes it possible to cache data in FILE.
-Creates any necessary parent directories, deleting any non-directory files
-that would stop this.  Returns nil if parent directories can not be
-created.  If FILE already exists as a non-directory, it changes
-permissions of FILE or deletes FILE to make it possible to write a new
-version of FILE.  Returns nil if this can not be done.  Returns nil if
-FILE already exists as a directory.  Otherwise, returns t, indicating that
-FILE can be created or overwritten."
-  (cond
-   ((url-cache-file-writable-p file)
-    t)
-   ((file-directory-p file)
-    nil)
-   (t
-    (condition-case ()
-       (or (make-directory (file-name-directory file) t) t)
-      (error nil)))))
-
-(defcustom url-cache-ignored-protocols
-  '("www" "about" "https" "mailto")
-  "*A list of protocols that we should never cache."
-  :type '(repeat (string :tag "Protocol"))
-  :group 'url-cache)
-
-(defun url-cache-cachable-p (obj)
-  ;; return t iff the current buffer is cachable
-  (cond
-   ((not url-automatic-caching)                ; User doesn't want to cache
-    nil)
-   ((null obj)                         ; Something horribly confused
-    nil)
-   ((member (url-type obj) url-cache-ignored-protocols)
-    ;; We have been told to ignore this type of object
-    nil)
-   ((and (member (url-type obj) '("file" "ftp")) (not (url-host obj)))
-    ;; We never want to cache local files... what's the point?
-    nil)
-   ((member (url-type obj) '("http" "https"))
-    (let* ((status (cdr-safe (assoc "status" url-current-mime-headers)))
-          (class (if status (/ status 100) 0)))
-      (cond
-       ((string-match (eval-when-compile (regexp-quote "?"))
-                     (url-filename obj))
-       nil)
-       ((= class 2)
-       (memq status '(200)))
-       (t nil))))
-   (t
-    nil)))
-
-;;;###autoload
-(defun url-store-in-cache (&optional buff)
-  "Store buffer BUFF in the cache"
-  (if (not (and buff (get-buffer buff)))
-      nil
-    (save-excursion
-      (and buff (set-buffer buff))
-      (if (not (url-cache-cachable-p url-current-object))
-         nil
-       (let* ((fname (url-cache-create-filename (url-view-url t)))
-              (fname-hdr (concat fname ".hdr"))
-              (info (mapcar (function (lambda (var)
-                                        (cons (symbol-name var)
-                                              (symbol-value var))))
-                            '( url-current-content-length
-                               url-current-object
-                               url-current-isindex
-                               url-current-mime-encoding
-                               url-current-mime-headers
-                               url-current-mime-type
-                               url-current-mime-charset
-                               ))))
-         (cond ((and (url-cache-prepare fname)
-                     (url-cache-prepare fname-hdr))
-                (mule-write-region-no-coding-system (point-min) (point-max) 
fname nil 5)
-                (set-buffer (get-buffer-create " *cache-tmp*"))
-                (erase-buffer)
-                (insert "(setq ")
-                (mapcar
-                 (function
-                  (lambda (x)
-                    (insert (car x) " "
-                            (cond ((null (setq x (cdr x))) "nil")
-                                  ((stringp x) (prin1-to-string x))
-                                  ((listp x) (concat "'" (prin1-to-string x)))
-                                  ((vectorp x) (prin1-to-string x))
-                                  ((numberp x) (int-to-string x))
-                                  (t "'???")) "\n")))
-                 info)
-                (insert ")\n")
-                (mule-write-region-no-coding-system (point-min) (point-max) 
fname-hdr nil 5))))))))
-       
-            
-;;;###autoload
-(defun url-is-cached (url)
-  "Return non-nil if the URL is cached."
-  (let* ((fname (url-cache-create-filename url))
-        (attribs (file-attributes fname)))
-    (and fname                         ; got a filename
-        (file-exists-p fname)          ; file exists
-        (not (eq (nth 0 attribs) t))   ; Its not a directory
-        (nth 5 attribs))))             ; Can get last mod-time
-
-(defun url-cache-create-filename-human-readable (url)
-  "Return a filename in the local cache for URL"
-  (if url
-      (let* ((url (if (vectorp url) (url-recreate-url url) url))
-            (urlobj (url-generic-parse-url url))
-            (protocol (url-type urlobj))
-            (hostname (url-host urlobj))
-            (host-components
-             (cons
-              (user-real-login-name)
-              (cons (or protocol "file")
-                    (reverse (split-string (or hostname "localhost")
-                                           (eval-when-compile
-                                             (regexp-quote ".")))))))
-            (fname    (url-filename urlobj)))
-       (if (and fname (/= (length fname) 0) (= (aref fname 0) ?/))
-           (setq fname (substring fname 1 nil)))
-       (if fname
-           (let ((slash nil))
-             (setq fname
-                   (mapconcat
-                    (function
-                     (lambda (x)
-                       (cond
-                        ((and (= ?/ x) slash)
-                         (setq slash nil)
-                         "%2F")
-                        ((= ?/ x)
-                         (setq slash t)
-                         "/")
-                        (t
-                         (setq slash nil)
-                         (char-to-string x))))) fname ""))))
-
-       (setq fname (and fname
-                        (mapconcat
-                         (function (lambda (x)
-                                     (if (= x ?~) "" (char-to-string x))))
-                         fname ""))
-             fname (cond
-                    ((null fname) nil)
-                    ((or (string= "" fname) (string= "/" fname))
-                     url-directory-index-file)
-                    ((= (string-to-char fname) ?/)
-                     (if (string= (substring fname -1 nil) "/")
-                         (concat fname url-directory-index-file)
-                       (substring fname 1 nil)))
-                    (t
-                     (if (string= (substring fname -1 nil) "/")
-                         (concat fname url-directory-index-file)
-                       fname))))
-       (and fname
-            (expand-file-name fname
-                              (expand-file-name
-                               (mapconcat 'identity host-components "/")
-                               url-cache-directory))))))
-
-(defun url-cache-create-filename-using-md5 (url)
-  "Create a cached filename using MD5.
- Very fast if you are in XEmacs, suitably fast otherwise."
-  (if url
-      (let* ((checksum (md5 url))
-            (url (if (vectorp url) (url-recreate-url url) url))
-            (urlobj (url-generic-parse-url url))
-            (protocol (url-type urlobj))
-            (hostname (url-host urlobj))
-            (host-components
-             (cons
-              (user-real-login-name)
-              (cons (or protocol "file")
-                    (nreverse
-                     (delq nil
-                           (split-string (or hostname "localhost")
-                                         (eval-when-compile
-                                           (regexp-quote "."))))))))
-            (fname    (url-filename urlobj)))
-       (and fname
-            (expand-file-name checksum
-                              (expand-file-name
-                               (mapconcat 'identity host-components "/")
-                               url-cache-directory))))))
-
-(defcustom url-cache-creation-function 'url-cache-create-filename-using-md5
-  "*What function to use to create a cached filename."
-  :type '(choice (const :tag "MD5 of filename (low collision rate)"
-                       :value url-cache-create-filename-using-md5)
-                (const :tag "Human readable filenames (higher collision rate)"
-                       :value url-cache-create-filename-human-readable)
-                (function :tag "Other"))
-  :group 'url-cache)
-
-(defun url-cache-create-filename (url)
-  (funcall url-cache-creation-function url))
-
-;;;###autoload
-(defun url-cache-extract (fnam)
-  "Extract FNAM from the local disk cache"
-  (set-buffer (get-buffer-create url-working-buffer))
-  (erase-buffer)
-  (setq url-current-mime-viewer nil)
-  (insert-file-contents-literally fnam)
-  (load (concat (if (memq system-type '(ms-windows ms-dos emx os2))
-                   (url-file-extension fnam t)
-                 fnam) ".hdr") t t)) 
-
-;;;###autoload
-(defun url-cache-expired (url mod)
-  "Return t iff a cached file has expired."
-  (let* ((urlobj (if (vectorp url) url (url-generic-parse-url url)))
-        (type (url-type urlobj)))
-    (cond
-     (url-standalone-mode
-      (not (file-exists-p (url-cache-create-filename url))))
-     ((string= type "http")
-      t)
-     ((member type '("file" "ftp"))
-      (if (or (equal mod '(0 0)) (not mod))
-         (return t)
-       (or (> (nth 0 mod) (nth 0 (current-time)))
-           (> (nth 1 mod) (nth 1 (current-time))))))
-     (t nil))))
-
-(provide 'url-cache)
diff --git a/lisp/url-cid.el b/lisp/url-cid.el
deleted file mode 100644
index 49a8676..0000000
--- a/lisp/url-cid.el
+++ /dev/null
@@ -1,70 +0,0 @@
-;;; url-cid.el --- Content-ID URL loader
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/08/05 20:21:27 $
-;; Version: $Revision: 1.3 $
-;; Keywords: comm, data, processes
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1998 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'url-vars)
-(require 'url-parse)
-(require 'widget)
-
-(condition-case ()
-    (require 'mm-decode)
-  (error nil))
-
-(defun url-cid-gnus (cid)
-  (set-buffer (get-buffer-create url-working-buffer))
-  (let ((content-type nil)
-       (encoding nil)
-       (part nil)
-       (data nil))
-    (setq part (mm-get-content-id cid))
-    (if (not part)
-       (message "Unknown CID encountered: %s" cid)
-      (setq data (save-excursion
-                  (set-buffer (mm-handle-buffer part))
-                  (buffer-string))
-           content-type (mm-handle-type part)
-           encoding (symbol-name (mm-handle-encoding part)))
-      (if (= 0 (length content-type)) (setq content-type "text/plain"))
-      (if (= 0 (length encoding)) (setq encoding "8bit"))
-      (if (listp content-type)
-         (setq content-type (car content-type)))
-      (setq url-current-content-length (length data)
-           url-current-mime-type content-type
-           url-current-mime-encoding encoding
-           url-current-mime-headers (list (cons "content-type" content-type)
-                                          (cons "content-encoding" encoding)))
-      (and data (insert data)))))
-
-(defun url-cid (url)
-  (if (not (string-match "^cid:\\(.*\\)" url))
-      (message "Malformed CID URL: %s" url)
-    (setq url (url-unhex-string (match-string 1 url)))
-    (cond
-     ((fboundp 'mm-get-content-id)
-      ;; Using Pterodactyl Gnus or later
-      (url-cid-gnus url))
-     (t
-      (message "Unable to handle CID URL: %s" url)))))
diff --git a/lisp/url-cookie.el b/lisp/url-cookie.el
deleted file mode 100644
index 9a84de8..0000000
--- a/lisp/url-cookie.el
+++ /dev/null
@@ -1,413 +0,0 @@
-;;; url-cookie.el --- Netscape Cookie support
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/09 14:52:19 $
-;; Version: $Revision: 1.4 $
-;; Keywords: comm, data, processes, hypermedia
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'timezone)
-(require 'cl)
-
-(eval-and-compile
-  (let ((keywords 
-        '(:name :value :expires :path :domain :test :secure)))
-    (while keywords
-      (or (boundp (car keywords))
-         (set (car keywords) (car keywords)))
-      (setq keywords (cdr keywords)))))
-
-;; See http://home.netscape.com/newsref/std/cookie_spec.html for the
-;; 'open standard' defining this crap.
-;;
-;; A cookie is stored internally as a vector of 7 slots
-;; [ 'cookie name value expires path domain secure ]
-
-(defsubst url-cookie-name    (cookie) (aref cookie 1))
-(defsubst url-cookie-value   (cookie) (aref cookie 2))
-(defsubst url-cookie-expires (cookie) (aref cookie 3))
-(defsubst url-cookie-path    (cookie) (aref cookie 4))
-(defsubst url-cookie-domain  (cookie) (aref cookie 5))
-(defsubst url-cookie-secure  (cookie) (aref cookie 6))
-
-(defsubst url-cookie-set-name    (cookie val) (aset cookie 1 val))
-(defsubst url-cookie-set-value   (cookie val) (aset cookie 2 val))
-(defsubst url-cookie-set-expires (cookie val) (aset cookie 3 val))
-(defsubst url-cookie-set-path    (cookie val) (aset cookie 4 val))
-(defsubst url-cookie-set-domain  (cookie val) (aset cookie 5 val))
-(defsubst url-cookie-set-secure  (cookie val) (aset cookie 6 val))
-(defsubst url-cookie-retrieve-arg (key args) (nth 1 (memq key args)))
-
-(defsubst url-cookie-create (&rest args)
-  (let ((retval (make-vector 7 nil)))
-    (aset retval 0 'cookie)
-    (url-cookie-set-name retval (url-cookie-retrieve-arg :name args))
-    (url-cookie-set-value retval (url-cookie-retrieve-arg :value args))
-    (url-cookie-set-expires retval (url-cookie-retrieve-arg :expires args))
-    (url-cookie-set-path retval (url-cookie-retrieve-arg :path args))
-    (url-cookie-set-domain retval (url-cookie-retrieve-arg :domain args))
-    (url-cookie-set-secure retval (url-cookie-retrieve-arg :secure args))
-    retval))
-
-(defun url-cookie-p (obj)
-  (and (vectorp obj) (= (length obj) 7) (eq (aref obj 0) 'cookie)))
-
-;;;###autoload
-(defun url-cookie-parse-file (&optional fname)
-  (setq fname (or fname url-cookie-file))
-  (condition-case ()
-      (load fname nil t)
-    (error (message "Could not load cookie file %s" fname))))
-
-(defun url-cookie-clean-up (&optional secure)
-  (let* (
-        (var (if secure 'url-cookie-secure-storage 'url-cookie-storage))
-        (val (symbol-value var))
-        (cur nil)
-        (new nil)
-        (cookies nil)
-        (cur-cookie nil)
-        (new-cookies nil)
-        )
-    (while val
-      (setq cur (car val)
-           val (cdr val)
-           new-cookies nil
-           cookies (cdr cur))
-      (while cookies
-       (setq cur-cookie (car cookies)
-             cookies (cdr cookies))
-       (if (or (not (url-cookie-p cur-cookie))
-               (url-cookie-expired-p cur-cookie)
-               (null (url-cookie-expires cur-cookie)))
-           nil
-         (setq new-cookies (cons cur-cookie new-cookies))))
-      (if (not new-cookies)
-         nil
-       (setcdr cur new-cookies)
-       (setq new (cons cur new))))
-    (set var new)))
-
-;;;###autoload
-(defun url-cookie-write-file (&optional fname)
-  (setq fname (or fname url-cookie-file))
-  (cond
-   ((not url-cookies-changed-since-last-save) nil)
-   ((not (file-writable-p fname))
-    (message "Cookies file %s (see variable `url-cookie-file') is unwritable." 
fname))
-   (t
-    (url-cookie-clean-up)
-    (url-cookie-clean-up t)
-    (save-excursion
-      (set-buffer (get-buffer-create " *cookies*"))
-      (erase-buffer)
-      (fundamental-mode)
-      (insert ";; Emacs-W3 HTTP cookies file\n"
-             ";; Automatically generated file!!! DO NOT EDIT!!!\n\n"
-             "(setq url-cookie-storage\n '")
-      (pp url-cookie-storage (current-buffer))
-      (insert ")\n(setq url-cookie-secure-storage\n '")
-      (pp url-cookie-secure-storage (current-buffer))
-      (insert ")\n")
-      (write-file fname)
-      (kill-buffer (current-buffer))))))
-
-(defun url-cookie-store (name value &optional expires domain path secure)
-  "Stores a netscape-style cookie"
-  (let* ((storage (if secure url-cookie-secure-storage url-cookie-storage))
-        (tmp storage)
-        (cur nil)
-        (found-domain nil))
-
-    ;; First, look for a matching domain
-    (setq found-domain (assoc domain storage))
-
-    (if found-domain
-       ;; Need to either stick the new cookie in existing domain storage
-       ;; or possibly replace an existing cookie if the names match.
-       (progn
-         (setq storage (cdr found-domain)
-               tmp nil)
-         (while storage
-           (setq cur (car storage)
-                 storage (cdr storage))
-           (if (and (equal path (url-cookie-path cur))
-                    (equal name (url-cookie-name cur)))
-               (progn
-                 (url-cookie-set-expires cur expires)
-                 (url-cookie-set-value cur value)
-                 (setq tmp t))))
-         (if (not tmp)
-             ;; New cookie
-             (setcdr found-domain (cons
-                                   (url-cookie-create :name name
-                                                      :value value
-                                                      :expires expires
-                                                      :domain domain
-                                                      :path path
-                                                      :secure secure)
-                                   (cdr found-domain)))))
-      ;; Need to add a new top-level domain
-      (setq tmp (url-cookie-create :name name
-                                  :value value
-                                  :expires expires
-                                  :domain domain
-                                  :path path
-                                  :secure secure))
-      (cond
-       (storage
-       (setcdr storage (cons (list domain tmp) (cdr storage))))
-       (secure
-       (setq url-cookie-secure-storage (list (list domain tmp))))
-       (t
-       (setq url-cookie-storage (list (list domain tmp))))))))
-
-(defun url-cookie-expired-p (cookie)
-  (let* (
-        (exp (url-cookie-expires cookie))
-        (cur-date (and exp (timezone-parse-date (current-time-string))))
-        (exp-date (and exp (timezone-parse-date exp)))
-        (cur-greg (and cur-date (timezone-absolute-from-gregorian
-                                 (string-to-int (aref cur-date 1))
-                                 (string-to-int (aref cur-date 2))
-                                 (string-to-int (aref cur-date 0)))))
-        (exp-greg (and exp (timezone-absolute-from-gregorian
-                            (string-to-int (aref exp-date 1))
-                            (string-to-int (aref exp-date 2))
-                            (string-to-int (aref exp-date 0)))))
-        (diff-in-days (and exp (- cur-greg exp-greg)))
-        )
-    (cond
-     ((not exp)        nil)                    ; No expiry == expires at 
browser quit
-     ((< diff-in-days 0) nil)          ; Expires sometime after today
-     ((> diff-in-days 0) t)            ; Expired before today
-     (t                                        ; Expires sometime today, check 
times
-      (let* ((cur-time (timezone-parse-time (aref cur-date 3)))
-            (exp-time (timezone-parse-time (aref exp-date 3)))
-            (cur-norm (+ (* 360 (string-to-int (aref cur-time 2)))
-                         (*  60 (string-to-int (aref cur-time 1)))
-                         (*   1 (string-to-int (aref cur-time 0)))))
-            (exp-norm (+ (* 360 (string-to-int (aref exp-time 2)))
-                         (*  60 (string-to-int (aref exp-time 1)))
-                         (*   1 (string-to-int (aref exp-time 0))))))
-       (> (- cur-norm exp-norm) 1))))))
-
-;;;###autoload
-(defun url-cookie-retrieve (host path &optional secure)
-  "Retrieves all the netscape-style cookies for a specified HOST and PATH"
-  (let ((storage (if secure
-                    (append url-cookie-secure-storage url-cookie-storage)
-                  url-cookie-storage))
-       (case-fold-search t)
-       (cookies nil)
-       (cur nil)
-       (retval nil)
-       (path-regexp nil))
-    (while storage
-      (setq cur (car storage)
-           storage (cdr storage)
-           cookies (cdr cur))
-      (if (and (car cur)
-              (string-match (concat "^.*" (regexp-quote (car cur)) "$") host))
-         ;; The domains match - a possible hit!
-         (while cookies
-           (setq cur (car cookies)
-                 cookies (cdr cookies)
-                 path-regexp (concat "^" (regexp-quote
-                                          (url-cookie-path cur))))
-           (if (and (string-match path-regexp path)
-                    (not (url-cookie-expired-p cur)))
-               (setq retval (cons cur retval))))))
-    retval))
-
-;;;###autolaod
-(defun url-cookie-generate-header-lines (host path secure)
-  (let* ((cookies (url-cookie-retrieve host path secure))
-       (retval nil)
-       (cur nil)
-       (chunk nil))
-    ;; Have to sort this for sending most specific cookies first
-    (setq cookies (and cookies
-                      (sort cookies
-                            (function
-                             (lambda (x y)
-                               (> (length (url-cookie-path x))
-                                  (length (url-cookie-path y))))))))
-    (while cookies
-      (setq cur (car cookies)
-           cookies (cdr cookies)
-           chunk (format "%s=%s" (url-cookie-name cur) (url-cookie-value cur))
-           retval (if (< 80 (+ (length retval) (length chunk) 4))
-                      (concat retval "\r\nCookie: " chunk)
-                    (if retval
-                        (concat retval "; " chunk)
-                      (concat "Cookie: " chunk)))))
-    (if retval
-       (concat retval "\r\n")
-      "")))
-
-(defvar url-cookie-two-dot-domains
-  (concat "\\.\\("
-   (mapconcat 'identity (list "com" "edu" "net" "org" "gov" "mil" "int")
-             "\\|")
-   "\\)$")
-  "A regular expression of top-level domains that only require two matching
-'.'s in the domain name in order to set a cookie.")
-
-(defcustom url-cookie-trusted-urls nil
-  "*A list of regular expressions matching URLs to always accept cookies from."
-  :type '(repeat regexp)
-  :group 'url-cookie)
-
-(defcustom url-cookie-untrusted-urls nil
-  "*A list of regular expressions matching URLs to never accept cookies from."
-  :type '(repeat regexp)
-  :group 'url-cookie)
-
-(defun url-cookie-host-can-set-p (host domain)
-  (let ((numdots 0)
-       (tmp domain)
-       (last nil)
-       (case-fold-search t)
-       (mindots 3))
-    (while (setq last (string-match "\\." domain last))
-      (setq numdots (1+ numdots)
-           last (1+ last)))
-    (if (string-match url-cookie-two-dot-domains domain)
-       (setq mindots 2))
-    (cond
-     ((string= host domain)            ; Apparently netscape lets you do this
-      t)
-     ((>= numdots mindots)             ; We have enough dots in domain name
-      ;; Need to check and make sure the host is actually _in_ the
-      ;; domain it wants to set a cookie for though.
-      (string-match (concat (regexp-quote domain) "$") host))
-     (t
-      nil))))
-
-(defun url-header-comparison (x y)
-  (string= (downcase x) (downcase y)))
-
-;;;###autoload
-(defun url-cookie-handle-set-cookie (str)
-  (setq url-cookies-changed-since-last-save t)
-  (let* ((args (mm-parse-args str nil t)) ; Don't downcase names
-        (case-fold-search t)
-        (secure (and (assoc* "secure" args :test 'url-header-comparison) t))
-        (domain (or (cdr-safe (assoc* "domain" args :test
-                                      'url-header-comparison))
-                    (url-host url-current-object)))
-        (current-url (url-view-url t))
-        (trusted url-cookie-trusted-urls)
-        (untrusted url-cookie-untrusted-urls)
-        (expires (cdr-safe (assoc* "expires" args :test
-                                   'url-header-comparison)))
-        (path (or (cdr-safe (assoc* "path" args :test
-                                    'url-header-comparison))
-                  (file-name-directory
-                   (url-filename url-current-object))))
-        (rest nil))
-    (while args
-      (if (not (member (downcase (car (car args)))
-                      '("secure" "domain" "expires" "path")))
-         (setq rest (cons (car args) rest)))
-      (setq args (cdr args)))
-
-    ;; Sometimes we get dates that the timezone package cannot handle very
-    ;; gracefully - take care of this here, instead of in url-cookie-expired-p
-    ;; to speed things up.
-    (if (and expires
-            (string-match
-             (concat "^[^,]+, +\\(..\\)-\\(...\\)-\\(..\\) +"
-                     "\\(..:..:..\\) +\\[*\\([^\]]+\\)\\]*$")
-             expires))
-       (setq expires (concat (url-match expires 1) " "
-                             (url-match expires 2) " "
-                             (url-match expires 3) " "
-                             (url-match expires 4) " ["
-                             (url-match expires 5) "]")))
-
-    ;; This one is for older Emacs/XEmacs variants that don't
-    ;; understand this format without tenths of a second in it.
-    ;; Wednesday, 30-Dec-2037 16:00:00 GMT
-    ;;       - vs -
-    ;; Wednesday, 30-Dec-2037 16:00:00.00 GMT
-    (if (and expires
-            (string-match
-             "\\([0-9]+\\)-\\([A-Za-z]+\\)-\\([0-9]+\\)[ 
\t]+\\([0-9]+:[0-9]+:[0-9]+\\)\\(\\.[0-9]+\\)*[ \t]+\\([-+a-zA-Z0-9]+\\)"
-             expires))
-       (setq expires (concat (url-match expires 1) "-" ; day
-                             (url-match expires 2) "-" ; month
-                             (url-match expires 3) " " ; year
-                             (url-match expires 4) ".00 " ; 
hour:minutes:seconds
-                             (url-match expires 6)))) ":" ; timezone
-    
-    (while (consp trusted)
-      (if (string-match (car trusted) current-url)
-         (setq trusted (- (match-end 0) (match-beginning 0)))
-       (pop trusted)))
-    (while (consp untrusted)
-      (if (string-match (car untrusted) current-url)
-         (setq untrusted (- (match-end 0) (match-beginning 0)))
-       (pop untrusted)))
-    (if (and trusted untrusted)
-       ;; Choose the more specific match
-       (if (> trusted untrusted)
-           (setq untrusted nil)
-         (setq trusted nil)))
-    (cond
-     (untrusted
-      ;; The site was explicity marked as untrusted by the user
-      nil)
-     ((or (eq url-privacy-level 'paranoid)
-         (and (listp url-privacy-level) (memq 'cookies url-privacy-level)))
-      ;; user never wants cookies
-      nil)
-     ((and url-cookie-confirmation
-          (not trusted)
-          (save-window-excursion
-            (with-output-to-temp-buffer "*Cookie Warning*"
-              (mapcar
-               (function
-                (lambda (x)
-                  (princ (format "%s - %s" (car x) (cdr x))))) rest))
-            (prog1
-                (not (funcall url-confirmation-func
-                              (format "Allow %s to set these cookies? "
-                                      (url-host url-current-object))))
-              (if (get-buffer "*Cookie Warning*")
-                  (kill-buffer "*Cookie Warning*")))))
-      ;; user wants to be asked, and declined.
-      nil)
-     ((url-cookie-host-can-set-p (url-host url-current-object) domain)
-      ;; Cookie is accepted by the user, and passes our security checks
-      (let ((cur nil))
-       (while rest
-         (setq cur (pop rest))
-         (url-cookie-store (car cur) (cdr cur)
-                           expires domain path secure))))
-     (t
-      (message "%s tried to set a cookie for domain %s - rejected."
-              (url-host url-current-object) domain)))))
-
-(provide 'url-cookie)
diff --git a/lisp/url-file.el b/lisp/url-file.el
deleted file mode 100644
index 1648478..0000000
--- a/lisp/url-file.el
+++ /dev/null
@@ -1,304 +0,0 @@
-;;; url-file.el --- File retrieval code
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/09 14:52:21 $
-;; Version: $Revision: 1.4 $
-;; Keywords: comm, data, processes
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'url-vars)
-(require 'mule-sysdp)
-(require 'w3-sysdp)
-(require 'url-parse)
-
-(defun url-insert-possibly-compressed-file (fname &rest args)
-  ;; Insert a file into a buffer, checking for compressed versions.
-  (let ((compressed nil)
-       ;;
-       ;; F*** *U** **C* ***K!!!
-       ;; We cannot just use insert-file-contents-literally here, because
-       ;; then we would lose big time with ange-ftp.  *sigh*
-       (crypt-encoding-alist nil)
-       (jka-compr-compression-info-list nil)
-       (jam-zcat-filename-list nil)
-       (file-coding-system-for-read mule-no-coding-system)
-       (coding-system-for-read mule-no-coding-system))
-    (setq compressed 
-         (cond
-          ((file-exists-p fname)
-           (if (string-match "\\.\\(z\\|gz\\|Z\\)$" fname)
-               (case (intern (match-string 1 fname))
-                 ((z gz)
-                  (setq url-current-mime-headers (cons
-                                                  (cons
-                                                   "content-transfer-encoding"
-                                                   "gzip")
-                                                  url-current-mime-headers)))
-                 (Z
-                  (setq url-current-mime-headers (cons
-                                                  (cons
-                                                   "content-transfer-encoding"
-                                                   "compress")
-                                                  url-current-mime-headers))))
-             nil))
-          ((file-exists-p (concat fname ".Z"))
-           (setq fname (concat fname ".Z")
-                 url-current-mime-headers (cons (cons
-                                                 "content-transfer-encoding"
-                                                 "compress")
-                                                url-current-mime-headers)))
-          ((file-exists-p (concat fname ".gz"))
-           (setq fname (concat fname ".gz")
-                 url-current-mime-headers (cons (cons
-                                                 "content-transfer-encoding"
-                                                 "gzip")
-                                                url-current-mime-headers)))
-          ((file-exists-p (concat fname ".z"))
-           (setq fname (concat fname ".z")
-                 url-current-mime-headers (cons (cons
-                                                 "content-transfer-encoding"
-                                                 "gzip")
-                                                url-current-mime-headers)))
-          (t
-           (error "File not found %s" fname))))
-    (setq url-current-mime-encoding
-         (cdr (assoc "content-transfer-encoding" url-current-mime-headers)))
-    (apply 'insert-file-contents fname args)
-    (set-buffer-modified-p nil)))
-
-(defvar url-dired-minor-mode-map
-  (let ((map (make-sparse-keymap)))
-    (define-key map "\C-m" 'url-dired-find-file)
-    (if url-running-xemacs
-       (define-key map [button2] 'url-dired-find-file-mouse)
-      (define-key map [mouse-2] 'url-dired-find-file-mouse))
-    map)
-  "Keymap used when browsing directories.")
-
-(defvar url-dired-minor-mode nil
-  "Whether we are in url-dired-minor-mode")
-
-(make-variable-buffer-local 'url-dired-minor-mode)
-
-(defun url-dired-find-file ()
-  "In dired, visit the file or directory named on this line, using Emacs-W3."
-  (interactive)
-  (let ((filename (dired-get-filename)))
-    (cond ((string-match "/\\(address@hidden):\\(/.*\\)" filename)
-          (w3-fetch (concat "file://" (match-string 1 filename) (match-string 
2 filename))))
-         (t
-          (w3-open-local filename)))))
-
-(defun url-dired-find-file-mouse (event)
-  "In dired, visit the file or directory name you click on, using Emacs-W3."
-  (interactive "@e")
-    (if (event-point event)
-       (progn
-         (goto-char (event-point event))
-         (url-dired-find-file))))
-
-(defun url-dired-minor-mode (&optional arg)
-  "Minor mode for directory browsing with Emacs-W3."
-  (interactive "P")
-  (cond
-   ((null arg)
-    (setq url-dired-minor-mode (not url-dired-minor-mode)))
-   ((equal 0 arg)
-    (setq url-dired-minor-mode nil))
-   (t
-    (setq url-dired-minor-mode t))))
-
-(add-minor-mode 'url-dired-minor-mode " URL" url-dired-minor-mode-map)
-
-(defun url-format-directory (dir)
-  ;; Format the files in DIR into hypertext
-  (kill-buffer (current-buffer))
-  (find-file dir)
-  (url-dired-minor-mode t))
-
-(defun url-host-is-local-p (host)
-  "Return t iff HOST references our local machine."
-  (let ((case-fold-search t))
-    (or
-     (null host)
-     (string= "" host)
-     (equal (downcase host) (downcase (system-name)))
-     (and (string-match "^localhost$" host) t)
-     (and (not (string-match (regexp-quote ".") host))
-         (equal (downcase host) (if (string-match (regexp-quote ".")
-                                                  (system-name))
-                                    (substring (system-name) 0
-                                               (match-beginning 0))
-                                  (system-name)))))))
-
-(defun url-file-build-continuation (name)
-  (list 'url-file-asynch-callback
-       name (current-buffer)
-       url-current-callback-func url-current-callback-data))
-
-(defun url-file-asynch-callback (x y name buff func args &optional efs)
-  (if (featurep 'efs)
-      ;; EFS passes us an extra argument
-      (setq name buff
-           buff func
-           func args
-           args efs))
-  (cond
-   ((not name) nil)
-   ((not (file-exists-p name)) nil)
-   (t
-    (if (not buff)
-       (setq buff (generate-new-buffer " *url-asynch-file*")))
-    (set-buffer buff)
-    (url-insert-possibly-compressed-file name)
-    (condition-case ()
-       (delete-file name)
-      (error nil))))
-  (if func
-      (apply func args)
-    (url-sentinel (current-buffer) nil)))
-
-(defun url-cleanup-file (url)
-   "Clean up file URLs to remove questionable ftp stuff.
-Removes any leading slashes and 'localhost's from the file URL,
-and exchanges any | in the drive identifier with a :."
-   (if (null (string-match "file:\\(\\(/\\|localhost\\)+\\)+[a-zA-Z]\\([:|]\\)"
-                          url))
-       url
-     (let ((slash-start (match-beginning 1))
-          (slash-end (match-end 1))
-          (bar-start (match-beginning 3))
-          (bar-end (match-end 3)))
-       (concat (substring url 0 slash-start)
-              (substring url slash-end bar-start)
-              ":"
-              (substring url bar-end)))))
-
-(defun url-file (url)
-  ;; Find a file
-  (let* ((urlobj (url-generic-parse-url (url-cleanup-file url)))
-        (user (url-user urlobj))
-        (pass (url-password urlobj))
-        (site (url-host urlobj))
-        (port (url-port urlobj))
-        (site (if port (format "%s#%s" site port)))
-        (file (url-unhex-string (url-filename urlobj)))
-        (dest (url-target urlobj))
-        (filename (if (or user (not (url-host-is-local-p site)))
-                      (concat "/" (or user "anonymous") "@" site ":" file)
-                    (if (and (memq system-type
-                                   '(emx ms-dos windows-nt ms-windows))
-                             (string-match "^/[a-zA-Z]:/" file))
-                        (substring file 1)
-                      file)))
-        (pos-index (if url-directory-index-file
-                       (expand-file-name url-directory-index-file filename)))
-        uncompressed-filename viewer)
-    (url-clear-tmp-buffer)
-    (and user pass
-        (cond
-         ((featurep 'ange-ftp)
-          (ange-ftp-set-passwd site user pass))
-         ((or (featurep 'efs) (featurep 'efs-auto))
-          (efs-set-passwd site user pass))
-         (t
-          nil)))
-
-    (if (and url-current-object
-            (file-directory-p filename)
-            (not (string-match (format "%c$" directory-sep-char) filename)))
-       (url-set-filename url-current-object
-                         (format "%s%c" filename directory-sep-char)))
-
-    (if (and pos-index
-            (file-exists-p pos-index)
-            (file-readable-p pos-index))
-       (setq filename pos-index))
-
-    (setq uncompressed-filename (if (string-match "\\.\\(gz\\|Z\\|z\\)$" 
filename)
-                                   (substring filename 0 (match-beginning 0))
-                                 filename))
-    (setq url-current-mime-type (mm-extension-to-mime
-                                (url-file-extension uncompressed-filename)))
-    (setq viewer (mm-mime-info url-current-mime-type))
-
-    (cond
-     ((file-directory-p filename)
-      (if (not (string-match "/$" filename))
-         (setq filename (concat filename "/")))
-      (if (not (string-match "/$" file))
-         (setq file (concat file "/")))
-      (url-set-filename urlobj file)
-      (url-format-directory filename))
-     (url-be-asynchronous
-      (cond
-       ((file-exists-p filename) nil)
-       ((file-exists-p (concat filename ".Z"))
-       (setq filename (concat filename ".Z")))
-       ((file-exists-p (concat filename ".gz"))
-       (setq filename (concat filename ".gz")))
-       ((file-exists-p (concat filename ".z"))
-       (setq filename (concat filename ".z")))
-       (t nil))
-      (let* ((extension (url-file-extension filename))
-            (new (mm-generate-unique-filename (and (> (length extension) 0)
-                                                   (concat "%s." extension)))))
-       (cond
-        ((url-host-is-local-p site)
-         (if (and (file-exists-p filename)
-                  (file-readable-p filename))
-             (url-insert-possibly-compressed-file filename))
-         (if (featurep 'efs)
-             (url-file-asynch-callback nil nil nil nil nil
-                                       url-current-callback-func
-                                       url-current-callback-data)
-           (url-file-asynch-callback nil nil nil nil
-                                     url-current-callback-func
-                                     url-current-callback-data)))
-        ((featurep 'ange-ftp)
-         (ange-ftp-copy-file-internal filename (expand-file-name new) t
-                                      nil t
-                                      (url-file-build-continuation new)
-                                      t))
-        ((or (featurep 'efs) (featurep 'efs-auto))
-         (autoload 'efs-copy-file-internal "efs")
-         (efs-copy-file-internal filename (efs-ftp-path filename)
-                                 new (efs-ftp-path new)
-                                 t nil 0
-                                 (url-file-build-continuation new)
-                                 0 nil)))))
-     (t
-      (let ((errobj nil))
-       (if (or url-source              ; Need it in a buffer
-               (and (symbolp viewer)
-                    (not (eq viewer 'w3-default-local-file)))
-               (stringp viewer))
-           (condition-case errobj
-               (url-insert-possibly-compressed-file filename t)
-             (error
-              (url-save-error errobj)
-              (url-retrieve (concat "www://error/nofile/" file))))))))))
-
-(fset 'url-ftp 'url-file)
-
-(provide 'url-file)
diff --git a/lisp/url-gopher.el b/lisp/url-gopher.el
deleted file mode 100644
index c554470..0000000
--- a/lisp/url-gopher.el
+++ /dev/null
@@ -1,469 +0,0 @@
-;;; url-gopher.el --- Gopher Uniform Resource Locator retrieval code
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:09 $
-;; Version: $Revision: 1.1 $
-;; Keywords: comm, data, processes
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'url-vars)
-(require 'url-parse)
-
-(defun url-grok-gopher-href (url)
-  "Return a list of attributes from a gopher url.  List is of the
-type: host port selector-string MIME-type extra-info"
-  (let (host                           ; host name
-       port                            ; Port #
-       selector                        ; String to send to gopher host
-       type                            ; MIME type
-       extra                           ; Extra information
-       x                               ; Temporary storage for host/port
-       y                               ; Temporary storage for selector
-       ylen
-       )
-    (or (string-match "gopher:/*\\([^/]+\\)\\(/*\\)" url)
-       (error "Can't understand url %s" url))
-    (setq x (url-match url 1)          ; The host (and possible port #)
-         ylen (- (length url) (match-end 2))
-         y (if (= ylen 0)              ; The selector (and possible type)
-               ""
-               (url-unhex-string (substring url (- ylen)))))
-
-    ;First take care of the host/port/gopher+ information from the url
-    ;A + after the port # (host:70+) specifies a gopher+ link
-    ;A ? after the port # (host:70?) specifies a gopher+ ask block
-    (if (string-match "^\\([^:]+\\):\\([0-9]+\\)\\([?+]*\\)" x)
-       (setq host (url-match x 1)
-             port (url-match x 2)
-             extra (url-match x 3))
-      (setq host x
-           port "70"
-           extra nil))
-    (cond
-     ((equal extra "")  (setq extra nil))
-     ((equal extra "?") (setq extra 'ask-block))
-     ((equal extra "+") (setq extra 'gopher+)))
-
-    ; Next, get the type/get rid of the Mosaic double-typing. Argh.
-    (setq x (string-to-char y)         ; Get gopher type
-         selector (if (or url-use-hypertext-gopher
-                          (< 3 (length y)))
-                      y                ; Get the selector string
-                    (substring y 1 nil))
-         type (cdr (assoc x url-gopher-to-mime)))
-    (list host port (or selector "") type extra)))
-
-
-(defun url-convert-ask-to-form (ask)
-  ;; Convert a Gopher+ ASK block into a form.  Returns a string to be
-  ;; inserted into a buffer to create the form."
-  (let ((form (concat "<form enctype=application/gopher-ask-block\n"
-                     "      method=\"GOPHER-ASK\">\n"
-                     " <ul plain>\n"))
-       (type "")
-       (x 0)
-       (parms ""))
-    (while (string-match "^\\([^:]+\\): +\\(.*\\)" ask)
-      (setq parms (url-match ask 2)
-           type (url-strip-leading-spaces (downcase (url-match ask 1)))
-           x (1+ x)
-           ask (substring ask (if (= (length ask) (match-end 0))
-                                  (match-end 0) (1+ (match-end 0))) nil))
-      (cond
-       ((string= "note" type) (setq form (concat form parms)))
-       ((or (string= "ask" type)
-           (string= "askf" type)
-           (string= "choosef" type))
-       (setq parms (url-string-to-tokens parms ?\t)
-             form (format "%s\n<li>%s<input name=\"%d\" value=\"%s\">"
-                          form (or (nth 0 parms) "Text:")
-                          x (or (nth 1 parms) ""))))
-       ((string= "askp" type)
-       (setq parms (mapcar 'car (nreverse (url-split parms "\t")))
-             form (format
-                   "%s\n<li>%s<input name=\"%d\" type=\"password\" 
value=\"%s\">"
-                   form                           ; Earlier string
-                   (or (nth 0 parms) "Password:") ; Prompt
-                   x                              ; Name
-                   (or (nth 1 parms) "")          ; Default value
-                   )))
-       ((string= "askl" type)
-       (setq parms (url-string-to-tokens parms ?\t)
-             form (format "%s\n<li>%s<textarea name=\"%d\">%s</textarea>"
-                          form                  ; Earlier string
-                          (or (nth 0 parms) "") ; Prompt string
-                          x                     ; Name
-                          (or (nth 1 parms) "") ; Default value
-                          )))
-       ((or (string= "select" type)
-           (string= "choose" type))
-       (setq parms (url-string-to-tokens parms ?\t)
-             form (format "%s\n<li>%s<select name=\"%d\">" form (car parms) x)
-             parms (cdr parms))
-       (if (null parms) (setq parms (list "Yes" "No")))
-       (while parms
-         (setq form (concat form "<option>" (car parms) "\n")
-               parms (cdr parms)))
-       (setq form (concat form "</select>")))))
-    (concat form "\n<li><input type=\"SUBMIT\""
-           " value=\"Submit Gopher+ Ask Block\"></ul></form>")))
-
-(defun url-grok-gopher-line ()
-  "Return a list of link attributes from a gopher string.  Order is:
-title, type, selector string, server, port, gopher-plus?"
-  (let (type selector server port gopher+ st nd)
-    (beginning-of-line)
-    (setq st (point))
-    (end-of-line)
-    (setq nd (point))
-    (save-excursion
-      (mapcar (function
-              (lambda (var)
-                (goto-char st)
-                (skip-chars-forward "^\t\n" nd)
-                (set-variable var (buffer-substring st (point)))
-                (setq st (min (point-max) (1+ (point))))))
-             '(type selector server port))
-      (setq gopher+ (and (/= (1- st) nd) (buffer-substring st nd)))
-      (list type (concat (substring type 0 1) selector) server port gopher+))))
-
-(defun url-format-gopher-link (gophobj)
-  ;; Insert a gopher link as an <A> tag
-  (let ((title (nth 0 gophobj))
-       (ref   (nth 1 gophobj))
-       (type  (if (> (length (nth 0 gophobj)) 0)
-                  (substring (nth 0 gophobj) 0 1) ""))
-       (serv  (nth 2 gophobj))
-       (port  (nth 3 gophobj))
-       (plus  (nth 4 gophobj))
-       (desc  nil))
-    (if (and (equal type "")
-            (> (length title) 0))
-       (setq type (substring title 0 1)))
-    (setq title (and title (substring title 1 nil))
-         title (mapconcat
-                (function
-                 (lambda (x)
-                   (cond
-                    ((= x ?&) "&amp;")
-                    ((= x ?<) "&lt;");
-                    ((= x ?>) "&gt;");
-                    (t (char-to-string x))))) title "")
-         desc (or (cdr (assoc type url-gopher-labels)) "(UNK)"))
-    (cond
-     ((null ref) "")
-     ((equal type "8")
-      (format "<LI> %s <A HREF=\"telnet://%s:%s/\">%s</A>\n"
-             desc serv port title))
-     ((equal type "T")
-      (format "<LI> %s <A HREF=\"tn3270://%s:%s/\">%s</A>\n"
-             desc serv port title))
-     (t (format "<LI> %s <A METHODS=%s HREF=\"gopher://%s:%s/%s\";>%s</A>\n"
-               desc type serv (concat port plus)
-               (url-hexify-string ref) title)))))
-
-(defun url-gopher-clean-text (&optional buffer)
-  "Decode text transmitted by gopher.
-0. Delete status line.
-1. Delete `^M' at end of line.
-2. Delete `.' at end of buffer (end of text mark).
-3. Delete `.' at beginning of line.   (does gopher want this?)"
-  (set-buffer (or buffer url-working-buffer))
-  ;; Insert newline at end of buffer.
-  (goto-char (point-max))
-  (if (not (bolp))
-      (insert "\n"))
-  ;; Delete `^M' at end of line.
-  (goto-char (point-min))
-  (while (re-search-forward "\r[^\n]*$" nil t)
-    (replace-match ""))
-;  (goto-char (point-min))
-;  (while (not (eobp))
-;    (end-of-line)
-;    (if (= (preceding-char) ?\r)
-;       (delete-char -1))
-;    (forward-line 1)
-;    )
-  ;; Delete `.' at end of buffer (end of text mark).
-  (goto-char (point-max))
-  (forward-line -1)                     ;(beginning-of-line)
-  (while (looking-at "^\\.$")
-    (delete-region (point) (progn (forward-line 1) (point)))
-    (forward-line -1))
-  ;; Replace `..' at beginning of line with `.'.
-  (goto-char (point-min))
-  ;; (replace-regexp "^\\.\\." ".")
-  (while (search-forward "\n.." nil t)
-    (delete-char -1))
-  )
-
-(defun url-parse-gopher (&optional buffer)
-  (save-excursion
-    (set-buffer (or buffer url-working-buffer))
-    (url-replace-regexp "^\r*$\n" "")
-    (url-replace-regexp "^\\.\r*$\n" "")
-    (url-gopher-clean-text (current-buffer))
-    (goto-char (point-max))
-    (skip-chars-backward "\n\r\t ")
-    (delete-region (point-max) (point))
-    (insert "\n")
-    (goto-char (point-min))
-    (skip-chars-forward " \t\n")
-    (delete-region (point-min) (point))
-    (let* ((len (count-lines (point-min) (point-max)))
-          (objs nil)
-          (i 0))
-      (while (not (eobp))
-       (setq objs (cons (url-grok-gopher-line) objs)
-             i (1+ i))
-       (url-lazy-message "Converting gopher listing... %d/%d (%d%%)"
-                         i len (url-percentage i len))
-                                               
-       (forward-line 1))
-      (setq objs (nreverse objs))
-      (erase-buffer)
-      (insert "<title>"
-             (cond
-              ((or (string= "" (url-filename url-current-object))
-                   (string= "1/" (url-filename url-current-object))
-                   (string= "1" (url-filename url-current-object)))
-               (concat "Gopher root at " (url-host url-current-object)))
-              ((string-match (format "^[%s]+/" url-gopher-types)
-                             (url-filename url-current-object))
-               (substring (url-filename url-current-object) 2 nil))
-              (t (url-filename url-current-object)))
-             "</title><ol>"
-             (mapconcat 'url-format-gopher-link objs "")
-             "</ol>"))))
-
-(defun url-gopher-retrieve (host port selector &optional wait-for)
-  ;; Fetch a gopher object and don't mess with it at all
-  (let ((proc (url-open-stream "*gopher*" url-working-buffer
-                             host (if (stringp port) (string-to-int port)
-                                    port)))
-       (len nil)
-       (parsed nil))
-    (url-clear-tmp-buffer)
-    (if (> (length selector) 0)
-       (setq selector (substring selector 1 nil)))
-    (if (not (processp proc))
-       nil
-      (save-excursion
-       (set-process-sentinel proc 'ignore)
-       (process-send-string proc (concat selector "\r\n"))
-       (while (and (or (not wait-for)
-                       (progn
-                         (goto-char (point-min))
-                         (not (re-search-forward wait-for nil t))))
-                   (memq (url-process-status proc) '(run open)))
-         (if (not parsed)
-             (cond
-              ((and (eq ?+ (char-after 1))
-                    (memq (char-after 2)
-                          (list ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9)))
-               (setq parsed (copy-marker 2)
-                     len (read parsed))
-               (delete-region (point-min) parsed))
-              ((and (eq ?+ (char-after 1))
-                    (eq ?- (char-after 2)))
-               (setq len nil
-                     parsed t)
-               (goto-char (point-min))
-               (delete-region (point-min) (progn
-                                            (end-of-line)
-                                            (point))))
-              ((and (eq ?- (char-after 1))
-                    (eq ?- (char-after 2)))
-               (setq parsed t
-                     len nil)
-               (goto-char (point-min))
-               (delete-region (point-min) (progn
-                                            (end-of-line)
-                                            (point))))))
-         (if len (url-lazy-message "Reading... %d of %d bytes (%d%%)"
-                                   (point-max)
-                                   len
-                                   (url-percentage (point-max) len))
-           (url-lazy-message "Read... %d bytes." (point-max)))
-         (url-accept-process-output proc))
-       (condition-case ()
-           (url-kill-process proc)
-         (error nil))
-       (while (looking-at "\r") (delete-char 1))))))
-
-(defun url-do-gopher-cso-search (descr)
-  ;; Do a gopher CSO search and return a plaintext document
-  (let ((host (nth 0 descr))
-       (port (nth 1 descr))
-       (file (nth 2 descr))
-       search-type search-term)
-    (string-match "search-by=\\([^&]+\\)" file)
-    (setq search-type (url-match file 1))
-    (string-match "search-term=\\([^&]+\\)" file)
-    (setq search-term (url-match file 1))
-    (url-gopher-retrieve host port (format "2query %s=%s"
-                                         search-type search-term) "^[2-9]")
-    (goto-char (point-min))
-    (url-replace-regexp "^-[0-9][0-9][0-9]:[0-9]*:" "")
-    (url-replace-regexp "^[^15][0-9][0-9]:.*" "")
-    (url-replace-regexp "^[15][0-9][0-9]:\\(.*\\)" "<H1>\\1</H1>&ensp;<PRE>")
-    (goto-char (point-min))
-    (insert "<title>Results of CSO search</title>\n"
-           "<h1>" search-type " = " search-term "</h1>\n")
-    (goto-char (point-max))
-    (insert "</pre>")))
-
-(defun url-do-gopher (descr)
-  ;; Fetch a gopher object
-  (let ((host (nth 0 descr))
-       (port (nth 1 descr))
-       (file (nth 2 descr))
-       (type (nth 3 descr))
-       (extr (nth 4 descr))
-       parse-gopher)
-    (cond
-     ((and                             ; Gopher CSO search
-       (equal type "www/gopher-cso-search")
-       (string-match "search-by=" file)) ; With a search term in it
-      (url-do-gopher-cso-search descr)
-      (setq type "text/html"))
-     ((equal type "www/gopher-cso-search") ; Blank CSO search
-      (url-clear-tmp-buffer)
-      (insert "<html>\n"
-             " <head>\n"
-             "  <title>CSO Search</title>\n"
-             " </head>\n"
-             " <body>\n"
-             "  <div>\n"
-             "   <h1>This is a CSO search</h1>\n"
-             "   <hr>\n"
-             "   <form>\n"
-             "    <ul>\n"
-             "     <li> Search by: <select name=\"search-by\">\n"
-             "                      <option>Name\n"
-             "                      <option>Phone\n"
-             "                      <option>Email\n"
-             "                      <option>Address\n"
-             "                     </select>\n"
-             "     <li> Search for: <input name=\"search-term\">\n"
-             "     <li> <input type=\"submit\" value=\"Submit query\">\n"
-             "    </ul>\n"
-             "   </form>\n"
-             "  </div>\n"
-             " </body>\n"
-             "</html>\n"
-             "<!-- Automatically generated by URL v" url-version " -->\n")
-      (setq type "text/html"
-           parse-gopher t))
-     ((and
-       (equal type "www/gopher-search")        ; Ack!  Mosaic-style search href
-       (string-match "\t" file))       ; and its got a search term in it!
-      (url-gopher-retrieve host port file)
-      (setq type "www/gopher"
-           parse-gopher t))
-     ((and
-       (equal type "www/gopher-search")        ; Ack!  Mosaic-style search href
-       (string-match "\\?" file))      ; and its got a search term in it!
-      (setq file (concat (substring file 0 (match-beginning 0)) "\t"
-                        (substring file (match-end 0) nil)))
-      (url-gopher-retrieve host port file)
-      (setq type "www/gopher"
-           parse-gopher t))
-     ((equal type "www/gopher-search") ; Ack!  Mosaic-style search href
-      (setq type "text/html"
-           parse-gopher t)
-      (url-clear-tmp-buffer)
-      (insert "<html>\n"
-             " <head>\n"
-             "  <title>Gopher Server</title>\n"
-             " </head>\n"
-             " <body>\n"
-             "  <div>\n"
-             "   <h1>Searchable Gopher Index</h1>\n"
-             "   <hr>\n"
-             "   <p>\n"
-             "    Enter the search keywords below\n"
-             "   </p>"
-             "   <form enctype=\"application/x-gopher-query\">\n"
-             "    <input name=\"internal-gopher\">\n"
-             "   </form>\n"
-             "   <hr>\n"
-             "  </div>\n"
-             " </body>\n"
-             "</html>\n"
-             "<!-- Automatically generated by URL v" url-version " -->\n"))
-     ((null extr)                      ; Normal Gopher link
-      (url-gopher-retrieve host port file)
-      (setq parse-gopher t))
-     ((eq extr 'gopher+)               ; A gopher+ link
-      (url-gopher-retrieve host port (concat file "\t+"))
-      (setq parse-gopher t))
-     ((eq extr 'ask-block)             ; A gopher+ interactive query
-      (url-gopher-retrieve host port (concat file "\t!")) ; Fetch the info
-      (goto-char (point-min))
-      (cond
-       ((re-search-forward "^\\+ASK:[ \t\r]*" nil t) ; There is an ASK
-       (let ((x (buffer-substring (1+ (point))
-                                  (or (re-search-forward "^\\+[^:]+:" nil t)
-                                      (point-max)))))
-         (erase-buffer)
-         (insert (url-convert-ask-to-form x))
-         (setq type "text/html" parse-gopher t)))
-       (t (setq parse-gopher t)))))
-    (if (or (equal type "www/gopher")
-           (equal type "text/plain")
-           (equal file "")
-           (equal type "text/html"))
-       (url-gopher-clean-text))
-    (if (and parse-gopher (or (equal type "www/gopher")
-                             (equal file "")))
-       (progn
-         (url-parse-gopher)
-         (setq type "text/html"
-               url-current-mime-viewer (mm-mime-info type nil 5))))
-    (setq url-current-mime-type (or type "text/plain")
-         url-current-mime-viewer (mm-mime-info type nil 5))))
-
-(defun url-gopher (url)
-  ;; Handle gopher URLs
-  (let ((descr (url-grok-gopher-href url)))
-    (cond
-     ((or (not (member (nth 1 descr) url-bad-port-list))
-         (funcall
-          url-confirmation-func
-          (format "Warning!  Trying to connect to port %s - continue? "
-                  (nth 1 descr))))
-      (if url-use-hypertext-gopher
-         (url-do-gopher descr)
-       (gopher-dispatch-object (vector (if (= 0 (length (nth 2 descr)))
-                                           ?1
-                                         (string-to-char (nth 2 descr)))
-                                       (nth 2 descr) (nth 2 descr)
-                                       (nth 0 descr)
-                                       (string-to-int (nth 1 descr)))
-                               (current-buffer))))
-     (t
-      (ding)
-      (url-warn 'security "Aborting connection to bad port...")))))
-
-(provide 'url-gopher)
diff --git a/lisp/url-gw.el b/lisp/url-gw.el
deleted file mode 100644
index 81a2aed..0000000
--- a/lisp/url-gw.el
+++ /dev/null
@@ -1,259 +0,0 @@
-;;; url-gw.el --- Gateway munging for URL loading
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:09 $
-;; Version: $Revision: 1.1 $
-;; Keywords: comm, data, processes
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1997, 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(require 'cl)
-
-(defgroup url-gateway nil
-  "URL gateway variables"
-  :group 'url)
-
-(defcustom url-gateway-local-host-regexp nil
-  "*A regular expression specifying local hostnames/machines."
-  :type '(choice (const nil) regexp)
-  :group 'url-gateway)
-
-(defcustom url-gateway-prompt-pattern
-  "^[^#$%>;]*[#$%>;] *" ;; "bash\\|\$ *\r?$\\|> *\r?"
-  "*A regular expression matching a shell prompt."
-  :type 'regexp
-  :group 'url-gateway)
-
-(defcustom url-gateway-rlogin-host nil
-  "*What hostname to actually rlog into before doing a telnet."
-  :type '(choice (const nil) string)
-  :group 'url-gateway)
-
-(defcustom url-gateway-rlogin-user-name nil
-  "*Username to log into the remote machine with when using rlogin."
-  :type '(choice (const nil) string)
-  :group 'url-gateway)
-
-(defcustom url-gateway-rlogin-parameters '("telnet" "-8")
-  "*Parameters to `url-open-rlogin'.
-This list will be used as the parameter list given to rsh."
-  :type '(repeat string)
-  :group 'url-gateway)
-
-(defcustom url-gateway-telnet-host nil
-  "*What hostname to actually login to before doing a telnet."
-  :type '(choice (const nil) string)
-  :group 'url-gateway)
-
-(defcustom url-gateway-telnet-parameters '("exec" "telnet" "-8")
-  "*Parameters to `url-open-telnet'.
-This list will be executed as a command after logging in via telnet."
-  :type '(repeat string)
-  :group 'url-gateway)
-
-(defcustom url-gateway-telnet-login-prompt "^\r*.?login:"
-  "*Prompt that tells us we should send our username when loggin in w/telnet."
-  :type 'regexp
-  :group 'url-gateway)
-
-(defcustom url-gateway-telnet-password-prompt "^\r*.?password:"
-  "*Prompt that tells us we should send our password when loggin in w/telnet."
-  :type 'regexp
-  :group 'url-gateway)
-
-(defcustom url-gateway-telnet-user-name nil
-  "User name to log in via telnet with."
-  :type '(choice (const nil) string)
-  :group 'url-gateway)
-
-(defcustom url-gateway-telnet-password nil
-  "Password to use to log in via telnet with."
-  :type '(choice (const nil) string)
-  :group 'url-gateway)
-
-(defcustom url-gateway-broken-resolution nil
-  "*Whether to use nslookup to resolve hostnames.
-This should be used when your version of Emacs cannot correctly use DNS,
-but your machine can.  This usually happens if you are running a statically
-linked Emacs under SunOS 4.x"
-  :type 'boolean
-  :group 'url-gateway)
-
-(defcustom url-gateway-nslookup-program "nslookup"
-  "*If non-NIL then a string naming nslookup program."
-  :type '(choice (const :tag "None" :value nil) string)
-  :group 'url-gateway)
-
-;; Stolen from ange-ftp
-;;;###autoload
-(defun url-gateway-nslookup-host (host)
-  "Attempt to resolve the given HOSTNAME using nslookup if possible."
-  (interactive "sHost:  ")
-  (if url-gateway-nslookup-program
-      (let ((proc (start-process " *nslookup*" " *nslookup*"
-                                url-gateway-nslookup-program host))
-           (res host))
-       (process-kill-without-query proc)
-       (save-excursion
-         (set-buffer (process-buffer proc))
-         (while (memq (process-status proc) '(run open))
-           (accept-process-output proc))
-         (goto-char (point-min))
-         (if (re-search-forward "Name:.*\nAddress: *\\(.*\\)$" nil t)
-             (setq res (buffer-substring (match-beginning 1)
-                                         (match-end 1))))
-         (kill-buffer (current-buffer)))
-       res)
-    host))
-
-;; Stolen from red gnus nntp.el
-(defun url-wait-for-string (regexp proc)
-  "Wait until string arrives in the buffer."
-  (let ((buf (current-buffer)))
-    (goto-char (point-min))
-    (while (not (re-search-forward regexp nil t))
-      (accept-process-output proc)
-      (set-buffer buf)
-      (goto-char (point-min)))))
-
-;; Stolen from red gnus nntp.el
-(defun url-open-rlogin (name buffer host service)
-  "Open a connection using rsh."
-  (if (not (stringp service))
-      (setq service (int-to-string service)))
-  (let ((proc (if url-gateway-rlogin-user-name
-                 (start-process
-                  name buffer "rsh"
-                  url-gateway-rlogin-host "-l" url-gateway-rlogin-user-name
-                  (mapconcat 'identity
-                             (append url-gateway-rlogin-parameters
-                                     (list host service)) " "))
-               (start-process
-                name buffer "rsh" url-gateway-rlogin-host
-                (mapconcat 'identity
-                           (append url-gateway-rlogin-parameters
-                                   (list host service))
-                           " ")))))
-    (set-buffer buffer)
-    (url-wait-for-string "^\r*200" proc)
-    (beginning-of-line)
-    (delete-region (point-min) (point))
-    proc))
-
-;; Stolen from red gnus nntp.el
-(defun url-open-telnet (name buffer host service)
-  (if (not (stringp service))
-      (setq service (int-to-string service)))
-  (save-excursion
-    (set-buffer (get-buffer-create buffer))
-    (erase-buffer)
-    (let ((proc (start-process name buffer "telnet" "-8"))
-         (case-fold-search t))
-      (when (memq (process-status proc) '(open run))
-       (process-send-string proc "set escape \^X\n")
-       (process-send-string proc (concat
-                                  "open " url-gateway-telnet-host "\n"))
-       (url-wait-for-string url-gateway-telnet-login-prompt proc)
-       (process-send-string
-        proc (concat
-              (or url-gateway-telnet-user-name
-                  (setq url-gateway-telnet-user-name (read-string "login: ")))
-              "\n"))
-       (url-wait-for-string url-gateway-telnet-password-prompt proc)
-       (process-send-string
-        proc (concat
-              (or url-gateway-telnet-password
-                  (setq url-gateway-telnet-password
-                        (funcall url-passwd-entry-func "Password: ")))
-              "\n"))
-       (erase-buffer)
-       (url-wait-for-string url-gateway-prompt-pattern proc)
-       (process-send-string
-        proc (concat (mapconcat 'identity
-                                (append url-gateway-telnet-parameters
-                                        (list host service)) " ") "\n"))
-       (url-wait-for-string "^\r*Escape character.*\r*\n+" proc)
-       (delete-region (point-min) (match-end 0))
-       (process-send-string proc "\^]\n")
-       (url-wait-for-string "^telnet" proc)
-       (process-send-string proc "mode character\n")
-       (accept-process-output proc 1)
-       (sit-for 1)
-       (goto-char (point-min))
-       (forward-line 1)
-       (delete-region (point) (point-max)))
-      proc)))
-
-;;;###autoload
-(defun url-open-stream (name buffer host service)
-  "Open a stream to a host"
-  (let ((gw-method (if (and url-gateway-local-host-regexp
-                           (not (eq 'ssl url-gateway-method))
-                           (string-match
-                            url-gateway-local-host-regexp
-                            host))
-                      'native
-                    url-gateway-method))
-       ;; This hack is for OS/2 Emacs so that it will not do bogus CRLF
-       ;; conversions while trying to be 'helpful'
-       (tcp-binary-process-output-services (if (stringp service)
-                                               (list service)
-                                             (list service
-                                                   (int-to-string service))))
-
-       ;; An attempt to deal with denied connections, and attempt to reconnect
-       (cur-retries 0)
-       (retry t)
-       (errobj nil)
-       (conn nil))
-
-    ;; If the user told us to do DNS for them, do it.
-    (if url-gateway-broken-resolution
-       (setq host (url-gateway-nslookup-host host)))
-
-    (condition-case errobj
-       (setq conn (case gw-method
-                    (ssl
-                     (open-ssl-stream name buffer host service))
-                    ((tcp native)
-                     (and (eq 'tcp gw-method) (require 'tcp))
-                     (open-network-stream name buffer host service))
-                    (socks
-                     (socks-open-network-stream name buffer host service))
-                    (telnet
-                     (url-open-telnet name buffer host service))
-                    (rlogin
-                     (url-open-rlogin name buffer host service))
-                    (otherwise
-                     (error "Bad setting of url-gateway-method: %s"
-                            url-gateway-method))))
-      (error
-       (insert "Could not contact host: " host " / "
-              (if (stringp service) service (int-to-string service))
-              "\nAttempted using gateway method: "
-              (symbol-name gw-method)
-              "\n---- Error was: ----\n")
-       (setq url-current-mime-headers '(("content-type" . "text/plain")))
-       (display-error errobj (current-buffer))))
-    (if conn
-       (mule-inhibit-code-conversion conn))
-    conn))
-
-(provide 'url-gw)
diff --git a/lisp/url-hash.el b/lisp/url-hash.el
deleted file mode 100644
index 4e5142f..0000000
--- a/lisp/url-hash.el
+++ /dev/null
@@ -1,123 +0,0 @@
-;;; url-hash.el --- Hashtable functions
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:09 $
-;; Version: $Revision: 1.1 $
-;; Keywords: lisp
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1995,1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;; Hash tables
-(eval-when-compile
-  (require 'cl)
-  (load-library "cl-extra"))
-
-(cond
- ((and (fboundp 'maphash) (subrp (symbol-function 'maphash)))
-    ;; Builtins!
-  (defun url-puthash (key val table)
-    (let ((sym (if (stringp key) (intern key) key)))
-      (puthash sym val table)))
-
-  (defun url-gethash (key table &optional default)
-    (let ((sym (if (stringp key) (intern-soft key) key)))
-      (if (not sym)
-         default
-       (gethash sym table))))
-
-  (mapcar (function
-          (lambda (sym)
-            (let ((new-sym (intern (format "url-%s" sym))))
-              (defalias new-sym sym))))
-         '(make-hashtable 
-           make-key-weak-hashtable
-           make-value-weak-hashtable
-           make-weak-hashtable
-           hashtablep
-           clrhash
-           maphash
-           copy-hashtable)))
- (t
-  (defconst url-hashtable-primes
-    '(13 29 37 47 59 71 89 107 131 163 197 239 293 353 431 521 631 761 919
-        1103 1327 1597 1931 2333 2801 3371 4049 4861 5839 7013 8419 10103
-        12143 14591 17519 21023 25229 30293 36353 43627 52361 62851 75431
-        90523 108631 130363 156437 187751 225307 270371 324449 389357 467237
-        560689 672827 807403 968897 1162687 1395263 1674319 2009191 2411033
-        2893249)
-    "A list of some good prime #s to use as  sizes for hashtables.")
-
-  (defun url-make-hashtable (size)
-    "Make a hashtable of initial size SIZE"
-    (if (not size) (setq size 37))
-    (if (not (memq size url-hashtable-primes))
-       ;; Find a suitable prime # to use as the hashtable size
-       (let ((primes url-hashtable-primes))
-         (while (<= (car primes) size)
-           (setq primes (cdr primes)))
-         (setq size (car primes))))
-    (make-vector (or size 2893249) 0))
-
-  (fset 'url-make-key-weak-hashtable 'url-make-hashtable)
-  (fset 'url-make-value-weak-hashtable 'url-make-hashtable)
-  (fset 'url-make-weak-hashtable 'url-make-hashtable)
-
-  (defun url-hashtablep (obj)
-    "Return t if OBJ is a hashtable, else nil."
-    (vectorp obj))
-
-  (defun url-puthash (key val table)
-    "Hash KEY to VAL in TABLE."
-    (let ((sym (intern (if (stringp key) key (prin1-to-string key)) table)))
-      (put sym 'val val)
-      (put sym 'key key)))
-
-  (defun url-gethash (key table &optional default)
-    "Find hash value for KEY in TABLE.
-If there is no corresponding value, return DEFAULT (defaults to nil)."
-    (let ((sym (intern-soft (if (stringp key)
-                               key
-                             (prin1-to-string key)) table)))
-      (or (and sym (get sym 'val))
-         default)))
-
-  (put 'url-gethash 'sysdep-defined-this t)
-
-  (defun url-clrhash (table)
-    "Flush TABLE"
-    (fillarray table 0))
-
-  (defun url-maphash (function table)
-    "Map FUNCTION over entries in TABLE, calling it with two args,
-each key and value in the table."
-    (mapatoms
-     (function
-      (lambda (sym)
-       (funcall function (get sym 'key) (get sym 'val)))) table))
-
-  (defun url-copy-hashtable (old-table)
-    "Make a new hashtable which contains the same keys and values
-as the given table.  The keys and values will not themselves be copied."
-    (copy-sequence old-table))
-  ))
-
-(provide 'url-hash)
diff --git a/lisp/url-hotlist.el b/lisp/url-hotlist.el
new file mode 100644
index 0000000..4a9ab06
--- /dev/null
+++ b/lisp/url-hotlist.el
@@ -0,0 +1,105 @@
+;;; url-hotlist.el --- URL interface to bookmarks
+;; Author: $Author: wmperry $
+;; Created: $Date: 1999/12/05 08:35:52 $
+;; Version: $Revision: 1.1 $
+;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1999 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'url-util)
+(require 'url-parse)
+(require 'w3-hot)
+
+(defun url-hotlist-html-generator (node)
+  (cond
+   ((stringp node)
+    ;; Top-level node...
+    (insert " <h1 align=\"center\"> " node " </h1>\n"))
+   ((stringp (cdr node))
+    ;; A real hyperlink, insert it into the buffer
+    (insert (format "   <dd> <a href=\"%s\">%s</a>\n" (cdr node) (car node))))
+   (t
+    ;; A submenu
+    (insert " <dl>\n   <dt><b>" (car node) "</b>\n")
+    (mapc 'url-hotlist-html-generator (cdr node))
+    (insert " </dl>\n"))))
+
+(defun url-hotlist (url)
+  "URL-based interface onto Emacs/W3 hotlists."
+  (let ((action (url-filename url))
+       (func nil)
+       (query-args nil))
+    (if (string-match (eval-when-compile (regexp-quote "?")) action)
+       (setq action (substring action 0 (match-beginning 0))
+             query-args (url-parse-query-string (substring (url-filename url) 
(match-end 0)) t)))
+    (setq func (intern (downcase (format "url-hotlist-%s" action))))
+    (save-excursion
+      (set-buffer (generate-new-buffer " *w3-hotlist-url*"))
+      (insert "Content-type: text/html\n\n")
+      (if (fboundp func)
+         (funcall func query-args)
+       (insert "<html>\n"
+               " <head>\n"
+               "  <title>Unknown hotlist action</title>\n"
+               " </head>\n"
+               " <body>\n"
+               "  <p>\n"
+               "   Unknown hotlist URL action <b>" action "</b>\n"
+               "  </p>\n"
+               " </body>\n"
+               "</html>\n"))
+      (current-buffer))))
+
+(defun url-hotlist-view (query-args)
+  (insert "<html>\n"
+         " <head>\n"
+         "  <title>Hotlist View</title>\n"
+         " </head>\n"
+         " <body>\n")
+  (mapc 'url-hotlist-html-generator w3-hotlist)
+  (insert " </body>\n"
+         "</html>\n"))  
+
+(defun url-hotlist-search (query-args)
+  (let ((regexp (cdr-safe (assoc "regexp" query-args)))
+       (hot-alist (w3-hot-convert-to-alist w3-hotlist))
+       (matches nil))
+    (insert "<html>\n"
+           " <head>\n"
+           "  <title>Hotlist search results</title>\n"
+           " </head>\n"
+           " <body>\n")
+    (if (not regexp)
+       (insert "  <h3>Malformed search URL</h3>\n")
+      (insert "  <p>Search results for:<br> <tt>" (mapconcat 'identity regexp 
"<br>\n")
+             "</tt></h3>\n"
+             "  <ul>\n")
+      (mapc (lambda (node)
+             (mapc (lambda (r)
+                     (if (string-match r (car node))
+                         (insert (format "   <li> <a href=\"%s\">%s</a>\n" 
(cdr node) (car node))))) regexp))
+           hot-alist)
+      (insert "  </ul>\n"))
+    (insert " </body>\n"
+           "</html>\n")))
+
+(provide 'url-hotlist)
diff --git a/lisp/url-http.el b/lisp/url-http.el
deleted file mode 100644
index 505f011..0000000
--- a/lisp/url-http.el
+++ /dev/null
@@ -1,607 +0,0 @@
-;;; url-http.el --- HTTP Uniform Resource Locator retrieval code
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/09 19:56:32 $
-;; Version: $Revision: 1.5 $
-;; Keywords: comm, data, processes
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'url-vars)
-(require 'url-parse)
-(require 'url-cookie)
-(require 'timezone)
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Support for HTTP/1.0 MIME messages
-;;; ----------------------------------
-;;; These functions are the guts of the HTTP/0.9 and HTTP/1.0 transfer
-;;; protocol, handling access authorization, format negotiation, the
-;;; whole nine yards.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun url-parse-viewer-types ()
-  "Create a string usable for an Accept: header from mm-mime-data"
-  (let ((tmp (append mm-mime-data mm-mime-data-default))
-       label mjr mnr cur-mnr (str ""))
-    (while tmp
-      (setq mnr (cdr (car tmp))
-           mjr (car (car tmp))
-           tmp (cdr tmp))
-      (while mnr
-       (setq cur-mnr (car mnr)
-             label (concat mjr "/" (if (string= ".*" (car cur-mnr))
-                                       "*"
-                                     (car cur-mnr))))
-       (cond
-        ((string-match (regexp-quote label) str) nil)
-        ((> (+ (% (length str) 60)
-               (length (concat ", " mjr "/" (car cur-mnr)))) 60)
-         (setq str (format "%s\r\nAccept: %s" str label)))
-        (t
-         (setq str (format "%s, %s" str label))))
-       (setq mnr (cdr mnr))))
-    (substring str 2 nil)))
-
-(defun url-create-multipart-request (file-list)
-  "Create a multi-part MIME request for all files in FILE-LIST"
-  (let ((separator (current-time-string))
-       (content "message/http-request")                   
-       (ref-url nil))
-    (setq separator
-         (concat "separator-"
-                 (mapconcat
-                  (function
-                   (lambda (char)
-                     (if (memq char url-mime-separator-chars)
-                         (char-to-string char) ""))) separator "")))
-    (cons separator
-         (concat
-          (mapconcat
-           (function
-            (lambda (file)
-              (concat "--" separator "\nContent-type: " content "\n\n"
-                      (url-create-mime-request file ref-url)))) file-list
-                      "\n")
-          "--" separator))))
-
-(defun url-create-message-id ()
-  "Generate a string suitable for the Message-ID field of a request"
-  (concat "<" (url-create-unique-id) "@" (system-name) ">"))
-
-(defun url-create-unique-id ()
-  ;; Generate unique ID from user name and current time.
-  (let* ((date (current-time-string))
-        (name (user-login-name))
-        (dateinfo (and date (timezone-parse-date date)))
-        (timeinfo (and date (timezone-parse-time (aref dateinfo 3)))))
-    (if (and dateinfo timeinfo)
-       (concat (upcase name) "."
-               (aref dateinfo 0)       ; Year
-               (aref dateinfo 1)       ; Month
-               (aref dateinfo 2)       ; Day
-               (aref timeinfo 0)       ; Hour
-               (aref timeinfo 1)       ; Minute 
-               (aref timeinfo 2)       ; Second
-               )
-      (error "Cannot understand current-time-string: %s." date))
-    ))
-
-(defun url-http-user-agent-string ()
-  (if (or (eq url-privacy-level 'paranoid)
-         (and (listp url-privacy-level)
-              (memq 'agent url-privacy-level)))
-      ""
-    (format "User-Agent: %s/%s URL/%s%s\r\n"
-           url-package-name url-package-version
-           url-version
-           (cond
-            ((and url-os-type url-system-type)
-             (concat " (" url-os-type "; " url-system-type ")"))
-            ((or url-os-type url-system-type)
-             (concat " (" (or url-system-type url-os-type) ")"))
-            (t "")))))
-
-(defun url-create-mime-request (fname ref-url)
-  "Create a MIME request for fname, referred to by REF-URL."
-  (let* ((extra-headers)
-        (request nil)
-        (url (url-view-url t))
-        (no-cache (cdr-safe (assoc "Pragma" url-request-extra-headers)))
-        (proxy-auth (if (or (cdr-safe (assoc "Proxy-Authorization"
-                                             url-request-extra-headers))
-                            (not (boundp 'proxy-info))
-                            (not url-using-proxy))
-                        nil
-                      (let ((url-basic-auth-storage
-                             url-proxy-basic-authentication))
-                        (url-get-authentication url-using-proxy nil 'any 
nil))))
-        (proxy-obj (if (and (boundp 'proxy-info) proxy-info)
-                       (url-generic-parse-url proxy-info)))
-        (real-fname (if proxy-obj (url-filename proxy-obj) fname))
-        (host (or (and proxy-obj (url-host proxy-obj))
-                  (url-host url-current-object)))
-        (auth (if (cdr-safe (assoc "Authorization" url-request-extra-headers))
-                  nil
-                (url-get-authentication (or
-                                         (and (boundp 'proxy-info)
-                                              proxy-info)
-                                         url) nil 'any nil))))
-    (setq no-cache (and no-cache (string-match "no-cache" no-cache)))
-    (if auth
-       (setq auth (concat "Authorization: " auth "\r\n")))
-    (if proxy-auth
-       (setq proxy-auth (concat "Proxy-Authorization: " proxy-auth "\r\n")))
-
-    (if (and ref-url (stringp ref-url) (or (string= ref-url "file:nil")
-                                          (string= ref-url "")))
-       (setq ref-url nil))
-
-    (if (or (memq url-privacy-level '(low high paranoid))
-           (and (listp url-privacy-level)
-                (memq 'lastloc url-privacy-level)))
-       (setq ref-url nil))
-
-    (setq extra-headers (mapconcat
-                        (function (lambda (x)
-                                    (concat (car x) ": " (cdr x))))
-                        url-request-extra-headers "\r\n"))
-    (if (not (equal extra-headers ""))
-       (setq extra-headers (concat extra-headers "\r\n")))
-    (setq request
-         (format
-          (concat
-           "%s %s HTTP/1.0\r\n"        ; The request
-           "MIME-Version: 1.0\r\n"     ; Version of MIME we speaketh
-           "Extension: %s\r\n"         ; HTTP extensions we support
-           "Host: %s:%s\r\n"           ; Who we want to talk to
-           "%s"                        ; Who its from
-           "Accept-encoding: %s\r\n"   ; Encodings we understand
-           "%s"                        ; Languages we understand
-           "Accept: %s\r\n"            ; Types we understand
-           "%s"                        ; User agent
-           "%s"                        ; Proxy Authorization
-           "%s"                        ; Authorization
-           "%s"                        ; Cookies
-           "%s"                        ; If-modified-since
-           "%s"                        ; Where we came from
-           "%s"                        ; Any extra headers
-           "%s"                        ; Any data
-           "\r\n")                     ; End request
-          (or url-request-method "GET")
-          fname
-          (or url-extensions-header "none")
-          (or host "UNKNOWN.HOST.NAME")
-          (url-port (or proxy-obj url-current-object))
-          (if url-personal-mail-address
-              (concat "From: " url-personal-mail-address "\r\n")
-            "")
-          url-mime-encoding-string
-          (if url-mime-language-string
-              (concat "Accept-language: " url-mime-language-string "\r\n")
-            "")
-          url-mime-accept-string
-          (url-http-user-agent-string)
-          (or proxy-auth "")
-          (or auth "")
-          (url-cookie-generate-header-lines
-           host real-fname (equal "https" (url-type url-current-object)))
-          (if (and (not no-cache)
-                   (member url-request-method '("GET" nil)))
-              (let ((tm (url-is-cached url)))
-                (if tm
-                    (concat "If-modified-since: "
-                            (url-get-normalized-date tm) "\r\n")
-                  ""))
-            "")
-          (if ref-url (concat "Referer: " ref-url "\r\n") "")
-          extra-headers
-          (if url-request-data
-              (format "Content-length: %d\r\n\r\n%s"
-                      (length url-request-data) url-request-data)
-            "")))
-    request))
-
-(defun url-setup-reload-timer (url must-be-viewing &optional time)
-  ;; Set up a timer to load URL at optional TIME.  If TIME is unspecified,
-  ;; default to 5 seconds.  Only loads document if MUST-BE-VIEWING is the
-  ;; current URL when the timer expires."
-  (if (or (not time)
-         (<= time 0))
-      (setq time 5))
-  (let ((func
-        (` (lambda ()
-             (if (equal (url-view-url t) (, must-be-viewing))
-                 (let ((w3-reuse-buffers 'no))
-                   (if (equal (, url) (url-view-url t))
-                       (kill-buffer (current-buffer)))
-                   (w3-fetch (, url))))))))
-    (cond
-     ((featurep 'itimer)
-      (start-itimer "reloader" func time))
-     ((fboundp 'run-at-time)
-      (run-at-time time nil func))
-     (t
-      (url-warn 'url "Cannot set up timer for automatic reload, sorry!")))))
-
-(defun url-handle-refresh-header (reload)
-  (if (and reload
-          url-honor-refresh-requests
-          (or (eq url-honor-refresh-requests t)
-              (funcall url-confirmation-func "Honor refresh request? ")))
-      (let ((uri (url-view-url t)))
-       (if (string-match ";" reload)
-           (progn
-             (setq uri (substring reload (match-end 0) nil)
-                   reload (substring reload 0 (match-beginning 0)))
-             (if (string-match
-                  "ur[li][ \t]*=[ \t]*\"*\\([^ \t\"]+\\)\"*"
-                  uri)
-                 (setq uri (url-match uri 1)))
-             (setq uri (url-expand-file-name uri (url-view-url t)))))
-       (url-setup-reload-timer uri (url-view-url t)
-                               (string-to-int (or reload "5"))))))
-
-(defun url-parse-mime-headers (&optional no-delete switch-buff)
-  ;; Parse mime headers and remove them from the html
-  (and switch-buff (set-buffer url-working-buffer))
-  (let* ((st (point-min))
-        (nd (progn
-              (goto-char (point-min))
-              (skip-chars-forward " \t\n")
-              (if (re-search-forward "^\r*$" nil t)
-                  (1+ (point))
-                (point-max))))
-        save-pos
-        status
-        class
-        hname
-        hvalu
-        result
-        )
-    (narrow-to-region st (min nd (point-max)))
-    (goto-char (point-min))
-    (skip-chars-forward " \t\n")       ; Get past any blank crap
-    (skip-chars-forward "^ \t")        ; Skip over the HTTP/xxx
-    (setq status (read (current-buffer)); Quicker than buffer-substring, etc.
-         result (cons (cons "status" status) result))
-    (end-of-line)
-    (while (not (eobp))
-      (skip-chars-forward " \t\n\r")
-      (setq save-pos (point))
-      (skip-chars-forward "^:\n\r")
-      (downcase-region save-pos (point))
-      (setq hname (buffer-substring save-pos (point)))
-      (skip-chars-forward ": \t ")
-      (setq save-pos (point))
-      (skip-chars-forward "^\n\r")
-      (setq hvalu (buffer-substring save-pos (point))
-           result (cons (cons hname hvalu) result))
-      (if (string= hname "set-cookie")
-         (url-cookie-handle-set-cookie hvalu)))
-    (or no-delete (delete-region st (min nd (point))))
-    (setq url-current-mime-type (cdr (assoc "content-type" result))
-         url-current-mime-charset nil
-         url-current-mime-encoding (cdr (assoc "content-encoding" result))
-         url-current-mime-viewer (mm-mime-info url-current-mime-type nil t)
-         url-current-mime-headers result
-         url-current-can-be-cached
-         (not (string-match "no-cache"
-                            (or (cdr-safe (assoc "pragma" result)) ""))))
-    (cond ((and url-current-mime-type
-               (string-match url-mime-content-type-charset-regexp 
url-current-mime-type))
-          (setq url-current-mime-charset
-                (substring url-current-mime-type (match-beginning 1) 
(match-end 1)))
-          (setq url-current-mime-type
-                (substring url-current-mime-type 0 (match-beginning 0)))))
-    (url-handle-refresh-header (cdr-safe (assoc "refresh" result)))
-    (if (and url-request-method
-            (not (string= url-request-method "GET")))
-       (setq url-current-can-be-cached nil))
-    (let ((expires (cdr-safe (assoc "expires" result))))
-      (if (and expires url-current-can-be-cached (featurep 'timezone))
-         (progn
-           (if (string-match
-                (concat "^[^,]+, +\\(..\\)-\\(...\\)-\\(..\\) +"
-                        "\\(..:..:..\\) +\\[*\\([^\]]+\\)\\]*$")
-                             expires)
-               (setq expires (concat (url-match expires 1) " "
-                                     (url-match expires 2) " "
-                                     (url-match expires 3) " "
-                                     (url-match expires 4) " ["
-                                     (url-match expires 5) "]")))
-           (setq expires
-                 (let ((d1 (mapcar
-                            (function
-                             (lambda (s) (and s (string-to-int s))))
-                            (timezone-parse-date
-                             (current-time-string))))
-                       (d2 (mapcar
-                            (function (lambda (s) (and s (string-to-int s))))
-                            (timezone-parse-date expires))))
-                   (- (timezone-absolute-from-gregorian 
-                       (nth 1 d1) (nth 2 d1) (car d1))
-                      (timezone-absolute-from-gregorian 
-                       (nth 1 d2) (nth 2 d2) (car d2))))
-                 url-current-can-be-cached (/= 0 expires)))))
-    (setq class (/ status 100))
-    (cond
-     ;; Classes of response codes
-     ;;
-     ;; 5xx = Server Error
-     ;; 4xx = Client Error
-     ;; 3xx = Redirection
-     ;; 2xx = Successful
-     ;; 1xx = Informational
-     ;;
-     ((= class 2)                      ; Successful in some form or another
-      (cond
-       ((or (= status 206)             ; Partial content
-           (= status 205))             ; Reset content
-       (setq url-current-can-be-cached nil))
-       ((= status 204)                 ; No response - leave old document
-       (kill-buffer url-working-buffer))
-       (t nil))                                ; All others indicate success
-      )
-     ((= class 3)                      ; Redirection of some type
-      (cond
-       ((or (= status 301)             ; Moved - retry with Location: header
-           (= status 302)              ; Found - retry with Location: header
-           (= status 303))             ; Method - retry with location/method
-       (let ((x (url-view-url t))
-             (redir (or (cdr (assoc "uri" result))
-                        (cdr (assoc "location" result))))
-             (redirmeth (upcase (or (cdr (assoc "method" result))
-                                    url-request-method
-                                    "get"))))
-         (if (and redir (string-match "\\([^ \t]+\\)[ \t]" redir))
-             (setq redir (url-match redir 1)))
-         (if (and redir (string-match "^<\\(.*\\)>$" redir))
-             (setq redir (url-match redir 1)))
-
-         ;; As per Roy Fielding, 303 maps _any_ method to a 'GET'
-         (if (= 303 status)
-             (setq redirmeth "GET"))
-
-         ;; As per Roy Fielding, 301, 302 use the same method as the
-         ;; original request, but if != GET, user interaction is
-         ;; required.
-         (if (and (not (string= "GET" redirmeth))
-                  (not (funcall
-                        url-confirmation-func
-                        (concat
-                         "Honor redirection with non-GET method "
-                         "(possible security risks)? "))))
-             (progn
-               (url-warn 'url
-                         (format
-                          "The URL %s tried to issue a redirect to %s using a 
method other than
-GET, which can open up various security holes.  Please see the
-HTTP/1.0 specification for more details." x redir) 'error)
-               (if (funcall url-confirmation-func
-                            "Continue (with method of GET)? ")
-                   (setq redirmeth "GET")
-                 (error "Transaction aborted."))))
-
-         (if (not (equal x redir))
-             (let ((url-request-method redirmeth))
-               (url-maybe-relative redir))
-           (progn
-             (goto-char (point-max))
-             (insert "<hr>Error!  This URL tried to redirect me to itself!<P>"
-                     "Please notify the server maintainer.")))))
-       ((= status 304)                 ; Cached document is newer
-       (message "Extracting from cache...")
-       (url-cache-extract (url-cache-create-filename (url-view-url t))))
-       ((= status 305)                 ; Use proxy in Location: header
-       nil)))
-     ((= class 4)                      ; Client error
-      (cond
-       ((and (= status 401)            ; Unauthorized access, retry w/auth.
-            (< url-current-passwd-count url-max-password-attempts))
-       (setq url-current-passwd-count (1+ url-current-passwd-count))
-       (let* ((y (or (cdr (assoc "www-authenticate" result)) "basic"))
-              (url (url-view-url t))
-              (type (downcase (if (string-match "[ \t]" y)
-                                  (substring y 0 (match-beginning 0))
-                                y))))
-         (cond
-          ((url-auth-registered type)
-           (let ((args y)
-                 (ctr (1- (length y)))
-                 auth
-                 (url-request-extra-headers url-request-extra-headers))
-             (while (/= 0 ctr)
-               (if (= ?, (aref args ctr))
-                   (aset args ctr ?\;))
-               (setq ctr (1- ctr)))
-             (setq args (mm-parse-args y)
-                   auth (url-get-authentication url
-                                                (cdr-safe
-                                                 (assoc "realm" args))
-                                                type t args))
-             (if auth
-                 (setq url-request-extra-headers
-                       (cons (cons "Authorization" auth)
-                             url-request-extra-headers)))
-             (url-retrieve url t)))
-          (t
-           (widen)
-           (goto-char (point-max))
-           (setq url-current-can-be-cached nil)
-           (insert "<hr>Sorry, but I do not know how to handle " y
-                   " authentication.  If you'd like to write it,"
-                   " send it to " url-bug-address ".<hr>")))))
-       ((= status 407)                 ; Proxy authentication required
-       (let* ((y (or (cdr (assoc "proxy-authenticate" result)) "basic"))
-              (url (url-view-url t))
-              (urlobj (url-generic-parse-url url))
-              (url-basic-auth-storage url-proxy-basic-authentication)
-              (url-using-proxy (url-find-proxy-for-url urlobj
-                                                       (url-host urlobj)))
-              (type (downcase (if (string-match "[ \t]" y)
-                                  (substring y 0 (match-beginning 0))
-                                y))))
-         (cond
-          ((url-auth-registered type)
-           (let ((args y)
-                 (ctr (1- (length y)))
-                 auth
-                 (url-request-extra-headers url-request-extra-headers))
-             (while (/= 0 ctr)
-               (if (= ?, (aref args ctr))
-                   (aset args ctr ?\;))
-               (setq ctr (1- ctr)))
-             (setq args (mm-parse-args y)
-                   auth (url-get-authentication (or url-using-proxy url)
-                                                (cdr-safe
-                                                 (assoc "realm" args))
-                                                type t args))
-             (if auth
-                 (setq url-request-extra-headers
-                       (cons (cons "Proxy-Authorization" auth)
-                             url-request-extra-headers)))
-             (setq url-proxy-basic-authentication url-basic-auth-storage)
-             (url-retrieve url t)))
-          (t
-           (widen)
-           (goto-char (point-max))
-           (setq url-current-can-be-cached nil)
-           (insert "<hr>Sorry, but I do not know how to handle " y
-                   " authentication.  If you'd like to write it,"
-                   " send it to " url-bug-address ".<hr>")))))
-       ;;((= status 400) nil)          ; Bad request - syntax
-       ;;((= status 401) nil)          ; Tried too many times
-       ;;((= status 402) nil)          ; Payment required, retry w/Chargeto:
-       ;;((= status 403) nil)          ; Access is forbidden
-       ;;((= status 404) nil)          ; Not found...
-       ;;((= status 405) nil)          ; Method not allowed
-       ;;((= status 406) nil)          ; None acceptable
-       ;;((= status 408) nil)          ; Request timeout
-       ;;((= status 409) nil)          ; Conflict
-       ;;((= status 410) nil)          ; Document is gone
-       ;;((= status 411) nil)          ; Length required
-       ;;((= status 412) nil)          ; Unless true
-       (t                              ; All others mena something hosed
-       (setq url-current-can-be-cached nil))))
-     ((= class 5)
-;;;      (= status 504)                        ; Gateway timeout
-;;;      (= status 503)                        ; Service unavailable
-;;;      (= status 502)                        ; Bad gateway
-;;;      (= status 501)                        ; Facility not supported
-;;;      (= status 500)                        ; Internal server error
-      (setq url-current-can-be-cached nil))
-     ((= class 1)
-      (cond
-       ((or (= status 100)             ; Continue
-           (= status 101))             ; Switching protocols
-       nil)))
-     (t
-      (setq url-current-can-be-cached nil)))
-    (widen)
-    status))
-
-(defun url-mime-response-p (&optional switch-buff)
-  ;; Determine if the current buffer is a MIME response
-  (and switch-buff (set-buffer url-working-buffer))
-  (goto-char (point-min))
-  (skip-chars-forward " \t\n")
-  (and (looking-at "^HTTP/.+")))
-
-(defsubst url-recreate-with-attributes (obj)
-  (if (url-attributes obj)
-      (concat (url-filename obj) ";"
-             (mapconcat
-              (function
-               (lambda (x)
-                 (if (cdr x)
-                     (concat (car x) "=" (cdr x))
-                   (car x)))) (url-attributes obj) ";"))
-    (url-filename obj)))
-
-(defun url-http (url &optional proxy-info)
-  ;; Retrieve URL via http.
-  (let* ((urlobj (url-generic-parse-url url))
-        (ref-url (or url-current-referer (url-view-url t))))
-    (url-clear-tmp-buffer)
-    (let* ((server (url-host urlobj))
-          (port   (url-port urlobj))
-          (file   (or proxy-info (url-recreate-with-attributes urlobj)))
-          (dest   (url-target urlobj))
-          request)
-      (if (equal port "") (setq port "80"))
-      (if (equal file "") (setq file "/"))
-      (if (not server)
-         (message "Malformed URL: `%s'" url)
-       (if (or (not (member port url-bad-port-list))
-               (funcall url-confirmation-func
-                        (concat
-                         "Warning!  Trying to connect to port "
-                         port
-                         " - continue? ")))
-           (progn
-             (setq request (url-create-mime-request file ref-url))
-             (url-lazy-message "Contacting %s:%s" server port)
-             (let ((process
-                    (url-open-stream "WWW" url-working-buffer server
-                                     (string-to-int port))))
-               (if (not (processp process))
-                   (url-sentinel url-working-buffer nil)
-                 (progn
-                   (url-process-put process 'url (or proxy-info url))
-                   (set-process-sentinel process 'ignore)
-                   (process-kill-without-query process)
-                   (process-send-string process request)
-                   (url-lazy-message "Request sent, waiting for response...")
-                   (setq url-current-content-length nil)
-                   (make-local-variable 'after-change-functions)
-                   (add-hook 'after-change-functions 
'url-after-change-function)
-                   (if url-be-asynchronous
-                       (set-process-sentinel process 'url-sentinel)
-                     (unwind-protect
-                         (save-excursion
-                           (set-buffer url-working-buffer)
-                           (while (memq (url-process-status process)
-                                        '(run open))
-                             (url-accept-process-output process)))
-                       (condition-case ()
-                           (url-kill-process process)
-                         (error nil))))
-                   (if url-be-asynchronous
-                       nil
-                     (message "Retrieval complete.")
-                     (if (fboundp 'clear-progress) (clear-progress))
-                     (remove-hook 'after-change-functions
-                                  'url-after-change-function))))))
-         (progn
-           (ding)
-           (url-warn 'security "Aborting connection to bad port...")))))))
-
-(defun url-https (url)
-  ;; Retrieve a URL via SSL
-  (condition-case ()
-      (require 'ssl)
-    (error (error "Not configured for SSL, please read the info pages.")))
-  (let ((url-this-is-ssl t)
-       (url-gateway-method 'ssl))
-    (url-http url)))
-
-(provide 'url-http)
diff --git a/lisp/url-irc.el b/lisp/url-irc.el
deleted file mode 100644
index cae094b..0000000
--- a/lisp/url-irc.el
+++ /dev/null
@@ -1,74 +0,0 @@
-;;; url-irc.el --- IRC URL interface
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:09 $
-;; Version: $Revision: 1.1 $
-;; Keywords: comm, data, processes
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'url-vars)
-(require 'url-parse)
-
-(defcustom url-irc-function 'url-irc-zenirc
-  "*Function to actually open an IRC connection.
-Should be a function that takes several argument:
-    HOST - the hostname of the IRC server to contact
-    PORT - the port number of the IRC server to contact
- CHANNEL - What channel on the server to visit right away (can be nil)
-    USER - What username to use
-PASSWORD - What password to use"
-  :type '(choice (const :tag "ZEN IRC" :value 'url-irc-zenirc)
-                (function :tag "Other"))
-  :group 'url)
-
-(defun url-irc-zenirc (host port channel user password)
-  (let ((zenirc-buffer-name (if (and user host port)
-                               (format "address@hidden:%d" user host port)
-                             (format "%s:%d" host port)))
-       (zenirc-server-alist
-        (list
-         (list host port password nil user))))
-    (zenirc)
-    (goto-char (point-max))
-    (if (not channel)
-       nil
-      (insert "/join " channel)
-      (zenirc-send-line))))
-
-(defun url-irc (url)
-  (let* ((urlobj (url-generic-parse-url url))
-        (host (url-host urlobj))
-        (port (string-to-int (url-port urlobj)))
-        (pass (url-password urlobj))
-        (user (url-user urlobj))
-        (chan (url-filename urlobj)))
-    (if (url-target urlobj)
-       (setq chan (concat chan "#" (url-target urlobj))))
-    (and (get-buffer url-working-buffer)
-        (kill-buffer url-working-buffer))
-    (if (string-match "^/" chan)
-       (setq chan (substring chan 1 nil)))
-    (if (= (length chan) 0)
-       (setq chan nil))
-    (funcall url-irc-function host port chan user pass)))
-    
diff --git a/lisp/url-ldap.el b/lisp/url-ldap.el
deleted file mode 100644
index 35748a5..0000000
--- a/lisp/url-ldap.el
+++ /dev/null
@@ -1,237 +0,0 @@
-;;; url-ldap.el --- LDAP Uniform Resource Locator retrieval code
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/20 11:37:51 $
-;; Version: $Revision: 1.9 $
-;; Keywords: comm, data, processes
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1998 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'url-vars)
-(require 'url-parse)
-
-;; This has been implemented from RFC2255 'The LDAP URL Format' (Dec 1997)
-;;
-;; basic format is: ldap://host:port/dn?attributes?scope?filter?extensions
-;;
-;; Test URLs:
-;; 
ldap://ldap.itd.umich.edu/cn%3Dumbflabmanager%2C%20ou%3DUser%20Groups%2C%20ou%3DGroups%2C%20o%3DUniversity%20of%20Michigan%2C%20c%3DUS
-;; ldap://ldap.itd.umich.edu/o=University%20of%20Michigan,c=US
-;;
-;; For simple queries, I have verified compatibility with Netscape
-;; Communicator v4.5 under linux.
-;;
-;; For anything _useful_ though, like specifying the attributes,
-;; scope, filter, or extensions, netscape claims the URL format is
-;; unrecognized.  So I don't think it supports anything other than the
-;; defaults (scope=base,attributes=*,filter=(objectClass=*)
-
-(defvar url-ldap-default-host "ldap"
-  "*Default LDAP server to contact when none has been specified in the URL.")
-
-(defvar url-ldap-pretty-names
-  '(("l"           . "City")
-    ("objectclass" . "Object Class")
-    ("o"           . "Organization")
-    ("ou"          . "Organizational Unit")
-    ("cn"          . "Name")
-    ("sn"          . "Last Name")
-    ("givenname"   . "First Name")
-    ("mail"        . "Email")
-    ("title"       . "Title")
-    ("c"           . "Country")
-    ("postalcode"  . "ZIP Code")
-    ("telephonenumber"          . "Phone Number")
-    ("facsimiletelephonenumber" . "Fax")
-    ("postaladdress"            . "Mailing Address")
-    ("description"              . "Notes"))
-  "*An assoc list mapping LDAP attribute names to pretty descriptions of 
them.")
-
-(defvar url-ldap-attribute-formatters
-  '(("mail"       . (lambda (x) (format "<a href='mailto:%s'>%s</a>" x x)))
-    ("owner"      . url-ldap-dn-formatter)
-    ("creatorsname" . url-ldap-dn-formatter)
-    ("jpegphoto"     . url-ldap-image-formatter)
-    ("usercertificate" . url-ldap-certificate-formatter)
-    ("modifiersname" . url-ldap-dn-formatter)
-    ("namingcontexts" . url-ldap-dn-formatter)
-    ("defaultnamingcontext" . url-ldap-dn-formatter)
-    ("member"     . url-ldap-dn-formatter))
-  "*An assoc list mapping LDAP attribute names to pretty formatters for them.")
-
-(defsubst url-ldap-attribute-pretty-name (n)
-  (or (cdr-safe (assoc (downcase n) url-ldap-pretty-names)) n))
-
-(defsubst url-ldap-attribute-pretty-desc (n v)
-  (if (string-match "^\\([^;]+\\);" n)
-      (setq n (match-string 1 n)))
-  (funcall (or (cdr-safe (assoc (downcase n) url-ldap-attribute-formatters)) 
'identity) v))
-
-(defun url-ldap-dn-formatter (dn)
-  (concat "<a href='/"
-         (url-hexify-string dn)
-         "'>" dn "</a>"))
-
-(defun url-ldap-certificate-formatter (data)
-  (require 'ssl)
-  (let ((vals (ssl-certificate-information data)))
-    (if (not vals)
-       "<b>Unable to parse certificate</b>"
-      (concat "<table border=0>\n"
-             (mapconcat
-              (lambda (ava)
-                (format "<tr><td>%s</td><td>%s</td></tr>\n" (car ava) (cdr 
ava)))
-              vals "\n")
-             "</table>\n"))))
-
-(defun url-ldap-image-formatter (data)
-  (format "<img alt='JPEG Photo' src='data:image/jpeg;base64,%s'>" 
-         (url-hexify-string (base64-encode-string data))))
-
-(defun url-ldap (url)
-  (if (not (fboundp 'ldap-search-internal))
-      (progn
-       (set-buffer (get-buffer-create url-working-buffer))
-       (erase-buffer)
-       (setq url-current-mime-type "text/html"
-             url-current-can-be-cached nil)
-       (insert "<html>\n"
-               " <head>\n"
-               "  <title>LDAP Not Supported</title>\n"
-               "  <base href='" url "'>\n"
-               " </head>\n"
-               " <body>\n"
-               "  <h1>LDAP Not Supported</h1>\n"
-               "  <p>\n"
-               "    This version of Emacs does not support LDAP.\n"
-               "  </p>\n"
-               " </body>\n"
-               "</html>\n"))
-    (let* ((urlobj (url-generic-parse-url url))
-          (binddn nil)
-          (data (url-filename urlobj))
-          (host (url-host urlobj))
-          (port (url-port urlobj))
-          (base-object nil)
-          (attributes nil)
-          (scope nil)
-          (filter nil)
-          (extensions nil)
-          (connection nil)
-          (results nil)
-          (extract-dn (and (fboundp 'function-max-args)
-                           (= (function-max-args 'ldap-search-internal) 7))))
-
-      ;; Get rid of leading /
-      (if (string-match "^/" data)
-         (setq data (substring data 1)))
-
-      ;; Fill in the default host
-      (if (not host)
-         (setq host url-ldap-default-host))
-
-      (setq data (mapcar (lambda (x) (if (/= (length x) 0) x nil)) 
(split-string data "\\?"))
-           base-object (nth 0 data)
-           attributes (nth 1 data)
-           scope (nth 2 data)
-           filter (nth 3 data)
-           extensions (nth 4 data))
-
-      ;; fill in the defaults
-      (setq base-object (url-unhex-string (or base-object ""))
-           scope (intern (url-unhex-string (or scope "base")))
-           filter (url-unhex-string (or filter "(objectClass=*)")))
-
-      (if (not (memq scope '(base one tree)))
-         (error "Malformed LDAP URL: Unknown scope: %S" scope))
-
-      ;; Convert to the internal LDAP support scoping names.
-      (setq scope (cdr (assq scope '((base . base) (one . onelevel) (sub . 
subtree)))))
-
-      (if attributes
-         (setq attributes (mapcar 'url-unhex-string (split-string attributes 
","))))
-
-      ;; Parse out the exentions
-      (if extensions
-         (setq extensions (mapcar (lambda (ext)
-                                    (if (string-match "\\([^=]*\\)=\\(.*\\)" 
ext)
-                                        (cons (match-string 1 ext) 
(match-string 2 ext))
-                                      (cons ext ext)))
-                                  (split-string extensions ","))
-               extensions (mapcar (lambda (ext)
-                                    (cons (url-unhex-string (car ext))
-                                          (url-unhex-string (cdr ext))))
-                                  extensions)))
-
-      (setq binddn (cdr-safe (or (assoc "bindname" extensions)
-                                (assoc "!bindname" extensions))))
-    
-      ;; Now, let's actually do something with it.
-      (setq connection (ldap-open host (if binddn (list 'binddn binddn)))
-           results (if extract-dn
-                       (ldap-search-internal connection filter base-object 
scope attributes nil t)
-                     (ldap-search-internal connection filter base-object scope 
attributes nil)))
-                     
-      (ldap-close connection)
-      (set-buffer (get-buffer-create url-working-buffer))
-      (erase-buffer)
-      (setq url-current-mime-type "text/html"
-           url-current-can-be-cached nil)
-      (insert "<html>\n"
-             " <head>\n"
-             "  <title>LDAP Search Results</title>\n"
-             "  <base href='" url "'>\n"
-             " </head>\n"
-             " <body>\n"
-             "  <h1>" (int-to-string (length results)) " matches</h1>\n")
-
-      (mapc (lambda (obj)
-             (insert "  <hr>\n"
-                     "  <table border=1>\n")
-             (if extract-dn
-                 (insert "   <tr><th colspan=2>" (car obj) "</th></tr>\n"))
-             (mapc (lambda (attr)
-                     (if (= (length (cdr attr)) 1)
-                         ;; single match, easy
-                         (insert "   <tr><td>"
-                                 (url-ldap-attribute-pretty-name (car attr))
-                                 "</td><td>"
-                                 (url-ldap-attribute-pretty-desc (car attr) 
(car (cdr attr)))
-                                 "</td></tr>\n")
-                       ;; Multiple matches, slightly uglier
-                       (insert "   <tr>\n"
-                               (format "    <td valign=top>" (length (cdr 
attr)))
-                               (url-ldap-attribute-pretty-name (car attr)) 
"</td><td>"
-                               (mapconcat (lambda (x)
-                                            (url-ldap-attribute-pretty-desc 
(car attr) x))
-                                          (cdr attr)
-                                          "<br>\n")
-                               "</td>"
-                               "   </tr>\n")))
-                   (if extract-dn (cdr obj) obj))
-             (insert "  </table>\n"))
-           results)
-
-      (insert "  <hr>\n"
-             " </body>\n"
-             "</html>\n"))))
-
-(provide 'url-ldap)
diff --git a/lisp/url-mail.el b/lisp/url-mail.el
deleted file mode 100644
index 91cdad4..0000000
--- a/lisp/url-mail.el
+++ /dev/null
@@ -1,207 +0,0 @@
-;;; url-mail.el --- Mail Uniform Resource Locator retrieval code
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/06/28 01:46:57 $
-;; Version: $Revision: 1.2 $
-;; Keywords: comm, data, processes
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'url-vars)
-(require 'url-parse)
-
-(defmacro url-mailserver-skip-chunk ()
-  (` (while (and (not (looking-at "/"))
-                (not (eobp)))
-       (forward-sexp 1))))
-
-;;;###autoload
-(defun url-mail (&rest args)
-  (interactive "P")
-  (if (fboundp 'message-mail)
-      (apply 'message-mail args)
-    (or (apply 'mail args)
-       (error "Mail aborted"))))
-
-(defun url-mail-goto-field (field)
-  (if (not field)
-      (goto-char (point-max))
-    (let ((dest nil)
-         (lim nil)
-         (case-fold-search t))
-      (save-excursion
-       (goto-char (point-min))
-       (if (re-search-forward (regexp-quote mail-header-separator) nil t)
-           (setq lim (match-beginning 0)))
-       (goto-char (point-min))
-       (if (re-search-forward (concat "^" (regexp-quote field) ":") lim t)
-           (setq dest (match-beginning 0))))
-      (if dest
-         (progn
-           (goto-char dest)
-           (end-of-line))
-       (goto-char lim)
-       (insert (capitalize field) ": ")
-       (save-excursion
-         (insert "\n"))))))
-  
-(defun url-mailto (url)
-  ;; Send mail to someone
-  (if (string-match "mailto:/*\\(.*\\)" url)
-      (when (eql ?/ (1- (match-beginning 1)))
-       (w3-debug-html :style "mailto URL with slashes before mailbox."))
-    (error "Malformed mailto link: %s" url))
-  (setq url (substring url (match-beginning 1) nil))
-  (if (get-buffer url-working-buffer)
-      (kill-buffer url-working-buffer))
-  (let (to args source-url subject func headers-start)
-    (if (string-match (regexp-quote "?") url)
-       (setq headers-start (match-end 0)
-             to (url-unhex-string (substring url 0 (match-beginning 0)))
-             args (url-parse-query-string
-                   (substring url headers-start nil) t))
-      (setq to (url-unhex-string url)))
-    (setq source-url (url-view-url t))
-    (if (and url-request-data (not (assoc "subject" args)))
-       (setq args (cons (list "subject"
-                              (concat "Automatic submission from "
-                                      url-package-name "/"
-                                      url-package-version)) args)))
-    (if (and source-url (not (assoc "x-url-from" args)))
-       (setq args (cons (list "x-url-from" source-url) args)))
-
-    (if (assoc "to" args)
-       (push to (cdr (assoc "to" args)))
-      (setq args (cons (list "to" to) args)))
-    (setq subject (cdr-safe (assoc "subject" args)))
-    (if (fboundp url-mail-command) (funcall url-mail-command) (mail))
-    (while args
-      (if (string= (caar args) "body")
-         (progn
-           (goto-char (point-max))
-           (insert (mapconcat 'identity (cdar args) "\n")))
-       (url-mail-goto-field (caar args))
-       (setq func (intern-soft (concat "mail-" (caar args))))
-       (insert (mapconcat 'identity (cdar args) ", ")))
-      (setq args (cdr args)))
-    (url-mail-goto-field "X-Mailer")
-    (insert url-package-name "/" url-package-version)
-    (if (not url-request-data)
-       (if subject
-           (url-mail-goto-field nil)
-         (url-mail-goto-field "subject"))
-      (if url-request-extra-headers
-         (mapconcat
-          (function
-           (lambda (x)
-             (url-mail-goto-field (car x))
-             (insert (cdr x))))
-          url-request-extra-headers ""))
-      (goto-char (point-max))
-      (insert url-request-data)
-      (mail-send-and-exit nil))))
-
-(defun url-mailserver (url)
-  ;; Send mail to someone, much cooler/functional than mailto
-  (if (get-buffer url-working-buffer)
-      (kill-buffer url-working-buffer))
-  (set-buffer (get-buffer-create " *mailserver*"))
-  (erase-buffer)
-  (insert url)
-  (goto-char (point-min))
-  (set-syntax-table url-mailserver-syntax-table)
-  (skip-chars-forward "^:")            ; Get past mailserver
-  (skip-chars-forward ":")             ; Get past :
-  ;; Handle some ugly malformed URLs, but bitch about it.
-  (if (looking-at "/")
-      (progn
-       (url-warn 'url "Invalid mailserver URL... attempting to cope.")
-       (skip-chars-forward "/")))
-  
-  (let ((save-pos (point))
-       (url (url-view-url t))
-       (rfc822-addr nil)
-       (subject nil)
-       (body nil))
-    (url-mailserver-skip-chunk)
-    (setq rfc822-addr (buffer-substring save-pos (point)))
-    (forward-char 1)
-    (setq save-pos (point))
-    (url-mailserver-skip-chunk)
-    (setq subject (buffer-substring save-pos (point)))
-    (if (not (eobp))
-       (progn                          ; There is some text to use
-         (forward-char 1)              ; as the body of the message
-         (setq body (buffer-substring (point) (point-max)))))
-    (if (fboundp url-mail-command) (funcall url-mail-command) (mail))
-    (url-mail-goto-field "to")
-    (insert rfc822-addr)
-    (if (and url (not (string= url "")))
-       (progn
-         (url-mail-goto-field "X-URL-From")
-         (insert url)))
-    (url-mail-goto-field "X-Mailer")
-    (insert url-package-name "/" url-package-version)
-    (url-mail-goto-field "subject")
-    ;; Massage the subject from URLEncoded garbage
-    ;; Note that we do not allow any newlines in the subject,
-    ;; as recommended by the Internet Draft on the mailserver
-    ;; URL - this means the document author cannot spoof additional
-    ;; header lines, which is a 'Good Thing'
-    (if subject
-       (progn
-         (setq subject (url-unhex-string subject))
-         (let ((x (1- (length subject)))
-               (y 0))
-           (while (<= y x)
-             (if (memq (aref subject y) '(?\r ?\n))
-                 (aset subject y ? ))
-             (setq y (1+ y))))))
-    (insert subject)
-    (if url-request-extra-headers
-       (progn
-         (goto-char (point-min))
-         (insert
-          (mapconcat
-           (function
-            (lambda (x)
-              (url-mail-goto-field (car x))
-              (insert (cdr x))))
-           url-request-extra-headers ""))))
-    (goto-char (point-max))
-    ;; Massage the body from URLEncoded garbage
-    (if body
-       (let ((x (1- (length body)))
-             (y 0))
-         (while (<= y x)
-           (if (= (aref body y) ?/)
-               (aset body y ?\n))
-           (setq y (1+ y)))
-         (setq body (url-unhex-string body))))
-    (and body (insert body))
-    (and url-request-data (insert url-request-data))
-    (if (and (or body url-request-data)
-            (funcall url-confirmation-func
-                     (concat "Send message to " rfc822-addr "? ")))
-       (mail-send-and-exit nil))))    
-
-(provide 'url-mail)
diff --git a/lisp/url-misc.el b/lisp/url-misc.el
deleted file mode 100644
index 2d133e4..0000000
--- a/lisp/url-misc.el
+++ /dev/null
@@ -1,201 +0,0 @@
-;;; url-misc.el --- Misc Uniform Resource Locator retrieval code
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:09 $
-;; Version: $Revision: 1.1 $
-;; Keywords: comm, data, processes
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'url-vars)
-(require 'url-parse)
-(require 'widget)
-(autoload 'Info-goto-node "info" "" t)
-
-(defun url-netrek (url)
-  ;; Start a netrek client
-  (if (get-buffer url-working-buffer)
-      (kill-buffer url-working-buffer))
-  (let ((data (url-generic-parse-url url)))
-    (error
-     "I should launch netrek on: %s %s" (url-host data) (url-port data))))
-
-(defun url-info (url)
-  ;; Fetch an info node
-  (if (get-buffer url-working-buffer)
-      (kill-buffer url-working-buffer))
-  (let* ((data (url-generic-parse-url url))
-        (fname (url-filename data))
-        (node (url-unhex-string (or (url-target data) "Top"))))
-    (if (and fname node)
-       (Info-goto-node (concat "(" fname ")" node))
-      (error "Malformed url: %s" url))))
-
-(defun url-finger (url)
-  ;; Find a finger reference
-  (setq url-current-mime-headers '(("content-type" . "text/html"))
-       url-current-mime-type "text/html")
-  (set-buffer (get-buffer-create url-working-buffer))
-  (let* ((urlobj (if (vectorp url) url
-                  (url-generic-parse-url url)))
-        (host (or (url-host urlobj) "localhost"))
-        (port (or (url-port urlobj)
-                  (cdr-safe (assoc "finger" url-default-ports))))
-        (user (url-unhex-string (url-filename urlobj)))
-        (proc (url-open-stream "finger" url-working-buffer host
-                               (string-to-int port))))
-    (if (not (processp proc))
-       nil
-      (process-kill-without-query proc)
-      (set-process-sentinel proc 'ignore)
-      (if (= (string-to-char user) ?/)
-         (setq user (substring user 1 nil)))
-      (goto-char (point-min))
-      (insert "<html>\n"
-             " <head>\n"
-             "  <title>Finger information for " user "@" host "</title>\n"
-             " </head>\n"
-             " <body>\n"
-             "  <h1>Finger information for " user "@" host "</h1>\n"
-             "  <hr>\n"
-             "  <pre>\n")
-      (process-send-string proc (concat user "\r\n"))
-      (while (memq (url-process-status proc) '(run open))
-       (url-after-change-function)
-       (url-accept-process-output proc))
-      (goto-char (point-min))
-      (url-replace-regexp "^Process .* exited .*code .*$" "")
-      (goto-char (point-max))
-      (insert "  </pre>\n"
-             " </body>\n"
-             "</html>\n"))))
-
-(defun url-do-terminal-emulator (type server port user)
-  (terminal-emulator
-   (generate-new-buffer (format "%s%s" (if user (concat user "@") "") server))
-   (case type
-     (rlogin "rlogin")
-     (telnet "telnet")
-     (tn3270 "tn3270")
-     (otherwise
-      (error "Unknown terminal emulator required: %s" type)))
-   (case type
-     (rlogin
-      (if user
-         (list server "-l" user)
-       (list server)))
-     (telnet
-      (if user (message "Please log in as user: %s" user))
-      (if port
-         (list server port)
-       (list server)))
-     (tn3270
-      (if user (message "Please log in as user: %s" user))
-      (list server)))))
-
-(defun url-generic-emulator-loader (url)
-  (if (get-buffer url-working-buffer)
-      (kill-buffer url-working-buffer))
-  (or (string-match "^\\([^:]+\\):/*\\(address@hidden)*\\([^/]*\\)/*" url)
-      (error "Invalid URL: %s" url))
-  (let* ((type (intern (downcase (match-string 1 url))))
-        (server (match-string 3 url))
-        (name (if (match-beginning 2)
-                  (substring url (match-beginning 2) (1- (match-end 2)))))
-        (port (if (string-match ":" server)
-                  (prog1
-                      (substring server (match-end 0))
-                    (setq server (substring server 0 (match-beginning 0)))))))
-    (url-do-terminal-emulator type server port name)))
-
-(fset 'url-rlogin 'url-generic-emulator-loader)
-(fset 'url-telnet 'url-generic-emulator-loader)
-(fset 'url-tn3270 'url-generic-emulator-loader)
-
-(defun url-proxy (url)
-  ;; Retrieve URL from a proxy.
-  ;; Expects `url-using-proxy' to be bound to the specific proxy to use."
-  (let ((urlobj (url-generic-parse-url url)))
-    (url-set-target urlobj nil)
-    (url-http url-using-proxy (url-recreate-url urlobj))))
-
-;; ftp://ietf.org/internet-drafts/draft-masinter-url-data-02.txt
-(defun url-data (url)
-  (set-buffer (get-buffer-create url-working-buffer))
-  (let ((content-type nil)
-       (encoding nil)
-       (data nil))
-    (cond
-     ((string-match "^data:\\([^;,]*\\);*\\([^,]*\\)," url)
-      (setq content-type (match-string 1 url)
-           encoding (match-string 2 url)
-           data (url-unhex-string (substring url (match-end 0))))
-      (if (= 0 (length content-type)) (setq content-type "text/plain"))
-      (if (= 0 (length encoding)) (setq encoding "8bit")))
-     (t nil))
-    (setq url-current-content-length (length data)
-         url-current-mime-type content-type
-         url-current-mime-encoding encoding
-         url-current-mime-headers (list (cons "content-type" content-type)
-                                        (cons "content-encoding" encoding)))
-    (and data (insert data))))
-
-(eval-and-compile
-  (condition-case ()
-      (require 'mm-decode)
-    (error (message "No content-id handling"))))
-       
-(defun url-cid-gnus (cid)
-  (set-buffer (get-buffer-create url-working-buffer))
-  (let ((content-type nil)
-       (encoding nil)
-       (part nil)
-       (data nil))
-    (setq part (mm-get-content-id cid))
-    (if (not part)
-       (message "Unknown CID encounterred: %s" cid)
-      (setq data (buffer-string nil nil (mm-handle-buffer part))
-           content-type (mm-handle-type part)
-           encoding (symbol-name (mm-handle-encoding part)))
-      (if (= 0 (length content-type)) (setq content-type "text/plain"))
-      (if (= 0 (length encoding)) (setq encoding "8bit"))
-      (if (listp content-type)
-         (setq content-type (car content-type)))
-      (setq url-current-content-length (length data)
-           url-current-mime-type content-type
-           url-current-mime-encoding encoding
-           url-current-mime-headers (list (cons "content-type" content-type)
-                                          (cons "content-encoding" encoding)))
-      (and data (insert data)))))
-
-(defun url-cid (url)
-  (if (not (string-match "^cid:\\(.*\\)" url))
-      (message "Malformed CID URL: %s" url)
-    (setq url (url-unhex-string (match-string 1 url)))
-    (cond
-     ((fboundp 'mm-get-content-id)
-      ;; Using Pterodactyl Gnus or later
-      (url-cid-gnus url))
-     (t
-      (message "Unable to handle CID URL: %s" url)))))
-
-(provide 'url-misc)
diff --git a/lisp/url-news.el b/lisp/url-news.el
deleted file mode 100644
index e1f048e..0000000
--- a/lisp/url-news.el
+++ /dev/null
@@ -1,314 +0,0 @@
-;;; url-news.el --- News Uniform Resource Locator retrieval code
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/20 11:37:53 $
-;; Version: $Revision: 1.3 $
-;; Keywords: comm, data, processes
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(require 'url-vars)
-(require 'url-parse)
-
-(defgroup url-news nil
-  "News related options"
-  :group 'url)
-
-(defcustom url-news-use-article-mode nil
-  "*Whether to use Gnus' article mode for displaying news articles."
-  :type 'boolean
-  :group 'url-news)
-
-(defun url-format-news ()
-  (url-clear-tmp-buffer)
-  (insert "HTTP/1.0 200 Retrieval OK\r\n"
-         (save-excursion
-           (set-buffer nntp-server-buffer)
-           (buffer-string)))
-  (url-parse-mime-headers)
-  (let* ((from  (cdr (assoc "from" url-current-mime-headers)))
-        (qfrom (if from (url-insert-entities-in-string from) nil))
-        (subj  (cdr (assoc "subject" url-current-mime-headers)))
-        (qsubj (if subj (url-insert-entities-in-string subj) nil))
-        (org   (cdr (assoc "organization" url-current-mime-headers)))
-        (qorg  (if org (url-insert-entities-in-string org) nil))
-        (typ   (or (cdr (assoc "content-type" url-current-mime-headers))
-                   "text/plain"))
-        (inhibit-read-only t)
-        (qgrps (mapcar 'car
-                       (url-split
-                        (url-insert-entities-in-string
-                         (or (cdr (assoc "newsgroups" 
-                                         url-current-mime-headers))
-                             ""))
-                        "[ \t\n,]+")))
-        (qrefs (delete "" 
-                       (mapcar
-                        'url-insert-entities-in-string
-                        (mapcar 'car
-                                (url-split
-                                 (or (cdr (assoc "references" 
-                                                 url-current-mime-headers))
-                                     "")
-                                 "[ \t,\n<>]+")))))
-        (date  (cdr (assoc "date" url-current-mime-headers))))
-    (if (or (not (string-match "text/" typ))
-           (string-match "text/html" typ))
-       nil                             ; Let natural content-type take over
-      (if (and (fboundp 'gnus-article-mode)
-              url-news-use-article-mode)
-         (progn
-           (kill-buffer (current-buffer))
-           (set-buffer (get-buffer-create "Emacs/W3 News"))
-           (erase-buffer)
-           (insert
-            (save-excursion
-              (set-buffer nntp-server-buffer)
-              (save-restriction
-                (widen)
-                (buffer-string))))
-           (let ((gnus-article-buffer (current-buffer))
-                 (gnus-article-current (cons "url"
-                                             (car (cdr (current-time))))))
-             (gnus-article-mode)
-             (run-hooks 'gnus-article-display-hook))
-           (goto-char (point-min))
-           (display-buffer (current-buffer)))
-       (insert "<html>\n"
-               " <head>\n"
-               "  <title>" qsubj "</title>\n"
-               "  <link rev=\"made\" href=\"mailto:"; qfrom "\">\n"
-               " </head>\n"
-               " <body>\n"
-               "  <div>\n"
-               "   <h1 align=center>" qsubj "</h1>\n"
-               "   <p role=\"headers\">\n"
-               "    <b>From</b>: " qfrom "<br>\n"
-               "    <b>Newsgroups</b>: "
-               (mapconcat
-                (function
-                 (lambda (grp)
-                   (concat "<a href=\"" grp "\">" grp "</a>"))) qgrps ", ")
-               "<br>\n"
-               (if org
-                   (concat
-                    "    <b>Organization</b>: <i> " qorg "</i> <br>\n")
-                 "")
-               "    <b>Date</b>: <date> " date "</date> <br>\n"
-               "   </p> <hr>\n"
-               (if (null qrefs)
-                   ""
-                 (concat
-                  "   <p>References\n"
-                  "    <ol>\n"
-                  (mapconcat
-                   (function
-                    (lambda (ref)
-                      (concat "     <li> <a href=\"" ref "\"> " 
-                              ref "</a></li>\n")))
-                   qrefs "")
-                  "    </ol>\n"
-                  "   </p>\n"
-                  "   <hr>\n"))
-               "   <ul plain>\n"
-               "    <li><a href=\"newspost:disfunctional\"> "
-               "Post to this group </a></li>\n"
-               "    <li><a href=\"mailto:"; qfrom "\"> Reply to " qfrom
-               "</a></li>\n"
-               "   </ul>\n"
-               "   <hr>"
-               "   <pre>\n")
-       (let ((s (buffer-substring (point) (point-max))))
-         (delete-region (point) (point-max))
-         (insert (url-insert-entities-in-string s)))
-       (goto-char (point-max))
-       (setq url-current-mime-type "text/html"
-             url-current-mime-viewer (mm-mime-info url-current-mime-type nil 
5))
-       (let ((x (assoc "content-type" url-current-mime-headers)))
-         (if x
-             (setcdr x "text/html")
-           (setq url-current-mime-headers (cons (cons "content-type"
-                                                      "text/html")
-                                                url-current-mime-headers))))
-       (insert "\n"
-               "   </pre>\n"
-               "  </div>\n"
-               " </body>\n"
-               "</html>\n"
-               "<!-- Automatically generated by URL/" url-version
-               "-->")))))
-
-(defun url-check-gnus-version ()
-  (require 'nntp)
-  (condition-case ()
-      (require 'gnus)
-    (error (setq gnus-version "GNUS not found")))
-  (if (or (not (boundp 'gnus-version))
-         (and (fboundp 'gnus-continuum-version)
-              (>= (gnus-continuum-version gnus-version) 5))
-         (string-match "v5.[.0-9]+$" gnus-version)
-         (string-match "Red" gnus-version)
-         (string-match "Quassia" gnus-version))
-      nil
-    (url-warn 'url (concat
-                   "The version of GNUS found on this system is too old and 
does\n"
-                   "not support the necessary functionality for the URL 
package.\n"
-                   "Please upgrade to version 5.x of GNUS.  This is bundled 
by\n"
-                   "default with Emacs 19.30 and XEmacs 19.14 and later.\n\n"
-                   "This version of GNUS is: " gnus-version "\n"))
-    (fset 'url-news 'url-news-version-too-old))
-  (fset 'url-check-gnus-version 'ignore))
-
-(defun url-news-version-too-old (article)
-  (set-buffer (get-buffer-create url-working-buffer))
-  (setq url-current-mime-headers '(("content-type" . "text/html"))
-       url-current-mime-type "text/html")
-  (insert "<html>\n"
-         " <head>\n"
-         "  <title>News Error</title>\n"
-         " </head>\n"
-         " <body>\n"
-         "  <h1>News Error - too old</h1>\n"
-         "  <p>\n"
-         "   The version of GNUS found on this system is too old and does\n"
-         "   not support the necessary functionality for the URL package.\n"
-         "   Please upgrade to version 5.x of GNUS.  This is bundled by\n"
-         "   default with Emacs 19.30 and XEmacs 19.14 and later.\n\n"
-         "   This version of GNUS is: " gnus-version "\n"
-         "  </p>\n"
-         " </body>\n"
-         "</html>\n"))
-
-(defun url-news-open-host (host port user pass)
-  (if (fboundp 'nnheader-init-server-buffer)
-      (nnheader-init-server-buffer))
-  (nntp-open-server host (list (string-to-int port)))
-  (if (and user pass)
-      (progn
-       (nntp-send-command "^.*\r?\n" "AUTHINFO USER" user)
-       (nntp-send-command "^.*\r?\n" "AUTHINFO PASS" pass)
-       (if (not (nntp-server-opened host))
-           (url-warn 'url (format "NNTP authentication to `%s' as `%s' failed"
-                                  host user))))))
-
-(defun url-news-fetch-article-number (newsgroup article)
-  (nntp-request-group newsgroup)
-  (nntp-request-article article))
-
-(defun url-news-fetch-message-id (host port message-id)
-  (if (eq ?> (aref message-id (1- (length message-id))))
-      nil
-    (setq message-id (concat "<" message-id ">")))
-  (if (nntp-request-article message-id)
-      (url-format-news)
-    (set-buffer (get-buffer-create url-working-buffer))
-    (setq url-current-can-be-cached nil)
-    (insert "<html>\n"
-           " <head>\n"
-           "  <title>Error</title>\n"
-           " </head>\n"
-           " <body>\n"
-           "  <div>\n"
-           "   <h1>Error requesting article...</h1>\n"
-           "   <p>\n"
-           "    The status message returned by the NNTP server was:"
-           "<br><hr>\n"
-           "    <xmp>\n"
-           (nntp-status-message)
-           "    </xmp>\n"
-           "   </p>\n"
-           "   <p>\n"
-           "    If you If you feel this is an error, <a href=\""
-           "mailto:"; url-bug-address "\">send me mail</a>\n"
-           "   </p>\n"
-           "  </div>\n"
-           " </body>\n"
-           "</html>\n"
-           "<!-- Automatically generated by URL v" url-version " -->\n"
-           )))
-
-(defun url-news-fetch-newsgroup (newsgroup host)
-  (if (string-match "^/+" newsgroup)
-      (setq newsgroup (substring newsgroup (match-end 0))))
-  (if (string-match "/+$" newsgroup)
-      (setq newsgroup (substring newsgroup 0 (match-beginning 0))))
-
-  ;; This saves a bogus 'Untitled' buffer by Emacs-W3
-  (kill-buffer url-working-buffer)
-  
-  ;; This saves us from checking new news if GNUS is already running
-  (if (or (not (get-buffer gnus-group-buffer))
-         (save-excursion
-           (set-buffer gnus-group-buffer)
-           (not (eq major-mode 'gnus-group-mode))))
-      (gnus))
-  (set-buffer gnus-group-buffer)
-  (goto-char (point-min))
-  (gnus-group-read-ephemeral-group newsgroup (list 'nntp host)
-                                  nil
-                                  (cons (current-buffer) 'browse)))
-  
-(defun url-news (article)
-  ;; Find a news reference
-  (url-check-gnus-version)
-  (let* ((urlobj (url-generic-parse-url article))
-        (host (or (url-host urlobj) url-news-server))
-        (port (or (url-port urlobj)
-                  (cdr-safe (assoc "news" url-default-ports))))
-        (article-brackets nil)
-        (article (url-filename urlobj)))
-    (url-news-open-host host port (url-user urlobj) (url-password urlobj))
-    (setq article (url-unhex-string article))
-    (cond
-     ((string-match "@" article)       ; Its a specific article
-      (url-news-fetch-message-id host port article))
-     ((string= article "")             ; List all newsgroups
-      (gnus)
-      (kill-buffer url-working-buffer))
-     (t                                        ; Whole newsgroup
-      (url-news-fetch-newsgroup article host)))))
-
-(defun url-nntp (url)
-  ;; Find a news reference
-  (url-check-gnus-version)
-  (let* ((urlobj (url-generic-parse-url url))
-        (host (or (url-host urlobj) url-news-server))
-        (port (or (url-port urlobj)
-                  (cdr-safe (assoc "nntp" url-default-ports))))
-        (article-brackets nil)
-        (article (url-filename urlobj)))
-    (url-news-open-host host port (url-user urlobj) (url-password urlobj))
-    (setq article (url-unhex-string article))
-    (cond
-     ((string-match "@" article)       ; Its a specific article
-      (url-news-fetch-message-id host port article))
-     ((string-match "/\\([0-9]+\\)$" article)
-      (url-news-fetch-article-number (substring article 0
-                                               (match-beginning 0))
-                                    (match-string 1 article)))
-                                               
-     ((string= article "")             ; List all newsgroups
-      (gnus)
-      (kill-buffer url-working-buffer))
-     (t                                        ; Whole newsgroup
-      (url-news-fetch-newsgroup article host)))))
-
-(provide 'url-news)
diff --git a/lisp/url-nfs.el b/lisp/url-nfs.el
deleted file mode 100644
index 66e5fbb..0000000
--- a/lisp/url-nfs.el
+++ /dev/null
@@ -1,73 +0,0 @@
-;;; url-nfs.el --- NFS URL interface
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:10 $
-;; Version: $Revision: 1.1 $
-;; Keywords: comm, data, processes
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'url-vars)
-(require 'url-parse)
-(require 'cl)
-
-(defvar url-nfs-automounter-directory-spec
-  "file:/net/%h%f"
-  "*How to invoke the NFS automounter.  Certain % sequences are recognized.
-
-%h -- the hostname of the NFS server
-%n -- the port # of the NFS server
-%u -- the username to use to authenticate
-%p -- the password to use to authenticate
-%f -- the filename on the remote server
-%% -- a literal %
-
-Each can be used any number of times.")
-
-(defun url-nfs-unescape (format host port user pass file)
-  (save-excursion
-    (set-buffer (get-buffer-create " *nfs-parse*"))
-    (erase-buffer)
-    (insert format)
-    (goto-char (point-min))
-    (while (re-search-forward "%\\(.\\)" nil t)
-       (let ((escape (aref (match-string 1) 0)))
-        (replace-match "" t t)
-        (case escape
-          (?% (insert "%"))
-          (?h (insert host))
-          (?n (insert (or port "")))
-          (?u (insert (or user "")))
-          (?p (insert (or pass "")))
-          (?f (insert (or file "/"))))))
-    (buffer-string)))
-
-(defun url-nfs (url)
-  (let* ((urlobj (url-generic-parse-url url))
-        (host (url-host urlobj))
-        (port (string-to-int (url-port urlobj)))
-        (pass (url-password urlobj))
-        (user (url-user urlobj))
-        (file (url-filename urlobj)))
-    (url-retrieve (url-nfs-unescape url-nfs-automounter-directory-spec
-                                   host port user pass file))))
-    
diff --git a/lisp/url-ns.el b/lisp/url-ns.el
deleted file mode 100644
index f0731a9..0000000
--- a/lisp/url-ns.el
+++ /dev/null
@@ -1,106 +0,0 @@
-;;; url-ns.el --- Various netscape-ish functions for proxy definitions
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:12 $
-;; Version: $Revision: 1.1 $
-;; Keywords: comm, data, processes, hypermedia
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1997, 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'url-gw)
-
-;;;###autoload
-(defun isPlainHostName (host)
-  (not (string-match "\\." host)))
-
-;;;###autoload
-(defun dnsDomainIs (host dom)
-  (string-match (concat (regexp-quote dom) "$") host))
-
-;;;###autoload
-(defun dnsResolve (host)
-  (url-gateway-nslookup-host host))
-
-;;;###autoload
-(defun isResolvable (host)
-  (if (string-match "^[0-9.]+$" host)
-      t
-    (not (string= host (url-gateway-nslookup-host host)))))
-
-;;;###autoload
-(defun isInNet (ip net mask)
-  (let ((netc (split-string ip "\\."))
-       (ipc  (split-string net "\\."))
-       (maskc (split-string mask "\\.")))
-    (if (or (/= (length netc) (length ipc))
-           (/= (length ipc) (length maskc)))
-       nil
-      (setq netc (mapcar 'string-to-int netc)
-           ipc (mapcar 'string-to-int ipc)
-           maskc (mapcar 'string-to-int maskc))
-      (and
-       (= (logand (nth 0 netc) (nth 0 maskc))
-         (logand (nth 0 ipc)  (nth 0 maskc)))
-       (= (logand (nth 1 netc) (nth 1 maskc))
-         (logand (nth 1 ipc)  (nth 1 maskc)))
-       (= (logand (nth 2 netc) (nth 2 maskc))
-         (logand (nth 2 ipc)  (nth 2 maskc)))
-       (= (logand (nth 3 netc) (nth 3 maskc))
-         (logand (nth 3 ipc)  (nth 3 maskc)))))))
-
-;; Netscape configuration file parsing
-(defvar url-ns-user-prefs nil
-  "Internal, do not use.")
-
-;;;###autoload
-(defun url-ns-prefs (&optional file)
-  (if (not file)
-      (setq file (expand-file-name "~/.netscape/preferences.js")))
-  (if (not (and (file-exists-p file)
-               (file-readable-p file)))
-      (message "Could not open %s for reading" file)
-    (save-excursion
-      (let ((false nil)
-           (true t))
-       (setq url-ns-user-prefs (make-hash-table :size 13 :test 'equal))
-       (set-buffer (get-buffer-create " *ns-parse*"))
-       (erase-buffer)
-       (insert-file-contents file)
-       (goto-char (point-min))
-       (while (re-search-forward "^//" nil t)
-         (replace-match ";;"))
-       (goto-char (point-min))
-       (while (re-search-forward "^user_pref(" nil t)
-         (replace-match "(url-ns-set-user-pref "))
-       (goto-char (point-min))
-       (while (re-search-forward "\"," nil t)
-         (replace-match "\""))
-       (goto-char (point-min))
-       (eval-buffer)))))
-
-(defun url-ns-set-user-pref (key val)
-  (cl-puthash key val url-ns-user-prefs))
-
-;;;###autoload
-(defun url-ns-user-pref (key &optional default)
-  (cl-gethash key url-ns-user-prefs default))
-
-(provide 'url-ns)
diff --git a/lisp/url-parse.el b/lisp/url-parse.el
deleted file mode 100644
index 8e458ff..0000000
--- a/lisp/url-parse.el
+++ /dev/null
@@ -1,201 +0,0 @@
-;;; url-parse.el --- Uniform Resource Locator parser
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/06/28 01:46:57 $
-;; Version: $Revision: 1.2 $
-;; Keywords: comm, data, processes
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defmacro url-type (urlobj)
-  (` (aref (, urlobj) 0)))
-
-(defmacro url-user (urlobj)
-  (` (aref (, urlobj) 1)))
-
-(defmacro url-password (urlobj)
-  (` (aref (, urlobj) 2)))
-
-(defmacro url-host (urlobj)
-  (` (aref (, urlobj) 3)))
-
-(defmacro url-port (urlobj)
-  (` (or (aref (, urlobj) 4)
-        (if (url-fullness (, urlobj))
-            (cdr-safe (assoc (url-type (, urlobj)) url-default-ports))))))
-
-(defmacro url-filename (urlobj)
-  (` (aref (, urlobj) 5)))
-
-(defmacro url-target (urlobj)
-  (` (aref (, urlobj) 6)))
-
-(defmacro url-attributes (urlobj)
-  (` (aref (, urlobj) 7)))
-
-(defmacro url-fullness (urlobj)
-  (` (aref (, urlobj) 8)))
-
-(defmacro url-set-type (urlobj type)
-  (` (aset (, urlobj) 0 (, type))))
-
-(defmacro url-set-user (urlobj user)
-  (` (aset (, urlobj) 1 (, user))))
-
-(defmacro url-set-password (urlobj pass)
-  (` (aset (, urlobj) 2 (, pass))))
-
-(defmacro url-set-host (urlobj host)
-  (` (aset (, urlobj) 3 (, host))))
-
-(defmacro url-set-port (urlobj port)
-  (` (aset (, urlobj) 4 (, port))))
-
-(defmacro url-set-filename (urlobj file)
-  (` (aset (, urlobj) 5 (, file))))
-
-(defmacro url-set-target (urlobj targ)
-  (` (aset (, urlobj) 6 (, targ))))
-
-(defmacro url-set-attributes (urlobj targ)
-  (` (aset (, urlobj) 7 (, targ))))
-
-(defmacro url-set-full (urlobj val)
-  (` (aset (, urlobj) 8 (, val))))
-  
-(defun url-recreate-url (urlobj)
-  (concat (url-type urlobj) ":" (if (url-host urlobj) "//" "")
-         (if (url-user urlobj)
-             (concat (url-user urlobj)
-                     (if (url-password urlobj)
-                         (concat ":" (url-password urlobj)))
-                     "@"))
-         (url-host urlobj)
-         (if (and (url-port urlobj)
-                  (not (equal (url-port urlobj)
-                              (cdr-safe (assoc (url-type urlobj)
-                                               url-default-ports)))))
-             (concat ":" (url-port urlobj)))
-         (or (url-filename urlobj) "/")
-         (if (url-target urlobj)
-             (concat "#" (url-target urlobj)))
-         (if (url-attributes urlobj)
-             (concat ";"
-                     (mapconcat
-                      (function
-                       (lambda (x)
-                         (if (cdr x)
-                             (concat (car x) "=" (cdr x))
-                           (car x)))) (url-attributes urlobj) ";")))))
-
-(defun url-generic-parse-url (url)
-  "Return a vector of the parts of URL.
-Format is:
-\[proto username password hostname portnumber file reference attributes 
fullp\]"
-  (cond
-   ((null url)
-    (make-vector 9 nil))
-   ((or (not (string-match url-nonrelative-link url))
-       (= ?/ (string-to-char url)))
-    (let ((retval (make-vector 9 nil)))
-      (url-set-filename retval url)
-      (url-set-full retval nil)
-      retval))
-   (t
-    (save-excursion
-      (set-buffer (get-buffer-create " *urlparse*"))
-      (set-syntax-table url-mailserver-syntax-table)
-      (let ((save-pos nil)
-           (prot nil)
-           (user nil)
-           (pass nil)
-           (host nil)
-           (port nil)
-           (file nil)
-           (refs nil)
-           (attr nil)
-           (full nil)
-           (inhibit-read-only t))
-       (erase-buffer)
-       (insert url)
-       (goto-char (point-min))
-       (setq save-pos (point))
-       (if (not (looking-at "//"))
-           (progn
-             (skip-chars-forward "a-zA-Z+.\\-")
-             (downcase-region save-pos (point))
-             (setq prot (buffer-substring save-pos (point)))
-             (skip-chars-forward ":")
-             (setq save-pos (point))))
-
-       ;; We are doing a fully specified URL, with hostname and all
-       (if (looking-at "//")
-           (progn
-             (setq full t)
-             (forward-char 2)
-             (setq save-pos (point))
-             (skip-chars-forward "^/")
-             (setq host (buffer-substring save-pos (point)))
-             (if (string-match "^\\(address@hidden)@" host)
-                 (setq user (url-match host 1)
-                       host (substring host (match-end 0) nil)))
-             (if (and user (string-match "\\([^:]+\\):\\(.*\\)" user))
-                 (setq pass (url-match user 2)
-                       user (url-match user 1)))
-             (if (string-match ":\\([0-9+]+\\)" host)
-                 (setq port (url-match host 1)
-                       host (substring host 0 (match-beginning 0))))
-             (if (string-match ":$" host)
-                 (setq host (substring host 0 (match-beginning 0))))
-             (setq host (downcase host)
-                   save-pos (point))))
-
-       ;; Gross hack to preserve ';' in data URLs
-
-       (setq save-pos (point))
-
-       (if (string= "data" prot)
-           (goto-char (point-max))
-         ;; Now check for references
-         (skip-chars-forward "^#")
-         (if (eobp)
-             nil
-           (delete-region
-            (point)
-            (progn
-              (skip-chars-forward "#")
-              (setq refs (buffer-substring (point) (point-max)))
-              (point-max))))
-         (goto-char save-pos)
-         (skip-chars-forward "^;")
-         (if (not (eobp))
-             (setq attr (mm-parse-args (point) (point-max))
-                   attr (nreverse attr))))
-
-       (setq file (buffer-substring save-pos (point)))
-       (and port (string= port (or (cdr-safe (assoc prot url-default-ports))
-                                   ""))
-            (setq port nil))
-       (if (and host (string-match "%[0-9][0-9]" host))
-           (setq host (url-unhex-string host)))
-       (vector prot user pass host port file refs attr full)))))) 
-
-(provide 'url-parse)
diff --git a/lisp/url-pgp.el b/lisp/url-pgp.el
deleted file mode 100644
index 970aa2c..0000000
--- a/lisp/url-pgp.el
+++ /dev/null
@@ -1,175 +0,0 @@
-;;; url-pgp.el --- PGP encapsulation of HTTP
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:09 $
-;; Version: $Revision: 1.1 $
-;; Keywords: comm, data, processes
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'url-vars)
-(require 'url-parse)
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; UUencoding
-;;; ----------
-;;; These functions are needed for the (RI)PEM encoding.  PGP can
-;;; handle binary data, but (RI)PEM requires that it be uuencoded
-;;; first, or it will barf severely.  How rude.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun url-uuencode-buffer (&optional buff)
-  "UUencode buffer BUFF, with a default of the current buffer."
-  (setq buff (or buff (current-buffer)))
-  (save-excursion
-    (set-buffer buff)
-    (url-lazy-message "UUencoding...")
-    (call-process-region (point-min) (point-max)
-                        url-uuencode-program t t nil "url-temp-file")
-    (url-lazy-message "UUencoding... done.")))
-
-(defun url-uudecode-buffer (&optional buff)
-  "UUdecode buffer BUFF, with a default of the current buffer."
-  (setq buff (or buff (current-buffer)))
-  (let ((newname (url-generate-unique-filename)))
-    (save-excursion
-      (set-buffer buff)
-      (goto-char (point-min))
-      (re-search-forward "^begin [0-9][0-9][0-9] \\(.*\\)$" nil t)
-      (replace-match (concat "begin 600 " newname))
-      (url-lazy-message "UUdecoding...")
-      (call-process-region (point-min) (point-max) url-uudecode-program)
-      (url-lazy-message "UUdecoding...")
-      (erase-buffer)
-      (insert-file-contents-literally newname)
-      (url-lazy-message "UUdecoding... done.")
-      (condition-case ()
-         (delete-file newname)
-       (error nil)))))
-      
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Decoding PGP/PEM responses
-;;; --------------------------
-;;; A PGP/PEM encrypted/signed response contains all the real headers,
-;;; so this is just a quick decrypt-then-reparse hack.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun url-decode-pgp/pem (arg)
-  "Decode a pgp/pem response from an HTTP/1.0 server.
-This expects the decoded message to contain all the necessary HTTP/1.0 headers
-to correctly act on the decoded message (new content-type, etc)."
-  (mc-decrypt-message)
-  (url-parse-mime-headers))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; PGP/PEM Encryption
-;;; ------------------
-;;; This implements the highly secure PGP/PEM encrypted requests, as
-;;; specified by NCSA and CERN.
-;;;
-;;; The complete online spec of this scheme was done by Tony Sanders
-;;; <address@hidden>, and can be seen at
-;;; http://www.bsdi.com/HTTP:TNG/ripem-http.txt
-;;;
-;;; This section of code makes use of the EXCELLENT mailcrypt.el
-;;; package by Jin S Choi (address@hidden)
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defun url-public-key-exists (entity scheme)
-  "Return t iff a key for ENTITY exists using public key system SCHEME.
-ENTITY is the username/hostname combination we are checking for.
-SCHEME is a symbol representing what public key encryption program to use.
-       Currently only 'pgp (Pretty Good Privacy) and 'pem (RIPEM) are
-       recognized."
-  (let (retval)
-    (save-excursion
-      (cond
-       ((eq 'pgp scheme)                       ; PGP encryption
-       (set-buffer (get-buffer-create " *keytmp*"))
-       (erase-buffer)
-       (call-process mc-pgp-path nil t nil "+batchmode" "-kxaf" entity)
-       (goto-char (point-min))
-       (setq retval (search-forward mc-pgp-key-begin-line nil t)))
-       ((eq 'pem scheme)                       ; PEM encryption
-       (set-buffer (find-file-noselect mc-ripem-pubkeyfile))
-       (goto-char (point-min))
-       (setq retval (search-forward entity nil t)))
-       (t
-       (url-warn 'security
-                 (format
-                  "Bad value for SCHEME in url-public-key-exists %s"
-                  scheme))))
-      (kill-buffer (current-buffer)))
-    retval))
-
-(defun url-get-server-keys (entity &optional scheme)
-  "Make sure the key for ENTITY exists using SCHEME.
-ENTITY is the username/hostname combination to get the info for.  
-       This should be a string you could pass to 'finger'.
-SCHEME is a symbol representing what public key encryption program to use.
-       Currently only 'pgp (Pretty Good Privacy) and 'pem (RIPEM) are
-       recognized."
-  (or scheme (setq scheme mc-default-scheme))
-  (save-excursion
-    (cond
-     ((url-public-key-exists entity scheme) nil)
-     (t
-      (string-match "\\(address@hidden)@\\(.*\\)" entity)
-      (let ((url-working-buffer " *url-get-keys*"))
-       (url-retrieve (format "gopher://%s:79/0%s/w"; (url-match entity 1)
-                            (url-match entity 2)))
-       (mc-snarf-keys)
-       (kill-buffer url-working-buffer))))))
-   
-(defun url-fetch-with-pgp (url recipient type)
-  "Retrieve a document with public-key authentication.
-      URL is the url to request from the server.
-RECIPIENT is the server's entity name (usually address@hidden)
-     TYPE is a symbol representing what public key encryption program to use.
-          Currently only 'pgp (Pretty Good Privacy) and 'pem (RIPEM) are
-          recognized."
-  (or noninteractive (require 'mailcrypt))
-  (let ((request (url-create-mime-request url "PGP-Redirect"))
-       (url-request-data nil)
-       (url-request-extra-headers nil))
-    (save-excursion
-      (url-get-server-keys recipient type)
-      (set-buffer (get-buffer-create " *url-encryption*"))
-      (erase-buffer)
-      (insert "\n\n" mail-header-separator "\n" request)
-      (mc-encrypt-message recipient type)
-      (goto-char (point-min))
-      (if (re-search-forward (concat "\n" mail-header-separator "\n") nil t)
-         (delete-region (point-min) (point)))
-      (setq url-request-data (buffer-string)
-           url-request-extra-headers
-           (list (cons "Authorized" (format "%s entity=\"%s\""
-                                            (cond
-                                             ((eq type 'pgp) "PGP")
-                                             ((eq type 'pem) "PEM"))
-                                            url-pgp/pem-entity))
-                 (cons "Content-type" (format "application/x-www-%s-reply"
-                                              (cond
-                                               ((eq type 'pgp) "pgp")
-                                               ((eq type 'pem) "pem")))))))
-    (kill-buffer " *url-encryption*")
-    (url-retrieve (url-expand-file-name "/") t)))
-     
-(provide 'url-pgp)
diff --git a/lisp/url-vars.el b/lisp/url-vars.el
index 4cf58c4..70e12de 100644
--- a/lisp/url-vars.el
+++ b/lisp/url-vars.el
@@ -1,7 +1,7 @@
 ;;; url-vars.el --- Variables for Uniform Resource Locator tool
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/10/01 20:22:10 $
-;; Version: $Revision: 1.3 $
+;; Created: $Date: 1999/12/05 08:35:58 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -38,7 +38,7 @@
     (defmacro defcustom (var value doc &rest args) 
       (` (defvar (, var) (, value) (, doc))))))
 
-(defconst url-version (let ((x "$State: p4.0pre.46 $"))
+(defconst url-version (let ((x "$State: p4.0pre.47 $"))
                        (if (string-match "State: \\([^ \t\n]+\\)" x)
                            (substring x (match-beginning 1) (match-end 1))
                          x))
diff --git a/lisp/url-wais.el b/lisp/url-wais.el
deleted file mode 100644
index 0efbce0..0000000
--- a/lisp/url-wais.el
+++ /dev/null
@@ -1,251 +0,0 @@
-;;; url-wais.el --- WAIS Uniform Resource Locator retrieval code
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:09 $
-;; Version: $Revision: 1.1 $
-;; Keywords: comm, data, processes
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'url-vars)
-(require 'url-parse)
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; WAIS support
-;;; ------------
-;;; Here are even more gross hacks that I call native WAIS support.
-;;; This code requires a working waisq program that is fully
-;;; compatible with waisq from think.com
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun url-create-wais-source (server port dbase)
-  ;; Create a temporary wais source description file.  Returns the
-  ;; file name the description is in.
-  (let ((x (url-generate-unique-filename))
-       (y (get-buffer-create " *waisq-tmp*")))
-    (save-excursion
-      (set-buffer y)
-      (erase-buffer)
-      (insert 
-       (format
-       (concat "(:source\n:version 3\n"
-               ":ip-name \"%s\"\n:tcp-port %s\n"
-               ":database-name \"%s\"\n)")
-       server (if (equal port "") "210" port) dbase))
-      (write-region (point-min) (point-max) x nil nil)
-      (kill-buffer y))
-    x))
-
-(defun url-wais-stringtoany (str)
-  ;; Return a wais subelement that specifies STR in any database
-  (concat "(:any :size " (length str) " :bytes #( "
-         (mapconcat 'identity str " ")
-         " ) )"))
-
-;(defun url-retrieve-wais-docid (server port dbase local-id)
-;  (call-process "waisretrieve" nil url-working-buffer nil
-;              (format "%s:address@hidden:%s" (url-unhex-string local-id)
-;                      dbase server port)))
-
-;(url-retrieve-wais-docid "quake.think.com" "210" "directory-of-servers"
-;                      "0 2608 /proj/wais/wais-sources/vpiej-l.src")
-(defun url-retrieve-wais-docid (server port dbase local-id)
-  ;; Retrieve a wais document.
-  ;; SERVER is the server the database is on (:ip-name in source description)
-  ;; PORT is the port number to contact (:tcp-port in the source description)
-  ;; DBASE is the database name (:database-name in the source description)
-  ;; LOCAL-ID is the document (:original-local-id in the question description)
-  (let* ((dbf (url-create-wais-source server port dbase))
-        (qstr (format
-               (concat "(:question :version 2\n"
-                       "           :result-documents\n"
-                       "           ( (:document-id\n"
-                       "              :document\n"
-                       "              (:document\n"
-                       "               :headline \"\"\n"
-                       "               :doc-id\n"
-                       "               (:doc-id :original-database %s\n"
-                       "                :original-local-id %s )\n"
-                       "               :number-of-bytes -1\n"
-                       "               :type \"\"\n"
-                       "               :source\n"
-                       "               (:source-id :filename \"%s\") ) ) ) )")
-               (url-wais-stringtoany dbase)
-               (url-wais-stringtoany (url-unhex-string local-id))
-               dbf))
-        (qf (url-generate-unique-filename)))
-    (set-buffer (get-buffer-create url-working-buffer))
-    (insert qstr)
-    (write-region (point-min) (point-max) qf nil nil)
-    (erase-buffer)
-    (call-process url-waisq-prog nil url-working-buffer nil "-f" qf "-v" "1")
-    (save-excursion
-      (set-buffer url-working-buffer)
-      (setq url-current-file (url-unhex-string local-id)))
-    (condition-case ()
-       (delete-file dbf)
-      (error nil))
-    (condition-case ()
-       (delete-file qf)
-      (error nil))))
-
-;(url-perform-wais-query "quake.think.com" "210" "directory-of-servers" "SGML")
-(defun url-perform-wais-query (server port dbase search)
-  ;; Perform a wais query.
-  ;; SERVER is the server the database is on (:ip-name in source description)
-  ;; PORT is the port number to contact (:tcp-port in the source description)
-  ;; DBASE is the database name (:database-name in the source description)
-  ;; SEARCH is the search term (:seed-words in the question description)"
-  (let ((dbfname (url-create-wais-source server port dbase))
-       (qfname (url-generate-unique-filename))
-       (results 'url-none-gotten))
-    (save-excursion
-      (url-clear-tmp-buffer)
-      (insert
-       (format
-       (concat "(:question\n"
-               " :version 2\n"
-               " :seed-words \"%s\"\n"
-               " :sourcepath \"" url-temporary-directory "\"\n"
-               " :sources\n"
-               " (  (:source-id\n"
-               "     :filename \"%s\"\n"
-               "    )\n"
-               " )\n"
-               " :maximum-results 100)\n")
-       search dbfname))
-      (write-region (point-min) (point-max) qfname nil nil)
-      (erase-buffer)
-      (call-process url-waisq-prog nil url-working-buffer nil "-g" "-f" qfname)
-      (set-buffer url-working-buffer)
-      (erase-buffer)
-      (setq url-current-server server
-           url-current-port port
-           url-current-file dbase)
-      (insert-file-contents-literally qfname)
-      (goto-char (point-min))
-      (if (re-search-forward "(:question" nil t)
-         (delete-region (point-min) (match-beginning 0)))
-      (url-replace-regexp "Process.*finished.*" "")
-      (subst-char-in-region (point-min) (point-max) 35 32)
-      (goto-char (point-min))
-      (message "Done reading info - parsing results...")
-      (if (re-search-forward ":result-documents[^(]+" nil t)
-         (progn
-           (goto-char (match-end 0))
-           (while (eq results 'url-none-gotten)
-             (condition-case ()
-                 (setq results (read (current-buffer)))
-               (error (progn
-                        (setq results 'url-none-gotten)
-                        (goto-char (match-end 0))))))
-           (erase-buffer)
-           (insert "<title>Results of WAIS search</title>\n"
-                   "<h1>Searched " dbase " for " search "</h1>\n"
-                   "<hr>\n"
-                   "Found <b>" (int-to-string (length results))
-                   "</b> matches.\n"
-                   "<ol>\n<li>"
-                   (mapconcat 'url-parse-wais-doc-id results "\n<li>")
-                   "\n</ol>\n<hr>\n"))
-       (message "No results"))
-      (setq url-current-mime-type "text/html")
-      (condition-case ()
-         (delete-file qfname)
-       (error nil))
-      (condition-case ()
-         (delete-file dbfname)
-       (error nil)))))
-
-(defun url-wais-anytostring (x)
-  ;; Convert a (:any ....) wais construct back into a string.
-  (mapconcat 'char-to-string (car (cdr (memq ':bytes x))) ""))
-
-(defun url-parse-wais-doc-id (x)
-  ;; Return a list item that points at the doc-id specified by X
-  (let* ((document (car (cdr (memq ':document x))))
-        (doc-id (car (cdr (memq ':doc-id document))))
-        (score (car (cdr (memq ':score x)))) 
-        (title (car (cdr (memq ':headline document))))
-        (type (car (cdr (memq ':type document))))
-        (size (car (cdr (memq ':number-of-bytes document))))
-        (server (car (cdr (memq ':original-server doc-id))))
-        (dbase (car (cdr (memq ':original-database doc-id))))
-        (localid (car (cdr (memq ':original-local-id doc-id))))
-        (dist-server (car (cdr (memq ':distributor-server doc-id))))
-        (dist-dbase (car (cdr (memq ':distributor-database doc-id))))
-        (dist-id (car (cdr (memq ':distributor-local-id doc-id))))
-        (copyright (or (car (cdr (memq ':copyright-disposition doc-id))) 0)))
-    (format "<a 
href=\"wais://%s:%s/%s/%s/%d/1=%s;2=%s;3=%s;4=%s;5=%s;6=%s;7=%d;\">%s (Score = 
%s)</a>"
-           url-current-server url-current-port url-current-file
-           type size
-           (url-hexify-string (url-wais-anytostring server))
-           (url-hexify-string (url-wais-anytostring dbase))
-           (url-hexify-string (url-wais-anytostring localid))
-           (url-hexify-string (url-wais-anytostring dist-server))
-           (url-hexify-string (url-wais-anytostring dist-dbase))
-           (url-hexify-string (url-wais-anytostring dist-id))
-           copyright title score)))
-
-(defun url-grok-wais-href (url)
-  "Return a list of server, port, database, search-term, doc-id"
-  (if (string-match "wais:/+\\([^/:]+\\):*\\([^/]*\\)/+\\(.*\\)" url)
-      (let ((host (url-match url 1))
-           (port (url-match url 2))
-           (data (url-match url 3)))
-       (list host port data))
-    (make-list 3 nil)))
-
-(defun url-wais (url)
-  ;; Retrieve a document via WAIS
-  (if (and url-wais-gateway-server url-wais-gateway-port)
-      (url-retrieve
-       (format "http://%s:%s/%s";
-              url-wais-gateway-server
-              url-wais-gateway-port
-              (substring url (match-end 0) nil)))
-    (let ((href (url-grok-wais-href url)))
-      (url-clear-tmp-buffer)
-      (setq url-current-type "wais"
-           url-current-server (nth 0 href)
-           url-current-port (nth 1 href)
-           url-current-file (nth 2 href))
-      (cond
-       ((string-match "2=\\(.*\\);3=\\([^ ;]+\\)" (nth 2 href)); full link
-       (url-retrieve-wais-docid (nth 0 href) (nth 1 href)
-                               (url-match (nth 2 href) 1)
-                               (url-match (nth 2 href) 2)))
-       ((string-match "\\([^\\?]+\\)\\?\\(.*\\)" (nth 2 href)) ; stored query
-       (url-perform-wais-query (nth 0 href) (nth 1 href)
-                              (url-match (nth 2 href) 1)
-                              (url-match (nth 2 href) 2)))
-       (t
-       (insert "<title>WAIS search</title>\n"
-               "<h1>WAIS search of " (nth 2 href) "</h1>"
-               "<hr>\n"
-               (format "<form action=\"%s\" 
enctype=\"application/x-w3-wais\">\n" url)
-               "Enter search term: <input name=\"internal-wais\">\n"
-               "</form>\n"
-               "<hr>\n"))))))
-
-(provide 'url-wais)
-
diff --git a/lisp/url.el b/lisp/url.el
deleted file mode 100644
index 5a89219..0000000
--- a/lisp/url.el
+++ /dev/null
@@ -1,2186 +0,0 @@
-;;; url.el --- Uniform Resource Locator retrieval tool
-;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/12 16:30:06 $
-;; Version: $Revision: 1.13 $
-;; Keywords: comm, data, processes, hypermedia
-
-;;; LCD Archive Entry:
-;;; url|William M. Perry|address@hidden|
-;;; Functions for retrieving/manipulating URLs|
-;;; $Date: 1999/11/12 16:30:06 $|$Revision: 1.13 $|Location Undetermined
-;;;
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-
-(require 'cl)
-(require 'url-vars)
-(require 'url-parse)
-(require 'mm)
-(require 'mule-sysdp)
-(require 'devices)
-(or (featurep 'efs)
-    (featurep 'efs-auto)
-    (condition-case ()
-       (require 'ange-ftp)
-      (error nil)))
-
-(eval-and-compile
-  (if (not (and (string-match "XEmacs" emacs-version)
-               (or (> emacs-major-version 19)
-                   (>= emacs-minor-version 14))))
-      (require 'w3-sysdp)))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Functions that might not exist in old versions of emacs
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun url-save-error (errobj)
-  (save-excursion
-    (set-buffer (get-buffer-create " *url-error*"))
-    (erase-buffer))
-  (display-error errobj (get-buffer-create " *url-error*")))
-
-(cond
- ((fboundp 'display-warning)
-  (fset 'url-warn 'display-warning))
- ((fboundp 'w3-warn)
-  (fset 'url-warn 'w3-warn))
- ((fboundp 'warn)
-  (defun url-warn (class message &optional level)
-    (warn "(%s/%s) %s" class (or level 'warning) message)))
- (t
-  (defun url-warn (class message &optional level)
-    (save-excursion
-      (set-buffer (get-buffer-create "*W3-WARNINGS*"))
-      (goto-char (point-max))
-      (save-excursion
-       (insert (format "(%s/%s) %s\n" class (or level 'warning) message)))
-      (display-buffer (current-buffer))))))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Autoload all the URL loaders
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(autoload 'url-file "url-file")
-(autoload 'url-ftp "url-file")
-(autoload 'url-gopher "url-gopher")
-(autoload 'url-irc "url-irc")
-(autoload 'url-http "url-http")
-(autoload 'url-nfs "url-nfs")
-(autoload 'url-mailserver "url-mail")
-(autoload 'url-mailto "url-mail")
-(autoload 'url-mail "url-mail")
-(autoload 'url-info "url-misc")
-(autoload 'url-shttp "url-http")
-(autoload 'url-https "url-http")
-(autoload 'url-data "url-misc")
-(autoload 'url-finger "url-misc")
-(autoload 'url-rlogin "url-misc")
-(autoload 'url-telnet "url-misc")
-(autoload 'url-tn3270 "url-misc")
-(autoload 'url-proxy "url-misc")
-(autoload 'url-netrek "url-misc")
-(autoload 'url-news "url-news")
-(autoload 'url-nntp "url-news")
-(autoload 'url-cid "url-cid")
-(autoload 'url-ldap "url-ldap")
-
-(autoload 'url-open-stream "url-gw")
-(autoload 'url-mime-response-p "url-http")
-(autoload 'url-parse-mime-headers "url-http")
-(autoload 'url-handle-refresh-header "url-http")
-(autoload 'url-create-mime-request "url-http")
-(autoload 'url-create-message-id "url-http")
-(autoload 'url-create-multipart-request "url-http")
-(autoload 'url-parse-viewer-types "url-http")
-
-(autoload 'url-get-authentication "url-auth")
-(autoload 'url-register-auth-scheme "url-auth")
-(autoload 'url-cookie-write-file "url-cookie")
-(autoload 'url-cookie-retrieve "url-cookie")
-(autoload 'url-cookie-generate-header-lines "url-cookie")
-(autoload 'url-cookie-handle-set-cookie "url-cookie")
-
-(autoload 'url-is-cached "url-cache")
-(autoload 'url-store-in-cache "url-cache")
-(autoload 'url-is-cached "url-cache")
-(autoload 'url-cache-create-filename "url-cache")
-(autoload 'url-cache-extract "url-cache")
-(autoload 'url-cache-expired "url-cache")
-
-(require 'md5)
-(require 'base64)
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; File-name-handler-alist functions
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun url-setup-file-name-handlers ()
-  ;; Setup file-name handlers.
-  '(cond
-    ((not (boundp 'file-name-handler-alist))
-     nil)                              ; Don't load if no alist
-    ((rassq 'url-file-handler file-name-handler-alist)
-     nil)                              ; Don't load twice
-    (t
-     (setq file-name-handler-alist
-          (let ((new-handler (cons
-                              (concat "^/*"
-                                      (substring url-nonrelative-link1 nil))
-                              'url-file-handler)))
-            (if file-name-handler-alist
-                (append (list new-handler) file-name-handler-alist)
-              (list new-handler)))))))
-  
-(defun url-file-handler (operation &rest args)
-  ;; Function called from the file-name-handler-alist routines.  OPERATION
-  ;; is what needs to be done ('file-exists-p, etc).  args are the arguments
-  ;; that would have been passed to OPERATION."
-  (let ((fn (get operation 'url-file-handlers))
-       (url (car args))
-       (myargs (cdr args)))
-    (if (= (string-to-char url) ?/)
-       (setq url (substring url 1 nil)))
-    (if fn (apply fn url myargs)
-      (let (file-name-handler-alist)
-       (apply operation url myargs)))))
-
-(defun url-file-handler-identity (&rest args)
-  (car args))
-
-(defun url-file-handler-null (&rest args)
-  nil)
-
-(put 'file-directory-p 'url-file-handlers 'url-file-handler-null)
-(put 'substitute-in-file-name 'url-file-handlers 'url-file-handler-identity)
-(put 'file-writable-p 'url-file-handlers 'url-file-handler-null)
-(put 'file-truename 'url-file-handlers 'url-file-handler-identity)
-(put 'insert-file-contents 'url-file-handlers 'url-insert-file-contents)
-(put 'expand-file-name 'url-file-handlers 'url-expand-file-name)
-(put 'directory-files 'url-file-handlers 'url-directory-files)
-(put 'file-directory-p 'url-file-handlers 'url-file-directory-p)
-(put 'file-writable-p 'url-file-handlers 'url-file-writable-p)
-(put 'file-readable-p 'url-file-handlers 'url-file-exists)
-(put 'file-executable-p 'url-file-handlers 'null)
-(put 'file-symlink-p 'url-file-handlers 'null)
-(put 'file-exists-p 'url-file-handlers 'url-file-exists)
-(put 'copy-file 'url-file-handlers 'url-copy-file)
-(put 'file-attributes 'url-file-handlers 'url-file-attributes)
-(put 'file-name-all-completions 'url-file-handlers
-     'url-file-name-all-completions)
-(put 'file-name-completion 'url-file-handlers 'url-file-name-completion)
-(put 'file-local-copy 'url-file-handlers 'url-file-local-copy)
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Utility functions
-;;; -----------------
-;;; Various functions used around the url code.
-;;; Some of these qualify as hacks, but hey, this is elisp.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(if (fboundp 'mm-string-to-tokens)
-    (fset 'url-string-to-tokens 'mm-string-to-tokens)
-  (defun url-string-to-tokens (str &optional delim)
-    "Return a list of words from the string STR"
-    (setq delim (or delim ? ))
-    (let (results y)
-      (mapcar
-       (function
-       (lambda (x)
-         (cond
-          ((and (= x delim) y) (setq results (cons y results) y nil))
-          ((/= x delim) (setq y (concat y (char-to-string x))))
-          (t nil)))) str)
-      (nreverse (cons y results)))))
-
-(defun url-days-between (date1 date2)
-  ;; Return the number of days between date1 and date2.
-  (- (url-day-number date1) (url-day-number date2)))
-
-(defun url-day-number (date)
-  (let ((dat (mapcar (function (lambda (s) (and s (string-to-int s)) ))
-                    (timezone-parse-date date))))
-    (timezone-absolute-from-gregorian 
-     (nth 1 dat) (nth 2 dat) (car dat))))
-
-(defun url-seconds-since-epoch (date)
-  ;; Returns a number that says how many seconds have
-  ;; lapsed between Jan 1 12:00:00 1970 and DATE."
-  (let* ((tdate (mapcar (function (lambda (ti) (and ti (string-to-int ti))))
-                       (timezone-parse-date date)))
-        (ttime (mapcar (function (lambda (ti) (and ti (string-to-int ti))))
-                       (timezone-parse-time
-                        (aref (timezone-parse-date date) 3))))
-        (edate (mapcar (function (lambda (ti) (and ti (string-to-int ti))))
-                       (timezone-parse-date "Jan 1 12:00:00 1970")))
-        (tday (- (timezone-absolute-from-gregorian 
-                  (nth 1 tdate) (nth 2 tdate) (nth 0 tdate))
-                 (timezone-absolute-from-gregorian 
-                  (nth 1 edate) (nth 2 edate) (nth 0 edate)))))
-    (+ (nth 2 ttime)
-       (* (nth 1 ttime) 60)
-       (* (nth 0 ttime) 60 60)
-       (* tday 60 60 24))))
-
-(defun url-match (s x)
-  ;; Return regexp match x in s.
-  (substring s (match-beginning x) (match-end x)))
-
-(defun url-split (str del)
-  ;; Split the string STR, with DEL (a regular expression) as the delimiter.
-  ;; Returns an assoc list that you can use with completing-read."
-  (let (x y)
-    (while (string-match del str)
-      (setq y (substring str 0 (match-beginning 0))
-           str (substring str (match-end 0) nil))
-      (if (not (string-match "^[ \t]+$" y))
-         (setq x (cons (list y y) x))))
-    (if (not (equal str ""))
-       (setq x (cons (list str str) x)))
-    x))
-
-(defun url-replace-regexp (regexp to-string)
-  (goto-char (point-min))
-  (while (re-search-forward regexp nil t)
-    (replace-match to-string t nil)))
-
-(defun url-clear-tmp-buffer ()
-  (set-buffer (get-buffer-create url-working-buffer))
-  (if buffer-read-only (toggle-read-only))
-  (erase-buffer))  
-
-(defun url-maybe-relative (url)
-  (url-retrieve (url-expand-file-name url)))
-
-(defun url-buffer-is-hypertext (&optional buff)
-  "Return t if a buffer contains HTML, as near as we can guess."
-  (setq buff (or buff (current-buffer)))
-  (save-excursion
-    (set-buffer buff)
-    (let ((case-fold-search t))
-      (goto-char (point-min))
-      (re-search-forward
-       "<\\(TITLE\\|HEAD\\|BASE\\|H[0-9]\\|ISINDEX\\|P\\)>" nil t))))
-
-(defun url-percentage (x y)
-  (if (fboundp 'float)
-      (round (* 100 (/ x (float y))))
-    (/ (* x 100) y)))
-
-(defun url-pretty-length (n)
-  (cond
-   ((< n 1024)
-    (format "%d bytes" n))
-   ((< n (* 1024 1024))
-    (format "%dk" (/ n 1024.0)))
-   (t
-    (format "%2.2fM" (/ n (* 1024 1024.0))))))
-
-(defun url-after-change-function (&rest args)
-  ;; The nitty gritty details of messaging the HTTP/1.0 status messages
-  ;; in the minibuffer."
-  (or url-current-content-length
-      (save-excursion
-       (goto-char (point-min))
-       (skip-chars-forward " \t\n")
-       (if (not (looking-at "HTTP/[0-9]\.[0-9]"))
-           (setq url-current-content-length 0)
-         (setq url-current-isindex
-               (and (re-search-forward "$\r*$" nil t) (point)))
-         (if (re-search-forward
-              "^content-type:[ \t]*\\([^\r\n]+\\)\r*$"
-              url-current-isindex t)
-             (setq url-current-mime-type (downcase
-                                          (url-eat-trailing-space
-                                           (buffer-substring
-                                            (match-beginning 1)
-                                            (match-end 1))))))
-         (goto-char (point-min))
-         (if (re-search-forward "^content-length:\\([^\r\n]+\\)\r*$"
-                                url-current-isindex t)
-             (setq url-current-content-length
-                   (string-to-int (buffer-substring (match-beginning 1)
-                                                    (match-end 1))))
-           (setq url-current-content-length nil))))
-      )
-  (let ((current-length (max (point-max)
-                            (if url-current-isindex
-                                (- (point-max) url-current-isindex)
-                              (point-max)))))
-    (cond
-     ((and url-current-content-length (> url-current-content-length 1)
-          url-current-mime-type)
-      (if (fboundp 'progress)
-         (progress "Reading [%s] %s"
-                   (url-percentage current-length
-                                   url-current-content-length)
-                   url-current-mime-type (url-pretty-length 
url-current-content-length)))
-      (url-lazy-message "Reading [%s]... %s of %s (%d%%)"
-                       url-current-mime-type
-                       (url-pretty-length current-length)
-                       (url-pretty-length url-current-content-length)
-                       (url-percentage current-length
-                                       url-current-content-length)))
-     ((and url-current-content-length (> url-current-content-length 1))
-      (if (fboundp 'progress)
-         (progress "Reading %s"
-                   (url-percentage current-length
-                                   url-current-content-length)
-                   url-current-mime-type (url-pretty-length 
url-current-content-length)))
-      (url-lazy-message "Reading... %s of %s (%d%%)"
-                       (url-pretty-length current-length)
-                       (url-pretty-length url-current-content-length)
-                       (url-percentage current-length
-                                       url-current-content-length)))
-     ((and (/= 1 current-length) url-current-mime-type)
-      (url-lazy-message "Reading [%s]... %s"
-                       url-current-mime-type
-                       (url-pretty-length current-length)))
-     ((/= 1 current-length)
-      (url-lazy-message "Reading... %s."
-                       (url-pretty-length current-length)))
-     (t (url-lazy-message "Waiting for response...")))))
-
-(defun url-insert-entities-in-string (string)
-  "Convert HTML markup-start characters to entity references in STRING.
-  Also replaces the \" character, so that the result may be safely used as
-  an attribute value in a tag.  Returns a new string with the result of the
-  conversion.  Replaces these characters as follows:
-    &  ==>  &amp;
-    <  ==>  &lt;
-    >  ==>  &gt;
-    \"  ==>  &quot;"
-  (if (string-match "[&<>\"]" string)
-      (save-excursion
-       (set-buffer (get-buffer-create " *entity*"))
-       (erase-buffer)
-       (buffer-disable-undo (current-buffer))
-       (insert string)
-       (goto-char (point-min))
-       (while (progn
-                (skip-chars-forward "^&<>\"")
-                (not (eobp)))
-         (insert (cdr (assq (char-after (point))
-                            '((?\" . "&quot;")
-                              (?& . "&amp;")
-                              (?< . "&lt;")
-                              (?> . "&gt;")))))
-         (delete-char 1))
-       (buffer-string))
-    string))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Information information
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defvar url-process-lookup-table nil)
-
-(defun url-process-get (proc prop &optional default)
-  "Get a value associated to PROC as property PROP
-         in plist stored in `url-process-lookup-table'"
-  (or (plist-get (cdr-safe (assq proc url-process-lookup-table)) prop)
-      default))
-
-(defun url-process-put (proc prop val)
-  "Associate to PROC as property PROP the value VAL
-         in plist stored in `url-process-lookup-table'"
-  (let ((node (assq proc url-process-lookup-table)))
-    (if (not node)
-       (setq url-process-lookup-table (cons (cons proc (list prop val))
-                                            url-process-lookup-table))
-      (setcdr node (plist-put (cdr node) prop val)))))
-
-(defun url-gc-process-lookup-table ()
-  (let (new)
-    (while url-process-lookup-table
-      (if (not (memq (process-status (caar url-process-lookup-table))
-                    '(stop closed nil)))
-         (setq new (cons (car url-process-lookup-table) new)))
-      (setq url-process-lookup-table (cdr url-process-lookup-table)))
-    (setq url-process-lookup-table new)))
-
-(defun url-process-list ()
-  (url-gc-process-lookup-table)
-  (let ((processes (process-list))
-       (retval nil))
-    (while processes
-      (if (url-process-get (car processes) 'url)
-         (setq retval (cons (car processes) retval)))
-      (setq processes (cdr processes)))
-    retval))
-    
-(defun url-list-processes ()
-  (interactive)
-  (let ((processes (url-process-list))
-       proc total-len len type url
-       (url-status-buf (get-buffer-create "URL Status Display")))
-    (set-buffer url-status-buf)
-    (erase-buffer)
-    (display-buffer url-status-buf)
-    (insert
-     (eval-when-compile (format "%-40s %-20s %-15s" "URL" "Size" "Type")) "\n"
-     (eval-when-compile (make-string 77 ?-)) "\n")
-    (while processes
-      (setq proc (car processes)
-           processes (cdr processes))
-      (save-excursion
-       (set-buffer (process-buffer proc))
-       (setq total-len url-current-content-length
-             len (max (point-max)
-                      (if url-current-isindex
-                          (- (point-max) url-current-isindex)
-                        (point-max)))
-             type url-current-mime-type
-             url (url-process-get proc 'url))
-       (set-buffer url-status-buf)
-       (insert
-        (format "%-40s%s%-20s %-15s\n"
-                (url-process-get proc 'url)
-                (if (> (length url) 40)
-                    (format "\n%-40s " " ")
-                  " ")
-                (if total-len
-                    (format "%d of %d" len total-len)
-                  (format "%d" len))
-                (or type "unknown")))))))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; file-name-handler stuff calls this
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defun url-have-visited-url (url &rest args)
-  "Return non-nil iff the user has visited URL before.
-The return value is a cons of the url and the date last accessed as a string"
-  (cl-gethash url url-global-history-hash-table))
-
-(defun url-directory-files (url &rest args)
-  "Return a list of files on a server."
-  nil)
-
-(defun url-file-writable-p (url &rest args)
-  "Return t iff a url is writable by this user"
-  nil)
-
-(defun url-copy-file (url &rest args)
-  "Copy a url to the specified filename."
-  nil)
-
-(defun url-file-directly-accessible-p (url)
-  "Returns t iff the specified URL is directly accessible
-on your filesystem.  (nfs, local file, etc)."
-  (let* ((urlobj (if (vectorp url) url (url-generic-parse-url url)))
-        (type (url-type urlobj))
-        (host (url-host urlobj)))
-    (and (member type '("file" "ftp"))
-        (url-host-is-local-p host)
-        (not (string-match "\\.\\(gz\\|Z\\|z\\)$" url)))))
-
-;;;###autoload
-(defun url-file-attributes (url &rest args)
-  "Return a list of attributes of URL.
-Value is nil if specified file cannot be opened.
-Otherwise, list elements are:
- 0. t for directory, string (name linked to) for symbolic link, or nil.
- 1. Number of links to file.
- 2. File uid.
- 3. File gid.
- 4. Last access time, as a list of two integers.
-  First integer has high-order 16 bits of time, second has low 16 bits.
- 5. Last modification time, likewise.
- 6. Last status change time, likewise.
- 7. Size in bytes. (-1, if number is out of range).
- 8. File modes, as a string of ten letters or dashes as in ls -l.
-    If URL is on an http server, this will return the content-type if possible.
- 9. t iff file's gid would change if file were deleted and recreated.
-10. inode number.
-11. Device number.
-
-If file does not exist, returns nil."
-  (and url
-       (let* ((urlobj (url-generic-parse-url url))
-             (type (url-type urlobj))
-             (url-automatic-caching nil)
-             (data nil)
-             (exists nil))
-        (cond
-         ((equal type "http")
-          (cond
-           ((not url-be-anal-about-file-attributes)
-            (setq data (list
-                        (url-file-directory-p url) ; Directory
-                        1              ; number of links to it
-                        0              ; UID
-                        0              ; GID
-                        (cons 0 0)     ; Last access time
-                        (cons 0 0)     ; Last mod. time
-                        (cons 0 0)     ; Last status time
-                        -1             ; file size
-                        (mm-extension-to-mime
-                         (url-file-extension (url-filename urlobj)))
-                        nil            ; gid would change
-                        0              ; inode number
-                        0              ; device number
-                        )))
-           (t                          ; HTTP/1.0, use HEAD
-            (let ((url-request-method "HEAD")
-                  (url-request-data nil)
-                  (url-working-buffer " *url-temp*"))
-              (save-excursion
-                (condition-case ()
-                    (progn
-                      (url-retrieve url)
-                      (setq data (and
-                                  (setq exists
-                                        (cdr
-                                         (assoc "status"
-                                                url-current-mime-headers)))
-                                  (>= exists 200)
-                                  (< exists 300)
-                                  (list
-                                   (url-file-directory-p url) ; Directory
-                                   1   ; links to
-                                   0   ; UID
-                                   0   ; GID
-                                   (cons 0 0) ; Last access time
-                                   (cons 0 0) ; Last mod. time
-                                   (cons 0 0) ; Last status time
-                                   (or ; Size in bytes
-                                    (cdr (assoc "content-length"
-                                                url-current-mime-headers))
-                                    -1)
-                                   (or
-                                    (cdr (assoc "content-type"
-                                                url-current-mime-headers))
-                                    (mm-extension-to-mime
-                                     (url-file-extension
-                                      (url-filename urlobj)))) ; content-type
-                                   nil ; gid would change
-                                   0   ; inode number
-                                   0   ; device number
-                                   ))))
-                  (error nil))
-                (and (not data)
-                     (setq data (list (url-file-directory-p url)
-                                      1 0 0 (cons 0 0) (cons 0 0) (cons 0 0)
-                                      -1 (mm-extension-to-mime
-                                          (url-file-extension
-                                           (url-filename
-                                            url-current-object)))
-                                      nil 0 0)))
-                (kill-buffer " *url-temp*"))))))
-         ((member type '("ftp" "file"))
-          (let ((fname (if (url-host urlobj)
-                           (concat "/"
-                                   (cond
-                                    ((url-user urlobj)
-                                     (concat (url-user urlobj) "@"))
-                                    ((member type '("ftp"))
-                                     "anonymous@")
-                                    (t ""))
-                                   (url-host urlobj) ":"
-                                   (url-filename urlobj))
-                         (url-filename urlobj))))
-            (setq data (or (file-attributes fname) (make-list 12 nil)))
-            (setcar (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr data))))))))
-                    (mm-extension-to-mime (url-file-extension fname)))))
-         (t nil))
-        data)))
-
-(defun url-file-name-all-completions (file dirname &rest args)
-  "Return a list of all completions of file name FILE in directory DIR.
-These are all file names in directory DIR which begin with FILE."
-  ;; need to rewrite
-  )
-
-(defun url-file-name-completion (file dirname &rest args)
-  "Complete file name FILE in directory DIR.
-Returns the longest string
-common to all filenames in DIR that start with FILE.
-If there is only one and FILE matches it exactly, returns t.
-Returns nil if DIR contains no name starting with FILE."
-  (apply 'url-file-name-all-completions file dirname args))
-
-(defun url-file-local-copy (file &rest args)
-  "Copy the file FILE into a temporary file on this machine.
-Returns the name of the local copy, or nil, if FILE is directly
-accessible."
-  nil)
-
-(defun url-insert-file-contents (url &rest args)
-  "Insert the contents of the URL in this buffer."
-  (interactive "sURL: ")
-  (save-excursion
-    (let ((old-asynch (default-value 'url-be-asynchronous)))
-      (unwind-protect
-         (progn
-           (setq-default url-be-asynchronous nil)
-           (let ((buf (current-buffer))
-                 (url-working-buffer (cdr (url-retrieve url))))
-             (set-buffer url-working-buffer)
-             (url-uncompress)
-             (set-buffer buf)
-             (insert-buffer url-working-buffer)
-             (setq buffer-file-name url)
-             (save-excursion
-               (set-buffer url-working-buffer)
-               (set-buffer-modified-p nil))
-             (kill-buffer url-working-buffer)))
-       (setq-default url-be-asynchronous old-asynch)))))
-
-(defun url-file-directory-p (url &rest args)
-  "Return t iff a url points to a directory"
-  (equal (substring url -1 nil) "/"))
-
-(defun url-file-exists (url &rest args)
-  "Return t iff a file exists."
-  (let* ((urlobj (url-generic-parse-url url))
-        (type (url-type urlobj))
-        (exists nil))
-    (cond
-     ((equal type "http")              ; use head
-      (let ((url-request-method "HEAD")
-           (url-request-data nil)
-           (url-working-buffer " *url-temp*"))
-       (save-excursion
-         (url-retrieve url)
-         (setq exists (or (cdr
-                           (assoc "status" url-current-mime-headers)) 500))
-         (kill-buffer " *url-temp*")
-         (setq exists (and (>= exists 200) (< exists 300))))))
-     ((member type '("ftp" "file"))    ; file-attributes
-      (let ((fname (if (url-host urlobj)
-                      (concat "/"
-                              (if (url-user urlobj)
-                                  (concat (url-user urlobj) "@")
-                                "anonymous@")
-                              (url-host urlobj) ":"
-                              (url-filename urlobj))
-                    (url-filename urlobj))))
-       (setq exists (file-exists-p fname))))
-     (t nil))
-    exists))
-
-;;;###autoload
-(defun url-normalize-url (url)
-  "Return a 'normalized' version of URL.  This strips out default port
-numbers, etc."
-  (let (type data grok retval)
-    (setq data (url-generic-parse-url url)
-         type (url-type data))
-    (if (member type '("www" "about" "mailto" "mailserver" "info"))
-       (setq retval url)
-      (url-set-target data nil)
-      (setq retval (url-recreate-url data)))
-    retval))
-
-;;;###autoload
-(defun url-buffer-visiting (url)
-  "Return the name of a buffer (if any) that is visiting URL."
-  (setq url (url-normalize-url url))
-  (let ((bufs (buffer-list))
-       (found nil))
-    (while (and bufs (not found))
-      (save-excursion
-       (set-buffer (car bufs))
-       (setq found (if (and
-                        (not (string-match " \\*URL-?[0-9]*\\*" (buffer-name 
(car bufs))))
-                        (memq major-mode '(url-mode w3-mode))
-                        (equal (url-normalize-url (url-view-url t)) url))
-                       (car bufs) nil)
-             bufs (cdr bufs))))
-    found))
-
-(defun url-file-size (url &rest args)
-  "Return the size of a file in bytes, or -1 if can't be determined."
-  (let* ((urlobj (url-generic-parse-url url))
-        (type (url-type urlobj))
-        (size -1)
-        (data nil))
-    (cond
-     ((equal type "http")              ; use head
-      (let ((url-request-method "HEAD")
-           (url-request-data nil)
-           (url-working-buffer " *url-temp*"))
-       (save-excursion
-         (url-retrieve url)
-         (setq size (or (cdr
-                         (assoc "content-length" url-current-mime-headers))
-                        -1))
-         (kill-buffer " *url-temp*"))))
-     ((member type '("ftp" "file"))    ; file-attributes
-      (let ((fname (if (url-host urlobj)
-                      (concat "/"
-                              (if (url-user urlobj)
-                                  (concat (url-user urlobj) "@")
-                                "anonymous@")
-                              (url-host urlobj) ":"
-                              (url-filename urlobj))
-                    (url-filename urlobj))))
-       (setq data (file-attributes fname)
-             size (nth 7 data))))
-     (t nil))
-    (cond
-     ((stringp size) (string-to-int size))
-     ((integerp size) size)
-     ((null size) -1)
-     (t -1))))
-
-(defun url-generate-new-buffer-name (start)
-  "Create a new buffer name based on START."
-  (let ((x 1)
-       name)
-    (if (not (get-buffer start))
-       start
-      (progn
-       (setq name (format "%s<%d>" start x))
-       (while (get-buffer name)
-         (setq x (1+ x)
-               name (format "%s<%d>" start x)))
-       name))))
-
-(defvar url-generate-unique-filename-counter 0)
-
-(defun url-generate-unique-filename (&optional fmt)
-  "Generate a unique filename in url-temporary-directory"
-  (setq url-generate-unique-filename-counter
-       (1+ url-generate-unique-filename-counter))
-  (if (not fmt)
-      (let ((base (format "url-tmp.%d" (user-real-uid)))
-           (fname "")
-           (x url-generate-unique-filename-counter))
-       (setq fname (format "%s%d" base x))
-       (while (file-exists-p (expand-file-name fname url-temporary-directory))
-         (setq x (1+ x)
-               fname (concat base (int-to-string x))))
-       (setq url-generate-unique-filename-counter x)
-       (expand-file-name fname url-temporary-directory))
-    (let ((base (concat "url" (int-to-string (user-real-uid))))
-         (fname "")
-         (x url-generate-unique-filename-counter))
-      (setq fname (format fmt (concat base (int-to-string x))))
-      (while (file-exists-p (expand-file-name fname url-temporary-directory))
-       (setq x (1+ x)
-             fname (format fmt (concat base (int-to-string x)))))
-      (setq url-generate-unique-filename-counter x)
-      (expand-file-name fname url-temporary-directory))))
-
-(defun url-lazy-message (&rest args)
-  "Just like `message', but is a no-op if called more than once a second.
-Will not do anything if url-show-status is nil."
-  (if (or (null url-show-status)
-         (active-minibuffer-window)
-         (= url-lazy-message-time
-            (setq url-lazy-message-time (nth 1 (current-time)))))
-      nil
-    (apply 'message args)))
-
-
-(defun url-kill-process (proc)
-  "Kill the process PROC - knows about all the various gateway types,
-and acts accordingly."
-  (delete-process proc))
-
-(defun url-accept-process-output (proc)
-  "Allow any pending output from subprocesses to be read by Emacs.
-It is read into the process' buffers or given to their filter functions.
-Where possible, this will not exit until some output is received from PROC,
-or 1 second has elapsed."
-  (accept-process-output proc 1))
-
-(defun url-process-status (proc)
-  "Return the process status of a url buffer"
-  (process-status proc))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Miscellaneous functions
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun url-setup-privacy-info ()
-  (interactive)
-  (setq url-system-type
-       (cond
-        ((or (eq url-privacy-level 'paranoid)
-             (and (listp url-privacy-level)
-                  (memq 'os url-privacy-level)))
-         nil)
-        ;; First, we handle the inseparable OS/Windowing system
-        ;; combinations
-        ((eq system-type 'Apple-Macintosh) "Macintosh")
-        ((eq system-type 'next-mach) "NeXT")
-        ((eq system-type 'windows-nt) "Windows-NT; 32bit")
-        ((eq system-type 'ms-windows) "Windows; 16bit")
-        ((eq system-type 'ms-dos) "MS-DOS; 32bit")
-        ((memq (device-type) '(win32 w32)) "Windows; 32bit")
-        ((eq (device-type) 'pm) "OS/2; 32bit")
-        (t
-         (case (device-type)
-           (x "X11")
-           (ns "OpenStep")
-           (tty "TTY")
-           (otherwise nil)))))
-
-  (setq url-personal-mail-address (or url-personal-mail-address
-                                     user-mail-address
-                                     (format "address@hidden"  
(user-real-login-name)
-                                             (system-name))))
-
-  (if (or (memq url-privacy-level '(paranoid high))
-         (and (listp url-privacy-level)
-              (memq 'email url-privacy-level)))
-      (setq url-personal-mail-address nil))
-
-  (setq url-os-type
-       (cond
-        ((or (eq url-privacy-level 'paranoid)
-             (and (listp url-privacy-level)
-                  (memq 'os url-privacy-level)))
-         nil)
-        ((boundp 'system-configuration)
-         system-configuration)
-        ((boundp 'system-type)
-         (symbol-name system-type))
-        (t nil))))
-
-(defun url-handle-no-scheme (url)
-  (let ((temp url-registered-protocols)
-       (found nil))
-    (while (and temp (not found))
-      (if (and (not (member (car (car temp)) '("auto" "www")))
-              (string-match (concat "^" (car (car temp)) "\\.")
-                                       url))
-         (setq found t)
-       (setq temp (cdr temp))))
-    (cond
-     (found                            ; Found something like ftp.spry.com
-      (url-retrieve (concat (car (car temp)) "://" url)))
-     ((string-match "^www\\." url)
-      (url-retrieve (concat "http://"; url)))
-     ((string-match "\\(\\.[^\\.]+\\)\\(\\.[^\\.]+\\)" url)
-      ;; Ok, we have at least two dots in the filename, just stick http on it
-      (url-retrieve (concat "http://"; url)))
-     ((setq temp (run-hook-with-args-until-success
-                 'url-handle-no-scheme-hook url))
-      (url-retrieve temp))
-     (t
-      (url-retrieve (concat "http://www."; url ".com"))))))
-
-;;;###autoload
-(defun url-setup-save-timer ()
-  "Reset the history list timer."
-  (interactive)
-  (cond
-   ((featurep 'itimer)
-    (if (get-itimer "url-history-saver")
-       (delete-itimer (get-itimer "url-history-saver")))
-    (start-itimer "url-history-saver" 'url-write-global-history
-                 url-global-history-save-interval
-                 url-global-history-save-interval))
-   ((fboundp 'run-at-time)
-    (run-at-time url-global-history-save-interval
-                url-global-history-save-interval
-                'url-write-global-history))
-   (t nil)))
-
-(defvar url-download-minor-mode nil)
-
-(defun url-download-minor-mode (on)
-  (setq url-download-minor-mode (if on
-                                  (1+ (or url-download-minor-mode 0))
-                                (1- (or url-download-minor-mode 1))))
-  (if (<= url-download-minor-mode 0)
-      (setq url-download-minor-mode nil)))
-
-;;;###autoload
-(defun url-do-setup ()
-  "Do setup - this is to avoid conflict with user settings when URL is
-dumped with emacs."
-  (if url-setup-done
-      nil
-
-    (add-minor-mode 'url-download-minor-mode " Webbing" nil)
-    
-    ;; Make OS/2 happy
-    (setq tcp-binary-process-input-services
-         (append '("http" "80")
-                 tcp-binary-process-input-services))
-    
-    ;; Register all the protocols we can handle
-    (url-register-protocol 'file)
-    (url-register-protocol 'ftp        nil nil "21")
-    (url-register-protocol 'gopher     nil nil "70")
-    (url-register-protocol 'http       nil nil "80")
-    (url-register-protocol 'https      nil nil "443")
-    (url-register-protocol 'nfs        nil nil "2049")
-    (url-register-protocol 'info       nil 'url-identity-expander)
-    (url-register-protocol 'mailserver nil 'url-identity-expander)
-    (url-register-protocol 'finger     nil 'url-identity-expander "79")
-    (url-register-protocol 'mailto     nil 'url-identity-expander)
-    (url-register-protocol 'news       nil 'url-identity-expander "119")
-    (url-register-protocol 'nntp       nil 'url-identity-expander "119")
-    (url-register-protocol 'irc        nil 'url-identity-expander "6667")
-    (url-register-protocol 'data       nil 'url-identity-expander)
-    (url-register-protocol 'netrek     nil 'url-identity-expander)
-    (url-register-protocol 'cid        nil 'url-identity-expander)
-    (url-register-protocol 'rlogin)
-    (url-register-protocol 'telnet)
-    (url-register-protocol 'tn3270)
-    (url-register-protocol 'proxy)
-    (url-register-protocol 'ldap)
-    (url-register-protocol 'auto 'url-handle-no-scheme)
-
-    ;; Register all the authentication schemes we can handle
-    (url-register-auth-scheme "basic" nil 4)
-    (url-register-auth-scheme "digest" nil 7)
-
-    ;; Filename handler stuff for emacsen that support it
-    (url-setup-file-name-handlers)
-
-    (setq url-cookie-file
-         (or url-cookie-file
-             (expand-file-name "cookies" w3-configuration-directory)))
-    
-    (setq url-global-history-file
-         (or url-global-history-file
-             (and (memq system-type '(ms-dos ms-windows))
-                  (expand-file-name "~/mosaic.hst"))
-             (and (memq system-type '(axp-vms vax-vms))
-                  (expand-file-name "~/mosaic.global-history"))
-             (condition-case ()
-                 (expand-file-name (concat w3-configuration-directory 
"history"))
-               (error nil))))
-  
-    ;; Parse the global history file if it exists, so that it can be used
-    ;; for URL completion, etc.
-    (if (and url-global-history-file
-            (file-exists-p url-global-history-file))
-       (url-parse-global-history))
-
-    ;; Setup save timer
-    (and url-global-history-save-interval (url-setup-save-timer))
-
-    (if (and url-cookie-file
-            (file-exists-p url-cookie-file))
-       (url-cookie-parse-file url-cookie-file))
-    
-    ;; Read in proxy gateways
-    (let ((noproxy (and (not (assoc "no_proxy" url-proxy-services))
-                       (or (getenv "NO_PROXY")
-                           (getenv "no_PROXY")
-                           (getenv "no_proxy")))))
-      (if noproxy
-         (setq url-proxy-services
-               (cons (cons "no_proxy"
-                           (concat "\\("
-                                   (mapconcat
-                                    (function
-                                     (lambda (x)
-                                       (cond
-                                        ((= x ?,) "\\|")
-                                        ((= x ? ) "")
-                                        ((= x ?.) (regexp-quote "."))
-                                        ((= x ?*) ".*")
-                                        ((= x ??) ".")
-                                        (t (char-to-string x)))))
-                                    noproxy "") "\\)"))
-                     url-proxy-services))))
-
-    ;; Set the password entry funtion based on user defaults or guess
-    ;; based on which remote-file-access package they are using.
-    (cond
-     (url-passwd-entry-func nil)       ; Already been set
-     ((fboundp 'read-passwd)           ; Use secure password if available
-      (setq url-passwd-entry-func 'read-passwd))
-     ((or (featurep 'efs)              ; Using EFS
-         (featurep 'efs-auto))         ; or autoloading efs
-      (if (not (fboundp 'read-passwd))
-         (autoload 'read-passwd "passwd" "Read in a password" nil))
-      (setq url-passwd-entry-func 'read-passwd))
-     ((or (featurep 'ange-ftp)         ; Using ange-ftp
-         (and (boundp 'file-name-handler-alist)
-              (not (string-match "Lucid" (emacs-version)))))
-      (setq url-passwd-entry-func 'ange-ftp-read-passwd))
-     (t
-      (url-warn
-       'security
-       "(url-setup): Can't determine how to read passwords, winging it.")))
-  
-    ;; Set up the news service if they haven't done so
-    (setq url-news-server
-         (cond
-          (url-news-server url-news-server)
-          ((and (boundp 'gnus-default-nntp-server)
-                (not (equal "" gnus-default-nntp-server)))
-           gnus-default-nntp-server)
-          ((and (boundp 'gnus-nntp-server)
-                (not (null gnus-nntp-server))
-                (not (equal "" gnus-nntp-server)))
-           gnus-nntp-server)
-          ((and (boundp 'nntp-server-name)
-                (not (null nntp-server-name))
-                (not (equal "" nntp-server-name)))
-           nntp-server-name)
-          ((getenv "NNTPSERVER") (getenv "NNTPSERVER"))
-          (t "news")))
-  
-    ;; Set up the MIME accept string if they haven't got it hardcoded yet
-    (or url-mime-accept-string
-       (setq url-mime-accept-string (url-parse-viewer-types)))
-    (or url-mime-encoding-string
-       (setq url-mime-encoding-string
-             (mapconcat 'car
-                        mm-content-transfer-encodings
-                        ", ")))
-  
-    (url-setup-privacy-info)
-    (run-hooks 'url-load-hook)
-    (setq url-setup-done t)))
-
-;;; Evidently, there is a chicken and egg problem with the
-;;; eval-when-compile in url-get-url-at-point, so we have to eval this
-;;; at compile time.
-(eval-and-compile
-  (defvar url-get-url-filename-chars "address@hidden()_/:~=&"
-    "Valid characters in a URL")
-  )
-
-;;;###autoload
-(defun url-get-url-at-point (&optional pt)
-  "Get the URL closest to point, but don't change your
-position. Has a preference for looking backward when not
-directly on a symbol."
-  ;; Not at all perfect - point must be right in the name.
-  (save-excursion
-    (if pt (goto-char pt))
-    (let (start url)
-      (save-excursion
-       ;; first see if you're just past a filename
-       (if (not (eobp))
-           (if (looking-at "[] \t\n[{}()]") ; whitespace or some parens
-               (progn
-                 (skip-chars-backward " \n\t\r({[]})")
-                 (if (not (bobp))
-                     (backward-char 1)))))
-       (if (and (char-after (point))
-                (string-match (eval-when-compile
-                                (concat "[" url-get-url-filename-chars "]"))
-                              (char-to-string (char-after (point)))))
-           (progn
-             (skip-chars-backward url-get-url-filename-chars)
-             (setq start (point))
-             (skip-chars-forward url-get-url-filename-chars))
-         (setq start (point)))
-       (setq url (buffer-substring-no-properties start (point))))
-      (if (string-match "^(.*)$" url)
-         (setq url (substring url 1 -1)))
-      (if (string-match "^URL:" url)
-         (setq url (substring url 4 nil)))
-      (if (string-match "\\.$" url)
-         (setq url (substring url 0 -1)))
-      (if (string-match "^www\\." url)
-         (setq url (concat "http://"; url)))
-      (if (not (string-match url-nonrelative-link url))
-         (setq url nil))
-      url)))
-
-(defun url-eat-trailing-space (x)
-  ;; Remove spaces/tabs at the end of a string
-  (let ((y (1- (length x)))
-       (skip-chars (list ?  ?\t ?\n)))
-    (while (and (>= y 0) (memq (aref x y) skip-chars))
-      (setq y (1- y)))
-    (substring x 0 (1+ y))))
-
-(defun url-strip-leading-spaces (x)
-  ;; Remove spaces at the front of a string
-  (let ((y (1- (length x)))
-       (z 0)
-       (skip-chars (list ?  ?\t ?\n)))
-    (while (and (<= z y) (memq (aref x z) skip-chars))
-      (setq z (1+ z)))
-    (substring x z nil)))
-
-(defun url-convert-newlines-to-spaces (x)
-  "Convert newlines and carriage returns embedded in a string into spaces,
-and swallow following whitespace.
-The argument is not side-effected, but may be returned by this function."
-  (if (string-match "[\n\r]+\\s-*" x)   ; [\\n\\r\\t ]
-      (concat (substring x 0 (match-beginning 0)) " "
-             (url-convert-newlines-to-spaces
-              (substring x (match-end 0))))
-    x))
-
-;; Test cases
-;; (url-convert-newlines-to-spaces "foo    bar")  ; nothing happens
-;; (url-convert-newlines-to-spaces "foo\n  \t  bar") ; whitespace converted
-;;
-;; This implementation doesn't mangle the match-data, is fast, and doesn't
-;; create garbage, but it leaves whitespace.
-;; (defun url-convert-newlines-to-spaces (x)
-;;   "Convert newlines and carriage returns embedded in a string into spaces.
-;; The string is side-effected, then returned."
-;;   (let ((i 0)
-;;      (limit (length x)))
-;;     (while (< i limit)
-;;       (if (or (= ?\n (aref x i))
-;;            (= ?\r (aref x i)))
-;;        (aset x i ? ))
-;;       (setq i (1+ i)))
-;;     x))
-
-(defun url-expand-file-name (url &optional default)
-  "Convert URL to a fully specified URL, and canonicalize it.
-Second arg DEFAULT is a URL to start with if URL is relative.
-If DEFAULT is nil or missing, the current buffer's URL is used.
-Path components that are `.' are removed, and 
-path components followed by `..' are removed, along with the `..' itself."
-  (if (and url (not (string-match "^#" url)))
-      (setq url (mapconcat (function (lambda (x)
-                                      (if (memq x '(?  ?\n ?\r))
-                                          ""
-                                        (char-to-string x))))
-                          (url-strip-leading-spaces
-                           (url-eat-trailing-space url)) "")))
-  (setq default (cond
-                ((vectorp default) default)
-                (default (url-generic-parse-url default))
-                (url-current-object url-current-object)
-                (t (url-generic-parse-url (url-view-url t)))))
-
-  (cond
-   ((= (length url) 0)                 ; nil or empty string
-    (url-recreate-url default))
-   ((string-match "^#" url)            ; Offset link, use it raw
-    url)
-   (t
-    (let* ((urlobj (url-generic-parse-url url))
-          (inhibit-file-name-handlers t)
-          (expander (cdr-safe
-                     (cdr-safe
-                      (assoc (or (url-type urlobj)
-                                 (url-type default))
-                             url-registered-protocols)))))
-      (if (string-match "^//" url)
-         (setq urlobj (url-generic-parse-url (concat (url-type default) ":"
-                                                     url))))
-      (if (fboundp expander)
-         (funcall expander urlobj default)
-       (message "Unknown URL scheme: %s" (or (url-type urlobj)
-                                            (url-type default)))
-       (url-identity-expander urlobj default))
-      (url-recreate-url urlobj)))))
-
-(defun url-default-expander (urlobj defobj)
-  ;; The default expansion routine - urlobj is modified by side effect!
-  (if (url-type urlobj)
-      ;; Well, they told us the scheme, let's just go with it.
-      nil
-    (url-set-type urlobj (or (url-type urlobj) (url-type defobj)))
-    (url-set-port urlobj (or (url-port urlobj)
-                            (and (string= (url-type urlobj)
-                                          (url-type defobj))
-                                 (url-port defobj))))
-    (if (not (string= "file" (url-type urlobj)))
-       (url-set-host urlobj (or (url-host urlobj) (url-host defobj))))
-    (if (string= "ftp"  (url-type urlobj))
-       (url-set-user urlobj (or (url-user urlobj) (url-user defobj))))
-    (if (string= (url-filename urlobj) "")
-       (url-set-filename urlobj "/"))
-    (if (string-match "^/" (url-filename urlobj))
-       nil
-      (let ((query nil)
-           (file nil)
-           (sepchar nil))
-       (if (string-match "[?#]" (url-filename urlobj))
-           (setq query (substring (url-filename urlobj) (match-end 0))
-                 file (substring (url-filename urlobj) 0 (match-beginning 0))
-                 sepchar (substring (url-filename urlobj) (match-beginning 0) 
(match-end 0)))
-         (setq file (url-filename urlobj)))
-       (setq file (url-remove-relative-links
-                   (concat (url-basepath (url-filename defobj)) file)))
-       (url-set-filename urlobj (if query (concat file sepchar query) 
file))))))
-
-(defun url-identity-expander (urlobj defobj)
-  (url-set-type urlobj (or (url-type urlobj) (url-type defobj))))
-
-(defconst url-unreserved-chars
-  '(
-    ?a ?b ?c ?d ?e ?f ?g ?h ?i ?j ?k ?l ?m ?n ?o ?p ?q ?r ?s ?t ?u ?v ?w ?x ?y 
?z
-    ?A ?B ?C ?D ?E ?F ?G ?H ?I ?J ?K ?L ?M ?N ?O ?P ?Q ?R ?S ?T ?U ?V ?W ?X ?Y 
?Z
-    ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9
-    ?$ ?- ?_ ?. ?! ?~ ?* ?' ?\( ?\) ?,)
-  "A list of characters that are _NOT_ reserve in the URL spec.
-This is taken from draft-fielding-url-syntax-02.txt - check your local
-internet drafts directory for a copy.")
-       
-(defun url-hexify-string (str)
-  "Escape characters in a string"
-  (mapconcat
-   (function
-    (lambda (char)
-      (if (not (memq char url-unreserved-chars))
-         (if (< char 16)
-             (upcase (format "%%0%x" char))
-           (upcase (format "%%%x" char)))
-       (char-to-string char))))
-   (mule-decode-string str) ""))
-
-(defun url-make-sequence (start end)
-  "Make a sequence (list) of numbers from START to END"
-  (cond
-   ((= start end) '())
-   ((> start end) '())
-   (t
-    (let ((sqnc '()))
-      (while (<= start end)
-       (setq sqnc (cons end sqnc)
-             end (1- end)))
-      sqnc))))
- 
-(defun url-file-extension (fname &optional x)
-  "Return the filename extension of FNAME.  If optional variable X is t,
-then return the basename of the file with the extension stripped off."
-  (if (and fname
-          (setq fname (url-basepath fname t))
-          (string-match "\\.[^./]+$" fname))
-      (if x (substring fname 0 (match-beginning 0))
-       (substring fname (match-beginning 0) nil))
-    ;;
-    ;; If fname has no extension, and x then return fname itself instead of 
-    ;; nothing. When caching it allows the correct .hdr file to be produced
-    ;; for filenames without extension.
-    ;;
-    (if x
-       fname
-      "")))
-
-(defun url-basepath (file &optional x)
-  "Return the base pathname of FILE, or the actual filename if X is true"
-  (cond
-   ((null file) "")
-   ((string-match (eval-when-compile (regexp-quote "?")) file)
-    (if x
-       (file-name-nondirectory (substring file 0 (match-beginning 0)))
-      (file-name-directory (substring file 0 (match-beginning 0)))))
-   (x (file-name-nondirectory file))
-   (t (file-name-directory file))))
-
-(defun url-parse-query-string (query &optional downcase)
-  (let (retval pairs cur key val)
-    (setq pairs (split-string query "&"))
-    (while pairs
-      (setq cur (car pairs)
-           pairs (cdr pairs))
-      (if (not (string-match "=" cur))
-         nil                           ; Grace
-       (setq key (url-unhex-string (substring cur 0 (match-beginning 0)))
-             val (url-unhex-string (substring cur (match-end 0) nil)))
-       (if downcase
-           (setq key (downcase key)))
-       (setq cur (assoc key retval))
-       (if cur
-           (setcdr cur (cons val (cdr cur)))
-         (setq retval (cons (list key val) retval)))))
-    retval))
-
-(defun url-unhex (x)
-  (if (> x ?9)
-      (if (>= x ?a)
-         (+ 10 (- x ?a))
-       (+ 10 (- x ?A)))
-    (- x ?0)))
-
-(defun url-unhex-string (str &optional allow-newlines)
-  "Remove %XXX embedded spaces, etc in a url.
-If optional second argument ALLOW-NEWLINES is non-nil, then allow the
-decoding of carriage returns and line feeds in the string, which is normally
-forbidden in URL encoding."
-  (setq str (or str ""))
-  (let ((tmp "")
-       (case-fold-search t))
-    (while (string-match "%[0-9a-f][0-9a-f]" str)
-      (let* ((start (match-beginning 0))
-            (ch1 (url-unhex (elt str (+ start 1))))
-            (code (+ (* 16 ch1)
-                     (url-unhex (elt str (+ start 2))))))
-       (setq tmp (concat 
-                  tmp (substring str 0 start)
-                  (cond
-                   (allow-newlines
-                    (char-to-string code))
-                   ((or (= code ?\n) (= code ?\r))
-                    " ")
-                   (t (char-to-string code))))
-             str (substring str (match-end 0)))))
-    (setq tmp (concat tmp str))
-    tmp))
-
-(defun url-remove-compressed-extensions (filename)
-  (while (assoc (url-file-extension filename) url-uncompressor-alist)
-    (setq filename (url-file-extension filename t)))
-  filename)
-
-(defun url-uncompress ()
-  "Do any necessary uncompression on `url-working-buffer'"
-  (set-buffer url-working-buffer)
-  (if (not url-inhibit-uncompression)
-      (let* ((decoder nil)
-            (code-1 (cdr-safe
-                     (assoc "content-transfer-encoding"
-                            url-current-mime-headers)))
-            (code-2 (cdr-safe
-                     (assoc "content-encoding" url-current-mime-headers)))
-            (done nil)
-            (default-process-coding-system
-              (cons mule-no-coding-system mule-no-coding-system)))
-       (mapcar
-        (function
-         (lambda (code)
-           (setq decoder (and (not (member code done))
-                              (cdr-safe
-                               (assoc code mm-content-transfer-encodings)))
-                 done (cons code done))
-           (if (not decoder)
-               nil
-             (message "Decoding (%s)..." code)
-             (cond
-              ((stringp decoder)
-               (call-process-region (point-min) (point-max) decoder t t nil))
-              ((listp decoder)
-               (apply 'call-process-region (point-min) (point-max)
-                      (car decoder) t t nil (cdr decoder)))
-              ((and (symbolp decoder) (fboundp decoder))
-               (funcall decoder (point-min) (point-max)))
-              (t
-               (error "Bad entry for %s in `mm-content-transfer-encodings'"
-                      code)))
-             (message "Decoding (%s)... done." code))))
-        (list code-1 code-2))))
-  (set-buffer-modified-p nil))
-
-(defun url-filter (proc string)
-  (save-excursion
-    (set-buffer url-working-buffer)
-    (insert string)
-    (if (string-match "\nConnection closed by" string)
-       (progn (set-process-filter proc nil)
-              (url-sentinel proc string))))
-  string)
-
-(defun url-default-callback (buf)
-  (url-download-minor-mode nil)
-  (url-store-in-cache buf)
-  (cond
-   ((save-excursion (set-buffer buf)
-                   (and url-current-callback-func
-                        (fboundp url-current-callback-func)))
-    (save-excursion
-      (save-window-excursion
-       (set-buffer buf)
-       (cond
-        ((listp url-current-callback-data)
-         (apply url-current-callback-func
-                url-current-callback-data))
-        (url-current-callback-data
-         (funcall url-current-callback-func
-                  url-current-callback-data))
-        (t
-         (funcall url-current-callback-func))))))
-   ((and (fboundp 'w3-sentinel) (get-buffer buf))
-    (w3-sentinel))
-   (t
-    (message "Retrieval for %s complete." buf))))
-
-(defun url-sentinel (proc string)
-  (let* ((buf (if (processp proc) (process-buffer proc) proc))
-        (url-working-buffer (and buf (get-buffer buf)))
-        status)
-    (if (not url-working-buffer)
-       (url-warn 'url (format "Process %s completed with no buffer!" proc))
-      (save-excursion
-       (set-buffer url-working-buffer)
-       (remove-hook 'after-change-functions 'url-after-change-function)
-       (if url-be-asynchronous
-           (progn
-             (widen)
-             (cond
-              ((and (null proc) (not url-working-buffer)) nil)
-              ((url-mime-response-p)
-               (setq status (url-parse-mime-headers))))
-             (if (not url-current-mime-type)
-                 (setq url-current-mime-type (or
-                                              (mm-extension-to-mime
-                                               (url-file-extension
-                                                (url-filename
-                                                 url-current-object)))
-                                              "text/plain"))))))
-      (if (member status '(401 301 302 303 204))
-         nil
-       (funcall url-default-retrieval-proc (buffer-name url-working-buffer)))))
-  ;; FSF Emacs doesn't do this after calling a process-sentinel
-  (set-buffer (window-buffer (selected-window))))
-
-(defun url-remove-relative-links (name)
-  ;; Strip . and .. from pathnames
-  (let ((new (if (not (string-match "^/" name))
-                (concat "/" name)
-              name)))
-
-    ;; If it ends with a '/.' or '/..', tack on a trailing '/' sot hat
-    ;; the tests that follow are not too complicated in terms of
-    ;; looking for '..' or '../', etc.
-    (if (string-match "/\\.+$" new)
-       (setq new (concat new "/")))
-
-    ;; Remove '/./' first
-    (while (string-match "/\\(\\./\\)" new)
-      (setq new (concat (substring new 0 (match-beginning 1))
-                       (substring new (match-end 1)))))
-
-    ;; Then remove '/../'
-    (while (string-match "/\\([^/]*/\\.\\./\\)" new)
-      (setq new (concat (substring new 0 (match-beginning 1))
-                       (substring new (match-end 1)))))
-
-    ;; Remove cruft at the beginning of the string, so people that put
-    ;; in extraneous '..' because they are morons won't lose.
-    (while (string-match "^/\\.\\.\\(/\\)" new)
-      (setq new (substring new (match-beginning 1) nil)))
-    new))
-
-(defun url-truncate-url-for-viewing (url &optional width)
-  "Return a shortened version of URL that is WIDTH characters or less wide.
-WIDTH defaults to the current frame width."
-  (let* ((fr-width (or width (frame-width)))
-        (str-width (length url))
-        (tail (file-name-nondirectory url))
-        (fname nil)
-        (modified 0)
-        (urlobj nil))
-    ;; The first thing that can go are the search strings
-    (if (and (>= str-width fr-width)
-            (string-match "?" url))
-       (setq url (concat (substring url 0 (match-beginning 0)) "?...")
-             str-width (length url)
-             tail (file-name-nondirectory url)))
-    (if (< str-width fr-width)
-       nil                             ; Hey, we are done!
-      (setq urlobj (url-generic-parse-url url)
-           fname (url-filename urlobj)
-           fr-width (- fr-width 4))
-      (while (and (>= str-width fr-width)
-                 (string-match "/" fname))
-       (setq fname (substring fname (match-end 0) nil)
-             modified (1+ modified))
-       (url-set-filename urlobj fname)
-       (setq url (url-recreate-url urlobj)
-             str-width (length url)))
-      (if (> modified 1)
-         (setq fname (concat "/.../" fname))
-       (setq fname (concat "/" fname)))
-      (url-set-filename urlobj fname)
-      (setq url (url-recreate-url urlobj)))
-    url))
-
-(defun url-view-url (&optional no-show)
-  "View the current document's URL.  Optional argument NO-SHOW means
-just return the URL, don't show it in the minibuffer."
-  (interactive)
-  (if (not url-current-object)
-      nil
-    (if no-show
-       (url-recreate-url url-current-object)
-      (message "%s" (url-recreate-url url-current-object)))))
-
-(defun url-parse-Netscape-history (fname)
-  ;; Parse a Netscape/X style global history list.
-  (let (pos                            ; Position holder
-       url                             ; The URL
-       time)                           ; Last time accessed
-    (goto-char (point-min))
-    (skip-chars-forward "^\n")
-    (skip-chars-forward "\n \t")       ; Skip past the tag line
-    (setq url-global-history-hash-table (make-hash-table :size 131
-                                                        :test 'equal))
-    ;; Here we will go to the end of the line and
-    ;; skip back over a token, since we might run
-    ;; into spaces in URLs, depending on how much
-    ;; smarter netscape is than the old XMosaic :)
-    (while (not (eobp))
-      (setq pos (point))
-      (end-of-line)
-      (skip-chars-backward "^ \t")
-      (skip-chars-backward " \t")
-      (setq url (buffer-substring pos (point))
-           pos (1+ (point)))
-      (skip-chars-forward "^\n")
-      (setq time (buffer-substring pos (point)))
-      (skip-chars-forward "\n")
-      (setq url-history-changed-since-last-save t)
-      (cl-puthash url time url-global-history-hash-table))))
-
-(defun url-parse-Mosaic-history-v1 (fname)
-  ;; Parse an NCSA Mosaic/X style global history list
-  (goto-char (point-min))
-  (skip-chars-forward "^\n")
-  (skip-chars-forward "\n \t") ; Skip past the tag line
-  (skip-chars-forward "^\n")
-  (skip-chars-forward "\n \t") ; Skip past the second tag line
-  (setq url-global-history-hash-table (make-hash-table :size 131
-                                                      :test 'equal))
-  (let (pos                            ; Temporary position holder
-       bol                             ; Beginning-of-line
-       url                             ; URL
-       time                            ; Time
-       last-end                        ; Last ending point
-       )
-    (while (not (eobp))
-      (setq bol (point))
-      (end-of-line)
-      (setq pos (point)
-           last-end (point))
-      (skip-chars-backward "^ \t" bol) ; Skip over year
-      (skip-chars-backward " \t" bol)
-      (skip-chars-backward "^ \t" bol) ; Skip over time
-      (skip-chars-backward " \t" bol)
-      (skip-chars-backward "^ \t" bol) ; Skip over day #
-      (skip-chars-backward " \t" bol)
-      (skip-chars-backward "^ \t" bol) ; Skip over month
-      (skip-chars-backward " \t" bol)
-      (skip-chars-backward "^ \t" bol) ; Skip over day abbrev.
-      (if (bolp)
-         nil                           ; Malformed entry!!! Ack! Bailout!
-       (setq time (buffer-substring pos (point)))
-       (skip-chars-backward " \t")
-       (setq pos (point)))
-      (beginning-of-line)
-      (setq url (buffer-substring (point) pos))
-      (goto-char (min (1+ last-end) (point-max))) ; Goto next line
-      (if (/= (length url) 0)
-         (progn
-           (setq url-history-changed-since-last-save t)
-           (cl-puthash url time url-global-history-hash-table))))))
-
-(defun url-parse-Mosaic-history-v2 (fname)
-  ;; Parse an NCSA Mosaic/X style global history list (version 2)
-  (goto-char (point-min))
-  (skip-chars-forward "^\n")
-  (skip-chars-forward "\n \t") ; Skip past the tag line
-  (skip-chars-forward "^\n")
-  (skip-chars-forward "\n \t") ; Skip past the second tag line
-  (setq url-global-history-hash-table (make-hash-table :size 131
-                                                      :test 'equal))
-  (let (pos                            ; Temporary position holder
-       bol                             ; Beginning-of-line
-       url                             ; URL
-       time                            ; Time
-       last-end                        ; Last ending point
-       )
-    (while (not (eobp))
-      (setq bol (point))
-      (end-of-line)
-      (setq pos (point)
-           last-end (point))
-      (skip-chars-backward "^ \t" bol) ; Skip over time
-      (if (bolp)
-         nil                           ; Malformed entry!!! Ack! Bailout!
-       (setq time (buffer-substring pos (point)))
-       (skip-chars-backward " \t")
-       (setq pos (point)))
-      (beginning-of-line)
-      (setq url (buffer-substring (point) pos))
-      (goto-char (min (1+ last-end) (point-max))) ; Goto next line
-      (if (/= (length url) 0)
-         (progn
-           (setq url-history-changed-since-last-save t)
-           (cl-puthash url time url-global-history-hash-table))))))
-
-(defun url-parse-Emacs-history (&optional fname)
-  ;; Parse out the Emacs-w3 global history file for completion, etc.
-  (or fname (setq fname (expand-file-name url-global-history-file)))
-  (cond
-   ((not (file-exists-p fname))
-    (message "%s does not exist." fname))
-   ((not (file-readable-p fname))
-    (message "%s is unreadable." fname))
-   (t
-    (condition-case ()
-       (load fname nil t)
-      (error (message "Could not load %s" fname)))
-    (if (boundp 'url-global-history-completion-list)
-       ;; Hey!  Automatic conversion of old format!
-       (progn
-         (setq url-global-history-hash-table (make-hash-table :size 131
-                                                              :test 'equal)
-               url-history-changed-since-last-save t)
-         (mapcar (function
-                  (lambda (x)
-                    (cl-puthash (car x) (cdr x)
-                                url-global-history-hash-table)))
-                 (symbol-value 'url-global-history-completion-list)))))))
-
-(defun url-parse-global-history (&optional fname)
-  ;; Parse out the mosaic global history file for completions, etc.
-  (or fname (setq fname (expand-file-name url-global-history-file)))
-  (cond
-   ((not (file-exists-p fname))
-    (message "%s does not exist." fname))
-   ((not (file-readable-p fname))
-    (message "%s is unreadable." fname))
-   (t
-    (save-excursion
-      (set-buffer (get-buffer-create " *url-tmp*"))
-      (erase-buffer)
-      (insert-file-contents-literally fname)
-      (goto-char (point-min))
-      (cond
-       ((looking-at "(setq") (url-parse-Emacs-history fname))
-       ((looking-at "ncsa-mosaic-.*-1$") (url-parse-Mosaic-history-v1 fname))
-       ((looking-at "ncsa-mosaic-.*-2$") (url-parse-Mosaic-history-v2 fname))
-       ((or (looking-at "MCOM-") (looking-at "netscape"))
-       (url-parse-Netscape-history fname))
-       (t
-       (url-warn 'url (format "Cannot deduce type of history file: %s"
-                              fname))))))))
-
-(defun url-write-Emacs-history (fname)
-  ;; Write an Emacs-w3 style global history list into FNAME
-  (erase-buffer)
-  (let ((count 0))
-    (cl-maphash (function
-                (lambda (key value)
-                  (while (string-match "[\r\n]+" key)
-                    (setq key (concat (substring key 0 (match-beginning 0))
-                                      (substring key (match-end 0) nil))))
-                  (setq count (1+ count))
-                  (insert "(cl-puthash \"" key "\""
-                          (if (not (stringp value)) " '" "")
-                          (prin1-to-string value)
-                          " url-global-history-hash-table)\n")))
-               url-global-history-hash-table)
-    (goto-char (point-min))
-    (insert (format
-            "(setq url-global-history-hash-table (make-hash-table :size %d 
:test 'equal))\n"
-            (/ count 4)))
-    (goto-char (point-max))
-    (insert "\n")
-    (write-file fname)))
-
-(defun url-write-Netscape-history (fname)
-  ;; Write a Netscape-style global history list into FNAME
-  (erase-buffer)
-  (let ((last-valid-time "785305714")) ; Picked out of thin air,
-                                       ; in case first in assoc list
-                                       ; doesn't have a valid time
-    (goto-char (point-min))
-    (insert "MCOM-Global-history-file-1\n")
-    (cl-maphash (function
-                (lambda (url time)
-                  (if (or (not (stringp time)) (string-match " \t" time))
-                      (setq time last-valid-time)
-                    (setq last-valid-time time))
-                  (insert url " " time "\n")))
-               url-global-history-hash-table)
-    (write-file fname)))
-
-(defun url-write-Mosaic-history-v1 (fname)
-  ;; Write a Mosaic/X-style global history list into FNAME
-  (erase-buffer)
-  (goto-char (point-min))
-  (insert "ncsa-mosaic-history-format-1\nGlobal\n")
-  (cl-maphash (function
-              (lambda (url time)
-                (if (listp time)
-                    (setq time (current-time-string time)))
-                (if (or (not (stringp time))
-                        (not (string-match " " time)))
-                    (setq time (current-time-string)))
-                (insert url " " time "\n")))
-             url-global-history-hash-table)
-  (write-file fname))
-
-(defun url-write-Mosaic-history-v2 (fname)
-  ;; Write a Mosaic/X-style global history list into FNAME
-  (let ((last-valid-time "827250806"))
-    (erase-buffer)
-    (goto-char (point-min))
-    (insert "ncsa-mosaic-history-format-2\nGlobal\n")
-    (cl-maphash (function
-                (lambda (url time)
-                  (if (listp time)
-                      (setq time last-valid-time)
-                    (setq last-valid-time time))
-                  (if (not (stringp time))
-                      (setq time last-valid-time))
-                  (insert url " " time "\n")))
-               url-global-history-hash-table)
-    (write-file fname)))
-
-(defun url-write-global-history (&optional fname)
-  "Write the global history file into `url-global-history-file'.
-The type of data written is determined by what is in the file to begin
-with.  If the type of storage cannot be determined, then prompt the
-user for what type to save as."
-  (interactive)
-  (or fname (setq fname (expand-file-name url-global-history-file)))
-  (cond
-   ((not url-history-changed-since-last-save) nil)
-   ((not (file-writable-p fname))
-    (message "%s is unwritable." fname))
-   (t
-    (let ((make-backup-files nil)
-         (version-control nil)
-         (require-final-newline t))
-      (save-excursion
-       (set-buffer (get-buffer-create " *url-tmp*"))
-       (erase-buffer)
-       (condition-case ()
-           (insert-file-contents-literally fname)
-         (error nil))
-       (goto-char (point-min))
-       (cond
-        ((looking-at "ncsa-mosaic-.*-1$") (url-write-Mosaic-history-v1 fname))
-        ((looking-at "ncsa-mosaic-.*-2$") (url-write-Mosaic-history-v2 fname))
-        ((looking-at "MCOM-") (url-write-Netscape-history fname))
-        ((looking-at "netscape") (url-write-Netscape-history fname))
-        ((looking-at "(setq") (url-write-Emacs-history fname))
-        (t (url-write-Emacs-history fname)))
-       (kill-buffer (current-buffer))))))
-  (setq url-history-changed-since-last-save nil)
-  (setq url-history-changed-since-last-save nil)
-  (if (not (or (eq url-privacy-level 'paranoid)
-              (and (listp url-privacy-level) (memq 'cookies 
url-privacy-level))))
-      (url-cookie-write-file))
-  (w3-write-explicit-encodings))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; The main URL fetching interface
-;;; -------------------------------
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;;###autoload
-(defun url-popup-info (url)
-  "Retrieve the HTTP/1.0 headers and display them in a temp buffer."
-  (let* ((urlobj (url-generic-parse-url url))
-        (type (url-type urlobj))
-        data)
-    (cond
-     ((string= type "http")
-      (let ((url-request-method "HEAD")
-           (url-automatic-caching nil)
-           (url-inhibit-mime-parsing t)
-           (url-working-buffer " *popup*"))
-       (save-excursion
-         (set-buffer (get-buffer-create url-working-buffer))
-         (erase-buffer)
-         (setq url-be-asynchronous nil)
-         (url-retrieve url)
-         (subst-char-in-region (point-min) (point-max) ?\r ? )
-         (buffer-string))))
-     ((or (string= type "file") (string= type "ftp"))
-      (setq data (url-file-attributes url))
-      (set-buffer (get-buffer-create
-                  (url-generate-new-buffer-name "*Header Info*")))
-      (erase-buffer)
-      (if data
-         (concat (if (stringp (nth 0 data))
-                     (concat "    Linked to: " (nth 0 data))
-                   (concat "    Directory: " (if (nth 0 data) "Yes" "No")))
-                 "\n        Links: " (int-to-string (nth 1 data))
-                 "\n     File UID: " (int-to-string (nth 2 data))
-                 "\n     File GID: " (int-to-string (nth 3 data))
-                 "\n  Last Access: " (current-time-string (nth 4 data))
-                 "\nLast Modified: " (current-time-string (nth 5 data))
-                 "\n Last Changed: " (current-time-string (nth 6 data))
-                 "\n Size (bytes): " (int-to-string (nth 7 data))
-                 "\n    File Type: " (or (nth 8 data) "text/plain"))
-       (concat "No info found for " url)))
-     ((and (string= type "news") (string-match "@" url))
-      (let ((art (url-filename urlobj)))
-       (if (not (string= (substring art -1 nil) ">"))
-           (setq art (concat "<" art ">")))
-       (url-get-headers-from-article-id art)))
-     (t (concat "Don't know how to find information on " url)))))
-
-(defun url-decode-text ()
-  ;; Decode text transmitted by NNTP.
-  ;; 0. Delete status line.
-  ;; 1. Delete `^M' at end of line.
-  ;; 2. Delete `.' at end of buffer (end of text mark).
-  ;; 3. Delete `.' at beginning of line."
-  (save-excursion
-    (set-buffer nntp-server-buffer)
-    ;; Insert newline at end of buffer.
-    (goto-char (point-max))
-    (if (not (bolp))
-       (insert "\n"))
-    ;; Delete status line.
-    (goto-char (point-min))
-    (delete-region (point) (progn (forward-line 1) (point)))
-    ;; Delete `^M' at end of line.
-    ;; (replace-regexp "\r$" "")
-    (while (not (eobp))
-      (end-of-line)
-      (if (= (preceding-char) ?\r)
-         (delete-char -1))
-      (forward-line 1)
-      )
-    ;; Delete `.' at end of buffer (end of text mark).
-    (goto-char (point-max))
-    (forward-line -1)                  ;(beginning-of-line)
-    (if (looking-at "^\\.$")
-       (delete-region (point) (progn (forward-line 1) (point))))
-    ;; Replace `..' at beginning of line with `.'.
-    (goto-char (point-min))
-    ;; (replace-regexp "^\\.\\." ".")
-    (while (search-forward "\n.." nil t)
-      (delete-char -1))
-    ))
-
-(defun url-get-headers-from-article-id (art)
-  ;; Return the HEAD of ART (a usenet news article)
-  (cond
-   ((string-match "flee" nntp-version)
-    (nntp/command "HEAD" art)
-    (save-excursion
-      (set-buffer nntp-server-buffer)
-      (while (progn (goto-char (point-min))
-                   (not (re-search-forward "^.\r*$" nil t)))
-       (url-accept-process-output nntp/connection))))
-   (t
-    (nntp-send-command "^\\.\r$" "HEAD" art)
-    (url-decode-text)))
-  (save-excursion
-    (set-buffer nntp-server-buffer)
-    (buffer-string)))
-
-(defcustom url-external-retrieval-program "www"
-  "*Name of the external executable to run to retrieve URLs."
-  :type 'string
-  :group 'url)
-
-(defcustom url-external-retrieval-args '("-source")
-  "*A list of arguments to pass to `url-external-retrieval-program' to
-retrieve a URL by its HTML source."
-  :type '(repeat string)
-  :group 'url)
-
-(defun url-retrieve-externally (url &optional no-cache)
-  (let ((url-working-buffer (if (and url-multiple-p
-                                    (string-equal url-working-buffer
-                                                  url-default-working-buffer))
-                               (url-get-working-buffer-name)
-                             url-working-buffer)))
-    (if (get-buffer-create url-working-buffer)
-       (save-excursion
-         (set-buffer url-working-buffer)
-         (set-buffer-modified-p nil)
-         (kill-buffer url-working-buffer)))
-    (set-buffer (get-buffer-create url-working-buffer))
-    (let* ((args (append url-external-retrieval-args (list url)))
-          (urlobj (url-generic-parse-url url))
-          (type (url-type urlobj)))
-      (if (or (member type '("www" "about" "mailto" "mailserver"))
-             (url-file-directly-accessible-p urlobj))
-         (url-retrieve-internally url)
-       (url-lazy-message "Retrieving %s..." url)
-       (apply 'call-process url-external-retrieval-program
-              nil t nil args)
-       (url-lazy-message "Retrieving %s... done" url)))))
-
-(defun url-get-normalized-date (&optional specified-time)
-  ;; Return a 'real' date string that most HTTP servers can understand.
-  (require 'timezone)
-  (let* ((raw (if specified-time (current-time-string specified-time)
-               (current-time-string)))
-        (gmt (timezone-make-date-arpa-standard raw
-                                               (nth 1 (current-time-zone))
-                                               "GMT"))
-        (parsed (timezone-parse-date gmt))
-        (day (cdr-safe (assoc (substring raw 0 3) weekday-alist)))
-        (year nil)
-        (month (car
-                (rassoc
-                 (string-to-int (aref parsed 1)) monthabbrev-alist)))
-        )
-    (setq day (or (car-safe (rassoc day weekday-alist))
-                 (substring raw 0 3))
-         year (aref parsed 0))
-    ;; This is needed for plexus servers, or the server will hang trying to
-    ;; parse the if-modified-since header.  Hopefully, I can take this out
-    ;; soon.
-    (if (and year (> (length year) 2))
-       (setq year (substring year -2 nil)))
-
-    (concat day ", " (aref parsed 2) "-" month "-" year " "
-           (aref parsed 3) " " (or (aref parsed 4)
-                                   (concat "[" (nth 1 (current-time-zone))
-                                           "]")))))
-
-(defun url-get-working-buffer-name ()
-  "Get a working buffer name such as ` *URL-<i>*' without a live process and 
empty"
-  (let ((num 1)
-       name buf)
-    (while (progn (setq name (format " *URL-%d*" num))
-                 (setq buf (get-buffer name))
-                 (and buf (or (get-buffer-process buf)
-                              (save-excursion (set-buffer buf)
-                                              (> (point-max) 1)))))
-      (setq num (1+ num)))
-    name))
-
-(defun url-default-find-proxy-for-url (urlobj host)
-  (cond
-   ((or (and (assoc "no_proxy" url-proxy-services)
-            (string-match
-             (cdr
-              (assoc "no_proxy" url-proxy-services))
-             host))
-       (equal "www" (url-type urlobj)))
-    "DIRECT")
-   ((cdr (assoc (url-type urlobj) url-proxy-services))
-    (concat "PROXY " (cdr (assoc (url-type urlobj) url-proxy-services))))
-   ;;
-   ;; Should check for socks
-   ;;
-   (t
-    "DIRECT")))
-
-(defvar url-proxy-locator 'url-default-find-proxy-for-url)
-
-(defun url-find-proxy-for-url (url host)
-  (let ((proxies (split-string (funcall url-proxy-locator url host) " *; *"))
-       (proxy nil)
-       (case-fold-search t))
-    ;; Not sure how I should handle gracefully degrading from one proxy to
-    ;; another, so for now just deal with the first one
-    ;; (while proxies
-    (if (listp proxies)
-       (setq proxy (pop proxies))
-      (setq proxy proxies))
-    (cond
-     ((string-match "^direct" proxy) nil)
-     ((string-match "^proxy +" proxy)
-      (concat "http://"; (substring proxy (match-end 0)) "/"))
-     ((string-match "^socks +" proxy)
-      (concat "socks://" (substring proxy (match-end 0))))
-     (t
-      (url-warn 'url (format "Unknown proxy directive: %s" proxy) 'critical)
-      nil))))
-
-(defun url-looks-like-html (&optional buf)
-  (save-excursion
-    (set-buffer (or buf (current-buffer)))
-    (goto-char (point-min))
-    (let ((case-fold-search t))
-      (re-search-forward "<\\(html\\|head\\|title\\|body\\).*>" nil t))))
-
-(defun url-retrieve-internally (url &optional no-cache)
-  (let* ((url-working-buffer (if (and url-multiple-p
-                                     (string-equal
-                                      (if (bufferp url-working-buffer)
-                                          (buffer-name url-working-buffer)
-                                        url-working-buffer)
-                                      url-default-working-buffer))
-                                (url-get-working-buffer-name)
-                              url-working-buffer))
-        (urlobj (url-generic-parse-url url))
-        (type (url-type urlobj))
-        (url-using-proxy (if (url-host urlobj)
-                             (url-find-proxy-for-url urlobj
-                                                     (url-host urlobj))
-                           nil))
-        (handler nil)
-        (original-url url)
-        (cached nil))
-    (if url-using-proxy (setq type "proxy"))
-    (setq cached (url-is-cached url)
-         cached (and cached (not (url-cache-expired url cached)))
-         handler (if cached
-                     'url-cache-extract
-                   (car-safe
-                    (cdr-safe (assoc (or type "auto")
-                                     url-registered-protocols))))
-         url (if cached (url-cache-create-filename url) url))
-    (save-excursion
-      (set-buffer (get-buffer-create url-working-buffer))
-      (make-local-variable 'track-mouse)
-      (if (boundp 'buffer-file-coding-system)
-         (setq buffer-file-coding-system nil))
-      (setq url-current-can-be-cached (not no-cache)
-           url-current-object urlobj))
-    (if (and handler (fboundp handler))
-       (funcall handler url)
-      (set-buffer (get-buffer-create url-working-buffer))
-      (erase-buffer)
-      (setq url-current-mime-type "text/html")
-      (insert "<title> Link Error! </title>\n"
-             "<h1> An error has occurred... </h1>\n"
-             (format "The link type `<code>%s</code>'" type)
-             " is unrecognized or unsupported at this time.<p>\n"
-             "If you feel this is an error in Emacs-W3, please "
-             "<a href=\"mailto://"; url-bug-address "\">send me mail.</a>"
-             "<p><address>William Perry</address><br>"
-             "<address>" url-bug-address "</address>"))
-    (cond
-     ((and url-be-asynchronous (not cached)
-          (member type '("http" "https" "proxy" "file" "ftp")))
-      nil)
-     ((and url-be-asynchronous (get-buffer url-working-buffer))
-      (funcall url-default-retrieval-proc (buffer-name)))
-     ((not (get-buffer url-working-buffer)) nil)
-     ((and (not url-inhibit-mime-parsing)
-          (or cached (url-mime-response-p t)))
-      (or cached (url-parse-mime-headers nil t))))
-
-    (if (and (or (not url-be-asynchronous)
-                (not (equal type "http")))
-            url-current-object
-            (not url-current-mime-type))
-       (progn
-         (setq url-current-mime-type (mm-extension-to-mime
-                                      (url-file-extension
-                                       (url-filename
-                                        url-current-object))))
-         (if (and (not url-current-mime-type)
-                  (url-looks-like-html))
-             (setq url-current-mime-type "text/html"))))
-
-    (if (not url-be-asynchronous)
-       (url-store-in-cache url-working-buffer))
-    (if (not url-global-history-hash-table)
-       (setq url-global-history-hash-table (make-hash-table :size 131
-                                                            :test 'equal)))
-    (if (not (string-match "^\\(about\\|www\\):" original-url))
-       (progn
-         (setq url-history-changed-since-last-save t)
-         (cl-puthash original-url (current-time)
-                     url-global-history-hash-table)))
-    (cons cached url-working-buffer)))
-
-;;;###autoload
-(defun url-retrieve (url &optional no-cache expected-md5)
-  "Retrieve a document over the World Wide Web.
-The document should be specified by its fully specified
-Uniform Resource Locator.  No parsing is done, just return the
-document as the server sent it.  The document is left in the
-buffer specified by url-working-buffer.  url-working-buffer is killed
-immediately before starting the transfer, so that no buffer-local
-variables interfere with the retrieval.  HTTP/1.0 redirection will
-be honored before this function exits."
-  (url-do-setup)
-  ;;(url-download-minor-mode t)
-  (if (and (fboundp 'set-text-properties)
-          (subrp (symbol-function 'set-text-properties)))
-      (set-text-properties 0 (length url) nil url))
-  (if (and url (string-match "^url:" url))
-      (setq url (substring url (match-end 0) nil)))
-  (let ((status (url-retrieve-internally url no-cache)))
-    status))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; How to register a protocol
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun url-register-protocol (protocol &optional retrieve expander defport)
-  "Register a protocol with the URL retrieval package.
-PROTOCOL is the type of protocol being registers (http, nntp, etc),
-         and is the first chunk of the URL.  ie: http:// URLs will be
-         handled by the protocol registered as 'http'.  PROTOCOL can
-         be either a symbol or a string - it is converted to a string,
-         and lowercased before being registered.
-RETRIEVE (optional) is the function to be called with a url as its
-         only argument.  If this argument is omitted, then this looks
-         for a function called 'url-PROTOCOL'.  A warning is shown if
-         the function is undefined, but the protocol is still
-         registered.
-EXPANDER (optional) is the function to call to expand a relative link
-         of type PROTOCOL.  If omitted, this defaults to
-         `url-default-expander'
-
-Any proxy information is read in from environment variables at this
-time, so this function should only be called after dumping emacs."
-  (let* ((protocol (cond
-                   ((stringp protocol) (downcase protocol))
-                   ((symbolp protocol) (downcase (symbol-name protocol)))
-                   (t nil)))
-                    
-        (retrieve (or retrieve (intern (concat "url-" protocol))))
-        (expander (or expander 'url-default-expander))
-        (cur-protocol (assoc protocol url-registered-protocols))
-        (urlobj nil)
-        (cur-proxy (assoc protocol url-proxy-services))
-        (env-proxy (or (getenv (concat protocol "_proxy"))
-                       (getenv (concat protocol "_PROXY"))
-                       (getenv (upcase (concat protocol "_PROXY"))))))
-
-    (if (not protocol)
-       (error "Invalid data to url-register-protocol."))
-    
-    (if (not (fboundp retrieve))
-       (message "Warning: %s registered, but no function found." protocol))
-
-    ;; Store the default port, if none previously specified and
-    ;; defport given
-    (if (and defport (not (assoc protocol url-default-ports)))
-       (setq url-default-ports (cons (cons protocol defport)
-                                     url-default-ports)))
-    
-    ;; Store the appropriate information for later
-    (if cur-protocol
-       (setcdr cur-protocol (cons retrieve expander))
-      (setq url-registered-protocols (cons (cons protocol
-                                                (cons retrieve expander))
-                                          url-registered-protocols)))
-
-    ;; Store any proxying information - this will not overwrite an old
-    ;; entry, so that people can still set this information in their
-    ;; .emacs file
-    (cond
-     (cur-proxy nil)                   ; Keep their old settings
-     ((null env-proxy) nil)            ; No proxy setup
-     ;; First check if its something like hostname:port
-     ((string-match "^\\([^:]+\\):\\([0-9]+\\)$" env-proxy)
-      (setq urlobj (url-generic-parse-url nil)) ; Get a blank object
-      (url-set-type urlobj "http")
-      (url-set-host urlobj (url-match env-proxy 1))
-      (url-set-port urlobj (url-match env-proxy 2)))
-     ;; Then check if its a fully specified URL
-     ((string-match url-nonrelative-link env-proxy)
-      (setq urlobj (url-generic-parse-url env-proxy))
-      (url-set-type urlobj "http")
-      (url-set-target urlobj nil))
-     ;; Finally, fall back on the assumption that its just a hostname
-     (t
-      (setq urlobj (url-generic-parse-url nil)) ; Get a blank object
-      (url-set-type urlobj "http")
-      (url-set-host urlobj env-proxy)))
-
-     (if (and (not cur-proxy) urlobj)
-        (progn
-          (setq url-proxy-services
-                (cons (cons protocol (concat (url-host urlobj) ":"
-                                             (url-port urlobj)))
-                      url-proxy-services))
-          (message "Using a proxy for %s..." protocol)))))
-
-(provide 'url)
diff --git a/lisp/w3-about.el b/lisp/w3-about.el
deleted file mode 100644
index a2eebc1..0000000
--- a/lisp/w3-about.el
+++ /dev/null
@@ -1,580 +0,0 @@
-;;; w3-about.el --- About pages for emacs-w3
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/27 01:54:10 $
-;; Version: $Revision: 1.3 $
-;; Keywords: hypermedia
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;;###autoload
-(defun w3-about (url)
-  ;; Fetch an about page url
-  (let* ((data (url-generic-parse-url url))
-        (node (downcase (url-filename data))))
-    (if (string= "document" node)
-       (w3-document-information)
-      (save-excursion
-       (set-buffer (get-buffer-create url-working-buffer))
-       (erase-buffer)
-       (setq url-current-mime-viewer (mm-mime-info "text/html" nil 5)
-             url-current-mime-headers '(("content-type" . "text/html")))
-       (cond
-        ((string= "" node)
-         (insert (format
-                  "
-<html>
-  <head>
-    <title>Emacs-W3 v%s</title>
-    <link rel=\"made\" href=\"mailto:address@hidden";>
-    <link rel=\"stylesheet\" href=\"about:style\">
-  </head>
-  <body>
-    <h1>Emacs-W3 &trade;<br>v%s</h1>
-    <p align=\"center\">
-      Copyright &copy; 1993-1995 William M. Perry<br>
-      All rights reserved.
-    </p>
-    <hr width=\"50%%\">
-    <p>
-      Welcome to Emacs-w3!  Please see the <a href=\"info:w3#Top\">info
-       documentation</a>, or the <a
-       href=\"http://www.cs.indiana.edu/elisp/w3/docs.html\";>HTML
-       version</a> online.
-    </p>
-    <p>
-      Information about the <a href=\"authors\">authors</a>, <a
-       href=\"emacs\">versions of emacs</a>, and <a
-       href=\"eggs\">easter eggs</a> is also available.
-    </p>
-    <address>
-      Please send any bugs/comments to<br>
-      <a href=\"mailto:%s\";>%s</a>
-    </address>
-    <hr>
-    <wired><pinhead></wired>
-  </body>
-</html>
-"
-                  w3-version-number w3-version-number w3-bug-address 
w3-bug-address)))
-        ((string= "style" node)
-         (insert
-          "
-/* This is the stylesheet for the about pages for Emacs-w3 */
-
-address,h1,h2,h3,h4,h5,h6 { text-align: center }
-wired { color: yellow }
-wired { background: red }
-"))
-        ((string= "license" node)
-         (kill-buffer (current-buffer))
-         (describe-copying))
-        ((string= "warranty" node)
-         (kill-buffer (current-buffer))
-         (describe-no-warranty))
-        ((string= "arena.xpm" node)
-         (insert
-          "/* XPM */
-static char *arena[] = {
-/* width height num_colors chars_per_pixel */
-\"   109    84        3            1\",
-/* colors */
-\". c #d2c7b1\",
-\"# c #dcd1ba\",
-\"a c #e6dac2\",
-/* pixels */
-\"a.a.aa.a##a###aa##a.a.#.aa.....a##a#aa.#a#a###.#.#aa.aa.#aa#aa#.a.a.aa.a##a###aa##a.a.#.aa.....a##a#aa.#a#a##\",
-\"#a.a#a##a###...a#aa#aa..aa.aa###aa#.a...a.aa#..a##..aa#a.##aa.a.#a.a#a##a###...a#aa#aa..aa.aa###aa#.a...a.aa#\",
-\"a.aaa.aaa#aa#aa#.aa#....aa..###a.#a...#.#.#.....a.#.#aaa#aa..#a#a.aaa.aaa#aa#aa#.aa#....aa..###a.#a...#.#.#..\",
-\".#a#.##a..a#aa#.###a.#a..a#.aa.##.#.a#.#..a#.a#a#a.aa#.##a####.#.#a#.##a..a#aa#.###a.#a..a#.aa.##.#.a#.#..a#.\",
-\"####.###a##a.#aa#.#..a..##a.a#a##a##..aa##.#..#.....a..##..a.a..####.###a##a.#aa#.#..a..##a.a#a##a##..aa##.#.\",
-\"..aa..a#aa#.#a#aaa.a#aa.#....#a#a.###a.#a.a.aaa.###.aaaa#.##aa.#..aa..a#aa#.#a#aaa.a#aa.#....#a#a.###a.#a.a.a\",
-\"##a##aa#a#..#a..a.##a..#..##..aaa#a.aaa.#a..###.a.#.#aa#.##.a.a###a##aa#a#..#a..a.##a..#..##..aaa#a.aaa.#a..#\",
-\".aaaaaaa#a#.aaa#.a#.aa.#a.a#aa..##aa#.##..#.a..#.a#.#a####aaaaa#.aaaaaaa#a#.aaa#.a#.aa.#a.a#aa..##aa#.##..#.a\",
-\".a#.aa#.#a..a#aa###.aa#.a.a#.#.a.##.aaaa#####aaa.a.a#.a..a.aa#...a#.aa#.#a..a#aa###.aa#.a.a#.#.a.##.aaaa#####\",
-\"#.#.##.##a.#.a#..#a###a.##aa..a.#a#a.##a#.##...a#.aa.aa#a..aa####.#.##.##a.#.a#..#a###a.##aa..a.#a#a.##a#.##.\",
-\".#.##a..a..#a.#.#aa##a.#..#aa#.#a#...#..#.a#a#aa#.#a.aa..##.aaaa.#.##a..a..#a.#.#aa##a.#..#aa#.#a#...#..#.a#a\",
-\".#aa...a.a##aaa..#a.aa.#a##...#a##aa#aa#..#...#.##...a.a...aa..a.#aa...a.a##aaa..#a.aa.#a##...#a##aa#aa#..#..\",
-\".aaa###.a#..a#.#..aa.a##..##.#a#.a##a#a.#aa#....#..#a.a.a#aa.aa#.aaa###.a#..a#.#..aa.a##..##.#a#.a##a#a.#aa#.\",
-\"#.#...aa.#aaaa.#####.##..a..a.##.#aa##aaaaa.aa.aa#.#....##aa.a###.#...aa.#aaaa.#####.##..a..a.##.#aa##aaaaa.a\",
-\".a...a.aa.#a#aa#.aa.a.a...#a#..a#a.a.a##.#aaaa.#a##aa.#aa.#a.#.#.a...a.aa.#a#aa#.aa.a.a...#a#..a#a.a.a##.#aaa\",
-\"#.a.a#aaaaa#aa#.a#.aaa.#aa#..a##aa#a#.aaa..##.a.aa.aa.a....##a.##.a.a#aaaaa#aa#.a#.aaa.#aa#..a##aa#a#.aaa..##\",
-\"..##.aaaa#aa.aa.#a#a#a#.a##.###..##.a#.#aa.a#.a#.###a.###a#.#aa...##.aaaa#aa.aa.#a#a#a#.a##.###..##.a#.#aa.a#\",
-\".a.#.aaa######a##.##a#..a#.#.aa.aa#aa...a#.a#.aaaa#a..a.aa#...a#.a.#.aaa######a##.##a#..a#.#.aa.aa#aa...a#.a#\",
-\".a#.##a#a#####.##a.#.a#aaa#a.##a.aa##aa##aa.aa##..a###a#a.aaa..a.a#.##a#a#####.##a.#.a#aaa#a.##a.aa##aa##aa.a\",
-\"a.aa#.##.a.a#aaa...aa.aaaa.#a#a.a.a.#aa..#a#aa#.aaaa.aa#....#a.#a.aa#.##.a.a#aaa...aa.aaaa.#a#a.a.a.#aa..#a#a\",
-\"#.aaa.###aa.#.aaa##aa#.aaaa#.###a#.a.#..aaa#.a.a#.#....a#.#a#a.##.aaa.###aa.#.aaa##aa#.aaaa#.###a#.a.#..aaa#.\",
-\"##a.aa..#.a.##.a.a###a##a#....a#...a#a..#a..#.aa..a.#a.#..a..a.a##a.aa..#.a.##.a.a###a##a#....a#...a#a..#a..#\",
-\"a#.a#a..#a.####..#aa###.#aa#a..aa.a.aa#aa#a..a#..aaa#a..a#a.aaa.a#.a#a..#a.####..#aa###.#aa#a..aa.a.aa#aa#a..\",
-\"#a..aaa.a.#.a##aa##aa#aa.aaa##.###...aa.aa#a.##a##a.a##.#..#.##a#a..aaa.a.#.a##aa##aa#aa.aaa##.###...aa.aa#a.\",
-\".a.a.a#a#a#.#a...aaa##...#.#aa#aaa...##.###.a#a.#.#a.a..#aaa.a.a.a.a.a#a#a#.#a...aaa##...#.#aa#aaa...##.###.a\",
-\"a.#a#.##...#.aa#####aaa#.###a##..a.a.##..#.#a####.#.###.a....##aa.#a#.##...#.aa#####aaa#.###a##..a.a.##..#.#a\",
-\".#a#a.###....##..a#a#.a##..#aaa#a.#aa###.#..a####a..###aaa..#.##.#a#a.###....##..a#a#.a##..#aaa#a.#aa###.#..a\",
-\".##aa#a.#..##aa.a.#..###a#.aa.#.##..#.##...#..a.####.#.a.a##aa.#.##aa#a.#..##aa.a.#..###a#.aa.#.##..#.##...#.\",
-\".#a#.#a#a#..a#a.a#a.a#.aa#.#aa##aaa##.##...aa#..#.##...##.####aa.#a#.#a#a#..a#a.a#a.a#.aa#.#aa##aaa##.##...aa\",
-\"..aaaa.a#a.#.aa.....a.aa...aa#aa.a####aa##a.##a####.aa.#a.a..#.#..aaaa.a#a.#.aa.....a.aa...aa#aa.a####aa##a.#\",
-\".#...#..####.#.a.a.aa.#aa...#aa#a.###a#aa..a#.#a.##.#a##.aaaa.##.#...#..####.#.a.a.aa.#aa...#aa#a.###a#aa..a#\",
-\"aa##..a.a..a.aa.###aa.##aa.a##a..#.###.a.#a#a#...##a.aaaa#..#.aaaa##..a.a..a.aa.###aa.##aa.a##a..#.###.a.#a#a\",
-\"#aaaaa#aa#a##.a#aa...aaa.aaaa..a#.a.##.a.#.a#.a#a###.##a#aa.aaa##aaaaa#aa#a##.a#aa...aaa.aaaa..a#.a.##.a.#.a#\",
-\"..a#..#####aa#a.aa.a##.a.a#.#aa#.a.#a.#aa#...a...#.a#.a##a.aa..#..a#..#####aa#a.aa.a##.a.a#.#aa#.a.#a.#aa#...\",
-\"#aa#a....#aa####a.#a.#aa#a#..#.a#.aa#.aa##a.#a.#..a#a#..#a.a.aaa#aa#a....#aa####a.#a.#aa#a#..#.a#.aa#.aa##a.#\",
-\"#aa...#aa#a.#.#.a.a#a#####a#.a.#a#a##.aa.#aaaa#.aaa..#..a...aa.a#aa...#aa#a.#.#.a.a#a#####a#.a.#a#a##.aa.#aaa\",
-\"....#..#a##.#.##aa###aaaaa..a..#.#..##.##..#aa.#.aa#a.a.#aa.a.aa....#..#a##.#.##aa###aaaaa..a..#.#..##.##..#a\",
-\"#a#a..#a#aa.a..a...##.a##.#a##.....a.##.aa.aa....aa..###a##..##a#a#a..#a#aa.a..a...##.a##.#a##.....a.##.aa.aa\",
-\"aa#aa.a##.#a##a#...#.#a#aa#.#a#aaa.##a.##.aa.#.aaa##.a#a.##a#.a.aa#aa.a##.#a##a#...#.#a#aa#.#a#aaa.##a.##.aa.\",
-\"a.##.a##.a#a.###..aa.#..a#.a#.a#.a#a..#a##a.a#..a...aaaaa###....a.##.a##.a#a.###..aa.#..a#.a#.a#.a#a..#a##a.a\",
-\"#a......##.##a.aaaa#.##a...###.#.#a.a.aa#.#a..aaa...#.#aaaa###a##a......##.##a.aaaa#.##a...###.#.#a.a.aa#.#a.\",
-\".aa#a#..a.#a...a..a##.###...####a..#aa#a..a..a.a#....a##a.a#..a..aa#a#..a.#a...a..a##.###...####a..#aa#a..a..\",
-\".#..#.aa#aaaa.aa..a.aa#.#.#..a##.##a##a.aaaaa...#.##a#.aaaa##.a..#..#.aa#aaaa.aa..a.aa#.#.#..a##.##a##a.aaaaa\",
-\"aa..#.a##a.a##aaaa#aa#aa#a.#a...a#a##a#.a.#a.a#..a.a..####a.a##.aa..#.a##a.a##aaaa#aa#aa#a.#a...a#a##a#.a.#a.\",
-\"a#...##..#.#aa#.aa...#..#.aa#a...###.##a###a#.a#.#.a.#.a.aa#.#a#a#...##..#.#aa#.aa...#..#.aa#a...###.##a###a#\",
-\"#a.aa.##a.aa#.a.###.a#a##aaa.aa###.a.#a####...a.a...#.a#a##.###a#a.aa.##a.aa#.a.###.a#a##aaa.aa###.a.#a####..\",
-\"a##.a.#.a..a#...###aa###a.a.aaaa.##.#a.#.#.a.##aa.a#.a.###.#aa.#a##.a.#.a..a#...###aa###a.a.aaaa.##.#a.#.#.a.\",
-\"#a##..##.#.aa..######.a#aaa#a.aa#a.###a.###.aaa.a.a#a#aaaa##a#aa#a##..##.#.aa..######.a#aaa#a.aa#a.###a.###.a\",
-\".a#a#.a###a##.a....##aa..a.a...#a#.a#a..###.aa#.a..a#.a.aa#a.a##.a#a#.a###a##.a....##aa..a.a...#a#.a#a..###.a\",
-\"a.a#.#aa#aa#.#aaa.#a.a##.aa..aa#a.a..a..a##.a#aa..#a.aa#a##a.a#.a.a#.#aa#aa#.#aaa.#a.a##.aa..aa#a.a..a..a##.a\",
-\"..a##a.##.####a##..a#a.aa.aa.a.aa##.##a##.###a.aaa..#aaa#.#.a#....a##a.##.####a##..a#a.aa.aa.a.aa##.##a##.###\",
-\".#..#....a..a#..####.#a##.#a#a.aa.##a.a.a#a.aaa#a#...a#.....a..a.#..#....a..a#..####.#a##.#a#a.aa.##a.a.a#a.a\",
-\"..#.#.a...a.#.a#.a#a##.a...#a.#.###a....a#....a#.#.#a.##..#a...#..#.#.a...a.#.a#.a#a##.a...#a.#.###a....a#...\",
-\"aa###.aaaa##aa..a#aaa.#a..a.a#.a#a..#..#.##aa#.##.a#.#.aaa#.aa#aaa###.aaaa##aa..a#aaa.#a..a.a#.a#a..#..#.##aa\",
-\"#.a#a..#aaa..#aa##aa#..aa...a#####a..###.aa..a.#.#a.#a#.a#a.a#aa#.a#a..#aaa..#aa##aa#..aa...a#####a..###.aa..\",
-\"a#a.aa##a..#.a#aa..#a#.#a#..#.#.###a#.#...aaaa##aa.#aaa...###.#aa#a.aa##a..#.a#aa..#a#.#a#..#.#.###a#.#...aaa\",
-\"aa.#...##...a#.##.a..a###..#..#.#.a.a#aa.a##.aa.aaa..a.a##.a.#a#aa.#...##...a#.##.a..a###..#..#.#.a.a#aa.a##.\",
-\"a###..##aa##.#.####.###..aa.a#..aa.###a#a##a#a#aa.##a.a.a#.#aaa#a###..##aa##.#.####.###..aa.a#..aa.###a#a##a#\",
-\"#a#...a.aaa#.#a.a#aa#a#a#a.aa....a#.#..a.##....aa#.a.#a..#.##aaa#a#...a.aaa#.#a.a#aa#a#a#a.aa....a#.#..a.##..\",
-\"a.aaa#a######a##.a#aaa.###.##aaa.aa##a#.#a#aaa###a..#a##a..aa.a.a.aaa#a######a##.a#aaa.###.##aaa.aa##a#.#a#aa\",
-\"a##...##aaaa##a##..#aa#..##.#.a####a.......#a#a##a###a####a..a.aa##...##aaaa##a##..#aa#..##.#.a####a.......#a\",
-\".a.a..#a....#a#...a#..#.a.#.aa.a..##a...#a.#aa...#.a##.aa.#.aa#..a.a..#a....#a#...a#..#.a.#.aa.a..##a...#a.#a\",
-\".a..aa#..a.aa#.aaaaa##.a.a.a.a#.a.#..a....#.#a..aa...a...a#aaa#a.a..aa#..a.aa#.aaaaa##.a.a.a.a#.a.#..a....#.#\",
-\"##.a.a.a.##...#..#aaa.a.#.a#.#a#.a..#aa.#a##aaaa.aa#.##.aa..aa####.a.a.a.##...#..#aaa.a.#.a#.#a#.a..#aa.#a##a\",
-\"a.a.aa.a##a###aa##a.a.#.aa.....a##a#aa.#a#a###.#.#aa.aa.#aa#aa#.a.a.aa.a##a###aa##a.a.#.aa.....a##a#aa.#a#a##\",
-\"#a.a#a##a###...a#aa#aa..aa.aa###aa#.a...a.aa#..a##..aa#a.##aa.a.#a.a#a##a###...a#aa#aa..aa.aa###aa#.a...a.aa#\",
-\"a.aaa.aaa#aa#aa#.aa#....aa..###a.#a...#.#.#.....a.#.#aaa#aa..#a#a.aaa.aaa#aa#aa#.aa#....aa..###a.#a...#.#.#..\",
-\".#a#.##a..a#aa#.###a.#a..a#.aa.##.#.a#.#..a#.a#a#a.aa#.##a####.#.#a#.##a..a#aa#.###a.#a..a#.aa.##.#.a#.#..a#.\",
-\"####.###a##a.#aa#.#..a..##a.a#a##a##..aa##.#..#.....a..##..a.a..####.###a##a.#aa#.#..a..##a.a#a##a##..aa##.#.\",
-\"..aa..a#aa#.#a#aaa.a#aa.#....#a#a.###a.#a.a.aaa.###.aaaa#.##aa.#..aa..a#aa#.#a#aaa.a#aa.#....#a#a.###a.#a.a.a\",
-\"##a##aa#a#..#a..a.##a..#..##..aaa#a.aaa.#a..###.a.#.#aa#.##.a.a###a##aa#a#..#a..a.##a..#..##..aaa#a.aaa.#a..#\",
-\".aaaaaaa#a#.aaa#.a#.aa.#a.a#aa..##aa#.##..#.a..#.a#.#a####aaaaa#.aaaaaaa#a#.aaa#.a#.aa.#a.a#aa..##aa#.##..#.a\",
-\".a#.aa#.#a..a#aa###.aa#.a.a#.#.a.##.aaaa#####aaa.a.a#.a..a.aa#...a#.aa#.#a..a#aa###.aa#.a.a#.#.a.##.aaaa#####\",
-\"#.#.##.##a.#.a#..#a###a.##aa..a.#a#a.##a#.##...a#.aa.aa#a..aa####.#.##.##a.#.a#..#a###a.##aa..a.#a#a.##a#.##.\",
-\".#.##a..a..#a.#.#aa##a.#..#aa#.#a#...#..#.a#a#aa#.#a.aa..##.aaaa.#.##a..a..#a.#.#aa##a.#..#aa#.#a#...#..#.a#a\",
-\".#aa...a.a##aaa..#a.aa.#a##...#a##aa#aa#..#...#.##...a.a...aa..a.#aa...a.a##aaa..#a.aa.#a##...#a##aa#aa#..#..\",
-\".aaa###.a#..a#.#..aa.a##..##.#a#.a##a#a.#aa#....#..#a.a.a#aa.aa#.aaa###.a#..a#.#..aa.a##..##.#a#.a##a#a.#aa#.\",
-\"#.#...aa.#aaaa.#####.##..a..a.##.#aa##aaaaa.aa.aa#.#....##aa.a###.#...aa.#aaaa.#####.##..a..a.##.#aa##aaaaa.a\",
-\".a...a.aa.#a#aa#.aa.a.a...#a#..a#a.a.a##.#aaaa.#a##aa.#aa.#a.#.#.a...a.aa.#a#aa#.aa.a.a...#a#..a#a.a.a##.#aaa\",
-\"#.a.a#aaaaa#aa#.a#.aaa.#aa#..a##aa#a#.aaa..##.a.aa.aa.a....##a.##.a.a#aaaaa#aa#.a#.aaa.#aa#..a##aa#a#.aaa..##\",
-\"..##.aaaa#aa.aa.#a#a#a#.a##.###..##.a#.#aa.a#.a#.###a.###a#.#aa...##.aaaa#aa.aa.#a#a#a#.a##.###..##.a#.#aa.a#\",
-\".a.#.aaa######a##.##a#..a#.#.aa.aa#aa...a#.a#.aaaa#a..a.aa#...a#.a.#.aaa######a##.##a#..a#.#.aa.aa#aa...a#.a#\",
-\".a#.##a#a#####.##a.#.a#aaa#a.##a.aa##aa##aa.aa##..a###a#a.aaa..a.a#.##a#a#####.##a.#.a#aaa#a.##a.aa##aa##aa.a\",
-\"a.aa#.##.a.a#aaa...aa.aaaa.#a#a.a.a.#aa..#a#aa#.aaaa.aa#....#a.#a.aa#.##.a.a#aaa...aa.aaaa.#a#a.a.a.#aa..#a#a\"
-};
-")
-         (setq url-current-mime-headers
-               '(("content-type"              . "image/x-pixmap"))
-               url-current-mime-type "image/x-pixmap"
-               url-current-mime-viewer (mm-mime-info "image/x-pixmap" nil 5)))
-        ((string= "cXVvdGVz" (base64-encode-string node))
-         (insert
-          "
-H4sIAMtPtS8AA5VZTZPbNhLdM38FrMtcNPoBe5kax+tYW/HGtXHWtUeIhERkSIABQDPMr9/3ukFq
-7JzW5bIlimz05+vXzb81D597Z+bgv7qUnfHZWPOpP707mdK7jK+lt8X8GDuz2Iz77GVwpkST57Z1
-OV/nYVhN564udKeHxuDPo/mnHV02H2NKcTmaw88Bt7x1t1iKC+adnW99cenQ/K15eGsvHrfa5Mzg
-X5x58bwnH3n4am543vjA0+LoSu/DzYxz25sx4oHsg88Q9P8f+852xg6LXWld5HUz1J/FShxuLi4X
-M7rOtz64o1l6j3PP5jbDaHipWfrVZAen2cHEq5mz6bzr+LHMF5faeYjw3gmnfbTrBY4NJqYOB8Ca
-OeBDLjZ0ZrThxYcOBzjT26/i2iHGFwOnU40FDzW+ZDdc/24OH/Xuw8m8tdm3Fr4/Gl8eMuR0iOIk
-5y/wl5tsskWfz+axOfCgg+GRB5XwhXHtooR5u290Npgnc6ZEa8aV7sUJeKphGuCqmB2ZJlVzWng2
-fZxg4hXybtnQK6ZYhDPKJzVj6ESQRrbtIw61iHe4abCbLoaHYn6b4fZbNBcc4/+E4y+utTPuPeOT
-uASRZ7owI8wPve9ni79QzJe+kYu3iGT1nbPi/XMRVWjPxd+oNV3c0qzLXOC81z/foG69QxJCo2BL
-g4tqqMYfwVpEkWHAFT8UhiFABnIKntUfch+L6f0osZULsDa4rpFrdEW9jgzFo20cp8GPLhSbVug2
-TlAmF9++iA+hSbYePjycm94NE3KN8szbeDkdRLXqHxiAywnmxyDfpzj4FqXl3GQmFyfUr4We5pri
-iHOnwQYHh9jcN1LuCI/GYrEBioX1ErsVXwYGS8yE6sPKL11cAq/wGJWQy3y9SkQDiwaFx5iIBBgI
-P88TbG+LlrscJiFf4ovkL1PtFmGlpCeL8fOH589Pb2gigepqYQqSHP7q/dCZFtHKMAZxhCuPxuXJ
-tZ6Fob6Ic+kNaqFIZfSuoQCG8nm8+OLhItgsulg65IasK4WmRYbzPy6gsN8Pa0l2OhlRQL/w4AYS
-nHiDH/Z8WsR5l8hcFSVE7pbHuCESmHrLc0sZXIPzVgkD4ucAc6huSJJcViHiVPhvhsG9nSanMYAo
-vXZxjZpQbZJUfegMEICPA30S0QtJFChr8lq1V7PGuSYysiQmcw6dxz2sJRMifrJTJBrzNBTIHCAl
-Xps2ht9nYK/tYsrwxCihQ9FQntybX5CfixQrPXCLg/SPI8pYcqshmL+ot9QCyN8LV/qLXZnrJiPx
-hrg4mnsyv7DxIKxOc14tQPfxTOG42NQx1eHaNIfAMEqmVyy9eoAuAnwLTIbOBpT7scktamWUe4lO
-yU/T9uXibjd+vsI1IzB91cQ2q4MlHxPilAjZAIfjDg3nh1GKmbqc9rqM0G9wNyf4B3VYjFDStXNK
-PKH0iX0I2QrEyCUmBRQi6dqgl5Q5IcG0PI38ThM+AXVXyeYvohZ8AejEc1TYmt/ihd3Tpa/eLXS9
-Or06WtspPI1gUbK/NlKOgt5Toi1tb9PNCYx+jvAAUjz+ISCw18wF0XEFdfdH66aKz2gTSJ5xRoc6
-4lMDsE8u3lA1/br3APq/RReEvcU4y8Tiw2oMPESNFHzhXwVoQUhX6IAkwUPL/eqUICBrfbsiz6Xj
-xCYzMBZFNPhO0+9iL+uT0Wa8uAfgbhBTX0Jc5FSkqsQHKdZG1FvNmosbvLvmih84qPXA6KxFCgQH
-EKDct0fowxEwm4C+2p6LtFifBLryZj/NYze1RNgQV/ZeavEpRSha0cvZhLORswAd1AF4TMparyFW
-NhSlwqzCLP4RoAMKJy9oneckiIln4WLXVW0MDRUUHSLvYpfRZNUUoTCmLFqYYs5XspMaN9e6AFdT
-koMXRy3xgeCAhxpi9jU5B7iMErpdGmrSMMMFXqZYrJT5ALlIWXoEdnTHBrnHQFD9nrnE2lj4ja3D
-M7eKOu5syIDAPfLkiwWYrq8ytQVoBGGWDM8VcIDOfA6MQlHG8ZDIN9URuUXTxe8PX10D/AY9e4Vf
-OBNYlwouMXibkzyJChLzYtuXza8FDdycm8URy/VS60EGdwwVtXAsqgbkD53WCko8ZxIcSJRk5mPB
-tThTuCcu0/l4OPk8oV8KJ0V92kusFIYchY4nXqCVoPnPSZj6I8hm8QOkA+UGMCppG7iVXrH3U5jt
-bKANm9iz+fDrx+d/mQ//eH735g0pbEQSVu6g3KBK0wIdCBNm8sgMqZM2ghVvnFmS5+JcaCZLNEIl
-JvpA/PFdWuYXjBPkfij1ER14IVARoBc4kB1X8mnr/cKTKw51TrEDLaEg+XLtjArux9plFipC+tra
-r1Afxa8ebGft+azdhpzmiRxu9JgIjmS1gosqijkAFbdYHwVqgXYCqUq6qMZbx2KVVC2qMpixqYQs
-TyzJ3M/s/neGi4ME3FGLRMUMmoeoS8FUdGfGwjNSGSx3ZqaUt6iK/pwCioTn/xetgMCmhaLWV9+J
-ptJCntBOt7FKHbHl59JHdXWNOUnHRphDRovWymQSoIK7k3keMkhb74TWyFjkGlCJlGAD9ZGDPPmf
-2HI2V+eGbeQbBoEqRQmlCEQmIUdsyFJeDWp95EiCSUh4J6tVyHOdMjSDFHnhv0iXMsdqf4U+YDgA
-84Gjjwuv7q7MtErgbUdp4zdRh0av1Z2N4g5QAt38WszOsFPbP6FsfgMUPMZHUjmXKo/CkBP8lYGd
-YYgPjaQAfYhKkdlN4lzvRca4je2jKRwQyNPBPF/LNgScmznPwm/FhUTwQoqBGxRjkIxo2yPr1N1p
-3oOQPDTi7PS2DZRvrmTagXv0hyuEs4qve6sOjdyUNMmIdtv9GxTSP7VXXGglJhxKqI+Qg70inDoe
-Ssu3uNA5CX872Iwin173P9jRsf1pipL9xEbGGGVBc8dGrHOMDBElrZXTiNh6PBQ5GRZEdhzkHSCO
-6CHhtuV7xWi+6M4zfkEHxgQC+gnnbqOpZD0mteleuiNZRUM34+FvYGkeAfL0Y62kxRM9krTP1hb4
-gCdXOUeUPMqM3VOf3Ii8Dksc6yk0zEwe5K69a7DUlF6FTxUZr3uYLwmVj5WG8ixOTDRhWEWc9Jz6
-APgpG6kQvuewajOTu+77F8KgY+jaFNmCTIocIzkSijlxW9cguXKD/vJyp3y3eYPRvJFtrTvklwxG
-TLrzfQ/CERwdaTdRaaGUgShDPT84mRKFcl8ivDfKUkgPJS8BOujpqEog1YftkueIpeskgIPsTzC/
-R47/hEJOCD4Vo0sasHRHcanSPnq7J3blrNePyH9CXmaLu3H1grN+sqpJHT/m4Gpf3OAnsQo44Olk
-/06SODYd/j8elNLVvBFfuPsKpZqrSwb2LWBw2UgUhxbmEmQNerdw68yBihlKBmx92UYbZgUZmIPf
-w+NjRaLbHE7b1D06EE2vzR35fMW8hPSBmyBCt3doW8MghHtOOqGDg7pwgygYBG4rDARyLtyxuQdt
-o5Mf3J3ygIOBr5ypExNC4i0ETRlL8yjGd+T4908ngWo2WlAeVzmbHMA1AsF7AymZTRqhz+JZ5Qly
-VUf7PDqp/VfZztSCIVEXH8L/weShC6gEJvZVWCKiTOTIE9n3/sM3Fm/bpaNBRPCdlQAkIn+FiMM7
-9NADOAe0draO/nWTIvSi3LF4N0d2UKE0ZAKnfTOplvUSF51vBoaVMa5Ix6WbTOi5OitxX6QtkFD6
-elAEMXL3QVHoPqCda6IDN8L4vxXIZYtinITBVNGr+eYWWqDbDApt/iKUdx726Wer+W+CIbO+7yQr
-fwDOJKs4KokyvqKosjvQ9Q8u6qAPPgAN/Ajs1kg2spPcBgoBCK6DYqrkjvMlvsCHGng3uAm1VU7b
-ejSjPb00yXfbuijs9zzoVHDc2pLlaq8uFRBgfpTRXuzSsRsoWweBbbnI9BbHLbRo4YlcXeyrQHP4
-IojLEv53BGlEFD5iTLGN/Ep805acyC9e3fwJA1ZZ92fOChOCQ/028zVL4nJLYAHXZyRvlnVZrVX2
-Fq5WOi6aC7eWWmwiQYclqCHtWKtX9hEvHEjUJwr6FWl5mPgHJo4Cd0Jo3jCrZCjVJf1ZBA32z5VD
-yc9hy00kdF1ICEcgvgltZBG+h8HgrIXbhmOVcIuafI1wcwBa5ZoB0XMLJbzzObj1J86jG+st9CK4
-aYochpGwunWA6xoSb9c9ClUHGAr3PJnDzz3XH0d6eAP4XazRZ5TJHtCVmlZaDH+ST99jF5f1pD6y
-cmWCVp/s3p0kqo3Qe3qamLCNrVBVYfM1VRYe8xdDFWoRGwmICmVrf8UlJRv5lgEohuqRoeiDHS+k
-k9T//eBlXND5j1d1AMGjde/HWNH2YcLXvJfqkyHZ4Tp3F8EHOW/i2SeSuAfZdi5E5GP1QS3IqgHV
-/MnOcKHs1UEpHMb5unY7mzlXNsAXHuYwzXDUQXp60b2BvudQot/LiikEeZ2R6UgqXpdFKunVi4If
-E4yf7EYOHjol9rIXCmxH5uqz0Ja6Omp26y61weuoAllEHek/uywCtJJv6c+C8wsXa+zzkyQ7l7DE
-NqaULHMWnCcM7RK3IZBFB5RqaQyXfJ4cmu1Ptu3rcac2stVliUCaQJAO1DL86iAp1MPKK446eBSd
-SUpECe57DcHOak5+IXlgOOrLh4yhTgawIUpe2m2FZa4ATNDtBJ1eIcDrXUt9llsg+U13hTGF2m3g
-fwzAlECCJ9vn7eK5Zi1Vf8+Dvh+U8AHqfrRXDyKE/kFKqWAlk0+qu+TOFgGVi/BXpI3UFFo+CCPG
-GUG/6z5q7XSXI+/WkTmLSp9Woq2Igmzo0BJQBPtIpi8kFldkduTbmKNQMerREJ58aEvFP8klzbLX
-lOG4U2iFQcueVakF2evV6TGj8qGwr+dlwencaH6f2RRAm3WfdkcEJDdfOLa9UEIVKX7arnKudrJ0
-wuAS9huaK3wSOuWQtHJhl9qa/VVe6dzpiJyKeNzubw2QoXVfeH+ZkRc/jnU8+KL2K0SS+Ah9/Rql
-uyUHYCMs8udfQ4sW8APIEl/21ZE7t32MQ7MTVto58HWTLixb3K22SDuH81pXXwT2pLb9Bn1o+g1T
-QN4UE7C2FZxu54iv23yPFj0H3fvIhW/0atSQC+ZSWvc/LM46zb4fAAA=
-")
-         (setq url-current-mime-headers
-               '(("content-transfer-encoding" . "base64")
-                 ("content-encoding" . "x-gzip"))))
-        ((string= "emlwcHk=" (base64-encode-string node))
-         (insert
-          "
-/9j/4AAQSkZJRgABAQAAAQABAAD//gBLCgpDUkVBVE9SOiBYViBWZXJzaW9uIDMuMTBhICBSZXY6
-IDEyLzI5Lzk0ICBRdWFsaXR5ID0gNTAsIFNtb290aGluZyA9IDE0Cv/bAEMAEAsMDgwKEA4NDhIR
-EBMYKBoYFhYYMSMlHSg6Mz08OTM4N0BIXE5ARFdFNzhQbVFXX2JnaGc+TXF5cGR4XGVnY//bAEMB
-ERISGBUYLxoaL2NCOEJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2Nj
-Y2NjY2NjY//AABEIAJ0AWwMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJ
-Cgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQz
-YnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOE
-hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm
-5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIE
-BAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZ
-GiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SV
-lpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4
-+fr/2gAMAwEAAhEDEQA/AKF84W+nHA+duewOTUY5A9fpU14o+3zkE/6xu/v6UyIBpUVskE81xStc
-9umpJczJI0iaFnZgpBPU+3GOv+fzEHOOhAx371S+2SHkhcjrxTXu5Sv8K4PH+fzrf2UjBYuEW7lw
-sMn5uRjHb/PSmiRd2O/+f1rNa7k3cgAgenP+elNN1IzDAUdOOfy/z/Sh0mDxsTWBPc/nSqAUY+Zg
-g4CEdemfyrOF7N6g+nGP8/40v2yQjbhccDG3H+f8/iKlImWLg1oXwxxnn8Of1oJP69apfa5ck8dO
-SR0A9fx7Gk+1SkEblz04X8MdP8/yXsZD+uQLfXBZm298Dr9f8/4VC0uCQ27PfmojcyMOCoz2wOP8
-/jTftTp8okjA9DGuf1FP2UjKWJV7o27wj7ZMSTjzDnjPf+fWnzxQRXcSW0vmrxk5zk55/wA/lTL7
-/j7uM44c5HU4zUcIH2iPIz839awkmmdsbTimmYyj5RnjA9unH/6qQ9e+49cCnjkdDkdh/SpbZSJj
-jkhOP8/56+9ei3yxuePTjzzUSlJgYPQDqP8APfn9ahB/eD0xknFaskAuEzIhVwOeR+VOhslKoYba
-RyMYYIT/APWrH2p0PDNPfQqm1YR5DjeBuCgcgdqi/hzn8znA/wA/41dnjFqrlw4lcY+cYzVRRjG3
-t0/z6/5+l023uZV4xjblADnAwCOc/h/n/wCv1p2AeuR6fSgDvgcAde340vf+ec1qc4hHG08D6YH+
-frTd+P8AloB7E0/GOw46UmWHHT6ilYdzevSxvJxuOPMY9eep71FD/r48f3h/OproIb6dXYgGRj0/
-n37frmqiysJMgDcOfavNk22e3BpLlSM5RwMcHPGKmsbeS6uxHCdnBLORkIo6k/p/jSskUR5Pmtx8
-vQDHrW5oUDCzEp+/PJ8pA/hBxx+v1rslU93Y8yNPllq9S/b6fbwqvyB3H8b8n6+34VZPPTHB/wA8
-09h2wcZ6dRTT256VyHX6kbwxzRmOVAyt1VhmuU1jTf7PuB5e4wyjKZOce3+f6V1w44649qq6taC8
-06RAuXX50wOcj+v+Na05crMqsOZHG+hH4Cj09sGlHIyPrz/9el2+ua7jzxpzjqR1z7UnP0/CnkZI
-JHft/n/P60gHHQ/nQM2r3/j9n6f6xun1qAW486PzYzl8HB9DU144N7OCQG85gMZznP8AhTRJJJKh
-dtxU8Z5rzJJpnuxfNFNGYcKpZx0HI9eP/rV1umRGC3tYdpUrCN2PUj/GuctLb7VdwQEAh2G/P90c
-muvhUF3b1OBj/PWums9Ejy6C3Y5uvqe3em8g96ec7e5PX/69MYfNnHX1rmOtAuc8fnTwcDgnPY0w
-cnnrwPpT1JK8Z64oEcbqtmbTUHjUZRiXQEYBBP8ASqnQkjnjp2/Ouv1WwF9bbVAWVMsjYHB78+n+
-fauUeNo3aN1ZXTgr6f59RXdRnzKx59aDi7ojI6nk5Jz1A/X+VJlv4UJHY7c1IVGQc9OeOnWmlTnq
-w+gOK2Zkmal4v+mze0jEA9etOgt55zuigd1B64AB/H/Ck1cNBNPhlyxY/KckD0I7etdEY5IoRHbl
-I0jUBVIBB9c+305615r953PZdRQilAx9CtpI7q5aRWSRIwoDKQeSc9evKj8q24MBMcc9vaoLK7F1
-G7yoqyREhypBBHqPY+9WYU2RqTgMRnp+ePanKV3c54xsrIcwwec+/vVK5cBlV2kZmOFjj6t+XNW8
-BSKRA8c/mR4DhSBuBOM9e4/n/TEqxbvbQomxfkjTyWzglphnP1z/AJ96WxdDNJCYpYpYjgpJIW59
-snmrVsv2UN5ZVS7mRwvPzHqeSeeBUhTdIZGA3kcnPBxiqbXQiKlfUr3CqSMB2duiiUr/AFGenasj
-VbWSWaOIWsouMkDeQfk5z82en41s3FslxNFI4BMTbxxnn/PPr1p1zH5yffIYfdc8kHn/AOv9aIy5
-dSZxctHscfPC8LlJEKuOQM5yPX/PvUBbk4DAfQVbvWke6k8376AJknrgdf1J9s1WIUHBJ/KvSi7x
-TZ58kk7I0dQUNdTr2LsD6da19L1CK6iS3nYrOq7SGPD47g1mXb7bq7XYpLSN8xPI5PT/AD2qopKS
-wyLuPlyK24DIUAj/AOv1rzOp7c0uS7N7T7KS3ub8TSBmmfMYH93/AB5/T3rRYlYiw9M8VJlGQEkN
-xxRxgc/Ngc569u34UNnOtCJSpRdpBXGRg8fWkPGB0xzzVN0ntb5UicfZ5SSqsM7W44/LpVht/lME
-Ks+3jjGD2pWLTJV45wTjsKrtcGK4bzj5ECDIdiMMfX8P8+lUNJ1T7U8sEoP2iFir9COO4Hp7Vpu0
-EsTRuUMbAhl45H/6qdmtyOZPYig1OyuAfKuomI6gN05/+v8ArUkMjuXJJwWOzjBxj0+uev8A9aob
-O0stPQpAEjz1YnOce/8An+VTHbKqSoW4JIxkbhQ0rgm7amBrgCaiWHeNT0z69fXoKz1kKDaJpFA7
-Dp/OrWvSg6iyDnYqrz0z9fx+tZbTRIxUvuPrxzXfTa5Ejz6qvN2OoawV55ZZcOGdiF/hHPepwiKo
-GF24OO+f8all5d/Uk8Zx+f8Aj+FMAGRgcnvXjzlqdVOnOs9RunwIl3cCNAg8pQFGeMlun5flWkjB
-kyDnHGD06dqy/Oe3mWSMByRh07EevHerkV3BLJtRtsrHPlycEn29fwrWDujZpQfKTSIHXay459Px
-phyevXqOKk3EEZGDj8Ka3T2z1FWykc3q3h/zrpruAPlzuZVPKn1HqKzLi+1rTkWMXcxU/wAMg3Ef
-ga7fuR0b6Zx+FNeNnHyyEfhkH/P+fWqjNrciUE1Y47S7vWdSu4opWmNqW/eBV2Lj0JA/D9K7EkBS
-c5A9R0H+c1EtvIXIluHfHO1VC/X3/Wm6hIVtGRW5k2xjPHUjP6USlfUUY8qsZakSxM7AMJSWKkdj
-ng+vGBVKTTrfedolA9EfA/CtORQccD26cH0x7/564qoyyhiFIYepzWEajTumZTw8r6M15MGRu+WI
-AP1/yKjkYKpbr2Hv/n/Hv1lk4lfjHzZ49z7VXYkyKAcYGcD8h+HWsXrI7F+6pXQD5PmPJIycHkf5
-9vT60s0auux4w3s388f59qeT+XcE4zn8v/1fSmjHPJ64B6dP8/Tp6U27LQ4aUHUnqMAniX9xcOpH
-ZvmB9uaI76aMgPAjcctEevboe/1NK5wD3I7dPwpgUBQTySCT7+/+fSqjNnXXaprQsjUoBw4ki9ih
-OB9RxUc2uabCmXuk5PQc+v8AnNYOuaq1p/o9sP3rDJY/wjnoK5zyppCzMCWxklq64Q5ldnMq0n0O
-8XxBb3LgWjCR+cb2Cg+nHX8uajbzJX8ydgzD7qrwF/z61yEGlySbTkjcOMCtqz+1WYCtIZkJACk5
-I7fLn/8AV2qZpbJjcaslc1SxUHcxIHGe/THP+I9fSomYBiPl6+oqTcHQMuMHp1A9cY/Tn8qqtJsY
-rg8e5/pXPbsOFbS0jWc/vH3dQx7dOf04/r1qPpMCo+8MZ5/z3p8jEXTgqykk/K3Gecgj68c0yQYA
-Ix8pHbt/nNRLSRv8dGw8HJAHXjt+Of5flTFbKnJPXnn39ad6Y6e38/rTBxIw/vcrzyex/kKTMMM7
-TGzkbRx3HQH17DsPrSkjP05z/SiQfKV9uwxg/T/P603cCoI6HGP8aI7F4xO6ZUl0WK5tZrwkGbcT
-gdcDjv7Dj6+lVkt41UAjA4xx/nP4fjW/pEypLJAwwGO9COMccgfln8/Ss66tzbXUsOMIDleP4T/k
-/XFXGpK7i2aYVx2M+3IjmeBcBcZU+nY/zqysscc8LyD5Q4bgegyMfl/kVBbqftc7EYYMO+e3+eaL
-v5RHnpuHt2P8v6Vo9WdVrxsy0t0Li4n/AHaoGIfHUAnr/L8zUEpzI3B61FbMFkZ2IVQvJz3P5eh/
-zzUMtyxkYrAXHZgcA/SmonmVKb9o+VHaTLaXimGR43Yfwg5IPf3zVabTp15hcSoeofhh+Pf8h/Os
-K7JW+mKsQRISMfWuh0q5lnsVeRtzKSM9zjPX8q5akXDVHTODpJST3M9mNv8ALMjRqDwXGF/E9M/j
-Q53AFSGIPBzwf8/59K0tV50q59FwAPbIrkwPKGY8puPO04z+VXS/eK5nCi5++nY2NwYZySDx/kVG
-CynHZjweuCTWZJLNGjsszDB6cEHn6VDJqNwo5KvnA+ZfWr9k0dVSHPC0jYIDEcnOcgjqP6j1/wDr
-VNPI14ieZgXaAhSOkoz0+vH0rNsbqS5GHIAzjj6j1+tbNtpsU8atJJIVJAKcAdfpUysmedC8JaGF
-cjy3W7jbIwAwx1H19Qe3/wBai8BZkCglVBcnGcdB9e9P1BQrSwrkJ5xXqScZB6/WtLSQDdvuAYeT
-jBHYnp+gq3LljzHoSm0ub0MAqu48Zz1Hr2/pTTjPJQn3UZrqNQ0i02u6qyEMB8p4x+NYMtqgkOGc
-D/epxqqSuHtY9j//2Q==
-")
-         (setq url-current-mime-viewer (mm-mime-info "image/jpeg" nil 5)
-               url-current-mime-type "image/gif"
-               url-current-mime-headers
-               '(("content-transfer-encoding" . "base64")
-                 ("content-type" . "image/gif"))))
-        ((string= "emacs" node)
-         (insert
-          "
-<html>
-  <head>
-    <title>Versions of Emacs</title>
-    <link rel=\"made\" href=\"mailto:address@hidden";>
-    <link rel=\"stylesheet\" href=\"about:style\">
-  </head>
-  <body>
-    <h1>Pointers to versions of emacs</h1>
-    <dl>
-      <dt> XEmacs
-      <dd> An extremely X-aware version of emacs 19 from Sun and UIUC.
-       This is the recommended emacsen to run Emacs-W3 on, allowing
-       inlined images, inlined mpegs, and variable height fonts,
-       among lots of other cool features.  Distribution is at <a
-       href=\"ftp://ftp.xemacs.org/pub/xemacs/\";>
-       ftp://ftp.xemacs.org/pub/xemacs/</a>, or check out the <a
-       href=\"http://www.xemacs.org/\";>XEmacs web page</a>.
-      <dt> Emacs 19
-      <dd> A slightly-less X-aware version, direct from the FSF.  This
-       is the second choice for most capable version of emacsen for
-       emacs-w3, and allows for different fonts (of the same height),
-       coloring of links, mouse, and menu support.  Distribution is
-       at <a href=\"ftp://ftp.gnu.ai.mit.edu/pub/gnu/\";>
-         ftp://ftp.gnu.ai.mit.edu/pub/gnu/</a>.
-      <dt> Emacs 19 for NeXTStep
-      <dd> A version of Emacs 19 that runs as a native NeXTStep
-       application.  Fonts/colors/menus/mouse support.  Distribution
-       is at <a
-         href=\"ftp://lynx.ps.uci.edu/pub/NeXT/emacs-19-for-NeXTstep\";>
-         ftp://lynx.ps.uci.edu/pub/NeXT/emacs-19-for-NeXTstep</a>.
-      <dt> OEmacs for DOS
-      <dd> A version of Emacs-19 for MS-DOG.  Distribution at <a
-         href=\"ftp://oak.oakland.edu/pub/msdos/oemacs/\";>OEmacs
-         4.1</a>.  Color and mouse support.  NOTE: Emacs-19 now has
-       native support for MS-DOS, so this version will likely
-       disappear.
-      <dt> AmigaDOS
-      <dd> A version of emacs 19 are available for AmigaDOS.  Emacs 19
-         is at <a href=\"ftp://ftp.wustl.edu:/pub/aminet/utils/gnu/\";>
-         ftp://ftp.wustl.edu:/pub/aminet/utils/gnu/</a> under the
-         filename a2.0bEmacs-bin.LHA.
-    </dl>
-    <hr width=\"75%\">
-    <p><cookie src=\"about:quotes\"></p>
-  </body>
-</html>
-"))
-        ((string= "eggs" node)
-         (insert "
-<html>
- <head>
-  <title>Emacs-W3 Easter Eggs</title>
-  <link rel=\"stylesheet\" href=\"about:style\">
- </head>
- <body>
-  <h1>Emacs-W3 Easter Eggs</h1>
-  <hr width=\"75%\">
-  <p>
-   Did you really think it would be that easy?  Read the source, or
-experiment! :)
-  </p>
-  <hr width=\"75%\">
-  <cookie href=\"about:quotes\">
- </body>
-</html>
-"))
-        ((string= "authors" node)
-         (insert "
-<html>
- <head>
-  <title>The Emacs-W3 Team</title>
-  <link rel=\"stylesheet\" href=\"about:style\">
- </head>
- <body>
-  <hr width=\"85%\">
-  <hr width=\"75%\" label=\" The Emacs-W3 Team \">
-  <hr width=\"65%\" label=\" 1993 - 1999 \">
-  <hr width=\"55%\">
-  <dl>
-   <dt> Author
-   <dd> William Perry &lt;address@hidden&gt; (Hey, that's <i>me</i>)!
-        <br>
-        The main author of Emacs-W3.  Currently unsure what to put in here
-        about his employer. :)
-   <dt> Supporting Cast
-   <dd>
-    <dl>
-     <dt> Chuck Thompson &lt;address@hidden&gt;
-     <dd> The master of the XEmacs display code, which makes many of
-          the really cool things in Emacs-w3 possible.  I owe him
-          copious amounts of beer.
-     <dt> Ben Wing &lt;address@hidden&gt;
-     <dd> Another main XEmacs developer, and the man behind the
-          PearlSoft port of XEmacs to windows.  I owe him his choice
-          of alcoholic beverage as well.
-     <dt> Jamie Zawinski &lt;address@hidden&gt;
-     <dd> The main Lucid Emacs developer, now working for netscape on
-          Mozilla.  Helped me do the initial integration with Lucid
-          Emacs by telling me about stupid mistakes I made. :)
-     <dt> Marc Andreesen, Lou Montulli &lt;marca/address@hidden&gt;
-     <dd> The inspiration behind my efforts to create Emacs-W3
-          initially, because I hated the interfaces to Mosaic
-          and Lynx so much.
-    </dl>
-  </dl>
-  <p><cookie href=\"about:quotes\"></p>
- </body>
-</html>
-"))
-
-        ((string= "cGhvdG8=" (base64-encode-string node))
-         (insert "
-R0lGODdhbAB4APQAADIyMjo6Ojw8PENDQ05OTldXV19fX2dnZ21tbXV1dXh4eIaGho+Pj5GRkZqa
-mqWlpaysrLW1tb29vcnJydHR0dPT0+Dg4Ofn5+zs7Pn5+fz8/AAAAAAAAAAAAAAAAAAAACwAAAAA
-bAB4AAAF/iAgjmRpnmiqrmzrvnAsz3Rt33iu73zv/8CgcEgsGo/IpHLJbDqf0Kh0Sq1ar9isdsvt
-er/gsHhMlgkC5aPgnB6u0d/AQEAcDAIBdnctuBPPcnhwWnYDRneBggCDJno3AwQEhjB5jDN2BAWS
-kyd2goAoeDmRBQamCAgGmoV0lJYnAgWyppmRKIWegK+LgTeRpgaoqAkJCgoLCwwELAOlqJqS0LK/
-qcHV0reeiIok3DaQBAYH1gjFyOcLCQeveeEIx8jGC8bC5QnDqAcJ4tMnm3NydJXwVgOcOHLm0KVb
-Z6JdMHjzjtETRgwfAn38NPljFZCgIDuPIh2oZw7iggYN/hyojJggHjIHKVWqTMkgHjwFxHDeGwds
-WaM+ubwJ2iWjmbNh8s4xYCDzgYMHEKJCUBnVqdOnMhswaKBQos4DPAtwGvGvUKIRH0F+ExksITqt
-MWWqfEBXagQIDyJEoJsVZc2uOC+aKnAghdk3cIbmuSFnFlJ4W1E2vSo1qt7KVfFOTal1add7F8H6
-LIFrzp05IoYWYnzKHrrIMelChaA3ggQJtXHfhSChqlWaTLXGI6YOrIFOuN7owdNnsS+KxY5FXvq0
-bl7atm9rx6378l7ZWR2g0ymscImyrFDzat7KBgHo8qYzlY33rt7t2m3Xti/7Kkzx55CXjwno2dGH
-LgGt/vaNKTm9FpdVlmWn3QQU4nfbbv3JxVVNxoB20WgjlDbHGdtUopYNCEEm2VzVRXgbhRRQCKOF
-uvnGlwN/zUPcRe2JIBY4pelymmk3IKTQg01J9SKMMTZZYX694XWjcMNVFMxAkRQiCVCfyHEiDa0h
-EBEyccF0kgOZ3SfBBBS06aSMF+Im5VU26VTRASACAA2QBiJy4B2SFNQWcejMRA8yfzUwlQO4wVgB
-jDI+iVt/NdmjgHHAgIWlJAXiMaR6NIxkT3THqKSAAZEQYEwwwJhywAIQRMpmmxVOcOEDJzVwgCal
-oArOL8eRAE2qZXkKlIJmiDOqST+SQso2axAgQDAO/tjGJJy3QbDQAXRY0mMzJBiVJSRmJYgLDdOO
-RByzmNSSCbQCSEuttbNi29u23ZbwbQHhTrPJP3wAFe9YMBi3rjkFNCZLrwX0SAIdB9DG5m0UrHlr
-wjQQSywuxmr55QuEldPhPgbY8WoDxuijgCYGOAwAHQtEYKuMFU9g2wN5IrfLwln2nB65kFyiTk4d
-pgLaSUuJqQBVEThAzQGnKpAXzTFmq8wmIfbMc568Dgv0iCJmIkMA95C6wDAKEWOAOamcXVFLZE5d
-wdwWtLkXAzvtiuo0C88iVnvNOLvKJmvgkiVRKhSAU1JjkrkAWCONI0IkCciVzgJ5SUDB3BVYUHfT
-/sYogIoqeQJVypYi4Ll1qpAU7rHYMbwHN5lwoaTVrrxOgkABFCzFgAUYMLC0Xm5acIEFFUjAFZXB
-ktWvJgr4yPOwhB9LLuwwyP5W7X7h/q4Iu/e+FPDCVxtB8ccnv/xfzU/+vKrS872xiO2OrXIycl3l
-VMkjYADBCAjAQAYygKMLZIAu9JpA55D3AAbcZWkOoEACSCCBBQhLb9ITHKcKpLUYBGBtL5mLbxwQ
-vZcJwAEWkAACDNEADQwweBLIQAptpR0KeK4CvKHAMTj3ALJUiwQEGMcEJ0cLjX1NS5FAHArA0pL5
-QKU2D+DKRYzBG5v1ZoC0EmAGLtAm7qypcxU4/l9vdmObsxFAKwkYjT700Ypfra4sG7QFDFBhjAbM
-Rk36sRUCaaM5z03AcxYYICCrFhUJcM5mm5tAVWbCFZwsbFDEIEstqAc2TABpBPxagT7egT+6NKpC
-baoArRZItwtgQIsyvKEV1xTKF13oLmhaSdo4mQB+jUN+z0KPESfnhxQwUTpowo6tQkk3QBrvAgZE
-ZQYw4LkLiFJCm3uUzCr2yu84JSUuGRkABqCK0/lrXJZMVSYBsCuBNUIY8zhJXbgTTc+d0pSnHKA8
-5YnMQerGUY+yWKRuxhfbcUh0E+wmLsEZTlKMoJwGOicq0mlHqLCzmO88pTLnWU/PVUwv+JzZ/ppk
-xM9r+iUi5QCAQHk1v4JGwyfhkISmUoOGkDWIAbKhVzuNGc95ZsCFMkwfDV8UTZvNbKcjhIlwisbN
-bpKOkkiEhCZasbAB4EkEhnsM/qpjLWJCtKY2XSYXqzYhBXJ1QvexJo48Mw9UhGOk7jpiHOUYRHcQ
-wEvReg9Y3qGAyDwFo01aICAnKk8MpK9q96GQKK1oM/3UiC9kpYfe+vZNcK5VFoXAE1jEgqpouTQ6
-ubJjFR11Q+Pxta/Io5CEWGm30XZHSkLlSlnxlJG9IRVIJyUcAgigjlPs6bLlSMZWPMlKzun1sy90
-Jg3VpMC5FfZJtYkKVoSqI1WMlHr/+Bex/hpGh90JRjCmaAY5RIaoYG60mJ4VoAs1QN55pjA3jaoA
-Mx/Fx+3YBy9ZASmq9HbUTKzCkr8ixRoAYN1xYLdkR0FKdwspWL3C86Y3La88z4tHBa5XkaZ9r38a
-Kbr5MmyS921XfqFBzgJUAzRg0S4+WlLHp2zWhnNDJnDlqUjuBFa9fqVAVJB7GSl9tKyoei50w0aK
-H5EziMq6hynitd17IEqzMmMTKVU8QJwiWIYPyI9lFGhKLuLFlcmF70xASlm0eg2JseXwbEdiDeoa
-pR6cnEdKopxk9AEvqwO8gBezNWOaSQBH+akxfFFik9metW/25ZTh3OjjUyEEpeEQlcji/oNkqiHv
-eFh9oa14ozkF4CFii5pAOmCal/eils/IUIcdBoPLPRnupAsT6TjmOg8DZQLNmE0GAhO4OXfGU6L5
-pMsEHCAsHIlHBDKxzJzMlAx6lCwWjCWpWjcMEgHsTh9wQwWRt0tXyCBwSUq2tUSZublTRcA8k0MA
-jnyEAGHP5io5OtvuthkOxr6LoPntMRrcscZqQCJMgzoHSp7YVRs2E5AVVYYBMCeTX1arAQiAInhw
-FKCzPfUX0zspj6eLMXqrw95nFUa+acfvJfnbeAA/ngUETnCVGDwCCFf4jXJ0jA8BAOLyC1xp4ti3
-VjjcIvf27+galCsTS0jJC0SmipFn/gEItCRJKHuKcDCzXNWWdXdoUKq7xcLBMJdiBJeaqzGUOtdU
-QA4iu31idkJpzGPe0Lj0kVMUMUcfLTM8HVYyRLzaHXHWXe+xGIOqOFR2Km7qvBoPObJmC0mxWh9T
-5HWj1XGllJnZLJLYoftQ1EfNN7FQfeKBxl5qSK1UV43uFJAJu2W+q1dAzs1JGy0sdmzkdtWKTjBs
-mDegvabLDctiBdOeK0/QptvqiF1z4D09rVI/MRfb6EYAAqioS0BqafwqqRp75DhN0HlR7V1UEIEJ
-faoKRuFHCtu20s93NGQmY6vCEXqqu6ChT/FSTJ80mVCW17ue/YbyO9ucU/yTvi9+/uT/h8LXgH6z
-xzoFAiTDkmooEC+9EgyKxnuR0Xa2EUr7JCkxsn96sXCpFQ+fN33TkmwaA0e290guswh9cFar1nXE
-oGYPQngWkhvZQUMVIjO7ASBIMxwXAVmYhDtbsydVp1TiohGkoQ3x5ypdR0fd1R/8piaaEWUTQxma
-MwENxHamchOvhyfSkhqLJQ1GVHUfqAoDMQ0lOAtECB3nMBkxdRc3IgFOQQwj0SEScYMFUDkOUEuR
-ZxyR0EbNt4Uzp2HihIPhEmimYRRjiA/SUSYtEhUhggh9klCewglqEYf5oAqikDru1zUfeEQadoCl
-k3kBMF2t8jYqsma+F0XTYAeE/jERRMgPF8EJJRg5p7Nf29R8zkdQriNdbvRWaNFjg+OJYZJbiMIU
-TVEdFVITW0EVw1UfY4UTkVBs/zUWJDNQVCdotciHzjIInWhfuyhOwEASSgGMLKJrtkKMMRErF4KM
-S6GMBMCMPME/I/CMJJVL6/c1G3SADAFVW8OHj6Qu3KVvZrgoa5d9jDcXwqGDkVdEIIKNlQdbrGA9
-G0Ms3dBjpDN30bd3IjM7dmUV/oEjEpFOv5gjCzNXQkYLY0EYAuUu0ViAQPMsrQN/v9CQvKhojAMX
-1RETvoMMUxQgoaMOj+Qq3XSHwuI37lJSyTFoccQIjQEsdqcxnrdo8ZFZ/hEZ/s1VklvYK7hDOiZw
-SwO1QUBTOAy5Me3zcghJe/m1lKQSirZzlluBY4OBCdCwjj0WKOGSEY1ld6bBBykpj+y4TVLnfg3Z
-LpmgaIQCD/7kF2eZDKFWHJATGj3pLkAURLMwSQR4RHb5L3jpiHtJOpHpRoCZgoJJmNyzIYcJObqH
-lc5ykI7pTUF5PckhMIOGCaYwAgMzDYv5gcCCELFWExtCjLBxYzipceKUJT85gJcYJNYjj/aFKlCl
-i8LZM8fZgPcAGYZpmNPRGbIUIIIhP98yGCV5kqq5kK7zOqQgDstwjcoJaAQ4hEVohArRjb7Tnn1W
-W6QGiz4ii6kpmSNil3so/oj8AJaC80bMiZ4k4RXrmW7ppiOK6S+MwE3LKZR9YpcCYzosUwqiIZGB
-Zoku2ZzOSWKhEzqvgZPqlgo800vSMxhBuX5lcSDMMSJocI2m6H5z5Zd+Y57joo2ZEibRsS4RIaCB
-gV2s0yNTB10oGTDyyUt9owr+ZYUVSlKvRXE1imb1IA/FQBwVUQ3/YAk7WJp3t5B1yQfnYRR+c6R9
-WKElCmbHyZNOKgxQaidTKpKeUAJXmlZaaSB/8gYs2Yet8iG66FqrM3PK2SqZIipSuiORiDpXOXXn
-ST9ggxxvKYYHERoQR3eZ51jRJ307KX/1ADmDgX4h8o7wGKSFYwmNOF1D/kiEmBKWWoiSa/WBYriO
-reKHJnA6qtNYCjmUZ+AwQFGaZcqTukd3hoqqs8qnO7gnKbCDphinxGkak8hS8YZhrSKaIOpc7kaX
-Q0mcJJgHiDqCRGShkNWXItIRDsOilsgrzbqURuWB8RgkdfkJ6MKp7/KrItIclbApgSM/C3gQ8leu
-0YqJ6YGizLGuJdos54quzPEKCiiqXcOTY6iDMrp+XFmX96lEhsFNkElJ8Iau8NoJpdk17tesiamd
-j8mDtIqsXKKpLLAGSkqbg3YgfFAJBPEw4TpJzjWuoWGu0howA6scJKsCpFaitogerlMJoJCAFAez
-ftqok+Wx1MOataoYPi3LAqJ6np5qswKRAr+ppAI1rq64sOAktTZwqmuFX/u6sggCsTBKtDGrq5Bj
-oTW7tBCrAr/JoNOKGGwLByEAADs=
-")
-         (setq url-current-mime-viewer (mm-mime-info "image/gif" nil 5)
-               url-current-mime-type "image/gif"
-               url-current-mime-headers
-               '(("content-transfer-encoding" . "base64")
-                 ("content-type" . "image/gif"))))
-        ((string= "bW96aWxsYQ==" (base64-encode-string node))
-         (insert
-          "
-PGh0bWw+CiAgPGhlYWQ+CiAgICA8dGl0bGU+VGhlIEJvb2sgb2YgTW96aWxsYSwgMTg6Mjc8L3Rp
-dGxlPgogIDwvaGVhZD4KICA8Ym9keSBiZ2NvbG9yPSIjODAwMDAwIiB0ZXh0PSIjRkZGRkZGIj4K
-ICAgIDxociBhbGlnbj1jZW50ZXIgd2lkdGg9Ijc1JSI+CiAgICA8cD4KICAgICBBbmQgSSBzYXcg
-YW4gU0dNTCBwdXJpc3QgY29tZSBkb3duIGZyb20gTUlULCBoYXZpbmcgdGhlIGtleSBvZgogICAg
-IHRoZSBib3R0b21sZXNzIHBpdCBhbmQgYSBncmVhdCBjaGFpbiBpbiBoaXMgaGFuZC4KICAgIDwv
-cD4KICAgIDxwPgogICAgIEFuZCBoZSBsYWlkIGhvbGQgb24gTW96aWxsYSwgdGhhdCBvbGQgc2Vy
-cGVudCwgd2hpY2ggaXMgdGhlCiAgICAgPHNlY3JldD5NYXJjQTwvc2VjcmV0PiwgYW5kIHRoZSA8
-c2VjcmV0PkppbUM8L3NlY3JldD4sIGFuZAogICAgIGJvdW5kIGhpbSBhIHRob3VzYW5kIHllYXJz
-LgogICAgPC9wPgogICAgPHA+CiAgICAgQW5kIGNhc3QgaGltIGludG8gdGhlIGJvdHRvbWxlc3Mg
-cGl0LCBhbmQgc2h1dCBoaW0gdXAsIGFuZCBzZXQgYQogICAgIHNlYWwgdXBvbiBoaW0sIHRoYXQg
-aGUgc2hvdWxkIGRlY2VpdmUgdGhlIG5ldCBubyBtb3JlLCB0aWxsIHRoZQogICAgIHRob3VzYW5k
-IHllYXJzIHNob3VsZCBiZSBmdWxmaWxsZWQ6ICBhbmQgYWZ0ZXIgdGhhdCBoZSBtdXN0IGJlCiAg
-ICAgbG9vc2VkIGEgbGl0dGxlIHNlYXNvbi4KICAgIDwvcD4KICAgIDxociB3aWR0aD0iNzUlIj4K
-ICAgIDxiPjxociB3aWR0aD0iODUlIiBsYWJlbD0iIGZyb20gYGBUaGUgQm9vayBvZiBNb3ppbGxh
-JycsIDE4OjI3ICI+PC9iPgogICAgPGhyIHdpZHRoPSI3NSUiPgogIDwvYm9keT4KPC9odG1sPgo=
-")
-         (setq url-current-mime-headers
-               '(("content-transfer-encoding" . "base64"))))
-        (t
-         (insert "
-<html>
- <head>
-  
- </head>
- <body>
-  <p>
-    I don't know what you are talking about.  What about " node "?
-  </p>
-  <hr width=\"75%\">
-  <hype>
- </body>
-</html>
-")))))))
-
-(provide 'w3-about)
diff --git a/lisp/w3-annotat.el b/lisp/w3-annotat.el
deleted file mode 100644
index af72358..0000000
--- a/lisp/w3-annotat.el
+++ /dev/null
@@ -1,275 +0,0 @@
-;;; w3-annotat.el --- Annotation functions for Emacs-W3
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:12 $
-;; Version: $Revision: 1.1 $
-;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Private annotation support
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun w3-parse-personal-annotations ()
-  ;; Read in personal annotation file
-  (if (and
-       (file-exists-p (format "%s/LOG" w3-personal-annotation-directory))
-       (file-readable-p (format "%s/LOG" w3-personal-annotation-directory)))
-      (save-excursion
-       (setq w3-personal-annotations nil);; nuke the old list
-       (let ((start nil)
-             (end nil)
-             (txt nil)
-             (url nil)
-             (num nil))
-         (set-buffer (get-buffer-create " *panno*"))
-         (erase-buffer)
-         (insert-file-contents-literally
-          (format "%s/LOG" w3-personal-annotation-directory))
-         (goto-char (point-min))
-         (w3-replace-regexp "\n+" "\n")
-         (goto-char (point-min))
-         ;; nuke the header lines
-         (delete-region (point-min) (progn (forward-line 2) (point)))
-         (cond
-          ((eobp) nil)                 ; Empty LOG file
-          (t
-           (if (/= (char-after (1- (point-max))) ?\n)
-               (save-excursion
-                 (goto-char (point-max))
-                 (insert "\n")))
-           (while (not (eobp))
-             (setq start (point)
-                   end (prog2 (end-of-line) (point) (forward-char 1))
-                   txt (buffer-substring start end)
-                   url (substring txt 0 (string-match " " txt))
-                   num (url-split
-                        (substring txt (1+ (string-match " " txt)) nil)
-                        "[ \t]"))
-             (while num
-               (setq w3-personal-annotations
-                     (cons
-                      (list url
-                            (list (car (car num))
-                                  (w3-grok-annotation-format
-                                   (car (car num)))))
-                      w3-personal-annotations)
-                     num (cdr num))))))
-         (kill-buffer " *panno*")))))
-
-(defun w3-grok-annotation-format (anno)
-  ;; Grab the title from an annotation
-  (let ((fname  (format "%s/PAN-%s.html"
-                       w3-personal-annotation-directory anno)))
-    (save-excursion
-      (set-buffer (get-buffer-create " *annotmp*"))
-      (erase-buffer)
-      (if (file-exists-p fname)
-         (insert-file-contents-literally fname))
-      (goto-char (point-min))
-      (prog1
-         (if (re-search-forward "<title>\\(.*\\)</title>" nil t)
-             (buffer-substring (match-beginning 1) (match-end 1))
-           (concat "Annotation on "
-                   (current-time-string (nth 5 (file-attributes fname)))))
-       (kill-buffer " *annotmp*")))))
-
-(defun w3-is-personal-annotation (url)
-  ;; Is URL a personal annotation?
-  (string-match "file:/.*/PAN-.*\\.html" url))
-
-(defun w3-delete-personal-annotation-internal (url num)
-  (save-excursion
-    (set-buffer (get-buffer-create " *annotmp*"))
-    (erase-buffer)
-    (insert-file-contents-literally (format "%s/LOG"
-                                           w3-personal-annotation-directory))
-    (replace-regexp (format "[ \t]+\\b%s\\b[ \t]*" num) " ")
-    (goto-char (point-min))
-    (delete-matching-lines (format "^%s +$" url))
-    (let ((make-backup-files nil)
-         (version-control nil)
-         (require-final-newline t))
-      (write-region (point-min) (point-max)
-                   (format "%s/LOG"
-                           w3-personal-annotation-directory)))
-    (kill-buffer " *annotmp*")
-    (let ((anno w3-personal-annotations))
-      (setq w3-personal-annotations nil)
-      (while anno
-       (if (not (string= num (car (car (cdr (car anno))))))
-           (setq w3-personal-annotations
-                 (cons (car anno) w3-personal-annotations)))
-       (setq anno (cdr anno)))
-      (delete-file (format "%s/PAN-%s.html"
-                          w3-personal-annotation-directory num)))))
-
-(defun w3-delete-personal-annotation ()
-  "Delete a personal annotation."
-  (interactive)
-  (let ((url (url-view-url t)))
-    (cond
-     ((w3-is-personal-annotation (url-view-url t))
-      (let ((num nil)
-           (annotated-url nil)
-           (anno w3-personal-annotations))
-       (string-match "file:/.*/PAN-\\(.*\\)\\.html" url)
-       (setq num (match-string 1 url))
-       (while anno
-         (if (equal num (car (car (cdr (car anno)))))
-             (setq annotated-url (car (car anno))))
-         (setq anno (cdr anno)))
-       (if (not annotated-url)
-           (message "Couldn't find url that this is annotating!")
-         (w3-delete-personal-annotation-internal annotated-url num)
-         (w3-quit))))
-     (t
-      (let* ((tmp w3-personal-annotations)
-            (thelist nil)
-            (node nil)
-            (todel nil))
-       (if (not (assoc url tmp))
-           (message "No personal annotations.")
-         (while tmp
-           (setq node (car tmp))
-           (if (string= (car node) url)
-               (setq thelist (cons (cons (nth 1 (nth 1 node)) "") thelist)))
-           (setq tmp (cdr tmp)))
-         (setq todel (completing-read "Delete annotation: " thelist nil t))
-         ;; WORK ;;
-         (message "I should delete %s, but can't." todel)))))))
-
-(defun w3-personal-annotation-add ()
-  "Add an annotation to this document."
-  (interactive)
-  (let ((url (url-view-url t))
-       (buf (get-buffer-create "*Personal Annotation*"))
-       (title (read-string "Title: "
-                           (format "Annotation by %s on %s"
-                                   (user-real-login-name)
-                                   (current-time-string)))))
-    (set-buffer buf)
-    (switch-to-buffer buf)
-    (erase-buffer)
-    (if (and w3-annotation-mode (fboundp w3-annotation-mode))
-       (funcall w3-annotation-mode)
-      (message "%S is undefined, using %s" w3-annotation-mode
-              default-major-mode)
-      (funcall default-major-mode))
-    (w3-annotation-minor-mode 1)
-    (setq w3-current-annotation (cons url title))
-    (insert "<html>\n"
-           " <head>\n"
-           "  <title>" (url-insert-entities-in-string title) "</title>"
-           " </head>\n"
-           "  <h1>" (url-insert-entities-in-string title) "</h1>\n"
-           "  <p>\n"
-           "   <address>" (url-insert-entities-in-string (user-full-name))
-            (if (stringp url-personal-mail-address)
-                (concat " &lt;" (url-insert-entities-in-string
-                             url-personal-mail-address) "&gt;")
-              "")
-           "</address>\n"
-           "   <address>" (current-time-string) "</address>\n"
-           "  </p>\n"
-           "  <pre>\n")
-    (save-excursion
-      (insert "\n\n\n  </pre>\n"
-             "</html>"))
-    (message "Hit C-cC-c to send this annotation.")))
-
-(defun w3-annotation-minor-mode (&optional arg)
-  "Minimal minor mode for entering annotations.  Just rebinds C-cC-c to
-finish the annotation."
-  (interactive "P")
-  (cond
-   ((null arg) (setq w3-annotation-minor-mode (not w3-annotation-minor-mode)))
-   ((= 0 arg)  (setq w3-annotation-minor-mode nil))
-   (t          (setq w3-annotation-minor-mode t)))
-  )
-
-(defun w3-annotation-find-highest-number ()
-  ;; Find the highest annotation number in this buffer
-  (let (x)
-    (goto-char (point-min))
-    (while (re-search-forward "[^ \t\n]*[ \t]\\(.*\\)" nil t)
-      (setq x (nconc (mapcar (function (lambda (x) (string-to-int (car x))))
-                            (url-split (buffer-substring (match-beginning 1)
-                                                        (match-end 1))
-                                      "[ \t]")) x)))
-    (if (not x) (setq x '(0)))
-    (1+ (car (sort x '>)))))
-
-(defun w3-personal-annotation-finish ()
-  "Finish doing a personal annotation."
-  (interactive)
-  (if (or (not w3-personal-annotation-directory)
-         (not (file-exists-p w3-personal-annotation-directory))
-         (not (file-directory-p w3-personal-annotation-directory)))
-      (error "No personal annotation directory!")
-    (let ((url (car w3-current-annotation))
-         (txt (buffer-string))
-         (title (cdr w3-current-annotation))
-         (fname nil)
-         (num nil))
-      (save-excursion
-       (not-modified)
-       (kill-buffer (current-buffer))
-       (set-buffer (get-buffer-create " *annotmp*"))
-       (erase-buffer)
-       (if (file-exists-p              ; Insert current LOG file if
-                                       ; it exists.
-            (format "%s/LOG" w3-personal-annotation-directory))
-           (insert-file-contents-literally
-            (format "%s/LOG" w3-personal-annotation-directory))
-         (progn                        ; Otherwise, create a file
-           (goto-char (point-min))     ; that conforms to first
-                                       ; annotation format from NCSA
-           (insert "ncsa-mosaic-personal-annotation-log-format-1\n")
-           (insert "Personal\n")))
-       (goto-char (point-min))
-       (setq num (int-to-string (w3-annotation-find-highest-number))
-             fname (format "%s/PAN-%s.html"
-                           w3-personal-annotation-directory num))
-       (goto-char (point-min))
-       (if (re-search-forward (regexp-quote url) nil t)
-           (progn
-             (end-of-line)
-             (insert " "))
-         (goto-char (point-max))
-         (insert "\n" url " "))
-       (insert num)
-       (let ((make-backup-files nil)
-             (version-control nil)
-             (require-final-newline t))
-         (write-region (point-min) (point-max)
-                       (format "%s/LOG" w3-personal-annotation-directory))
-         (erase-buffer)
-         (insert w3-annotation-marker txt)
-         (write-region (point-min) (point-max) fname))
-       (setq w3-personal-annotations
-             (cons (list url (list num title)) w3-personal-annotations))))))
-
-(defun w3-annotation-add ()
-  "Add an annotation to the current document."
-  (interactive)
-  (w3-personal-annotation-add))
diff --git a/lisp/w3-book.el b/lisp/w3-book.el
deleted file mode 100644
index cefe22c..0000000
--- a/lisp/w3-book.el
+++ /dev/null
@@ -1,160 +0,0 @@
-;;; w3-book.el --- Bookmark abstraction
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:10 $
-;; Version: $Revision: 1.1 $
-;; Keywords: menu, hypermedia
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1997, 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(require 'cl)
-
-(defstruct bookmark
-  location                             ; The URL
-  label                                        ; short description
-  description                          ; A longer description
-  added                                        ; Date added
-  visited                              ; Date last visited
-  annotations                          ; Any annotations
-  children                             ; Subnodes
-  ;; These are really only relevant to HTTP requests
-  method                               ; What HTTP method was used
-  headers                              ; Extra HTTP headers
-  data                                 ; Any extra data sent in the request
-  )
-
-(defun w3-bookmark-to-menu (bookmark)
-  (if (bookmark-children bookmark)
-      (cons (or (bookmark-label bookmark) "...")
-           (mapcar 'w3-bookmark-to-menu (bookmark-children bookmark)))
-    (vector (or (bookmark-label bookmark)
-               (bookmark-location bookmark))
-           (list 'w3-bookmark-fetch bookmark)
-           (bookmark-location bookmark))))
-
-(defun w3-bookmark-fetch (bookmark)
-  (interactive)
-  (let ((url-request-method (bookmark-method bookmark))
-       (url-request-data (bookmark-data bookmark))
-       (url-request-extra-headers (bookmark-headers bookmark)))
-    (w3-fetch (bookmark-location bookmark))))
-
-(defun w3-bookmark-delete (bookmark)
-  (interactive)
-  )
-
-(defun w3-bookmark-add ()
-  (interactive)
-  )
-
-(defun w3-bookmark-browse ()
-  (interactive)
-  )
-
-
-;; HTML Bookmarks
-(defun w3-bookmark-flatten-list (list)
-  (cond
-   ((atom list) (list list))
-   ((and (cdr list) (atom (cdr list))) (list list))
-   (t (apply 'append (mapcar 'w3-bookmark-flatten-list list)))))
-
-(defun w3-bookmark-html-strip-strings (tree)
-  (setq tree (w3-bookmark-flatten-list tree))
-  (w3-normalize-spaces
-   (mapconcat (function (lambda (n) (if (stringp n) n ""))) tree "")))
-
-(defmacro w3-bookmark-html-handle-content (node)
-  (`
-   (progn
-     (push content stack)
-     (setq content (nth 2 (, node))))))
-
-(defmacro w3-bookmark-html-handle-empty-tag ()
-  (`
-   (progn
-     (push content stack)
-     (setq content nil))))
-
-(defun w3-bookmark-read-html-internal (tree)
-  (let (tag attr node content stack last bkmrk bkmrk-stack tag-stack)
-    (setq stack (list tree))
-    (while stack
-      (setq content (pop stack))
-      (case (pop tag-stack)
-       ((dl ol ul dir menu)
-        (debug)
-        (pop bkmrk-stack)))
-      (while content
-       (setq node (pop content))
-       (if (not (stringp node))
-           (setq tag (nth 0 node)
-                 attr (nth 1 node))
-         (setq tag '%text))
-       (push tag tag-stack)
-       (case tag
-         (%text
-          (w3-bookmark-html-handle-empty-tag))
-         (title
-          (setq bkmrk (make-bookmark :location nil
-                                     :label (w3-bookmark-html-strip-strings
-                                             (nth 2 node))))
-          (w3-bookmark-html-handle-empty-tag))
-         (a                            ; Marks a link
-          (let ((n (make-bookmark :location (cdr-safe (assq 'href attr))
-                                  :label (or (cdr-safe (assq 'title attr))
-                                             (w3-bookmark-html-strip-strings
-                                              (nth 2 node)))
-                                  :added (cdr-safe (assq 'add_date attr))
-                                  :visited (cdr-safe (assq 'last_visit 
attr)))))
-            (if bkmrk-stack
-                (push n (bookmark-children (car bkmrk-stack)))
-              (push n (bookmark-children bkmrk))))
-          (w3-bookmark-html-handle-empty-tag))
-         ((dl ol ul dir menu)          ; Marks a parent node
-          (push (make-bookmark :location nil
-                               :label "submenu") bkmrk-stack)
-          (push (car bkmrk-stack) (bookmark-children bkmrk))
-          (w3-bookmark-html-handle-content node))
-         ((li dt)                      ; Marks a description block
-          (w3-bookmark-html-handle-content node))
-         (otherwise
-          (w3-bookmark-html-handle-content node)))))
-    bkmrk))
-
-(defun w3-bookmark-read-html (url)
-  "Import an HTML file into the Emacs-w3 format."
-  (interactive "fBookmark file: ")
-  (if (not (file-readable-p url))
-      (error "Can not read %s..." url))
-  (save-excursion
-    (set-buffer (get-buffer-create " *bookmark-work*"))
-    (erase-buffer)
-    (insert-file-contents url)
-    (let* ((w3-debug-html nil)
-          (bkmarks nil)
-          (parse (w3-parse-buffer (current-buffer))))
-      (setq bkmarks (w3-bookmark-read-html-internal parse)
-           w3-html-bookmarks (w3-bookmark-to-menu bkmarks)))))
-
-(defun w3-bookmark-write-html (fname)
-  )
-
-(provide 'w3-book)
diff --git a/lisp/w3-cus.el b/lisp/w3-cus.el
index f93db20..08100b5 100644
--- a/lisp/w3-cus.el
+++ b/lisp/w3-cus.el
@@ -1,7 +1,7 @@
 ;;; w3-cus.el --- Customization support for Emacs-W3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/14 01:37:15 $
-;; Version: $Revision: 1.4 $
+;; Created: $Date: 1999/12/05 08:36:02 $
+;; Version: $Revision: 1.5 $
 ;; Keywords: comm, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -25,17 +25,6 @@
 ;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 ;;; Boston, MA 02111-1307, USA.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(eval-and-compile
-  (condition-case ()
-      (require 'custom)
-    (error nil))
-  (if (and (featurep 'custom) (fboundp 'custom-declare-variable))
-      nil ;; We've got what we needed
-    ;; We have the old custom-library, hack around it!
-    (defmacro defgroup (&rest args)
-      nil)
-    (defmacro defcustom (var value doc &rest args) 
-      (` (defvar (, var) (, value) (, doc))))))
 
 (require 'mule-sysdp)
 
@@ -126,11 +115,6 @@ explicit encodings for URLs."
   :group 'w3-files
   :type 'string)
 
-(defcustom w3-temporary-directory (or (getenv "TMPDIR") "/tmp")
-  "*Where temporary files go."
-  :group 'w3-files
-  :type 'directory)
-
 ;;; Display related variables
 (defcustom w3-display-frames t
   "*Fetch frames - can be:
@@ -264,22 +248,6 @@ argument, the filename of the graphic that is not loaded.
                 (string :tag "Format string")
                 (sexp :tag "Function" :value nil)))
 
-(defcustom w3-icon-directory "http://cs.indiana.edu/elisp/w3/icons/";
-  "*Where to find standard icons.  Must end in a /!"
-  :group 'w3-images
-  :type 'string)
-
-(defcustom w3-icon-format 'gif
-  "*Image format the default icons are expected to be in.
-This is a symbol specifing what file extension to use.
-If nil, then no file extension is used."
-  :group 'w3-images
-  :type '(choice (const :tag "GIF Image" :value gif)
-                (const :tag "XPM Image" :value xpm)
-                (const :tag "XBM Image" :value xbm)
-                (const :tag "Let the server decide" :value nil)
-                (symbol :tag "Other")))
-
 (defcustom w3-delay-image-loads (not (or (featurep 'gif)
                                         (featurep 'jpeg)
                                         (featurep 'imagick)
@@ -289,51 +257,27 @@ If nil, then no file extension is used."
   :type 'boolean)
 
 (defcustom w3-image-mappings
-  (if (featurep 'imagick)
-      '(
-       ("image/x-xbitmap"        . xbm)
-       ("image/xbitmap"          . xbm)
-       ("image/xbm"              . xbm)
-       ("image/jpeg"             . imagick)
-       ("image/gif"              . imagick)
-       ("image/png"              . imagick)
-       ("image/x-fax"            . imagick)
-       ("image/x-raster"         . imagick)
-       ("image/windowdump"       . imagick)
-       ("image/x-icon"           . imagick)
-       ("image/portable-graymap" . imagick)
-       ("image/portable-pixmap"  . imagick)
-       ("image/x-pixmap"         . imagick)
-       ("image/x-xpixmap"        . imagick)
-       ("image/pict"             . imagick)
-       ("image/x-rgb"            . imagick)
-       ("image/x-sgi"            . imagick)
-       ("image/x-macpaint"       . imagick)
-       ("image/x-targa"          . imagick)
-       ("image/tiff"             . imagick)
-       )
-    '(
-      ("image/x-xbitmap"        . xbm)
-      ("image/xbitmap"          . xbm)
-      ("image/xbm"              . xbm)
-      ("image/jpeg"             . jpeg)
-      ("image/gif"              . gif)
-      ("image/png"              . png)
-      ("image/x-fax"            . g3fax)
-      ("image/x-raster"         . rast)
-      ("image/windowdump"       . xwd)
-      ("image/x-icon"           . icon)
-      ("image/portable-graymap" . pgm)
-      ("image/portable-pixmap"  . ppm)
-      ("image/x-pixmap"         . xpm)
-      ("image/x-xpixmap"        . xpm)
-      ("image/pict"             . pict)
-      ("image/x-rgb"            . sgi)
-      ("image/x-sgi"            . sgi)
-      ("image/x-macpaint"       . macpt)
-      ("image/x-targa"          . tga)
-      ("image/tiff"             . tiff)
-      )
+  '(
+    ("image/x-xbitmap"        . xbm)
+    ("image/xbitmap"          . xbm)
+    ("image/xbm"              . xbm)
+    ("image/jpeg"             . jpeg)
+    ("image/gif"              . gif)
+    ("image/png"              . png)
+    ("image/x-fax"            . g3fax)
+    ("image/x-raster"         . rast)
+    ("image/windowdump"       . xwd)
+    ("image/x-icon"           . icon)
+    ("image/portable-graymap" . pgm)
+    ("image/portable-pixmap"  . ppm)
+    ("image/x-pixmap"         . xpm)
+    ("image/x-xpixmap"        . xpm)
+    ("image/pict"             . pict)
+    ("image/x-rgb"            . sgi)
+    ("image/x-sgi"            . sgi)
+    ("image/x-macpaint"       . macpt)
+    ("image/x-targa"          . tga)
+    ("image/tiff"             . tiff)
     )
   "*How to map MIME types to image types for the `image' package.
 Each entry is a cons cell of MIME types and image-type symbols."
@@ -342,38 +286,6 @@ Each entry is a cons cell of MIME types and image-type 
symbols."
                       (string :tag "MIME Type")
                       (symbol :tag "Image type"))))
 
-;;; Printing variables
-(defcustom w3-latex-docstyle "{article}"
-  "*The documentstyle to use when printing or mailing files as LaTeX.
-Good defaults are: {article}, [psfig,twocolumn]{article}, etc."
-  :group 'w3-printing
-  :type 'string)
-
-(defcustom w3-latex-print-links nil
-  "*If non-nil, prints the URLs of hypertext links as endnotes at the end of
-the document.  If `footnote', prints the URL's as footnotes on a page."
-  :group 'w3-printing
-  :type '(choice (const :tag "As endnotes" :value t)
-                (const :tag "As footnotes" :value footnote)
-                (const :tag "Do not print" :value nil)))
-
-(defcustom w3-latex-use-latex2e nil
-  "*If non-nil, configures LaTeX generator to use LaTeX2e syntax.  A `nil' 
-value indicates that LaTeX 2.0.9 compatibility will be used instead."
-  :group 'w3-printing
-  :type 'boolean)
-
-(defcustom w3-latex-packages nil
-  "*List of LaTeX packages to include when converting HTML to LaTeX.
-Currently this is only used if `w3-latex-use-latex2e' is non-nil."
-  :group 'w3-printing
-  :type '(repeat string))
-
-(defcustom w3-latex-use-maketitle nil
-  "*Non-nil makes the LaTeX parser use real LaTeX title pages."
-  :group 'w3-printing
-  :type 'boolean)
-
 ;;; Menus
 (defcustom w3-max-menu-length 35
   "*The maximum length of a pulldown menu before it will be split into
@@ -404,9 +316,8 @@ of the menu."
   :group 'w3-advanced
   :type 'sexp)
 
-(defcustom w3-netscape-compatible-comments t
-  "*Whether to honor netscape-style <! > comments.
-Ye gods I wish I could turn this off by default."
+(defcustom w3-netscape-compatible-comments nil
+  "*Whether to honor netscape-style <! > comments."
   :group 'w3-parsing
   :type 'boolean)
 
@@ -448,13 +359,6 @@ A nil value means W3 should not change the binding of 
mouse-3."
   :group 'w3-display
   :type 'boolean)
 
-(defcustom w3-print-command "lpr -h -d"
-  "*Print command for dvi files.
-This is usually 'lpr -h -d' to send it to a postscript printer, but you can set
-it up so that it is any command that takes a dvi file as its last argument."
-  :group 'w3-printing
-  :type 'string)
-
 (defcustom w3-reuse-buffers 'yes
   "What to do when following a link will re-fetch a document that has
 already been fetched into a W3 buffer.  Possible values are: nil,
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index d9a388b..48d0673 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/20 11:37:54 $
-;; Version: $Revision: 1.18 $
+;; Created: $Date: 1999/12/05 08:36:02 $
+;; Version: $Revision: 1.19 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -33,6 +33,7 @@
 (require 'css)
 (require 'font)
 (require 'url-parse)
+(require 'mailcap)
 (require 'w3-widget)
 (require 'w3-imap)
 
@@ -498,7 +499,7 @@ If the face already exists, it is unmodified."
       "Sorry, no cookies today."
     (let* ((href (or (w3-get-attribute 'href) (w3-get-attribute 'src)))
           (fname (or (cdr-safe (assoc href w3-cookie-cache))
-                     (url-generate-unique-filename "%s.cki")))
+                     (mailcap-generate-unique-filename "%s.cki")))
           (st (or (cdr-safe (assq 'start args)) "Loading cookies..."))
           (nd (or (cdr-safe (assq 'end args)) "Loading cookies... done.")))
       (if (not (file-exists-p fname))
@@ -796,12 +797,9 @@ If the face already exists, it is unmodified."
       (message "Skipping image %s" (url-basepath src t))
       (w3-add-delayed-graphic widget))
      (t                                        ; Grab the images
-      (let (
-           (url-request-method "GET")
-           (old-asynch (default-value 'url-be-asynchronous))
+      (let ((url-request-method "GET")
            (url-request-data nil)
            (url-request-extra-headers nil)
-           (url-source t)
            (url-mime-accept-string (substring
                                     (mapconcat
                                      (function
@@ -810,21 +808,11 @@ If the face already exists, it is unmodified."
                                             (concat (car x) ",")
                                           "")))
                                      w3-allowed-image-types "")
-                                    0 -1))
-           (url-working-buffer (generate-new-buffer-name " *W3GRAPH*")))
-       (unwind-protect
-           (progn
-             (setq-default url-be-asynchronous t)
-             (setq w3-graphics-list (cons (cons src (make-glyph))
-                                          w3-graphics-list))
-             (save-excursion
-               (set-buffer (get-buffer-create url-working-buffer))
-               (setq url-current-callback-data (list src (widget-get widget 
'buffer)
-                                                     widget)
-                     url-be-asynchronous t
-                     url-current-callback-func 'w3-finalize-image-download)
-               (url-retrieve src)))
-         (setq-default url-be-asynchronous old-asynch)))))))
+                                    0 -1)))
+       (setq w3-graphics-list (cons (cons src (make-glyph))
+                                    w3-graphics-list))
+       (url-retrieve src 'w3-finalize-image-download
+                     (list src (widget-get widget 'buffer) widget)))))))
 
 (defun w3-maybe-start-background-image-download (src face)
   (let* ((cached-glyph (w3-image-cached-p src))
@@ -844,12 +832,9 @@ If the face already exists, it is unmodified."
       (mesage "Skipping image %s" (url-basepath src t))
       nil)
      (t                                        ; Grab the images
-      (let (
-           (url-request-method "GET")
-           (old-asynch (default-value 'url-be-asynchronous))
+      (let ((url-request-method "GET")
            (url-request-data nil)
            (url-request-extra-headers nil)
-           (url-source t)
            (url-mime-accept-string (substring
                                     (mapconcat
                                      (function
@@ -858,31 +843,23 @@ If the face already exists, it is unmodified."
                                             (concat (car x) ",")
                                           "")))
                                      w3-allowed-image-types "")
-                                    0 -1))
-           (url-working-buffer (generate-new-buffer-name " *W3GRAPH*")))
-       (unwind-protect
-           (progn
-             (setq-default url-be-asynchronous t)
-             (setq w3-graphics-list (cons (cons src (make-glyph))
-                                          w3-graphics-list))
-             (save-excursion
-               (set-buffer (get-buffer-create url-working-buffer))
-               (setq url-current-callback-data (list src buf 'background face)
-                     url-be-asynchronous t
-                     url-current-callback-func 'w3-finalize-image-download)
-               (url-retrieve src)))
-         (setq-default url-be-asynchronous old-asynch)))))))
+                                    0 -1)))
+       (setq w3-graphics-list (cons (cons src (make-glyph))
+                                    w3-graphics-list))
+       (url-retrieve src 'w3-finalize-image-download (list src buf 'background 
face)))))))
 
 (defun w3-finalize-image-download (url buffer &optional widget face)
   (let ((glyph nil)
-       (node nil))
-    (url-uncompress)
+       (node nil)
+       (handle (mm-dissect-buffer t)))
+    (url-mark-buffer-as-dead (current-buffer))
     (message "Enhancing image...")
-    (setq glyph (image-normalize (cdr-safe (assoc url-current-mime-type
-                                                 w3-image-mappings))
-                                (buffer-string)))
+    (with-temp-buffer
+      (mm-insert-part handle)
+      (setq glyph (image-normalize (cdr-safe (assoc (car (mm-handle-type 
handle))
+                                                   w3-image-mappings))
+                                  (buffer-string))))
     (message "Enhancing image... done")
-    (kill-buffer (current-buffer))
     (cond
      ((w3-image-invalid-glyph-p glyph)
       (setq glyph nil)
@@ -2497,6 +2474,7 @@ Format: (((image-alt row column) . offset) ...)")
            (*invisible
             (w3-handle-empty-tag))
            (meta
+            ;; FIXME!!! This is broken for the new URL package.
             (let* ((equiv (cdr-safe (assq 'http-equiv args)))
                    (value (w3-get-attribute 'content))
                    (name  (w3-get-attribute 'name))
@@ -2516,6 +2494,7 @@ Format: (((image-alt row column) . offset) ...)")
                   (url-cookie-handle-set-cookie value))
               ;; Special-case the refresh header
               (if (and equiv (string= (downcase equiv) "refresh"))
+                  ;; FIXME!!!
                   (url-handle-refresh-header value)))
             (w3-handle-empty-tag)
             )
@@ -2802,12 +2781,30 @@ Format: (((image-alt row column) . offset) ...)")
             (w3-frames)
             t))))
 
+(defun w3-buffer-visiting (url)
+  "Return the name of a buffer (if any) that is visiting URL."
+  (setq url (url-normalize-url url))
+  (let ((bufs (buffer-list))
+       (found nil))
+    (while (and bufs (not found))
+      (save-excursion
+       (set-buffer (car bufs))
+       (setq found (if (and
+                        (not (string-match "^ " (buffer-name (car bufs))))
+                        (eq major-mode 'w3-mode)
+                        url-current-object
+                        (equal (url-normalize-url (url-view-url t)) url))
+                       (car bufs) nil)
+             bufs (cdr bufs))))
+    found))
+
 (defun w3-frames (&optional new-frame)
   "Set up and fetch W3 frames. With optional prefix, do so in a new frame."
   (interactive "P")
   (if (not w3-display-frames)
       (let ((w3-display-frames t))
        (w3-refresh-buffer)))
+  ;; FIXME!!!
   (let* ((old-asynch (default-value 'url-be-asynchronous))
         (structure (reverse w3-frameset-structure)))
     (if new-frame
@@ -2879,7 +2876,6 @@ Format: (((image-alt row column) . offset) ...)")
       (cond ((eq (car (car structure)) 'frame)
             (let ((href (nth 2 (car structure)))
                   (name (nth 1 (car structure)))
-                  (url-working-buffer url-default-working-buffer) ; in case 
url-multiple-p is t
                   (w3-notify 'semibully)
                   (next-frame-window (next-window)))
               (pop structure)
@@ -2891,7 +2887,7 @@ Format: (((image-alt row column) . offset) ...)")
                     (t
                      (w3-fetch href)))
               (let ((buf (current-buffer))
-                    (framebuf (url-buffer-visiting href)))
+                    (framebuf (w3-buffer-visiting href)))
                 (cond (framebuf
                        (set-buffer framebuf)
                        (setq w3-frame-name name
diff --git a/lisp/w3-e19.el b/lisp/w3-e19.el
index 3634d19..3a923e7 100644
--- a/lisp/w3-e19.el
+++ b/lisp/w3-e19.el
@@ -1,12 +1,12 @@
 ;;; w3-e19.el --- Emacs 19.xx specific functions for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:10 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/12/05 08:36:03 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: faces, help, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -33,7 +33,6 @@
   (require 'w3-props))
 (require 'w3-forms)
 (require 'font)
-(require 'w3-script)
 
 (defvar w3-e19-window-width nil)
 (make-variable-buffer-local 'w3-e19-window-width)
@@ -80,11 +79,7 @@
         (mouse-events nil))
     (if (not (and good pt (number-or-marker-p pt)))
        nil
-      (widget-echo-help pt)
-      ;; FIXME!!! Need to handle onmouseover, on mouseout
-      (setq mouse-events (w3-script-find-event-handlers pt 'mouse))
-      (if (assq 'onmouseover mouse-events)
-         (w3-script-evaluate-form (cdr (assq 'onmouseover mouse-events)))))))
+      (widget-echo-help pt))))
 
 (defun w3-window-size-change-function (frame)
   (let ((first (frame-first-window frame))
diff --git a/lisp/w3-elisp.el b/lisp/w3-elisp.el
deleted file mode 100644
index c860a83..0000000
--- a/lisp/w3-elisp.el
+++ /dev/null
@@ -1,127 +0,0 @@
-;;; w3-elisp.el --- Scripting support for emacs-lisp
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:10 $
-;; Version: $Revision: 1.1 $
-;; Keywords: hypermedia, scripting
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1997, 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'cl)
-
-(mapcar
- (function
-  (lambda (x)
-    (put x 'w3-safe t)))
- '(;; Any safe functions for untrusted scripts should go here.
-   ;; Basic stuff
-   message
-   format garbage-collect progn prog1 prog2 progn-with-message
-   while current-time current-time-string
-   plist-member plist-to-alist plist-get
-   assoc memq member function lambda point
-
-   ;; Device querying
-   device-pixel-height device-type device-color-cells
-   device-mm-height device-class device-bitplanes
-   device-on-window-system-p device-pixel-width
-   device-mm-width device-baud-rate
-
-   ;; Frame querying
-   frame-type frame-name frame-device frame-parameters
-   frame-height frame-pixel-width frame-pixel-height
-   frame-width frame-property
-
-   ;; Window querying
-   window-frame window-height window-width
-   window-pixel-width window-pixel-height
-
-   ;; Buffer querying
-   buffer-name buffer-substring buffer-substring-no-properties
-   buffer-size buffer-string
-   
-   ;; Text properties, read-only
-   get-text-property text-properties-at text-property-bounds
-   text-property-not-all
-
-   ;; URL loading stuff
-   url-insert-file-contents url-view-url
-
-   ;; Interfacing to W3
-   w3-fetch w3-refresh-buffer w3-view-this-url
-
-   ;; All the XEmacs event manipulation functions
-   event-live-p event-glyph-extent event-glyph-y-pixel event-x-pixel
-   event-type event-glyph event-button event-over-text-area-p
-   event-glyph-x-pixel event-buffer event-device event-properties
-   event-process event-timestamp event-modifier-bits event-console
-   event-window-y-pixel event-window event-window-x-pixel event-point
-   event-function event-over-toolbar-p event-matches-key-specifier-p
-   event-over-glyph-p event-frame event-x event-channel event-y
-   event-screen event-to-character event-over-border-p
-   event-toolbar-button event-closest-point event-object event-key
-   event-modifiers event-y-pixel event-over-modeline-p
-   event-modeline-position
-   )
- )
-
-(defsubst w3-elisp-safe-function (func args)
-  (let ((validator (get func 'w3-safe)))
-    (cond
-     ((eq t validator) t)              ; Explicit allow
-     ((eq nil validator) nil)          ; Explicit deny
-     ((fboundp validator)              ; Function to call
-      (funcall validator func args))
-     ((boundp validator)               ; Variable to check
-      (symbol-value validator))
-     (t nil))))                                ; Fallback to unsafe
-
-(defun w3-elisp-safe-expression (exp)
-  "Return t if-and-only-if EXP is safe to evaluate."
-  (cond
-   ((and (listp exp) (not (listp (cdr exp)))) ; A cons cell
-    t)
-   ((or                                        ; self-quoters
-     (vectorp exp)
-     (numberp exp)
-     (symbolp exp)
-     (stringp exp)
-     (keymapp exp))
-    t)
-   ((listp exp)                                ; Function call - check 
arguments
-    (if (w3-elisp-safe-function (car exp) (cdr exp))
-       (let ((args (cdr exp))
-             (rval t))
-         (while args
-           (if (not (w3-elisp-safe-expression (pop args)))
-               (setq args nil
-                     rval nil)))
-         rval)))
-   ;; How to handle the insane # of native types?
-   (t nil)))
-
-(defun w3-elisp-safe-eval (form)
-  (if (w3-elisp-safe-expression form)
-      (condition-case ()
-         (eval form)
-       (error nil))))
-
-(provide 'w3-elisp)
diff --git a/lisp/w3-emulate.el b/lisp/w3-emulate.el
index 1b78b4c..79b467f 100644
--- a/lisp/w3-emulate.el
+++ b/lisp/w3-emulate.el
@@ -1,12 +1,12 @@
 ;;; w3-emulate.el --- All variable definitions for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:10 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/12/05 08:36:05 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: comm, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -251,18 +251,6 @@
   (interactive)
   (w3-ie-masquerade-mode 0))
 
-(defun w3-arena-masquerade-mode (&optional arg)
-  (interactive "P")
-  (w3-masquerade-stub arg "Arena" "0.9"))
-
-(defun turn-on-arena-masquerade-mode ()
-  (interactive)
-  (w3-arena-masquerade-mode 1))
-
-(defun turn-off-arena-masquerade-mode ()
-  (interactive)
-  (w3-arena-masquerade-mode 0))
-
 ;;
 (provide 'w3-emulate)
 
diff --git a/lisp/w3-forms.el b/lisp/w3-forms.el
index 08a4c03..a9afbdd 100644
--- a/lisp/w3-forms.el
+++ b/lisp/w3-forms.el
@@ -1,7 +1,7 @@
 ;;; w3-forms.el --- Emacs-w3 forms parsing code for new display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/10 15:29:01 $
-;; Version: $Revision: 1.6 $
+;; Created: $Date: 1999/12/05 08:36:05 $
+;; Version: $Revision: 1.7 $
 ;; Keywords: faces, help, comm, data, languages
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -27,7 +27,7 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; FORMS processing for html 2.0/3.0
+;;; FORMS processing for HTML
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (eval-when-compile
   (require 'cl))
@@ -37,6 +37,7 @@
   (require 'w3-mouse)
   (require 'w3-display)
   (require 'url)
+  (require 'url-util)
   (require 'widget)
   (condition-case nil
       (require 'wid-edit)
@@ -898,9 +899,6 @@ This can be used as the :help-echo property of all w3 form 
entry widgets."
           (w3-form-encode-helper result) "\n"))
     query))
 
-(defun w3-form-encode-application/x-gopher-query (result)
-  (concat "\t" (cdr (car (w3-form-encode-helper result)))))
-
 (defun w3-form-encode-xwfu (chunk)
   "Escape characters in a string for application/x-www-form-urlencoded.
 Blasphemous crap because someone didn't think %20 was good enough for encoding
@@ -934,19 +932,6 @@ spaces.  Die Die Die."
        (url-hexify-string query)
       "")))
 
-(defun w3-form-encode-application/gopher-ask-block (result)
-  (let ((query ""))
-    ;;; gopher+ will expect all the checkboxes/etc, even if they are
-    ;;; not turned on.  Should still ignore RADIO boxes that are not
-    ;;; active though.
-  (while result
-    (if (and (not (and (string= (nth 2 (car result)) "RADIO")
-                      (not (nth 6 (car result)))))
-            (not (member (nth 2 (car result)) '("SUBMIT" "RESET"))))
-       (setq query (format "%s\r\n%s" query (nth 5 (car result)))))
-    (setq result (cdr result)))
-  (concat query "\r\n.\r\n")))
-
 (defun w3-submit-form (ident)
   ;; Submit form entry fields matching ACTN as their action identifier.
   (let* ((result (w3-all-widgets ident))
@@ -957,7 +942,7 @@ spaces.  Die Die Die."
         (theurl (cdr (assq 'action ident))))
     (if (and (string= "GET" themeth)
             (string-match "\\([^\\?]*\\)\\?" theurl))
-       (setq theurl (url-match theurl 1)))
+       (setq theurl (match-string 1 theurl)))
     (cond
      ((or (string= "POST" themeth)
          (string= "PUT" themeth))
@@ -972,8 +957,7 @@ spaces.  Die Die Die."
             (cons (cons "Content-type" enctype) url-request-extra-headers)))
        (w3-fetch theurl)))
      ((string= "GET" themeth)
-      (let ((theurl (concat theurl (if (string-match "gopher" enctype)
-                                      "" "?") query)))
+      (let ((theurl (concat theurl "?" query)))
        (w3-fetch theurl)))
      (t
       (w3-warn 'html (format "Unknown submit method: %s" themeth))
diff --git a/lisp/w3-hot.el b/lisp/w3-hot.el
index 7ac83bd..5ab8bc5 100644
--- a/lisp/w3-hot.el
+++ b/lisp/w3-hot.el
@@ -1,7 +1,7 @@
 ;;; w3-hot.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/03/25 05:30:06 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/12/05 08:36:06 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -37,32 +37,14 @@
 ;;; )  ; end of hotlist
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (require 'w3-vars)
+(require 'w3-parse)
+(require 'url-parse)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Hotlist Handling Code
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (defvar w3-html-bookmarks nil)
 
-(defun w3-hotlist-break-shit ()
-  (let ((todo '(w3-hotlist-apropos
-               w3-hotlist-delete
-               w3-hotlist-rename-entry
-               w3-hotlist-append
-               w3-use-hotlist
-               w3-hotlist-add-document
-               w3-hotlist-add-document-at-point
-               ))
-       (cur nil))
-    (while todo
-      (setq cur (car todo)
-           todo (cdr todo))
-      (fset cur
-           (`
-            (lambda (&rest ignore)
-              (interactive)
-              (error "Sorry, `%s' does not work with html bookmarks"
-                     (quote (, cur)))))))))
-
 ;;;###autoload
 (defun w3-read-html-bookmarks (fname)
   "Import an HTML file into the Emacs-w3 format."
@@ -78,33 +60,39 @@
           (parse (w3-parse-buffer (current-buffer))))
       (setq parse w3-last-parse-tree
            bkmarks (nreverse (w3-grok-html-bookmarks parse))
-           w3-html-bookmarks bkmarks)))
-  (w3-hotlist-break-shit))
+           w3-hotlist bkmarks))))
 
 (eval-when-compile
-  (defvar cur-stack nil)
-  (defvar cur-title nil)
-  (defmacro push-new-menu ()
-    '(setq cur-stack (cons (list "") cur-stack)))
-  
-  (defmacro push-new-item (title href)
-    (` (setcar cur-stack (cons (vector (, title) (list 'w3-fetch (, href)) t)
-                              (car cur-stack)))))
-  ;;(` (setcar cur-stack (cons (cons (, title) (, href)) (car cur-stack)))))
+  (defsubst w3-hot-push-new-menu ()
+    (declare (special cur-stack))
+    (setq cur-stack (cons (list "") cur-stack)))
+
+  ;; This stores it in menu format
+  '(defsubst w3-hot-push-new-item (title href)
+    (declare (special cur-stack))
+    (setcar cur-stack (cons (vector title (list 'w3-fetch href) t)
+                           (car cur-stack))))
+
+  ;; This stores it in alist format
+  (defsubst w3-hot-push-new-item (title href)
+    (declare (special cur-stack))
+    (setcar cur-stack (cons (cons title href) (car cur-stack))))
   
-  (defmacro finish-submenu ()
-    '(let ((x (nreverse (car cur-stack)))
-          (y (pop cur-title)))
-       (while (string= y "")
-        (setq y (pop cur-title)))
-       (and x (setcar x y))
-       (setq cur-stack (cdr cur-stack))
-       (if cur-stack
-          (setcar cur-stack (cons x (car cur-stack)))
-        (setq cur-stack (list x)))))
+  (defsubst w3-hot-finish-submenu ()
+    (declare (special cur-stack cur-title))
+    (let ((x (nreverse (car cur-stack)))
+         (y (pop cur-title)))
+      (while (string= y "")
+       (setq y (pop cur-title)))
+      (and x (setcar x y))
+      (setq cur-stack (cdr cur-stack))
+      (if cur-stack
+         (setcar cur-stack (cons x (car cur-stack)))
+       (setq cur-stack (list x)))))
   )
 
 (defun w3-grok-html-bookmarks-internal (tree)
+  (declare (special cur-stack cur-title))
   (let (node tag content args)
     (while tree
       (setq node (car tree)
@@ -119,9 +107,9 @@
        (setq cur-title (list (w3-normalize-spaces (car content))))
        (w3-grok-html-bookmarks-internal content))
        ((memq tag '(dl ol ul))
-       (push-new-menu)
+       (w3-hot-push-new-menu)
        (w3-grok-html-bookmarks-internal content)
-       (finish-submenu))
+       (w3-hot-finish-submenu))
        ((and (memq tag '(dt li p))
             (stringp (car content)))
        (setq cur-title (cons (w3-normalize-spaces (car content))
@@ -129,8 +117,8 @@
        ((and (eq tag 'a)
             (stringp (car-safe content))
             (cdr-safe (assq 'href args)))
-       (push-new-item (w3-normalize-spaces (car-safe content))
-                      (cdr-safe (assq 'href args))))
+       (w3-hot-push-new-item (w3-normalize-spaces (car-safe content))
+                             (cdr-safe (assq 'href args))))
        (content
        (w3-grok-html-bookmarks-internal content))))))
 
@@ -142,129 +130,33 @@
     (w3-grok-html-bookmarks-internal chunk)
     (reverse (car cur-stack))))
 
-;;;###autoload
-(defun w3-hotlist-apropos (regexp)
-  "Show hotlist entries matching REGEXP."
-  (interactive "sW3 Hotlist Apropos (regexp): ")
-  (or w3-setup-done (w3-do-setup))
-  (let ((save-buf (get-buffer "Hotlist")) ; avoid killing this
-       (w3-hotlist
-        (apply
-         'nconc
-         (mapcar
-          (function
-           (lambda (entry)
-             (if (or (string-match regexp (car entry))
-                     (string-match regexp (car (cdr entry))))
-                 (list entry))))
-          w3-hotlist))))
-    (if (not w3-hotlist)
-       (message "No w3-hotlist entries match \"%s\"" regexp)
-      (and save-buf (save-excursion
-                     (set-buffer save-buf)
-                     (rename-buffer (concat "Hotlist during " regexp))))
-      (unwind-protect
-         (let ((w3-reuse-buffers 'no))
-           (w3-show-hotlist)
-           (rename-buffer (concat "Hotlist \"" regexp "\""))
-           (url-set-filename url-current-object (concat "hotlist/" regexp)))
-       (and save-buf (save-excursion
-                       (set-buffer save-buf)
-                       (rename-buffer "Hotlist")))))))
+(defun w3-hot-convert-to-alist-mapper (node)
+  (declare (special prefix alist))
+  (cond
+   ((stringp node)
+    ;; Top-level node... ignore
+    )
+   ((stringp (cdr node))
+    ;; A real hyperlink, push it onto the alist
+    (push (cons (if prefix (concat prefix " / " (car node)) (car node)) (cdr 
node)) alist))
+   (t
+    ;; A submenu, add to prefix and recurse
+    (w3-hot-convert-to-alist-internal
+     (cdr node) (if prefix (concat prefix " / " (car node)) (car node))))))
 
-;;;###autoload
-(defun w3-hotlist-refresh ()
-  "Reload the default hotlist file into memory"
-  (interactive)
-  (if (not w3-setup-done) (w3-do-setup))
-  (w3-parse-hotlist))
+(defun w3-hot-convert-to-alist-internal (l &optional prefix)
+  (mapc 'w3-hot-convert-to-alist-mapper l))
 
+(defun w3-hot-convert-to-alist (l)
+  (let ((alist nil))
+    (w3-hot-convert-to-alist-internal l)
+    alist))
+       
 (defun w3-delete-from-alist (x alist)
   ;; Remove X from ALIST, return new alist
   (if (eq (assoc x alist) (car alist)) (cdr alist)
     (delq (assoc x alist) alist)))
 
-;;;###autoload
-(defun w3-hotlist-delete ()
-  "Deletes a document from your hotlist file"
-  (interactive)
-  (save-excursion
-    (if (not w3-hotlist) (message "No hotlist in memory!")
-      (if (not (file-exists-p w3-hotlist-file))
-         (message "Hotlist file %s does not exist." w3-hotlist-file)
-       (let* ((completion-ignore-case t)
-              (title (car (assoc (completing-read "Delete Document: "
-                                                  w3-hotlist nil t)
-                                 w3-hotlist)))
-              (case-fold-search nil)
-              (buffer (get-buffer-create " *HOTW3*")))
-         (and (string= title "") (error "No document specified."))
-         (set-buffer buffer)
-         (erase-buffer)
-         (insert-file-contents w3-hotlist-file)
-         (goto-char (point-min))
-         (if (re-search-forward (concat "^" (regexp-quote title) "\r*$")
-                                nil t)
-             (let ((make-backup-files nil)
-                   (version-control nil)
-                   (require-final-newline t))
-               (previous-line 1)
-               (beginning-of-line)
-               (delete-region (point) (progn (forward-line 2) (point)))
-               (write-file w3-hotlist-file)
-               (setq w3-hotlist (w3-delete-from-alist title w3-hotlist))
-               (kill-buffer (current-buffer))
-               (w3-hotindex-delete-entry title))
-           (message "%s was not found in %s" title w3-hotlist-file)))))))
-
-;;;###autoload
-(defun w3-hotlist-rename-entry (title)
-  "Rename a hotlist item"
-  (interactive (list (let ((completion-ignore-case t))
-                      (completing-read "Rename entry: " w3-hotlist nil t))))
-  (cond                                        ; Do the error handling first
-   ((string= title "") (error "No document specified!"))
-   ((not w3-hotlist) (error "No hotlist in memory!"))
-   ((not (file-exists-p (expand-file-name w3-hotlist-file)))
-    (error "Hotlist file %s does not exist." w3-hotlist-file))
-   ((not (file-readable-p (expand-file-name w3-hotlist-file)))
-    (error "Hotlist file %s exists, but is unreadable." w3-hotlist-file)))
-  (save-excursion
-    (let ((obj (assoc title w3-hotlist))
-         (used (mapcar 'car w3-hotlist))
-         (buff (get-buffer-create " *HOTW3*"))
-         (new nil)
-         )
-      (while (or (null new) (member new used))
-       (setq new (read-string "New name: ")))
-      (set-buffer buff)
-      (erase-buffer)
-      (insert-file-contents (expand-file-name w3-hotlist-file))
-      (goto-char (point-min))
-      (if (re-search-forward (concat "^" (regexp-quote title) "$") nil t)
-         (let ((make-backup-files nil)
-               (version-control nil)
-               (require-final-newline t))
-           (previous-line 1)
-           (beginning-of-line)
-           (delete-region (point) (progn (forward-line 2) (point)))
-           (insert (format "%s %s\n%s\n" (nth 1 obj) (current-time-string)
-                           new))
-           (setq w3-hotlist (cons (list new (nth 1 obj))
-                                  (w3-delete-from-alist title w3-hotlist)))
-           (write-file w3-hotlist-file)
-           (w3-hotindex-rename-entry title new)
-           (kill-buffer (current-buffer)))
-       (message "%s was not found in %s" title w3-hotlist-file)))))
-
-;;;###autoload
-(defun w3-hotlist-append (fname)
-  "Append a hotlist to the one in memory"
-  (interactive "fAppend hotlist file: ")
-  (let ((x w3-hotlist))
-    (w3-parse-hotlist fname)
-    (setq w3-hotlist (nconc x w3-hotlist))))
-
 (defun w3-hotlist-parse-old-mosaic-format ()
   (let (cur-link cur-alias)
     (while (re-search-forward "^\n" nil t) (replace-match ""))
@@ -318,9 +210,10 @@ visited or interesting items you have found on the World 
Wide Web."
   (if (not w3-setup-done) (w3-do-setup))
   (if (not w3-hotlist) (message "No hotlist in memory!")
     (let* ((completion-ignore-case t)
-          (url (car (cdr (assoc
-                          (completing-read "Goto Document: " w3-hotlist nil t)
-                          w3-hotlist)))))
+          (hot-alist (w3-hot-convert-to-alist w3-hotlist))
+          (url (cdr (assoc
+                     (completing-read "Goto Document: " hot-alist nil t)
+                     hot-alist))))
       (if (string= "" url) (error "No document specified!"))
       (w3-fetch url))))
 
@@ -342,32 +235,32 @@ visited or interesting items you have found on the World 
Wide Web."
 (defun w3-hotlist-add-document (pref-arg &optional the-title the-url)
   "Add this documents url to the hotlist"
   (interactive "P")
-  (save-excursion
-    (let* ((buffer (get-buffer-create " *HOTW3*"))
-          (title (or the-title
-                     (and pref-arg (read-string "Title: "))
-                     (buffer-name)))
-          (make-backup-files nil)
-          (version-control nil)
-          (require-final-newline t)
-          (url (or the-url (url-view-url t))))
-      (if (rassoc (list url) w3-hotlist)
-         (error "That item already in hotlist, use w3-hotlist-rename-entry."))
-      (set-buffer buffer)
-      (erase-buffer)
-      (setq w3-hotlist (cons (list title url) w3-hotlist)
-           url (url-unhex-string url))
-      (if (not (file-exists-p w3-hotlist-file))
-         (progn
-           (message "Creating hotlist file %s" w3-hotlist-file)
-           (insert "ncsa-xmosaic-hotlist-format-1\nDefault\n\n")
-           (backward-char 1))
-       (progn
-         (insert-file-contents w3-hotlist-file)
-         (goto-char (point-max))
-         (backward-char 1)))
-      (insert "\n" url " " (current-time-string) "\n" title)
-      (write-file w3-hotlist-file)
-      (kill-buffer (current-buffer)))))
+  (error "Adding to hotlist not implemented yet."))
+
+;;;###autoload
+(defun w3-hotlist-delete ()
+  "Deletes a document from your hotlist file"
+  (interactive)
+  (error "Deleting from hotlist not implemented yet."))
+
+;;;###autoload
+(defun w3-hotlist-refresh ()
+  "Reload the default hotlist file into memory"
+  (interactive)
+  (w3-do-setup)
+  (w3-parse-hotlist))
+
+;;;###autoload
+(defun w3-hotlist-apropos (regexp)
+  "Show hotlist entries matching REGEXP."
+  (interactive "sW3 Hotlist Apropos (regexp): ")
+  (or w3-setup-done (w3-do-setup))
+  (w3-fetch (concat "hotlist:search?regexp=" (url-hexify-string regexp))))
+
+;;;###autoload
+(defun w3-hotlist-view ()
+  "Show the hotlist."
+  (interactive)
+  (w3-fetch "hotlist:view"))
 
 (provide 'w3-hot)
diff --git a/lisp/w3-imap.el b/lisp/w3-imap.el
index 7856b92..efa6c1f 100644
--- a/lisp/w3-imap.el
+++ b/lisp/w3-imap.el
@@ -1,12 +1,12 @@
 ;;; w3-imap.el --- Imagemap functions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:10 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/12/05 08:36:07 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -27,6 +27,9 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (require 'w3-vars)
+(require 'url)
+(require 'url-handlers)
+
 (eval-and-compile
   (require 'widget))
 
diff --git a/lisp/w3-java.el b/lisp/w3-java.el
index d5b0a2d..b320e6c 100644
--- a/lisp/w3-java.el
+++ b/lisp/w3-java.el
@@ -1,7 +1,7 @@
 ;;; w3-java.el --- Rudimentary java support
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/12 16:30:10 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/12/05 08:36:07 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: hypermedia, scripting
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -24,6 +24,7 @@
 ;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 ;;; Boston, MA 02111-1307, USA.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'mailcap)
 
 (defgroup w3-java nil
   "Emacs/W3 Java Runtime support"
@@ -45,7 +46,7 @@ Java applet."
   :group 'w3-java)
 
 (defun w3-java-run-applet (options params)
-  (let ((file (url-generate-unique-filename "%s-runjava.html")))
+  (let ((file (mailcap-generate-unique-filename "%s-runjava.html")))
     (save-excursion
       (set-buffer (get-buffer-create " *java*"))
       (erase-buffer)
diff --git a/lisp/w3-jscript.el b/lisp/w3-jscript.el
deleted file mode 100644
index 0020f98..0000000
--- a/lisp/w3-jscript.el
+++ /dev/null
@@ -1,30 +0,0 @@
-;;; w3-elisp.el --- Scripting support for javascript
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:10 $
-;; Version: $Revision: 1.1 $
-;; Keywords: hypermedia, scripting
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1997 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;; FIXME!  Well, actually IMPLEMENTME!
-
-(provide 'w3-jscript)
diff --git a/lisp/w3-keymap.el b/lisp/w3-keymap.el
new file mode 100644
index 0000000..969d62b
--- /dev/null
+++ b/lisp/w3-keymap.el
@@ -0,0 +1,119 @@
+;;; w3-keymap.el --- Keybindings for Emacs/W3
+;; Author: $Author: wmperry $
+;; Created: $Date: 1999/12/05 08:36:08 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, help, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;  Keymap definitions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar w3-mode-map (make-sparse-keymap) "Keymap to use in w3-mode.")
+(suppress-keymap w3-mode-map)
+(set-keymap-parent w3-mode-map widget-keymap)
+
+(define-key w3-mode-map "h" (make-sparse-keymap))
+(define-key w3-mode-map "H" (make-sparse-keymap))
+(define-key w3-mode-map "a" (make-sparse-keymap))
+
+(define-key w3-mode-map "ha"       'w3-hotlist-apropos)
+(define-key w3-mode-map "hd"       'w3-hotlist-delete)
+(define-key w3-mode-map "hi"       'w3-hotlist-add-document)
+(define-key w3-mode-map "hv"       'w3-show-hotlist)
+(define-key w3-mode-map "hr"       'w3-hotlist-rename-entry)
+(define-key w3-mode-map "hu"       'w3-use-hotlist)
+(define-key w3-mode-map "hA"       'w3-hotlist-append)
+(define-key w3-mode-map "hI"       'w3-hotlist-add-document-at-point)
+(define-key w3-mode-map "hR"       'w3-hotlist-refresh)
+
+(define-key w3-mode-map "x" (make-sparse-keymap))
+(define-key w3-mode-map "xa" 'w3-hotindex-add-key)
+(define-key w3-mode-map "xd" 'w3-hotindex-rm-key)
+(define-key w3-mode-map "xq" 'w3-hotindex-query)
+
+(define-key w3-mode-map "HF"       'w3-history-forward)
+(define-key w3-mode-map "HB"       'w3-history-backward)
+(define-key w3-mode-map "Hv"       'w3-show-history-list)
+
+(define-key w3-mode-map " "       'w3-scroll-up)
+(define-key w3-mode-map "<"        'beginning-of-buffer)
+(define-key w3-mode-map ">"        'end-of-buffer)
+(define-key w3-mode-map "?"        'w3-help)
+(define-key w3-mode-map "B"        'w3-history-backward)
+(define-key w3-mode-map "D"        'w3-download-url-at-point)
+(define-key w3-mode-map "F"        'w3-history-forward)
+(define-key w3-mode-map "G"        'w3-show-graphics)
+(define-key w3-mode-map "I"        'w3-popup-info)
+(define-key w3-mode-map "K"        'w3-save-this-url)
+;; FIXME!
+;;(define-key w3-mode-map "P"        'w3-print-url-under-point)
+(define-key w3-mode-map "Q"        'w3-leave-buffer)
+(define-key w3-mode-map "R"        'w3-refresh-buffer)
+(define-key w3-mode-map "S"        'w3-source-document-at-point)
+(define-key w3-mode-map "U"        'w3-use-links)
+(define-key w3-mode-map "V"        'w3-view-this-url)
+(define-key w3-mode-map "\C-?"     'scroll-down)
+(define-key w3-mode-map [backspace] 'scroll-down)
+(define-key w3-mode-map "\C-c\C-b" 'w3-show-history-list)
+(define-key w3-mode-map "\C-c\C-v" 'w3-version)
+(define-key w3-mode-map "\C-o"     'w3-fetch)
+(define-key w3-mode-map "\M-M"     'w3-mail-document-under-point)
+(define-key w3-mode-map "\M-m"    'w3-mail-current-document)
+(define-key w3-mode-map "\M-s"    'w3-save-as)
+(define-key w3-mode-map "\M-\r"    'w3-follow-inlined-image)
+(define-key w3-mode-map "b"       'w3-widget-backward)
+(define-key w3-mode-map "c"        'w3-mail-document-author)
+(define-key w3-mode-map "d"        'w3-download-this-url)
+(define-key w3-mode-map "f"       'w3-widget-forward)
+(define-key w3-mode-map "g"        'w3-reload-document)
+(define-key w3-mode-map "i"        'w3-document-information)
+(define-key w3-mode-map "k"        'w3-save-url)
+(define-key w3-mode-map "l"        'w3-goto-last-buffer)
+(define-key w3-mode-map "m"        'w3-complete-link)
+(define-key w3-mode-map "n"        'w3-widget-forward)
+(define-key w3-mode-map "o"       'w3-open-local)
+(define-key w3-mode-map "p"        'w3-print-this-url)
+(define-key w3-mode-map "q"       'w3-quit)
+(define-key w3-mode-map "r"        'w3-reload-document)
+(define-key w3-mode-map "s"        'w3-source-document)
+(define-key w3-mode-map "u"        'w3-leave-buffer)
+(define-key w3-mode-map "v"       'url-view-url)
+(define-key w3-mode-map "w"        'w3-submit-bug)
+
+;; These are duplicated here instead of just inherited from widget-keymap
+;; due to some issues with Emacspeak.  FIXME.
+(define-key w3-mode-map [tab] 'w3-widget-forward)
+(define-key w3-mode-map [(shift tab)] 'w3-widget-backward)
+(define-key w3-mode-map [(meta tab)] 'w3-widget-backward)
+(define-key w3-mode-map [backtab] 'w3-widget-backward)
+
+;; Emulate some netscape stuff by default
+(define-key w3-mode-map [(control alt t)] 'url-list-processes)
+(define-key w3-mode-map [(control meta t)] 'url-list-processes)
+
+;; Have fun with document ordering
+(define-key w3-mode-map [(meta space)] 'w3-next-document)
+(define-key w3-mode-map [(meta delete)] 'w3-prev-document)
+
+(provide 'w3-keymap)
diff --git a/lisp/w3-menu.el b/lisp/w3-menu.el
index 5b792dc..a85fc68 100644
--- a/lisp/w3-menu.el
+++ b/lisp/w3-menu.el
@@ -1,7 +1,7 @@
 ;;; w3-menu.el --- Menu functions for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/11 01:36:11 $
-;; Version: $Revision: 1.4 $
+;; Created: $Date: 1999/12/05 08:36:08 $
+;; Version: $Revision: 1.5 $
 ;; Keywords: menu, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -185,7 +185,7 @@ on that platform."
                                (buffer-substring-no-properties
                                 (widget-get widget :from)
                                 (widget-get widget :to)))))
-                         (list 'url-maybe-relative href) t) menu)))
+                         (` (url-retrieve (url-expand-file-name (, href)))) t) 
menu)))
     (setq menu (w3-menu-breakup menu w3-max-menu-length))
     (easy-menu-define w3-menu-links-menu nil "Emacs/W3 dynamic menu"
                      (or menu (w3-menu-dummy-menu "No links")))
@@ -261,7 +261,6 @@ on that platform."
     "Save As..."
     ["HTML" (w3-save-as "HTML Source") t]
     ["Formatted Text" (w3-save-as "Formatted Text") t]
-    ["LaTeX" (w3-save-as "LaTeX Source") t]
     ["PostScript" (w3-save-as "PostScript") t]
     ["Binary" (w3-save-as "Binary") t]
     )
@@ -271,14 +270,12 @@ on that platform."
     ["PostScript" (w3-print-this-url nil "PostScript") t]
     ["Formatted Text" (w3-print-this-url nil "Formatted Text") t]
     ["HTML Source" (w3-print-this-url nil "HTML Source") t]
-    ["LaTeX'd" (w3-print-this-url nil "LaTeX'd") t]
     )
    (list
     "Mail Document..."
     ["HTML" (w3-mail-current-document nil "HTML Source") t]
     ["Formatted Text" (w3-mail-current-document nil "Formatted Text") t]
     ["PostScript" (w3-mail-current-document nil "PostScript") t]
-    ["LaTeX Source" (w3-mail-current-document nil "LaTeX Source") t]
     )
    (if w3-running-xemacs
        "---:shadowDoubleEtchedIn"
@@ -319,8 +316,7 @@ on that platform."
    ["Load Images" w3-load-delayed-images w3-delayed-images]
    "----"
    ["Refresh" w3-refresh-buffer w3-current-parse]
-   ["Reload" w3-reload-document (and (url-view-url t)
-                                    (not (equal (url-view-url t) "")))]
+   ["Reload" w3-reload-document url-current-object]
    "----"
    ["Show URL" url-view-url t]
    ["Show URL At Point" w3-view-this-url t]
@@ -446,7 +442,8 @@ on that platform."
    "Search"
    ["Yahoo!"    (w3-fetch "http://www.yahoo.com/";) t]
    ["Excite"    (w3-fetch "http://www.excite.com/";) t]
-   ["AltaVista" (w3-fetch "http://www.altavista.digital.com/";) t]
+   ["AltaVista" (w3-fetch "http://www.altavista.com/";) t]
+   ["Google"    (w3-fetch "http://www.google.com/";) t]
    ["FTP Search" (w3-fetch "http://ftpsearch.ntnu.no/home.html";) t]
    "---"
    )
@@ -624,7 +621,8 @@ on that platform."
       (lookup-key w3-mode-menu-map [rootmenu])))))
 
 (defun w3-menu-install-menus ()
-  (cond ((= emacs-minor-version 28)    ; Hey, get with the times people!!
+  (cond ((and (= emacs-major-version 19)
+             (= emacs-minor-version 28)) ; Hey, get with the times people!!
         nil)
        ((consp w3-use-menus)
         (w3-menu-install-menubar))
diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index 2339255..9bffd54 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -58,6 +58,8 @@
 ;; will not complain, these variables are defined with defvar.
 
 (require 'w3-vars)
+(require 'url-parse)
+(require 'url-history)
 (require 'mule-sysdp)
 
 (eval-when-compile
@@ -267,43 +269,6 @@ which must be a string to use as the error message."
                        (cdr (car html-entities)))))
     (setq html-entities (cdr html-entities))))
 
-;; These are handled differently than the normal HTML entities because
-;; we need to define the entities with 'nil instead of 'CDATA so
-;; that they are correctly scanned for new markup.
-;;
-;; from address@hidden
-;;
-;;> Of course, this differs from the specification a bit.  The W3C tech
-;;> report defines all of these as SYSTEM entities.  This potentially means
-;;> that they can be used in more contexts.  The method I outlined above
-;;> means "&smiley;" can only be used in contexts where IMG is a valid
-;;> element.  I am not sure exactly where it is okay to use a SYSTEM entity.
-;;> I think anywhere that data characters are accepted.
-;;
-;; I find this acceptable, as just what the hell are you supposed to do with
-;; &computer; as part of a value of a form input when you display it and/or
-;; submit it?!
-
-;; The HTML graphics entities code is going away - nobody uses it, and
-;; I cannot even find references to it on the w3c site.  I am leaving
-;; this code in as an example of how to make the html entity expansion
-;; stuff work a little differently.
-;; WMP 4/4/1999
-
-;;(let ((html-entities w3-graphic-entities)
-;;      (cur nil))
-;;  (while html-entities
-;;    (setq cur (car html-entities)
-;;          html-entities (cdr html-entities))
-;;    (put (nth 0 cur) 'html-entity-expansion
-;;      (cons 'nil (format "<img src=\"%s/%s%s\" alt=\"%s\">"
-;;                            w3-icon-directory
-;;                            (nth 1 cur)
-;;                            (if w3-icon-format
-;;                                (concat "." (symbol-name w3-icon-format))
-;;                              "")
-;;                            (or (nth 3 cur) (nth 2 cur)))))))
-
 ;; These are the general entities in HTML 3.0 in terms of which the math
 ;; shortrefs are defined:
 ;; 
@@ -1984,506 +1949,508 @@ skip-chars-forward."
 ;; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 (defun w3-parse-buffer (&optional buff)
   "Parse contents of BUFF as HTML.
-BUFF defaults to the value of url-working-buffer.
+BUFF defaults to the current buffer.
 Destructively alters contents of BUFF.
 Returns a data structure containing the parsed information."
   (if (not w3-setup-done) (w3-do-setup))
-  (set-buffer (or buff url-working-buffer))
-  (setq buff (current-buffer))
-  (let ((old-syntax-table (syntax-table)))
-    (set-syntax-table w3-sgml-md-syntax-table)
-    (buffer-disable-undo (current-buffer))
-    (widen)                             ; sanity checking
-    (goto-char (point-max))
-    (insert "\n")
-    (goto-char (point-min))
-    (setq case-fold-search t)           ; allows smaller regexp patterns
-
-    (run-hooks 'w3-parse-hooks);
-
-    (goto-char (point-min))
+  (save-excursion
+    (if buff
+        (set-buffer buff)
+      (setq buff (current-buffer)))
+    (let ((old-syntax-table (syntax-table)))
+      (set-syntax-table w3-sgml-md-syntax-table)
+      (buffer-disable-undo (current-buffer))
+      (widen)                           ; sanity checking
+      (goto-char (point-max))
+      (insert "\n")
+      (goto-char (point-min))
+      (setq case-fold-search t)         ; allows smaller regexp patterns
+
+      (run-hooks 'w3-parse-hooks)       ;
+
+      (goto-char (point-min))
   
-    ;; *** Should premunge line boundaries.
-    ;; ********************
+      ;; *** Should premunge line boundaries.
+      ;; ********************
   
-    (let* (
-           ;; Speed hack, see the variable doc string.
-           (gc-cons-threshold (if (> w3-gc-cons-threshold-multiplier 0)
-                                  (* w3-gc-cons-threshold-multiplier
-                                     gc-cons-threshold)
-                                gc-cons-threshold))
-
-           ;; Used to determine if we made any progress since the last loop.
-           (last-loop-start (point-min))
+      (let* (
+             ;; Speed hack, see the variable doc string.
+             (gc-cons-threshold (if (> w3-gc-cons-threshold-multiplier 0)
+                                    (* w3-gc-cons-threshold-multiplier
+                                       gc-cons-threshold)
+                                  gc-cons-threshold))
+
+             ;; Used to determine if we made any progress since the last loop.
+             (last-loop-start (point-min))
         
-           ;; How many iterations of the main loop have occurred.  Used only
-           ;; to send messages to the user periodically, since this function
-           ;; can take some time.
-           (loop-count 0)
-
-           ;; Precomputing the loop-invariant parts of this for speed.
-           (status-message-format
-            (if url-show-status
-                (format "Parsed %%3d%%%% of %d..." (- (point-max) 
(point-min)))))
+             ;; How many iterations of the main loop have occurred.  Used only
+             ;; to send messages to the user periodically, since this function
+             ;; can take some time.
+             (loop-count 0)
+
+             ;; Precomputing the loop-invariant parts of this for speed.
+             (status-message-format
+              (if url-show-status
+                  (format "Parsed %%3d%%%% of %d..." (- (point-max) 
(point-min)))))
          
-           ;; Use a float value for 100 if possible, otherwise integer.
-           ;; Determine which we can use outside of the loop for speed.
-           (one-hundred (funcall (if (fboundp 'float) 'float 'identity) 100))
+             ;; Use a float value for 100 if possible, otherwise integer.
+             ;; Determine which we can use outside of the loop for speed.
+             (one-hundred (funcall (if (fboundp 'float) 'float 'identity) 100))
          
-           ;; The buffer which contains the HTML we are parsing.  This
-           ;; variable is used to avoid using the more expensive
-           ;; save-excursion.
-           (parse-buffer (current-buffer))
+             ;; The buffer which contains the HTML we are parsing.  This
+             ;; variable is used to avoid using the more expensive
+             ;; save-excursion.
+             (parse-buffer (current-buffer))
          
-           ;; Points to start of region of text since the previous tag.
-           (between-tags-start (point-min))
+             ;; Points to start of region of text since the previous tag.
+             (between-tags-start (point-min))
          
-           ;; Points past end of region of text since the previous tag.  Only
-           ;; non-nil when the region has been completely determined and is
-           ;; ready to be processed.
-           between-tags-end
+             ;; Points past end of region of text since the previous tag.  Only
+             ;; non-nil when the region has been completely determined and is
+             ;; ready to be processed.
+             between-tags-end
          
-           ;; See doc string.
-           w3-p-d-tag-name
+             ;; See doc string.
+             w3-p-d-tag-name
          
-           ;; See doc string.
-           w3-p-d-end-tag-p
+             ;; See doc string.
+             w3-p-d-end-tag-p
          
-           ;; Is the tag we are looking at a null-end-tag-enabling
-           ;; start-tag?
-           net-tag-p
+             ;; Is the tag we are looking at a null-end-tag-enabling
+             ;; start-tag?
+             net-tag-p
          
-           ;; Attributes of the tag we are looking at.  An alist whose items
-           ;; are pairs of the form (SYMBOL . STRING).
-           tag-attributes
+             ;; Attributes of the tag we are looking at.  An alist whose items
+             ;; are pairs of the form (SYMBOL . STRING).
+             tag-attributes
          
-           ;; Points past end of attribute value we are looking at.  Points
-           ;; past the syntactic construct, not the value of the attribute,
-           ;; which may be at (1- attribute-value-end).
-           attribute-value-end
+             ;; Points past end of attribute value we are looking at.  Points
+             ;; past the syntactic construct, not the value of the attribute,
+             ;; which may be at (1- attribute-value-end).
+             attribute-value-end
          
-           ;; Points past end of tag we are looking at.
-           tag-end
+             ;; Points past end of tag we are looking at.
+             tag-end
          
-           ;; See doc string.
-           (w3-p-d-current-element (w3-fresh-element-for-tag '*document))
+             ;; See doc string.
+             (w3-p-d-current-element (w3-fresh-element-for-tag '*document))
          
-           ;; See doc string.
-           (w3-p-d-open-element-stack (list (w3-fresh-element-for-tag 
'*holder)))
+             ;; See doc string.
+             (w3-p-d-open-element-stack (list (w3-fresh-element-for-tag 
'*holder)))
          
-           ;; ***not implemented yet***
-           (marked-section-undo-stack nil)
+             ;; ***not implemented yet***
+             (marked-section-undo-stack nil)
          
-           ;; See doc string.
-           (w3-p-d-debug-url t)
+             ;; See doc string.
+             (w3-p-d-debug-url t)
          
-           ;; Any of the following variables with the comment ";*NESTED*"
-           ;; are syntactic or semantic features that were introduced by
-           ;; some containing element or marked section which will be undone
-           ;; when we close that element or marked section.
+             ;; Any of the following variables with the comment ";*NESTED*"
+             ;; are syntactic or semantic features that were introduced by
+             ;; some containing element or marked section which will be undone
+             ;; when we close that element or marked section.
          
-           ;; See doc string.
-           (w3-p-d-non-markup-chars nil) ;*NESTED*
+             ;; See doc string.
+             (w3-p-d-non-markup-chars nil) ;*NESTED*
          
-           ;; See doc string.
-           (w3-p-d-null-end-tag-enabled nil) ;*NESTED*
+             ;; See doc string.
+             (w3-p-d-null-end-tag-enabled nil) ;*NESTED*
          
-           ;; See doc string.
-           (w3-p-d-in-parsed-marked-section nil) ;*NESTED*
+             ;; See doc string.
+             (w3-p-d-in-parsed-marked-section nil) ;*NESTED*
          
-           ;; See doc string.
-           (w3-p-d-shortrefs nil)       ;*NESTED*
+             ;; See doc string.
+             (w3-p-d-shortrefs nil)     ;*NESTED*
          
-           ;; See doc string.
-           (w3-p-d-shortref-chars nil)  ;*NESTED*
+             ;; See doc string.
+             (w3-p-d-shortref-chars nil) ;*NESTED*
          
-           ;; ******* maybe not needed.
-           ;; 
-           ;; ;; Are we recognizing start-tags?
-           ;; (recognizing-start-tags t)     ;*NESTED*
-           ;; 
-           ;; ;; Are we recognizing end-tags?  If this is non-nil and not t,
-           ;; ;; then only the end tag of the current open element is
-           ;; ;; recognized.
-           ;; (recognizing-end-tags t)       ;*NESTED*
+             ;; ******* maybe not needed.
+             ;; 
+             ;; ;; Are we recognizing start-tags?
+             ;; (recognizing-start-tags t)     ;*NESTED*
+             ;; 
+             ;; ;; Are we recognizing end-tags?  If this is non-nil and not t,
+             ;; ;; then only the end tag of the current open element is
+             ;; ;; recognized.
+             ;; (recognizing-end-tags t)       ;*NESTED*
          
-           ;; See doc string.
-           (w3-p-d-exceptions nil)      ;*NESTED*
+             ;; See doc string.
+             (w3-p-d-exceptions nil)    ;*NESTED*
          
-           ;; Scratch variables used in this function
-           ref attr-name attr-value content-model content open-list
-           )
-      ;; Scratch variables used by macros and defsubsts we call.
-      (w3-p-s-let-bindings
-       (w3-update-non-markup-chars)
-       (setq w3-p-s-baseobject (url-generic-parse-url (url-view-url t)))
-       ;; Main loop.  Handle markup as follows:
-       ;;
-       ;; non-empty tag: Handle the region since the previous tag as PCDATA,
-       ;; RCDATA, CDATA, if allowed by syntax.  Then handle the tag.
-       ;;
-       ;; general entity (&name;): expand it and parse the result.
-       ;;
-       ;; shortref (_, {, }, and ^ in math stuff): Expand it and parse the
-       ;; result.
-       ;;
-       ;; SGML marked section (<![ keywords [ conditional-text ]]>): Either
-       ;; strip the delimiters and parse the result or delete.
-       ;;
-       ;; comment: Delete.
-       ;;
-       ;; empty tag (<>, </>): Handle as the appropriate tag.
-       ;;
-       ;; markup declaration (e.g. <!DOCTYPE ...>): Delete.
-       ;;
-       ;; SGML processing instruction (<?name>): Delete.
-       ;;
-       (while
-           ;; Continue as long as we processed something last time and we
-           ;; have more to process.
-           (prog1 
-               (not (and (= last-loop-start (point))
-                         (eobp)))
-             (setq last-loop-start (point)))
+             ;; Scratch variables used in this function
+             ref attr-name attr-value content-model content open-list
+             )
+        ;; Scratch variables used by macros and defsubsts we call.
+        (w3-p-s-let-bindings
+         (w3-update-non-markup-chars)
+         (setq w3-p-s-baseobject (copy-sequence url-current-object))
+         ;; Main loop.  Handle markup as follows:
+         ;;
+         ;; non-empty tag: Handle the region since the previous tag as PCDATA,
+         ;; RCDATA, CDATA, if allowed by syntax.  Then handle the tag.
+         ;;
+         ;; general entity (&name;): expand it and parse the result.
+         ;;
+         ;; shortref (_, {, }, and ^ in math stuff): Expand it and parse the
+         ;; result.
+         ;;
+         ;; SGML marked section (<![ keywords [ conditional-text ]]>): Either
+         ;; strip the delimiters and parse the result or delete.
+         ;;
+         ;; comment: Delete.
+         ;;
+         ;; empty tag (<>, </>): Handle as the appropriate tag.
+         ;;
+         ;; markup declaration (e.g. <!DOCTYPE ...>): Delete.
+         ;;
+         ;; SGML processing instruction (<?name>): Delete.
+         ;;
+         (while
+             ;; Continue as long as we processed something last time and we
+             ;; have more to process.
+             (prog1 
+                 (not (and (= last-loop-start (point))
+                           (eobp)))
+               (setq last-loop-start (point)))
       
-         ;; Display progress messages if asked and/or do incremental display
-         ;; of results
-         (cond ((= 0 (% (setq loop-count (1+ loop-count)) 40))
-                (if status-message-format
-                    (progn
-                      (if (fboundp 'progress)
-                          (progress "Parsing %s"
-                                    (truncate (/ (* (point) one-hundred) 
(point-max)))
-                                    (url-pretty-length (point-max))))
-                      (message status-message-format
-                               ;; Percentage of buffer processed.
-                               (/ (* (point) one-hundred) (point-max)))))))
+           ;; Display progress messages if asked and/or do incremental display
+           ;; of results
+           (cond ((= 0 (% (setq loop-count (1+ loop-count)) 40))
+                  (if status-message-format
+                      (progn
+                        (if (fboundp 'progress)
+                            (progress "Parsing %s"
+                                      (truncate (/ (* (point) one-hundred) 
(point-max)))
+                                      (url-pretty-length (point-max))))
+                        (message status-message-format
+                                 ;; Percentage of buffer processed.
+                                 (/ (* (point) one-hundred) (point-max)))))))
       
-         ;; Go to next interesting thing in the buffer.
-         (skip-chars-forward w3-p-d-non-markup-chars)
+           ;; Go to next interesting thing in the buffer.
+           (skip-chars-forward w3-p-d-non-markup-chars)
       
-         ;; We are looking at a markup-starting character, and invalid
-         ;; character, or end of buffer.
-         (cond
+           ;; We are looking at a markup-starting character, and invalid
+           ;; character, or end of buffer.
+           (cond
 
-          ((eq ?< (char-after (point)))
+            ((eq ?< (char-after (point)))
 
-           ;; We are looking at a tag, comment, markup declaration, SGML marked
-           ;; section, SGML processing instruction, or non-markup "<".
-           (forward-char)
-           (cond
+             ;; We are looking at a tag, comment, markup declaration, SGML 
marked
+             ;; section, SGML processing instruction, or non-markup "<".
+             (forward-char)
+             (cond
 
-            ((looking-at "/?\\([a-z][-a-z0-9.]*\\)")
-             ;; We are looking at a non-empty tag.
-
-             ;; Downcase it in the buffer, to save creation of a string
-             (downcase-region (match-beginning 1) (match-end 1))
-             (setq w3-p-d-tag-name
-                   (intern (buffer-substring (match-beginning 1)
-                                             (match-end 1))))
-             (setq w3-p-d-end-tag-p (eq ?/ (char-after (point)))
-                   between-tags-end (1- (point)))
-             (goto-char (match-end 0))
+              ((looking-at "/?\\([a-z][-a-z0-9.]*\\)")
+               ;; We are looking at a non-empty tag.
+
+               ;; Downcase it in the buffer, to save creation of a string
+               (downcase-region (match-beginning 1) (match-end 1))
+               (setq w3-p-d-tag-name
+                     (intern (buffer-substring (match-beginning 1)
+                                               (match-end 1))))
+               (setq w3-p-d-end-tag-p (eq ?/ (char-after (point)))
+                     between-tags-end (1- (point)))
+               (goto-char (match-end 0))
           
-             ;; Read the attributes from a start-tag.
-             (if w3-p-d-end-tag-p
-                 (if (looking-at "[ \t\r\n/]*[<>]")
-                     nil
-                   ;; This is in here to deal with those idiots who stick
-                   ;; attribute/value pairs on end tags.  *sigh*
-                   (w3-debug-html "Evil attributes on end tag.")
-                   (skip-chars-forward "^>"))
+               ;; Read the attributes from a start-tag.
+               (if w3-p-d-end-tag-p
+                   (if (looking-at "[ \t\r\n/]*[<>]")
+                       nil
+                     ;; This is in here to deal with those idiots who stick
+                     ;; attribute/value pairs on end tags.  *sigh*
+                     (w3-debug-html "Evil attributes on end tag.")
+                     (skip-chars-forward "^>"))
            
-               ;; Attribute values can be:
-               ;;   "STRING"   where STRING does not contain the double quote
-               ;;   'STRING'   where STRING does not contain the single quote
-               ;;   name-start character, *name character
-               ;;   *name character
-               ;;   Digit, +name character
-               ;;   +Digit
-               ;; or a SPACE-separated list of one of the last four
-               ;; possibilities (there is a comment somewhere that this is a
-               ;; misinterpretation of the grammar, so we ignore this
-               ;; possibility).
-               (while
-                   (looking-at
-                    (eval-when-compile
-                      (concat
-                       ;; Leading whitespace.
-                       "[ \n\r\t,]*"
-                       ;; The attribute name, possibly with a bad syntax
-                       ;; component.
-                       "\\([a-z_][-a-z0-9.]*\\(\\([_][-a-z0-9._]*\\)?\\)\\)"
-                       ;; Trailing whitespace and perhaps an "=".
-                       "[ \n\r\t]*\\(\\(=[ \n\r\t]*\\)?\\)")))
-               
-                 (cond ((/= (match-beginning 2) (match-end 2))
-                        (w3-debug-html
-                         :nocontext
-                         (format "Bad attribute name syntax: %s"
-                                 (buffer-substring (match-beginning 1)
-                                                   (match-end 1))))))
-
-                 ;; Downcase it in the buffer, to save creation of a string
-                 (downcase-region (match-beginning 1) (match-end 1))
-                 (setq attr-name
-                       (intern (buffer-substring (match-beginning 1)
-                                                 (match-end 1))))
-                 (goto-char (match-end 0))
-                 (cond
-                  ((< (match-beginning 4) (match-end 4))
-                   ;; A value was specified (e.g. ATTRIBUTE=VALUE).
-                   (cond
-                    ((looking-at
+                 ;; Attribute values can be:
+                 ;;   "STRING"   where STRING does not contain the double quote
+                 ;;   'STRING'   where STRING does not contain the single quote
+                 ;;   name-start character, *name character
+                 ;;   *name character
+                 ;;   Digit, +name character
+                 ;;   +Digit
+                 ;; or a SPACE-separated list of one of the last four
+                 ;; possibilities (there is a comment somewhere that this is a
+                 ;; misinterpretation of the grammar, so we ignore this
+                 ;; possibility).
+                 (while
+                     (looking-at
                       (eval-when-compile
                         (concat
-                         ;; Comma separated list of literals with double quotes
-                         ;; (bad HTML).
-                         "\"\\([^\"]*\\(\"[ \n\r\t]*,[ 
\n\r\t]*\"[^\"]*\\)+\\)\""
-                         "\\|"
-                         ;; Comma separated list of literals with single quotes
-                         ;; (bad HTML).
-                         "'\\([^']*\\('[ \n\r\t]*,[ \n\r\t]*'[^']*\\)+\\)'"
-                         "\\|"
-                         ;; Literal with double quotes.
-                         "\"\\([^\"]*\\)\""
-                         "\\|"
-                         ;; Literal with single quotes.
-                         "'\\([^']*\\)'"
-                         "\\|"
-                         ;; Handle bad HTML conflicting with NET-enabling
-                         ;; start-tags.
-                         "\\([^ \t\n\r>]+/[^ \t\n\r>]+\\)[ \t\n\r>]"
-                         "\\|"
-                         ;; SGML NAME-syntax attribute value.
-                         "\\([-a-z0-9.]+\\)[ \t\n\r></]"
-                         )))
+                         ;; Leading whitespace.
+                         "[ \n\r\t,]*"
+                         ;; The attribute name, possibly with a bad syntax
+                         ;; component.
+                         "\\([a-z_][-a-z0-9.]*\\(\\([_][-a-z0-9._]*\\)?\\)\\)"
+                         ;; Trailing whitespace and perhaps an "=".
+                         "[ \n\r\t]*\\(\\(=[ \n\r\t]*\\)?\\)")))
+               
+                   (cond ((/= (match-beginning 2) (match-end 2))
+                          (w3-debug-html
+                           :nocontext
+                           (format "Bad attribute name syntax: %s"
+                                   (buffer-substring (match-beginning 1)
+                                                     (match-end 1))))))
+
+                   ;; Downcase it in the buffer, to save creation of a string
+                   (downcase-region (match-beginning 1) (match-end 1))
+                   (setq attr-name
+                         (intern (buffer-substring (match-beginning 1)
+                                                   (match-end 1))))
+                   (goto-char (match-end 0))
+                   (cond
+                    ((< (match-beginning 4) (match-end 4))
+                     ;; A value was specified (e.g. ATTRIBUTE=VALUE).
                      (cond
-                      ((or (match-beginning 5)
-                           (match-beginning 6)
-                           (match-beginning 1)
-                           (match-beginning 3))
-                       (if (or (match-beginning 1)
-                               (match-beginning 3))
-                           (w3-debug-html
-                            :nocontext
-                            (format "Badly quoted attribute value: %s"
-                                    (match-string 0))))
-                       ;; We have an attribute value literal.
-                       (narrow-to-region (1+ (match-beginning 0))
-                                         (1- (match-end 0)))
-                       ;; Delete (bad) extra quotes from comma separated list.
+                      ((looking-at
+                        (eval-when-compile
+                          (concat
+                           ;; Comma separated list of literals with double 
quotes
+                           ;; (bad HTML).
+                           "\"\\([^\"]*\\(\"[ \n\r\t]*,[ 
\n\r\t]*\"[^\"]*\\)+\\)\""
+                           "\\|"
+                           ;; Comma separated list of literals with single 
quotes
+                           ;; (bad HTML).
+                           "'\\([^']*\\('[ \n\r\t]*,[ \n\r\t]*'[^']*\\)+\\)'"
+                           "\\|"
+                           ;; Literal with double quotes.
+                           "\"\\([^\"]*\\)\""
+                           "\\|"
+                           ;; Literal with single quotes.
+                           "'\\([^']*\\)'"
+                           "\\|"
+                           ;; Handle bad HTML conflicting with NET-enabling
+                           ;; start-tags.
+                           "\\([^ \t\n\r>]+/[^ \t\n\r>]+\\)[ \t\n\r>]"
+                           "\\|"
+                           ;; SGML NAME-syntax attribute value.
+                           "\\([-a-z0-9.]+\\)[ \t\n\r></]"
+                           )))
                        (cond
-                        ((match-beginning 1)
-                         (while (progn (skip-chars-forward "^\"") (not (eobp)))
-                           (delete-char 1))
-                         (goto-char (point-min)))
-                        ((match-beginning 3)
-                         (while (progn (skip-chars-forward "^'") (not (eobp)))
-                           (delete-char 1))
-                         (goto-char (point-min))))
+                        ((or (match-beginning 5)
+                             (match-beginning 6)
+                             (match-beginning 1)
+                             (match-beginning 3))
+                         (if (or (match-beginning 1)
+                                 (match-beginning 3))
+                             (w3-debug-html
+                              :nocontext
+                              (format "Badly quoted attribute value: %s"
+                                      (match-string 0))))
+                         ;; We have an attribute value literal.
+                         (narrow-to-region (1+ (match-beginning 0))
+                                           (1- (match-end 0)))
+                         ;; Delete (bad) extra quotes from comma separated 
list.
+                         (cond
+                          ((match-beginning 1)
+                           (while (progn (skip-chars-forward "^\"") (not 
(eobp)))
+                             (delete-char 1))
+                           (goto-char (point-min)))
+                          ((match-beginning 3)
+                           (while (progn (skip-chars-forward "^'") (not 
(eobp)))
+                             (delete-char 1))
+                           (goto-char (point-min))))
                      
-                       ;; In attribute value literals, EE and RS are ignored
-                       ;; and RE and SEPCHAR characters sequences are
-                       ;; replaced by SPACEs.
-                       ;;
-                       ;; (There is no way right now to get RS into one of
-                       ;; these so that it can be ignored.  This is due to
-                       ;; our using Unix line-handling conventions.)
-                       (skip-chars-forward "^&\t\n\r")
-                       (if (eobp)
-                           nil
-                         ;; We must expand entities and replace RS, RE,
-                         ;; and SEPCHAR.
-                         (goto-char (point-min))
-                         (while (progn
-                                  (skip-chars-forward "^&")
-                                  (not (eobp)))
-                           (w3-expand-entity-at-point-maybe))
-                         (subst-char-in-region (point-min) (point-max) ?\t ? )
-                         (subst-char-in-region (point-min) (point-max) ?\n ? ))
-                       ;; Set this after we have changed the size of the
-                       ;; attribute.
-                       (setq attribute-value-end (1+ (point-max))))
-                      ((match-beginning 8)
-                       (setq attribute-value-end (match-end 8))
-                       (narrow-to-region (point) attribute-value-end))
-                      ((match-beginning 7)
-                       (setq attribute-value-end (match-end 7))
-                       (narrow-to-region (point) attribute-value-end)
-                       ;; Horribly illegal non-SGML handling of bad
-                       ;; HTML on the net.  This can break valid HTML.
-                       (setq attr-value (buffer-substring (point)
-                                                          (match-end 7)))
+                         ;; In attribute value literals, EE and RS are ignored
+                         ;; and RE and SEPCHAR characters sequences are
+                         ;; replaced by SPACEs.
+                         ;;
+                         ;; (There is no way right now to get RS into one of
+                         ;; these so that it can be ignored.  This is due to
+                         ;; our using Unix line-handling conventions.)
+                         (skip-chars-forward "^&\t\n\r")
+                         (if (eobp)
+                             nil
+                           ;; We must expand entities and replace RS, RE,
+                           ;; and SEPCHAR.
+                           (goto-char (point-min))
+                           (while (progn
+                                    (skip-chars-forward "^&")
+                                    (not (eobp)))
+                             (w3-expand-entity-at-point-maybe))
+                           (subst-char-in-region (point-min) (point-max) ?\t ? 
)
+                           (subst-char-in-region (point-min) (point-max) ?\n ? 
))
+                         ;; Set this after we have changed the size of the
+                         ;; attribute.
+                         (setq attribute-value-end (1+ (point-max))))
+                        ((match-beginning 8)
+                         (setq attribute-value-end (match-end 8))
+                         (narrow-to-region (point) attribute-value-end))
+                        ((match-beginning 7)
+                         (setq attribute-value-end (match-end 7))
+                         (narrow-to-region (point) attribute-value-end)
+                         ;; Horribly illegal non-SGML handling of bad
+                         ;; HTML on the net.  This can break valid HTML.
+                         (setq attr-value (buffer-substring (point)
+                                                            (match-end 7)))
+                         (w3-debug-html :nocontext
+                                        (format "Evil attribute value syntax: 
%s"
+                                                (buffer-substring (point-min) 
(point-max)))))
+                        (t
+                         (error "impossible attribute value"))))
+                      ((memq (char-after (point)) '(?\" ?'))
+                       ;; Missing terminating quote character.
+                       (narrow-to-region (point)
+                                         (progn
+                                           (forward-char 1)
+                                           (skip-chars-forward "^ \t\n\r'\"<>")
+                                           (setq attribute-value-end (point))))
                        (w3-debug-html :nocontext
-                                      (format "Evil attribute value syntax: %s"
-                                              (buffer-substring (point-min) 
(point-max)))))
+                                      (format "Attribute value missing end 
quote: %s"
+                                              (buffer-substring (point-min) 
(point-max))))
+                       (narrow-to-region (1+ (point-min)) (point-max)))
                       (t
-                       (error "impossible attribute value"))))
-                    ((memq (char-after (point)) '(?\" ?'))
-                     ;; Missing terminating quote character.
-                     (narrow-to-region (point)
-                                       (progn
-                                         (forward-char 1)
-                                         (skip-chars-forward "^ \t\n\r'\"<>")
-                                         (setq attribute-value-end (point))))
-                     (w3-debug-html :nocontext
-                                    (format "Attribute value missing end 
quote: %s"
-                                            (buffer-substring (point-min) 
(point-max))))
-                     (narrow-to-region (1+ (point-min)) (point-max)))
+                       ;; We have a syntactically invalid attribute value.  
Let's
+                       ;; make a best guess as to what the author intended.
+                       (narrow-to-region (point)
+                                         (progn
+                                           (skip-chars-forward "^ \t\n\r'\"<>")
+                                           (setq attribute-value-end (point))))
+                       (w3-debug-html :nocontext
+                                      (format "Bad attribute value syntax: %s"
+                                              (buffer-substring (point-min) 
(point-max))))))
+                     ;; Now we have isolated the attribute value.  We need to
+                     ;; munge the value depending on the syntax of the
+                     ;; attribute.
+                     ;; *** Right now, we only implement the necessary munging
+                     ;; for CDATA attributes, which is none.  I'm not sure why
+                     ;; this happens to work for other attributes right now.
+                     ;; For any other kind of attribute, we are supposed to
+                     ;; * smash case
+                     ;; * remove leading/trailing whitespace
+                     ;; * smash multiple space sequences into single spaces
+                     ;; * verify the syntax of each token
+                     (setq attr-value (buffer-substring (point-min) 
(point-max)))
+                     (case attr-name
+                       (class
+                        (setq attr-value (split-string attr-value "[ ,]+")))
+                       (align
+                        (if (string-match "^[ \t\r\n]*\\(.*\\)[ \t\r\n]*$"
+                                          attr-value)
+                            (setq attr-value (downcase
+                                              (substring attr-value
+                                                         (match-beginning 1)
+                                                         (match-end 1))))
+                          (setq attr-value (downcase attr-value)))
+                        (setq attr-value (intern attr-value)))
+                       ((src href)
+                        ;; I should expand URLs here
+                        )
+                       (otherwise nil)
+                       )
+                     (widen)
+                     (goto-char attribute-value-end))
                     (t
-                     ;; We have a syntactically invalid attribute value.  Let's
-                     ;; make a best guess as to what the author intended.
-                     (narrow-to-region (point)
-                                       (progn
-                                         (skip-chars-forward "^ \t\n\r'\"<>")
-                                         (setq attribute-value-end (point))))
-                     (w3-debug-html :nocontext
-                                    (format "Bad attribute value syntax: %s"
-                                            (buffer-substring (point-min) 
(point-max))))))
-                   ;; Now we have isolated the attribute value.  We need to
-                   ;; munge the value depending on the syntax of the
-                   ;; attribute.
-                   ;; *** Right now, we only implement the necessary munging
-                   ;; for CDATA attributes, which is none.  I'm not sure why
-                   ;; this happens to work for other attributes right now.
-                   ;; For any other kind of attribute, we are supposed to
-                   ;; * smash case
-                   ;; * remove leading/trailing whitespace
-                   ;; * smash multiple space sequences into single spaces
-                   ;; * verify the syntax of each token
-                   (setq attr-value (buffer-substring (point-min) (point-max)))
-                   (case attr-name
-                     (class
-                      (setq attr-value (split-string attr-value "[ ,]+")))
-                     (align
-                      (if (string-match "^[ \t\r\n]*\\(.*\\)[ \t\r\n]*$"
-                                        attr-value)
-                          (setq attr-value (downcase
-                                            (substring attr-value
-                                                       (match-beginning 1)
-                                                       (match-end 1))))
-                        (setq attr-value (downcase attr-value)))
-                      (setq attr-value (intern attr-value)))
-                     ((src href)
-                      ;; I should expand URLs here
-                      )
-                     (otherwise nil)
-                     )
-                   (widen)
-                   (goto-char attribute-value-end))
-                  (t
-                   ;; No value was specified, in which case NAME should be
-                   ;; taken as ATTRIBUTE=NAME where NAME is one of the
-                   ;; enumerated values for ATTRIBUTE.
-                   ;; We assume here that ATTRIBUTE is the same as NAME.
-                   ;; *** Another piece of code will fix the attribute name if 
it
-                   ;; is wrong.
-                   (setq attr-value (symbol-name attr-name))))
+                     ;; No value was specified, in which case NAME should be
+                     ;; taken as ATTRIBUTE=NAME where NAME is one of the
+                     ;; enumerated values for ATTRIBUTE.
+                     ;; We assume here that ATTRIBUTE is the same as NAME.
+                     ;; *** Another piece of code will fix the attribute name 
if it
+                     ;; is wrong.
+                     (setq attr-value (symbol-name attr-name))))
              
-                 ;; Accumulate the attributes.
-                 (setq tag-attributes (cons (cons attr-name attr-value)
-                                            tag-attributes)))
-
-               (if (and (eq w3-p-d-tag-name 'img)
-                        (not (assq 'alt tag-attributes)))
-                   (w3-debug-html :bad-style
-                                  :outer
-                                  "IMG element has no ALT attribute"))
-               (cond
-                ((and (eq w3-p-d-tag-name 'base)
-                      (setq w3-p-s-baseobject
-                            (or (assq 'src tag-attributes)
-                                (assq 'href tag-attributes))))
-                 (setq w3-p-s-baseobject (url-generic-parse-url
-                                          (cdr w3-p-s-baseobject))))
-                ((setq w3-p-s-btdt (or (assq 'src tag-attributes)
-                                       (assq 'background tag-attributes)
-                                       (assq 'codebase tag-attributes)
-                                       (assq 'href tag-attributes)
-                                       (assq 'action tag-attributes)))
-                 (setcdr w3-p-s-btdt (url-expand-file-name (cdr w3-p-s-btdt)
-                                                           w3-p-s-baseobject))
-                 (setq w3-p-s-btdt (if (url-have-visited-url (cdr w3-p-s-btdt))
-                                       ":visited"
-                                     ":link"))
-                 (if (assq 'class tag-attributes)
-                     (setcdr (assq 'class tag-attributes)
-                             (cons w3-p-s-btdt
-                                   (cdr (assq 'class tag-attributes))))
-                   (setq tag-attributes (cons (cons 'class (list w3-p-s-btdt))
-                                              tag-attributes))))
-                )
-               (if (not (eq w3-p-d-tag-name 'input))
-                   nil
-                 (setq w3-p-s-btdt (concat ":"
-                                           (downcase
-                                            (or (cdr-safe
-                                                 (assq 'type tag-attributes))
-                                                "text"))))
-                 (if (assq 'class tag-attributes)
-                     (setcdr (assq 'class tag-attributes)
-                             (cons w3-p-s-btdt
-                                   (cdr (assq 'class tag-attributes))))
-                   (setq tag-attributes (cons (cons 'class (list w3-p-s-btdt))
-                                              tag-attributes))))
-               )
+                   ;; Accumulate the attributes.
+                   (setq tag-attributes (cons (cons attr-name attr-value)
+                                              tag-attributes)))
+
+                 (if (and (eq w3-p-d-tag-name 'img)
+                          (not (assq 'alt tag-attributes)))
+                     (w3-debug-html :bad-style
+                                    :outer
+                                    "IMG element has no ALT attribute"))
+                 (cond
+                  ((and (eq w3-p-d-tag-name 'base)
+                        (setq w3-p-s-baseobject
+                              (or (assq 'src tag-attributes)
+                                  (assq 'href tag-attributes))))
+                   (setq w3-p-s-baseobject (url-generic-parse-url
+                                            (cdr w3-p-s-baseobject))))
+                  ((setq w3-p-s-btdt (or (assq 'src tag-attributes)
+                                         (assq 'background tag-attributes)
+                                         (assq 'codebase tag-attributes)
+                                         (assq 'href tag-attributes)
+                                         (assq 'action tag-attributes)))
+                   (setcdr w3-p-s-btdt (url-expand-file-name (cdr w3-p-s-btdt)
+                                                             
w3-p-s-baseobject))
+                   (setq w3-p-s-btdt (if (url-have-visited-url (cdr 
w3-p-s-btdt))
+                                         ":visited"
+                                       ":link"))
+                   (if (assq 'class tag-attributes)
+                       (setcdr (assq 'class tag-attributes)
+                               (cons w3-p-s-btdt
+                                     (cdr (assq 'class tag-attributes))))
+                     (setq tag-attributes (cons (cons 'class (list 
w3-p-s-btdt))
+                                                tag-attributes))))
+                  )
+                 (if (not (eq w3-p-d-tag-name 'input))
+                     nil
+                   (setq w3-p-s-btdt (concat ":"
+                                             (downcase
+                                              (or (cdr-safe
+                                                   (assq 'type tag-attributes))
+                                                  "text"))))
+                   (if (assq 'class tag-attributes)
+                       (setcdr (assq 'class tag-attributes)
+                               (cons w3-p-s-btdt
+                                     (cdr (assq 'class tag-attributes))))
+                     (setq tag-attributes (cons (cons 'class (list 
w3-p-s-btdt))
+                                                tag-attributes))))
+                 )
           
-             ;; Process the end of the tag.
-             (skip-chars-forward " \t\n\r")
-             (cond ((eq ?> (char-after (point)))
-                    ;; Ordinary tag end.
-                    (forward-char 1))
-                   ((and (eq ?/ (char-after (point)))
-                         (not w3-p-d-end-tag-p))
-                    ;; This is a NET-enabling start-tag.
-                    (setq net-tag-p t)
-                    (forward-char 1))
-                   ((eq ?< (char-after (point)))
-                    ;; *** Strictly speaking, the following text has to
-                    ;; lexically be STAGO or ETAGO, which means that it
-                    ;; can't match some other lexical unit.
-                    ;; Unclosed tag.
-                    nil)
-                   (t
-                    ;; Syntax error.
-                    (w3-debug-html
-                     (format "Bad unclosed %s%s tag"
-                             (if w3-p-d-end-tag-p "/" "")
-                             (w3-sgml-name-to-string w3-p-d-tag-name)))))
+               ;; Process the end of the tag.
+               (skip-chars-forward " \t\n\r")
+               (cond ((eq ?> (char-after (point)))
+                      ;; Ordinary tag end.
+                      (forward-char 1))
+                     ((and (eq ?/ (char-after (point)))
+                           (not w3-p-d-end-tag-p))
+                      ;; This is a NET-enabling start-tag.
+                      (setq net-tag-p t)
+                      (forward-char 1))
+                     ((eq ?< (char-after (point)))
+                      ;; *** Strictly speaking, the following text has to
+                      ;; lexically be STAGO or ETAGO, which means that it
+                      ;; can't match some other lexical unit.
+                      ;; Unclosed tag.
+                      nil)
+                     (t
+                      ;; Syntax error.
+                      (w3-debug-html
+                       (format "Bad unclosed %s%s tag"
+                               (if w3-p-d-end-tag-p "/" "")
+                               (w3-sgml-name-to-string w3-p-d-tag-name)))))
             
-             (setq tag-end (point)))
+               (setq tag-end (point)))
            
-            ((looking-at "/?>")
-             ;; We are looking at an empty tag (<>, </>).
-             (setq w3-p-d-end-tag-p (eq ?/ (char-after (point))))
-             (setq w3-p-d-tag-name (if w3-p-d-end-tag-p
-                                       (w3-element-name w3-p-d-current-element)
-                                     ;; *** Strictly speaking, if OMITTAG NO, 
then
-                                     ;; we should use the most recently closed 
tag.
-                                     ;; But OMITTAG YES in HTML and I'm lazy.
-                                     (w3-element-name w3-p-d-current-element)))
-             (setq tag-attributes nil)
-             ;; *** Make sure this is not at top level.
-             (setq between-tags-end (1- (point)))
-             (setq tag-end (match-end 0)))
+              ((looking-at "/?>")
+               ;; We are looking at an empty tag (<>, </>).
+               (setq w3-p-d-end-tag-p (eq ?/ (char-after (point))))
+               (setq w3-p-d-tag-name (if w3-p-d-end-tag-p
+                                         (w3-element-name 
w3-p-d-current-element)
+                                       ;; *** Strictly speaking, if OMITTAG 
NO, then
+                                       ;; we should use the most recently 
closed tag.
+                                       ;; But OMITTAG YES in HTML and I'm lazy.
+                                       (w3-element-name 
w3-p-d-current-element)))
+               (setq tag-attributes nil)
+               ;; *** Make sure this is not at top level.
+               (setq between-tags-end (1- (point)))
+               (setq tag-end (match-end 0)))
          
-            ;; *** In SGML, <(doctype)element> is valid tag syntax.  This
-            ;; cannot occur in HTML because the CONCUR option is off in the
-            ;; SGML declaration.
+              ;; *** In SGML, <(doctype)element> is valid tag syntax.  This
+              ;; cannot occur in HTML because the CONCUR option is off in the
+              ;; SGML declaration.
          
-            ((looking-at "!--")
-             ;; We found a comment, delete to end of comment.
-             (delete-region
-              (1- (point))
-              (progn
-                (forward-char 1)
-                ;; Skip over pairs of -- ... --.
-                ;;
-                ;; This can cause us to hit a stack overflow in the regexp
-                ;; engine.  And I'm not sure its correct anyway.  Lets just
-                ;; always fall back to the (semi) non-SGML way of dealing
-                ;; with comments.  WMP  12/24/97
+              ((looking-at "!--")
+               ;; We found a comment, delete to end of comment.
+               (delete-region
+                (1- (point))
+                (progn
+                  (forward-char 1)
+                  ;; Skip over pairs of -- ... --.
+                  ;;
+                  ;; This can cause us to hit a stack overflow in the regexp
+                  ;; engine.  And I'm not sure its correct anyway.  Lets just
+                  ;; always fall back to the (semi) non-SGML way of dealing
+                  ;; with comments.  WMP  12/24/97
 ;;;               (if (looking-at "\\(--[^-]*\\(-[^-]+\\)*--[ \t\r\n]*\\)+>")
 ;;;                   (goto-char (match-end 0))
 ;;;                 ;; Syntax error!
@@ -2492,377 +2459,377 @@ Returns a data structure containing the parsed 
information."
 ;;;                 (forward-char 2)
 ;;;                 (or (re-search-forward "--[ \t\r\n]*>" nil t)
 ;;;                     (search-forward ">" nil t)))
-                (forward-char 2)
-                (or (re-search-forward "--[ \t\r\n]*>" nil t)
-                    (search-forward ">" nil t))
-                (point))))
+                  (forward-char 2)
+                  (or (re-search-forward "--[ \t\r\n]*>" nil t)
+                      (search-forward ">" nil t))
+                  (point))))
            
-            ((looking-at "!>\\|\\?[^>]*>")
-             ;; We are looking at an empty comment or a processing
-             ;; instruction.  Delete it.
-             (replace-match "")
-             (delete-char -1))
-
-            ((looking-at "![a-z]")
-             ;; We are looking at a markup declaration.  Delete it.
-             ;; *** Technically speaking, to handle valid HTML I think we
-             ;; need to handle "<!USEMAP ... >" declarations.  In the future,
-             ;; to handle general SGML, we should parse "<!DOCTYPE ... >"
-             ;; declarations as well (which can contain other declarations).
-             ;; In the very distant future, perhaps we will handle "<!SGML
-             ;; ... >" declarations.
-             ;; *** Should warn if it's not SGML, DOCTYPE, or USEMAP.
-             (backward-char 1)
-             (delete-region
-              (point)
-              (progn
-                (condition-case nil
-                    (forward-sexp 1)
-                  (error
-                   ;; *** This might not actually be bad syntax, but might
-                   ;; instead be a -- ... -- comment with unbalanced
-                   ;; parentheses somewhere inside the declaration.  Handling
-                   ;; this properly would require full parsing of markup
-                   ;; declarations, a goal for the future.
-                   (w3-debug-html "Bad <! syntax.")
-                   (skip-chars-forward "^>")
-                   (if (eq ?> (char-after (point)))
-                       (forward-char))))
-                (point))))
+              ((looking-at "!>\\|\\?[^>]*>")
+               ;; We are looking at an empty comment or a processing
+               ;; instruction.  Delete it.
+               (replace-match "")
+               (delete-char -1))
+
+              ((looking-at "![a-z]")
+               ;; We are looking at a markup declaration.  Delete it.
+               ;; *** Technically speaking, to handle valid HTML I think we
+               ;; need to handle "<!USEMAP ... >" declarations.  In the future,
+               ;; to handle general SGML, we should parse "<!DOCTYPE ... >"
+               ;; declarations as well (which can contain other declarations).
+               ;; In the very distant future, perhaps we will handle "<!SGML
+               ;; ... >" declarations.
+               ;; *** Should warn if it's not SGML, DOCTYPE, or USEMAP.
+               (backward-char 1)
+               (delete-region
+                (point)
+                (progn
+                  (condition-case nil
+                      (forward-sexp 1)
+                    (error
+                     ;; *** This might not actually be bad syntax, but might
+                     ;; instead be a -- ... -- comment with unbalanced
+                     ;; parentheses somewhere inside the declaration.  Handling
+                     ;; this properly would require full parsing of markup
+                     ;; declarations, a goal for the future.
+                     (w3-debug-html "Bad <! syntax.")
+                     (skip-chars-forward "^>")
+                     (if (eq ?> (char-after (point)))
+                         (forward-char))))
+                  (point))))
          
-            ((looking-at "!\\\[\\(\\([ \t\n\r]*[a-z]+\\)+[ \t\n\r]*\\)\\\[")
-             ;; We are looking at a marked section.
-             ;; *** Strictly speaking, we should issue a warning if the
-             ;; keywords are invalid or missing or if the "[" does not follow.
-             ;; We must look at the keywords to understand how to parse it.
-             ;; *** Strictly speaking, we should perform parameter entity
-             ;; substitution on the keywords first.
-             (goto-char (match-beginning 1))
-             (insert ?\))
-             (goto-char (1- (match-beginning 0)))
-             (delete-char 3)
-             (insert ?\()
-             (backward-char 1)
-             (let* ((keywords (read (current-buffer)))
-                    ;; Multiple keywords may appear, but only the most
-                    ;; significant takes effect.  Rank order is IGNORE, CDATA,
-                    ;; RCDATA, INCLUDE, and TEMP.  INCLUDE and TEMP have the
-                    ;; same effect.
-                    (keyword (car-safe (cond ((memq 'IGNORE keywords))
-                                             ((memq 'CDATA keywords))
-                                             ((memq 'RCDATA keywords))
-                                             ((memq 'INCLUDE keywords))
-                                             ((memq 'TEMP keywords))))))
-               (or (eq ?\[ (char-after (point)))
-                   ;; I probably shouldn't even check this, since it is so
-                   ;; impossible.
-                   (error "impossible ??"))
-               (forward-char 1)
-               (delete-region (1- (match-beginning 0)) (point))
-               (cond ((eq 'IGNORE keyword)
-                      ;; Scan forward skipping over matching <![ ... ]]>
-                      ;; until we find an unmatched "]]>".
-                      (let ((ignore-nesting 1)
-                            (start-pos (point)))
-                        (while (> ignore-nesting 0)
-                          (if (re-search-forward "<!\\\\\[\\|\]\]>" nil t)
-                              (setq ignore-nesting
-                                    (if (eq ?> (preceding-char))
-                                        (1- ignore-nesting)
-                                      (1+ ignore-nesting)))
-                            (w3-debug-html
-                             "Unterminated IGNORE marked section.")
-                            (setq ignore-nesting 0)
-                            (goto-char start-pos)))
-                        (delete-region start-pos (point))))
-                     ((eq 'CDATA keyword)
-                      (error "***unimplemented***"))
-                     ((eq 'RCDATA keyword)
-                      (error "***unimplemented***"))
-                     ((memq keyword '(INCLUDE TEMP))
-                      (error "***unimplemented***")))))
-            ((and (looking-at "!")
-                  w3-netscape-compatible-comments)
-             ;; Horribly illegal non-SGML handling of bad HTML on the net.
-             ;; This can break valid HTML.
-             ;; This arises because Netscape discards anything looking like
-             ;; "<!...>".  So people expect they can use this construct as
-             ;; a comment.
-             (w3-debug-html "Evil <! comment syntax.")
-             (backward-char 1)
-             (delete-region
-              (point)
-              (progn
-                (skip-chars-forward "^>")
-                (if (eq ?> (char-after (point)))
-                    (forward-char))
-                (point))))
-            (t
-             ;; This < is not a markup character.  Pretend we didn't notice
-             ;; it at all.  We have skipped over the < already, so just loop
-             ;; again.
-             )))
+              ((looking-at "!\\\[\\(\\([ \t\n\r]*[a-z]+\\)+[ \t\n\r]*\\)\\\[")
+               ;; We are looking at a marked section.
+               ;; *** Strictly speaking, we should issue a warning if the
+               ;; keywords are invalid or missing or if the "[" does not 
follow.
+               ;; We must look at the keywords to understand how to parse it.
+               ;; *** Strictly speaking, we should perform parameter entity
+               ;; substitution on the keywords first.
+               (goto-char (match-beginning 1))
+               (insert ?\))
+               (goto-char (1- (match-beginning 0)))
+               (delete-char 3)
+               (insert ?\()
+               (backward-char 1)
+               (let* ((keywords (read (current-buffer)))
+                      ;; Multiple keywords may appear, but only the most
+                      ;; significant takes effect.  Rank order is IGNORE, 
CDATA,
+                      ;; RCDATA, INCLUDE, and TEMP.  INCLUDE and TEMP have the
+                      ;; same effect.
+                      (keyword (car-safe (cond ((memq 'IGNORE keywords))
+                                               ((memq 'CDATA keywords))
+                                               ((memq 'RCDATA keywords))
+                                               ((memq 'INCLUDE keywords))
+                                               ((memq 'TEMP keywords))))))
+                 (or (eq ?\[ (char-after (point)))
+                     ;; I probably shouldn't even check this, since it is so
+                     ;; impossible.
+                     (error "impossible ??"))
+                 (forward-char 1)
+                 (delete-region (1- (match-beginning 0)) (point))
+                 (cond ((eq 'IGNORE keyword)
+                        ;; Scan forward skipping over matching <![ ... ]]>
+                        ;; until we find an unmatched "]]>".
+                        (let ((ignore-nesting 1)
+                              (start-pos (point)))
+                          (while (> ignore-nesting 0)
+                            (if (re-search-forward "<!\\\\\[\\|\]\]>" nil t)
+                                (setq ignore-nesting
+                                      (if (eq ?> (preceding-char))
+                                          (1- ignore-nesting)
+                                        (1+ ignore-nesting)))
+                              (w3-debug-html
+                               "Unterminated IGNORE marked section.")
+                              (setq ignore-nesting 0)
+                              (goto-char start-pos)))
+                          (delete-region start-pos (point))))
+                       ((eq 'CDATA keyword)
+                        (error "***unimplemented***"))
+                       ((eq 'RCDATA keyword)
+                        (error "***unimplemented***"))
+                       ((memq keyword '(INCLUDE TEMP))
+                        (error "***unimplemented***")))))
+              ((and (looking-at "!")
+                    w3-netscape-compatible-comments)
+               ;; Horribly illegal non-SGML handling of bad HTML on the net.
+               ;; This can break valid HTML.
+               ;; This arises because Netscape discards anything looking like
+               ;; "<!...>".  So people expect they can use this construct as
+               ;; a comment.
+               (w3-debug-html "Evil <! comment syntax.")
+               (backward-char 1)
+               (delete-region
+                (point)
+                (progn
+                  (skip-chars-forward "^>")
+                  (if (eq ?> (char-after (point)))
+                      (forward-char))
+                  (point))))
+              (t
+               ;; This < is not a markup character.  Pretend we didn't notice
+               ;; it at all.  We have skipped over the < already, so just loop
+               ;; again.
+               )))
        
-          ((eq ?& (char-after (point)))
-           (w3-expand-entity-at-point-maybe))
-
-          ((and (eq ?\] (char-after (point)))
-                w3-p-d-in-parsed-marked-section
-                (looking-at "]]>"))
-           ;; *** handle the end of a parsed marked section.
-           (error "***unimplemented***"))
-
-          ((and (eq ?/ (char-after (point)))
-                w3-p-d-null-end-tag-enabled)
-           ;; We are looking at a null end tag.
-           (setq w3-p-d-end-tag-p t)
-           (setq between-tags-end (point))
-           (setq tag-end (1+ (point)))
-           (setq w3-p-d-tag-name (w3-element-name w3-p-d-current-element)))
+            ((eq ?& (char-after (point)))
+             (w3-expand-entity-at-point-maybe))
+
+            ((and (eq ?\] (char-after (point)))
+                  w3-p-d-in-parsed-marked-section
+                  (looking-at "]]>"))
+             ;; *** handle the end of a parsed marked section.
+             (error "***unimplemented***"))
+
+            ((and (eq ?/ (char-after (point)))
+                  w3-p-d-null-end-tag-enabled)
+             ;; We are looking at a null end tag.
+             (setq w3-p-d-end-tag-p t)
+             (setq between-tags-end (point))
+             (setq tag-end (1+ (point)))
+             (setq w3-p-d-tag-name (w3-element-name w3-p-d-current-element)))
        
-          ;; This can be slow, since we'll hardly ever get here.
-          ;; *** Strictly speaking, I think we're supposed to handle
-          ;; shortrefs that begin with the same characters as other markup,
-          ;; preferring the longest match.
-          ;; I will assume that shortrefs never begin with <, &, \], /.
-          ((setq ref (catch 'found-shortref
-                       (let ((refs w3-p-d-shortrefs))
-                         (while refs
-                           (if (looking-at (car (car refs)))
-                               (throw 'found-shortref (cdr (car refs))))
-                           (setq refs (cdr refs))))))
-           ;; We are looking at a shortref for which there is an
-           ;; expansion defined in the current syntax.  Replace with the
-           ;; expansion, leaving point at the beginning so it will be parsed
-           ;; on the next loop.
-           ;; *** eek.  This is wrong if the shortref is for an entity with
-           ;; CDATA syntax which should not be reparsed for tags.
-           (replace-match "")
-           (let ((pt (point)))
-             (insert ref)
-             (goto-char pt)))
+            ;; This can be slow, since we'll hardly ever get here.
+            ;; *** Strictly speaking, I think we're supposed to handle
+            ;; shortrefs that begin with the same characters as other markup,
+            ;; preferring the longest match.
+            ;; I will assume that shortrefs never begin with <, &, \], /.
+            ((setq ref (catch 'found-shortref
+                         (let ((refs w3-p-d-shortrefs))
+                           (while refs
+                             (if (looking-at (car (car refs)))
+                                 (throw 'found-shortref (cdr (car refs))))
+                             (setq refs (cdr refs))))))
+             ;; We are looking at a shortref for which there is an
+             ;; expansion defined in the current syntax.  Replace with the
+             ;; expansion, leaving point at the beginning so it will be parsed
+             ;; on the next loop.
+             ;; *** eek.  This is wrong if the shortref is for an entity with
+             ;; CDATA syntax which should not be reparsed for tags.
+             (replace-match "")
+             (let ((pt (point)))
+               (insert ref)
+               (goto-char pt)))
          
-          ((looking-at (eval-when-compile
-                         (concat "[" (w3-invalid-sgml-chars) "]")))
-           (w3-debug-html
-            (format "Invalid SGML character: %c" (char-after (point))))
-           ;; This will avoid ebola warnings... but do we reallly want
-           ;; to be nuking the invalid character if we are in a MULE
-           ;; buffer... ISO2022 could have 'invalid' HTML characters,
-           ;; but still parse well.  But would this only ever happen
-           ;; if for some reason we did not decode the SJIS/ISO2022
-           ;; encodings?  Mislabeled MIME with no charset?
-           ;;
-           ;; FIXME FIXME FIXME!!!!!
-           (insert (or (cdr-safe (assq (char-int (char-after (point)))
-                                       w3-invalid-sgml-char-replacement)) ""))
-           (delete-char 1))
-          ((eobp)
-           ;; We have finished the buffer.  Make sure we process the last
-           ;; piece of text, if any.
-           (setq between-tags-end (point))
-           ;; We have to test what's on the element stack because this
-           ;; piece of code gets executed twice.
-           (cond ((not (eq '*holder (w3-element-name w3-p-d-current-element)))
-                  ;; This forces the calculation of implied omitted end tags.
-                  (setq w3-p-d-tag-name '*document)
-                  (setq w3-p-d-end-tag-p t)
-                  (setq tag-end (point)))))
+            ((looking-at (eval-when-compile
+                           (concat "[" (w3-invalid-sgml-chars) "]")))
+             (w3-debug-html
+              (format "Invalid SGML character: %c" (char-after (point))))
+             ;; This will avoid ebola warnings... but do we reallly want
+             ;; to be nuking the invalid character if we are in a MULE
+             ;; buffer... ISO2022 could have 'invalid' HTML characters,
+             ;; but still parse well.  But would this only ever happen
+             ;; if for some reason we did not decode the SJIS/ISO2022
+             ;; encodings?  Mislabeled MIME with no charset?
+             ;;
+             ;; FIXME FIXME FIXME!!!!!
+             (insert (or (cdr-safe (assq (char-int (char-after (point)))
+                                         w3-invalid-sgml-char-replacement)) 
""))
+             (delete-char 1))
+            ((eobp)
+             ;; We have finished the buffer.  Make sure we process the last
+             ;; piece of text, if any.
+             (setq between-tags-end (point))
+             ;; We have to test what's on the element stack because this
+             ;; piece of code gets executed twice.
+             (cond ((not (eq '*holder (w3-element-name 
w3-p-d-current-element)))
+                    ;; This forces the calculation of implied omitted end tags.
+                    (setq w3-p-d-tag-name '*document)
+                    (setq w3-p-d-end-tag-p t)
+                    (setq tag-end (point)))))
          
-          (t
-           (error "unreachable code, this can't happen")))
+            (t
+             (error "unreachable code, this can't happen")))
         
-         ;; If we have determined the boundaries of a non-empty between-tags
-         ;; region of text, then handle it.
-         (cond
-          (between-tags-end
+           ;; If we have determined the boundaries of a non-empty between-tags
+           ;; region of text, then handle it.
            (cond
-            ((< between-tags-start between-tags-end)
-             ;; We have a non-empty between-tags region.
-
-             ;; We check if it's entirely whitespace, because we record the
-             ;; transitions for whitespace separately from those for
-             ;; data with non-whitespace characters.
-             (goto-char between-tags-start)
-             (skip-chars-forward " \t\n\r" between-tags-end)
+            (between-tags-end
              (cond
-              ((w3-grok-tag-or-data (prog1 
-                                        (if (= between-tags-end (point))
-                                            '*space
-                                          '*data)
-                                      (goto-char between-tags-end)))
-               ;; We have to include the text in the current element's
-               ;; contents.  If this is the first item in the current
-               ;; element's contents, don't include a leading newline if
-               ;; there is one.  Add a trailing newline as a separate text
-               ;; item so that it can be removed later if it turns out to
-               ;; be the last item in the current element's contents when
-               ;; the current element is closed.
-               ;; *** We could perform this test before calling
-               ;; w3-grok-tag-or-data, but it's not clear which will be
-               ;; faster in practice.
-               (or (setq content (w3-element-content w3-p-d-current-element))
-                   ;; *** Strictly speaking, in SGML the record end is
-                   ;; carriage return, not line feed.
-                   (if (eq ?\n (char-after between-tags-start))
-                       (setq between-tags-start (1+ between-tags-start))))
-               (if (= between-tags-start (point))
-                   ;; Do nothing.
-                   nil
-                 ;; We are definitely going to add data characters to the
-                 ;; content.
-                 (cond
-                  ((and (= ?\n (preceding-char))
-                        (/= between-tags-start (1- (point))))
-                   (setq content (cons (buffer-substring between-tags-start
-                                                         (1- (point)))
-                                       content))
-                   (setq content (cons "\n" content)))
-                  (t
-                   (setq content (cons (buffer-substring between-tags-start
-                                                         (point))
-                                       content))))
-                 (w3-set-element-content w3-p-d-current-element content))))))
+              ((< between-tags-start between-tags-end)
+               ;; We have a non-empty between-tags region.
+
+               ;; We check if it's entirely whitespace, because we record the
+               ;; transitions for whitespace separately from those for
+               ;; data with non-whitespace characters.
+               (goto-char between-tags-start)
+               (skip-chars-forward " \t\n\r" between-tags-end)
+               (cond
+                ((w3-grok-tag-or-data (prog1 
+                                          (if (= between-tags-end (point))
+                                              '*space
+                                            '*data)
+                                        (goto-char between-tags-end)))
+                 ;; We have to include the text in the current element's
+                 ;; contents.  If this is the first item in the current
+                 ;; element's contents, don't include a leading newline if
+                 ;; there is one.  Add a trailing newline as a separate text
+                 ;; item so that it can be removed later if it turns out to
+                 ;; be the last item in the current element's contents when
+                 ;; the current element is closed.
+                 ;; *** We could perform this test before calling
+                 ;; w3-grok-tag-or-data, but it's not clear which will be
+                 ;; faster in practice.
+                 (or (setq content (w3-element-content w3-p-d-current-element))
+                     ;; *** Strictly speaking, in SGML the record end is
+                     ;; carriage return, not line feed.
+                     (if (eq ?\n (char-after between-tags-start))
+                         (setq between-tags-start (1+ between-tags-start))))
+                 (if (= between-tags-start (point))
+                     ;; Do nothing.
+                     nil
+                   ;; We are definitely going to add data characters to the
+                   ;; content.
+                   (cond
+                    ((and (= ?\n (preceding-char))
+                          (/= between-tags-start (1- (point))))
+                     (setq content (cons (buffer-substring between-tags-start
+                                                           (1- (point)))
+                                         content))
+                     (setq content (cons "\n" content)))
+                    (t
+                     (setq content (cons (buffer-substring between-tags-start
+                                                           (point))
+                                         content))))
+                   (w3-set-element-content w3-p-d-current-element content))))))
           
-           (setq between-tags-end nil)))
+             (setq between-tags-end nil)))
       
-         ;; If the previous expression modified (point), then it went to
-         ;; the value of between-tags-end.
+           ;; If the previous expression modified (point), then it went to
+           ;; the value of between-tags-end.
       
-         ;; If we found a start or end-tag, we need to handle it.
-         (cond
-          (w3-p-d-tag-name
+           ;; If we found a start or end-tag, we need to handle it.
+           (cond
+            (w3-p-d-tag-name
         
-           ;; Move past the tag and prepare for next between-tags region.
-           (goto-char tag-end)
-           (setq between-tags-start (point))
+             ;; Move past the tag and prepare for next between-tags region.
+             (goto-char tag-end)
+             (setq between-tags-start (point))
         
-           (cond
-            (w3-p-d-end-tag-p
-             ;; Handle an end-tag.
-             (if (eq w3-p-d-tag-name (w3-element-name w3-p-d-current-element))
-                 (w3-close-element)
-               ;; Handle the complex version.  We have to search up (down?)
-               ;; the open element stack to find the element that matches (if
-               ;; any).  Then we close all of the elements.  On a conforming
-               ;; SGML document this can do no wrong and it's not
-               ;; unreasonable on a non-conforming document.
-            
-               ;; Can't safely modify stack until we know the element we want
-               ;; to find is in there, so work with a copy.
-               (setq open-list w3-p-d-open-element-stack)
-               (while (and open-list
-                           (not (eq w3-p-d-tag-name
-                                    (w3-element-name (car open-list)))))
-                 (setq open-list (cdr open-list)))
-               (cond (open-list
-                      ;; We found a match.  Pop elements.
-                      ;; We will use the following value as a sentinel.
-                      (setq open-list (cdr open-list))
-                      (while (not (eq open-list w3-p-d-open-element-stack))
-                        (w3-close-element t))
-                      (w3-close-element))
-                     (t
-                      ;; Bogus end tag.
-                      (w3-debug-html
-                       (format "Unmatched end-tag </%s>"
-                               (w3-sgml-name-to-string w3-p-d-tag-name)))))))
-            (t
-             ;; Handle a start-tag.
              (cond
-              ;; Check if the new element is allowed in the current element's
-              ;; content model.
-              ((w3-grok-tag-or-data w3-p-d-tag-name)
-               (w3-open-element w3-p-d-tag-name tag-attributes)
+              (w3-p-d-end-tag-p
+               ;; Handle an end-tag.
+               (if (eq w3-p-d-tag-name (w3-element-name 
w3-p-d-current-element))
+                   (w3-close-element)
+                 ;; Handle the complex version.  We have to search up (down?)
+                 ;; the open element stack to find the element that matches (if
+                 ;; any).  Then we close all of the elements.  On a conforming
+                 ;; SGML document this can do no wrong and it's not
+                 ;; unreasonable on a non-conforming document.
             
-               ;; Handle NET-enabling start tags.
-               (cond ((and net-tag-p
-                           (not w3-p-d-null-end-tag-enabled))
-                      ;; Save old values.
-                      (w3-set-element-undo-list 
-                       w3-p-d-current-element 
-                       (cons (cons 'w3-p-d-non-markup-chars
-                                   w3-p-d-non-markup-chars)
-                             (cons '(w3-p-d-null-end-tag-enabled . nil)
-                                   (w3-element-undo-list 
w3-p-d-current-element))))
-                      ;; Alter syntax.
-                      (setq w3-p-d-null-end-tag-enabled t)
-                      (w3-update-non-markup-chars)))
+                 ;; Can't safely modify stack until we know the element we want
+                 ;; to find is in there, so work with a copy.
+                 (setq open-list w3-p-d-open-element-stack)
+                 (while (and open-list
+                             (not (eq w3-p-d-tag-name
+                                      (w3-element-name (car open-list)))))
+                   (setq open-list (cdr open-list)))
+                 (cond (open-list
+                        ;; We found a match.  Pop elements.
+                        ;; We will use the following value as a sentinel.
+                        (setq open-list (cdr open-list))
+                        (while (not (eq open-list w3-p-d-open-element-stack))
+                          (w3-close-element t))
+                        (w3-close-element))
+                       (t
+                        ;; Bogus end tag.
+                        (w3-debug-html
+                         (format "Unmatched end-tag </%s>"
+                                 (w3-sgml-name-to-string w3-p-d-tag-name)))))))
+              (t
+               ;; Handle a start-tag.
+               (cond
+                ;; Check if the new element is allowed in the current element's
+                ;; content model.
+                ((w3-grok-tag-or-data w3-p-d-tag-name)
+                 (w3-open-element w3-p-d-tag-name tag-attributes)
             
-               (setq content-model
-                     (w3-element-content-model w3-p-d-current-element))
+                 ;; Handle NET-enabling start tags.
+                 (cond ((and net-tag-p
+                             (not w3-p-d-null-end-tag-enabled))
+                        ;; Save old values.
+                        (w3-set-element-undo-list 
+                         w3-p-d-current-element 
+                         (cons (cons 'w3-p-d-non-markup-chars
+                                     w3-p-d-non-markup-chars)
+                               (cons '(w3-p-d-null-end-tag-enabled . nil)
+                                     (w3-element-undo-list 
w3-p-d-current-element))))
+                        ;; Alter syntax.
+                        (setq w3-p-d-null-end-tag-enabled t)
+                        (w3-update-non-markup-chars)))
             
-               ;; If the element does not have parsed contents, then we
-               ;; can find its contents immediately.
-               (cond
-                ((memq content-model '(EMPTY CDATA XCDATA XXCDATA RCDATA))
+                 (setq content-model
+                       (w3-element-content-model w3-p-d-current-element))
+            
+                 ;; If the element does not have parsed contents, then we
+                 ;; can find its contents immediately.
                  (cond
-                  ((eq 'EMPTY content-model)
-                   (w3-close-element))
-                  ((eq 'CDATA content-model)
-                   ;; CDATA: all data characters until an end-tag.  We'll
-                   ;; process the end-tag on the next loop.
-                   (if (re-search-forward (if w3-p-d-null-end-tag-enabled
-                                              "</[a-z>]\\|/"
-                                            "</[a-z>]")
-                                          nil 'move)
-                       (goto-char (match-beginning 0))))
-                  ((eq 'XCDATA content-model)
-                   ;; XCDATA: special non-SGML-standard mode which includes
-                   ;; all data characters until "</foo" is seen where "foo"
-                   ;; is the name of this element (for XMP and LISTING).
-                   (if (search-forward 
-                        (concat "</" (symbol-name
-                                      (w3-element-name 
w3-p-d-current-element)))
-                        nil 'move)
-                       (goto-char (match-beginning 0))))
-                  ((eq 'XXCDATA content-model)
-                   ;; XXCDATA: special non-SGML-standard mode which includes
-                   ;; all data until end-of-entity (end-of-buffer for us)
-                   ;; (for PLAINTEXT).
-                   (goto-char (point-max)))
-                  ((eq 'RCDATA content-model)
-                   ;; RCDATA: all data characters until end-tag is seen,
-                   ;; except that entities are expanded first, although the
-                   ;; expansions are _not_ scanned for end-tags, although the
-                   ;; expansions _are_ scanned for further entity
-                   ;; references.
-                   (while (progn
-                            (if (re-search-forward (if 
w3-p-d-null-end-tag-enabled
-                                                       "</[a-z>]\\|[/&]"
-                                                     "</[a-z>]\\|&")
-                                                   nil 'move)
-                                (goto-char (match-beginning 0)))
-                            (eq ?& (char-after (point))))
-                     (w3-expand-entity-at-point-maybe)))))))
-              (t
-               ;; The element is illegal here.  We'll just discard the start
-               ;; tag as though we never saw it.
-               ))))
+                  ((memq content-model '(EMPTY CDATA XCDATA XXCDATA RCDATA))
+                   (cond
+                    ((eq 'EMPTY content-model)
+                     (w3-close-element))
+                    ((eq 'CDATA content-model)
+                     ;; CDATA: all data characters until an end-tag.  We'll
+                     ;; process the end-tag on the next loop.
+                     (if (re-search-forward (if w3-p-d-null-end-tag-enabled
+                                                "</[a-z>]\\|/"
+                                              "</[a-z>]")
+                                            nil 'move)
+                         (goto-char (match-beginning 0))))
+                    ((eq 'XCDATA content-model)
+                     ;; XCDATA: special non-SGML-standard mode which includes
+                     ;; all data characters until "</foo" is seen where "foo"
+                     ;; is the name of this element (for XMP and LISTING).
+                     (if (search-forward 
+                          (concat "</" (symbol-name
+                                        (w3-element-name 
w3-p-d-current-element)))
+                          nil 'move)
+                         (goto-char (match-beginning 0))))
+                    ((eq 'XXCDATA content-model)
+                     ;; XXCDATA: special non-SGML-standard mode which includes
+                     ;; all data until end-of-entity (end-of-buffer for us)
+                     ;; (for PLAINTEXT).
+                     (goto-char (point-max)))
+                    ((eq 'RCDATA content-model)
+                     ;; RCDATA: all data characters until end-tag is seen,
+                     ;; except that entities are expanded first, although the
+                     ;; expansions are _not_ scanned for end-tags, although the
+                     ;; expansions _are_ scanned for further entity
+                     ;; references.
+                     (while (progn
+                              (if (re-search-forward (if 
w3-p-d-null-end-tag-enabled
+                                                         "</[a-z>]\\|[/&]"
+                                                       "</[a-z>]\\|&")
+                                                     nil 'move)
+                                  (goto-char (match-beginning 0)))
+                              (eq ?& (char-after (point))))
+                       (w3-expand-entity-at-point-maybe)))))))
+                (t
+                 ;; The element is illegal here.  We'll just discard the start
+                 ;; tag as though we never saw it.
+                 ))))
         
-           (setq w3-p-d-tag-name nil)
-           (setq w3-p-d-end-tag-p nil)
-           (setq net-tag-p nil)
-           (setq tag-attributes nil)
-           (setq tag-end nil)))
+             (setq w3-p-d-tag-name nil)
+             (setq w3-p-d-end-tag-p nil)
+             (setq net-tag-p nil)
+             (setq tag-attributes nil)
+             (setq tag-end nil)))
         
-         ;; End of main while loop.
-         )
+           ;; End of main while loop.
+           )
     
-       ;; We have finished parsing the buffer!
-       (if status-message-format
-           (message "%sdone" (format status-message-format 100)))
+         ;; We have finished parsing the buffer!
+         (if status-message-format
+             (message "%sdone" (format status-message-format 100)))
     
-       (if (fboundp 'clear-progress) (clear-progress))
+         (if (fboundp 'clear-progress) (clear-progress))
 
-       ;; *** For debugging, save the true parse tree.
-       ;; *** Make this look inside *DOCUMENT.
-       (setq w3-last-parse-tree
-             (w3-element-content w3-p-d-current-element))
+         ;; *** For debugging, save the true parse tree.
+         ;; *** Make this look inside *DOCUMENT.
+         (setq w3-last-parse-tree
+               (w3-element-content w3-p-d-current-element))
 
-       (set-syntax-table old-syntax-table)
-       (w3-element-content w3-p-d-current-element)
-       ))))
+         (set-syntax-table old-syntax-table)
+         (w3-element-content w3-p-d-current-element)
+         )))))
 
 
 
diff --git a/lisp/w3-print.el b/lisp/w3-print.el
index bf1c64e..c4e2b2b 100644
--- a/lisp/w3-print.el
+++ b/lisp/w3-print.el
@@ -1,12 +1,12 @@
 ;;; w3-print.el --- Printing support for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:11 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/12/05 08:36:10 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: faces, help, printing, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -36,7 +36,7 @@ ps-spool-buffer-with-faces   - spool for later")
 
 ;;;###autoload
 (defun w3-print-this-url (&optional url format)
-  "Print out the current document (in LaTeX format)"
+  "Print out the current document"
   (interactive)
   (if (not url) (setq url (url-view-url t)))
   (let* ((completion-ignore-case t)
@@ -46,42 +46,18 @@ ps-spool-buffer-with-faces   - spool for later")
                      '(("HTML Source")         ; The raw HTML code
                        ("Formatted Text")      ; Plain ASCII rendition
                        ("PostScript")          ; Pretty PostScript
-                       ("LaTeX'd")             ; LaTeX it, then print
                        )
                      nil t))))
-    (save-excursion
-      (cond
-       ((equal "HTML Source" format)
-       (if w3-current-source
-           (let ((x w3-current-source))
-             (set-buffer (get-buffer-create url-working-buffer))
-             (erase-buffer)
-             (insert x))
-         (url-retrieve url))
-       (lpr-buffer))
-       ((or (equal "Formatted Text" format)
-           (equal "" format))
-       (lpr-buffer))
-       ((equal "PostScript" format)
-       (funcall w3-postscript-print-function))
-       ((equal "LaTeX'd" format)
-       (w3-parse-tree-to-latex w3-current-parse url)
-       (save-window-excursion
-         (mule-write-region-no-coding-system
-          (point-min) (point-max)
-          (expand-file-name "w3-tmp.latex"
-                            w3-temporary-directory) nil 5)
-         (shell-command
-          (format
-           "cd %s ; latex w3-tmp.latex ; latex w3-tmp.latex ; %s w3-tmp.dvi ; 
rm -f w3-tmp*"
-           w3-temporary-directory
-           w3-print-command))
-         (kill-buffer "*Shell Command Output*")))))))
-
-;;;###autoload
-(defun w3-print-url-under-point ()
-  "Print out the url under point (in LaTeX format)"
-  (interactive)
-  (w3-print-this-url (w3-view-this-url t)))
+    (cond
+     ((equal "HTML Source" format)
+      (save-excursion
+       (set-buffer (generate-new-buffer " *w3-print*"))
+       (insert w3-current-source)
+       (lpr-buffer)))
+     ((or (equal "Formatted Text" format)
+         (equal "" format))
+      (lpr-buffer))
+     ((equal "PostScript" format)
+      (funcall w3-postscript-print-function)))))
 
 (provide 'w3-print)
diff --git a/lisp/w3-script.el b/lisp/w3-script.el
deleted file mode 100644
index a951cce..0000000
--- a/lisp/w3-script.el
+++ /dev/null
@@ -1,100 +0,0 @@
-;;; w3-script.el --- Scripting support
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:11 $
-;; Version: $Revision: 1.1 $
-;; Keywords: hypermedia, scripting
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1997, 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'cl)
-(require 'w3-elisp)
-(require 'w3-jscript)
-
-;; Event Handlers
-;; onclick              ; It was clicked on
-;; onchange            ; Text area was changed
-;; onselect            ; Menu choice changed
-;; onmouseover         ; Mouse is over us
-;; onmouseout          ; Mouse left us
-;; onblur              ; We lost focus
-;; onfocus             ; We gained focus
-;; onload              ; We got loaded
-;; onunload            ; We got unloaded
-;; onreset             ; Form got reset
-;; onsubmit            ; From is about to be submitted
-;; onabort             ; User cancelled loading an image
-;; onerror             ; Error occurred loading an image
-
-(defgroup w3-scripting nil
-  "When, where, how, and why to enable client-side scripting."
-  :group 'w3)
-
-(defcustom w3-do-scripting nil
-  "*Whether to handle client-side scripting or not.
-If you are adventurous, set this to `t'"
-  :group 'w3-scripting
-  :type 'boolean)
-
-(defvar w3-current-scripting-language 'elisp)
-(make-variable-buffer-local 'w3-current-scripting-language)
-
-(put 'form 'w3-event-handlers
-     '(onclick onchange onselect onblur onfocus onreset onsubmit))
-
-(put 'mouse 'w3-event-handlers '(onmouseover onmouseout))
-
-(put 'misc 'w3-event-handlers '(onload onunload))
-
-(put 'all 'w3-event-handlers (append (get 'form 'w3-event-handlers)
-                                    (get 'mouse 'w3-event-handlers)))
-
-(defun w3-script-find-event-handlers (pt type)
-  (if w3-do-scripting
-      (let* ((html-stack (get-text-property pt 'html-stack))
-            (args nil)
-            (rval nil)
-            (cur nil))
-       (while html-stack
-         (setq args (cdr (pop html-stack)))
-         (while (setq cur (pop args))
-           (if (memq (car cur) (get type 'w3-event-handlers))
-               (setq rval (cons cur rval)))))
-       (nreverse rval))))
-
-(defun w3-script-evaluate-form (f)
-  (if w3-do-scripting
-      (case w3-current-scripting-language
-       (elisp
-        (let ((st 0)
-              (form nil)
-              (max (length f)))
-          (condition-case ()
-              (while (and (< st max) (setq form (read-from-string f st)))
-                (setq st (cdr form)
-                      form (car form))
-                (w3-elisp-safe-eval form))
-            (error nil))))
-       (otherwise
-        (message "Unimplemented scripting language: %S"
-                 w3-current-scripting-language)))))
-
-(provide 'w3-script)
diff --git a/lisp/w3-style.el b/lisp/w3-style.el
index c4a435f..ea4a376 100644
--- a/lisp/w3-style.el
+++ b/lisp/w3-style.el
@@ -1,12 +1,12 @@
 ;;; w3-style.el --- Emacs/W3 binding style sheet mechanism
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:11 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/12/05 08:36:11 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: faces, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -37,8 +37,6 @@
 (require 'cl)
 (require 'css)
 
-
-
 ;;;###autoload
 (defun w3-handle-style (&optional plist)
   (let ((url (or (plist-get plist 'href)
@@ -46,17 +44,14 @@
                 (plist-get plist 'uri)))
        (media (intern (downcase (or (plist-get plist 'media) "all"))))
        (type (downcase (or (plist-get plist 'notation) "text/css")))
-       (url-working-buffer " *style*")
        (stylesheet nil)
        (defines nil)
+       (buffer nil)
        (cur-sheet w3-current-stylesheet)
        (string (plist-get plist 'data)))
     (if (not (memq media (css-active-device-types)))
        nil                             ; Not applicable to us!
       (save-excursion
-       (set-buffer (get-buffer-create url-working-buffer))
-       (erase-buffer)
-       (setq url-be-asynchronous nil)
        (cond
         ((member type '("experimental" "arena" "w3c-style" "css" "text/css"))
          (setq stylesheet (css-parse url string cur-sheet)))
diff --git a/lisp/w3-toolbar.el b/lisp/w3-toolbar.el
index 2850adf..ae28000 100644
--- a/lisp/w3-toolbar.el
+++ b/lisp/w3-toolbar.el
@@ -1,7 +1,7 @@
 ;;; w3-toolbar.el --- Toolbar functions for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:11 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/12/05 08:36:11 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: mouse, toolbar
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -326,7 +326,6 @@ not `none'.")
                 ["PostScript" (w3-print-this-url nil "PostScript") t]
                 ["Formatted Text" (w3-print-this-url nil "Formatted Text") t]
                 ["HTML Source" (w3-print-this-url nil "HTML Source") t]
-                ["LaTeX'd" (w3-print-this-url nil "LaTeX'd") t]
                 nil
                 ["Cancel" (beep) t])))
     (popup-dialog-box descr)))
diff --git a/lisp/w3-vars.el b/lisp/w3-vars.el
index 2f6c3d3..029ac1c 100644
--- a/lisp/w3-vars.el
+++ b/lisp/w3-vars.el
@@ -1,7 +1,7 @@
 ;;; w3-vars.el,v --- All variable definitions for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/10/01 20:22:11 $
-;; Version: $Revision: 1.4 $
+;; Created: $Date: 1999/12/05 08:36:11 $
+;; Version: $Revision: 1.5 $
 ;; Keywords: comm, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -34,7 +34,7 @@
 (require 'wid-edit)                    ; For `widget-keymap'
 
 (defconst w3-version-number
-  (let ((x "$State: p4.0pre.46 $"))
+  (let ((x "$State: Exp $"))
     (if (string-match "State:[ \t\n]+.\\([^ \t\n]+\\)" x)
        (setq x (substring x (match-beginning 1) (match-end 1)))
       (setq x (substring x 1)))
@@ -42,7 +42,7 @@
      (function (lambda (x) (if (= x ?-) "." (char-to-string x)))) x ""))
   "Version # of w3-mode.")
 
-(defconst w3-version-date (let ((x "$Date: 1999/10/01 20:22:11 $"))
+(defconst w3-version-date (let ((x "$Date: 1999/12/05 08:36:11 $"))
                            (if (string-match "Date: \\([^ \t\n]+\\)" x)
                                (substring x (match-beginning 1) (match-end 1))
                              x))
@@ -55,12 +55,6 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; General configuration variables
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defvar w3-dump-to-disk nil
-  "*If non-nil, all W3 pages loaded will be dumped to disk.")
-
-(defvar w3-fetch-with-default t
-  "*Whether `w3-fetch' should determine a good starting URL as a default.")
-
 (defvar w3-track-last-buffer nil
   "*Whether to track the last w3 buffer to automatically switch to with
  M-x w3.")
@@ -76,7 +70,7 @@ in later garbage collections taking more time.")
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Figure out what flavor of emacs we are running
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defvar w3-running-xemacs (string-match "XEmacs\\|Lucid" emacs-version)
+(defvar w3-running-xemacs (string-match "XEmacs" emacs-version)
   "*Got XEmacs?.")
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -264,8 +258,7 @@ in later garbage collections taking more time.")
 (defvar w3-graphlink-menu
   '(("Open this Image (%s)"     . w3-fetch)
     ("Save this Image As..."    . w3-download-url)
-    ("Copy this Image Location" . w3-save-url)
-    ("Information on this Image". w3-popup-image-info))
+    ("Copy this Image Location" . w3-save-url))
   "An assoc list of function names and labels.  These will be displayed
 in a popup menu when the mouse is pressed on a hyperlink.  Format is
 ( (label . function)), function is called with one argument, the URL of
@@ -277,8 +270,7 @@ the URL of the link.")
     ("Add Bookmark for this Link" . w3-hotlist-add-document-at-point)
     ("New Window with this Link"  . w3-fetch-other-frame)
     ("Save Link As..."            . w3-download-url)
-    ("Copy this Link Location to Clipboard" . w3-save-url)
-    ("Information on this Link"   . w3-popup-info))
+    ("Copy this Link Location to Clipboard" . w3-save-url))
   "An assoc list of function names and labels.  These will be displayed
 in a popup menu when the mouse is pressed on a hyperlink.  Format is
 ( (label . function)), function is called with one argument, the URL of
@@ -322,12 +314,6 @@ the buffer.")
 (defvar w3-current-stylesheet nil
   "The stylesheet for this document.")
 
-(defvar w3-blinking-buffs nil
-  "A list of buffers with blinking text in them.
-This is used to optimize when we change a face so the entire display
-doesn't flash every second, whether we've run into a buffer that is
-displaying blinking text or not.")
-
 (defvar w3-last-fill-pos nil
   "An internal variable for the new display engine that specifies the
 last character position that was correctly filled.")
@@ -335,10 +321,8 @@ last character position that was correctly filled.")
 (defvar w3-active-faces nil "The list of active faces.")
 (defvar w3-active-voices nil "The list of active voices.")
 
-(defconst w3-bug-address "address@hidden"
+(defconst w3-bug-address "address@hidden"
   "Address of current maintainer, where to send bug reports.")
-(defvar w3-continuation '(url-uncompress)
-  "List of functions to call to process a document completely.")
 (defvar w3-current-isindex nil "Is the current document a searchable index?")
 (defvar w3-current-buffer nil "Is the current W3 buffer")
 (defvar w3-current-last-buffer nil "Last W3 buffer seen before this one.")
@@ -347,17 +331,12 @@ last character position that was correctly filled.")
 (defvar w3-current-source nil "Source of current document.")
 (defvar w3-current-parse nil "Parsed version of current document.")
 (defvar w3-current-badhtml nil "List of HTML warnings for this page.")
-(defconst w3-default-continuation '(url-uncompress) 
-  "Default action to start with - cleans text and uncompresses if necessary.")
 (defvar w3-find-this-link nil "Link to go to within a document.")
 (defvar w3-hidden-forms nil "List of hidden form areas and their info.")
 (defvar w3-hotlist nil "Default hotlist.")
-(defvar w3-icon-path-cache nil "Cache of where we found icons for entities.")
 (defvar w3-last-buffer nil "The last W3 buffer visited.")
-(defvar w3-print-next nil "Should we latex & print the next doc?")
 (defvar w3-roman-characters "ivxLCDMVX" "Roman numerals.")
 (defvar w3-setup-done nil "Have we been through setup code yet?")
-(defvar w3-source nil "Should we source the next document or not?")
 
 (defvar w3-strict-width nil
   "*This variable will control how wide emacs thinks the current window is.
@@ -368,6 +347,7 @@ returns.")
 (defvar w3-submit-button nil
   "A widget object specifying what button was pressed to submit a form.")
 
+;; FIXME - this should be changed to use the mm stuff. - FIXME
 (defvar w3-meta-content-type-charset-regexp
   (concat "<meta[ \t]+http-equiv=\"?Content-type\"?[ \t]+content=\"\\([^;]+\\)"
          ";[ \t]*charset=\"?\\([^\"]+\\)\"?"
@@ -404,14 +384,7 @@ for a charset indication")
     widget-field-new
     w3-form-radio-elements
     w3-form-elements
-    url-current-callback-func
-    url-current-content-length
-    url-current-mime-encoding
-    url-current-mime-headers
-    url-current-mime-type
-    url-current-mime-viewer
     url-current-object
-    url-current-referer
     w3-current-badhtml
     w3-current-parse
     w3-current-isindex
@@ -464,98 +437,7 @@ for a charset indication")
 (defvar w3-table-structure nil
   "Structure to hold table info")
 (make-variable-buffer-local 'w3-table-structure)
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;  Keymap definitions
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defvar w3-mode-map (make-sparse-keymap) "Keymap to use in w3-mode.")
-(suppress-keymap w3-mode-map)
-(set-keymap-parent w3-mode-map widget-keymap)
-
-(define-key w3-mode-map "h" (make-sparse-keymap))
-(define-key w3-mode-map "H" (make-sparse-keymap))
-(define-key w3-mode-map "a" (make-sparse-keymap))
-
-(define-key w3-mode-map "ha"       'w3-hotlist-apropos)
-(define-key w3-mode-map "hd"       'w3-hotlist-delete)
-(define-key w3-mode-map "hi"       'w3-hotlist-add-document)
-(define-key w3-mode-map "hv"       'w3-show-hotlist)
-(define-key w3-mode-map "hr"       'w3-hotlist-rename-entry)
-(define-key w3-mode-map "hu"       'w3-use-hotlist)
-(define-key w3-mode-map "hA"       'w3-hotlist-append)
-(define-key w3-mode-map "hI"       'w3-hotlist-add-document-at-point)
-(define-key w3-mode-map "hR"       'w3-hotlist-refresh)
-
-(define-key w3-mode-map "x" (make-sparse-keymap))
-(define-key w3-mode-map "xa" 'w3-hotindex-add-key)
-(define-key w3-mode-map "xd" 'w3-hotindex-rm-key)
-(define-key w3-mode-map "xq" 'w3-hotindex-query)
-
-(define-key w3-mode-map "HF"       'w3-history-forward)
-(define-key w3-mode-map "HB"       'w3-history-backward)
-(define-key w3-mode-map "Hv"       'w3-show-history-list)
-
-(define-key w3-mode-map " "       'w3-scroll-up)
-(define-key w3-mode-map "<"        'beginning-of-buffer)
-(define-key w3-mode-map ">"        'end-of-buffer)
-(define-key w3-mode-map "?"        'w3-help)
-(define-key w3-mode-map "B"        'w3-history-backward)
-(define-key w3-mode-map "D"        'w3-download-url-at-point)
-(define-key w3-mode-map "F"        'w3-history-forward)
-(define-key w3-mode-map "G"        'w3-show-graphics)
-(define-key w3-mode-map "I"        'w3-popup-info)
-(define-key w3-mode-map "K"        'w3-save-this-url)
-(define-key w3-mode-map "P"        'w3-print-url-under-point)
-(define-key w3-mode-map "Q"        'w3-leave-buffer)
-(define-key w3-mode-map "R"        'w3-refresh-buffer)
-(define-key w3-mode-map "S"        'w3-source-document-at-point)
-(define-key w3-mode-map "U"        'w3-use-links)
-(define-key w3-mode-map "V"        'w3-view-this-url)
-(define-key w3-mode-map "\C-?"     'scroll-down)
-(define-key w3-mode-map [backspace] 'scroll-down)
-(define-key w3-mode-map "\C-c\C-b" 'w3-show-history-list)
-(define-key w3-mode-map "\C-c\C-v" 'w3-version)
-(define-key w3-mode-map "\C-o"     'w3-fetch)
-(define-key w3-mode-map "\M-M"     'w3-mail-document-under-point)
-(define-key w3-mode-map "\M-m"    'w3-mail-current-document)
-(define-key w3-mode-map "\M-s"    'w3-save-as)
-(define-key w3-mode-map "\M-\r"    'w3-follow-inlined-image)
-(define-key w3-mode-map "b"       'w3-widget-backward)
-(define-key w3-mode-map "c"        'w3-mail-document-author)
-(define-key w3-mode-map "d"        'w3-download-this-url)
-(define-key w3-mode-map "f"       'w3-widget-forward)
-(define-key w3-mode-map "g"        'w3-reload-document)
-(define-key w3-mode-map "i"        'w3-document-information)
-(define-key w3-mode-map "k"        'w3-save-url)
-(define-key w3-mode-map "l"        'w3-goto-last-buffer)
-(define-key w3-mode-map "m"        'w3-complete-link)
-(define-key w3-mode-map "n"        'w3-widget-forward)
-(define-key w3-mode-map "o"       'w3-open-local)
-(define-key w3-mode-map "p"        'w3-print-this-url)
-(define-key w3-mode-map "q"       'w3-quit)
-(define-key w3-mode-map "r"        'w3-reload-document)
-(define-key w3-mode-map "s"        'w3-source-document)
-(define-key w3-mode-map "u"        'w3-leave-buffer)
-(define-key w3-mode-map "v"       'url-view-url)
-(define-key w3-mode-map "w"        'w3-submit-bug)
-
-;; These are duplicated here instead of just inherited from widget-keymap
-;; due to some issues with Emacspeak.  FIXME.
-(define-key w3-mode-map [tab] 'w3-widget-forward)
-(define-key w3-mode-map [(shift tab)] 'w3-widget-backward)
-(define-key w3-mode-map [(meta tab)] 'w3-widget-backward)
-(define-key w3-mode-map [backtab] 'w3-widget-backward)
-
-;; Emulate some netscape stuff by default
-(define-key w3-mode-map [(control alt t)] 'url-list-processes)
-(define-key w3-mode-map [(control meta t)] 'url-list-processes)
-
-;; Have fun with document ordering
-(define-key w3-mode-map [(meta space)] 'w3-next-document)
-(define-key w3-mode-map [(meta delete)] 'w3-prev-document)
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Keyword definitions
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'w3-keymap)
 (require 'w3-keyword)
 (provide 'w3-vars)
diff --git a/lisp/w3-widget.el b/lisp/w3-widget.el
index ad667c9..cd99a00 100644
--- a/lisp/w3-widget.el
+++ b/lisp/w3-widget.el
@@ -1,7 +1,7 @@
 ;;; w3-widget.el --- An image widget
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/09 14:52:35 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/12/05 08:36:12 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: faces, images
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -52,6 +52,7 @@
 
 (require 'cl)
 (require 'widget)
+(require 'url-util)
 (require 'w3-keyword)
 
 (defvar widget-image-keymap (make-sparse-keymap)
diff --git a/lisp/w3-xemac.el b/lisp/w3-xemac.el
index f722cca..a2cb663 100644
--- a/lisp/w3-xemac.el
+++ b/lisp/w3-xemac.el
@@ -1,12 +1,12 @@
 ;;; w3-xemac.el --- XEmacs specific functions for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:10 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/12/05 08:36:12 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: faces, help, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -31,7 +31,6 @@
 (require 'w3-widget)
 (require 'w3-menu)
 (require 'w3-forms)
-(require 'w3-script)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Enhancements For XEmacs
@@ -46,10 +45,7 @@
        (if (not (and good pt (number-or-marker-p pt)))
            nil
          (if (and inhibit-help-echo w3-track-mouse)
-             (widget-echo-help pt))
-         (setq mouse-events (w3-script-find-event-handlers pt 'mouse))
-         (if (assq 'onmouseover mouse-events)
-             (w3-script-evaluate-form (cdr (assq 'onmouseover 
mouse-events))))))))
+             (widget-echo-help pt))))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Functions to build menus of urls
diff --git a/lisp/w3.el b/lisp/w3.el
index 47241d0..b27e908 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/09 14:52:37 $
-;; Version: $Revision: 1.10 $
+;; Created: $Date: 1999/12/05 08:36:12 $
+;; Version: $Revision: 1.11 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -32,43 +32,7 @@
 ;;; Web (WWW), a project to create a global information net in hypertext    ;;;
 ;;; format.                                                                ;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;; first start by making sure the load path is properly set.  This code
-;;; is mostly taken from calc-2.02b
-;;;
-;;; this allows you to put the following in your .emacs file, instead of
-;;; having to know what the load-path for the w3 files is.
-;;;
-;;;     (autoload 'w3 "w3/w3" "WWW Browser" t)
-
-;;; If w3 files exist on the load-path, we're all set.
-(let ((name (and (fboundp 'w3)
-                (eq (car-safe (symbol-function 'w3)) 'autoload)
-                (nth 1 (symbol-function 'w3))))
-      (p load-path))
-  (while (and p (not (file-exists-p
-                     (expand-file-name "w3-vars.elc" (car p)))))
-    (setq p (cdr p)))
-  (or p
-;;; If w3 is autoloaded using a path name, look there for w3 files.
-;;; This works for both relative ("w3/w3.elc") and absolute paths.
-      (and name (file-name-directory name)
-          (let ((p2 load-path)
-                (name2 (concat (file-name-directory name)
-                               "w3-vars.elc")))
-            (while (and p2 (not (file-exists-p
-                                 (expand-file-name name2 (car p2)))))
-              (setq p2 (cdr p2)))
-            (if p2
-                (setq load-path (nconc load-path
-                                       (list
-                                        (directory-file-name
-                                         (file-name-directory
-                                          (expand-file-name
-                                           name (car p2)))))))))))
-  )
 
-
 (require 'w3-sysdp)
 (require 'w3-cfg)
 (require 'mule-sysdp)
@@ -146,7 +110,7 @@ the subprocess exits."
   ;; A process filter for asynchronous external viewers
   (if (= (length string) 0)
       nil
-    (let ((buff (get-buffer-create (url-generate-new-buffer-name
+    (let ((buff (get-buffer-create (generate-new-buffer-name
                                    (symbol-name
                                     (read (nth 2 (process-command proc))))))))
       (save-excursion
@@ -204,86 +168,6 @@ See the variable `w3-notify' for the different 
notification behaviors."
     (message "W3 buffer %s is ready." (buffer-name buff)))
    (t (message ""))))
 
-(defun w3-pass-to-viewer ()
-  ;; Pass a w3 buffer to a viewer
-  (set-buffer url-working-buffer)
-  (let* ((info  url-current-mime-viewer)          ; All the MIME viewer info
-        (view (cdr-safe (assoc "viewer" info))) ; How to view this file
-        (url (url-view-url t))
-        (fmt  (cdr-safe (assoc "nametemplate" info)))) ; Template for name
-    (cond
-     (fmt nil)
-     ((cdr-safe (assoc "type" info))
-      (setq fmt (mm-type-to-file (cdr-safe (assoc "type" info))))
-      (if fmt
-         (setq fmt (concat "%s" (car fmt)))
-       (setq fmt (concat "%s" (url-file-extension
-                               (url-filename url-current-object)))))))
-    (if (null view)
-       (setq view 'indented-text-mode))
-    (cond
-     ((symbolp view)
-      (if (not (memq view '(w3-prepare-buffer w3-print w3-source
-                                             w3-default-local-file
-                                             mm-multipart-viewer)))
-         (let ((bufnam (url-generate-new-buffer-name
-                        (file-name-nondirectory
-                         (or (url-filename url-current-object)
-                             "Unknown")))))
-           (if (string= bufnam "")
-               (setq bufnam (url-generate-new-buffer-name
-                             (url-view-url t))))
-           (rename-buffer bufnam)
-           ;; Make the URL show in list-buffers output
-           (make-local-variable 'list-buffers-directory)
-           (setq list-buffers-directory (url-view-url t))
-           (set-buffer-modified-p nil)
-           (buffer-enable-undo)
-           (funcall view)
-           (w3-notify-when-ready bufnam))
-       (setq w3-current-last-buffer w3-current-buffer)
-       (funcall view)))
-     ((stringp view)
-      (let ((fname (url-generate-unique-filename fmt))
-           (proc nil))
-       (if (url-file-directly-accessible-p (url-view-url t))
-           (make-symbolic-link (url-filename url-current-object) fname t)
-         (mule-write-region-no-coding-system (point-min) (point-max) fname))
-       (if (get-buffer url-working-buffer)
-           (kill-buffer url-working-buffer))
-       (setq view (mm-viewer-unescape view fname url))
-       (message "Passing to viewer %s " view)
-       (setq proc (w3-start-viewer fname view))
-       (set-process-filter proc 'w3-viewer-filter)
-       (set-process-sentinel proc 'w3-viewer-sentinel)))
-     ((listp view)
-      (set-buffer-modified-p nil)
-      (buffer-enable-undo)
-      (eval view))
-     (t
-      (message "Unknown viewer specified: %s" view)
-      (w3-notify-when-ready url-working-buffer)))))
-
-(defun w3-save-binary-file ()
-  "Save a buffer to disk - this is used when `w3-dump-to-disk' is non-nil"
-  ;; Ok, this is truly fucked.  In XEmacs, if you use the mouse to select
-  ;; a URL that gets saved via this function, read-file-name will pop up a
-  ;; dialog box for file selection.  For some reason which buffer we are in
-  ;; gets royally screwed (even with save-excursions and the whole nine
-  ;; yards).  SO, we just keep the old buffer name around and away we go.
-  (let ((old-buff (current-buffer))
-       (file (read-file-name "Filename to save as: "
-                             (or mm-download-directory "~/")
-                             (url-remove-compressed-extensions
-                              (file-name-nondirectory (url-view-url t)))
-                             nil
-                             (url-remove-compressed-extensions
-                              (file-name-nondirectory (url-view-url t)))))
-       (require-final-newline nil))
-    (set-buffer old-buff)
-    (mule-write-region-no-coding-system (point-min) (point-max) file)
-    (kill-buffer (current-buffer))))
-
 ;;;###autoload
 (defun w3-open-local (fname)
   "Find a local file, and interpret it as a hypertext document.
@@ -291,7 +175,7 @@ It will prompt for an existing file or directory, and 
retrieve it as a
 hypertext document."
   (interactive "FLocal file: ")
   (setq fname (expand-file-name fname))
-  (if (not w3-setup-done) (w3-do-setup))
+  (w3-do-setup)
   (w3-fetch (concat "file:" fname)))
 
 ;;;###autoload
@@ -326,61 +210,11 @@ to disk."
   (split-window)
   (w3-fetch url))
 
-;; Ripped off from red gnus
-(defun w3-find-etc-directory (package &optional file)
-  "Go through the path and find the \".../etc/PACKAGE\" directory.
-If FILE, find the \".../etc/PACKAGE\" file instead."
-  (let ((path load-path)
-       dir result)
-    ;; We try to find the dir by looking at the load path,
-    ;; stripping away the last component and adding "etc/".
-    (while path
-      (if (and (car path)
-              (file-exists-p
-               (setq dir (concat
-                          (file-name-directory
-                           (directory-file-name (car path)))
-                          "etc/" package 
-                          (if file "" "/"))))
-              (or file (file-directory-p dir)))
-         (setq result dir
-               path nil)
-       (setq path (cdr path))))
-    result))
-
-(defun w3-url-completion-function (string predicate function)
-  (if (not w3-setup-done) (w3-do-setup))
-  (cond
-   ((eq function nil)
-    (let ((list nil))
-      (cl-maphash (function (lambda (key val)
-                             (setq list (cons (cons key val)
-                                              list))))
-                 url-global-history-hash-table)
-      (try-completion string (nreverse list) predicate)))
-   ((eq function t)
-    (let ((stub (concat "^" (regexp-quote string)))
-         (retval nil))
-      (cl-maphash
-       (function
-       (lambda (url time)
-         (if (string-match stub url)
-             (setq retval (cons url retval)))))
-       url-global-history-hash-table)
-      retval))
-   ((eq function 'lambda)
-    (and url-global-history-hash-table
-        (cl-gethash string url-global-history-hash-table)
-        t))
-   (t
-    (error "w3-url-completion-function very confused."))))
-
 (defun w3-read-url-with-default ()
   (url-do-setup)
   (let* ((completion-ignore-case t)
         (default
           (cond
-           ((null w3-fetch-with-default) nil)
            ((eq major-mode 'w3-mode)
             (or (and current-prefix-arg (w3-view-this-url t))
                 (url-view-url t)))
@@ -389,7 +223,7 @@ If FILE, find the \".../etc/PACKAGE\" file instead."
            (t "http://www.";)))
         (url nil))
     (setq url
-         (completing-read "URL: "  'w3-url-completion-function
+         (completing-read "URL: "  'url-completion-function
                           nil nil default))
     (if (string= url "")
        (setq url (if (eq major-mode 'w3-mode)
@@ -399,29 +233,84 @@ If FILE, find the \".../etc/PACKAGE\" file instead."
                    (url-get-url-at-point))))
     url))
 
+(defun w3-decode-charset (&optional prompt)
+  "Decode charset-encoded text in the article.
+If PROMPT (the prefix), prompt for a coding system to use."
+  (interactive "P")
+  (save-excursion
+    (mail-narrow-to-head)
+    (let* ((inhibit-point-motion-hooks t)
+          (case-fold-search t)
+          (ct (mail-fetch-field "Content-Type" t))
+          (cte (mail-fetch-field "Content-Transfer-Encoding" t))
+          (ctl (and ct (ignore-errors
+                         (mail-header-parse-content-type ct))))
+          (charset (cond
+                    (prompt
+                     (mm-read-coding-system "Charset to decode: "))
+                    (ctl
+                     (mail-content-type-get ctl 'charset))))
+          (mail-parse-charset 'iso-8859-1) ; Always true for HTTP, right?
+          (mail-parse-ignored-charsets nil)
+          buffer-read-only)
+      (if (and ctl (not (string-match "/" (car ctl)))) 
+         (setq ctl nil))
+      (goto-char (point-max))
+      (widen)
+      (forward-line 1)
+      (narrow-to-region (point) (point-max))
+      (when (and (or (not ctl)
+                    (equal (car ctl) "text/plain")))
+       (mm-decode-body
+        charset (and cte (intern (downcase
+                                  (gnus-strip-whitespace cte))))
+        (car ctl))))
+    (widen)))
+
+(defun w3-fetch-callback (url)
+  (let ((handle (mm-dissect-buffer t))
+       (buff nil))
+    (message "Downloading of `%s' complete." url)
+    (w3-decode-charset)
+    (url-mark-buffer-as-dead (current-buffer))
+    (if (equal (car-safe (mm-handle-type handle)) "text/html")
+       ;; Special case text/html if it comes through w3-fetch
+       (progn
+         (setq buff (generate-new-buffer " *w3-html*"))
+         (set-buffer buff)
+         (setq url-current-object (url-generic-parse-url url))
+         (mm-insert-part handle)
+         (w3-prepare-buffer)
+         (w3-notify-when-ready (current-buffer)))
+      (if (mm-inlinable-p handle)
+         ;; We can view it inline!
+         (progn
+           (setq buff (generate-new-buffer url))
+           (set-buffer buff)
+           (mm-display-part handle)
+           (w3-notify-when-ready (current-buffer)))
+       ;; Must be an external viewer
+       (mm-display-part handle)))
+    (mm-destroy-parts handle)))
+
 ;;;###autoload
 (defun w3-fetch (&optional url target)
   "Retrieve a document over the World Wide Web.
 Defaults to URL of the current document, if any.
 With prefix argument, use the URL of the hyperlink under point instead."
   (interactive (list (w3-read-url-with-default)))
-  (if (not w3-setup-done) (w3-do-setup))
-  (if (boundp 'w3-working-buffer)
-      (setq w3-working-buffer url-working-buffer))
+  (w3-do-setup)
   (if (and (boundp 'command-line-args-left)
           command-line-args-left
           (string-match url-nonrelative-link (car command-line-args-left)))
       (setq url (car command-line-args-left)
            command-line-args-left (cdr command-line-args-left)))
   (if (or (null url) (equal url "")) (error "No document specified!"))
-  ;; legal use for relative URLs ?
-  (if (string-match "^www:[^/].*" url)
-      (setq url (concat (file-name-directory (url-filename
-                                             url-current-object))
-                       (substring url 4))))
+
   ;; In the common case, this is probably cheaper than searching.
   (while (= (string-to-char url) ? )
     (setq url (substring url 1)))
+
   (or target (setq target w3-base-target))
   (if (stringp target)
       (setq target (intern (downcase target))))
@@ -436,16 +325,17 @@ With prefix argument, use the URL of the hyperlink under 
point instead."
              (delete-other-windows))
             (otherwise
              (message "target %S not found." target))))))
+
   (cond
    ((= (string-to-char url) ?#)
     (w3-relative-link url))
-   ((or (and (interactive-p) current-prefix-arg) w3-dump-to-disk)
+   ((and (interactive-p) current-prefix-arg)
     (w3-download-url url))
    (t
     (let ((x (url-view-url t))
          (lastbuf (current-buffer))
          (w3-current-buffer (current-buffer))
-         (buf (url-buffer-visiting url)))
+         (buf (w3-buffer-visiting url)))
       (if (or (not buf)
              (cond
               ((not (equal (downcase (or url-request-method "GET")) "get")) t)
@@ -462,40 +352,7 @@ With prefix argument, use the URL of the hyperlink under 
point instead."
                (not (funcall url-confirmation-func
                              (format "Reuse URL in buffer %s? "
                                      (buffer-name buf)))))))
-         (let* ((status (url-retrieve url))
-                (cached (car status))
-                (url-working-buffer (cdr status)))
-           (if w3-track-last-buffer
-               (setq w3-last-buffer (get-buffer url-working-buffer)))
-           (if (get-buffer url-working-buffer)
-               (cond
-                ((and url-be-asynchronous (not cached))
-                 (save-excursion
-                   (set-buffer url-working-buffer)
-                   (w3-history-push x (url-view-url t))
-                   (setq w3-current-last-buffer lastbuf)))
-                (t
-                 (w3-history-push x url)
-                 (w3-sentinel lastbuf)))
-             (w3-history-push x url)))
-       (save-excursion
-         (set-buffer buf)
-         (setq w3-current-last-buffer lastbuf))
-       (w3-history-push x url)
-       (if w3-track-last-buffer
-           (setq w3-last-buffer buf))
-       (let ((w3-notify (if (memq w3-notify '(newframe bully 
-                                              semibully aggressive))
-                            w3-notify
-                          'aggressive)))
-         (w3-notify-when-ready buf))
-       (if (string-match "#\\(.*\\)" url)
-           (progn
-             (push-mark (point) t)
-             (w3-find-specific-link (url-match url 1))))
-       (or (w3-maybe-fetch-frames)
-           (message "Reusing URL.  To reload, type %s."
-                    (substitute-command-keys "\\[w3-reload-document]"))))))))
+         (url-retrieve url 'w3-fetch-callback (list url)))))))
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -578,22 +435,7 @@ the cdr is the 'next' node."
                            (cdr entity))))))))
   (goto-char (point-min)))
 
-(defun w3-executable-exists-in-path (exec &optional path)
-  (let ((paths (if (consp path)
-                  path
-                (mm-string-to-tokens (or path
-                                         (getenv "PATH")
-                                         (concat
-                                          "/usr/bin:/bin:/usr/local/bin:"
-                                          "/usr/bin/X11:"
-                                          (expand-file-name "~/bin"))) ?:)))
-       (done nil))
-    (while (and paths (not done))
-      (if (file-exists-p (expand-file-name exec (car paths)))
-         (setq done t))
-      (setq paths (cdr paths)))
-    done))
-
+;; FIXME!!! This is broken with the new URL package.
 (defun w3-document-information (&optional buff)
   "Display information on the document in buffer BUFF"
   (interactive)
@@ -754,7 +596,7 @@ under point."
 (defun w3-maybe-follow-link-mouse (e)
   "Maybe follow a hypertext link under point.
 If there is no link under point, this will try using
-url-get-url-at-point"
+`url-get-url-at-point'"
   (interactive "e")
   (save-excursion
     (mouse-set-point e)
@@ -767,7 +609,7 @@ If there is no link under point, this will try using
 url-get-url-at-point"
   (interactive)
   (require 'w3)
-  (if (not w3-setup-done) (w3-do-setup))
+  (w3-do-setup)
   (let* ((widget (widget-at (point)))
          (url1 (and widget (widget-get widget :href)))
          (url2 (url-get-url-at-point)))
@@ -793,43 +635,9 @@ url-get-url-at-point"
 (defun w3-fix-spaces (x)
   "Remove spaces/tabs at the beginning of a string,
 and convert newlines into spaces."
-  (url-convert-newlines-to-spaces
+  ;(url-convert-newlines-to-spaces
    (url-strip-leading-spaces
-    (url-eat-trailing-space x))))
-
-(defun w3-reload-all-files ()
-  "Reload all w3 files"
-  (interactive)
-  (setq w3-setup-done nil
-       url-setup-done nil
-       w3-hotlist nil
-       url-mime-accept-string nil)
-  (let ((x '(w3 base64 css mule-sysdp w3-e19 mm url w3-xemac
-               w3-e20 dsssl dsssl-flow font images ssl url-auth
-               url-cache url-cookie url-file url-gopher url-gw
-               url-http url-mail url-misc url-news url-ns url-parse
-               url-vars w3-about w3-cus w3-display w3-e20 w3-elisp
-               w3-emulate w3-forms w3-hot w3-imap w3-jscript
-               w3-keyword w3-latex w3-menu w3-mouse w3-parse
-               w3-prefs w3-print w3-props w3-script w3-speak w3-style
-               w3-sysdp w3-toolbar w3-vars w3-widget w3-xemac w3
-               w3-toolbar font)))
-    (while x
-      (setq features (delq (car x) features)
-           x (cdr x)))
-    (require 'w3))
-  (mapatoms (function
-            (lambda (sym)
-              (if (or (string-match "^w3-" (symbol-name sym))
-                      (string-match "^url-" (symbol-name sym))
-                      (string-match "^ssl-" (symbol-name sym))
-                      (string-match "^base64-" (symbol-name sym))
-                      (string-match "^dsssl-" (symbol-name sym))
-                      (string-match "^mm-" (symbol-name sym)))
-                  (progn
-                    (fmakunbound sym)
-                    (makunbound sym))))))
-  (require 'w3))
+    (url-eat-trailing-space x)));)
 
 (defun w3-source-document-at-point ()
   "View source to the document pointed at by link under point"
@@ -839,47 +647,22 @@ and convert newlines into spaces."
 (defun w3-source-document (under)
   "View this document's source"
   (interactive "P")
-  (let* ((url (if under (w3-view-this-url) (url-view-url t)))
-        (src
-         (cond
-          ((null url)
-           (error "No URL found!"))
-          ((and under (null url)) (error "No link at point!"))
-          ((and (not under) (equal url-current-mime-type "text/plain"))
-           (buffer-string))
-          ((and (not under) w3-current-source) w3-current-source)
-          (t
-           (prog2
-               (url-retrieve url)
-               (buffer-string)
-             (kill-buffer (current-buffer))))))
-        (tmp (url-generate-new-buffer-name url)))
-    (if (and url (get-buffer url))
-       (cond
-        ((memq w3-reuse-buffers '(no never reload))
-         (kill-buffer url))
-        ((memq w3-reuse-buffers '(yes reuse always))
-         (w3-notify-when-ready (get-buffer url))
-         (setq url nil))
-        ((funcall url-confirmation-func
-                  (concat "Source for " url " found, reuse? "))
-         (w3-notify-when-ready (get-buffer url)))))
-    (if (not url) nil
-      (set-buffer (get-buffer-create tmp))
-      (insert src)
-      (put-text-property (point-min) (point-max) 'w3-base url)
-      (goto-char (point-min))
-      (setq buffer-file-truename url
-           buffer-file-name url)
-      ;; Null filename bugs `set-auto-mode' in Mule ...
-      (condition-case ()
-         (set-auto-mode)
-       (error nil))
-      (setq buffer-file-truename nil
-           buffer-file-name nil)
-      (buffer-enable-undo)
-      (set-buffer-modified-p nil)
-      (w3-notify-when-ready (get-buffer tmp))))
+  (let* ((url (if under (w3-view-this-url) (url-view-url t))))
+    (set-buffer (generate-new-buffer (concat "Source of: " url)))
+    (url-insert-file-contents url)
+    (put-text-property (point-min) (point-max) 'w3-base url)
+    (goto-char (point-min))
+    (setq buffer-file-truename url
+         buffer-file-name url)
+    ;; Null filename bugs `set-auto-mode' in Mule ...
+    (condition-case ()
+       (set-auto-mode)
+      (error nil))
+    (setq buffer-file-truename nil
+         buffer-file-name nil)
+    (buffer-enable-undo)
+    (set-buffer-modified-p nil)
+    (w3-notify-when-ready (current-buffer)))
   (run-hooks 'w3-source-file-hook))
 
 (defun w3-mail-document-under-point ()
@@ -897,7 +680,6 @@ and convert newlines into spaces."
                      '(("HTML Source")
                        ("Formatted Text")
                        ("PostScript")
-                       ("LaTeX Source")
                        )
                  nil t)))
         (case-fold-search t)
@@ -946,20 +728,7 @@ and convert newlines into spaces."
              (setq content-type (concat "text/plain; charset=" 
content-charset))
              (w3-fetch url))
             ((equal "Formatted Text" format)
-             (setq content-type (concat "text/plain; charset=" 
content-charset)))
-            ((and under (equal "LaTeX Source" format))
-             (let ((old-asynch (default-value 'url-be-asynchronous)))
-               (setq content-type (concat "application/x-latex; charset=" 
content-charset))
-               (unwind-protect
-                   (progn
-                     (setq-default url-be-asynchronous nil)
-                     (url-retrieve url))
-                 (setq-default url-be-asynchronous old-asynch))
-               (w3-parse-tree-to-latex (w3-parse-buffer (current-buffer))
-                                       url)))
-            ((equal "LaTeX Source" format)
-             (setq content-type (concat "application/x-latex; charset=" 
content-charset))
-             (w3-parse-tree-to-latex w3-current-parse url)))
+             (setq content-type (concat "text/plain; charset=" 
content-charset))))
            (buffer-string))))
     (funcall url-mail-command)
     (mail-subject)
@@ -1026,28 +795,6 @@ and convert newlines into spaces."
       (eval-buffer (current-buffer))
     (emacs-lisp-mode)))
 
-(defun w3-build-continuation ()
-  ;; Build a series of functions to be run on this file
-  (save-excursion
-    (set-buffer url-working-buffer)
-    (let ((cont w3-default-continuation)
-         (extn (url-file-extension
-                (url-filename url-current-object))))
-      (if (assoc extn url-uncompressor-alist)
-         (setq extn (url-file-extension
-                     (substring (url-filename url-current-object)
-                                0 (- (length extn))))))
-      (if w3-source
-         (setq url-current-mime-viewer '(("viewer" . w3-source))))
-      (if (not url-current-mime-viewer)
-         (setq url-current-mime-viewer
-               (mm-mime-info (or url-current-mime-type
-                                 (mm-extension-to-mime extn)) nil 5)))
-      (if url-current-mime-viewer
-         (setq cont (append cont '(w3-pass-to-viewer)))
-       (setq cont (append cont (list 'w3-prepare-buffer))))
-      cont)))
-
 (defun w3-use-links ()
   "Select one of the <LINK> tags from this document and fetch it."
   (interactive)
@@ -1088,18 +835,6 @@ insert URL under point"
          (set-buffer oldbuf))
       (message "Not on a link!"))))
 
-(defun w3-show-hotlist ()
-  "View the hotlist in hypertext form"
-  (interactive)
-  (if (not w3-setup-done) (w3-do-setup))
-  (if (not w3-hotlist)
-      (error "Sorry, no hotlist is in memory.")
-    (let ((x (url-buffer-visiting "www:/auto/hotlist")))
-      (while x
-       (kill-buffer x)
-       (setq x (url-buffer-visiting "www:/auto/hotlist"))))
-    (w3-fetch "www://auto/hotlist")))
-
 (defun w3-in-assoc (elt list)
   "Check to see if ELT matches any of the regexps in the car elements of LIST"
   (let (rslt)
@@ -1223,52 +958,6 @@ invokes some commands which read a coding system from the 
user.")
              (replace-match repl nil t))))
       (setq invalid-char-alist (cdr invalid-char-alist)))))
 
-(defun w3-sentinel (&optional proc string)
-  (let ((minibuffer-window (active-minibuffer-window)))
-    (unwind-protect
-       (progn
-         (if minibuffer-window
-             (other-window 1))
-         (set-buffer url-working-buffer)
-         (if (or (stringp proc)
-                 (bufferp proc)) (setq w3-current-last-buffer proc))
-         (remove-hook 'after-change-functions 'url-after-change-function)
-         (if (fboundp 'clear-progress) (clear-progress))
-         (if url-be-asynchronous
-             (progn
-               (cond
-                ((not (get-buffer url-working-buffer)) nil)
-                ((url-mime-response-p) (url-parse-mime-headers)))
-               (if (not url-current-mime-type)
-                   (setq url-current-mime-type (or (mm-extension-to-mime
-                                                    (url-file-extension
-                                                     (url-filename
-                                                      url-current-object)))
-                                                   "text/html")))))
-         ;; hack for charset not indicated in MIME headers but in a META tag 
...
-         (if (not url-current-mime-charset)
-             (save-excursion
-               (goto-char (point-min))
-               (if (or (re-search-forward w3-meta-content-type-charset-regexp 
nil t)
-                       (re-search-forward w3-meta-charset-content-type-regexp 
nil t))
-                   (setq url-current-mime-type
-                         (buffer-substring-no-properties (match-beginning 1) 
(match-end 1))
-                         url-current-mime-charset
-                         (buffer-substring-no-properties (match-beginning 2) 
(match-end 2))))))
-         (if (not (string-match "^www:" (or (url-view-url t) "")))
-             (w3-convert-code-for-mule (and (stringp url-current-mime-type)
-                                            (downcase url-current-mime-type))
-                                       (and (stringp url-current-mime-charset)
-                                            (downcase 
url-current-mime-charset))
-                                       (and (stringp url-current-mime-encoding)
-                                            (downcase 
url-current-mime-encoding))))
-         (let ((x (w3-build-continuation))
-               (url (url-view-url t)))
-           (while x
-             (funcall (pop x)))))
-      (if minibuffer-window
-         (set-frame-selected-window (selected-frame) minibuffer-window)))))
-
 (defun w3-show-history-list ()
   "Format the url-history-list prettily and show it to the user"
   (interactive)
@@ -1283,108 +972,33 @@ invokes some commands which read a coding system from 
the user.")
                             "Format: "
                             '(("HTML Source")
                               ("Formatted Text")
-                              ("LaTeX Source")
                               ("PostScript")
                               ("Binary"))
                             nil t)))
           (fname (expand-file-name
                   (read-file-name "File name: " default-directory)))
+          (source w3-current-source)
+          (text (buffer-string))
           (url (url-view-url t)))
+      (set-buffer (generate-new-buffer " *w3-save-as*"))
       (cond
        ((equal "Binary" format)
-       (if (not w3-current-source)
-           (let ((url-be-asynchronous nil))
-             (url-retrieve url))))
+       (insert source))
        ((equal "HTML Source" format)
-       (if (not w3-current-source)
-           (let ((url-be-asynchronous nil))
-             (url-retrieve url))       ; Get the document if necessary
-         (let ((txt w3-current-source))
-           (set-buffer (get-buffer-create url-working-buffer))
-           (erase-buffer)
-           (insert txt)))
+       (insert source)
        (goto-char (point-min))
        (if (re-search-forward "<head>" nil t)
            (insert "\n"))
        (insert (format "<BASE HREF=\"%s\">\n" url)))
        ((or (equal "Formatted Text" format)
            (equal "" format))
-       nil)                            ; Do nothing - we have the text already
+       (insert text))
        ((equal "PostScript" format)
        (require 'ps-print)
-       (let ((ps-spool-buffer-name " *w3-temp*"))
-         (if (get-buffer ps-spool-buffer-name)
-             (kill-buffer ps-spool-buffer-name))
-         (ps-spool-buffer-with-faces)
-         (set-buffer ps-spool-buffer-name)))
-       ((equal "LaTeX Source" format)
-       (w3-parse-tree-to-latex w3-current-parse url)))
-      (mule-write-region-no-coding-system (point-min) (point-max) fname))))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Functions to parse out <A> tags and replace it with a hyperlink zone
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun w3-popup-image-info (url)
-  (interactive)
-  (let* ((glyph (cdr-safe (assoc url w3-graphics-list)))
-       image w h d info)
-    (save-excursion
-      (if (or (not glyph) (not (glyphp glyph)))
-        (error "No information available."))
-      (setq image (glyph-image-instance glyph))
-      (if (or (not image) (not (image-instance-p image)))
-        (error "No information available."))
-      (setq w (glyph-width glyph)
-          h (glyph-height glyph)
-          d (image-instance-depth image)
-          info (url-popup-info url)
-          )
-      (set-buffer (get-buffer-create "*Image Info*"))
-      (erase-buffer)
-      (insert
-       "Information for: " url "\n"
-       (make-string (1- (window-width)) ?-)
-       (format "\n%-20s: %s\n" "Type" (image-instance-type image))
-       (format "%-20s: %d x %d\n" "Dimensions" w h)
-       (format "%-20s: %d-bit\n" "Color" d))
-      (set-extent-begin-glyph (make-extent (point) (point)) glyph)
-      (insert
-       "\n"
-       (make-string (1- (window-width)) ?-)
-       (or info ""))
-      (display-buffer (current-buffer) t))))
-               
-(defun w3-popup-info (&optional url)
-  "Show information about the link under point. (All SGML attributes)"
-  (interactive (list (or (w3-view-this-url t)
-                        (w3-read-url-with-default))))
-  (let (dat widget)
-    (if (interactive-p)
-       nil
-      (setq widget (widget-at (point))
-           dat (and widget (widget-get widget 'attributes))))
-    (if url
-       (save-excursion
-         (set-buffer (get-buffer-create "*Header Info*"))
-         (erase-buffer)
-         (insert "URL: " url "\n" (make-string (1- (window-width)) ?-) "\n")
-         (if (and dat (listp dat))
-             (insert
-              "Link attributes:\n"
-              (make-string (1- (window-width)) ?-) "\n"
-              (mapconcat
-               (function
-                (lambda (info)
-                  (format "%20s :== %s" (car info) (or (cdr info) "On"))))
-               dat "\n")
-              "\n" (make-string (1- (window-width)) ?-) "\n"))
-         (insert (save-excursion (url-popup-info url)))
-         (goto-char (point-min))
-         (display-buffer (current-buffer) t))
-      (message "No URL to get information on!"))))
-
-(fset 'w3-document-information-this-url 'w3-popup-info)
+       (let ((ps-spool-buffer-name (buffer-name)))
+         (ps-spool-buffer-with-faces))))
+      (mule-write-region-no-coding-system (point-min) (point-max) fname)
+      (kill-buffer (current-buffer)))))
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1475,7 +1089,6 @@ invokes some commands which read a coding system from the 
user.")
                     efs-version
                     ange-ftp-version
                     url-version
-                    url-be-asynchronous
                     url)))
         (if (and url (string= url "file:nil")) (setq url nil))
         (mapcar
@@ -1534,7 +1147,7 @@ invokes some commands which read a coding system from the 
user.")
     (setq index (car data))
     (setq querystring (w3-nuke-spaces-in-search (read-string (cdr data))))
     (if (string-match "\\(.*\\)\\?.*" index)
-       (setq index (url-match index 1)))
+       (setq index (match-string 1 index)))
     (w3-fetch
      (concat index (if (= ?? (string-to-char (substring index -1 nil)))
                       "" "?") querystring))))
@@ -1553,10 +1166,9 @@ invokes some commands which read a coding system from 
the user.")
 If optional argument HERE is non-nil, insert info at point."
   (interactive "P")
   (let ((version-string 
-         (format "WWW %s, URL %s, MM %s" 
+         (format "WWW %s, URL %s" 
                  w3-version-number 
-                 url-version
-                 mm-version)))
+                 url-version)))
     (if here 
         (insert version-string)
       (if (interactive-p)
@@ -1574,7 +1186,7 @@ document should be specified by its fully specified 
Uniform Resource
 Locator.  The document will be parsed as HTML (if appropriate) and
 displayed in a new buffer."
   (interactive)
-  (if (not w3-setup-done) (w3-do-setup))
+  (w3-do-setup)
   (if (and w3-track-last-buffer
           (bufferp w3-last-buffer)
           (buffer-name w3-last-buffer))
@@ -1593,122 +1205,6 @@ displayed in a new buffer."
       (w3-fetch w3-default-homepage)))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Leftover stuff that didn't quite fit into url.el
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defun w3-generate-error (type data)
-  ;; Generate an HTML error buffer for error TYPE with data DATA.
-  (setq url-current-mime-type "text/html")
-  (cond
-   ((equal type "nofile")
-    (let ((error (save-excursion
-                 (set-buffer (get-buffer-create " *url-error*"))
-                 (buffer-string))))
-      (if (string= "" error)
-         (setq error
-               (format (concat "The file %s could not be found.  "
-                               "Either it does not exist, or it "
-                               "is unreadable.") data)))
-      (insert "<html>\n <head>\n"
-           "  <title>Error</title>\n"
-           " </head>\n <body>\n"
-           "  <h1>Error accessing " data "</h1>\n"
-           "  <hr>\n  <p>"
-           error
-           "\n  </p>\n")))
-   ((equal type "nobuf")
-    (insert "<title>Error</title>\n"
-           "<H1>No buffer " data " found</h1>\n"
-           "<HR>\n"
-           "The buffer " data " could not be found.  It has either\n"
-           "been killed or renamed.\n"))
-   ((equal type "nohist")
-    (insert "<TITLE>Error</TITLE>\n"
-           "<H1>No history items found.</H1>\n"
-           "<HR>\n"
-           "There is no history list available at this time.  Either\n"
-           "you have not visited any nodes, or the variable <i>\n"
-           "url-keep-history</i> is nil.\n"))
-   )
-  (insert "<hr>\n"
-         "If you feel this is a bug in Emacs-W3, <a href=\"mailto:";
-         w3-bug-address "\">send mail to " w3-bug-address
-         "</a>\n<hr>"))
-
-(defun w3-generate-auto-html (type)
-  ;; Generate one of several automatic html pages
-  (setq url-current-mime-type "text/html"
-       url-current-mime-headers '(("content-type" . "text/html")))
-  (cond
-   ((equal type "hotlist")
-    (let ((tmp (reverse w3-hotlist)))
-      (insert "<html>\n\t<head>\n\t\t"
-             "<title> Hotlist </title>\n\t</head>\n"
-             "\t<body>\n\t\t<div>\n\t\t\t<h1>Hotlist from " w3-hotlist-file
-             "</h1>\n\t\t\t<ol>\n")
-      (while tmp
-       (insert  "\t\t\t\t<li> <a href=\"" (car (cdr (car tmp)))
-                "\">" (url-insert-entities-in-string
-                       (car (car tmp))) "</a></li>\n")
-       (setq tmp (cdr tmp)))
-      (insert "\n\t\t\t</ol>\n\t\t</div>\n\t</body>\n</html>\n")))
-   ((equal type "history")
-    (if (not url-history-list)
-       (url-retrieve "www://error/nohist")
-      (insert "<html>\n\t<head>\n\t\t"
-             "<title> History List For This Session of W3</title>"
-             "\n\t</head>\n\t<body>\n\t\t<div>\n\t\t\t<h1>"
-             "History List For This Session of W3</h1>\n\t\t\t<ol>\n")
-      (cl-maphash
-       (function
-       (lambda (url desc)
-         (insert (format "\t\t\t\t<li> <a href=\"%s\">%s</a>\n"
-                         url (url-insert-entities-in-string desc)))))
-       url-history-list)
-      (insert "\n\t\t\t</ol>\n\t\t</div>\n\t</body>\n</html>\n")))))
-
-(defun w3-internal-handle-preview (buffer)
-  (setq buffer (get-buffer buffer))
-  (let ((base (get-text-property (point-min) 'w3-base buffer)))
-    (if base
-       (setq base (url-generic-parse-url base)))
-    (insert-buffer buffer)
-    (let ((inhibit-read-only t))
-      (set-text-properties (point-min) (point-max) nil))
-    (cond
-     (base
-      (setq url-current-object base))      
-     ((buffer-file-name buffer)
-      (let ((path (buffer-file-name buffer)))
-       (if (string-match "^//" path)
-           (setq path (concat "/%2f" (substring path 2))))
-       (setq url-current-object
-             (url-generic-parse-url (concat "file:" path)))))
-     (t
-      (setq url-current-object
-           (url-generic-parse-url "file:/")
-           url-current-mime-type "text/html")))))
-
-(defun w3-internal-url (url)
-  ;; Handle internal urls (previewed buffers, etc)
-  (if (not (string-match "www:/+\\([^/]+\\)/\\(.*\\)" url))
-      (w3-fetch "www://error/")
-    (let ((type (url-match url 1))
-         (data (url-match url 2)))
-      (set-buffer (get-buffer-create url-working-buffer))
-      (cond
-       ((equal type "preview")         ; Previewing a document
-       (if (get-buffer data)           ; Buffer still exists
-           (w3-internal-handle-preview data)
-         (url-retrieve (concat "www://error/nobuf/" data))))
-       ((equal type "error")           ; Error message
-       (if (string-match "\\([^/]+\\)/\\(.*\\)" data)
-           (w3-generate-error (url-match data 1) (url-match data 2))
-         (w3-generate-error data "")))
-       ((equal type "auto")            ; Hotlist or help stuff
-       (w3-generate-auto-html data))))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Stuff for good local file handling
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (defun w3-ff (file)
@@ -1909,7 +1405,7 @@ as high as possible in w3-explicit-conversion-tree"
       (let ((elt (car structure)))
        (if (eq (car elt) 'frame)
            (let* ((url (nth 2 elt))
-                  (buf (url-buffer-visiting url)))
+                  (buf (w3-buffer-visiting url)))
              (if buf
                  (progn
                    (set-buffer buf)
@@ -2006,6 +1502,7 @@ No arg means whole window full.  Arg is number of lines 
to scroll."
       (move-to-window-line -1)
       (beginning-of-line))))
 
+;; FIXME!! This is broken for the new URL package
 (defun w3-mail-document-author ()
   "Send mail to the author of this document, if possible."
   (interactive)
@@ -2040,11 +1537,10 @@ No arg means whole window full.  Arg is number of lines 
to scroll."
 
 (defun w3-kill-emacs-func ()
   "Routine called when exiting emacs.  Do miscellaneous clean up."
-  (and (eq url-keep-history t)
-       url-global-history-hash-table
-       (url-write-global-history))
+  (url-history-save-history)
   (message "Cleaning up w3 storage...")
-  (let ((x (nconc
+  ;; FIXME!  This needs to be in the URL library now I guess?
+  '(let ((x (nconc
            (and (file-exists-p w3-temporary-directory)
                 (directory-files w3-temporary-directory t "url-tmp.*"))
            (and (file-exists-p url-temporary-directory)
@@ -2082,10 +1578,6 @@ No arg means whole window full.  Arg is number of lines 
to scroll."
          (insert (format "(%s/%s) %s\n" class (or level 'warning) message)))
        (display-buffer (current-buffer)))))))
 
-(defun w3-internal-expander (urlobj defobj)
-  ;; URL Expansion routine for internally handled routines
-  (url-identity-expander urlobj defobj))
-
 (defun w3-map-links (function &optional buffer from to maparg)
   "Map FUNCTION over the hypertext links which overlap region in BUFFER,
 starting at FROM and ending at TO.  FUNCTION is called with the arguments
@@ -2109,37 +1601,6 @@ BUFFER, the end of BUFFER, nil, and (current-buffer), 
respectively."
         (t nil))
        nil)))))
 
-(defun w3-emit-image-warnings-if-necessary ()
-  (if (and (not w3-delay-image-loads)
-          (fboundp 'w3-insert-graphic)
-          (or (not (featurep 'gif))
-              (not (featurep 'jpeg)))
-          (not (w3-executable-exists-in-path "ppmtoxpm"))
-          (not (or
-                (w3-executable-exists-in-path "pbmtoxbm")
-                (w3-executable-exists-in-path "ppmtoxbm"))))
-      (w3-warn
-       'image
-       (concat
-       "Could not find some vital ppm utilities in exec-path.\n"
-       "This probably means that you will be unable to view any\n"
-       "inlined images other than: "
-       (mapconcat
-        (function
-         (lambda (x)
-           (if (featurep x) (concat (symbol-name x) ",\n"))))
-        '(png jpg gif xpm xbm) "")
-       "\n\n"
-       "If you do not have the PPM utilities from either the PBMPLUS\n"
-       "or NETPBM distributions installed on your machine, then\n"
-       "please set the variable `w3-delay-image-loads' to t with a\n"
-       "line like:\n\n"
-       "\t(setq w3-delay-image-loads t)\n\n"
-       "in your ~/.emacs file.\n\n"
-       "You can find the NETPBM utilities in:\n"
-       "\tftp://ftp.cs.indiana.edu/pub/elisp/w3/images/\n";
-       ))))
-
 (defun w3-refresh-stylesheets ()
   "Reload all stylesheets."
   (interactive)
@@ -2194,24 +1655,18 @@ BUFFER, the end of BUFFER, nil, and (current-buffer), 
respectively."
                    (and (not no-user-init)
                         (list w3-default-stylesheet))))
         (remember possible)
-        (old-asynch (default-value 'url-be-asynchronous))
         (found nil)
-        (cur nil)
-        (url nil))
-    (unwind-protect
-       (progn
-         (setq-default url-be-asynchronous nil)
-         (while possible
-           (setq cur (car possible)
-                 possible (cdr possible)
-                 found (and cur (file-exists-p cur) (file-readable-p cur)
-                            (not (file-directory-p cur)) cur))
-           (if found
-               (setq total-found (1+ total-found)
-                     w3-loaded-stylesheets (cons cur w3-loaded-stylesheets)
-                     w3-user-stylesheet (css-parse (concat "file:" cur) nil
-                                                   w3-user-stylesheet)))))
-      (setq-default url-be-asynchronous old-asynch))
+        (cur nil))
+    (while possible
+      (setq cur (car possible)
+           possible (cdr possible)
+           found (and cur (file-exists-p cur) (file-readable-p cur)
+                      (not (file-directory-p cur)) cur))
+      (if found
+         (setq total-found (1+ total-found)
+               w3-loaded-stylesheets (cons cur w3-loaded-stylesheets)
+               w3-user-stylesheet (css-parse (concat "file:" cur) nil
+                                             w3-user-stylesheet))))
     (if (= 0 total-found)
        (progn
          (w3-warn
@@ -2232,102 +1687,93 @@ BUFFER, the end of BUFFER, nil, and (current-buffer), 
respectively."
 (defun w3-do-setup ()
   "Do setup - this is to avoid conflict with user settings when W3 is
 dumped with emacs."
-  (url-do-setup)
-  (url-register-protocol 'about 'w3-about 'url-identity-expander)
-  (url-register-protocol 'www 'w3-internal-url 'w3-internal-expander)
-  (w3-load-flavors)
-  (w3-setup-version-specifics)
-  (setq w3-default-configuration-file (expand-file-name 
-                                      (or w3-default-configuration-file
-                                          "profile")
-                                      w3-configuration-directory))
-  (if (and init-file-user
-          w3-default-configuration-file
-          (file-exists-p w3-default-configuration-file))
-      (condition-case e
-         (load w3-default-configuration-file nil t)
-       (error
-        (let ((buf-name " *Configuration Error*"))
-          (if (get-buffer buf-name)
-              (kill-buffer (get-buffer buf-name)))
-          (display-error e (get-buffer-create buf-name))
-          (save-excursion
-            (switch-to-buffer-other-window buf-name)
-            (shrink-window-if-larger-than-buffer))
-          (w3-warn 'configuration
-                   (format (eval-when-compile
-                             (concat
-                              "Configuration file `%s' contains an error.\n"
-                              "Please consult the `%s' buffer for details."))
-                           w3-default-configuration-file buf-name))))))
+  (if w3-setup-done
+      nil
+    (url-do-setup)
+    (w3-load-flavors)
+    (w3-setup-version-specifics)
+    (setq w3-default-configuration-file (expand-file-name 
+                                        (or w3-default-configuration-file
+                                            "profile")
+                                        w3-configuration-directory))
+    (if (and init-file-user
+            w3-default-configuration-file
+            (file-exists-p w3-default-configuration-file))
+       (condition-case e
+           (load w3-default-configuration-file nil t)
+         (error
+          (let ((buf-name " *Configuration Error*"))
+            (if (get-buffer buf-name)
+                (kill-buffer (get-buffer buf-name)))
+            (display-error e (get-buffer-create buf-name))
+            (save-excursion
+              (switch-to-buffer-other-window buf-name)
+              (shrink-window-if-larger-than-buffer))
+            (w3-warn 'configuration
+                     (format (eval-when-compile
+                               (concat
+                                "Configuration file `%s' contains an error.\n"
+                                "Please consult the `%s' buffer for details."))
+                             w3-default-configuration-file buf-name))))))
               
-  ;; Load the explicit encodings file if it exists
-  (if (and w3-explicit-encodings-file
-          (file-exists-p w3-explicit-encodings-file))
-      (condition-case nil
-         (load w3-explicit-encodings-file nil t)
-       (error nil)))
-
-  (if (and (eq w3-user-colors-take-precedence 'guess)
-          (not (eq (device-type) 'tty))
-          (not (eq (device-class) 'mono)))
-      (progn
-       (setq w3-user-colors-take-precedence t)
-       (w3-warn
-        'html
-        "Disabled document color specification because of mono display.")))
-
-  (w3-refresh-stylesheets)
-  (setq w3-setup-done t)
-  (if (not url-global-history-file)
-      (setq url-global-history-file
-           (expand-file-name "history"
-                             w3-configuration-directory)))
-
-  (add-minor-mode 'w3-netscape-emulation-minor-mode " NS"
-                 w3-netscape-emulation-minor-mode-map)
-  (add-minor-mode 'w3-lynx-emulation-minor-mode " Lynx"
-                 w3-lynx-emulation-minor-mode-map)
-  
-  (setq url-package-version w3-version-number
-       url-package-name "Emacs-W3")
+    ;; Load the explicit encodings file if it exists
+    (if (and w3-explicit-encodings-file
+            (file-exists-p w3-explicit-encodings-file))
+       (condition-case nil
+           (load w3-explicit-encodings-file nil t)
+         (error nil)))
+
+    (if (and (eq w3-user-colors-take-precedence 'guess)
+            (not (eq (device-type) 'tty))
+            (not (eq (device-class) 'mono)))
+       (progn
+         (setq w3-user-colors-take-precedence t)
+         (w3-warn
+          'html
+          "Disabled document color specification because of mono display.")))
 
-  (w3-setup-terminal-chars)
+    (w3-refresh-stylesheets)
+    (setq w3-setup-done t)
 
-  (w3-emit-image-warnings-if-necessary)
-                  
-  (cond
-   ((memq system-type '(ms-dos ms-windows))
-    (setq w3-hotlist-file (or w3-hotlist-file
-                             (expand-file-name "~/mosaic.hot"))
-         ))
-   ((memq system-type '(axp-vms vax-vms))
-    (setq w3-hotlist-file (or w3-hotlist-file
-                             (expand-file-name "~/mosaic.hotlist-default"))
-         ))
-   (t 
-    (setq w3-hotlist-file (or w3-hotlist-file
-                             (expand-file-name "~/.mosaic-hotlist-default"))
-         )))
+    (add-minor-mode 'w3-netscape-emulation-minor-mode " NS"
+                   w3-netscape-emulation-minor-mode-map)
+    (add-minor-mode 'w3-lynx-emulation-minor-mode " Lynx"
+                   w3-lynx-emulation-minor-mode-map)
   
-  ; Set up a hook that will save the history list when
-  ; exiting emacs
-  (add-hook 'kill-emacs-hook 'w3-kill-emacs-func)
+    (setq url-package-version w3-version-number
+         url-package-name "Emacs-W3")
 
-  (mm-parse-mailcaps)
-  (mm-parse-mimetypes)
+    (w3-setup-terminal-chars)
+
+    (cond
+     ((memq system-type '(ms-dos ms-windows))
+      (setq w3-hotlist-file (or w3-hotlist-file
+                               (expand-file-name "~/mosaic.hot"))
+           ))
+     ((memq system-type '(axp-vms vax-vms))
+      (setq w3-hotlist-file (or w3-hotlist-file
+                               (expand-file-name "~/mosaic.hotlist-default"))
+           ))
+     (t 
+      (setq w3-hotlist-file (or w3-hotlist-file
+                               (expand-file-name "~/.mosaic-hotlist-default"))
+           )))
+  
+                                       ; Set up a hook that will save the 
history list when
+                                       ; exiting emacs
+    (add-hook 'kill-emacs-hook 'w3-kill-emacs-func)
 
-  ; Load in the hotlist if they haven't set it already
-  (or w3-hotlist (w3-parse-hotlist))
+                                       ; Load in the hotlist if they haven't 
set it already
+    (or w3-hotlist (w3-parse-hotlist))
 
-  ; Set the default home page, honoring their defaults, then
-  ; the standard WWW_HOME, then default to the documentation @ IU
-  (or w3-default-homepage
-      (setq w3-default-homepage
-           (or (getenv "WWW_HOME")
-               "http://www.cs.indiana.edu/elisp/w3/docs.html";)))
+                                       ; Set the default home page, honoring 
their defaults, then
+                                       ; the standard WWW_HOME, then default 
to the documentation @ IU
+    (or w3-default-homepage
+       (setq w3-default-homepage
+             (or (getenv "WWW_HOME")
+                 "http://www.cs.indiana.edu/elisp/w3/docs.html";)))
 
-  (run-hooks 'w3-load-hook))
+    (run-hooks 'w3-load-hook)))
 
 (defun w3-mark-link-as-followed (ext dat)
   ;; Mark a link as followed
@@ -2340,14 +1786,11 @@ dumped with emacs."
                     (setq result (cons x result)))))
     result))
 
-(defun w3-download-callback (fname buff)
-  (if (and (get-buffer buff) (buffer-name buff))
-      (save-excursion
-       (set-buffer buff)
-       (mule-write-region-no-coding-system (point-min) (point-max) fname)
-       (message "Download of %s complete." (url-view-url t))
-       (sit-for 3)
-       (kill-buffer buff))))
+(defun w3-download-callback (fname)
+  (mule-write-region-no-coding-system (point-min) (point-max) fname)
+  (url-mark-buffer-as-dead (current-buffer))
+  (message "Download of %s complete." (url-view-url t))
+  (sit-for 3))
 
 (defun w3-download-url-at-point ()
   "Download the URL under point."
@@ -2368,14 +1811,10 @@ dumped with emacs."
             
 (defun w3-download-url (url &optional file-name)
   (interactive (list (w3-read-url-with-default)))
-  (let* ((old-asynch (default-value 'url-be-asynchronous))
-        (url-inhibit-uncompression t)
-        (url-mime-accept-string "*/*")
+  (let* ((url-mime-accept-string "*/*")
         (urlobj (url-generic-parse-url url))
-        (url-working-buffer
-         (generate-new-buffer (concat " *" url " download*")))
         (stub-fname (url-basepath (or (url-filename urlobj) "") t))
-        (dir (or mm-download-directory "~/"))
+        (dir (or mailcap-download-directory "~/"))
         (fname (or file-name
                    (expand-file-name
                     (read-file-name "Filename to save as: "
@@ -2383,21 +1822,7 @@ dumped with emacs."
                                     stub-fname
                                     nil
                                     stub-fname) dir))))
-    (unwind-protect
-       (progn
-         (or file-name
-             (setq-default url-be-asynchronous t))
-         (save-excursion
-           (set-buffer url-working-buffer)
-           (or file-name
-               (setq url-current-callback-data (list fname (current-buffer))
-                     url-be-asynchronous t
-                     url-current-callback-func 'w3-download-callback))
-           (url-retrieve url)
-           (and file-name
-                (w3-download-callback fname (current-buffer)))))
-      (or file-name
-         (setq-default url-be-asynchronous old-asynch)))))
+    (url-retrieve url 'w3-download-callback (list fname))))
 
 ;;;###autoload
 (defun w3-follow-link-other-frame (&optional p)
@@ -2422,7 +1847,7 @@ to disk."
         (href (and widget (widget-get widget :href))))
     (cond
      ((null href) nil)
-     ((or p w3-dump-to-disk)
+     (p
       (w3-download-url href))
      (t
       (w3-fetch href)))))
@@ -2571,7 +1996,7 @@ display the current buffer as HTML.
 Current keymap is:
 \\{w3-mode-map}"
   (interactive)
-  (or w3-setup-done (w3-do-setup))
+  (w3-do-setup)
   (if (interactive-p)
       (w3-preview-this-buffer)
     (let ((tmp (mapcar (function (lambda (x) (cons x (and (boundp x) 
(symbol-value x)))))
@@ -2585,13 +2010,11 @@ Current keymap is:
       (setq major-mode 'w3-mode)
       (w3-mode-version-specifics)
       (w3-menu-install-menus)
-      (setq url-current-passwd-count 0
-           truncate-lines t
+      (setq truncate-lines t
            mode-line-format w3-modeline-format)
       (run-hooks 'w3-mode-hook)
       (widget-setup))))
 
-(require 'mm)
 (require 'url)
 (require 'w3-parse)
 (require 'w3-display)
diff --git a/lisp/xml.el b/lisp/xml.el
deleted file mode 100644
index 98aad10..0000000
--- a/lisp/xml.el
+++ /dev/null
@@ -1,66 +0,0 @@
-;;; xml.el --- XML parser
-;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:12 $
-;; Version: $Revision: 1.1 $
-;; Keywords: 
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1997 - 1998 Free Software Foundation, Inc.
-;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(require 'cl)
-(require 'custom)
-
-(defgroup xml nil
-  "XML parsing options"
-  :group 'w3)
-
-(defcustom xml-parsing-program "xmlelisp"
-  "External program to parse XML documents."
-  :group 'xml
-  :type 'file)
-
-(defun xml-parse (&optional buffer)
-  "Parse contents of BUFFER as XML.
-BUFFER defaults to the current buffer.
-Destructively alters contents of BUFFER.
-Returns a data structure containing the parsed information."
-  (save-excursion
-    (let ((parse-buffer (generate-new-buffer " *xml*"))
-         (proc nil)
-         (marker (make-marker))
-         (done nil))
-      (if buffer (set-buffer buffer))
-      (unwind-protect
-         (progn
-           (setq proc (start-process "xml" parse-buffer xml-parsing-program 
"-"))
-           (if (not (eq (process-status proc) 'run))
-               (error "Could not start parsing process"))
-           (set-process-sentinel proc (lambda (proc string) (setq done t)))
-           (accept-process-output proc 0.5)
-           (process-send-string proc (buffer-substring (point-min) 
(point-max)))
-           (process-send-eof proc)
-           (while (not done)
-             (accept-process-output proc 1))
-           (set-buffer parse-buffer)
-           (goto-char (point-min))
-           (read parse-buffer))
-       (kill-buffer parse-buffer)))))
-       

commit 69ca5834ecd733ef9096e43ea67f565551535808
Author: William M. Perry <address@hidden>
Date:   Sat Nov 20 11:56:47 1999 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 20d881b..2359ff8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 1999-11-20  William M. Perry  <address@hidden>
 
+* lisp/url-news.el (url-news): Unhex article references, since netscape is
+  so dumb that they escape a '@' in an explicit article reference, which
+  is SUPPOSED TO BE HOW YOU TELL IT FROM A NEWSGROUP.  Lame.
+  (url-nntp): Ditto.
+
 * lisp/url-ldap.el (url-ldap-certificate-formatter): Make sure we require
   ssl before calling any of the functions.
 
diff --git a/etc/default.css b/etc/default.css
index 89a8f18..a57879e 100644
--- a/etc/default.css
+++ b/etc/default.css
@@ -299,6 +299,7 @@ a:visited { voice-family: betty;}
 
 } // @media speech
 
address@hidden experimental {
 table    { display: table; }
 tr       { display: table-row; }
 thead    { display: table-header-group; }
@@ -308,3 +309,4 @@ col      { display: table-column; }
 colgroup { display: table-column-group; }
 td, th   { display: table-cell; }
 caption  { display: table-caption; }
+} // @media experimental

commit 3aea44b55aeb12cf3841e554ff7b54770f1cd6ac
Author: William M. Perry <address@hidden>
Date:   Sat Nov 20 11:37:29 1999 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 666228f..20d881b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,26 @@
+1999-11-20  William M. Perry  <address@hidden>
+
+* lisp/url-ldap.el (url-ldap-certificate-formatter): Make sure we require
+  ssl before calling any of the functions.
+
+* lisp/w3-display.el (w3-insert-terminal-char): Nuke the 'face' property
+  on any inserted terminal characters, or we can get bold/red/etc table
+  borders - looks kind of odd.
+
 1999-11-14  William M. Perry  <address@hidden>
 
+* lisp/w3-display.el (w3-resurrect-hyperlinks): Skip over whitespace at
+  the beginning of hyperlinks, so mouse highlighting looks better.
+  (w3-resurrect-hyperlinks): Look for next property change from 'nd'
+  instead of 'st' - you cannot have overlapping hyperlinks, so this saves
+  quite a few iterations through the loop.
+  (w3-display-table): Nuke the w3-hyperlink-info text property on inserted
+  text.  This fixes a bug under XEmacs where hyperlinks in tables could
+  get _really_ confused when portions of the row needed to be filled -
+  hyperlinks would flow WAY past their end, and into the next row.
+
+* Emacs/W3 4.0.46 released
+
 * aclocal.m4 (AC_EMACS_LISP): work around bug in current Emacs 21.1
   pretests where (princ "foo") crashes in batch mode.
 
diff --git a/Makefile.in b/Makefile.in
index c24f9e3..449d657 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -63,7 +63,7 @@ DISTFILES    =  configure.in aclocal.m4 Makefile.in 
install-sh        \
                configure descrip.mms ChangeLog build.bat       \
                $(SUPPORTFILES)
 MAJOR = 4
-MINOR = 0pre
+MINOR = 0
 VERSION = $(MAJOR).$(MINOR).$(shell cat .version)
 DIRNAME = w3-$(VERSION)
 
diff --git a/etc/default.css b/etc/default.css
index 9e473b6..89a8f18 100644
--- a/etc/default.css
+++ b/etc/default.css
@@ -298,3 +298,13 @@ a:visited { voice-family: betty;}
  a:active { voice-family: betty; pitch-range: 8; pitch: 8 }
 
 } // @media speech
+
+table    { display: table; }
+tr       { display: table-row; }
+thead    { display: table-header-group; }
+tbody    { display: table-row-group; }
+tfoot    { display: table-footer-group; }
+col      { display: table-column; }
+colgroup { display: table-column-group; }
+td, th   { display: table-cell; }
+caption  { display: table-caption; }
diff --git a/lisp/url-ldap.el b/lisp/url-ldap.el
index b1e7801..35748a5 100644
--- a/lisp/url-ldap.el
+++ b/lisp/url-ldap.el
@@ -1,7 +1,7 @@
 ;;; url-ldap.el --- LDAP Uniform Resource Locator retrieval code
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/10/14 12:44:16 $
-;; Version: $Revision: 1.8 $
+;; Created: $Date: 1999/11/20 11:37:51 $
+;; Version: $Revision: 1.9 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -91,6 +91,7 @@
          "'>" dn "</a>"))
 
 (defun url-ldap-certificate-formatter (data)
+  (require 'ssl)
   (let ((vals (ssl-certificate-information data)))
     (if (not vals)
        "<b>Unable to parse certificate</b>"
diff --git a/lisp/url-news.el b/lisp/url-news.el
index d73dae4..e1f048e 100644
--- a/lisp/url-news.el
+++ b/lisp/url-news.el
@@ -1,7 +1,7 @@
 ;;; url-news.el --- News Uniform Resource Locator retrieval code
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/22 20:41:01 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/11/20 11:37:53 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -276,6 +276,7 @@
         (article-brackets nil)
         (article (url-filename urlobj)))
     (url-news-open-host host port (url-user urlobj) (url-password urlobj))
+    (setq article (url-unhex-string article))
     (cond
      ((string-match "@" article)       ; Its a specific article
       (url-news-fetch-message-id host port article))
@@ -295,6 +296,7 @@
         (article-brackets nil)
         (article (url-filename urlobj)))
     (url-news-open-host host port (url-user urlobj) (url-password urlobj))
+    (setq article (url-unhex-string article))
     (cond
      ((string-match "@" article)       ; Its a specific article
       (url-news-fetch-message-id host port article))
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 3c9ed4a..d9a388b 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/14 01:37:16 $
-;; Version: $Revision: 1.17 $
+;; Created: $Date: 1999/11/20 11:37:54 $
+;; Version: $Revision: 1.18 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1098,7 +1098,11 @@ w3-table-graphic-border-chars.")
                                          (or count 1) inherit)
                             (point))
                           w3-terminal-properties)
-    (insert-char (or character ? ) (or count 1) inherit)))
+    (remove-text-properties (point)
+                           (progn
+                             (insert-char (or character ? ) (or count 1) 
inherit)
+                             (point))
+                           '(face nil))))
 
 (defsubst w3-horizontal-rule-char ()
   (w3-table-lookup-char t nil t nil w3-horizontal-rule-char))
@@ -1659,14 +1663,22 @@ Can sometimes make the structure of a document clearer")
                       (skip-chars-backward " \t\n\r")
                       (delete-region (point) (point-max))
                       (if (>= fill-column (current-column))
-                          (insert-char ?  (- fill-column (current-column)) t))
+                          (let ((opos (point)))
+                            (insert-char ?  (- fill-column (current-column)) t)
+                            (remove-text-properties opos
+                                                    (point)
+                                                    '(w3-hyperlink-info nil))))
                       (goto-char (point-min))
                       ;; This gets our text properties out to the
                       ;; end of lines for table rows/cells with backgrounds
                       (while (not (eobp))
                         (re-search-forward "$" nil t)
                         (if (>= fill-column (current-column))
-                            (insert-char ?  (- fill-column (current-column)) 
t))
+                            (let ((opos (point)))
+                              (insert-char ?  (- fill-column (current-column)) 
t)
+                              (remove-text-properties opos
+                                                      (point)
+                                                      '(w3-hyperlink-info 
nil))))
                         (or (eobp) (forward-char 1)))
                       (aset formatted-cols i (extract-rectangle (point-min) 
(point-max)))
                       (delete-region (point-min) (point-max))
@@ -1993,11 +2005,14 @@ Format: (((image-alt row column) . offset) ...)")
        (set-keymap-parent w3-display-hackmap widget-button-keymap)
        (define-key w3-display-hackmap (vector w3-mouse-button3) 
'w3-popup-menu)))
   (let ((st (point-min))
+       (nd (point-min))
        (inhibit-read-only t)
-       info nd node face)
+       info node face)
     (while st
       (if (setq info (get-text-property st 'w3-hyperlink-info))
          (progn
+           (while (memq (char-after st) '(?\t ?\r ?\n ?\ ))
+             (setq st (1+ st)))
            (setq nd (or (next-single-property-change st 'w3-hyperlink-info)
                         (point-max)))
            (apply 'widget-convert-text 'link st nd st nd (nconc
@@ -2005,7 +2020,7 @@ Format: (((image-alt row column) . offset) ...)")
                                                                 :button-keymap 
w3-display-hackmap
                                                                 :end nd)
                                                           info))))
-      (setq st (next-single-property-change st 'w3-hyperlink-info)))))
+      (setq st (next-single-property-change nd 'w3-hyperlink-info)))))
 
 (defun w3-display-convert-arglist (args)
   (let ((rval nil)
diff --git a/texi/w3-faq.txi b/texi/w3-faq.txi
index 4dd77e4..30db1de 100644
--- a/texi/w3-faq.txi
+++ b/texi/w3-faq.txi
@@ -27,7 +27,7 @@ This is the Emacs/W3 Frequently Asked Questions list.
 @item
 Q1.1  What is the latest version of Emacs/W3?
 
-The latest version is $State: v4.0pre.46 $.
+The latest version is $State: v4.0pre.47 $.
 
 @item
 Q1.2  Where do I get Emacs/W3?
diff --git a/texi/w3.txi b/texi/w3.txi
index 5745eac..87f872e 100644
--- a/texi/w3.txi
+++ b/texi/w3.txi
@@ -12,7 +12,7 @@
 @c site: http://www.cs.indiana.edu/elisp/w3/docs.html
 @c
 @setfilename w3.info
address@hidden Emacs/W3 $State: v4.0pre.46 $ User's Manual
address@hidden Emacs/W3 $State: Exp $ User's Manual
 @iftex
 @c @finalout
 @end iftex
@@ -55,14 +55,14 @@ notice identical to this one except for the removal of this 
paragraph
 @sp 4
 @center Third Edition, Emacs/W3 Version 4.0
 @sp 1
address@hidden June 1998
address@hidden November 1999
 @sp 5
 @center William M. Perry
 @center @i{wmperry@@cs.indiana.edu}
 @page
 @vskip 0pt plus 1filll
 Copyright @copyright{} 1993 - 1995 William M. address@hidden
-Copyright @copyright{} 1996 - 1998 Free Software Foundation
+Copyright @copyright{} 1996 - 1999 Free Software Foundation
 
 Permission is granted to make and distribute verbatim copies address@hidden
 this manual provided the copyright notice and this permission address@hidden
@@ -89,7 +89,7 @@ cannot be modified to your satisfaction, please send mail to 
the
 @t{w3-beta@@xemacs.org} mailing list with any suggestions.
 @xref{Reporting Bugs}.
 
-This manual corresponds to Emacs/W3 $State: v4.0pre.46 $
+This manual corresponds to Emacs/W3 $State: Exp $
 
 @menu
 * Getting Started::             Getting up and running with Emacs/W3

commit e4a897f7c981405bb450e1ee38f7d1b27dee1cb4
Author: William M. Perry <address@hidden>
Date:   Sun Nov 14 21:53:12 1999 +0000

    *** empty log message ***

diff --git a/.version b/.version
index ea90ee3..9e5feb5 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-45
+46

commit b24e834bb85b324cdfd0af76760ee0c7f987a290
Author: William M. Perry <address@hidden>
Date:   Sun Nov 14 13:01:04 1999 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index e4bded4..666228f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+1999-11-14  William M. Perry  <address@hidden>
+
+* aclocal.m4 (AC_EMACS_LISP): work around bug in current Emacs 21.1
+  pretests where (princ "foo") crashes in batch mode.
+
 1999-11-13  William M. Perry  <address@hidden>
 
 * lisp/w3-cus.el (w3-use-terminal-glyphs): Changed default value to nil,
diff --git a/aclocal.m4 b/aclocal.m4
index 837e43f..58e7a0c 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -8,7 +8,7 @@ if test -z "$3"; then
 fi
 AC_CACHE_VAL(EMACS_cv_SYS_$1,[
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
        retval=`cat ${OUTPUT}`
        rm -f ${OUTPUT}
        EMACS_cv_SYS_$1=$retval
diff --git a/configure b/configure
index 4e5b8fd..9417378 100755
--- a/configure
+++ b/configure
@@ -1,7 +1,7 @@
 #! /bin/sh
 
 # Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.12 
+# Generated automatically using autoconf version 2.13 
 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
 #
 # This configure script is free software; the Free Software Foundation
@@ -65,6 +65,7 @@ mandir='${prefix}/man'
 # Initialize some other variables.
 subdirs=
 MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
 # Maximum number of lines to put in a shell here document.
 ac_max_here_lines=12
 
@@ -348,7 +349,7 @@ EOF
     verbose=yes ;;
 
   -version | --version | --versio | --versi | --vers)
-    echo "configure generated by autoconf version 2.12"
+    echo "configure generated by autoconf version 2.13"
     exit 0 ;;
 
   -with-* | --with-*)
@@ -518,9 +519,11 @@ ac_ext=c
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
-ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext 
$LIBS 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS 
conftest.$ac_ext $LIBS 1>&5'
 cross_compiling=$ac_cv_prog_cc_cross
 
+ac_exeext=
+ac_objext=o
 if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
   # Stardent Vistra SVR4 grep lacks -e, says address@hidden
   if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
@@ -563,26 +566,28 @@ ac_configure=$ac_aux_dir/configure # This should be 
Cygnus configure.
 # SunOS /usr/etc/install
 # IRIX /sbin/install
 # AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
 # AFS /usr/afsws/bin/install, which mishandles nonexistent args
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
 echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:571: checking for a BSD compatible install" >&5
+echo "configure:575: checking for a BSD compatible install" >&5
 if test -z "$INSTALL"; then
 
-  IFS="${IFS=  }"; ac_save_IFS="$IFS"; IFS="${IFS}:"
+  IFS="${IFS=  }"; ac_save_IFS="$IFS"; IFS=":"
   for ac_dir in $PATH; do
     # Account for people who put trailing slashes in PATH elements.
     case "$ac_dir/" in
     
/|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
     *)
       # OSF1 and SCO ODT 3.0 have their own names for install.
-      for ac_prog in ginstall installbsd scoinst install; do
+      # Don't use installbsd from OSF since it installs stuff as root
+      # by default.
+      for ac_prog in ginstall scoinst install; do
         if test -f $ac_dir/$ac_prog; then
          if test $ac_prog = install &&
             grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
            # AIX install.  It has an incompatible calling convention.
-           # OSF/1 installbsd also uses dspmsg, but is usable.
            :
          else
            ac_cv_path_install="$ac_dir/$ac_prog -c"
@@ -611,6 +616,8 @@ echo "$ac_t""$INSTALL" 1>&6
 # It thinks the first close brace ends the variable substitution.
 test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
 
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 
@@ -648,13 +655,14 @@ fi
 # Extract the first word of "texi2html", so it can be a program name with args.
 set dummy texi2html; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:652: checking for $ac_word" >&5
+echo "configure:659: checking for $ac_word" >&5
 
 if test -n "$TEXI2HTML"; then
   ac_cv_prog_TEXI2HTML="$TEXI2HTML" # Let the user override the test.
 else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  for ac_dir in $PATH; do
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
       ac_cv_prog_TEXI2HTML="texi2html"
@@ -674,13 +682,14 @@ fi
 # Extract the first word of "xemacs", so it can be a program name with args.
 set dummy xemacs; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:678: checking for $ac_word" >&5
+echo "configure:686: checking for $ac_word" >&5
 
 if test -n "$EMACS"; then
   ac_cv_prog_EMACS="$EMACS" # Let the user override the test.
 else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  for ac_dir in $PATH; do
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
       ac_cv_prog_EMACS="xemacs"
@@ -700,13 +709,14 @@ fi
 # Extract the first word of "makeinfo", so it can be a program name with args.
 set dummy makeinfo; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:704: checking for $ac_word" >&5
+echo "configure:713: checking for $ac_word" >&5
 
 if test -n "$MAKEINFO"; then
   ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test.
 else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  for ac_dir in $PATH; do
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
       ac_cv_prog_MAKEINFO="makeinfo"
@@ -726,13 +736,14 @@ fi
 # Extract the first word of "install-info", so it can be a program name with 
args.
 set dummy install-info; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:730: checking for $ac_word" >&5
+echo "configure:740: checking for $ac_word" >&5
 
 if test -n "$INSTALLINFO"; then
   ac_cv_prog_INSTALLINFO="$INSTALLINFO" # Let the user override the test.
 else
-  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-  for ac_dir in $PATH; do
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
     test -z "$ac_dir" && ac_dir=.
     if test -f $ac_dir/$ac_word; then
       ac_cv_prog_INSTALLINFO="install-info"
@@ -771,17 +782,17 @@ fi
 
   
   echo $ac_n "checking if $EMACS is really XEmacs""... $ac_c" 1>&6
-echo "configure:775: checking if $EMACS is really XEmacs" >&5
+echo "configure:786: checking if $EMACS is really XEmacs" >&5
   
 elisp="(if (string-match \"XEmacs\" emacs-version) \"yes\" \"no\") "
 if test -z ""noecho""; then
        echo $ac_n "checking for xemacsp""... $ac_c" 1>&6
-echo "configure:780: checking for xemacsp" >&5
+echo "configure:791: checking for xemacsp" >&5
 fi
 
 
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
        retval=`cat ${OUTPUT}`
        rm -f ${OUTPUT}
        EMACS_cv_SYS_xemacsp=$retval
@@ -803,17 +814,17 @@ fi
 
   if test "$prefix" = "NONE"; then
        echo $ac_n "checking prefix for your Emacs""... $ac_c" 1>&6
-echo "configure:807: checking prefix for your Emacs" >&5
+echo "configure:818: checking prefix for your Emacs" >&5
        
 elisp="(expand-file-name \"..\" invocation-directory)"
 if test -z ""noecho""; then
        echo $ac_n "checking for prefix""... $ac_c" 1>&6
-echo "configure:812: checking for prefix" >&5
+echo "configure:823: checking for prefix" >&5
 fi
 
 
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
        retval=`cat ${OUTPUT}`
        rm -f ${OUTPUT}
        EMACS_cv_SYS_prefix=$retval
@@ -834,7 +845,7 @@ if test "${with_lispdir+set}" = set; then
 fi
 
   echo $ac_n "checking where .elc files should go""... $ac_c" 1>&6
-echo "configure:838: checking where .elc files should go" >&5
+echo "configure:849: checking where .elc files should go" >&5
   if test -z "$lispdir"; then
         theprefix=$prefix
     if test "x$theprefix" = "xNONE"; then
@@ -855,17 +866,17 @@ echo "configure:838: checking where .elc files should go" 
>&5
 
 
 echo $ac_n "checking for emacs version""... $ac_c" 1>&6
-echo "configure:859: checking for emacs version" >&5
+echo "configure:870: checking for emacs version" >&5
 
 elisp="(and (boundp 'emacs-major-version) (format \"%d.%d\" 
emacs-major-version emacs-minor-version))"
 if test -z ""noecho""; then
        echo $ac_n "checking for version""... $ac_c" 1>&6
-echo "configure:864: checking for version" >&5
+echo "configure:875: checking for version" >&5
 fi
 
 
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
        retval=`cat ${OUTPUT}`
        rm -f ${OUTPUT}
        EMACS_cv_SYS_version=$retval
@@ -883,25 +894,25 @@ echo "$ac_t""${EMACS_VERSION}" 1>&6
 
 
 echo $ac_n "checking for acceptable custom library""... $ac_c" 1>&6
-echo "configure:887: checking for acceptable custom library" >&5
+echo "configure:898: checking for acceptable custom library" >&5
 
 
 
 if test -z ""noecho""; then
        echo $ac_n "checking for widget-convert-text in widget""... $ac_c" 1>&6
-echo "configure:893: checking for widget-convert-text in widget" >&5
+echo "configure:904: checking for widget-convert-text in widget" >&5
 fi
 library=`echo widget | tr _ -`
 
 elisp="(progn (fmakunbound 'widget-convert-text) (condition-case nil (progn 
(require '$library) (fboundp 'widget-convert-text)) (error nil)))"
 if test -z ""noecho""; then
        echo $ac_n "checking for widget""... $ac_c" 1>&6
-echo "configure:900: checking for widget" >&5
+echo "configure:911: checking for widget" >&5
 fi
 
 
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
        retval=`cat ${OUTPUT}`
        rm -f ${OUTPUT}
        EMACS_cv_SYS_widget=$retval
@@ -924,19 +935,19 @@ fi
 
 if test -z ""noecho""; then
        echo $ac_n "checking for widget-convert-text in wid_edit""... $ac_c" 
1>&6
-echo "configure:928: checking for widget-convert-text in wid_edit" >&5
+echo "configure:939: checking for widget-convert-text in wid_edit" >&5
 fi
 library=`echo wid_edit | tr _ -`
 
 elisp="(progn (fmakunbound 'widget-convert-text) (condition-case nil (progn 
(require '$library) (fboundp 'widget-convert-text)) (error nil)))"
 if test -z ""noecho""; then
        echo $ac_n "checking for wid_edit""... $ac_c" 1>&6
-echo "configure:935: checking for wid_edit" >&5
+echo "configure:946: checking for wid_edit" >&5
 fi
 
 
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
        retval=`cat ${OUTPUT}`
        rm -f ${OUTPUT}
        EMACS_cv_SYS_wid_edit=$retval
@@ -970,12 +981,12 @@ if test "${EMACS_cv_ACCEPTABLE_CUSTOM}" = "yes"; then
 elisp="(file-name-directory (locate-library \"widget\"))"
 if test -z ""noecho""; then
        echo $ac_n "checking for widget_dir""... $ac_c" 1>&6
-echo "configure:974: checking for widget_dir" >&5
+echo "configure:985: checking for widget_dir" >&5
 fi
 
 
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
        retval=`cat ${OUTPUT}`
        rm -f ${OUTPUT}
        EMACS_cv_SYS_widget_dir=$retval
@@ -1002,25 +1013,25 @@ fi
 
 
 echo $ac_n "checking for recent gnus version""... $ac_c" 1>&6
-echo "configure:1006: checking for recent gnus version" >&5
+echo "configure:1017: checking for recent gnus version" >&5
 
 
 
 if test -z ""noecho""; then
        echo $ac_n "checking for mm-get-content-id in mm_decode""... $ac_c" 1>&6
-echo "configure:1012: checking for mm-get-content-id in mm_decode" >&5
+echo "configure:1023: checking for mm-get-content-id in mm_decode" >&5
 fi
 library=`echo mm_decode | tr _ -`
 
 elisp="(progn (fmakunbound 'mm-get-content-id) (condition-case nil (progn 
(require '$library) (fboundp 'mm-get-content-id)) (error nil)))"
 if test -z ""noecho""; then
        echo $ac_n "checking for mm_decode""... $ac_c" 1>&6
-echo "configure:1019: checking for mm_decode" >&5
+echo "configure:1030: checking for mm_decode" >&5
 fi
 
 
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
        retval=`cat ${OUTPUT}`
        rm -f ${OUTPUT}
        EMACS_cv_SYS_mm_decode=$retval
@@ -1051,12 +1062,12 @@ if test "${EMACS_cv_ACCEPTABLE_GNUS}" = "yes"; then
 elisp="(file-name-directory (locate-library \"mm-decode\"))"
 if test -z ""noecho""; then
        echo $ac_n "checking for gnus_dir""... $ac_c" 1>&6
-echo "configure:1055: checking for gnus_dir" >&5
+echo "configure:1066: checking for gnus_dir" >&5
 fi
 
 
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
        retval=`cat ${OUTPUT}`
        rm -f ${OUTPUT}
        EMACS_cv_SYS_gnus_dir=$retval
@@ -1083,25 +1094,25 @@ fi
 
 
 echo $ac_n "checking how to rebuild custom autoloads""... $ac_c" 1>&6
-echo "configure:1087: checking how to rebuild custom autoloads" >&5
+echo "configure:1098: checking how to rebuild custom autoloads" >&5
 
 
 
 if test -z ""noecho""; then
        echo $ac_n "checking for Custom-make-dependencies in cus_dep""... 
$ac_c" 1>&6
-echo "configure:1093: checking for Custom-make-dependencies in cus_dep" >&5
+echo "configure:1104: checking for Custom-make-dependencies in cus_dep" >&5
 fi
 library=`echo cus_dep | tr _ -`
 
 elisp="(progn (fmakunbound 'Custom-make-dependencies) (condition-case nil 
(progn (require '$library) (fboundp 'Custom-make-dependencies)) (error nil)))"
 if test -z ""noecho""; then
        echo $ac_n "checking for cus_dep""... $ac_c" 1>&6
-echo "configure:1100: checking for cus_dep" >&5
+echo "configure:1111: checking for cus_dep" >&5
 fi
 
 
        OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (message \"%s\" x) (prin1-to-string x)) nil \"${OUTPUT}\"))" > /dev/null 
2>&1 
        retval=`cat ${OUTPUT}`
        rm -f ${OUTPUT}
        EMACS_cv_SYS_cus_dep=$retval
@@ -1227,7 +1238,7 @@ do
     echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create 
--no-recursion"
     exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create 
--no-recursion ;;
   -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
-    echo "$CONFIG_STATUS generated by autoconf version 2.12"
+    echo "$CONFIG_STATUS generated by autoconf version 2.13"
     exit 0 ;;
   -help | --help | --hel | --he | --h)
     echo "\$ac_cs_usage"; exit 0 ;;
@@ -1252,9 +1263,11 @@ sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; 
/@g\$/s/[\\\\&%]/\\\\&/g;
  s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
 $ac_vpsub
 $extrasub
address@hidden@%$SHELL%g
 address@hidden@%$CFLAGS%g
 address@hidden@%$CPPFLAGS%g
 address@hidden@%$CXXFLAGS%g
address@hidden@%$FFLAGS%g
 address@hidden@%$DEFS%g
 address@hidden@%$LDFLAGS%g
 address@hidden@%$LIBS%g
@@ -1274,6 +1287,7 @@ address@hidden@%$oldincludedir%g
 address@hidden@%$infodir%g
 address@hidden@%$mandir%g
 address@hidden@%$INSTALL_PROGRAM%g
address@hidden@%$INSTALL_SCRIPT%g
 address@hidden@%$INSTALL_DATA%g
 address@hidden@%$TEXI2HTML%g
 address@hidden@%$EMACS%g

commit e40e840f5fb09257f46925944a693819cbbb3dc2
Author: William M. Perry <address@hidden>
Date:   Sun Nov 14 01:37:07 1999 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index fe75aab..e4bded4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+1999-11-13  William M. Perry  <address@hidden>
+
+* lisp/w3-cus.el (w3-use-terminal-glyphs): Changed default value to nil,
+  was causing too many weirdnesses under Emacs (I loathe MULE sometimes)
+  (w3-use-terminal-characters): Ditto.
+
+* lisp/w3-display.el (w3-display-handle-java): Duh, give 2 arguments to
+  push.
+
 1999-11-12  William M. Perry  <address@hidden>
 
 * lisp/w3-display.el (w3-display-handle-java): Make sure that there is
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index a7fd21b..f4969bc 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -38,7 +38,7 @@ SOURCES =                                                     
        \
        w3-speak.el w3-latex.el w3-parse.el w3-display.el w3-print.el   \
        w3-about.el w3-hotindex.el w3-hot.el w3-e19.el w3-xemac.el      \
        w3.el w3-script.el w3-jscript.el w3-elisp.el w3-e20.el          \
-       w3-speak-table.el       
+       w3-speak-table.el w3-java.el
 
 OBJECTS = $(SOURCES:.el=.elc)
 
diff --git a/lisp/w3-cus.el b/lisp/w3-cus.el
index 6617fdf..f93db20 100644
--- a/lisp/w3-cus.el
+++ b/lisp/w3-cus.el
@@ -1,7 +1,7 @@
 ;;; w3-cus.el --- Customization support for Emacs-W3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/04/08 11:47:49 $
-;; Version: $Revision: 1.3 $
+;; Created: $Date: 1999/11/14 01:37:15 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: comm, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -192,7 +192,7 @@ If nil W3 will use a terminal graphic character if 
possible."
                       (symbol :tag "Coding system" :value 
,mule-no-coding-system))))
 
 ;;; these three variables control how w3-setup-terminal-chars works
-(defcustom w3-use-terminal-characters t
+(defcustom w3-use-terminal-characters nil
   "*Use terminal graphics characters for drawing tables and rules if available"
   :group 'w3-display
   :type 'boolean)
@@ -204,7 +204,7 @@ This triggers display bugs on both FSF Emacs and XEmacs.
   :group 'w3-display
   :type 'boolean)
 
-(defcustom w3-use-terminal-glyphs t
+(defcustom w3-use-terminal-glyphs nil
   "*Use glyphs if possible rather than properties for terminal graphics 
characters
 
 Glyphs are probably more efficient but don't work with the most recent versions
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index befc0ae..3c9ed4a 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/12 16:30:08 $
-;; Version: $Revision: 1.16 $
+;; Created: $Date: 1999/11/14 01:37:16 $
+;; Version: $Revision: 1.17 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2029,7 +2029,7 @@ Format: (((image-alt row column) . offset) ...)")
     (setq options (delq nil options)
          params (delq nil params))
     (if (not (assq 'codebase options))
-       (push (cons 'codebase (url-view-url t))))
+       (push (cons 'codebase (url-view-url t)) options))
     (w3-java-run-applet options params)))
 
 (defun w3-display-node (node &optional nofaces)

commit 3bf65e24bfe6551941f73606cdedd1419e286623
Author: William M. Perry <address@hidden>
Date:   Sat Nov 13 19:14:05 1999 +0000

    update mailing list addresses.

diff --git a/texi/w3.txi b/texi/w3.txi
index a164017..5745eac 100644
--- a/texi/w3.txi
+++ b/texi/w3.txi
@@ -12,7 +12,7 @@
 @c site: http://www.cs.indiana.edu/elisp/w3/docs.html
 @c
 @setfilename w3.info
address@hidden Emacs/W3 $State: v4.0pre.45 $ User's Manual
address@hidden Emacs/W3 $State: v4.0pre.46 $ User's Manual
 @iftex
 @c @finalout
 @end iftex
@@ -86,10 +86,10 @@ with the library.
 Emacs/W3 is completely customizable, both from Emacs-Lisp and from
 stylesheets @xref{Stylesheets}.  If there is any aspect of Emacs/W3 that
 cannot be modified to your satisfaction, please send mail to the
address@hidden@@indiana.edu} mailing list with any suggestions.
address@hidden@@xemacs.org} mailing list with any suggestions.
 @xref{Reporting Bugs}.
 
-This manual corresponds to Emacs/W3 $State: v4.0pre.45 $
+This manual corresponds to Emacs/W3 $State: v4.0pre.46 $
 
 @menu
 * Getting Started::             Getting up and running with Emacs/W3
@@ -4367,11 +4367,9 @@ Better integration with the parser
 @cindex Contacting the author
 
 If any bugs are discovered in Emacs/W3, please report them to the
-mailing list @t{w3-beta@@indiana.edu} --- this is where the brave souls
+mailing list @t{w3-beta@@xemacs.org} --- this is where the brave souls
 who beta test the latest versions of Emacs/W3 reside, and are generally
 very responsive to bug reports.
address@hidden gdj1: w3-submit-bug uses address@hidden rather than
address@hidden w3-beta@@indiana.edu, which is correct?
 @kindex w
 @findex w3-submit-bug
 Please make sure to use the bug submission feature of Emacs/W3, so that

commit 972d02cba315e2a5893b20572cc038f3c9660191
Author: William M. Perry <address@hidden>
Date:   Fri Nov 12 17:03:37 1999 +0000

    *** empty log message ***

diff --git a/.version b/.version
index c739b42..ea90ee3 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-44
+45

commit 067f5117df297ece0dd0af81f0eea912df0da61f
Author: William M. Perry <address@hidden>
Date:   Fri Nov 12 16:29:54 1999 +0000

    Added support for Java applets

diff --git a/ChangeLog b/ChangeLog
index 8cf35f3..fe75aab 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+1999-11-12  William M. Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-display-handle-java): Make sure that there is
+  ALWAYS a codebase attribute for java, or bad things could happen (like
+  not being able to find the classes since we write to a temp file, etc.)
+
+* lisp/w3-parse.el (w3-parse-buffer): Make sure that we expand the
+  'codebase' attribute.
+
+* lisp/w3-display.el (w3-auto-run-java): New variable to control whether
+  Java applets are run 
+  (w3-display-handle-java): New function to convert our internal parse
+  structure into something that `w3-java-run-applet' can understand.
+  (w3-display-node): Use it.
+
+* lisp/w3-java.el: New file for running java programs in an external
+  process.
+
+1999-11-07  Markus Rost  <address@hidden>
+
+* lisp/url.el (url-retrieve-internally): make-local-variable
+  'track-mouse to workaround problem with `widget-button-click'.
+
 1999-11-10  William M. Perry  <address@hidden>
 
 * lisp/w3-parse.el (textarea content model): Changed content model to
diff --git a/lisp/url.el b/lisp/url.el
index 2641c42..5a89219 100644
--- a/lisp/url.el
+++ b/lisp/url.el
@@ -1,13 +1,13 @@
 ;;; url.el --- Uniform Resource Locator retrieval tool
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/09 14:52:25 $
-;; Version: $Revision: 1.12 $
+;; Created: $Date: 1999/11/12 16:30:06 $
+;; Version: $Revision: 1.13 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;; LCD Archive Entry:
 ;;; url|William M. Perry|address@hidden|
 ;;; Functions for retrieving/manipulating URLs|
-;;; $Date: 1999/11/09 14:52:25 $|$Revision: 1.12 $|Location Undetermined
+;;; $Date: 1999/11/12 16:30:06 $|$Revision: 1.13 $|Location Undetermined
 ;;;
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2024,6 +2024,7 @@ retrieve a URL by its HTML source."
          url (if cached (url-cache-create-filename url) url))
     (save-excursion
       (set-buffer (get-buffer-create url-working-buffer))
+      (make-local-variable 'track-mouse)
       (if (boundp 'buffer-file-coding-system)
          (setq buffer-file-coding-system nil))
       (setq url-current-can-be-cached (not no-cache)
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index e357e9e..befc0ae 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/11 01:36:09 $
-;; Version: $Revision: 1.15 $
+;; Created: $Date: 1999/11/12 16:30:08 $
+;; Version: $Revision: 1.16 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2016,6 +2016,22 @@ Format: (((image-alt row column) . offset) ...)")
            rval (plist-put rval newsym (cdr cur))))
     rval))
 
+(defvar w3-auto-run-java nil
+  "*If non-nil, will cause Java applets to automatically be run in another 
process.")
+
+(defun w3-display-handle-java (node)
+  (let ((options (nth 1 node))
+       (params (mapcar (lambda (subnode)
+                         (if (eq (car-safe subnode) 'param)
+                             (cons (cdr-safe (assq 'name (nth 1 subnode)))
+                                   (cdr-safe (assq 'value (nth 1 subnode))))))
+                       (nth 2 node))))
+    (setq options (delq nil options)
+         params (delq nil params))
+    (if (not (assq 'codebase options))
+       (push (cons 'codebase (url-view-url t))))
+    (w3-java-run-applet options params)))
+
 (defun w3-display-node (node &optional nofaces)
   (let (
        (content-stack (list (list node)))
@@ -2265,8 +2281,9 @@ Format: (((image-alt row column) . offset) ...)")
                 (w3-handle-empty-tag)
               (w3-handle-content node)))
            (applet                     ; Wow, Java
-            (w3-handle-content node)
-            )
+            (if w3-auto-run-java
+                (w3-display-handle-java node)
+              (w3-handle-content node)))
            (script                     ; Scripts
             (w3-handle-empty-tag))
            ((embed object)             ; Embedded images/content
diff --git a/lisp/w3-java.el b/lisp/w3-java.el
new file mode 100644
index 0000000..d5b0a2d
--- /dev/null
+++ b/lisp/w3-java.el
@@ -0,0 +1,85 @@
+;;; w3-java.el --- Rudimentary java support
+;; Author: $Author: wmperry $
+;; Created: $Date: 1999/11/12 16:30:10 $
+;; Version: $Revision: 1.1 $
+;; Keywords: hypermedia, scripting
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1999 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defgroup w3-java nil
+  "Emacs/W3 Java Runtime support"
+  :prefix "w3-java"
+  :group 'w3)
+
+(defcustom w3-java-vm-program "hotjava"
+  "*The program name of the Java virtual machine."
+  :type '(choice (string :tag "External program")
+                (function :tag "Lisp function"))
+  :group 'w3-java)
+
+(defcustom w3-java-vm-arguments '(file)
+  "*Arguments that should be passed to the program `w3-java-vm-program'.
+The special symbol 'file may be used in the list of arguments and will
+be replaced with the name of a file containing the commands to run a
+Java applet."
+  :type 'list
+  :group 'w3-java)
+
+(defun w3-java-run-applet (options params)
+  (let ((file (url-generate-unique-filename "%s-runjava.html")))
+    (save-excursion
+      (set-buffer (get-buffer-create " *java*"))
+      (erase-buffer)
+      (insert "<html>\n"
+             " <head>\n"
+             "  <title>Emacs/W3 Java Application</title>\n"
+             " </head>\n"
+             " <body>\n"
+             "  <p>\n"
+             "   This page was automatically generated by Emacs/W3 to\n"
+             "   run this Java applet.  Any problems with the HTML should\n"
+             "   be referred to <a href='mailto:address@hidden'>\n"
+             "   the Emacs/W3 bug list</a>.\n"
+             "  </p>\n"
+             "  <hr>\n"
+             "  <applet "
+             (mapconcat (lambda (x) (format "%s=\"%s\"" (car x) (cdr x))) 
options " ")
+             ">\n"
+             (mapconcat (lambda (x) (format "   <param name=\"%s\" 
value=\"%s\">" (car x) (cdr x))) params "\n")
+             "  </applet>\n"
+             " </body>\n"
+             "</html>\n")
+      (write-region (point-min) (point-max) file)
+
+      (if (stringp w3-java-vm-program)
+         (let ((process-connection-type nil)
+               (proc nil))
+           (setq proc (eval
+                       (`
+                        (start-process name buffer w3-java-vm-program
+                                       (,@ w3-java-vm-arguments)))))
+           (process-kill-without-query proc)
+           proc)
+       (eval (` (funcall w3-java-vm-program
+                         (,@ w3-java-vm-arguments))))))))
+
+(provide 'w3-java)
diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index 5032be2..2339255 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -2399,6 +2399,7 @@ Returns a data structure containing the parsed 
information."
                                           (cdr w3-p-s-baseobject))))
                 ((setq w3-p-s-btdt (or (assq 'src tag-attributes)
                                        (assq 'background tag-attributes)
+                                       (assq 'codebase tag-attributes)
                                        (assq 'href tag-attributes)
                                        (assq 'action tag-attributes)))
                  (setcdr w3-p-s-btdt (url-expand-file-name (cdr w3-p-s-btdt)

commit 47c61886b39e903602c610c4eaa4174e99e3edae
Author: William M. Perry <address@hidden>
Date:   Thu Nov 11 01:36:01 1999 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 44c3102..8cf35f3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,31 @@
 1999-11-10  William M. Perry  <address@hidden>
 
+* lisp/w3-parse.el (textarea content model): Changed content model to
+  XCDATA so that markup can be included in the default text.
+
+* lisp/w3-menu.el (w3-menu-help-menu): Remove version information menu
+  item.  It hasn't been updated in years.
+
+1999-11-10  "T. V. Raman" <address@hidden>
+
+* lisp/w3-display.el (widget-convert-text): Added advice around this
+  function to preserve the 'personality' text property, otherwise
+  hyperlinks did not get the correct aural properties applied.
+
+1999-11-10  Thierry Emery <address@hidden>
+
+* lisp/w3-display.el (w3-maybe-start-image-download): typo.
+  (w3-handle-image): include row and column in hyperimage-info, to be used
+  in `w3-resurrect-images'.
+  (w3-resurrect-images): if `to-cut' gets negative, insert blanks.
+  (w3-display-node): in case of a frameset, checks rows as well.
+  (w3-frameset-dimensions-p): disregard anything containing "100%", such as
+  "100%,0".
+  (w3-display-frameset): Do not zap frameset-cardinal when computing
+  default dimensions. Memorize next window before drawing a frame, as its
+  HTML page may contain yet another (nested) frameset. Call `w3-warn' and
+  inhibit splitting the window when there is not enough room left.
+
 * lisp/mm.el (mm-parse-mailcap): Fix bad regexp for Emacs 21
 
 1999-11-09  William M. Perry  <address@hidden>
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index f17b723..e357e9e 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/10 15:28:58 $
-;; Version: $Revision: 1.14 $
+;; Created: $Date: 1999/11/11 01:36:09 $
+;; Version: $Revision: 1.15 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -140,6 +140,17 @@
 
 (make-variable-buffer-local 'w3-last-fill-pos)
 
+(defadvice widget-convert-text (around emacspeak pre act comp)
+  "Protect value of personality if set originally"
+  (let ((start (ad-get-arg 1))
+        (end (ad-get-arg 2))
+        (orig nil ))
+    (setq orig (get-text-property start 'personality))
+    ad-do-it 
+    (and orig 
+         (put-text-property start end 
+                            'personality orig))))
+
 (defconst w3-fill-prefixes-vector
   (let ((len 0)
         (prefix-vector (make-vector 80 nil)))
@@ -782,7 +793,7 @@ If the face already exists, it is unmodified."
          (eq (device-type) 'tty))      ; Why bother?
       (w3-add-delayed-graphic widget))
      ((not (w3-image-loadable-p src nil)) ; Hey, we can't load it!
-      (mesage "Skipping image %s" (url-basepath src t))
+      (message "Skipping image %s" (url-basepath src t))
       (w3-add-delayed-graphic widget))
      (t                                        ; Grab the images
       (let (
@@ -990,6 +1001,8 @@ If the face already exists, it is unmodified."
                         :href href        ; Hyperlink destination
                         :target target    ; target frame
                         :button-face face ; img:link or img:visited entry in 
stylesheet
+                        'row w3-display-current-row
+                        'column w3-display-current-col
                         )))
        (setq widget (apply (function widget-create) (cadr hyperimage-info)))
        (widget-put widget 'buffer (current-buffer))
@@ -1951,14 +1964,16 @@ Format: (((image-alt row column) . offset) ...)")
                  (delete-region st (+ st offset)))
              (setq to-cut (- (point-max) max)
                    new-offset (1+ (- nd st)))
-             (cond ((not (zerop to-cut))
+             (cond ((> to-cut 0)
                     ;; cut end of drawn-alt if too long after resurrection
                     (delete-region nd (+ nd to-cut))
                     (if offset-elt
                         (setcdr offset-elt (+ offset new-offset))
                       (setq w3-resurrect-images-offset
                             (cons (cons (list drawn-alt row col) new-offset)
-                                  w3-resurrect-images-offset))))))
+                                  w3-resurrect-images-offset))))
+                   ((< to-cut 0)
+                    (insert (make-string (- to-cut) ? )))))
            (widget-put widget 'buffer (current-buffer))
            (w3-maybe-start-image-download widget)
            (if (widget-get widget :from)
@@ -2212,7 +2227,8 @@ Format: (((image-alt row column) . offset) ...)")
             (if w3-display-frames
                 (let ((frames (nth 2 node))
                       (frameset-cardinal 0)
-                      (cols (cdr-safe (assq 'cols args))))
+                      (cols (cdr-safe (assq 'cols args)))
+                      (rows (cdr-safe (assq 'rows args))))
                   (while (and frames (memq (car (car frames)) '(frame 
frameset)))
                      (setq frameset-cardinal (1+ frameset-cardinal)
                            frames (cdr frames)))
@@ -2220,7 +2236,8 @@ Format: (((image-alt row column) . offset) ...)")
                               frameset-cardinal
                               (if (w3-frameset-dimensions-p cols)
                                   (assq 'cols args)
-                                (assq 'rows args)))
+                                (if (w3-frameset-dimensions-p rows)
+                                    (assq 'rows args))))
                         w3-frameset-structure)
                   (w3-handle-content node))
               (w3-handle-content node)))
@@ -2784,7 +2801,7 @@ Format: (((image-alt row column) . offset) ...)")
       (setq-default url-be-asynchronous old-asynch))))
 
 (defun w3-frameset-dimensions-p (str)
-  (and str (not (string-equal str "*")) (not (string-equal str "100%"))))
+  (and str (not (string-equal str "*")) (not (string-match "100%" str))))
 
 (defun w3-display-frameset (frameset-structure)
   (let* ((structure frameset-structure)
@@ -2797,7 +2814,8 @@ Format: (((image-alt row column) . offset) ...)")
                        w3-tty-char-width))
         (char-height (if (> (frame-char-height) 1)
                          (frame-char-height)
-                       w3-tty-char-height)))
+                       w3-tty-char-height))
+        (inhibit-frame nil))
     (pop structure)
     ;; columns ?
     (if (w3-frameset-dimensions-p cols)
@@ -2808,32 +2826,58 @@ Format: (((image-alt row column) . offset) ...)")
          (setq rows (w3-decode-frameset-dimensions
                      rows (window-height) window-min-height char-height))
        ;; default: columns of equal width
-       (let ((fwidth (/ (window-width) frameset-cardinal)))
-         (while (> frameset-cardinal 0)
+       (let ((fwidth (/ (window-width) frameset-cardinal))
+             (cardinal frameset-cardinal))
+         (while (> cardinal 0)
            (push fwidth cols)
-           (setq frameset-cardinal (1- frameset-cardinal))))))
+           (setq cardinal (1- cardinal))))))
     (while (> frameset-cardinal 0)
       (cond ((cdr cols)
-            (split-window-horizontally (car cols))
+            (if (or (< (car cols) window-min-width)
+                    (< (- (window-width) (car cols)) window-min-width))
+                (setq inhibit-frame (format "Width %d" (window-width)))
+              (split-window-horizontally (car cols)))
             (pop cols))
            ((cdr rows)
-            (split-window-vertically (car rows))
+            (if (or (< (car rows) window-min-height)
+                    (< (- (window-height) (car rows)) window-min-height))
+                (setq inhibit-frame (format "Height %d" (window-height)))
+              (split-window-vertically (car rows)))
             (pop rows)))
       (cond ((eq (car (car structure)) 'frame)
             (let ((href (nth 2 (car structure)))
                   (name (nth 1 (car structure)))
                   (url-working-buffer url-default-working-buffer) ; in case 
url-multiple-p is t
-                  (w3-notify 'semibully))
+                  (w3-notify 'semibully)
+                  (next-frame-window (next-window)))
               (pop structure)
-              (w3-fetch href)
-              (let ((buf (current-buffer)))
-                (set-buffer (url-buffer-visiting href))
-                (setq w3-frame-name name
-                      w3-target-window-distances nil)
-                (set-buffer buf))
-              (other-window 1)))
+              (cond (inhibit-frame
+                     (w3-warn 'html (format "%s insufficient to split windows 
for HTML frame \"%s\""
+                                            inhibit-frame name))
+                     (setq inhibit-frame nil
+                           next-frame-window (selected-window)))
+                    (t
+                     (w3-fetch href)))
+              (let ((buf (current-buffer))
+                    (framebuf (url-buffer-visiting href)))
+                (cond (framebuf
+                       (set-buffer framebuf)
+                       (setq w3-frame-name name
+                             w3-target-window-distances nil)
+                       (set-buffer buf)
+                       (select-window next-frame-window))))))
            ((eq (car (car structure)) 'frameset)
-            (setq structure (w3-display-frameset structure))))
+            (cond (inhibit-frame
+                   (w3-warn 'html (format "%s insufficient to split windows 
for HTML frameset"
+                                          inhibit-frame))
+                   (let ((sub-frameset-cardinal (cadr (car structure))))
+                     (pop structure)
+                     (while (> sub-frameset-cardinal 0)
+                       (pop structure)
+                       (setq sub-frameset-cardinal (1- 
sub-frameset-cardinal))))
+                   (setq inhibit-frame nil))
+                  (t
+                   (setq structure (w3-display-frameset structure))))))
       (setq frameset-cardinal (1- frameset-cardinal)))
     structure))
 
@@ -2884,12 +2928,19 @@ Format: (((image-alt row column) . offset) ...)")
                                  dimensions))
                           (t
                            ;; absolute number: pixel height
-                           (push (max (1+ (/ (car (read-from-string match))
-                                             pixel-dim))
-                                      min-dim)
-                                 dimensions)))
-                    (setq remaining-available-dimension
-                          (- remaining-available-dimension (car 
dimensions)))))))
+                           (let* ((dim-in-pixels (car (read-from-string 
match)))
+                                  (dim (max (/ dim-in-pixels pixel-dim)
+                                            min-dim)))
+                             (cond ((<= dim remaining-available-dimension)
+                                    (push dim dimensions)
+                                    (setq remaining-available-dimension
+                                          (- remaining-available-dimension 
(car dimensions))))
+                                   (t
+                                    (w3-warn 'html (format "Frame dimension 
too large: %d" dim-in-pixels))
+                                    ;; too large: replace with *
+                                    (push '* dimensions)
+                                    (setq nb-stars (1+ nb-stars)
+                                          norm-stars (1+ norm-stars)))))))))))
          (if (zerop nb-stars)
              ;; push => reverse order
              (reverse dimensions)
diff --git a/lisp/w3-menu.el b/lisp/w3-menu.el
index ecf5118..5b792dc 100644
--- a/lisp/w3-menu.el
+++ b/lisp/w3-menu.el
@@ -1,7 +1,7 @@
 ;;; w3-menu.el --- Menu functions for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/08/09 13:47:56 $
-;; Version: $Revision: 1.3 $
+;; Created: $Date: 1999/11/11 01:36:11 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: menu, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -461,11 +461,6 @@ on that platform."
    "Help"
    ["About Emacs-w3" (w3-fetch "about:") t]
    ["Manual" (w3-fetch (concat w3-documentation-root "docs/w3_toc.html")) t]
-   "---"
-   ["Version Information..."
-    (w3-fetch
-     (concat w3-documentation-root "help/version_" w3-version-number ".html"))
-    t]
    ["On FAQ" (w3-fetch (concat w3-documentation-root "help/FAQ.html")) t]
    "---"
    ["Mail Developer(s)" w3-submit-bug t]
diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index 70cb6f2..5032be2 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -1440,7 +1440,7 @@ skip-chars-forward."
        ;; TEXTAREA - - (#PCDATA) -(INPUT|TEXTAREA|KEYGEN|SELECT)
        ((textarea)
         ;; Same comment as for OPTION about RCDATA.
-        (content-model . [((*data) include-space nil nil)])
+        (content-model . XCDATA) ;;;[((*data) include-space nil nil)])
         (exclusions . (input select label keygen textarea)))
        ((hr br img isindex input keygen overlay wbr spot tab
             %headempty %mathdelims)

commit 283193e463fb307d185d11971716d249817f3a38
Author: William M. Perry <address@hidden>
Date:   Wed Nov 10 15:28:43 1999 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index ef1f9bc..44c3102 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+1999-11-10  William M. Perry  <address@hidden>
+
+* lisp/mm.el (mm-parse-mailcap): Fix bad regexp for Emacs 21
+
 1999-11-09  William M. Perry  <address@hidden>
 
 * build.bat: Make sure to build custom load files and info files.
diff --git a/lisp/mm.el b/lisp/mm.el
index 3487bd2..b4307c9 100644
--- a/lisp/mm.el
+++ b/lisp/mm.el
@@ -468,7 +468,7 @@ It has the same format as `mm-mime-data-default'.")
       (mm-replace-regexp "#.*" "")              ; Remove all comments
       (mm-replace-regexp "\n+" "\n")         ; And blank lines
       (mm-replace-regexp "\\\\[ \t\n]+" " ") ; And collapse spaces
-      (mm-replace-regexp (regexp-quote "+") (regexp-quote (regexp-quote "+"))) 
; and +s
+      (mm-replace-regexp "\\+" "\\\\+") ; and +s
       (mm-replace-regexp (concat (regexp-quote "\\") "[ \t]*\n") "")
       (goto-char (point-max))
       (skip-chars-backward " \t\n")
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 2d91fa8..f17b723 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/09 14:52:29 $
-;; Version: $Revision: 1.13 $
+;; Created: $Date: 1999/11/10 15:28:58 $
+;; Version: $Revision: 1.14 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -818,7 +818,6 @@ If the face already exists, it is unmodified."
 (defun w3-maybe-start-background-image-download (src face)
   (let* ((cached-glyph (w3-image-cached-p src))
         (buf (current-buffer)))
-    (debug)
     (cond
      ((and cached-glyph
           (widget-glyphp cached-glyph)
diff --git a/lisp/w3-forms.el b/lisp/w3-forms.el
index cf6cbb9..08a4c03 100644
--- a/lisp/w3-forms.el
+++ b/lisp/w3-forms.el
@@ -1,7 +1,7 @@
 ;;; w3-forms.el --- Emacs-w3 forms parsing code for new display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/10/12 14:14:50 $
-;; Version: $Revision: 1.5 $
+;; Created: $Date: 1999/11/10 15:29:01 $
+;; Version: $Revision: 1.6 $
 ;; Keywords: faces, help, comm, data, languages
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -134,12 +134,11 @@
                         "Form-Image"))))
     (option
      (let ((options (copy-sequence (w3-form-element-options el))))
-       (or size
-          (length (caar (sort options
-                              (function
-                               (lambda (x y)
-                                 (>= (length (car x))
-                                     (length (car y)))))))))))
+       (length (caar (sort options
+                          (function
+                           (lambda (x y)
+                             (>= (length (car x))
+                                 (length (car y))))))))))
     (keygen
      (+ (length "Key Length: ")
        (apply 'max

commit a4330eb9b9b82d9720330f4d56f12457b72e7ac9
Author: William M. Perry <address@hidden>
Date:   Tue Nov 9 19:56:22 1999 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 776aaad..ef1f9bc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 1999-11-09  William M. Perry  <address@hidden>
 
+* build.bat: Make sure to build custom load files and info files.
+
 * lisp/url-auth.el (url-register-auth-scheme): removed warning when
   replacing auth methods.
 
diff --git a/build.bat b/build.bat
index a9a7f92..bdad66d 100644
--- a/build.bat
+++ b/build.bat
@@ -20,5 +20,11 @@ set GNUSDIR=%EMACSDIR%\lisp
 cd lisp
 copy w3-cfg.nt w3-cfg.el
 %EMACS% -batch -q -l ./docomp.el -f emacs-batch-build-autoloads . 
auto-autoloads.el
+%EMACS% -batch -q -l ./docomp.el -f emacs-batch-build-custom-load .
 %EMACS% -batch -q -l ./docomp.el -f compile-it
 cd ..
+
+cd texi
+%EMACS% -batch -q -no-site-file w3-faq.txi -l texinfmt -f 
texinfo-format-buffer -f save-buffer
+%EMACS% -batch -q -no-site-file w3.txi -l texinfmt -f texinfo-format-buffer -f 
save-buffer
+cd ..
diff --git a/lisp/css.el b/lisp/css.el
index 0d3c39f..f0e9c3d 100644
--- a/lisp/css.el
+++ b/lisp/css.el
@@ -1,7 +1,7 @@
 ;;; css.el -- Cascading Style Sheet parser
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/22 20:40:13 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/11/09 19:56:30 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -719,7 +719,8 @@ For a terminal frame, the value is always 1."
          (insert data)))))
 
 (defun css-handle-import (data)
-  (let (url)
+  (let (url purl)
+    (setq purl url-current-object)
     (setq url (css-expand-value 'url data))
     (and url
         (let ((url-working-buffer (generate-new-buffer-name " *styleimport*"))
diff --git a/lisp/url-http.el b/lisp/url-http.el
index 170797a..505f011 100644
--- a/lisp/url-http.el
+++ b/lisp/url-http.el
@@ -1,7 +1,7 @@
 ;;; url-http.el --- HTTP Uniform Resource Locator retrieval code
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/11/09 14:52:23 $
-;; Version: $Revision: 1.4 $
+;; Created: $Date: 1999/11/09 19:56:32 $
+;; Version: $Revision: 1.5 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -172,7 +172,7 @@
            "%s %s HTTP/1.0\r\n"        ; The request
            "MIME-Version: 1.0\r\n"     ; Version of MIME we speaketh
            "Extension: %s\r\n"         ; HTTP extensions we support
-           "Host: %s:%d\r\n"           ; Who we want to talk to
+           "Host: %s:%s\r\n"           ; Who we want to talk to
            "%s"                        ; Who its from
            "Accept-encoding: %s\r\n"   ; Encodings we understand
            "%s"                        ; Languages we understand
diff --git a/texi/w3.txi b/texi/w3.txi
index eab0bd6..a164017 100644
--- a/texi/w3.txi
+++ b/texi/w3.txi
@@ -12,9 +12,9 @@
 @c site: http://www.cs.indiana.edu/elisp/w3/docs.html
 @c
 @setfilename w3.info
address@hidden Emacs/W3 $State: Exp $ User's Manual
address@hidden Emacs/W3 $State: v4.0pre.45 $ User's Manual
 @iftex
address@hidden
address@hidden @finalout
 @end iftex
 @c @setchapternewpage odd
 @c @smallbook
@@ -70,7 +70,6 @@ are preserved on all copies.
 
 @end titlepage
 @page
address@hidden
 @node Top, Getting Started, (dir), (dir)
 @top W3
 
@@ -90,7 +89,7 @@ cannot be modified to your satisfaction, please send mail to 
the
 @t{w3-beta@@indiana.edu} mailing list with any suggestions.
 @xref{Reporting Bugs}.
 
-This manual corresponds to Emacs/W3 $State: Exp $
+This manual corresponds to Emacs/W3 $State: v4.0pre.45 $
 
 @menu
 * Getting Started::             Getting up and running with Emacs/W3
@@ -124,7 +123,6 @@ Indices:
 * General Index::               General Index.
 * Key Index::                   Menus of command keys and their references.
 @end menu
address@hidden ifinfo
 
 @node Getting Started, Basic Usage, Top, Top
 @chapter Getting Started
@@ -191,33 +189,34 @@ Emacs/W3 will work with Emacs 19.29 and later and XEmacs 
19.14 and later,
 but if you're using a 19.x Emacs then you will need to get the
 latest custom and widget libraries.
 
-If you want to get hold of Emacs then the latest version will be
-available from the GNU archive @uref{ftp://prep.ai.mit.edu/pub/gnu} or
-one of it's many mirrors.  @uref{http://www.xemacs.org/} will tell you
-how to get hold of the latest version of XEmacs --- once again there are
-plenty of sites that have mirrors.
address@hidden @asis
address@hidden Emacs
+Available from the GNU archive @uref{ftp://prep.ai.mit.edu/pub/gnu} or
+one of it's many mirrors.
 
address@hidden info: find better url
-Emacs/W3 itself is available from
address@hidden://ftp.cs.indiana.edu/pub/elisp/w3/.betas/w3.tar.gz} and up to
-date information can be found at
address@hidden://www.cs.indiana.edu/elisp/w3/docs.html}.  The latest custom
-and widget libraries are available from
address@hidden://ftp.cs.indiana.edu/pub/elisp/w3/custom.tar.gz}.
address@hidden XEmacs
+Available from the XEmacs archive @uref{http://www.xemacs.org/} or one
+of it's many mirrors.
 
-:: WORK :: Where to download related utilities (netpbm, xv, gimp, etc.)
address@hidden info: Why are these useful?
address@hidden Emacs/W3
address@hidden://www.cs.indiana.edu/elisp/w3/docs.html} is the main
+distribution point for Emacs/W3.
 
-http://www.research.digital.com/CRL/personal/raman/emacspeak/emacspeak.html
address@hidden Emacspeak
+A speech synthesizer package for Emacs and XEmacs.  More information is
+available at
address@hidden://www.cs.cornell.edu/Info/People/raman/emacspeak/}
+
address@hidden table
 
 @node Building and Installing, Startup Files, Downloading, Getting Started
 @section Building and Installing
 
-Emacs/W3 uses GNU @samp{configure} (@pxref{Top, , ,configure}) to control
-installation.  @samp{configure} will attempt to find what Emacsen you have and
-where they live.  If it finds both Emacs and XEmacs, then XEmacs is used
-(but see below for how to change this).  Apart from the usual options,
-the following options are accepted:
+Emacs/W3 uses GNU @samp{configure} (@pxref{Top, , ,configure}) to
+control installation.  configure will attempt to find what version of
+Emacs you have and where it is installed.  If it finds both Emacs and
+XEmacs, then XEmacs is used (but see below for how to change this).
+Apart from the usual options, the following options are accepted:
 
 @table @samp
 @item --with-xemacs
@@ -225,8 +224,8 @@ Use XEmacs.
 @item --with-emacs
 Use Emacs.
 @item address@hidden
-Put lisp files (*.el and *.elc) in @var{dir}.  If this isn't specified,
-and nor is @samp{--with-package-dir}, then the lisp files go into
+Put lisp files (*.el and *.elc) in @var{dir}.  If this is not specified,
+and neither is @samp{--with-package-dir}, then the lisp files go into
 @address@hidden/site-lisp}.
 @item address@hidden
 If using XEmacs, install Emacs/W3 as a package in @var{dir}.  Please
@@ -255,8 +254,7 @@ This is the top level directory and by default everything 
is installed
 somewhere below this.  This is @file{/usr/local} by default.
 @item address@hidden
 Where to put the info files.  This is @address@hidden/info} by
-default unless @address@hidden was given in
-which case it is @address@hidden/info}.
+default.
 @item address@hidden
 Where to put date files (default stylesheets).  This is @address@hidden/share} 
by
 default unless @address@hidden was given in
@@ -1361,16 +1359,9 @@ being the function.
 @code{w3-default-image-alt-func} returns @code{w3-dummy-img-alt-repl}
 (@samp{*} by default) if the image's height and width are both less than
 @code{w3-min-img-size} pixels (15 by default) and if the filename
-matches the @code{w3-dummy-img-re} regular expression
-(@samp{"\\b\\(boule\\|bullet\\|dot\\|pebble[0-9]*[a-z]?[0-9]*\\|pixel\\)\\b"}
-by default).  Otherwise, @code{w3-default-image-alt-func} returns the
-filename enclosed in a @samp{[]} pair.
-
address@hidden w3-icon-directory
address@hidden w3-icon-directory
-Emacs/W3 will look for standard icons in the directory specified by
address@hidden  It must end in a slash and is
address@hidden://cs.indiana.edu/elisp/w3/icons/} by default.
+matches the @code{w3-dummy-img-re} regular expression.  Otherwise,
address@hidden returns the filename enclosed in a
address@hidden pair.
 
 @item w3-icon-format
 @vindex w3-icon-format
@@ -1894,7 +1885,7 @@ type, word or group is repeated at least A and at most B 
times.
 
 Other than the value the following information is also shown.
 
address@hidden @columnfractions .20 .8
address@hidden @columnfractions .3 .7
 @item Supported Values: @tab If this is present, it lists the parts of
 the specification that Emacs/W3 currently supports.
 @item Unsupported Values: @tab If this is present, it represents the
@@ -2066,7 +2057,7 @@ letters, etc. CSS1 has no properties that select those.
 @node font-weight, font-size, font-variant, Font Properties
 @subsubsection font-weight
 
address@hidden @columnfractions .2 .8
address@hidden @columnfractions .3 .7
 @item Supported Values: @tab normal | bold | 100 | 200 | 300 | 400 | 500 | 600 
| 700 | 800 | 900
 @item Unsupported Values: @tab bolder | lighter
 @item Initial: @tab normal
@@ -2105,7 +2096,7 @@ less dark than the faces of lighter values.
 @node font-size, font, font-weight, Font Properties
 @subsubsection font-size
 
address@hidden @columnfractions .2 .8
address@hidden @columnfractions .3 .7
 @item Supported Values: @tab <absolute-size> | <length>
 @item Unsupported Values: @tab <percentage> | <relative-size>
 @item Initial: @tab medium
@@ -2369,7 +2360,7 @@ properties have been specified.
 @node word-spacing, letter-spacing, Text Properties, Text Properties
 @subsubsection word-spacing
 
address@hidden @columnfractions .2 .8
address@hidden @columnfractions .3 .7
 @item Supported Values: @tab normal
 @item Unsupported Values: @tab <length>
 @item Initial: @tab normal
@@ -2397,7 +2388,7 @@ Emacs.  It may  be implemented in the future.
 @node letter-spacing, text-decoration, word-spacing, Text Properties
 @subsubsection letter-spacing
 
address@hidden @columnfractions .2 .8
address@hidden @columnfractions .3 .7
 @item Supported Values: @tab normal
 @item Unsupported Values: @tab <length>
 @item Initial: @tab normal
@@ -2425,7 +2416,7 @@ Emacs.  It may be implemented in the future.
 @node text-decoration, vertical-align, letter-spacing, Text Properties
 @subsubsection text-decoration
 
address@hidden @columnfractions .2 .8
address@hidden @columnfractions .3 .7
 @item Supported Values: @tab none | underline | line-through | blink
 @item Unsupported Values: @tab overline 
 @item Initial: @tab none
@@ -2467,7 +2458,7 @@ This is currently unsupported in Emacs/W3.
 @node text-transform, text-align, vertical-align, Text Properties
 @subsubsection text-transform
 
address@hidden @columnfractions .2 .8
address@hidden @columnfractions .3 .7
 @item Supported Values: @tab none
 @item Unsupported Values: @tab capitalize | uppercase | lowercase
 @item Initial: @tab none
@@ -2669,7 +2660,7 @@ NOTE: This is currently unimplemented in Emacs/W3.
 @node list-style-position, list-style, list-style-image, Classification
 @subsubsection list-style-position
 
address@hidden @columnfractions .2 .8
address@hidden @columnfractions .3 .7
 @item Supported Values: @tab outside
 @item Unsupported Values: @tab inside
 @item Initial: @tab outside
@@ -3350,8 +3341,8 @@ Email messages are defined in @sc{rfc}822.
 @cindex mailserver
 @cindex mailserver @sc{url}s
 A mailserver @sc{url} allows you to send an email to a person, but this
address@hidden optionly specifies a subject and a body; thus
address@hidden:address@hidden/@var{subject}[/@var{body}]}
address@hidden optionally specifies a subject and a body.  The basic format is
address@hidden:address@hidden/@var{subject}[/@var{body}]}.  Thus,
 @samp{mailserver:foo@@bar.com/wibble/flibble} will compose a message to
 foo@@bar.com with @var{subject} as the subject and @var{body} already in
 the body of the email.  Note that both the subject and the body are
@@ -3590,10 +3581,9 @@ address@hidden is ftp://ds.internic.net/internet-drafts}.
 @cindex Gag Puke Retch
 @cindex Exportability
 @cindex Export Restrictions
-SSL is the @code{Secure Sockets Layer} interface developed by Netscape
-Communications @footnote{http://www.netscape.com/}.  Emacs/W3 supports
address@hidden transfers over an SSL encrypted channel, if the appropriate files
-have been installed.  @xref{Installing SSL}.
+SSL is the @code{Secure Sockets Layer} interface.  Emacs/W3 supports
address@hidden transfers over an SSL encrypted channel, if the appropriate
+files have been installed.  @xref{Installing SSL}.
 @end table
 
 @section Privacy
@@ -3648,13 +3638,12 @@ processed by the program (indeed the program may not 
even know
 what data they hold or what format it's in) but is passed to libraries or
 servers which do understand it.} are used to add state to @sc{http}
 sessions.  Cookies are defined in @sc{rfc2109}.
address@hidden gdj1: but does Emacs/W3 only support Netscape cookies?
 
 @vindex url-cookie-file
-Cookies are saved in a file in @code{url-cookie-file}, which is
address@hidden@var{w3-configuration-directory}/cookies} by default.  Note that
-this file should probably not be world writable, and possibly not even
-world readable.
+Cookies are saved in the file specified in @code{url-cookie-file}, which
+is @address@hidden/cookies} by default.  Note
+that this file should probably not be world writable, and possibly not
+even world readable.
 
 @vindex url-cookie-untrusted-urls
 @vindex url-cookie-trusted-urls
@@ -3869,8 +3858,7 @@ will be used instead.
 @item w3-latex-docstyle
 @vindex w3-latex-docstyle
 The document style to use when printing or mailing converted @sc{html} files
-in LaTeX.  Good defaults are: @address@hidden, [psfig,address@hidden@},
-etc.
+in LaTeX.
 @item w3-latex-packages
 @vindex w3-latex-packages
 List of LaTeX packages to include.  Currently this is only used if 
@@ -4108,9 +4096,8 @@ default to that, otherwise @file{/tmp}.
 
 @item w3-documentation-root
 @vindex w3-documentation-root
-This specifies the location of the Emacs/W3 documentation, it is
address@hidden://www.cs.indiana.edu/elisp/w3/} by default and @emph{must} end
-in a slash.
+This specifies the location of the Emacs/W3 documentation, it
address@hidden end in a slash.
 
 @item w3-popup-menu-on-mouse-3
 @vindex w3-popup-menu-on-mouse-3
@@ -4191,7 +4178,7 @@ interested in the internals of Emacs/W3, and doing active 
development work.
 Pretty dead right now, but I hope it will grow.
 @end itemize
 
-For more help on the World Wide Web in general, please refer to the
+For help on the World Wide Web in general, please refer to the
 comp.infosystems.www.* newsgroups.  There are also several discussion
 lists concerning the Web.  Send mail to @i{<listname>-request@@w3.org}
 with a subject line of 'subscribe <listname>'.  All mail should go to
@@ -4682,8 +4669,9 @@ the special "no_proxy" entry, it should be a regular 
expression that
 matches any hostnames that should be contacted directly.
 
 @example
-(setq url-proxy-services '(("http"     . "proxy.aventail.com:80")
-                           ("no_proxy" . "^.*\\(aventail\\|seanet\\)\.com")))
+(setq url-proxy-services
+       '(("http"     . "proxy.aventail.com:80")
+         ("no_proxy" . "^.*\\(aventail\\|seanet\\)\.com")))
 @end example
 
 @node Installing SSL, Mailcap Files, Proxy Gateways, Top
@@ -4724,7 +4712,9 @@ and will be replaced with the hostname and service/port 
that will be
 connected to.
 
 @example
-(setq ssl-program-arguments '("-host" host "-port" service "-verify" "4"
+(setq ssl-program-arguments '("-host" host
+                              "-port" service
+                              "-verify" "4"
                               "-CApath /usr/local/ssl/certs"))
 @end example
 @end table

commit 0ba0bf431db2043d7af1ec2b1d470ca33f7f729d
Author: William M. Perry <address@hidden>
Date:   Tue Nov 9 14:51:56 1999 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 75f9c77..776aaad 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,35 @@
+1999-11-09  William M. Perry  <address@hidden>
+
+* lisp/url-auth.el (url-register-auth-scheme): removed warning when
+  replacing auth methods.
+
+* lisp/url-file.el (url-file): Honor port numbers in ftp URLs.
+
+1999-11-09  James LewisMoss  <address@hidden>
+
+* lisp/mm.el (mm-parse-mailcap): Fix invalid regular expressions caused by
+  entries like "text/x-c++"
+
+1999-11-09  Andrew Mazillius  <address@hidden>
+
+* lisp/socks.el (socks-nslookup-host): Make sure that we always call
+  accept-process-output at least once.  Now deals correctly with multiple
+  addresses returned by nslookup in the format 'Addresses: ip1, ip2, ip3'
+
+1999-11-09  address@hidden (Kyotaro HORIGUCHI)
+
+* lisp/mule-sysdp.el: Patches to understand MULE 4.1
+
+1999-11-09  Alexandre Guimond  <address@hidden>
+
+* lisp/w3.el (w3-mail-document-author): Fix problem with 'Reply-To'
+  headers.  They had not been converted to the (not quite so) new plist
+  format.
+
+1999-10-15  Dave Love  <address@hidden>
+
+* lisp/w3-parse.el (char-int): Alias it to `identity' if necessary.
+
 1999-10-14  William M. Perry  <address@hidden>
 
 * lisp/url-ldap.el (url-ldap-certificate-formatter): Now uses
diff --git a/lisp/images.el b/lisp/images.el
index bdd59d5..4940ab5 100644
--- a/lisp/images.el
+++ b/lisp/images.el
@@ -1,7 +1,7 @@
 ;;; images.el --- Automatic image converters
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/07/19 23:27:43 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/11/09 14:52:10 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: images
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -40,9 +40,14 @@
 (defvar image-temp-stack nil "Do no touch - internal storage.")
 (defvar image-converters nil "Storage for the image converters.")
 (defvar image-native-formats
-  (delq nil (cons (if (featurep 'x) 'xbm)
-                 (mapcar (function (lambda (x) (if (featurep x) x)))
-                         '(xpm gif jpeg tiff png imagick))))
+  (cond
+   ((string-match "XEmacs" emacs-version)
+    (delq nil (cons (if (featurep 'x) 'xbm)
+                   (mapcar (function (lambda (x) (if (featurep x) x)))
+                           '(xpm gif jpeg tiff png imagick)))))
+   ((boundp 'image-types)
+    image-types)
+   (t nil))
   "A list of image formats that this version of emacs supports natively.")
 
 (defun image-register-converter (from to converter)
diff --git a/lisp/mm.el b/lisp/mm.el
index 3beed90..3487bd2 100644
--- a/lisp/mm.el
+++ b/lisp/mm.el
@@ -468,6 +468,7 @@ It has the same format as `mm-mime-data-default'.")
       (mm-replace-regexp "#.*" "")              ; Remove all comments
       (mm-replace-regexp "\n+" "\n")         ; And blank lines
       (mm-replace-regexp "\\\\[ \t\n]+" " ") ; And collapse spaces
+      (mm-replace-regexp (regexp-quote "+") (regexp-quote (regexp-quote "+"))) 
; and +s
       (mm-replace-regexp (concat (regexp-quote "\\") "[ \t]*\n") "")
       (goto-char (point-max))
       (skip-chars-backward " \t\n")
diff --git a/lisp/mule-sysdp.el b/lisp/mule-sysdp.el
index 9296242..71608c8 100644
--- a/lisp/mule-sysdp.el
+++ b/lisp/mule-sysdp.el
@@ -191,7 +191,7 @@ find-file-hooks, etc.
                   (if (not (symbolp (car-safe possible)))
                       '(undecided-unix)
                     possible)))
-               (4.0
+               ((4.0 4.1)
                 ;; We can use HIGHEST arg t for faster detection.
                 (detect-coding-region st nd t))
                (otherwise nil))))
@@ -251,7 +251,7 @@ find-file-hooks, etc.
            (set-buffer-multibyte nil)
          (set 'enable-multibyte-characters nil))))
   (case mule-sysdep-version
-    ((3.0 4.0 2.4 2.3)
+    ((3.0 4.0 4.1 2.4 2.3)
      (set-process-coding-system proc mule-no-coding-system
                                mule-no-coding-system))
     (xemacs
@@ -277,7 +277,7 @@ find-file-hooks, etc.
       (3.0
        (let ((enable-multibyte-characters t))
         (write-region st nd file append visit lockname)))
-      (4.0
+      ((4.0 4.1)
        (write-region st nd file append visit lockname))
       (otherwise
        (write-region st nd file append visit lockname)))))
@@ -288,7 +288,7 @@ find-file-hooks, etc.
      (code-convert-string str *internal* mule-retrieval-coding-system))
     ((2.4 3.0 xemacs)
      (encode-coding-string str mule-retrieval-coding-system))
-    (4.0
+    ((4.0 4.1)
      (if default-enable-multibyte-characters
         (encode-coding-string str mule-retrieval-coding-system)
        str))
@@ -302,7 +302,7 @@ find-file-hooks, etc.
          (decode-coding-string str mule-retrieval-coding-system))
         (2.3
          (code-convert-string str *internal* mule-retrieval-coding-system))
-        (4.0
+        ((4.0 4.1)
          (if default-enable-multibyte-characters
              (decode-coding-string str mule-retrieval-coding-system)
            str))
@@ -314,7 +314,7 @@ find-file-hooks, etc.
  If width of the truncated string is less than LEN, and if a character PAD is
  defined, add padding end of it."
   (case mule-sysdep-version
-    ((3.0 4.0)
+    ((3.0 4.0 4.1)
      (truncate-string-to-width str len 0 pad))
     (2.4
      (let ((cl (string-to-vector str)) (n 0) (sw 0))
@@ -341,19 +341,19 @@ find-file-hooks, etc.
 (defun mule-find-charset-region (beg end &optional table)
   (case mule-sysdep-version
     (2.3 (code-detect-region beg end))
-    ((2.4 3.0 4.0) (find-charset-region beg end table))
+    ((2.4 3.0 4.0 4.1) (find-charset-region beg end table))
     (xemacs (charsets-in-region beg end))
     (otherwise '(no-conversion))))
 
 (defun mule-coding-system-name (codesys)
   (case mule-sysdep-version
-    ((3.0 4.0) nil)
+    ((3.0 4.0 4.1) nil)
     (xemacs (coding-system-name codesys))))
 
 (defun mule-find-coding-system (sys)
   (case mule-sysdep-version
     ((2.3 2.4) nil)
-    ((3.0 4.0) (if (get sys 'coding-system) sys nil))
+    ((3.0 4.0 4.1) (if (get sys 'coding-system) sys nil))
     (xemacs (find-coding-system sys))
     (otherwise nil)))
      
@@ -364,14 +364,14 @@ find-file-hooks, etc.
       (2.3 (make-character lc-ltn1 char))
       (2.4 (make-char charset-latin-iso8859-1 char))
       (3.0 (make-char 'latin-iso8859-1 char))
-      (4.0 (if default-enable-multibyte-characters
-              (make-char 'latin-iso8859-1 char)
-            char))
+      ((4.0 4.1) (if default-enable-multibyte-characters
+                    (make-char 'latin-iso8859-1 char)
+                  char))
       (xemacs char)
       (otherwise char))))
 
 (case mule-sysdep-version
-  ((2.3 2.4 3.0 4.0 xemacs) nil)
+  ((2.3 2.4 3.0 4.0 4.1 xemacs) nil)
   (otherwise (fset 'string-width 'length)))
 
 (and
diff --git a/lisp/socks.el b/lisp/socks.el
index f2b8a65..b9f5750 100644
--- a/lisp/socks.el
+++ b/lisp/socks.el
@@ -1,7 +1,7 @@
 ;;; socks.el --- A Socks v5 Client for Emacs
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/03/25 05:30:04 $
-;; Version: $Revision: 1.3 $
+;; Created: $Date: 1999/11/09 14:52:16 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: comm, firewalls
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -638,13 +638,14 @@ version.")
        (process-kill-without-query proc)
        (save-excursion
          (set-buffer (process-buffer proc))
-         (while (memq (process-status proc) '(run open))
-           (accept-process-output proc))
+         (while (progn
+                  (accept-process-output proc)
+                  (memq (process-status proc) '(run open))))
          (goto-char (point-min))
-         (if (re-search-forward "Name:.*\nAddress: *\\(.*\\)$" nil t)
+         (if (re-search-forward "Name:.*\nAddress\\(es\\)?: *\\([0-9.]+\\)$" 
nil t)
              (progn
-               (setq res (buffer-substring (match-beginning 1)
-                                           (match-end 1))
+               (setq res (buffer-substring (match-beginning 2)
+                                           (match-end 2))
                      res (mapcar 'string-to-int (split-string res "\\.")))))
          (kill-buffer (current-buffer)))
        res)
diff --git a/lisp/url-auth.el b/lisp/url-auth.el
index f91d781..107c87f 100644
--- a/lisp/url-auth.el
+++ b/lisp/url-auth.el
@@ -1,7 +1,7 @@
 ;;; url-auth.el --- Uniform Resource Locator authorization modules
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/30 11:14:35 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/11/09 14:52:18 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -301,12 +301,7 @@ RATING   a rating between 1 and 10 of the strength of the 
authentication.
                            ", but it is not a function!") function)))
 
     (if node
-       (progn
-         (setcdr node (cons function rating))
-         (url-warn 'security
-                   (format
-                    "Replacing authorization method `%s' - this could be bad."
-                    type)))
+       (setcdr node (cons function rating))
       (setq url-registered-auth-schemes
            (cons (cons type (cons function rating))
                  url-registered-auth-schemes)))))
diff --git a/lisp/url-cookie.el b/lisp/url-cookie.el
index 19cd197..9a84de8 100644
--- a/lisp/url-cookie.el
+++ b/lisp/url-cookie.el
@@ -1,7 +1,7 @@
 ;;; url-cookie.el --- Netscape Cookie support
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/04/08 11:47:46 $
-;; Version: $Revision: 1.3 $
+;; Created: $Date: 1999/11/09 14:52:19 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -346,6 +346,22 @@
                              (url-match expires 3) " "
                              (url-match expires 4) " ["
                              (url-match expires 5) "]")))
+
+    ;; This one is for older Emacs/XEmacs variants that don't
+    ;; understand this format without tenths of a second in it.
+    ;; Wednesday, 30-Dec-2037 16:00:00 GMT
+    ;;       - vs -
+    ;; Wednesday, 30-Dec-2037 16:00:00.00 GMT
+    (if (and expires
+            (string-match
+             "\\([0-9]+\\)-\\([A-Za-z]+\\)-\\([0-9]+\\)[ 
\t]+\\([0-9]+:[0-9]+:[0-9]+\\)\\(\\.[0-9]+\\)*[ \t]+\\([-+a-zA-Z0-9]+\\)"
+             expires))
+       (setq expires (concat (url-match expires 1) "-" ; day
+                             (url-match expires 2) "-" ; month
+                             (url-match expires 3) " " ; year
+                             (url-match expires 4) ".00 " ; 
hour:minutes:seconds
+                             (url-match expires 6)))) ":" ; timezone
+    
     (while (consp trusted)
       (if (string-match (car trusted) current-url)
          (setq trusted (- (match-end 0) (match-beginning 0)))
diff --git a/lisp/url-file.el b/lisp/url-file.el
index 015b95e..1648478 100644
--- a/lisp/url-file.el
+++ b/lisp/url-file.el
@@ -1,7 +1,7 @@
 ;;; url-file.el --- File retrieval code
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/04/08 11:47:47 $
-;; Version: $Revision: 1.3 $
+;; Created: $Date: 1999/11/09 14:52:21 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -200,6 +200,8 @@ and exchanges any | in the drive identifier with a :."
         (user (url-user urlobj))
         (pass (url-password urlobj))
         (site (url-host urlobj))
+        (port (url-port urlobj))
+        (site (if port (format "%s#%s" site port)))
         (file (url-unhex-string (url-filename urlobj)))
         (dest (url-target urlobj))
         (filename (if (or user (not (url-host-is-local-p site)))
diff --git a/lisp/url-http.el b/lisp/url-http.el
index 39463e9..170797a 100644
--- a/lisp/url-http.el
+++ b/lisp/url-http.el
@@ -1,7 +1,7 @@
 ;;; url-http.el --- HTTP Uniform Resource Locator retrieval code
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/04/08 11:47:47 $
-;; Version: $Revision: 1.3 $
+;; Created: $Date: 1999/11/09 14:52:23 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -172,7 +172,7 @@
            "%s %s HTTP/1.0\r\n"        ; The request
            "MIME-Version: 1.0\r\n"     ; Version of MIME we speaketh
            "Extension: %s\r\n"         ; HTTP extensions we support
-           "Host: %s\r\n"              ; Who we want to talk to
+           "Host: %s:%d\r\n"           ; Who we want to talk to
            "%s"                        ; Who its from
            "Accept-encoding: %s\r\n"   ; Encodings we understand
            "%s"                        ; Languages we understand
@@ -190,6 +190,7 @@
           fname
           (or url-extensions-header "none")
           (or host "UNKNOWN.HOST.NAME")
+          (url-port (or proxy-obj url-current-object))
           (if url-personal-mail-address
               (concat "From: " url-personal-mail-address "\r\n")
             "")
@@ -587,6 +588,7 @@ HTTP/1.0 specification for more details." x redir) 'error)
                    (if url-be-asynchronous
                        nil
                      (message "Retrieval complete.")
+                     (if (fboundp 'clear-progress) (clear-progress))
                      (remove-hook 'after-change-functions
                                   'url-after-change-function))))))
          (progn
diff --git a/lisp/url.el b/lisp/url.el
index 43aab02..2641c42 100644
--- a/lisp/url.el
+++ b/lisp/url.el
@@ -1,13 +1,13 @@
 ;;; url.el --- Uniform Resource Locator retrieval tool
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/04/08 11:47:48 $
-;; Version: $Revision: 1.11 $
+;; Created: $Date: 1999/11/09 14:52:25 $
+;; Version: $Revision: 1.12 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;; LCD Archive Entry:
 ;;; url|William M. Perry|address@hidden|
 ;;; Functions for retrieving/manipulating URLs|
-;;; $Date: 1999/04/08 11:47:48 $|$Revision: 1.11 $|Location Undetermined
+;;; $Date: 1999/11/09 14:52:25 $|$Revision: 1.12 $|Location Undetermined
 ;;;
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -330,6 +330,11 @@
     (cond
      ((and url-current-content-length (> url-current-content-length 1)
           url-current-mime-type)
+      (if (fboundp 'progress)
+         (progress "Reading [%s] %s"
+                   (url-percentage current-length
+                                   url-current-content-length)
+                   url-current-mime-type (url-pretty-length 
url-current-content-length)))
       (url-lazy-message "Reading [%s]... %s of %s (%d%%)"
                        url-current-mime-type
                        (url-pretty-length current-length)
@@ -337,6 +342,11 @@
                        (url-percentage current-length
                                        url-current-content-length)))
      ((and url-current-content-length (> url-current-content-length 1))
+      (if (fboundp 'progress)
+         (progress "Reading %s"
+                   (url-percentage current-length
+                                   url-current-content-length)
+                   url-current-mime-type (url-pretty-length 
url-current-content-length)))
       (url-lazy-message "Reading... %s of %s (%d%%)"
                        (url-pretty-length current-length)
                        (url-pretty-length url-current-content-length)
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 850e813..2d91fa8 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/10/12 14:14:48 $
-;; Version: $Revision: 1.12 $
+;; Created: $Date: 1999/11/09 14:52:29 $
+;; Version: $Revision: 1.13 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -777,7 +777,8 @@ If the face already exists, it is unmodified."
                      (error 'nothing)))))
       (setq w3-image-widgets-waiting (cons widget w3-image-widgets-waiting)))
      ((or w3-delay-image-loads         ; Delaying images
-         (not (fboundp 'valid-specifier-domain-p)) ; Can't do images
+         (and (not (fboundp 'valid-specifier-domain-p)) ; Can't do images 
(XEmacs)
+              (not (boundp 'image-types))) ; Can't do images (Emacs)
          (eq (device-type) 'tty))      ; Why bother?
       (w3-add-delayed-graphic widget))
      ((not (w3-image-loadable-p src nil)) ; Hey, we can't load it!
@@ -817,6 +818,7 @@ If the face already exists, it is unmodified."
 (defun w3-maybe-start-background-image-download (src face)
   (let* ((cached-glyph (w3-image-cached-p src))
         (buf (current-buffer)))
+    (debug)
     (cond
      ((and cached-glyph
           (widget-glyphp cached-glyph)
diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index 3a2e3b9..70cb6f2 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -1972,7 +1972,10 @@ skip-chars-forward."
            (when default-enable-multibyte-characters
              (ethio-sera-to-fidel-marker)))))
     (error nil)))
-  
+
+(if (not (fboundp 'char-int))
+    (defalias 'char-int 'identity))
+
 ;; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 ;; %                                                    %
 ;; % This is the *ONLY* valid entry point in this file! %
@@ -2147,9 +2150,14 @@ Returns a data structure containing the parsed 
information."
          ;; of results
          (cond ((= 0 (% (setq loop-count (1+ loop-count)) 40))
                 (if status-message-format
-                    (message status-message-format
-                             ;; Percentage of buffer processed.
-                             (/ (* (point) one-hundred) (point-max))))))
+                    (progn
+                      (if (fboundp 'progress)
+                          (progress "Parsing %s"
+                                    (truncate (/ (* (point) one-hundred) 
(point-max)))
+                                    (url-pretty-length (point-max))))
+                      (message status-message-format
+                               ;; Percentage of buffer processed.
+                               (/ (* (point) one-hundred) (point-max)))))))
       
          ;; Go to next interesting thing in the buffer.
          (skip-chars-forward w3-p-d-non-markup-chars)
@@ -2844,6 +2852,8 @@ Returns a data structure containing the parsed 
information."
        (if status-message-format
            (message "%sdone" (format status-message-format 100)))
     
+       (if (fboundp 'clear-progress) (clear-progress))
+
        ;; *** For debugging, save the true parse tree.
        ;; *** Make this look inside *DOCUMENT.
        (setq w3-last-parse-tree
diff --git a/lisp/w3-widget.el b/lisp/w3-widget.el
index deffaf4..ad667c9 100644
--- a/lisp/w3-widget.el
+++ b/lisp/w3-widget.el
@@ -1,7 +1,7 @@
 ;;; w3-widget.el --- An image widget
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:11 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/11/09 14:52:35 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: faces, images
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -178,12 +178,25 @@
     ;; Specifier-instance will signal an error if we have an invalid
     ;; image specifier, which would be the case if we get screwed up
     ;; data back from a URL somewhere.
-    
-    (setq invalid-glyph (and glyph (condition-case ()
-                                      (if (specifier-instance
-                                           (glyph-image glyph))
+
+    (cond
+     (w3-running-xemacs
+      ;; All XEmacsen have support for glyphs
+      (setq invalid-glyph (and glyph (condition-case ()
+                                        (if (fboundp 'specifier-instance)
+                                            (if (specifier-instance
+                                                 (glyph-image glyph))
+                                                nil)
                                           nil)
-                                    (error t))))
+                                      (error t)))))
+     ((boundp 'image-types)
+      ;; We are in Emacs 20.5+, which has image support
+      (require 'image)
+      (setq invalid-glyph (and glyph
+                              (not (memq (plist-get glyph :type) 
image-types)))))
+     (t
+      nil))
+
     (if (or (not glyph) invalid-glyph)
        ;; Do a TTY or delayed image version of the image.
        (save-excursion
@@ -284,9 +297,14 @@
     (fset 'widget-mouse-event-p 'mouse-event-p)
   (fset 'widget-mouse-event-p 'ignore))
 
-(if (fboundp 'glyphp)
-    (fset 'widget-glyphp 'glyphp)
-  (fset 'widget-glyphp 'ignore))
+(cond
+ ((fboundp 'glyphp)
+  (fset 'widget-glyphp 'glyphp))
+ ((boundp 'image-types)
+  (defun widget-glyphp (glyph)
+    (and (listp glyph) (plist-get glyph :type))))
+ (t
+  (fset 'widget-glyphp 'ignore)))
 
 (defun widget-image-button-press (event)
   (interactive "@e")
diff --git a/lisp/w3.el b/lisp/w3.el
index 812f634..47241d0 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/10/12 14:14:51 $
-;; Version: $Revision: 1.9 $
+;; Created: $Date: 1999/11/09 14:52:37 $
+;; Version: $Revision: 1.10 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1100,14 +1100,6 @@ insert URL under point"
        (setq x (url-buffer-visiting "www:/auto/hotlist"))))
     (w3-fetch "www://auto/hotlist")))
 
-(defun url-maybe-relative (url)
-  "Take a url and either fetch it, or resolve relative refs, then fetch it"
-  (cond
-   ((not
-     (string-match url-nonrelative-link url))
-    (w3-relative-link url))
-   (t (w3-fetch url))))
-
 (defun w3-in-assoc (elt list)
   "Check to see if ELT matches any of the regexps in the car elements of LIST"
   (let (rslt)
@@ -1241,6 +1233,7 @@ invokes some commands which read a coding system from the 
user.")
          (if (or (stringp proc)
                  (bufferp proc)) (setq w3-current-last-buffer proc))
          (remove-hook 'after-change-functions 'url-after-change-function)
+         (if (fboundp 'clear-progress) (clear-progress))
          (if url-be-asynchronous
              (progn
                (cond
@@ -2021,7 +2014,7 @@ No arg means whole window full.  Arg is number of lines 
to scroll."
        (found nil))
     (setq found (cdr-safe (assoc "reply-to" url-current-mime-headers)))
     (if (and found (not (string-match url-nonrelative-link found)))
-       (setq found (list (concat "mailto:"; found))))
+       (setq found (list (list 'href (concat "mailto:"; found)))))
     (while (and x (not found))
       (setq y (car x)
            x (cdr x)
diff --git a/texi/w3.txi b/texi/w3.txi
index ef3a72d..eab0bd6 100644
--- a/texi/w3.txi
+++ b/texi/w3.txi
@@ -97,8 +97,8 @@ This manual corresponds to Emacs/W3 $State: Exp $
 * Basic Usage::                 Basic movement and usage of Emacs/W3.
 * Compatibility::               Explanation of compatibility with
                                 other browsers.
+* Display Variables::           How to control Emacs/W3's look.
 * Stylesheets::                 How to control the look of web pages
-* Display::                     How to control Emacs/W3's look.
 * Supported URLs::              What @sc{URL} schemes are supported.
 * MIME Support::                Support for @sc{mime}
 * Security::                    Various security methods supported
@@ -118,8 +118,7 @@ Appendices:
 * Proxy Gateways::              Using a proxy gateway with Emacs/W3.
 * Installing SSL::              Turning on @sc{ssl} support.
 * Mailcap Files::               An explanation of Mailcap files.
-* Down with DoubleClick::       Annoyed by advertisements?  Read this!
-* Temporary::                   Temporary node.
+* Temporary::
 
 Indices:
 * General Index::               General Index.
@@ -279,7 +278,7 @@ html} and @samp{make ps} respectively.
 
 @c gdj1: document the other targets, fast etc.?
 
address@hidden Startup Files, , Building and Installing, Getting Started
address@hidden Startup Files,  , Building and Installing, Getting Started
 @section Startup Files
 @cindex Startup files
 @cindex .w3
@@ -741,7 +740,7 @@ a @code{completing-read} on only the links that have that 
type of
 relationship.
 @end table
 
address@hidden Compatibility, Display, Basic Usage, Top
address@hidden Compatibility, Display Variables, Basic Usage, Top
 @chapter Compatibility with other Browsers
 Due to the popularity of several other browsers, Emacs/W3 offers an easy
 transition to its much better way of life.  This ranges from being able
@@ -1486,7 +1485,7 @@ equivalent to meek.
 @end table
 
 
address@hidden Stylesheets, Supported URLs, Display, Top
address@hidden Stylesheets, Supported URLs, Display Variables, Top
 @chapter Stylesheets
 The way in which Emacs/W3 formats a document is very customizable.  All
 formatting is now controlled by a default stylesheet set by the user
@@ -4772,7 +4771,7 @@ SSL_VERIFY_CLIENT_ONCE
 @end table
 The default is 0
 
address@hidden Mailcap Files, Down with DoubleClick, Installing SSL, Top
address@hidden Mailcap Files, Temporary, Installing SSL, Top
 @appendix Mailcap Files
 NCSA Mosaic and almost all other WWW browsers rely on a separate file
 for mapping MIME types to external viewing programs.  This takes some of
@@ -4906,12 +4905,7 @@ some of which might be standardized in a future version 
of this
 document.
 @end itemize
 
address@hidden Down with DoubleClick, Temporary, Mailcap Files, Top
address@hidden Down with DoubleClick
-:: WORK :: Document why doubleclick is address@hidden
-:: WORK :: Document how you can never see another ad from them again
-
address@hidden Temporary, General Index, Down with DoubleClick, Top
address@hidden Temporary, General Index, Mailcap Files, Top
 @comment  node-name,  next,  previous,  upGeneral Index
 
 @c @appendix Temporary

commit 6e903fc94830205c04013a834725afbff344b137
Author: William M. Perry <address@hidden>
Date:   Thu Oct 14 12:44:16 1999 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 988df73..75f9c77 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+1999-10-14  William M. Perry  <address@hidden>
+
+* lisp/url-ldap.el (url-ldap-certificate-formatter): Now uses
+  ssl-certificate-information instead of hacked up bill-specific stuff.
+
+* lisp/ssl.el (ssl-certificate-information): New function to get
+  certificate information out of a DER encoded object.
+  (ssl-program-name): Default to using OpenSSL now.
+
 1999-10-11  William M. Perry  <address@hidden>
 
 * lisp/w3-display.el (w3-fixup-eol-faces): only strip spaces off of
diff --git a/lisp/ssl.el b/lisp/ssl.el
index 8968a84..516ace1 100644
--- a/lisp/ssl.el
+++ b/lisp/ssl.el
@@ -1,14 +1,14 @@
 ;;; ssl.el,v --- ssl functions for emacsen without them builtin
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:08 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/10/14 12:44:18 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: comm
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1995, 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;; This file is part of GNU Emacs.
 ;;;
 ;;; GNU Emacs is free software; you can redistribute it and/or modify
 ;;; it under the terms of the GNU General Public License as published by
@@ -72,7 +72,8 @@ Maybe a way of passing a file should be implemented"
   "*Style of cert database to use, the only valid value right now is `ssleay'.
 This means a directory of pem encoded certificates with hash symlinks."
   :group 'ssl
-  :type '(choice (const :tag "SSLeay" :value ssleay)))  
+  :type '(choice (const :tag "SSLeay" :value ssleay)
+                (const :tag "OpenSSL" :value openssl)))
 
 (defcustom ssl-certificate-verification-policy 0
   "*How far up the certificate chain we should verify."
@@ -82,13 +83,14 @@ This means a directory of pem encoded certificates with 
hash symlinks."
                 (const :tag "Reject connection if verification fails" :value 3)
                 (const :tag "SSL_VERIFY_CLIENT_ONCE" :value 5)))
 
-(defcustom ssl-program-name "s_client"
+(defcustom ssl-program-name "openssl"
   "*The program to run in a subprocess to open an SSL connection."
   :group 'ssl
   :type 'string)
 
 (defcustom ssl-program-arguments
-  '(;;"-quiet"
+  '("s_client"
+    "-quiet"
     "-host" host
     "-port" service
     "-verify" (int-to-string ssl-certificate-verification-policy)
@@ -103,6 +105,36 @@ to."
   :group 'ssl
   :type 'list)
 
+(defun ssl-certificate-information (der)
+  "Return an assoc list of information about a certificate in DER format."
+  (let ((certificate (concat "-----BEGIN CERTIFICATE-----\n"
+                            (base64-encode-string der)
+                            "\n-----END CERTIFICATE-----\n"))
+       (exit-code 0))
+    (save-excursion
+      (set-buffer (get-buffer-create " *openssl*"))
+      (erase-buffer)
+      (insert certificate)
+      (setq exit-code (condition-case ()
+                         (call-process-region (point-min) (point-max)
+                                              ssl-program-name
+                                              t (list (current-buffer) nil) t
+                                              "x509"
+                                              "-subject" ; Print the subject DN
+                                              "-issuer" ; Print the issuer DN
+                                              "-dates" ; Both before and after 
dates
+                                              "-serial" ; print out serial 
number
+                                              "-noout" ; Don't spit out the 
certificate
+                                              )
+                       (error -1)))
+      (if (/= exit-code 0)
+         nil
+       (let ((vals nil))
+         (goto-char (point-min))
+         (while (re-search-forward "^\\([^=\n\r]+\\)\\s *=\\s *\\(.*\\)" nil t)
+           (push (cons (match-string 1) (match-string 2)) vals))
+         vals)))))
+  
 (defun ssl-accept-ca-certificate ()
   "Ask if the user is willing to accept a new CA certificate. The buffer-name
 should be the intended name of the certificate, and the buffer should probably
diff --git a/lisp/url-ldap.el b/lisp/url-ldap.el
index 5397250..b1e7801 100644
--- a/lisp/url-ldap.el
+++ b/lisp/url-ldap.el
@@ -1,7 +1,7 @@
 ;;; url-ldap.el --- LDAP Uniform Resource Locator retrieval code
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/10/12 14:14:48 $
-;; Version: $Revision: 1.7 $
+;; Created: $Date: 1999/10/14 12:44:16 $
+;; Version: $Revision: 1.8 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -91,37 +91,15 @@
          "'>" dn "</a>"))
 
 (defun url-ldap-certificate-formatter (data)
-  (setq data (concat "-----BEGIN CERTIFICATE-----\n"
-                    (base64-encode-string data)
-                    "\n-----END CERTIFICATE-----\n"))
-  (save-excursion
-    (set-buffer (get-buffer-create " *openssl*"))
-    (erase-buffer)
-    (let ((proc (start-process "openssl" (current-buffer)
-                              
"~/v330/x86/linux-libc6/debug/socks5/sdk/openssl/apps/openssl"
-                              "x509"
-                              "-subject" ; Print the subject DN
-                              "-issuer" ; Print the issuer DN
-                              "-dates" ; Both before and after dates
-                              "-serial" ; print out serial number
-                              "-noout" ; Don't spit out the certificate
-                              ))
-         (vals nil))
-      (accept-process-output proc 1)
-      (process-send-string proc data)
-      (while (memq (process-status proc) '(run open))
-       (accept-process-output proc 1))
-      (goto-char (point-min))
-      (while (re-search-forward "^\\([^=\n\r]+\\)\s*=\s*\\(.*\\)" nil t)
-       (push (cons (match-string 1) (match-string 2)) vals))
-      (if (not vals)
-         (concat "<pre>\n" (buffer-string) "</pre>\n")
-       (concat "<table border=0>\n"
-               (mapconcat
-                (lambda (ava)
-                  (format "<tr><td>%s</td><td>%s</td></tr>\n" (car ava) (cdr 
ava)))
-                vals "\n")
-               "</table>\n")))))
+  (let ((vals (ssl-certificate-information data)))
+    (if (not vals)
+       "<b>Unable to parse certificate</b>"
+      (concat "<table border=0>\n"
+             (mapconcat
+              (lambda (ava)
+                (format "<tr><td>%s</td><td>%s</td></tr>\n" (car ava) (cdr 
ava)))
+              vals "\n")
+             "</table>\n"))))
 
 (defun url-ldap-image-formatter (data)
   (format "<img alt='JPEG Photo' src='data:image/jpeg;base64,%s'>" 

commit 2d3256da06f8ec94b4b59f8129079f1dc11461ee
Author: William M. Perry <address@hidden>
Date:   Tue Oct 12 14:14:36 1999 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index d41bf7b..988df73 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+1999-10-11  William M. Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-fixup-eol-faces): only strip spaces off of
+  newlines, not the surrounding shitepsace.  This makes colorized table
+  cells look much better.
+
+1999-09-16  Michael Sperber [Mr. Preprocessor]  <address@hidden>
+
+* lisp/url-cache.el: 
+* lisp/w3-display.el: 
+* lisp/w3.el: Added (require 'url-parse) because of the macros
+  defined there.
+
 1999-08-07  Bob Weiner  <address@hidden>
 
 * w3-menu.el (w3-menu-make-xemacs-menubar): Fixed to work with
diff --git a/contrib/http-tunnel.el b/contrib/http-tunnel.el
new file mode 100644
index 0000000..b35b026
--- /dev/null
+++ b/contrib/http-tunnel.el
@@ -0,0 +1,33 @@
+(defvar http-tunnel-host "firewallmachine")
+(defvar http-tunnel-port 80)
+
+(defun open-http-tunneled-connection (name buffer host service)
+  (let ((proc (open-network-stream name buffer http-tunnel-host 
http-tunnel-port))
+       (need-to-spin t))
+    (if (or (null proc) (not (memq (process-status proc) '(run open))))
+       (error "Could not open connection"))
+    (process-send-string proc (format (eval-when-compile
+                                       (concat
+                                        "CONNECT %s:%s HTTP/1.0\r\n"
+                                        "User-Agent: Emacs/%d.%d\r\n"
+                                        "\r\n"))
+                                     host service
+                                     emacs-major-version
+                                     emacs-minor-version))
+    (save-excursion
+      (set-buffer buffer)
+      (while (and (memq (process-status proc) '(open run)) need-to-spin)
+       (accept-process-output proc 3)
+       (goto-char (point-min))
+       (if (re-search-forward "\r\n\r\n" nil t)
+           (progn
+             (delete-region (point-min) (match-end 0))
+             (setq need-to-spin nil)))
+       (goto-char (point-max))))
+    (if (not (memq (process-status proc) '(open run)))
+       (error "Could not open connection"))
+    proc))
+
+(let ((socks-noproxy '(".*")))
+  (setq x (open-http-tunneled-connection "x" "x" "www.cs.indiana.edu" 80))
+  (process-send-string x "GET / HTTP/1.0\r\n\r\n"))
diff --git a/lisp/url-cache.el b/lisp/url-cache.el
index 7863568..85e885a 100644
--- a/lisp/url-cache.el
+++ b/lisp/url-cache.el
@@ -1,14 +1,14 @@
 ;;; url-cache.el --- Uniform Resource Locator retrieval tool
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:08 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/10/12 14:14:47 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;; This file is part of GNU Emacs.
 ;;;
 ;;; GNU Emacs is free software; you can redistribute it and/or modify
 ;;; it under the terms of the GNU General Public License as published by
@@ -25,6 +25,7 @@
 ;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 ;;; Boston, MA 02111-1307, USA.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'url-parse)
 (require 'md5)
 (require 'mule-sysdp)
 
diff --git a/lisp/url-ldap.el b/lisp/url-ldap.el
index 12072ef..5397250 100644
--- a/lisp/url-ldap.el
+++ b/lisp/url-ldap.el
@@ -1,7 +1,7 @@
 ;;; url-ldap.el --- LDAP Uniform Resource Locator retrieval code
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/06/28 01:46:56 $
-;; Version: $Revision: 1.6 $
+;; Created: $Date: 1999/10/12 14:14:48 $
+;; Version: $Revision: 1.7 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -91,8 +91,37 @@
          "'>" dn "</a>"))
 
 (defun url-ldap-certificate-formatter (data)
-  (setq data (base64-encode-string data))
-  (format "<a title='certificate' 
href='data:application/octet-stream;base64,%s'>[certificate]</a>" 
(url-hexify-string data)))
+  (setq data (concat "-----BEGIN CERTIFICATE-----\n"
+                    (base64-encode-string data)
+                    "\n-----END CERTIFICATE-----\n"))
+  (save-excursion
+    (set-buffer (get-buffer-create " *openssl*"))
+    (erase-buffer)
+    (let ((proc (start-process "openssl" (current-buffer)
+                              
"~/v330/x86/linux-libc6/debug/socks5/sdk/openssl/apps/openssl"
+                              "x509"
+                              "-subject" ; Print the subject DN
+                              "-issuer" ; Print the issuer DN
+                              "-dates" ; Both before and after dates
+                              "-serial" ; print out serial number
+                              "-noout" ; Don't spit out the certificate
+                              ))
+         (vals nil))
+      (accept-process-output proc 1)
+      (process-send-string proc data)
+      (while (memq (process-status proc) '(run open))
+       (accept-process-output proc 1))
+      (goto-char (point-min))
+      (while (re-search-forward "^\\([^=\n\r]+\\)\s*=\s*\\(.*\\)" nil t)
+       (push (cons (match-string 1) (match-string 2)) vals))
+      (if (not vals)
+         (concat "<pre>\n" (buffer-string) "</pre>\n")
+       (concat "<table border=0>\n"
+               (mapconcat
+                (lambda (ava)
+                  (format "<tr><td>%s</td><td>%s</td></tr>\n" (car ava) (cdr 
ava)))
+                vals "\n")
+               "</table>\n")))))
 
 (defun url-ldap-image-formatter (data)
   (format "<img alt='JPEG Photo' src='data:image/jpeg;base64,%s'>" 
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 49a7b05..850e813 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/04/08 12:14:45 $
-;; Version: $Revision: 1.11 $
+;; Created: $Date: 1999/10/12 14:14:48 $
+;; Version: $Revision: 1.12 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -32,6 +32,7 @@
 (require 'w3-keyword)
 (require 'css)
 (require 'font)
+(require 'url-parse)
 (require 'w3-widget)
 (require 'w3-imap)
 
@@ -2659,7 +2660,7 @@ Format: (((image-alt row column) . offset) ...)")
   (let ((inhibit-read-only t))
     (save-excursion
       (goto-char (point-min))
-      (while (re-search-forward "[ \t]*\n[ \t]*" nil t)
+      (while (re-search-forward "\n" nil t)
        (remove-text-properties (match-beginning 0) (match-end 0)
                                '(face nil mouse-face nil) nil)))))
 
diff --git a/lisp/w3-forms.el b/lisp/w3-forms.el
index d2b668c..cf6cbb9 100644
--- a/lisp/w3-forms.el
+++ b/lisp/w3-forms.el
@@ -1,7 +1,7 @@
 ;;; w3-forms.el --- Emacs-w3 forms parsing code for new display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/04/08 12:14:46 $
-;; Version: $Revision: 1.4 $
+;; Created: $Date: 1999/10/12 14:14:50 $
+;; Version: $Revision: 1.5 $
 ;; Keywords: faces, help, comm, data, languages
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -36,6 +36,7 @@
   (require 'w3-keyword)
   (require 'w3-mouse)
   (require 'w3-display)
+  (require 'url)
   (require 'widget)
   (condition-case nil
       (require 'wid-edit)
diff --git a/lisp/w3.el b/lisp/w3.el
index 887eca0..812f634 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/04/08 11:47:52 $
-;; Version: $Revision: 1.8 $
+;; Created: $Date: 1999/10/12 14:14:51 $
+;; Version: $Revision: 1.9 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -83,6 +83,7 @@
 (require 'cl)
 (require 'css)
 (require 'url-vars)
+(require 'url-parse)
 (require 'w3-vars)
 (eval-and-compile
   (require 'w3-display))

commit 5c352c29cae66fc8e154cac027450fc908e3a86f
Author: William M. Perry <address@hidden>
Date:   Fri Oct 1 20:22:04 1999 +0000

    *** empty log message ***

diff --git a/README b/README
index ec4ea74..30bb63f 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-This directory tree holds version $State: Exp $ of Emacs/W3, the fully
+This directory tree holds version $State: p4.0pre.46 $ of Emacs/W3, the fully
 customizable, largely undocumented web browser for Emacs.
 
 You may encounter bugs in this release.  If you do, please report
diff --git a/lisp/url-vars.el b/lisp/url-vars.el
index abfcc88..4cf58c4 100644
--- a/lisp/url-vars.el
+++ b/lisp/url-vars.el
@@ -1,7 +1,7 @@
 ;;; url-vars.el --- Variables for Uniform Resource Locator tool
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/04/08 11:47:48 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/10/01 20:22:10 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -38,7 +38,7 @@
     (defmacro defcustom (var value doc &rest args) 
       (` (defvar (, var) (, value) (, doc))))))
 
-(defconst url-version (let ((x "$State: p4.0pre.44 $"))
+(defconst url-version (let ((x "$State: p4.0pre.46 $"))
                        (if (string-match "State: \\([^ \t\n]+\\)" x)
                            (substring x (match-beginning 1) (match-end 1))
                          x))
diff --git a/lisp/w3-keyword.el b/lisp/w3-keyword.el
index 7095eaa..b96d43c 100644
--- a/lisp/w3-keyword.el
+++ b/lisp/w3-keyword.el
@@ -1,7 +1,7 @@
 ;;; w3-keyword.el --- Emacs-W3 binding style sheet mechanism
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/03/25 05:30:06 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/10/01 20:22:11 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -107,6 +107,7 @@
                  :tag
                  :tab-order
                  :notify
+                 :button-keymap
                  :ignore-case
                  :parent
                  :type
diff --git a/lisp/w3-vars.el b/lisp/w3-vars.el
index 9bd7af3..2f6c3d3 100644
--- a/lisp/w3-vars.el
+++ b/lisp/w3-vars.el
@@ -1,7 +1,7 @@
 ;;; w3-vars.el,v --- All variable definitions for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/04/08 11:47:52 $
-;; Version: $Revision: 1.3 $
+;; Created: $Date: 1999/10/01 20:22:11 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: comm, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -34,7 +34,7 @@
 (require 'wid-edit)                    ; For `widget-keymap'
 
 (defconst w3-version-number
-  (let ((x "$State: p4.0pre.44 $"))
+  (let ((x "$State: p4.0pre.46 $"))
     (if (string-match "State:[ \t\n]+.\\([^ \t\n]+\\)" x)
        (setq x (substring x (match-beginning 1) (match-end 1)))
       (setq x (substring x 1)))
@@ -42,7 +42,7 @@
      (function (lambda (x) (if (= x ?-) "." (char-to-string x)))) x ""))
   "Version # of w3-mode.")
 
-(defconst w3-version-date (let ((x "$Date: 1999/04/08 11:47:52 $"))
+(defconst w3-version-date (let ((x "$Date: 1999/10/01 20:22:11 $"))
                            (if (string-match "Date: \\([^ \t\n]+\\)" x)
                                (substring x (match-beginning 1) (match-end 1))
                              x))
diff --git a/texi/w3-faq.txi b/texi/w3-faq.txi
index 5721962..4dd77e4 100644
--- a/texi/w3-faq.txi
+++ b/texi/w3-faq.txi
@@ -27,7 +27,7 @@ This is the Emacs/W3 Frequently Asked Questions list.
 @item
 Q1.1  What is the latest version of Emacs/W3?
 
-The latest version is $State: Exp $.
+The latest version is $State: v4.0pre.46 $.
 
 @item
 Q1.2  Where do I get Emacs/W3?
diff --git a/texi/w3.txi b/texi/w3.txi
index e05bcb5..ef3a72d 100644
--- a/texi/w3.txi
+++ b/texi/w3.txi
@@ -12,7 +12,7 @@
 @c site: http://www.cs.indiana.edu/elisp/w3/docs.html
 @c
 @setfilename w3.info
address@hidden Emacs/W3 $State: TESTING $ User's Manual
address@hidden Emacs/W3 $State: Exp $ User's Manual
 @iftex
 @finalout
 @end iftex
@@ -90,7 +90,7 @@ cannot be modified to your satisfaction, please send mail to 
the
 @t{w3-beta@@indiana.edu} mailing list with any suggestions.
 @xref{Reporting Bugs}.
 
-This manual corresponds to Emacs/W3 $State: TESTING $
+This manual corresponds to Emacs/W3 $State: Exp $
 
 @menu
 * Getting Started::             Getting up and running with Emacs/W3

commit dd2763041aed373a8bdd58ffd56767e6dd47b263
Author: William M. Perry <address@hidden>
Date:   Mon Aug 9 13:47:54 1999 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 3838fa7..d41bf7b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+1999-08-07  Bob Weiner  <address@hidden>
+
+* w3-menu.el (w3-menu-make-xemacs-menubar): Fixed to work with
+  BeOpen.com InfoDock.  Old code allowed multiple 'nil's to creep into the 
+  menubar which would cause a hang in the XEmacs menubar code.
+
 1999-08-04  William M. Perry  <address@hidden>
 
 * lisp/url-cid.el (url-cid-gnus): Fixed so it will work in Emacs and
diff --git a/lisp/w3-menu.el b/lisp/w3-menu.el
index 891994d..ecf5118 100644
--- a/lisp/w3-menu.el
+++ b/lisp/w3-menu.el
@@ -1,7 +1,7 @@
 ;;; w3-menu.el --- Menu functions for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/23 19:34:05 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/08/09 13:47:56 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: menu, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -591,11 +591,14 @@ on that platform."
        (menubar nil)
        (menu-list w3-use-menus))
     (while menu-list
-      (if (null (car menu-list))
-         (setq menubar (cons nil menubar))
-       (setq cons (assq (car menu-list) menu-alist))
-       (if cons
-           (setq menubar (cons (symbol-value (cdr cons)) menubar))))
+      (cond
+       ((and (featurep 'infodock)
+            (memq (car menu-list) '(nil emacs))))
+       ((null (car menu-list))
+       (setq menubar (cons nil menubar)))
+       (t (setq cons (assq (car menu-list) menu-alist))
+         (if cons
+             (setq menubar (cons (symbol-value (cdr cons)) menubar)))))
       (setq menu-list (cdr menu-list)))
     (nreverse menubar)))
 

commit 9502fef5aece0954a21c078ad9ed004dd1bb2b9f
Author: William M. Perry <address@hidden>
Date:   Thu Aug 5 20:21:21 1999 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 2e2d3dc..3838fa7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+1999-08-04  William M. Perry  <address@hidden>
+
+* lisp/url-cid.el (url-cid-gnus): Fixed so it will work in Emacs and
+  XEmacs 21.2
+
+1999-08-03  William M. Perry  <address@hidden>
+
+* lisp/mule-sysdp.el (mule-sysdep-version): Make
+  enable-multibyte-characters buffer-local when in XEmacs, to better mimic 
+  the Emacs 20.x behaviour.
+
 1999-07-19  William M. Perry  <address@hidden>
 
 * lisp/images.el (image-register-netpbm-utilities): Fixed typo in the ppm
diff --git a/lisp/url-cid.el b/lisp/url-cid.el
index 317c128..49a8676 100644
--- a/lisp/url-cid.el
+++ b/lisp/url-cid.el
@@ -1,7 +1,7 @@
 ;;; url-cid.el --- Content-ID URL loader
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/28 15:12:21 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/08/05 20:21:27 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -42,7 +42,9 @@
     (setq part (mm-get-content-id cid))
     (if (not part)
        (message "Unknown CID encountered: %s" cid)
-      (setq data (buffer-string nil nil (mm-handle-buffer part))
+      (setq data (save-excursion
+                  (set-buffer (mm-handle-buffer part))
+                  (buffer-string))
            content-type (mm-handle-type part)
            encoding (symbol-name (mm-handle-encoding part)))
       (if (= 0 (length content-type)) (setq content-type "text/plain"))

commit 8538fc5ddfccd21da687174fb70dd6ccd2714814
Author: William M. Perry <address@hidden>
Date:   Tue Aug 3 21:28:56 1999 +0000

    *** empty log message ***

diff --git a/lisp/mule-sysdp.el b/lisp/mule-sysdp.el
index 54eb5f3..9296242 100644
--- a/lisp/mule-sysdp.el
+++ b/lisp/mule-sysdp.el
@@ -14,6 +14,8 @@
 (defconst mule-sysdep-version (if (featurep 'mule)
                                  (cond
                                   ((string-match "XEmacs" emacs-version)
+                                   (if (boundp 'enable-multibyte-characters)
+                                       (make-variable-buffer-local 
'enable-multibyte-characters))
                                    'xemacs)
                                   ((and
                                     (boundp 'mule-version)

commit 2f7aaaf2f506b1e8387c4860337782b725f2ae98
Author: William M. Perry <address@hidden>
Date:   Wed Jul 21 11:58:16 1999 +0000

    *** empty log message ***

diff --git a/texi/w3.txi b/texi/w3.txi
index 15e951c..e05bcb5 100644
--- a/texi/w3.txi
+++ b/texi/w3.txi
@@ -1253,8 +1253,8 @@ partial @sc{url}.  This is very useful, especially for 
very long @sc{url}s that
 are not in a hotlist, or for seeing all the pages from a particular web
 site before choosing which to retrieve.
 
address@hidden Display, Stylesheets, Compatibility, Top
address@hidden Display
address@hidden Display Variables, Stylesheets, Compatibility, Top
address@hidden Display Variables
 
 Emacs/W3 has many variable for you to fiddle with to get the display
 just right.

commit de334b518c20c10e284ff04a8b02fe77cfc2aa94
Author: William M. Perry <address@hidden>
Date:   Mon Jul 19 23:27:36 1999 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 3f9c578..2e2d3dc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,25 @@
+1999-07-19  William M. Perry  <address@hidden>
+
+* lisp/images.el (image-register-netpbm-utilities): Fixed typo in the ppm
+  to xpm converter.
+
+1999-06-27  William M. Perry  <address@hidden>
+
+* lisp/url-parse.el (url-generic-parse-url): Added in gross hack to
+  preserve ';' in data URLs.  The usage as a separator for content-type
+  and encoding-type clashes horribly with the ';' as an
+  attribute-separator on normal URLs.
+
+* lisp/w3-parse.el (w3-parse-hooks): New hook to be run just before
+  parsing any document.  This can theoretically be used to rip out banner
+  advertisements, etc.
+  (w3-parse-munge-ethiopic-text): Moved the old ethiopic munging stuff
+  into hook form.
+
+* lisp/url-mail.el (url-mailto): Allow adding of more 'to' headers via the 
+  query interface for mailto URLs.  Would generate corrup To: headers
+  otherwise.
+
 1999-06-15  William M. Perry  <address@hidden>
 
 * lisp/url-ldap.el (url-ldap-attribute-formatters): Format naming contexts 
diff --git a/lisp/images.el b/lisp/images.el
index be7892c..bdd59d5 100644
--- a/lisp/images.el
+++ b/lisp/images.el
@@ -1,12 +1,12 @@
 ;;; images.el --- Automatic image converters
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:07 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/07/19 23:27:43 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: images
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1995 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -175,7 +175,7 @@ to a suitable internal image format will be carried out."
     (image-register-converter 'pgm 'pbm "pgmtopbm")
     (image-register-converter 'ppm 'pgm "ppmtopgm")
     (image-register-converter 'pnm 'xpm "ppmtoxpm")
-    (image-register-converter 'ppm 'xpm "ppmtoxpm)")
+    (image-register-converter 'ppm 'xpm "ppmtoxpm")
     (image-register-converter 'xpm 'ppm "xpmtoppm")
     (image-register-converter 'gif 'ppm "giftopnm")
     (image-register-converter 'pnm 'gif "(ppmquant 256 | ppmtogif)")

commit 2140417add98aadc81ffc70831b2a7bf8bedcc59
Author: William M. Perry <address@hidden>
Date:   Thu Jul 1 05:58:34 1999 +0000

    *** empty log message ***

diff --git a/texi/w3.txi b/texi/w3.txi
index a102b7b..15e951c 100644
--- a/texi/w3.txi
+++ b/texi/w3.txi
@@ -12,7 +12,7 @@
 @c site: http://www.cs.indiana.edu/elisp/w3/docs.html
 @c
 @setfilename w3.info
address@hidden Emacs/W3 $State: Exp $ User's Manual
address@hidden Emacs/W3 $State: TESTING $ User's Manual
 @iftex
 @finalout
 @end iftex
@@ -85,12 +85,12 @@ encouraged to @i{Web-enable} their applications and daily 
work routines
 with the library.
 
 Emacs/W3 is completely customizable, both from Emacs-Lisp and from
-stylesheets @xref{Stylesheets}  If there is any aspect of Emacs/W3 that
+stylesheets @xref{Stylesheets}.  If there is any aspect of Emacs/W3 that
 cannot be modified to your satisfaction, please send mail to the
 @t{w3-beta@@indiana.edu} mailing list with any suggestions.
address@hidden Bugs}
address@hidden Bugs}.
 
-This manual corresponds to Emacs/W3 $State: Exp $
+This manual corresponds to Emacs/W3 $State: TESTING $
 
 @menu
 * Getting Started::             Getting up and running with Emacs/W3
@@ -314,8 +314,8 @@ as well as the site-wide directories.  In particular it 
will look for
 background and @file{light.css} or @file{stylesheet-light} if you're
 using a light background as well as @file{stylesheet} and
 @file{default.css}.  If @code{w3-default-stylesheet} is not @code{nil}
-then the file that it names will be used as well.  @xref{Stylesheets}
-for more information.
+then the file that it names will be used as well.  For more information,
address@hidden
 
 @subsection History
 @cindex history
@@ -366,7 +366,8 @@ with lots of form fields.
 By default, hypertext links are surrounded by '[[' and ']]' on
 non-graphic terminals (VT100, DOS window, etc.).  On a graphics
 terminal, the links are in shown in different colors.
address@hidden for information on how to change this.
+For information on how to change this, @xref{Stylesheets}.
+
 
 There are approximately 50 keys bound to special Emacs/W3 functions.
 The basic rule of thumb regarding keybindings in Emacs/W3 is that a
@@ -786,8 +787,9 @@ to @code{w3-mode-hook}.
 
 @code{turn-on-lynx-emulation} turns on lynx emulation and turns off
 netscape emulation.  lynx emulation is handled by the
address@hidden minor mode.  @xref{Hotlist Handling}
-for more information about lynx style hotlists.
address@hidden minor mode.  For more information
+about lynx style hotlists, @xref{Hotlist Handling}.
+
 
 :: work :: Document lynx address@hidden
 @table @kbd
@@ -962,10 +964,11 @@ Invoke the Cookie Jar Page (ignored)
 @findex turn-on-netscape-emulation
 @findex w3-netscape-emulation-minor-mode
 
address@hidden turns on netscape emulation and turns off
-lynx emulation.  netscape emulation is handled by the
address@hidden minor mode.  @xref{Hotlist Handling}
-for more information about netscape style hotlists.
address@hidden turns on netscape emulation and turns
+off lynx emulation.  netscape emulation is handled by the
address@hidden minor mode.  For more
+information about netscape style hotlists, @xref{Hotlist Handling}.
+
 
 
 @table @kbd
@@ -2984,12 +2987,12 @@ Examples:
 @node cue-after, cue, cue-before, Speech Properties
 @subsubsection cue-after
 
address@hidden
address@hidden
 
 @node cue, play-during, cue-after, Speech Properties
 @subsubsection cue
 
address@hidden
address@hidden
 
 @node play-during, speed, cue, Speech Properties
 @subsubsection cue-during
@@ -3545,11 +3548,11 @@ passed to external programs or Emacs Lisp functions to 
be viewed.
 Not all files can be viewed accurately from within an Emacs session (PNG
 files for example, or audio files).  For this reason, the user can
 specify file "viewers" based on MIME content-types.  This is done with
-a standard mailcap file.  @xref{Mailcap Files}
+a standard mailcap file.  @xref{Mailcap Files}.
 
 @findex mm-add-mailcap-entry
 As an alternative, the function @code{mm-add-mailcap-entry} can also be
-used from an appropriate address@hidden  This functions takes three
+used from an appropriate hook.  @xref{Hooks}.  This functions takes three
 arguments, the major type ("@i{image}"), the minor type ("@i{png}"), and
 an assoc list of information about the viewer.  Please see the @sc{url}
 documentation for more specific information on what this assoc list
@@ -3591,7 +3594,7 @@ address@hidden is ftp://ds.internic.net/internet-drafts}.
 SSL is the @code{Secure Sockets Layer} interface developed by Netscape
 Communications @footnote{http://www.netscape.com/}.  Emacs/W3 supports
 @sc{http} transfers over an SSL encrypted channel, if the appropriate files
-have been address@hidden SSL}
+have been installed.  @xref{Installing SSL}.
 @end table
 
 @section Privacy

commit bdc82ec2e447cc81da5bd08453a9d2fe75c51ed4
Author: William M. Perry <address@hidden>
Date:   Mon Jun 28 01:46:56 1999 +0000

    *** empty log message ***

diff --git a/.version b/.version
index 920a139..c739b42 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-43
+44
diff --git a/lisp/url-ldap.el b/lisp/url-ldap.el
index 49c5c36..12072ef 100644
--- a/lisp/url-ldap.el
+++ b/lisp/url-ldap.el
@@ -1,7 +1,7 @@
 ;;; url-ldap.el --- LDAP Uniform Resource Locator retrieval code
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/04/08 11:47:47 $
-;; Version: $Revision: 1.5 $
+;; Created: $Date: 1999/06/28 01:46:56 $
+;; Version: $Revision: 1.6 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -70,7 +70,10 @@
     ("owner"      . url-ldap-dn-formatter)
     ("creatorsname" . url-ldap-dn-formatter)
     ("jpegphoto"     . url-ldap-image-formatter)
+    ("usercertificate" . url-ldap-certificate-formatter)
     ("modifiersname" . url-ldap-dn-formatter)
+    ("namingcontexts" . url-ldap-dn-formatter)
+    ("defaultnamingcontext" . url-ldap-dn-formatter)
     ("member"     . url-ldap-dn-formatter))
   "*An assoc list mapping LDAP attribute names to pretty formatters for them.")
 
@@ -87,10 +90,13 @@
          (url-hexify-string dn)
          "'>" dn "</a>"))
 
+(defun url-ldap-certificate-formatter (data)
+  (setq data (base64-encode-string data))
+  (format "<a title='certificate' 
href='data:application/octet-stream;base64,%s'>[certificate]</a>" 
(url-hexify-string data)))
+
 (defun url-ldap-image-formatter (data)
-  (let ((fname (url-generate-unique-filename "%s.jpg")))
-    (write-region data nil fname)
-    (format "<a title='image' href='file:%s'>[image]</a>" fname)))
+  (format "<img alt='JPEG Photo' src='data:image/jpeg;base64,%s'>" 
+         (url-hexify-string (base64-encode-string data))))
 
 (defun url-ldap (url)
   (if (not (fboundp 'ldap-search-internal))
@@ -122,7 +128,9 @@
           (filter nil)
           (extensions nil)
           (connection nil)
-          (results nil))
+          (results nil)
+          (extract-dn (and (fboundp 'function-max-args)
+                           (= (function-max-args 'ldap-search-internal) 7))))
 
       ;; Get rid of leading /
       (if (string-match "^/" data)
@@ -170,7 +178,10 @@
     
       ;; Now, let's actually do something with it.
       (setq connection (ldap-open host (if binddn (list 'binddn binddn)))
-           results (ldap-search-internal connection filter base-object scope 
attributes nil))
+           results (if extract-dn
+                       (ldap-search-internal connection filter base-object 
scope attributes nil t)
+                     (ldap-search-internal connection filter base-object scope 
attributes nil)))
+                     
       (ldap-close connection)
       (set-buffer (get-buffer-create url-working-buffer))
       (erase-buffer)
@@ -187,6 +198,8 @@
       (mapc (lambda (obj)
              (insert "  <hr>\n"
                      "  <table border=1>\n")
+             (if extract-dn
+                 (insert "   <tr><th colspan=2>" (car obj) "</th></tr>\n"))
              (mapc (lambda (attr)
                      (if (= (length (cdr attr)) 1)
                          ;; single match, easy
@@ -205,7 +218,7 @@
                                           "<br>\n")
                                "</td>"
                                "   </tr>\n")))
-                   obj)
+                   (if extract-dn (cdr obj) obj))
              (insert "  </table>\n"))
            results)
 
diff --git a/lisp/url-mail.el b/lisp/url-mail.el
index fddcad8..91cdad4 100644
--- a/lisp/url-mail.el
+++ b/lisp/url-mail.el
@@ -1,14 +1,14 @@
 ;;; url-mail.el --- Mail Uniform Resource Locator retrieval code
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:09 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/06/28 01:46:57 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;; This file is part of GNU Emacs.
 ;;;
 ;;; GNU Emacs is free software; you can redistribute it and/or modify
 ;;; it under the terms of the GNU General Public License as published by
@@ -88,8 +88,11 @@
                                       url-package-version)) args)))
     (if (and source-url (not (assoc "x-url-from" args)))
        (setq args (cons (list "x-url-from" source-url) args)))
-    (setq args (cons (list "to" to) args)
-         subject (cdr-safe (assoc "subject" args)))
+
+    (if (assoc "to" args)
+       (push to (cdr (assoc "to" args)))
+      (setq args (cons (list "to" to) args)))
+    (setq subject (cdr-safe (assoc "subject" args)))
     (if (fboundp url-mail-command) (funcall url-mail-command) (mail))
     (while args
       (if (string= (caar args) "body")
diff --git a/lisp/url-parse.el b/lisp/url-parse.el
index 3af622f..8e458ff 100644
--- a/lisp/url-parse.el
+++ b/lisp/url-parse.el
@@ -1,14 +1,14 @@
 ;;; url-parse.el --- Uniform Resource Locator parser
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:09 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/06/28 01:46:57 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;; This file is part of GNU Emacs.
 ;;;
 ;;; GNU Emacs is free software; you can redistribute it and/or modify
 ;;; it under the terms of the GNU General Public License as published by
@@ -109,7 +109,7 @@
 (defun url-generic-parse-url (url)
   "Return a vector of the parts of URL.
 Format is:
-[proto username password hostname portnumber file reference attributes fullp]"
+\[proto username password hostname portnumber file reference attributes 
fullp\]"
   (cond
    ((null url)
     (make-vector 9 nil))
@@ -167,22 +167,29 @@ Format is:
                  (setq host (substring host 0 (match-beginning 0))))
              (setq host (downcase host)
                    save-pos (point))))
-       ;; Now check for references
+
+       ;; Gross hack to preserve ';' in data URLs
+
        (setq save-pos (point))
-       (skip-chars-forward "^#")
-       (if (eobp)
-           nil
-          (delete-region
-           (point)
-           (progn
-             (skip-chars-forward "#")
-             (setq refs (buffer-substring (point) (point-max)))
-             (point-max))))
-       (goto-char save-pos)
-       (skip-chars-forward "^;")
-       (if (not (eobp))
-           (setq attr (mm-parse-args (point) (point-max))
-                 attr (nreverse attr)))
+
+       (if (string= "data" prot)
+           (goto-char (point-max))
+         ;; Now check for references
+         (skip-chars-forward "^#")
+         (if (eobp)
+             nil
+           (delete-region
+            (point)
+            (progn
+              (skip-chars-forward "#")
+              (setq refs (buffer-substring (point) (point-max)))
+              (point-max))))
+         (goto-char save-pos)
+         (skip-chars-forward "^;")
+         (if (not (eobp))
+             (setq attr (mm-parse-args (point) (point-max))
+                   attr (nreverse attr))))
+
        (setq file (buffer-substring save-pos (point)))
        (and port (string= port (or (cdr-safe (assoc prot url-default-ports))
                                    ""))
diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index 3cb7031..3a2e3b9 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -1955,6 +1955,24 @@ skip-chars-forward."
 ;; For compatibility with the old parser interface.
 (defalias 'w3-preparse-buffer 'w3-parse-buffer)
 
+(defvar w3-parse-hooks '(w3-parse-munge-ethiopic-text)
+  "*List of hooks to be run before parsing.")
+
+(defun w3-parse-munge-ethiopic-text ()
+  ;; This is for ethiopic text.  Unfortunately, old MULE and new MULE conflict
+  ;; on what exactly to call this function.
+  (condition-case ()
+      (let ((sera-being-called-by-w3 t))
+        (case mule-sysdep-version
+          (2.4
+           (sera-to-fidel-marker))
+          ((xemacs 3.0)
+           (ethio-sera-to-fidel-marker))
+          (4.0
+           (when default-enable-multibyte-characters
+             (ethio-sera-to-fidel-marker)))))
+    (error nil)))
+  
 ;; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 ;; %                                                    %
 ;; % This is the *ONLY* valid entry point in this file! %
@@ -1977,20 +1995,9 @@ Returns a data structure containing the parsed 
information."
     (insert "\n")
     (goto-char (point-min))
     (setq case-fold-search t)           ; allows smaller regexp patterns
-  
-    ;; This is for ethiopic text.  Unfortunately, old MULE and new MULE 
conflict
-    ;; on what exactly to call this function.
-    (condition-case ()
-        (let ((sera-being-called-by-w3 t))
-          (case mule-sysdep-version
-            (2.4
-             (sera-to-fidel-marker))
-            ((xemacs 3.0)
-             (ethio-sera-to-fidel-marker))
-            (4.0
-             (when default-enable-multibyte-characters
-               (ethio-sera-to-fidel-marker)))))
-      (error nil))
+
+    (run-hooks 'w3-parse-hooks);
+
     (goto-char (point-min))
   
     ;; *** Should premunge line boundaries.

commit df5bf1b5a92b4b9ff66b9e5034d795fa519c2dbb
Author: William M. Perry <address@hidden>
Date:   Mon Jun 28 01:40:36 1999 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 9df76dd..3f9c578 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
+1999-06-15  William M. Perry  <address@hidden>
+
+* lisp/url-ldap.el (url-ldap-attribute-formatters): Format naming contexts 
+  as hyperlinks back into the directory.
+  (url-ldap-certificate-formatter): Save certificate data to a file.
+
+1999-04-29  William M. Perry  <address@hidden>
+
+* lisp/font.el (font-find-available-family): Fixes for latest version of
+  the new Emacs redisplay.
+
 1999-04-08  William M. Perry  <address@hidden>
 
+* Emacs/W3 4.0.43 released
+
 * Fixed the hackmap stuff for Emacs 19/20
 
 1999-04-08  Thierry Emery <address@hidden>

commit 693c172237cc08d5cf3fc4ed373e1dbc5cff1574
Author: William M. Perry <address@hidden>
Date:   Thu Apr 29 15:46:58 1999 +0000

    *** empty log message ***

diff --git a/lisp/font.el b/lisp/font.el
index 6d82ec7..14e5b62 100644
--- a/lisp/font.el
+++ b/lisp/font.el
@@ -1,7 +1,7 @@
 ;;; font.el --- New font model
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/31 10:04:21 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/04/29 15:46:58 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: faces
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -954,6 +954,7 @@ for use in the 'weight' field of an mswindows font string.")
                     (font-family default)
                     (x-font-families-for-device device)))
         (cur-family nil)
+        (font-name nil)
         (done nil))
     (if (stringp family)
        (setq family (list family)))
@@ -974,8 +975,9 @@ for use in the 'weight' field of an mswindows font string.")
            (if (= ?- (aref cur-family (1- x)))
                (aset cur-family (1- x) ? ))
            (setq x (1- x))))
-       (setq done (try-font-name (format "-*-%s-*-*-*-*-*-*-*-*-*-*-*-*" 
family) device))))
-    (and done family)))
+       (setq font-name (format "-*-%s-*-*-*-*-*-*-*-*-*-*-*-*" cur-family)
+             done (try-font-name font-name device))))
+    (and done cur-family)))
 
 (defun font-set-face-font-new-redisplay (&optional face font &rest args)
   (cond

commit 6a479d4b99a6f6b6aabcdc71d8c389dced541f27
Author: William M. Perry <address@hidden>
Date:   Thu Apr 8 12:14:43 1999 +0000

    *** empty log message ***

diff --git a/.version b/.version
index d81cc07..920a139 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-42
+43
diff --git a/ChangeLog b/ChangeLog
index 30c05ce..9df76dd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+1999-04-08  William M. Perry  <address@hidden>
+
+* Fixed the hackmap stuff for Emacs 19/20
+
 1999-04-08  Thierry Emery <address@hidden>
 
 * lisp/url-cookie.el (url-cookie-write-file): check
diff --git a/lisp/docomp.el b/lisp/docomp.el
index 592f101..982677b 100644
--- a/lisp/docomp.el
+++ b/lisp/docomp.el
@@ -123,7 +123,6 @@
 
 (defun emacs-build-autoloads (dir autofile)
   (require 'autoload)
-
   (let ((files (directory-files dir t ".*.[eE][lL]$" nil)))
     (save-excursion
       (find-file autofile)
@@ -158,7 +157,7 @@
       (if foundit
          (let ((command-line-args-left (list dir)))
            (custom-make-dependencies))
-       (write-region "\n" nil "cus-dep.el")))))
+       (write-region "\n" nil "cus-load.el")))))
 
 (defun emacs-batch-build-custom-load ()
   (emacs-build-custom-load (car command-line-args-left)))
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 4a901a1..49a7b05 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/04/08 11:47:49 $
-;; Version: $Revision: 1.10 $
+;; Created: $Date: 1999/04/08 12:14:45 $
+;; Version: $Revision: 1.11 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1974,7 +1974,7 @@ Format: (((image-alt row column) . offset) ...)")
       (progn
        (setq w3-display-hackmap (make-sparse-keymap))
        (set-keymap-parent w3-display-hackmap widget-button-keymap)
-       (define-key w3-display-hackmap w3-mouse-button3 'w3-popup-menu)))
+       (define-key w3-display-hackmap (vector w3-mouse-button3) 
'w3-popup-menu)))
   (let ((st (point-min))
        (inhibit-read-only t)
        info nd node face)
diff --git a/lisp/w3-forms.el b/lisp/w3-forms.el
index 0a5a528..d2b668c 100644
--- a/lisp/w3-forms.el
+++ b/lisp/w3-forms.el
@@ -1,7 +1,7 @@
 ;;; w3-forms.el --- Emacs-w3 forms parsing code for new display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/04/08 11:47:50 $
-;; Version: $Revision: 1.3 $
+;; Created: $Date: 1999/04/08 12:14:46 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: faces, help, comm, data, languages
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -66,7 +66,7 @@
     (define-key map "\t"          'w3-widget-forward)
     (define-key map "\C-k"        'widget-kill-line)
     (define-key map "\C-a"        'widget-beginning-of-line)
-    (define-key map w3-mouse-button3 'w3-popup-menu)
+    (define-key map (vector w3-mouse-button3) 'w3-popup-menu)
     (if eol-loc
        (define-key map eol-loc   'widget-end-of-line))
     map))

commit 61e27264c1cbfe55c9e17b4d37430b57ffac0aee
Author: William M. Perry <address@hidden>
Date:   Thu Apr 8 11:47:42 1999 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index c03d73d..30c05ce 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,86 @@
+1999-04-08  Thierry Emery <address@hidden>
+
+* lisp/url-cookie.el (url-cookie-write-file): check
+  `url-cookies-changed-since-last-save' and that the file is writable.
+  (url-cookie-handle-set-cookie): set `url-cookies-changed-since-last-save'.
+
+* lisp/url-http.el (url-create-mime-request): Moved Proxy Authorization up
+  (before Cookie and Authorization).
+
+* lisp/url-vars.el (url-cookies-changed-since-last-save): new variable.
+
+* lisp/url.el (url-write-global-history): call `url-cookie-write-file' if
+  `url-privacy-level' tolerates cookies.
+
+1999-04-08  Thierry Emery <address@hidden>
+
+* lisp/w3-display.el (w3-resurrect-images): corrected regexp for
+  removing trailing blanks from alt.
+
+1999-04-05  William M. Perry  <address@hidden>
+
+* lisp/w3-forms.el (w3-form-keymap): Ditto for form fields.
+
+* lisp/w3-display.el (w3-resurrect-hyperlinks): Hack around lossage in
+  XEmacs' Widget package.  button3 was used to activate the widget instead
+  of popping up a context-sensitive menu like everywhere else.
+
+1999-04-03  William M. Perry  <address@hidden>
+
+* lisp/w3-display.el: Make sure we load mule-sysdp at compile time.
+
+1999-04-03  Thierry Emery  <address@hidden>
+
+* lisp/url-file.el (inline): require `w3-sysdp', necessary for
+  `add-minor-mode' in Gnu Emacs when Emacs-W3 is autoloaded through
+  `url-dired-find-file'.
+  (url-insert-possibly-compressed-file): set `url-current-mime-encoding'.
+  (url-dired-find-file): handle ange-ftp dired.
+  (url-file-asynch-callback, url-file): call
+  `url-insert-possibly-compressed-file' instead of
+  `insert-file-contents-literally'.
+  (url-file): compute `url-current-mime-type' and `viewer' from
+  `uncompressed-filename'; specify extension for
+  `mm-generate-unique-filename'.
+
+* lisp/url.el (url-file-directly-accessible-p): call
+  `url-host-is-local-p' and check that the file is not compressed.
+  (url-generate-unique-filename-counter): new variable.
+  (url-generate-unique-filename): use
+  `url-generate-unique-filename-counter' to ensure that filenames are
+  unique within an Emacs session.
+
+1999-04-03  Thierry Emery  <address@hidden>
+
+* lisp/url.el (url-write-global-history): call
+  `w3-write-explicit-encodings'.
+
+* lisp/w3-cus.el (w3-explicit-encodings-file): new user option, which
+  specifies where to save `w3-explicit-conversion-tree'.
+
+* lisp/w3-vars.el: new variables
+  w3-explicit-conversion-tree: Tree to hold explicit coding systems
+  for URLs and their superdirs:
+  ((hostN default-coding (dirN-1 default-coding (dirN-1-1 ...) ...) ...)
+    ...),
+  w3-explicit-encodings-changed-since-last-save: whether
+  `w3-explicit-conversion-tree' needs saving.
+
+* lisp/w3.el:
+  w3-convert-code-for-mule: call `w3-recall-explicit-coding-system'
+  after checking `w3-explicit-coding-system' and `mmcharset'.
+  w3-reload-document: call `w3-record-explicit-coding-system'.
+  w3-recall-explicit-coding-system, w3-find-explicit-coding-system,
+  w3-record-explicit-coding-system, w3-add-explicit-coding-system,
+  w3-write-explicit-encodings: new functions to perform retrieval and
+  storage of user-specified (through C-u g `w3-reload-document')
+  explicit coding systems.
+  w3-do-setup: load `w3-explicit-encodings-file' if it exists.
+
 1999-03-24  William M. Perry  <address@hidden>
 
+* Emacs/W3 4.0.40 released
+
 * lisp/url.el (url-do-setup): Always register the LDAP URL format.
 
 * lisp/url-ldap.el (url-ldap): Deal with non-LDAP enabled emacsen better.
@@ -4256,7 +4337,7 @@ text-align - this replaces the old 'align' attribute
 Reimplemented inlined styles.
 
 * default.css: Varius updates to take advantage of the new CSS properties
-white-space, list-style, etc.
+  white-space, list-style, etc.
 
 * w3-style.el: Handle url() and rgb() notation in color specifications
 
@@ -4270,13 +4351,13 @@ Sat Nov 23 02:10:37 1996  William M. Perry  
<address@hidden>
 
 * custom.el, custom-edit.el: Synch'd up to custom 1.0.1
 
-* w3-display.el:
-Better handling of <hr> and <center>, and line spacing in general
+* w3-display.el: Better handling of <hr> and <center>, and line spacing in
+  general
 
 * default.css: Updates to default stylesheet to deal with <center> and <div>
 
-* w3.el, url.el, url-vars.el, url-http.el:
-Patches from Thierry Emery to allow multiple asynch fetches.
+* w3.el, url.el, url-vars.el, url-http.el: Patches from Thierry Emery to
+  allow multiple asynch fetches.
 
 Fri Nov 22 22:26:35 1996  William M. Perry  <address@hidden>
 
@@ -4287,9 +4368,8 @@ Fri Nov 22 22:26:35 1996  William M. Perry  
<address@hidden>
 * w3.el:
 When saving a document as html source, try to get into the 'head' before 
inserting the base.
 
-* w3-display.el, w3-style.el:
-Stylesheets now store all there information as property lists instead
-of assoc lists.  Just easier.
+* w3-display.el, w3-style.el: Stylesheets now store all there information
+  as property lists instead of assoc lists.  Just easier.
 
 * font.el: Fix for font-normalize-color under nextstep
 
@@ -4307,16 +4387,16 @@ Mon Nov 18 16:26:06 1996  William M. Perry  
<address@hidden>
 
 Thu Nov 14 22:39:36 1996  William M. Perry  <address@hidden>
 
-* w3.el: Changed this so you can actually just do a (require 'w3-sysdp) and
-each function will check to see if it should overwrite, instead of
-conditionalizing that on the whole file.
+* w3.el: Changed this so you can actually just do a (require 'w3-sysdp)
+  and each function will check to see if it should overwrite, instead of
+  conditionalizing that on the whole file.
 
 * url.el: *** empty log message ***
 
-* images.el, font.el, docomp.el, w3-sysdp.el:
-Changed this so you can actually just do a (require 'w3-sysdp) and
-each function will check to see if it should overwrite, instead of
-conditionalizing that on the whole file.
+* images.el, font.el, docomp.el, w3-sysdp.el: Changed this so you can
+  actually just do a (require 'w3-sysdp) and each function will check to
+  see if it should overwrite, instead of conditionalizing that on the
+  whole file.
 
 * w3-display.el: Moved some macros around.
 
diff --git a/etc/default.css b/etc/default.css
index d0f46a0..9e473b6 100644
--- a/etc/default.css
+++ b/etc/default.css
@@ -1,12 +1,12 @@
 /******************************************************************************
 **       File: default.css
-**    Purpose: Default Stylesheet for Emacs-W3
+**    Purpose: Default Stylesheet for Emacs/W3
 **       Info: Copyright (c) 1995-1996 William M. Perry <address@hidden>
 **             Copyright (c) 1997 Free Software Foundation, Inc.
 **    Created: William M. Perry <address@hidden>, Aug-31-1995
 ** Maintainer: William M. Perry <address@hidden>
 **
-**  This contains the top level fallback default styles for Emacs-w3
+**  This contains the top level fallback default styles for Emacs/W3
 **
 *******************************************************************************
 **
@@ -26,14 +26,16 @@
 **    speech - aural presentation
 **       all - the default value, applies to all output devices
 **
-** There are a few special Emacs-W3 sections
+** There are a few special Emacs/W3 sections
 **
-**  emacs - only include this chunk if you are using Emacs 19
-** xemacs - only include this chunk if you are using XEmacs
-**  light - only include this chunk if you are using a light background
-**   dark - only include this chunk if you are using a dark background
-**    tty - only include this chunk if you are using a TTY
-** ansi-tty - "  include this chunk if you are using an ANSI-capable TTY 
+**     emacs - only include this chunk if you are using Emacs 19
+**    xemacs - only include this chunk if you are using XEmacs
+** multifont - only include this chunk if you are using a multi-font capable 
Emacs variant
+**   unifont - only include this chunk if you are using a uni-font capable 
Emacs variant
+**     light - only include this chunk if you are using a light background
+**      dark - only include this chunk if you are using a dark background
+**       tty - only include this chunk if you are using a TTY
+**  ansi-tty - only include this chunk if you are using an ANSI-capable TTY 
 *******************************************************************************
 **
 ** There are some things this stylesheet cannot really specify, that we 
@@ -57,7 +59,7 @@ h4,h5,h6  {
             font-weight : bold;
           }
 
address@hidden xemacs {
address@hidden multifont {
       h1  { font-size : +12pt }
       h2  { font-size : +6pt  }
       h3  { font-size : +4pt  }
@@ -66,7 +68,7 @@ h4,h5,h6  {
 }
 
 /* This causes problems with Emacs 19 */
address@hidden xemacs {
address@hidden multifont {
    pre,xmp,
   plaintext { font-family: monospace }
 key,code,tt { font-family: monospace }
@@ -77,7 +79,7 @@ key,code,tt { font-family: monospace }
 ** the headers stand out somehow.
 */
 
address@hidden emacs {
address@hidden unifont {
 h1,h2,h3,
 h4,h5,h6  { text-decoration: underline; }
        h1 { color: rgb(0,255,255); }   // cyan
@@ -91,7 +93,7 @@ strong,em { color: red         }
       dfn { font-style: italic }
  s,strike { color: green       }
 
-} // @media emacs
+} // @media unifont
 
        p  { display: block }
  pre,xmp  { display: block; white-space: pre; }
@@ -99,7 +101,7 @@ blockquote{ display: block; margin-left: 5em; margin-right: 
5em; }
 
 /*
 ** How to draw form elements.
-** This is an extension in Emacs-W3 (and perhaps soon E-Scape)
+** This is an extension in Emacs/W3 (and perhaps soon E-Scape)
 ** Since there are so many different types of input fields, you should be
 ** able to control formatting based on that.  Enter pseudo-classes.
 **
@@ -277,6 +279,7 @@ h4,h5,h6 { voice-family: paul; stress: 2; richness: 9; }
 
 li,dt,dd { pitch: 6; richness: 6; }
       dt { stress: 8; }
+      th { pitch: 6; pitch-range: 6; stress: 9; richness: 9; }
 
 pre,xmp,plaintext,key,code,tt { pitch: 5; 
                                pitch-range: 0;
diff --git a/lisp/url-cookie.el b/lisp/url-cookie.el
index d428f64..19cd197 100644
--- a/lisp/url-cookie.el
+++ b/lisp/url-cookie.el
@@ -1,7 +1,7 @@
 ;;; url-cookie.el --- Netscape Cookie support
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/24 19:29:26 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/04/08 11:47:46 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -111,21 +111,26 @@
 ;;;###autoload
 (defun url-cookie-write-file (&optional fname)
   (setq fname (or fname url-cookie-file))
-  (url-cookie-clean-up)
-  (url-cookie-clean-up t)
-  (save-excursion
-    (set-buffer (get-buffer-create " *cookies*"))
-    (erase-buffer)
-    (fundamental-mode)
-    (insert ";; Emacs-W3 HTTP cookies file\n"
-           ";; Automatically generated file!!! DO NOT EDIT!!!\n\n"
-           "(setq url-cookie-storage\n '")
-    (pp url-cookie-storage (current-buffer))
-    (insert ")\n(setq url-cookie-secure-storage\n '")
-    (pp url-cookie-secure-storage (current-buffer))
-    (insert ")\n")
-    (write-file fname)
-    (kill-buffer (current-buffer))))
+  (cond
+   ((not url-cookies-changed-since-last-save) nil)
+   ((not (file-writable-p fname))
+    (message "Cookies file %s (see variable `url-cookie-file') is unwritable." 
fname))
+   (t
+    (url-cookie-clean-up)
+    (url-cookie-clean-up t)
+    (save-excursion
+      (set-buffer (get-buffer-create " *cookies*"))
+      (erase-buffer)
+      (fundamental-mode)
+      (insert ";; Emacs-W3 HTTP cookies file\n"
+             ";; Automatically generated file!!! DO NOT EDIT!!!\n\n"
+             "(setq url-cookie-storage\n '")
+      (pp url-cookie-storage (current-buffer))
+      (insert ")\n(setq url-cookie-secure-storage\n '")
+      (pp url-cookie-secure-storage (current-buffer))
+      (insert ")\n")
+      (write-file fname)
+      (kill-buffer (current-buffer))))))
 
 (defun url-cookie-store (name value &optional expires domain path secure)
   "Stores a netscape-style cookie"
@@ -305,6 +310,7 @@
 
 ;;;###autoload
 (defun url-cookie-handle-set-cookie (str)
+  (setq url-cookies-changed-since-last-save t)
   (let* ((args (mm-parse-args str nil t)) ; Don't downcase names
         (case-fold-search t)
         (secure (and (assoc* "secure" args :test 'url-header-comparison) t))
diff --git a/lisp/url-file.el b/lisp/url-file.el
index ede42cc..015b95e 100644
--- a/lisp/url-file.el
+++ b/lisp/url-file.el
@@ -1,7 +1,7 @@
 ;;; url-file.el --- File retrieval code
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/28 16:29:16 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/04/08 11:47:47 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -28,6 +28,7 @@
 
 (require 'url-vars)
 (require 'mule-sysdp)
+(require 'w3-sysdp)
 (require 'url-parse)
 
 (defun url-insert-possibly-compressed-file (fname &rest args)
@@ -80,6 +81,8 @@
                                                 url-current-mime-headers)))
           (t
            (error "File not found %s" fname))))
+    (setq url-current-mime-encoding
+         (cdr (assoc "content-transfer-encoding" url-current-mime-headers)))
     (apply 'insert-file-contents fname args)
     (set-buffer-modified-p nil)))
 
@@ -100,7 +103,11 @@
 (defun url-dired-find-file ()
   "In dired, visit the file or directory named on this line, using Emacs-W3."
   (interactive)
-  (w3-open-local (dired-get-filename)))
+  (let ((filename (dired-get-filename)))
+    (cond ((string-match "/\\(address@hidden):\\(/.*\\)" filename)
+          (w3-fetch (concat "file://" (match-string 1 filename) (match-string 
2 filename))))
+         (t
+          (w3-open-local filename)))))
 
 (defun url-dired-find-file-mouse (event)
   "In dired, visit the file or directory name you click on, using Emacs-W3."
@@ -163,7 +170,7 @@
     (if (not buff)
        (setq buff (generate-new-buffer " *url-asynch-file*")))
     (set-buffer buff)
-    (insert-file-contents-literally name)
+    (url-insert-possibly-compressed-file name)
     (condition-case ()
        (delete-file name)
       (error nil))))
@@ -202,10 +209,9 @@ and exchanges any | in the drive identifier with a :."
                              (string-match "^/[a-zA-Z]:/" file))
                         (substring file 1)
                       file)))
-        (viewer (mm-mime-info
-                 (mm-extension-to-mime (url-file-extension file))))
         (pos-index (if url-directory-index-file
-                       (expand-file-name url-directory-index-file filename))))
+                       (expand-file-name url-directory-index-file filename)))
+        uncompressed-filename viewer)
     (url-clear-tmp-buffer)
     (and user pass
         (cond
@@ -226,8 +232,14 @@ and exchanges any | in the drive identifier with a :."
             (file-exists-p pos-index)
             (file-readable-p pos-index))
        (setq filename pos-index))
+
+    (setq uncompressed-filename (if (string-match "\\.\\(gz\\|Z\\|z\\)$" 
filename)
+                                   (substring filename 0 (match-beginning 0))
+                                 filename))
     (setq url-current-mime-type (mm-extension-to-mime
-                                (url-file-extension filename)))
+                                (url-file-extension uncompressed-filename)))
+    (setq viewer (mm-mime-info url-current-mime-type))
+
     (cond
      ((file-directory-p filename)
       (if (not (string-match "/$" filename))
@@ -246,12 +258,14 @@ and exchanges any | in the drive identifier with a :."
        ((file-exists-p (concat filename ".z"))
        (setq filename (concat filename ".z")))
        (t nil))
-      (let ((new (mm-generate-unique-filename)))
+      (let* ((extension (url-file-extension filename))
+            (new (mm-generate-unique-filename (and (> (length extension) 0)
+                                                   (concat "%s." extension)))))
        (cond
         ((url-host-is-local-p site)
          (if (and (file-exists-p filename)
                   (file-readable-p filename))
-             (insert-file-contents-literally filename))
+             (url-insert-possibly-compressed-file filename))
          (if (featurep 'efs)
              (url-file-asynch-callback nil nil nil nil nil
                                        url-current-callback-func
diff --git a/lisp/url-http.el b/lisp/url-http.el
index 9b9c1e6..39463e9 100644
--- a/lisp/url-http.el
+++ b/lisp/url-http.el
@@ -1,7 +1,7 @@
 ;;; url-http.el --- HTTP Uniform Resource Locator retrieval code
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/28 22:18:19 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/04/08 11:47:47 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -178,9 +178,9 @@
            "%s"                        ; Languages we understand
            "Accept: %s\r\n"            ; Types we understand
            "%s"                        ; User agent
+           "%s"                        ; Proxy Authorization
            "%s"                        ; Authorization
            "%s"                        ; Cookies
-           "%s"                        ; Proxy Authorization
            "%s"                        ; If-modified-since
            "%s"                        ; Where we came from
            "%s"                        ; Any extra headers
@@ -199,10 +199,10 @@
             "")
           url-mime-accept-string
           (url-http-user-agent-string)
+          (or proxy-auth "")
           (or auth "")
           (url-cookie-generate-header-lines
            host real-fname (equal "https" (url-type url-current-object)))
-          (or proxy-auth "")
           (if (and (not no-cache)
                    (member url-request-method '("GET" nil)))
               (let ((tm (url-is-cached url)))
diff --git a/lisp/url-ldap.el b/lisp/url-ldap.el
index 547ebaf..49c5c36 100644
--- a/lisp/url-ldap.el
+++ b/lisp/url-ldap.el
@@ -1,7 +1,7 @@
 ;;; url-ldap.el --- LDAP Uniform Resource Locator retrieval code
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/03/25 05:30:04 $
-;; Version: $Revision: 1.4 $
+;; Created: $Date: 1999/04/08 11:47:47 $
+;; Version: $Revision: 1.5 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -68,6 +68,9 @@
 (defvar url-ldap-attribute-formatters
   '(("mail"       . (lambda (x) (format "<a href='mailto:%s'>%s</a>" x x)))
     ("owner"      . url-ldap-dn-formatter)
+    ("creatorsname" . url-ldap-dn-formatter)
+    ("jpegphoto"     . url-ldap-image-formatter)
+    ("modifiersname" . url-ldap-dn-formatter)
     ("member"     . url-ldap-dn-formatter))
   "*An assoc list mapping LDAP attribute names to pretty formatters for them.")
 
@@ -75,13 +78,20 @@
   (or (cdr-safe (assoc (downcase n) url-ldap-pretty-names)) n))
 
 (defsubst url-ldap-attribute-pretty-desc (n v)
+  (if (string-match "^\\([^;]+\\);" n)
+      (setq n (match-string 1 n)))
   (funcall (or (cdr-safe (assoc (downcase n) url-ldap-attribute-formatters)) 
'identity) v))
 
 (defun url-ldap-dn-formatter (dn)
   (concat "<a href='/"
          (url-hexify-string dn)
          "'>" dn "</a>"))
-  
+
+(defun url-ldap-image-formatter (data)
+  (let ((fname (url-generate-unique-filename "%s.jpg")))
+    (write-region data nil fname)
+    (format "<a title='image' href='file:%s'>[image]</a>" fname)))
+
 (defun url-ldap (url)
   (if (not (fboundp 'ldap-search-internal))
       (progn
diff --git a/lisp/url-vars.el b/lisp/url-vars.el
index 0803177..abfcc88 100644
--- a/lisp/url-vars.el
+++ b/lisp/url-vars.el
@@ -1,14 +1,14 @@
 ;;; url-vars.el --- Variables for Uniform Resource Locator tool
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:12 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/04/08 11:47:48 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;; This file is part of GNU Emacs.
 ;;;
 ;;; GNU Emacs is free software; you can redistribute it and/or modify
 ;;; it under the terms of the GNU General Public License as published by
@@ -38,7 +38,7 @@
     (defmacro defcustom (var value doc &rest args) 
       (` (defvar (, var) (, value) (, doc))))))
 
-(defconst url-version (let ((x "$State: Exp $"))
+(defconst url-version (let ((x "$State: p4.0pre.44 $"))
                        (if (string-match "State: \\([^ \t\n]+\\)" x)
                            (substring x (match-beginning 1) (match-end 1))
                          x))
@@ -436,6 +436,9 @@ has been parsed.")
 (defvar url-history-changed-since-last-save nil
   "Whether the history list has changed since the last save operation.")
 
+(defvar url-cookies-changed-since-last-save nil
+  "Whether the cookies list has changed since the last save operation.")
+
 (defvar url-proxy-basic-authentication nil
   "Internal structure - do not modify!")
   
@@ -599,6 +602,9 @@ Each hook is called with a single argument URL and should 
return a tranformed
 url with a valid scheme (e.g., \"gnu\" --> \"http://www.gnu.org/\";), or nil
 otherwise.")
 
+(defvar url-load-hook nil
+  "*Hooks to be run after initalizing the URL library.")
+
 ;;; Make OS/2 happy - yeeks
 (defvar        tcp-binary-process-input-services nil
   "*Make OS/2 happy with our CRLF pairs...")
diff --git a/lisp/url.el b/lisp/url.el
index 54f9f83..43aab02 100644
--- a/lisp/url.el
+++ b/lisp/url.el
@@ -1,13 +1,13 @@
 ;;; url.el --- Uniform Resource Locator retrieval tool
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/03/25 05:30:04 $
-;; Version: $Revision: 1.10 $
+;; Created: $Date: 1999/04/08 11:47:48 $
+;; Version: $Revision: 1.11 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;; LCD Archive Entry:
 ;;; url|William M. Perry|address@hidden|
 ;;; Functions for retrieving/manipulating URLs|
-;;; $Date: 1999/03/25 05:30:04 $|$Revision: 1.10 $|Location Undetermined
+;;; $Date: 1999/04/08 11:47:48 $|$Revision: 1.11 $|Location Undetermined
 ;;;
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -479,9 +479,11 @@ The return value is a cons of the url and the date last 
accessed as a string"
   "Returns t iff the specified URL is directly accessible
 on your filesystem.  (nfs, local file, etc)."
   (let* ((urlobj (if (vectorp url) url (url-generic-parse-url url)))
-        (type (url-type urlobj)))
+        (type (url-type urlobj))
+        (host (url-host urlobj)))
     (and (member type '("file" "ftp"))
-        (not (url-host urlobj)))))
+        (url-host-is-local-p host)
+        (not (string-match "\\.\\(gz\\|Z\\|z\\)$" url)))))
 
 ;;;###autoload
 (defun url-file-attributes (url &rest args)
@@ -746,24 +748,30 @@ numbers, etc."
                name (format "%s<%d>" start x)))
        name))))
 
+(defvar url-generate-unique-filename-counter 0)
+
 (defun url-generate-unique-filename (&optional fmt)
   "Generate a unique filename in url-temporary-directory"
+  (setq url-generate-unique-filename-counter
+       (1+ url-generate-unique-filename-counter))
   (if (not fmt)
       (let ((base (format "url-tmp.%d" (user-real-uid)))
            (fname "")
-           (x 0))
+           (x url-generate-unique-filename-counter))
        (setq fname (format "%s%d" base x))
        (while (file-exists-p (expand-file-name fname url-temporary-directory))
          (setq x (1+ x)
                fname (concat base (int-to-string x))))
+       (setq url-generate-unique-filename-counter x)
        (expand-file-name fname url-temporary-directory))
     (let ((base (concat "url" (int-to-string (user-real-uid))))
          (fname "")
-         (x 0))
+         (x url-generate-unique-filename-counter))
       (setq fname (format fmt (concat base (int-to-string x))))
       (while (file-exists-p (expand-file-name fname url-temporary-directory))
        (setq x (1+ x)
              fname (format fmt (concat base (int-to-string x)))))
+      (setq url-generate-unique-filename-counter x)
       (expand-file-name fname url-temporary-directory))))
 
 (defun url-lazy-message (&rest args)
@@ -1747,7 +1755,12 @@ user for what type to save as."
         ((looking-at "(setq") (url-write-Emacs-history fname))
         (t (url-write-Emacs-history fname)))
        (kill-buffer (current-buffer))))))
-  (setq url-history-changed-since-last-save nil))
+  (setq url-history-changed-since-last-save nil)
+  (setq url-history-changed-since-last-save nil)
+  (if (not (or (eq url-privacy-level 'paranoid)
+              (and (listp url-privacy-level) (memq 'cookies 
url-privacy-level))))
+      (url-cookie-write-file))
+  (w3-write-explicit-encodings))
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/lisp/w3-cus.el b/lisp/w3-cus.el
index 8d285cb..6617fdf 100644
--- a/lisp/w3-cus.el
+++ b/lisp/w3-cus.el
@@ -1,7 +1,7 @@
 ;;; w3-cus.el --- Customization support for Emacs-W3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/23 14:19:56 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/04/08 11:47:49 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: comm, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -114,6 +114,13 @@ menus to get to them."
   :group 'w3-files
   :type 'file)
 
+(defcustom w3-explicit-encodings-file nil
+  "*Explicit encodings filename.
+This should be the name of a file that is used to keep user-specified
+explicit encodings for URLs."
+  :group 'w3-files
+  :type 'file)
+
 (defcustom w3-documentation-root "http://www.cs.indiana.edu/elisp/w3/";
   "*Where the w3 documentation lives.  This MUST end in a slash."
   :group 'w3-files
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 7f6f41d..4a901a1 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/03/25 05:30:05 $
-;; Version: $Revision: 1.9 $
+;; Created: $Date: 1999/04/08 11:47:49 $
+;; Version: $Revision: 1.10 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -478,7 +478,8 @@ If the face already exists, it is unmodified."
                           (list 'personality (car w3-active-voices))))
   )
 
-(require 'mule-sysdp)
+(eval-and-compile
+  (require 'mule-sysdp))
 
 (defun w3-display-get-cookie (args)
   (if (not (fboundp 'cookie))
@@ -946,7 +947,7 @@ If the face already exists, it is unmodified."
 (defmacro w3-image-alt (src)
   (`
    (let* ((doc-alt (w3-get-attribute 'alt))
-         (alt (or doc-alt
+         (alt (or (and (stringp doc-alt) (string-match "[^ \t\n]" doc-alt) 
doc-alt)
                   (cond
                    ((null w3-auto-image-alt) "")
                    ((eq t w3-auto-image-alt)
@@ -1930,7 +1931,8 @@ Format: (((image-alt row column) . offset) ...)")
            (setq nd (or (next-single-property-change st 'w3-hyperimage-info)
                         (point-max)))
            (let* ((raw-alt (widget-get info 'alt))
-                  (drawn-alt (if (and (stringp raw-alt) (string-match "\\([^ 
\t\n]+\\)[ \t\n]" raw-alt))
+                  ;; remove trailing blanks:
+                  (drawn-alt (if (and (stringp raw-alt) (string-match "\\(.*[^ 
\t\n]+\\)[ \t\n]+$" raw-alt))
                                  (substring raw-alt 0 (match-end 1))
                                raw-alt))
                   (row (widget-get info 'row))
@@ -1964,7 +1966,15 @@ Format: (((image-alt row column) . offset) ...)")
       (setq st (next-single-property-change st 'w3-hyperimage-info)))
     (setq w3-resurrect-images-offset nil)))
 
+(require 'w3-mouse)
+(defvar w3-display-hackmap nil "Keymap used for hyperlink widgets")
+  
 (defun w3-resurrect-hyperlinks ()
+  (if (and (not w3-display-hackmap) w3-running-xemacs)
+      (progn
+       (setq w3-display-hackmap (make-sparse-keymap))
+       (set-keymap-parent w3-display-hackmap widget-button-keymap)
+       (define-key w3-display-hackmap w3-mouse-button3 'w3-popup-menu)))
   (let ((st (point-min))
        (inhibit-read-only t)
        info nd node face)
@@ -1975,6 +1985,7 @@ Format: (((image-alt row column) . offset) ...)")
                         (point-max)))
            (apply 'widget-convert-text 'link st nd st nd (nconc
                                                           (list :start st
+                                                                :button-keymap 
w3-display-hackmap
                                                                 :end nd)
                                                           info))))
       (setq st (next-single-property-change st 'w3-hyperlink-info)))))
diff --git a/lisp/w3-forms.el b/lisp/w3-forms.el
index acb90ef..0a5a528 100644
--- a/lisp/w3-forms.el
+++ b/lisp/w3-forms.el
@@ -1,7 +1,7 @@
 ;;; w3-forms.el --- Emacs-w3 forms parsing code for new display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/01/05 12:41:59 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/04/08 11:47:50 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: faces, help, comm, data, languages
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -34,6 +34,7 @@
 
 (eval-and-compile
   (require 'w3-keyword)
+  (require 'w3-mouse)
   (require 'w3-display)
   (require 'widget)
   (condition-case nil
@@ -65,6 +66,7 @@
     (define-key map "\t"          'w3-widget-forward)
     (define-key map "\C-k"        'widget-kill-line)
     (define-key map "\C-a"        'widget-beginning-of-line)
+    (define-key map w3-mouse-button3 'w3-popup-menu)
     (if eol-loc
        (define-key map eol-loc   'widget-end-of-line))
     map))
diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index ae8dfb3..3cb7031 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -256,7 +256,6 @@ which must be a string to use as the error message."
 ;;; General entity references and numeric character references.
 ;;;
 
-;; *** MULE conversion?
 ;; *** I18N HTML support?
 
 (let ((html-entities w3-html-entities))
@@ -285,19 +284,25 @@ which must be a string to use as the error message."
 ;; &computer; as part of a value of a form input when you display it and/or
 ;; submit it?!
 
-(let ((html-entities w3-graphic-entities)
-      (cur nil))
-  (while html-entities
-    (setq cur (car html-entities)
-          html-entities (cdr html-entities))
-    (put (nth 0 cur) 'html-entity-expansion
-        (cons 'nil (format "<img src=\"%s/%s%s\" alt=\"%s\">"
-                            w3-icon-directory
-                            (nth 1 cur)
-                            (if w3-icon-format
-                                (concat "." (symbol-name w3-icon-format))
-                              "")
-                            (or (nth 3 cur) (nth 2 cur)))))))
+;; The HTML graphics entities code is going away - nobody uses it, and
+;; I cannot even find references to it on the w3c site.  I am leaving
+;; this code in as an example of how to make the html entity expansion
+;; stuff work a little differently.
+;; WMP 4/4/1999
+
+;;(let ((html-entities w3-graphic-entities)
+;;      (cur nil))
+;;  (while html-entities
+;;    (setq cur (car html-entities)
+;;          html-entities (cdr html-entities))
+;;    (put (nth 0 cur) 'html-entity-expansion
+;;      (cons 'nil (format "<img src=\"%s/%s%s\" alt=\"%s\">"
+;;                            w3-icon-directory
+;;                            (nth 1 cur)
+;;                            (if w3-icon-format
+;;                                (concat "." (symbol-name w3-icon-format))
+;;                              "")
+;;                            (or (nth 3 cur) (nth 2 cur)))))))
 
 ;; These are the general entities in HTML 3.0 in terms of which the math
 ;; shortrefs are defined:
@@ -412,7 +417,7 @@ which must be a string to use as the error message."
       ;; wrongo!  Apparently, mule doesn't do sane things with char-to-string
       ;; -wmp 7/9/96
       (let ((repl (cdr-safe (assq w3-p-s-num 
w3-invalid-sgml-char-replacement))))
-            (insert (or repl (mule-make-iso-character w3-p-s-num)))))
+        (insert (or repl (mule-make-iso-character w3-p-s-num)))))
      ((looking-at "&#\\(re\\|rs\\|space\\|tab\\)[\ ;\n]?") ; \n should be \r
       (replace-match (assq (upcase (char-after (+ 3 (point))))
                            '(;; *** Strictly speaking, record end should be
@@ -2625,7 +2630,15 @@ Returns a data structure containing the parsed 
information."
                          (concat "[" (w3-invalid-sgml-chars) "]")))
            (w3-debug-html
             (format "Invalid SGML character: %c" (char-after (point))))
-           (insert (or (cdr-safe (assq (char-after (point))
+           ;; This will avoid ebola warnings... but do we reallly want
+           ;; to be nuking the invalid character if we are in a MULE
+           ;; buffer... ISO2022 could have 'invalid' HTML characters,
+           ;; but still parse well.  But would this only ever happen
+           ;; if for some reason we did not decode the SJIS/ISO2022
+           ;; encodings?  Mislabeled MIME with no charset?
+           ;;
+           ;; FIXME FIXME FIXME!!!!!
+           (insert (or (cdr-safe (assq (char-int (char-after (point)))
                                        w3-invalid-sgml-char-replacement)) ""))
            (delete-char 1))
           ((eobp)
diff --git a/lisp/w3-vars.el b/lisp/w3-vars.el
index aca559b..9bd7af3 100644
--- a/lisp/w3-vars.el
+++ b/lisp/w3-vars.el
@@ -1,7 +1,7 @@
 ;;; w3-vars.el,v --- All variable definitions for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/01/07 15:10:36 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/04/08 11:47:52 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: comm, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -34,7 +34,7 @@
 (require 'wid-edit)                    ; For `widget-keymap'
 
 (defconst w3-version-number
-  (let ((x "$State: p4.0pre.42 $"))
+  (let ((x "$State: p4.0pre.44 $"))
     (if (string-match "State:[ \t\n]+.\\([^ \t\n]+\\)" x)
        (setq x (substring x (match-beginning 1) (match-end 1)))
       (setq x (substring x 1)))
@@ -42,7 +42,7 @@
      (function (lambda (x) (if (= x ?-) "." (char-to-string x)))) x ""))
   "Version # of w3-mode.")
 
-(defconst w3-version-date (let ((x "$Date: 1999/01/07 15:10:36 $"))
+(defconst w3-version-date (let ((x "$Date: 1999/04/08 11:47:52 $"))
                            (if (string-match "Date: \\([^ \t\n]+\\)" x)
                                (substring x (match-beginning 1) (match-end 1))
                              x))
@@ -246,72 +246,6 @@ in later garbage collections taking more time.")
     )
   "*An assoc list of entity names and how to actually display them.")
 
-(defvar w3-graphic-entities
-  '(
-    (archive             "archive"                )
-    (audio               "audio"                  )
-    (binary.document     "binary.document"        )
-    (binhex.document     "binhex.document"        )
-    (calculator          "calculator"             )
-    (caution             "caution"                )
-    (cd.i                "cd.i"                   )
-    (cd.rom              "cd.rom"                 )
-    (clock               "clock"                  )
-    (compressed.document "compressed.document"    )
-    (disk.drive          "disk.drive"             )
-    (diskette            "diskette"               )
-    (document            "document"               )
-    (fax                 "fax"                    )
-    (filing.cabinet      "filing.cabinet"         )
-    (film                "film"                   )
-    (fixed.disk          "fixed.disk"             )
-    (folder              "folder"                 )
-    (form                "form"                   )
-    (ftp                 "ftp"                    )
-    (glossary            "glossary"               )
-    (gopher              "gopher"                 )
-    (home                "home"                   )
-    (html                "html"                   )
-    (image               "image"                  )
-    (index               "index"                  )
-    (keyboard            "keyboard"               )
-    (mail                "mail"                   )
-    (mail.in             "mail.in"                )
-    (mail.out            "mail.out"               )
-    (map                 "map"                    )
-    (mouse               "mouse"                  )
-    (new                 "new"                    )
-    (next                "next"                   )
-    (notebook            "notebook"               )
-    (parent              "parent"                 )
-    (play.fast.forward   "play.fast.forward"      )
-    (play.fast.reverse   "play.fast.reverse"      )
-    (play.pause          "play.pause"             )
-    (play.start          "play.start"             )
-    (play.stop           "play.stop"              )
-    (previous            "previous"               )
-    (prince              "prince" "the artist formerly known as prince")
-    (princesymbol        "prince" "the artist formerly known as prince")
-    (printer             "printer"                )
-    (sadsmiley           "sadsmiley"          ":(")
-    (smiley              "smiley"             ":)")
-    (stop                "stop"                   )
-    (summary             "summary"                )
-    (telephone           "telephone"              )
-    (telnet              "telnet"                 )
-    (text.document       "text.document"          )
-    (tn3270              "tn3270"                 )
-    (toc                 "toc"                    )
-    (trash               "trash"                  )
-    (unknown.document    "unknown.document"       )
-    (uuencoded.document  "uuencoded.document"     )
-    (work                "work"                   )
-    (www                 "www"                    )
-    )
-  "List of graphical entity names and the tail end of a URL for them.
-If there is a 3rd item in the list, it is the alternative text to use
-for the image.")
-
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Menu definitions
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -448,6 +382,14 @@ for a charset indication")
   "Regexp used in parsing `<META content=\"...;charset=...\" 
HTTP-EQUIV=\"Content-Type\">
 for a charset indication")
 
+(defvar w3-explicit-conversion-tree nil
+  "Tree to hold explicit coding systems for URLs and their superdirs:
+   ((hostN default-coding (dirN-1 default-coding (dirN-1-1 ...) ...) ...)
+    ...)")
+
+(defvar w3-explicit-encodings-changed-since-last-save nil
+  "Whether the explicit encodings tree has changed since the last save 
operation.")
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; buffer-local variables to keep around when going into w3-mode
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/lisp/w3.el b/lisp/w3.el
index a6f1d97..887eca0 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/03/25 05:30:07 $
-;; Version: $Revision: 1.7 $
+;; Created: $Date: 1999/04/08 11:47:52 $
+;; Version: $Revision: 1.8 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1187,6 +1187,8 @@ invokes some commands which read a coding system from the 
user.")
               (;; explicit charset ? (through MIME headers or META tag)
                (and (stringp mmcharset)
                     (setq coding-system (w3-coding-system-for-mime-charset 
mmcharset))))
+              (;; recorded explicit coding system ? (in 
`w3-explicit-encodings-file')
+               (setq coding-system (w3-recall-explicit-coding-system 
url-current-object)))
               ;; forced conversion ? (through user option 
w3-force-conversion-alist)
               ((and (url-filename url-current-object)
                     (let ((force-alist w3-force-conversion-alist)
@@ -1783,9 +1785,97 @@ With prefix argument, it reads a coding system to decode 
the document."
        (w3-explicit-coding-system explicit-coding-system))
     (kill-buffer (current-buffer))
     (w3-fetch tmp)
+    (if explicit-coding-system
+       (w3-record-explicit-coding-system tmp explicit-coding-system))
     (goto-char pnt)
     (set-window-start (selected-window) (min window-start (point-max)))))
 
+(defun w3-recall-explicit-coding-system (url)
+  "Find user-specified explicit coding system for this URL
+in w3-explicit-conversion-tree"
+  (let* ((urlobj (if (stringp url)
+                    (url-generic-parse-url url)
+                  url))
+        (hostname (or (url-host urlobj) "localhost"))
+        (fname-list (split-string (url-filename urlobj) "\\/")))
+    ;; now recurse
+    (w3-find-explicit-coding-system (cons hostname fname-list) 
w3-explicit-conversion-tree)))
+
+(defun w3-find-explicit-coding-system (fname-list tree)
+  "Recall a user-specified explicit coding system"
+  (let ((branch (assoc (car fname-list) tree)))
+    (and branch
+        (or (and (cdr fname-list) (cddr branch)
+                 (w3-find-explicit-coding-system (cdr fname-list) (cddr 
branch)))
+            (cadr branch)))))
+
+(defun w3-record-explicit-coding-system (url coding-system)
+  "Record user-specified explicit coding system for URLs
+as high as possible in w3-explicit-conversion-tree"
+  (let* ((urlobj (if (stringp url)
+                    (url-generic-parse-url url)
+                  url))
+        (hostname (or (url-host urlobj) "localhost"))
+        (fname-list (split-string (url-filename urlobj) "\\/"))
+        (tree (or (assoc hostname w3-explicit-conversion-tree)
+                  (let ((branch (list hostname)))
+                    (setq w3-explicit-conversion-tree
+                          (cons branch w3-explicit-conversion-tree))
+                    branch))))
+    ;; now recurse
+    (w3-add-explicit-coding-system fname-list coding-system tree)
+    (setq w3-explicit-encodings-changed-since-last-save t)))
+
+(defun w3-add-explicit-coding-system (fname-list coding-system tree)
+  "Memorize a user-specified explicit coding system"
+  (if (and (cadr tree) (not (equal (cadr tree) coding-system)))
+      (setcar (cdr tree) nil))
+  (let ((branch (assoc (car fname-list) (cddr tree))))
+    (cond (branch
+          ;; update existing branch
+          (cond ((cdr fname-list)
+                 (or (equal (cadr branch) coding-system)
+                     (null (cadr branch))
+                     (setcar (cdr branch) nil))
+                 (w3-add-explicit-coding-system (cdr fname-list) coding-system 
branch))
+                (t
+                 (setcar (cdr branch) coding-system))))
+         (t
+          ;; create a new branch
+          (setcdr tree
+                  (if fname-list
+                      (let ((subbranch (list (car fname-list))))
+                        (w3-add-explicit-coding-system (cdr fname-list) 
coding-system subbranch)
+                        (cons (if (or (null (cddr tree))
+                                      (equal coding-system (cadr tree)))
+                                  coding-system)
+                              (cons subbranch (cddr tree))))
+                    (list coding-system)))))))
+
+(defun w3-write-explicit-encodings (&optional fname)
+  "Write the explicit encodings file into `w3-explicit-encodings-file'."
+  (interactive)
+  (or fname
+      (and w3-explicit-encodings-file
+          (setq fname (expand-file-name w3-explicit-encodings-file))))
+  (cond
+   ((not w3-explicit-encodings-changed-since-last-save) nil)
+   ((not (file-writable-p fname))
+    (message "Explicit encodings file %s (see variable 
`w3-explicit-encodings-file') is unwritable." fname))
+   (t
+    (let ((make-backup-files nil)
+         (version-control nil)
+         (require-final-newline t))
+      (save-excursion
+       (set-buffer (get-buffer-create " *w3-tmp*"))
+       (erase-buffer)
+       (insert "(setq w3-explicit-conversion-tree\n      '"
+               (prin1-to-string w3-explicit-conversion-tree)
+               ")\n\n")
+       (write-file fname)
+       (kill-buffer (current-buffer))))))
+  (setq w3-explicit-encodings-changed-since-last-save nil))
+
 (defun w3-leave-buffer ()
   "Bury this buffer, but don't kill it."
   (interactive)
@@ -2177,6 +2267,13 @@ dumped with emacs."
                               "Please consult the `%s' buffer for details."))
                            w3-default-configuration-file buf-name))))))
               
+  ;; Load the explicit encodings file if it exists
+  (if (and w3-explicit-encodings-file
+          (file-exists-p w3-explicit-encodings-file))
+      (condition-case nil
+         (load w3-explicit-encodings-file nil t)
+       (error nil)))
+
   (if (and (eq w3-user-colors-take-precedence 'guess)
           (not (eq (device-type) 'tty))
           (not (eq (device-class) 'mono)))

commit c1ea82d25ae0f96b46089535466ede77c9a35d26
Author: William M. Perry <address@hidden>
Date:   Sun Mar 28 18:59:00 1999 +0000

    *** empty log message ***

diff --git a/.version b/.version
index 425151f..d81cc07 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-40
+42

commit 99f4f92fa1881d89865720b37a6cee98332a17bd
Author: William M. Perry <address@hidden>
Date:   Thu Mar 25 05:30:00 1999 +0000

    *** empty log message ***

diff --git a/.version b/.version
index a272009..425151f 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-39
+40
diff --git a/ChangeLog b/ChangeLog
index 0f31d86..c03d73d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,38 @@
+1999-03-24  William M. Perry  <address@hidden>
+
+* lisp/url.el (url-do-setup): Always register the LDAP URL format.
+
+* lisp/url-ldap.el (url-ldap): Deal with non-LDAP enabled emacsen better.
+
+1999-03-22  Markus Rost <address@hidden>
+
+* lisp/w3.el (w3-fetch): Gracefully accept 'nil' as the URL.
+
+1999-03-22  Martin Schwenke <address@hidden>
+
+* lisp/w3-sysdp.el (frame-parameter): This was not defined in 19.34.
+
+1999-03-19  William Perry <address@hidden>
+
+* lisp/w3-parse.el (w3-parse-buffer): Make sure we restore the old syntax
+  table when we are done parsing.
+
+1999-03-18  Kenichi Handa <address@hidden>
+
+* lisp/w3.el (w3-viewer-filter): Do not create the 'output' buffer if the
+  length of the string received by the filter is 0.  Evidently solaris
+  sends an empty string to the filter when the process exits.
+
+1999-03-18  "T. V. Raman" <address@hidden>
+
+* lisp/w3-display.el (w3-widget-echo): Use buffer-substring --rather than
+  buffer-substring-no-properties when picking out the text under the
+  current link. 
+
+  This is good for emacspeak because you can then tell while
+  tabbing through a  page whether the link you just hit has
+  been visited.
+
 1999-01-08  William M. Perry  <address@hidden>
 
 * lisp/docomp.el (emacs-build-autoloads): Only do the autoloads one way
diff --git a/lisp/base64.el b/lisp/base64.el
index 497bbf1..c04a528 100644
--- a/lisp/base64.el
+++ b/lisp/base64.el
@@ -1,7 +1,7 @@
 ;;; base64.el,v --- Base64 encoding functions
 ;; Author: Kyle E. Jones
-;; Created: $Date: 1998/12/27 01:48:52 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/03/25 05:30:03 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: extensions
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -271,7 +271,7 @@ base64-encoder-program.")
        (buffer-string)
       (kill-buffer (current-buffer)))))  
 
-(defalias 'base64-encode 'base64-encode-string)
-(defalias 'base64-decode 'base64-decode-string)
+(defalias 'base64-encode-string 'base64-encode)
+(defalias 'base64-decode-string 'base64-decode)
 
 (provide 'base64)
diff --git a/lisp/socks.el b/lisp/socks.el
index 6ed1986..f2b8a65 100644
--- a/lisp/socks.el
+++ b/lisp/socks.el
@@ -1,7 +1,7 @@
 ;;; socks.el --- A Socks v5 Client for Emacs
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/29 14:49:33 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/03/25 05:30:04 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: comm, firewalls
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -29,6 +29,12 @@
 ;;; RFC 1928.
 ;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; TODO
+;; - Finish the redirection rules stuff
+;; - Implement composition of servers.  Recursively evaluate the
+;;   redirection rules and do SOCKS-over-HTTP and SOCKS-in-SOCKS
+
 (require 'cl)
 (require 'custom)
 
@@ -288,6 +294,13 @@ If PATTERN is omitted, it defaults to \"[ 
\\f\\t\\n\\r\\v]+\"."
       (cl-puthash 'scratch (concat string (cl-gethash 'scratch info)) info)
       (setq string (cl-gethash 'scratch info))
       (case (cl-gethash 'server-protocol info)
+       (http
+        (if (not (string-match "\r\n\r\n" string))
+            nil                        ; Need to spin some more
+          (debug)
+          (cl-puthash 'state socks-state-connected info)
+          (cl-puthash 'reply 0 info)
+          (cl-puthash 'response string info)))
        (4
         (if (< (length string) 2)
             nil                        ; Can't know how much to read yet
@@ -346,6 +359,9 @@ If PATTERN is omitted, it defaults to \"[ 
\\f\\t\\n\\r\\v]+\"."
       (cl-puthash 'server-protocol (nth 3 server-info) info)
       (cl-puthash 'server-name (nth 1 server-info) info)
       (case (nth 3 server-info)
+       (http
+        ;; Don't really have to do any connection setup under http
+        nil)
        (4
         ;; Don't really have to do any connection setup under v4
         nil)
@@ -398,6 +414,17 @@ If PATTERN is omitted, it defaults to \"[ 
\\f\\t\\n\\r\\v]+\"."
     (cl-puthash 'state socks-state-waiting info)
     (setq version (cl-gethash 'server-protocol info))
     (case version
+      (http
+       (setq request (format (eval-when-compile
+                              (concat
+                               "CONNECT %s:%d HTTP/1.0\r\n"
+                               "User-Agent: Emacs/SOCKS v1.0\r\n"
+                               "\r\n"))
+                            (case atype
+                              (socks-address-type-name address)
+                              (otherwise
+                               (error "Unsupported address type for HTTP: %d" 
atype)))
+                            port)))
       (4
        (setq request (format
                      "%c%c%c%c%s%s%c"
diff --git a/lisp/url-ldap.el b/lisp/url-ldap.el
index a27538a..547ebaf 100644
--- a/lisp/url-ldap.el
+++ b/lisp/url-ldap.el
@@ -1,7 +1,7 @@
 ;;; url-ldap.el --- LDAP Uniform Resource Locator retrieval code
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1999/01/05 12:41:57 $
-;; Version: $Revision: 1.3 $
+;; Created: $Date: 1999/03/25 05:30:04 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -49,15 +49,20 @@
 
 (defvar url-ldap-pretty-names
   '(("l"           . "City")
-    ("objectClass" . "Object Class")
+    ("objectclass" . "Object Class")
     ("o"           . "Organization")
     ("ou"          . "Organizational Unit")
+    ("cn"          . "Name")
+    ("sn"          . "Last Name")
+    ("givenname"   . "First Name")
     ("mail"        . "Email")
+    ("title"       . "Title")
     ("c"           . "Country")
-    ("postalCode"  . "ZIP Code")
-    ("telephoneNumber" . "Phone Number")
-    ("postalAddress"   . "Mailing Address")
-    ("description"     . "Notes"))
+    ("postalcode"  . "ZIP Code")
+    ("telephonenumber"          . "Phone Number")
+    ("facsimiletelephonenumber" . "Fax")
+    ("postaladdress"            . "Mailing Address")
+    ("description"              . "Notes"))
   "*An assoc list mapping LDAP attribute names to pretty descriptions of 
them.")
 
 (defvar url-ldap-attribute-formatters
@@ -67,10 +72,10 @@
   "*An assoc list mapping LDAP attribute names to pretty formatters for them.")
 
 (defsubst url-ldap-attribute-pretty-name (n)
-  (or (cdr-safe (assoc n url-ldap-pretty-names)) n))
+  (or (cdr-safe (assoc (downcase n) url-ldap-pretty-names)) n))
 
 (defsubst url-ldap-attribute-pretty-desc (n v)
-  (funcall (or (cdr-safe (assoc n url-ldap-attribute-formatters)) 'identity) 
v))
+  (funcall (or (cdr-safe (assoc (downcase n) url-ldap-attribute-formatters)) 
'identity) v))
 
 (defun url-ldap-dn-formatter (dn)
   (concat "<a href='/"
@@ -78,106 +83,124 @@
          "'>" dn "</a>"))
   
 (defun url-ldap (url)
-  (let* ((urlobj (url-generic-parse-url url))
-        (binddn nil)
-        (data (url-filename urlobj))
-        (host (url-host urlobj))
-        (port (url-port urlobj))
-        (base-object nil)
-        (attributes nil)
-        (scope nil)
-        (filter nil)
-        (extensions nil)
-        (connection nil)
-        (results nil))
-
-    ;; Get rid of leading /
-    (if (string-match "^/" data)
-       (setq data (substring data 1)))
-
-    ;; Fill in the default host
-    (if (not host)
-       (setq host url-ldap-default-host))
-
-    (setq data (mapcar (lambda (x) (if (/= (length x) 0) x nil)) (split-string 
data "\\?"))
-         base-object (nth 0 data)
-         attributes (nth 1 data)
-         scope (nth 2 data)
-         filter (nth 3 data)
-         extensions (nth 4 data))
-
-    ;; fill in the defaults
-    (setq base-object (url-unhex-string (or base-object ""))
-         scope (intern (url-unhex-string (or scope "base")))
-         filter (url-unhex-string (or filter "(objectClass=*)")))
-
-    (if (not (memq scope '(base one tree)))
-       (error "Malformed LDAP URL: Unknown scope: %S" scope))
-
-    ;; Convert to the internal LDAP support scoping names.
-    (setq scope (cdr (assq scope '((base . base) (one . onelevel) (sub . 
subtree)))))
-
-    (if attributes
-       (setq attributes (mapcar 'url-unhex-string (split-string attributes 
","))))
-
-    ;; Parse out the exentions
-    (if extensions
-       (setq extensions (mapcar (lambda (ext)
-                                  (if (string-match "\\([^=]*\\)=\\(.*\\)" ext)
-                                      (cons (match-string 1 ext) (match-string 
2 ext))
-                                    (cons ext ext)))
-                                (split-string extensions ","))
-             extensions (mapcar (lambda (ext)
-                                  (cons (url-unhex-string (car ext))
-                                        (url-unhex-string (cdr ext))))
-                                extensions)))
-
-    (setq binddn (cdr-safe (or (assoc "bindname" extensions)
-                              (assoc "!bindname" extensions))))
+  (if (not (fboundp 'ldap-search-internal))
+      (progn
+       (set-buffer (get-buffer-create url-working-buffer))
+       (erase-buffer)
+       (setq url-current-mime-type "text/html"
+             url-current-can-be-cached nil)
+       (insert "<html>\n"
+               " <head>\n"
+               "  <title>LDAP Not Supported</title>\n"
+               "  <base href='" url "'>\n"
+               " </head>\n"
+               " <body>\n"
+               "  <h1>LDAP Not Supported</h1>\n"
+               "  <p>\n"
+               "    This version of Emacs does not support LDAP.\n"
+               "  </p>\n"
+               " </body>\n"
+               "</html>\n"))
+    (let* ((urlobj (url-generic-parse-url url))
+          (binddn nil)
+          (data (url-filename urlobj))
+          (host (url-host urlobj))
+          (port (url-port urlobj))
+          (base-object nil)
+          (attributes nil)
+          (scope nil)
+          (filter nil)
+          (extensions nil)
+          (connection nil)
+          (results nil))
+
+      ;; Get rid of leading /
+      (if (string-match "^/" data)
+         (setq data (substring data 1)))
+
+      ;; Fill in the default host
+      (if (not host)
+         (setq host url-ldap-default-host))
+
+      (setq data (mapcar (lambda (x) (if (/= (length x) 0) x nil)) 
(split-string data "\\?"))
+           base-object (nth 0 data)
+           attributes (nth 1 data)
+           scope (nth 2 data)
+           filter (nth 3 data)
+           extensions (nth 4 data))
+
+      ;; fill in the defaults
+      (setq base-object (url-unhex-string (or base-object ""))
+           scope (intern (url-unhex-string (or scope "base")))
+           filter (url-unhex-string (or filter "(objectClass=*)")))
+
+      (if (not (memq scope '(base one tree)))
+         (error "Malformed LDAP URL: Unknown scope: %S" scope))
+
+      ;; Convert to the internal LDAP support scoping names.
+      (setq scope (cdr (assq scope '((base . base) (one . onelevel) (sub . 
subtree)))))
+
+      (if attributes
+         (setq attributes (mapcar 'url-unhex-string (split-string attributes 
","))))
+
+      ;; Parse out the exentions
+      (if extensions
+         (setq extensions (mapcar (lambda (ext)
+                                    (if (string-match "\\([^=]*\\)=\\(.*\\)" 
ext)
+                                        (cons (match-string 1 ext) 
(match-string 2 ext))
+                                      (cons ext ext)))
+                                  (split-string extensions ","))
+               extensions (mapcar (lambda (ext)
+                                    (cons (url-unhex-string (car ext))
+                                          (url-unhex-string (cdr ext))))
+                                  extensions)))
+
+      (setq binddn (cdr-safe (or (assoc "bindname" extensions)
+                                (assoc "!bindname" extensions))))
     
-    ;; Now, let's actually do something with it.
-    (setq connection (ldap-open host (if binddn (list 'binddn binddn)))
-         results (ldap-search-internal connection filter base-object scope 
attributes nil))
-    (ldap-close connection)
-    (set-buffer (get-buffer-create url-working-buffer))
-    (erase-buffer)
-    (setq url-current-mime-type "text/html"
-         url-current-can-be-cached nil)
-    (insert "<html>\n"
-           " <head>\n"
-           "  <title>LDAP Search Results</title>\n"
-           "  <base href='" url "'>\n"
-           " </head>\n"
-           " <body>\n"
-           "  <h1>" (int-to-string (length results)) " matches</h1>\n")
-
-    (mapc (lambda (obj)
-           (insert "  <hr>\n"
-                   "  <table border=1>\n")
-           (mapc (lambda (attr)
-                   (if (= (length (cdr attr)) 1)
-                       ;; single match, easy
-                       (insert "   <tr><td>"
-                               (url-ldap-attribute-pretty-name (car attr))
-                               "</td><td>"
-                               (url-ldap-attribute-pretty-desc (car attr) (car 
(cdr attr)))
-                               "</td></tr>\n")
-                     ;; Multiple matches, slightly uglier
-                     (insert "   <tr>\n"
-                             (format "    <td valign=top>" (length (cdr attr)))
-                             (url-ldap-attribute-pretty-name (car attr)) 
"</td><td>"
-                             (mapconcat (lambda (x)
-                                          (url-ldap-attribute-pretty-desc (car 
attr) x))
-                                        (cdr attr)
-                                        "<br>\n")
-                             "</td>"
-                             "   </tr>\n")))
-                 obj)
-           (insert "  </table>\n"))
-         results)
-
-    (insert "  <hr>\n"
-           " </body>\n"
-           "</html>\n")))
+      ;; Now, let's actually do something with it.
+      (setq connection (ldap-open host (if binddn (list 'binddn binddn)))
+           results (ldap-search-internal connection filter base-object scope 
attributes nil))
+      (ldap-close connection)
+      (set-buffer (get-buffer-create url-working-buffer))
+      (erase-buffer)
+      (setq url-current-mime-type "text/html"
+           url-current-can-be-cached nil)
+      (insert "<html>\n"
+             " <head>\n"
+             "  <title>LDAP Search Results</title>\n"
+             "  <base href='" url "'>\n"
+             " </head>\n"
+             " <body>\n"
+             "  <h1>" (int-to-string (length results)) " matches</h1>\n")
+
+      (mapc (lambda (obj)
+             (insert "  <hr>\n"
+                     "  <table border=1>\n")
+             (mapc (lambda (attr)
+                     (if (= (length (cdr attr)) 1)
+                         ;; single match, easy
+                         (insert "   <tr><td>"
+                                 (url-ldap-attribute-pretty-name (car attr))
+                                 "</td><td>"
+                                 (url-ldap-attribute-pretty-desc (car attr) 
(car (cdr attr)))
+                                 "</td></tr>\n")
+                       ;; Multiple matches, slightly uglier
+                       (insert "   <tr>\n"
+                               (format "    <td valign=top>" (length (cdr 
attr)))
+                               (url-ldap-attribute-pretty-name (car attr)) 
"</td><td>"
+                               (mapconcat (lambda (x)
+                                            (url-ldap-attribute-pretty-desc 
(car attr) x))
+                                          (cdr attr)
+                                          "<br>\n")
+                               "</td>"
+                               "   </tr>\n")))
+                   obj)
+             (insert "  </table>\n"))
+           results)
+
+      (insert "  <hr>\n"
+             " </body>\n"
+             "</html>\n"))))
 
 (provide 'url-ldap)
diff --git a/lisp/url.el b/lisp/url.el
index 64665e2..54f9f83 100644
--- a/lisp/url.el
+++ b/lisp/url.el
@@ -1,13 +1,13 @@
 ;;; url.el --- Uniform Resource Locator retrieval tool
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/30 11:26:49 $
-;; Version: $Revision: 1.9 $
+;; Created: $Date: 1999/03/25 05:30:04 $
+;; Version: $Revision: 1.10 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;; LCD Archive Entry:
 ;;; url|William M. Perry|address@hidden|
 ;;; Functions for retrieving/manipulating URLs|
-;;; $Date: 1998/12/30 11:26:49 $|$Revision: 1.9 $|Location Undetermined
+;;; $Date: 1999/03/25 05:30:04 $|$Revision: 1.10 $|Location Undetermined
 ;;;
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -103,9 +103,7 @@
 (autoload 'url-news "url-news")
 (autoload 'url-nntp "url-news")
 (autoload 'url-cid "url-cid")
-
-(if (featurep 'ldap)
-    (autoload 'url-ldap "url-ldap"))
+(autoload 'url-ldap "url-ldap")
 
 (autoload 'url-open-stream "url-gw")
 (autoload 'url-mime-response-p "url-http")
@@ -929,8 +927,7 @@ dumped with emacs."
     (url-register-protocol 'telnet)
     (url-register-protocol 'tn3270)
     (url-register-protocol 'proxy)
-    (if (featurep 'ldap)
-       (url-register-protocol 'ldap))
+    (url-register-protocol 'ldap)
     (url-register-protocol 'auto 'url-handle-no-scheme)
 
     ;; Register all the authentication schemes we can handle
@@ -1040,8 +1037,13 @@ dumped with emacs."
     (run-hooks 'url-load-hook)
     (setq url-setup-done t)))
 
-(defvar url-get-url-filename-chars "address@hidden()_/:~=&"
-  "Valid characters in a URL")
+;;; Evidently, there is a chicken and egg problem with the
+;;; eval-when-compile in url-get-url-at-point, so we have to eval this
+;;; at compile time.
+(eval-and-compile
+  (defvar url-get-url-filename-chars "address@hidden()_/:~=&"
+    "Valid characters in a URL")
+  )
 
 ;;;###autoload
 (defun url-get-url-at-point (&optional pt)
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 8693c7d..7f6f41d 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/28 21:44:07 $
-;; Version: $Revision: 1.8 $
+;; Created: $Date: 1999/03/25 05:30:05 $
+;; Version: $Revision: 1.9 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -265,11 +265,13 @@
       (or (if backgroundp
              (face-background-name 'default)
            (face-foreground-name 'default))
-         (frame-property nil (if backgroundp 'background-color 
'foreground-color)))
+         (frame-property nil (if backgroundp 'background-color 
'foreground-color))
+         (if backgroundp "white" "black"))
       (or (if backgroundp
              (face-background 'default)
            (face-foreground 'default))
-         (frame-parameter nil (if backgroundp 'background-color 
'foreground-color)))))
+         (frame-parameter nil (if backgroundp 'background-color 
'foreground-color))
+         (if backgroundp "white" "black"))))
 
 (defun w3-display-background-useless-p (color)
   (let ((foreground-color (font-color-rgb-components
@@ -397,7 +399,7 @@ If the face already exists, it is unmodified."
        (= w3-last-fill-pos (point))
        (> w3-last-fill-pos (point-max)))
       (if (not (eq (char-before (point)) ?\n))
-         (setq n (1+ n))) ; at least put one line in
+         (setq n (1+ n))) ; at least put one line in
     (let ((fill-column (max (1+ (length fill-prefix)) fill-column))
          width)
       (case (car w3-display-alignment-stack)
@@ -509,7 +511,7 @@ If the face already exists, it is unmodified."
     (set-buffer (or (w3-widget-buffer widget) (current-buffer)))
     (let* ((url (widget-get widget :href))
           (name (widget-get widget :name))
-          (text (buffer-substring-no-properties (widget-get widget :from)
+          (text (buffer-substring (widget-get widget :from)
                                                 (widget-get widget :to)))
           (title (widget-get widget :title))
           (check w3-echo-link)
diff --git a/lisp/w3-hot.el b/lisp/w3-hot.el
index b9a21d9..7ac83bd 100644
--- a/lisp/w3-hot.el
+++ b/lisp/w3-hot.el
@@ -1,12 +1,12 @@
 ;;; w3-hot.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:11 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/03/25 05:30:06 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -113,6 +113,8 @@
            args (and (listp node) (nth 1 node))
            content (and (listp node) (nth 2 node)))
       (cond
+       ((eq tag 'hr)
+       (setq cur-title '("------")))
        ((eq tag 'title)
        (setq cur-title (list (w3-normalize-spaces (car content))))
        (w3-grok-html-bookmarks-internal content))
diff --git a/lisp/w3-keyword.el b/lisp/w3-keyword.el
index 3e11f87..7095eaa 100644
--- a/lisp/w3-keyword.el
+++ b/lisp/w3-keyword.el
@@ -1,12 +1,12 @@
 ;;; w3-keyword.el --- Emacs-W3 binding style sheet mechanism
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:10 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/03/25 05:30:06 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -111,6 +111,7 @@
                  :parent
                  :type
                  :src
+                 :button-extent
                  :active-face
                  :visited-face
                  :emacspeak-help
diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index 2c79f44..ae8dfb3 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -1964,504 +1964,505 @@ Returns a data structure containing the parsed 
information."
   (if (not w3-setup-done) (w3-do-setup))
   (set-buffer (or buff url-working-buffer))
   (setq buff (current-buffer))
-  (set-syntax-table w3-sgml-md-syntax-table)
-  (buffer-disable-undo (current-buffer))
-  (widen)                               ; sanity checking
-  (goto-char (point-max))
-  (insert "\n")
-  (goto-char (point-min))
-  (setq case-fold-search t)             ; allows smaller regexp patterns
+  (let ((old-syntax-table (syntax-table)))
+    (set-syntax-table w3-sgml-md-syntax-table)
+    (buffer-disable-undo (current-buffer))
+    (widen)                             ; sanity checking
+    (goto-char (point-max))
+    (insert "\n")
+    (goto-char (point-min))
+    (setq case-fold-search t)           ; allows smaller regexp patterns
   
-  ;; This is for ethiopic text.  Unfortunately, old MULE and new MULE conflict
-  ;; on what exactly to call this function.
-  (condition-case ()
-      (let ((sera-being-called-by-w3 t))
-        (case mule-sysdep-version
-          (2.4
-           (sera-to-fidel-marker))
-          ((xemacs 3.0)
-           (ethio-sera-to-fidel-marker))
-          (4.0
-           (when default-enable-multibyte-characters
-             (ethio-sera-to-fidel-marker)))))
-    (error nil))
-  (goto-char (point-min))
+    ;; This is for ethiopic text.  Unfortunately, old MULE and new MULE 
conflict
+    ;; on what exactly to call this function.
+    (condition-case ()
+        (let ((sera-being-called-by-w3 t))
+          (case mule-sysdep-version
+            (2.4
+             (sera-to-fidel-marker))
+            ((xemacs 3.0)
+             (ethio-sera-to-fidel-marker))
+            (4.0
+             (when default-enable-multibyte-characters
+               (ethio-sera-to-fidel-marker)))))
+      (error nil))
+    (goto-char (point-min))
   
-  ;; *** Should premunge line boundaries.
-  ;; ********************
+    ;; *** Should premunge line boundaries.
+    ;; ********************
   
-  (let* (
-         ;; Speed hack, see the variable doc string.
-         (gc-cons-threshold (if (> w3-gc-cons-threshold-multiplier 0)
-                                (* w3-gc-cons-threshold-multiplier
-                                   gc-cons-threshold)
-                              gc-cons-threshold))
-
-         ;; Used to determine if we made any progress since the last loop.
-         (last-loop-start (point-min))
+    (let* (
+           ;; Speed hack, see the variable doc string.
+           (gc-cons-threshold (if (> w3-gc-cons-threshold-multiplier 0)
+                                  (* w3-gc-cons-threshold-multiplier
+                                     gc-cons-threshold)
+                                gc-cons-threshold))
+
+           ;; Used to determine if we made any progress since the last loop.
+           (last-loop-start (point-min))
         
-         ;; How many iterations of the main loop have occurred.  Used only
-         ;; to send messages to the user periodically, since this function
-         ;; can take some time.
-         (loop-count 0)
-
-         ;; Precomputing the loop-invariant parts of this for speed.
-         (status-message-format
-          (if url-show-status
-              (format "Parsed %%3d%%%% of %d..." (- (point-max) (point-min)))))
+           ;; How many iterations of the main loop have occurred.  Used only
+           ;; to send messages to the user periodically, since this function
+           ;; can take some time.
+           (loop-count 0)
+
+           ;; Precomputing the loop-invariant parts of this for speed.
+           (status-message-format
+            (if url-show-status
+                (format "Parsed %%3d%%%% of %d..." (- (point-max) 
(point-min)))))
          
-         ;; Use a float value for 100 if possible, otherwise integer.
-         ;; Determine which we can use outside of the loop for speed.
-         (one-hundred (funcall (if (fboundp 'float) 'float 'identity) 100))
+           ;; Use a float value for 100 if possible, otherwise integer.
+           ;; Determine which we can use outside of the loop for speed.
+           (one-hundred (funcall (if (fboundp 'float) 'float 'identity) 100))
          
-         ;; The buffer which contains the HTML we are parsing.  This
-         ;; variable is used to avoid using the more expensive
-         ;; save-excursion.
-         (parse-buffer (current-buffer))
+           ;; The buffer which contains the HTML we are parsing.  This
+           ;; variable is used to avoid using the more expensive
+           ;; save-excursion.
+           (parse-buffer (current-buffer))
          
-         ;; Points to start of region of text since the previous tag.
-         (between-tags-start (point-min))
+           ;; Points to start of region of text since the previous tag.
+           (between-tags-start (point-min))
          
-         ;; Points past end of region of text since the previous tag.  Only
-         ;; non-nil when the region has been completely determined and is
-         ;; ready to be processed.
-         between-tags-end
+           ;; Points past end of region of text since the previous tag.  Only
+           ;; non-nil when the region has been completely determined and is
+           ;; ready to be processed.
+           between-tags-end
          
-         ;; See doc string.
-         w3-p-d-tag-name
+           ;; See doc string.
+           w3-p-d-tag-name
          
-         ;; See doc string.
-         w3-p-d-end-tag-p
+           ;; See doc string.
+           w3-p-d-end-tag-p
          
-         ;; Is the tag we are looking at a null-end-tag-enabling
-         ;; start-tag?
-         net-tag-p
+           ;; Is the tag we are looking at a null-end-tag-enabling
+           ;; start-tag?
+           net-tag-p
          
-         ;; Attributes of the tag we are looking at.  An alist whose items
-         ;; are pairs of the form (SYMBOL . STRING).
-         tag-attributes
+           ;; Attributes of the tag we are looking at.  An alist whose items
+           ;; are pairs of the form (SYMBOL . STRING).
+           tag-attributes
          
-         ;; Points past end of attribute value we are looking at.  Points
-         ;; past the syntactic construct, not the value of the attribute,
-         ;; which may be at (1- attribute-value-end).
-         attribute-value-end
+           ;; Points past end of attribute value we are looking at.  Points
+           ;; past the syntactic construct, not the value of the attribute,
+           ;; which may be at (1- attribute-value-end).
+           attribute-value-end
          
-         ;; Points past end of tag we are looking at.
-         tag-end
+           ;; Points past end of tag we are looking at.
+           tag-end
          
-         ;; See doc string.
-         (w3-p-d-current-element (w3-fresh-element-for-tag '*document))
+           ;; See doc string.
+           (w3-p-d-current-element (w3-fresh-element-for-tag '*document))
          
-         ;; See doc string.
-         (w3-p-d-open-element-stack (list (w3-fresh-element-for-tag '*holder)))
+           ;; See doc string.
+           (w3-p-d-open-element-stack (list (w3-fresh-element-for-tag 
'*holder)))
          
-         ;; ***not implemented yet***
-         (marked-section-undo-stack nil)
+           ;; ***not implemented yet***
+           (marked-section-undo-stack nil)
          
-         ;; See doc string.
-         (w3-p-d-debug-url t)
+           ;; See doc string.
+           (w3-p-d-debug-url t)
          
-         ;; Any of the following variables with the comment ";*NESTED*"
-         ;; are syntactic or semantic features that were introduced by
-         ;; some containing element or marked section which will be undone
-         ;; when we close that element or marked section.
+           ;; Any of the following variables with the comment ";*NESTED*"
+           ;; are syntactic or semantic features that were introduced by
+           ;; some containing element or marked section which will be undone
+           ;; when we close that element or marked section.
          
-         ;; See doc string.
-         (w3-p-d-non-markup-chars nil) ;*NESTED*
+           ;; See doc string.
+           (w3-p-d-non-markup-chars nil) ;*NESTED*
          
-         ;; See doc string.
-         (w3-p-d-null-end-tag-enabled nil) ;*NESTED*
+           ;; See doc string.
+           (w3-p-d-null-end-tag-enabled nil) ;*NESTED*
          
-         ;; See doc string.
-         (w3-p-d-in-parsed-marked-section nil) ;*NESTED*
+           ;; See doc string.
+           (w3-p-d-in-parsed-marked-section nil) ;*NESTED*
          
-         ;; See doc string.
-         (w3-p-d-shortrefs nil)                ;*NESTED*
+           ;; See doc string.
+           (w3-p-d-shortrefs nil)       ;*NESTED*
          
-         ;; See doc string.
-         (w3-p-d-shortref-chars nil)    ;*NESTED*
+           ;; See doc string.
+           (w3-p-d-shortref-chars nil)  ;*NESTED*
          
-         ;; ******* maybe not needed.
-         ;; 
-         ;; ;; Are we recognizing start-tags?
-         ;; (recognizing-start-tags t)     ;*NESTED*
-         ;; 
-         ;; ;; Are we recognizing end-tags?  If this is non-nil and not t,
-         ;; ;; then only the end tag of the current open element is
-         ;; ;; recognized.
-         ;; (recognizing-end-tags t)       ;*NESTED*
+           ;; ******* maybe not needed.
+           ;; 
+           ;; ;; Are we recognizing start-tags?
+           ;; (recognizing-start-tags t)     ;*NESTED*
+           ;; 
+           ;; ;; Are we recognizing end-tags?  If this is non-nil and not t,
+           ;; ;; then only the end tag of the current open element is
+           ;; ;; recognized.
+           ;; (recognizing-end-tags t)       ;*NESTED*
          
-         ;; See doc string.
-         (w3-p-d-exceptions nil)        ;*NESTED*
+           ;; See doc string.
+           (w3-p-d-exceptions nil)      ;*NESTED*
          
-         ;; Scratch variables used in this function
-         ref attr-name attr-value content-model content open-list
-         )
-    ;; Scratch variables used by macros and defsubsts we call.
-    (w3-p-s-let-bindings
-      (w3-update-non-markup-chars)
-      (setq w3-p-s-baseobject (url-generic-parse-url (url-view-url t)))
-      ;; Main loop.  Handle markup as follows:
-      ;;
-      ;; non-empty tag: Handle the region since the previous tag as PCDATA,
-      ;; RCDATA, CDATA, if allowed by syntax.  Then handle the tag.
-      ;;
-      ;; general entity (&name;): expand it and parse the result.
-      ;;
-      ;; shortref (_, {, }, and ^ in math stuff): Expand it and parse the
-      ;; result.
-      ;;
-      ;; SGML marked section (<![ keywords [ conditional-text ]]>): Either
-      ;; strip the delimiters and parse the result or delete.
-      ;;
-      ;; comment: Delete.
-      ;;
-      ;; empty tag (<>, </>): Handle as the appropriate tag.
-      ;;
-      ;; markup declaration (e.g. <!DOCTYPE ...>): Delete.
-      ;;
-      ;; SGML processing instruction (<?name>): Delete.
-      ;;
-      (while
-          ;; Continue as long as we processed something last time and we
-          ;; have more to process.
-          (prog1 
-              (not (and (= last-loop-start (point))
-                        (eobp)))
-            (setq last-loop-start (point)))
+           ;; Scratch variables used in this function
+           ref attr-name attr-value content-model content open-list
+           )
+      ;; Scratch variables used by macros and defsubsts we call.
+      (w3-p-s-let-bindings
+       (w3-update-non-markup-chars)
+       (setq w3-p-s-baseobject (url-generic-parse-url (url-view-url t)))
+       ;; Main loop.  Handle markup as follows:
+       ;;
+       ;; non-empty tag: Handle the region since the previous tag as PCDATA,
+       ;; RCDATA, CDATA, if allowed by syntax.  Then handle the tag.
+       ;;
+       ;; general entity (&name;): expand it and parse the result.
+       ;;
+       ;; shortref (_, {, }, and ^ in math stuff): Expand it and parse the
+       ;; result.
+       ;;
+       ;; SGML marked section (<![ keywords [ conditional-text ]]>): Either
+       ;; strip the delimiters and parse the result or delete.
+       ;;
+       ;; comment: Delete.
+       ;;
+       ;; empty tag (<>, </>): Handle as the appropriate tag.
+       ;;
+       ;; markup declaration (e.g. <!DOCTYPE ...>): Delete.
+       ;;
+       ;; SGML processing instruction (<?name>): Delete.
+       ;;
+       (while
+           ;; Continue as long as we processed something last time and we
+           ;; have more to process.
+           (prog1 
+               (not (and (= last-loop-start (point))
+                         (eobp)))
+             (setq last-loop-start (point)))
       
-        ;; Display progress messages if asked and/or do incremental display
-        ;; of results
-        (cond ((= 0 (% (setq loop-count (1+ loop-count)) 40))
-               (if status-message-format
-                   (message status-message-format
-                            ;; Percentage of buffer processed.
-                            (/ (* (point) one-hundred) (point-max))))))
+         ;; Display progress messages if asked and/or do incremental display
+         ;; of results
+         (cond ((= 0 (% (setq loop-count (1+ loop-count)) 40))
+                (if status-message-format
+                    (message status-message-format
+                             ;; Percentage of buffer processed.
+                             (/ (* (point) one-hundred) (point-max))))))
       
-        ;; Go to next interesting thing in the buffer.
-        (skip-chars-forward w3-p-d-non-markup-chars)
+         ;; Go to next interesting thing in the buffer.
+         (skip-chars-forward w3-p-d-non-markup-chars)
       
-        ;; We are looking at a markup-starting character, and invalid
-        ;; character, or end of buffer.
-        (cond
-
-         ((eq ?< (char-after (point)))
-
-          ;; We are looking at a tag, comment, markup declaration, SGML marked
-          ;; section, SGML processing instruction, or non-markup "<".
-          (forward-char)
-          (cond
-
-           ((looking-at "/?\\([a-z][-a-z0-9.]*\\)")
-            ;; We are looking at a non-empty tag.
-
-            ;; Downcase it in the buffer, to save creation of a string
-            (downcase-region (match-beginning 1) (match-end 1))
-            (setq w3-p-d-tag-name
-                  (intern (buffer-substring (match-beginning 1)
-                                            (match-end 1))))
-            (setq w3-p-d-end-tag-p (eq ?/ (char-after (point)))
-                  between-tags-end (1- (point)))
-            (goto-char (match-end 0))
+         ;; We are looking at a markup-starting character, and invalid
+         ;; character, or end of buffer.
+         (cond
+
+          ((eq ?< (char-after (point)))
+
+           ;; We are looking at a tag, comment, markup declaration, SGML marked
+           ;; section, SGML processing instruction, or non-markup "<".
+           (forward-char)
+           (cond
+
+            ((looking-at "/?\\([a-z][-a-z0-9.]*\\)")
+             ;; We are looking at a non-empty tag.
+
+             ;; Downcase it in the buffer, to save creation of a string
+             (downcase-region (match-beginning 1) (match-end 1))
+             (setq w3-p-d-tag-name
+                   (intern (buffer-substring (match-beginning 1)
+                                             (match-end 1))))
+             (setq w3-p-d-end-tag-p (eq ?/ (char-after (point)))
+                   between-tags-end (1- (point)))
+             (goto-char (match-end 0))
           
-            ;; Read the attributes from a start-tag.
-            (if w3-p-d-end-tag-p
-                (if (looking-at "[ \t\r\n/]*[<>]")
-                    nil
-                  ;; This is in here to deal with those idiots who stick
-                  ;; attribute/value pairs on end tags.  *sigh*
-                  (w3-debug-html "Evil attributes on end tag.")
-                  (skip-chars-forward "^>"))
+             ;; Read the attributes from a start-tag.
+             (if w3-p-d-end-tag-p
+                 (if (looking-at "[ \t\r\n/]*[<>]")
+                     nil
+                   ;; This is in here to deal with those idiots who stick
+                   ;; attribute/value pairs on end tags.  *sigh*
+                   (w3-debug-html "Evil attributes on end tag.")
+                   (skip-chars-forward "^>"))
            
-             ;; Attribute values can be:
-             ;;   "STRING"   where STRING does not contain the double quote
-             ;;   'STRING'   where STRING does not contain the single quote
-             ;;   name-start character, *name character
-             ;;   *name character
-             ;;   Digit, +name character
-             ;;   +Digit
-             ;; or a SPACE-separated list of one of the last four
-             ;; possibilities (there is a comment somewhere that this is a
-             ;; misinterpretation of the grammar, so we ignore this
-             ;; possibility).
-             (while
-                 (looking-at
-                  (eval-when-compile
-                    (concat
-                     ;; Leading whitespace.
-                     "[ \n\r\t,]*"
-                     ;; The attribute name, possibly with a bad syntax
-                     ;; component.
-                     "\\([a-z_][-a-z0-9.]*\\(\\([_][-a-z0-9._]*\\)?\\)\\)"
-                     ;; Trailing whitespace and perhaps an "=".
-                     "[ \n\r\t]*\\(\\(=[ \n\r\t]*\\)?\\)")))
-               
-               (cond ((/= (match-beginning 2) (match-end 2))
-                      (w3-debug-html
-                        :nocontext
-                        (format "Bad attribute name syntax: %s"
-                                (buffer-substring (match-beginning 1)
-                                                  (match-end 1))))))
-
-               ;; Downcase it in the buffer, to save creation of a string
-               (downcase-region (match-beginning 1) (match-end 1))
-               (setq attr-name
-                     (intern (buffer-substring (match-beginning 1)
-                                               (match-end 1))))
-               (goto-char (match-end 0))
-               (cond
-                ((< (match-beginning 4) (match-end 4))
-                 ;; A value was specified (e.g. ATTRIBUTE=VALUE).
-                 (cond
-                  ((looking-at
+               ;; Attribute values can be:
+               ;;   "STRING"   where STRING does not contain the double quote
+               ;;   'STRING'   where STRING does not contain the single quote
+               ;;   name-start character, *name character
+               ;;   *name character
+               ;;   Digit, +name character
+               ;;   +Digit
+               ;; or a SPACE-separated list of one of the last four
+               ;; possibilities (there is a comment somewhere that this is a
+               ;; misinterpretation of the grammar, so we ignore this
+               ;; possibility).
+               (while
+                   (looking-at
                     (eval-when-compile
                       (concat
-                       ;; Comma separated list of literals with double quotes
-                       ;; (bad HTML).
-                       "\"\\([^\"]*\\(\"[ \n\r\t]*,[ \n\r\t]*\"[^\"]*\\)+\\)\""
-                       "\\|"
-                       ;; Comma separated list of literals with single quotes
-                       ;; (bad HTML).
-                       "'\\([^']*\\('[ \n\r\t]*,[ \n\r\t]*'[^']*\\)+\\)'"
-                       "\\|"
-                       ;; Literal with double quotes.
-                       "\"\\([^\"]*\\)\""
-                       "\\|"
-                       ;; Literal with single quotes.
-                       "'\\([^']*\\)'"
-                       "\\|"
-                       ;; Handle bad HTML conflicting with NET-enabling
-                       ;; start-tags.
-                       "\\([^ \t\n\r>]+/[^ \t\n\r>]+\\)[ \t\n\r>]"
-                       "\\|"
-                       ;; SGML NAME-syntax attribute value.
-                       "\\([-a-z0-9.]+\\)[ \t\n\r></]"
-                       )))
+                       ;; Leading whitespace.
+                       "[ \n\r\t,]*"
+                       ;; The attribute name, possibly with a bad syntax
+                       ;; component.
+                       "\\([a-z_][-a-z0-9.]*\\(\\([_][-a-z0-9._]*\\)?\\)\\)"
+                       ;; Trailing whitespace and perhaps an "=".
+                       "[ \n\r\t]*\\(\\(=[ \n\r\t]*\\)?\\)")))
+               
+                 (cond ((/= (match-beginning 2) (match-end 2))
+                        (w3-debug-html
+                         :nocontext
+                         (format "Bad attribute name syntax: %s"
+                                 (buffer-substring (match-beginning 1)
+                                                   (match-end 1))))))
+
+                 ;; Downcase it in the buffer, to save creation of a string
+                 (downcase-region (match-beginning 1) (match-end 1))
+                 (setq attr-name
+                       (intern (buffer-substring (match-beginning 1)
+                                                 (match-end 1))))
+                 (goto-char (match-end 0))
+                 (cond
+                  ((< (match-beginning 4) (match-end 4))
+                   ;; A value was specified (e.g. ATTRIBUTE=VALUE).
                    (cond
-                    ((or (match-beginning 5)
-                         (match-beginning 6)
-                         (match-beginning 1)
-                         (match-beginning 3))
-                     (if (or (match-beginning 1)
-                             (match-beginning 3))
-                         (w3-debug-html
-                           :nocontext
-                           (format "Badly quoted attribute value: %s"
-                                   (match-string 0))))
-                     ;; We have an attribute value literal.
-                     (narrow-to-region (1+ (match-beginning 0))
-                                       (1- (match-end 0)))
-                     ;; Delete (bad) extra quotes from comma separated list.
+                    ((looking-at
+                      (eval-when-compile
+                        (concat
+                         ;; Comma separated list of literals with double quotes
+                         ;; (bad HTML).
+                         "\"\\([^\"]*\\(\"[ \n\r\t]*,[ 
\n\r\t]*\"[^\"]*\\)+\\)\""
+                         "\\|"
+                         ;; Comma separated list of literals with single quotes
+                         ;; (bad HTML).
+                         "'\\([^']*\\('[ \n\r\t]*,[ \n\r\t]*'[^']*\\)+\\)'"
+                         "\\|"
+                         ;; Literal with double quotes.
+                         "\"\\([^\"]*\\)\""
+                         "\\|"
+                         ;; Literal with single quotes.
+                         "'\\([^']*\\)'"
+                         "\\|"
+                         ;; Handle bad HTML conflicting with NET-enabling
+                         ;; start-tags.
+                         "\\([^ \t\n\r>]+/[^ \t\n\r>]+\\)[ \t\n\r>]"
+                         "\\|"
+                         ;; SGML NAME-syntax attribute value.
+                         "\\([-a-z0-9.]+\\)[ \t\n\r></]"
+                         )))
                      (cond
-                      ((match-beginning 1)
-                       (while (progn (skip-chars-forward "^\"") (not (eobp)))
-                         (delete-char 1))
-                       (goto-char (point-min)))
-                      ((match-beginning 3)
-                       (while (progn (skip-chars-forward "^'") (not (eobp)))
-                         (delete-char 1))
-                       (goto-char (point-min))))
+                      ((or (match-beginning 5)
+                           (match-beginning 6)
+                           (match-beginning 1)
+                           (match-beginning 3))
+                       (if (or (match-beginning 1)
+                               (match-beginning 3))
+                           (w3-debug-html
+                            :nocontext
+                            (format "Badly quoted attribute value: %s"
+                                    (match-string 0))))
+                       ;; We have an attribute value literal.
+                       (narrow-to-region (1+ (match-beginning 0))
+                                         (1- (match-end 0)))
+                       ;; Delete (bad) extra quotes from comma separated list.
+                       (cond
+                        ((match-beginning 1)
+                         (while (progn (skip-chars-forward "^\"") (not (eobp)))
+                           (delete-char 1))
+                         (goto-char (point-min)))
+                        ((match-beginning 3)
+                         (while (progn (skip-chars-forward "^'") (not (eobp)))
+                           (delete-char 1))
+                         (goto-char (point-min))))
                      
-                     ;; In attribute value literals, EE and RS are ignored
-                     ;; and RE and SEPCHAR characters sequences are
-                     ;; replaced by SPACEs.
-                     ;;
-                     ;; (There is no way right now to get RS into one of
-                     ;; these so that it can be ignored.  This is due to
-                     ;; our using Unix line-handling conventions.)
-                     (skip-chars-forward "^&\t\n\r")
-                     (if (eobp)
-                         nil
-                       ;; We must expand entities and replace RS, RE,
-                       ;; and SEPCHAR.
-                       (goto-char (point-min))
-                       (while (progn
-                                (skip-chars-forward "^&")
-                                (not (eobp)))
-                         (w3-expand-entity-at-point-maybe))
-                       (subst-char-in-region (point-min) (point-max) ?\t ? )
-                       (subst-char-in-region (point-min) (point-max) ?\n ? ))
-                     ;; Set this after we have changed the size of the
-                     ;; attribute.
-                     (setq attribute-value-end (1+ (point-max))))
-                    ((match-beginning 8)
-                     (setq attribute-value-end (match-end 8))
-                     (narrow-to-region (point) attribute-value-end))
-                    ((match-beginning 7)
-                     (setq attribute-value-end (match-end 7))
-                     (narrow-to-region (point) attribute-value-end)
-                     ;; Horribly illegal non-SGML handling of bad
-                     ;; HTML on the net.  This can break valid HTML.
-                     (setq attr-value (buffer-substring (point)
-                                                        (match-end 7)))
+                       ;; In attribute value literals, EE and RS are ignored
+                       ;; and RE and SEPCHAR characters sequences are
+                       ;; replaced by SPACEs.
+                       ;;
+                       ;; (There is no way right now to get RS into one of
+                       ;; these so that it can be ignored.  This is due to
+                       ;; our using Unix line-handling conventions.)
+                       (skip-chars-forward "^&\t\n\r")
+                       (if (eobp)
+                           nil
+                         ;; We must expand entities and replace RS, RE,
+                         ;; and SEPCHAR.
+                         (goto-char (point-min))
+                         (while (progn
+                                  (skip-chars-forward "^&")
+                                  (not (eobp)))
+                           (w3-expand-entity-at-point-maybe))
+                         (subst-char-in-region (point-min) (point-max) ?\t ? )
+                         (subst-char-in-region (point-min) (point-max) ?\n ? ))
+                       ;; Set this after we have changed the size of the
+                       ;; attribute.
+                       (setq attribute-value-end (1+ (point-max))))
+                      ((match-beginning 8)
+                       (setq attribute-value-end (match-end 8))
+                       (narrow-to-region (point) attribute-value-end))
+                      ((match-beginning 7)
+                       (setq attribute-value-end (match-end 7))
+                       (narrow-to-region (point) attribute-value-end)
+                       ;; Horribly illegal non-SGML handling of bad
+                       ;; HTML on the net.  This can break valid HTML.
+                       (setq attr-value (buffer-substring (point)
+                                                          (match-end 7)))
+                       (w3-debug-html :nocontext
+                                      (format "Evil attribute value syntax: %s"
+                                              (buffer-substring (point-min) 
(point-max)))))
+                      (t
+                       (error "impossible attribute value"))))
+                    ((memq (char-after (point)) '(?\" ?'))
+                     ;; Missing terminating quote character.
+                     (narrow-to-region (point)
+                                       (progn
+                                         (forward-char 1)
+                                         (skip-chars-forward "^ \t\n\r'\"<>")
+                                         (setq attribute-value-end (point))))
                      (w3-debug-html :nocontext
-                       (format "Evil attribute value syntax: %s"
-                               (buffer-substring (point-min) (point-max)))))
+                                    (format "Attribute value missing end 
quote: %s"
+                                            (buffer-substring (point-min) 
(point-max))))
+                     (narrow-to-region (1+ (point-min)) (point-max)))
                     (t
-                     (error "impossible attribute value"))))
-                  ((memq (char-after (point)) '(?\" ?'))
-                   ;; Missing terminating quote character.
-                   (narrow-to-region (point)
-                                     (progn
-                                       (forward-char 1)
-                                       (skip-chars-forward "^ \t\n\r'\"<>")
-                                       (setq attribute-value-end (point))))
-                   (w3-debug-html :nocontext
-                     (format "Attribute value missing end quote: %s"
-                             (buffer-substring (point-min) (point-max))))
-                   (narrow-to-region (1+ (point-min)) (point-max)))
+                     ;; We have a syntactically invalid attribute value.  Let's
+                     ;; make a best guess as to what the author intended.
+                     (narrow-to-region (point)
+                                       (progn
+                                         (skip-chars-forward "^ \t\n\r'\"<>")
+                                         (setq attribute-value-end (point))))
+                     (w3-debug-html :nocontext
+                                    (format "Bad attribute value syntax: %s"
+                                            (buffer-substring (point-min) 
(point-max))))))
+                   ;; Now we have isolated the attribute value.  We need to
+                   ;; munge the value depending on the syntax of the
+                   ;; attribute.
+                   ;; *** Right now, we only implement the necessary munging
+                   ;; for CDATA attributes, which is none.  I'm not sure why
+                   ;; this happens to work for other attributes right now.
+                   ;; For any other kind of attribute, we are supposed to
+                   ;; * smash case
+                   ;; * remove leading/trailing whitespace
+                   ;; * smash multiple space sequences into single spaces
+                   ;; * verify the syntax of each token
+                   (setq attr-value (buffer-substring (point-min) (point-max)))
+                   (case attr-name
+                     (class
+                      (setq attr-value (split-string attr-value "[ ,]+")))
+                     (align
+                      (if (string-match "^[ \t\r\n]*\\(.*\\)[ \t\r\n]*$"
+                                        attr-value)
+                          (setq attr-value (downcase
+                                            (substring attr-value
+                                                       (match-beginning 1)
+                                                       (match-end 1))))
+                        (setq attr-value (downcase attr-value)))
+                      (setq attr-value (intern attr-value)))
+                     ((src href)
+                      ;; I should expand URLs here
+                      )
+                     (otherwise nil)
+                     )
+                   (widen)
+                   (goto-char attribute-value-end))
                   (t
-                   ;; We have a syntactically invalid attribute value.  Let's
-                   ;; make a best guess as to what the author intended.
-                   (narrow-to-region (point)
-                                     (progn
-                                       (skip-chars-forward "^ \t\n\r'\"<>")
-                                       (setq attribute-value-end (point))))
-                   (w3-debug-html :nocontext
-                     (format "Bad attribute value syntax: %s"
-                             (buffer-substring (point-min) (point-max))))))
-                 ;; Now we have isolated the attribute value.  We need to
-                 ;; munge the value depending on the syntax of the
-                 ;; attribute.
-                 ;; *** Right now, we only implement the necessary munging
-                 ;; for CDATA attributes, which is none.  I'm not sure why
-                 ;; this happens to work for other attributes right now.
-                 ;; For any other kind of attribute, we are supposed to
-                 ;; * smash case
-                 ;; * remove leading/trailing whitespace
-                 ;; * smash multiple space sequences into single spaces
-                 ;; * verify the syntax of each token
-                 (setq attr-value (buffer-substring (point-min) (point-max)))
-                 (case attr-name
-                   (class
-                    (setq attr-value (split-string attr-value "[ ,]+")))
-                   (align
-                    (if (string-match "^[ \t\r\n]*\\(.*\\)[ \t\r\n]*$"
-                                      attr-value)
-                        (setq attr-value (downcase
-                                          (substring attr-value
-                                                     (match-beginning 1)
-                                                     (match-end 1))))
-                      (setq attr-value (downcase attr-value)))
-                    (setq attr-value (intern attr-value)))
-                   ((src href)
-                    ;; I should expand URLs here
-                    )
-                   (otherwise nil)
-                   )
-                 (widen)
-                 (goto-char attribute-value-end))
-                (t
-                 ;; No value was specified, in which case NAME should be
-                 ;; taken as ATTRIBUTE=NAME where NAME is one of the
-                 ;; enumerated values for ATTRIBUTE.
-                 ;; We assume here that ATTRIBUTE is the same as NAME.
-                 ;; *** Another piece of code will fix the attribute name if it
-                 ;; is wrong.
-                 (setq attr-value (symbol-name attr-name))))
+                   ;; No value was specified, in which case NAME should be
+                   ;; taken as ATTRIBUTE=NAME where NAME is one of the
+                   ;; enumerated values for ATTRIBUTE.
+                   ;; We assume here that ATTRIBUTE is the same as NAME.
+                   ;; *** Another piece of code will fix the attribute name if 
it
+                   ;; is wrong.
+                   (setq attr-value (symbol-name attr-name))))
              
-               ;; Accumulate the attributes.
-               (setq tag-attributes (cons (cons attr-name attr-value)
-                                          tag-attributes)))
-
-             (if (and (eq w3-p-d-tag-name 'img)
-                      (not (assq 'alt tag-attributes)))
-                 (w3-debug-html :bad-style
-                                :outer
-                                "IMG element has no ALT attribute"))
-             (cond
-              ((and (eq w3-p-d-tag-name 'base)
-                    (setq w3-p-s-baseobject
-                          (or (assq 'src tag-attributes)
-                              (assq 'href tag-attributes))))
-               (setq w3-p-s-baseobject (url-generic-parse-url
-                                        (cdr w3-p-s-baseobject))))
-              ((setq w3-p-s-btdt (or (assq 'src tag-attributes)
-                                     (assq 'background tag-attributes)
-                                     (assq 'href tag-attributes)
-                                     (assq 'action tag-attributes)))
-               (setcdr w3-p-s-btdt (url-expand-file-name (cdr w3-p-s-btdt)
-                                                         w3-p-s-baseobject))
-               (setq w3-p-s-btdt (if (url-have-visited-url (cdr w3-p-s-btdt))
-                                     ":visited"
-                                   ":link"))
-               (if (assq 'class tag-attributes)
-                   (setcdr (assq 'class tag-attributes)
-                           (cons w3-p-s-btdt
-                                 (cdr (assq 'class tag-attributes))))
-                 (setq tag-attributes (cons (cons 'class (list w3-p-s-btdt))
-                                            tag-attributes))))
-              )
-             (if (not (eq w3-p-d-tag-name 'input))
-                 nil
-               (setq w3-p-s-btdt (concat ":"
-                                         (downcase
-                                          (or (cdr-safe
-                                               (assq 'type tag-attributes))
-                                              "text"))))
-               (if (assq 'class tag-attributes)
-                   (setcdr (assq 'class tag-attributes)
-                           (cons w3-p-s-btdt
-                                 (cdr (assq 'class tag-attributes))))
-                 (setq tag-attributes (cons (cons 'class (list w3-p-s-btdt))
-                                            tag-attributes))))
-             )
+                 ;; Accumulate the attributes.
+                 (setq tag-attributes (cons (cons attr-name attr-value)
+                                            tag-attributes)))
+
+               (if (and (eq w3-p-d-tag-name 'img)
+                        (not (assq 'alt tag-attributes)))
+                   (w3-debug-html :bad-style
+                                  :outer
+                                  "IMG element has no ALT attribute"))
+               (cond
+                ((and (eq w3-p-d-tag-name 'base)
+                      (setq w3-p-s-baseobject
+                            (or (assq 'src tag-attributes)
+                                (assq 'href tag-attributes))))
+                 (setq w3-p-s-baseobject (url-generic-parse-url
+                                          (cdr w3-p-s-baseobject))))
+                ((setq w3-p-s-btdt (or (assq 'src tag-attributes)
+                                       (assq 'background tag-attributes)
+                                       (assq 'href tag-attributes)
+                                       (assq 'action tag-attributes)))
+                 (setcdr w3-p-s-btdt (url-expand-file-name (cdr w3-p-s-btdt)
+                                                           w3-p-s-baseobject))
+                 (setq w3-p-s-btdt (if (url-have-visited-url (cdr w3-p-s-btdt))
+                                       ":visited"
+                                     ":link"))
+                 (if (assq 'class tag-attributes)
+                     (setcdr (assq 'class tag-attributes)
+                             (cons w3-p-s-btdt
+                                   (cdr (assq 'class tag-attributes))))
+                   (setq tag-attributes (cons (cons 'class (list w3-p-s-btdt))
+                                              tag-attributes))))
+                )
+               (if (not (eq w3-p-d-tag-name 'input))
+                   nil
+                 (setq w3-p-s-btdt (concat ":"
+                                           (downcase
+                                            (or (cdr-safe
+                                                 (assq 'type tag-attributes))
+                                                "text"))))
+                 (if (assq 'class tag-attributes)
+                     (setcdr (assq 'class tag-attributes)
+                             (cons w3-p-s-btdt
+                                   (cdr (assq 'class tag-attributes))))
+                   (setq tag-attributes (cons (cons 'class (list w3-p-s-btdt))
+                                              tag-attributes))))
+               )
           
-            ;; Process the end of the tag.
-            (skip-chars-forward " \t\n\r")
-            (cond ((eq ?> (char-after (point)))
-                   ;; Ordinary tag end.
-                   (forward-char 1))
-                  ((and (eq ?/ (char-after (point)))
-                        (not w3-p-d-end-tag-p))
-                   ;; This is a NET-enabling start-tag.
-                   (setq net-tag-p t)
-                   (forward-char 1))
-                  ((eq ?< (char-after (point)))
-                   ;; *** Strictly speaking, the following text has to
-                   ;; lexically be STAGO or ETAGO, which means that it
-                   ;; can't match some other lexical unit.
-                   ;; Unclosed tag.
-                   nil)
-                  (t
-                   ;; Syntax error.
-                   (w3-debug-html
+             ;; Process the end of the tag.
+             (skip-chars-forward " \t\n\r")
+             (cond ((eq ?> (char-after (point)))
+                    ;; Ordinary tag end.
+                    (forward-char 1))
+                   ((and (eq ?/ (char-after (point)))
+                         (not w3-p-d-end-tag-p))
+                    ;; This is a NET-enabling start-tag.
+                    (setq net-tag-p t)
+                    (forward-char 1))
+                   ((eq ?< (char-after (point)))
+                    ;; *** Strictly speaking, the following text has to
+                    ;; lexically be STAGO or ETAGO, which means that it
+                    ;; can't match some other lexical unit.
+                    ;; Unclosed tag.
+                    nil)
+                   (t
+                    ;; Syntax error.
+                    (w3-debug-html
                      (format "Bad unclosed %s%s tag"
                              (if w3-p-d-end-tag-p "/" "")
                              (w3-sgml-name-to-string w3-p-d-tag-name)))))
             
-            (setq tag-end (point)))
+             (setq tag-end (point)))
            
-           ((looking-at "/?>")
-            ;; We are looking at an empty tag (<>, </>).
-            (setq w3-p-d-end-tag-p (eq ?/ (char-after (point))))
-            (setq w3-p-d-tag-name (if w3-p-d-end-tag-p
-                               (w3-element-name w3-p-d-current-element)
-                             ;; *** Strictly speaking, if OMITTAG NO, then
-                             ;; we should use the most recently closed tag.
-                             ;; But OMITTAG YES in HTML and I'm lazy.
-                             (w3-element-name w3-p-d-current-element)))
-            (setq tag-attributes nil)
-            ;; *** Make sure this is not at top level.
-            (setq between-tags-end (1- (point)))
-            (setq tag-end (match-end 0)))
+            ((looking-at "/?>")
+             ;; We are looking at an empty tag (<>, </>).
+             (setq w3-p-d-end-tag-p (eq ?/ (char-after (point))))
+             (setq w3-p-d-tag-name (if w3-p-d-end-tag-p
+                                       (w3-element-name w3-p-d-current-element)
+                                     ;; *** Strictly speaking, if OMITTAG NO, 
then
+                                     ;; we should use the most recently closed 
tag.
+                                     ;; But OMITTAG YES in HTML and I'm lazy.
+                                     (w3-element-name w3-p-d-current-element)))
+             (setq tag-attributes nil)
+             ;; *** Make sure this is not at top level.
+             (setq between-tags-end (1- (point)))
+             (setq tag-end (match-end 0)))
          
-           ;; *** In SGML, <(doctype)element> is valid tag syntax.  This
-           ;; cannot occur in HTML because the CONCUR option is off in the
-           ;; SGML declaration.
+            ;; *** In SGML, <(doctype)element> is valid tag syntax.  This
+            ;; cannot occur in HTML because the CONCUR option is off in the
+            ;; SGML declaration.
          
-           ((looking-at "!--")
-            ;; We found a comment, delete to end of comment.
-            (delete-region
-             (1- (point))
-             (progn
-               (forward-char 1)
-               ;; Skip over pairs of -- ... --.
-               ;;
-               ;; This can cause us to hit a stack overflow in the regexp
-               ;; engine.  And I'm not sure its correct anyway.  Lets just
-               ;; always fall back to the (semi) non-SGML way of dealing
-               ;; with comments.  WMP  12/24/97
+            ((looking-at "!--")
+             ;; We found a comment, delete to end of comment.
+             (delete-region
+              (1- (point))
+              (progn
+                (forward-char 1)
+                ;; Skip over pairs of -- ... --.
+                ;;
+                ;; This can cause us to hit a stack overflow in the regexp
+                ;; engine.  And I'm not sure its correct anyway.  Lets just
+                ;; always fall back to the (semi) non-SGML way of dealing
+                ;; with comments.  WMP  12/24/97
 ;;;               (if (looking-at "\\(--[^-]*\\(-[^-]+\\)*--[ \t\r\n]*\\)+>")
 ;;;                   (goto-char (match-end 0))
 ;;;                 ;; Syntax error!
@@ -2470,366 +2471,367 @@ Returns a data structure containing the parsed 
information."
 ;;;                 (forward-char 2)
 ;;;                 (or (re-search-forward "--[ \t\r\n]*>" nil t)
 ;;;                     (search-forward ">" nil t)))
-               (forward-char 2)
-               (or (re-search-forward "--[ \t\r\n]*>" nil t)
-                   (search-forward ">" nil t))
-               (point))))
+                (forward-char 2)
+                (or (re-search-forward "--[ \t\r\n]*>" nil t)
+                    (search-forward ">" nil t))
+                (point))))
            
-           ((looking-at "!>\\|\\?[^>]*>")
-            ;; We are looking at an empty comment or a processing
-            ;; instruction.  Delete it.
-            (replace-match "")
-            (delete-char -1))
-
-           ((looking-at "![a-z]")
-            ;; We are looking at a markup declaration.  Delete it.
-            ;; *** Technically speaking, to handle valid HTML I think we
-            ;; need to handle "<!USEMAP ... >" declarations.  In the future,
-            ;; to handle general SGML, we should parse "<!DOCTYPE ... >"
-            ;; declarations as well (which can contain other declarations).
-            ;; In the very distant future, perhaps we will handle "<!SGML
-            ;; ... >" declarations.
-            ;; *** Should warn if it's not SGML, DOCTYPE, or USEMAP.
-            (backward-char 1)
-            (delete-region
-             (point)
-             (progn
-               (condition-case nil
-                   (forward-sexp 1)
-                 (error
-                  ;; *** This might not actually be bad syntax, but might
-                  ;; instead be a -- ... -- comment with unbalanced
-                  ;; parentheses somewhere inside the declaration.  Handling
-                  ;; this properly would require full parsing of markup
-                  ;; declarations, a goal for the future.
-                  (w3-debug-html "Bad <! syntax.")
-                  (skip-chars-forward "^>")
-                  (if (eq ?> (char-after (point)))
-                      (forward-char))))
-               (point))))
+            ((looking-at "!>\\|\\?[^>]*>")
+             ;; We are looking at an empty comment or a processing
+             ;; instruction.  Delete it.
+             (replace-match "")
+             (delete-char -1))
+
+            ((looking-at "![a-z]")
+             ;; We are looking at a markup declaration.  Delete it.
+             ;; *** Technically speaking, to handle valid HTML I think we
+             ;; need to handle "<!USEMAP ... >" declarations.  In the future,
+             ;; to handle general SGML, we should parse "<!DOCTYPE ... >"
+             ;; declarations as well (which can contain other declarations).
+             ;; In the very distant future, perhaps we will handle "<!SGML
+             ;; ... >" declarations.
+             ;; *** Should warn if it's not SGML, DOCTYPE, or USEMAP.
+             (backward-char 1)
+             (delete-region
+              (point)
+              (progn
+                (condition-case nil
+                    (forward-sexp 1)
+                  (error
+                   ;; *** This might not actually be bad syntax, but might
+                   ;; instead be a -- ... -- comment with unbalanced
+                   ;; parentheses somewhere inside the declaration.  Handling
+                   ;; this properly would require full parsing of markup
+                   ;; declarations, a goal for the future.
+                   (w3-debug-html "Bad <! syntax.")
+                   (skip-chars-forward "^>")
+                   (if (eq ?> (char-after (point)))
+                       (forward-char))))
+                (point))))
          
-           ((looking-at "!\\\[\\(\\([ \t\n\r]*[a-z]+\\)+[ \t\n\r]*\\)\\\[")
-            ;; We are looking at a marked section.
-            ;; *** Strictly speaking, we should issue a warning if the
-            ;; keywords are invalid or missing or if the "[" does not follow.
-            ;; We must look at the keywords to understand how to parse it.
-            ;; *** Strictly speaking, we should perform parameter entity
-            ;; substitution on the keywords first.
-            (goto-char (match-beginning 1))
-            (insert ?\))
-            (goto-char (1- (match-beginning 0)))
-            (delete-char 3)
-            (insert ?\()
-            (backward-char 1)
-            (let* ((keywords (read (current-buffer)))
-                   ;; Multiple keywords may appear, but only the most
-                   ;; significant takes effect.  Rank order is IGNORE, CDATA,
-                   ;; RCDATA, INCLUDE, and TEMP.  INCLUDE and TEMP have the
-                   ;; same effect.
-                   (keyword (car-safe (cond ((memq 'IGNORE keywords))
-                                            ((memq 'CDATA keywords))
-                                            ((memq 'RCDATA keywords))
-                                            ((memq 'INCLUDE keywords))
-                                            ((memq 'TEMP keywords))))))
-              (or (eq ?\[ (char-after (point)))
-                  ;; I probably shouldn't even check this, since it is so
-                  ;; impossible.
-                  (error "impossible ??"))
-              (forward-char 1)
-              (delete-region (1- (match-beginning 0)) (point))
-              (cond ((eq 'IGNORE keyword)
-                     ;; Scan forward skipping over matching <![ ... ]]>
-                     ;; until we find an unmatched "]]>".
-                     (let ((ignore-nesting 1)
-                           (start-pos (point)))
-                       (while (> ignore-nesting 0)
-                         (if (re-search-forward "<!\\\\\[\\|\]\]>" nil t)
-                             (setq ignore-nesting
-                                   (if (eq ?> (preceding-char))
-                                       (1- ignore-nesting)
-                                     (1+ ignore-nesting)))
-                           (w3-debug-html
+            ((looking-at "!\\\[\\(\\([ \t\n\r]*[a-z]+\\)+[ \t\n\r]*\\)\\\[")
+             ;; We are looking at a marked section.
+             ;; *** Strictly speaking, we should issue a warning if the
+             ;; keywords are invalid or missing or if the "[" does not follow.
+             ;; We must look at the keywords to understand how to parse it.
+             ;; *** Strictly speaking, we should perform parameter entity
+             ;; substitution on the keywords first.
+             (goto-char (match-beginning 1))
+             (insert ?\))
+             (goto-char (1- (match-beginning 0)))
+             (delete-char 3)
+             (insert ?\()
+             (backward-char 1)
+             (let* ((keywords (read (current-buffer)))
+                    ;; Multiple keywords may appear, but only the most
+                    ;; significant takes effect.  Rank order is IGNORE, CDATA,
+                    ;; RCDATA, INCLUDE, and TEMP.  INCLUDE and TEMP have the
+                    ;; same effect.
+                    (keyword (car-safe (cond ((memq 'IGNORE keywords))
+                                             ((memq 'CDATA keywords))
+                                             ((memq 'RCDATA keywords))
+                                             ((memq 'INCLUDE keywords))
+                                             ((memq 'TEMP keywords))))))
+               (or (eq ?\[ (char-after (point)))
+                   ;; I probably shouldn't even check this, since it is so
+                   ;; impossible.
+                   (error "impossible ??"))
+               (forward-char 1)
+               (delete-region (1- (match-beginning 0)) (point))
+               (cond ((eq 'IGNORE keyword)
+                      ;; Scan forward skipping over matching <![ ... ]]>
+                      ;; until we find an unmatched "]]>".
+                      (let ((ignore-nesting 1)
+                            (start-pos (point)))
+                        (while (> ignore-nesting 0)
+                          (if (re-search-forward "<!\\\\\[\\|\]\]>" nil t)
+                              (setq ignore-nesting
+                                    (if (eq ?> (preceding-char))
+                                        (1- ignore-nesting)
+                                      (1+ ignore-nesting)))
+                            (w3-debug-html
                              "Unterminated IGNORE marked section.")
-                           (setq ignore-nesting 0)
-                           (goto-char start-pos)))
-                       (delete-region start-pos (point))))
-                    ((eq 'CDATA keyword)
-                     (error "***unimplemented***"))
-                    ((eq 'RCDATA keyword)
-                     (error "***unimplemented***"))
-                    ((memq keyword '(INCLUDE TEMP))
-                     (error "***unimplemented***")))))
-           ((and (looking-at "!")
-                 w3-netscape-compatible-comments)
-            ;; Horribly illegal non-SGML handling of bad HTML on the net.
-            ;; This can break valid HTML.
-            ;; This arises because Netscape discards anything looking like
-            ;; "<!...>".  So people expect they can use this construct as
-            ;; a comment.
-            (w3-debug-html "Evil <! comment syntax.")
-            (backward-char 1)
-            (delete-region
-             (point)
-             (progn
-               (skip-chars-forward "^>")
-               (if (eq ?> (char-after (point)))
-                   (forward-char))
-               (point))))
-           (t
-            ;; This < is not a markup character.  Pretend we didn't notice
-            ;; it at all.  We have skipped over the < already, so just loop
-            ;; again.
-            )))
+                            (setq ignore-nesting 0)
+                            (goto-char start-pos)))
+                        (delete-region start-pos (point))))
+                     ((eq 'CDATA keyword)
+                      (error "***unimplemented***"))
+                     ((eq 'RCDATA keyword)
+                      (error "***unimplemented***"))
+                     ((memq keyword '(INCLUDE TEMP))
+                      (error "***unimplemented***")))))
+            ((and (looking-at "!")
+                  w3-netscape-compatible-comments)
+             ;; Horribly illegal non-SGML handling of bad HTML on the net.
+             ;; This can break valid HTML.
+             ;; This arises because Netscape discards anything looking like
+             ;; "<!...>".  So people expect they can use this construct as
+             ;; a comment.
+             (w3-debug-html "Evil <! comment syntax.")
+             (backward-char 1)
+             (delete-region
+              (point)
+              (progn
+                (skip-chars-forward "^>")
+                (if (eq ?> (char-after (point)))
+                    (forward-char))
+                (point))))
+            (t
+             ;; This < is not a markup character.  Pretend we didn't notice
+             ;; it at all.  We have skipped over the < already, so just loop
+             ;; again.
+             )))
        
-         ((eq ?& (char-after (point)))
-          (w3-expand-entity-at-point-maybe))
-
-         ((and (eq ?\] (char-after (point)))
-               w3-p-d-in-parsed-marked-section
-               (looking-at "]]>"))
-          ;; *** handle the end of a parsed marked section.
-          (error "***unimplemented***"))
-
-         ((and (eq ?/ (char-after (point)))
-               w3-p-d-null-end-tag-enabled)
-          ;; We are looking at a null end tag.
-          (setq w3-p-d-end-tag-p t)
-          (setq between-tags-end (point))
-          (setq tag-end (1+ (point)))
-          (setq w3-p-d-tag-name (w3-element-name w3-p-d-current-element)))
+          ((eq ?& (char-after (point)))
+           (w3-expand-entity-at-point-maybe))
+
+          ((and (eq ?\] (char-after (point)))
+                w3-p-d-in-parsed-marked-section
+                (looking-at "]]>"))
+           ;; *** handle the end of a parsed marked section.
+           (error "***unimplemented***"))
+
+          ((and (eq ?/ (char-after (point)))
+                w3-p-d-null-end-tag-enabled)
+           ;; We are looking at a null end tag.
+           (setq w3-p-d-end-tag-p t)
+           (setq between-tags-end (point))
+           (setq tag-end (1+ (point)))
+           (setq w3-p-d-tag-name (w3-element-name w3-p-d-current-element)))
        
-         ;; This can be slow, since we'll hardly ever get here.
-         ;; *** Strictly speaking, I think we're supposed to handle
-         ;; shortrefs that begin with the same characters as other markup,
-         ;; preferring the longest match.
-         ;; I will assume that shortrefs never begin with <, &, \], /.
-         ((setq ref (catch 'found-shortref
-                      (let ((refs w3-p-d-shortrefs))
-                        (while refs
-                          (if (looking-at (car (car refs)))
-                              (throw 'found-shortref (cdr (car refs))))
-                          (setq refs (cdr refs))))))
-          ;; We are looking at a shortref for which there is an
-          ;; expansion defined in the current syntax.  Replace with the
-          ;; expansion, leaving point at the beginning so it will be parsed
-          ;; on the next loop.
-          ;; *** eek.  This is wrong if the shortref is for an entity with
-          ;; CDATA syntax which should not be reparsed for tags.
-          (replace-match "")
-          (let ((pt (point)))
-            (insert ref)
-            (goto-char pt)))
+          ;; This can be slow, since we'll hardly ever get here.
+          ;; *** Strictly speaking, I think we're supposed to handle
+          ;; shortrefs that begin with the same characters as other markup,
+          ;; preferring the longest match.
+          ;; I will assume that shortrefs never begin with <, &, \], /.
+          ((setq ref (catch 'found-shortref
+                       (let ((refs w3-p-d-shortrefs))
+                         (while refs
+                           (if (looking-at (car (car refs)))
+                               (throw 'found-shortref (cdr (car refs))))
+                           (setq refs (cdr refs))))))
+           ;; We are looking at a shortref for which there is an
+           ;; expansion defined in the current syntax.  Replace with the
+           ;; expansion, leaving point at the beginning so it will be parsed
+           ;; on the next loop.
+           ;; *** eek.  This is wrong if the shortref is for an entity with
+           ;; CDATA syntax which should not be reparsed for tags.
+           (replace-match "")
+           (let ((pt (point)))
+             (insert ref)
+             (goto-char pt)))
          
-         ((looking-at (eval-when-compile
-                        (concat "[" (w3-invalid-sgml-chars) "]")))
-          (w3-debug-html
+          ((looking-at (eval-when-compile
+                         (concat "[" (w3-invalid-sgml-chars) "]")))
+           (w3-debug-html
             (format "Invalid SGML character: %c" (char-after (point))))
-          (insert (or (cdr-safe (assq (char-after (point))
-                                      w3-invalid-sgml-char-replacement)) ""))
-          (delete-char 1))
-         ((eobp)
-          ;; We have finished the buffer.  Make sure we process the last
-          ;; piece of text, if any.
-          (setq between-tags-end (point))
-          ;; We have to test what's on the element stack because this
-          ;; piece of code gets executed twice.
-          (cond ((not (eq '*holder (w3-element-name w3-p-d-current-element)))
-                 ;; This forces the calculation of implied omitted end tags.
-                 (setq w3-p-d-tag-name '*document)
-                 (setq w3-p-d-end-tag-p t)
-                 (setq tag-end (point)))))
+           (insert (or (cdr-safe (assq (char-after (point))
+                                       w3-invalid-sgml-char-replacement)) ""))
+           (delete-char 1))
+          ((eobp)
+           ;; We have finished the buffer.  Make sure we process the last
+           ;; piece of text, if any.
+           (setq between-tags-end (point))
+           ;; We have to test what's on the element stack because this
+           ;; piece of code gets executed twice.
+           (cond ((not (eq '*holder (w3-element-name w3-p-d-current-element)))
+                  ;; This forces the calculation of implied omitted end tags.
+                  (setq w3-p-d-tag-name '*document)
+                  (setq w3-p-d-end-tag-p t)
+                  (setq tag-end (point)))))
          
-         (t
-          (error "unreachable code, this can't happen")))
+          (t
+           (error "unreachable code, this can't happen")))
         
-        ;; If we have determined the boundaries of a non-empty between-tags
-        ;; region of text, then handle it.
-        (cond
-         (between-tags-end
-          (cond
-           ((< between-tags-start between-tags-end)
-            ;; We have a non-empty between-tags region.
-
-            ;; We check if it's entirely whitespace, because we record the
-            ;; transitions for whitespace separately from those for
-            ;; data with non-whitespace characters.
-            (goto-char between-tags-start)
-            (skip-chars-forward " \t\n\r" between-tags-end)
-            (cond
-             ((w3-grok-tag-or-data (prog1 
-                                       (if (= between-tags-end (point))
-                                           '*space
-                                         '*data)
-                                     (goto-char between-tags-end)))
-              ;; We have to include the text in the current element's
-              ;; contents.  If this is the first item in the current
-              ;; element's contents, don't include a leading newline if
-              ;; there is one.  Add a trailing newline as a separate text
-              ;; item so that it can be removed later if it turns out to
-              ;; be the last item in the current element's contents when
-              ;; the current element is closed.
-              ;; *** We could perform this test before calling
-              ;; w3-grok-tag-or-data, but it's not clear which will be
-              ;; faster in practice.
-              (or (setq content (w3-element-content w3-p-d-current-element))
-                  ;; *** Strictly speaking, in SGML the record end is
-                  ;; carriage return, not line feed.
-                  (if (eq ?\n (char-after between-tags-start))
-                      (setq between-tags-start (1+ between-tags-start))))
-              (if (= between-tags-start (point))
-                  ;; Do nothing.
-                  nil
-                ;; We are definitely going to add data characters to the
-                ;; content.
-                (cond
-                 ((and (= ?\n (preceding-char))
-                       (/= between-tags-start (1- (point))))
-                  (setq content (cons (buffer-substring between-tags-start
-                                                        (1- (point)))
-                                      content))
-                  (setq content (cons "\n" content)))
-                 (t
-                  (setq content (cons (buffer-substring between-tags-start
-                                                        (point))
-                                      content))))
-                (w3-set-element-content w3-p-d-current-element content))))))
+         ;; If we have determined the boundaries of a non-empty between-tags
+         ;; region of text, then handle it.
+         (cond
+          (between-tags-end
+           (cond
+            ((< between-tags-start between-tags-end)
+             ;; We have a non-empty between-tags region.
+
+             ;; We check if it's entirely whitespace, because we record the
+             ;; transitions for whitespace separately from those for
+             ;; data with non-whitespace characters.
+             (goto-char between-tags-start)
+             (skip-chars-forward " \t\n\r" between-tags-end)
+             (cond
+              ((w3-grok-tag-or-data (prog1 
+                                        (if (= between-tags-end (point))
+                                            '*space
+                                          '*data)
+                                      (goto-char between-tags-end)))
+               ;; We have to include the text in the current element's
+               ;; contents.  If this is the first item in the current
+               ;; element's contents, don't include a leading newline if
+               ;; there is one.  Add a trailing newline as a separate text
+               ;; item so that it can be removed later if it turns out to
+               ;; be the last item in the current element's contents when
+               ;; the current element is closed.
+               ;; *** We could perform this test before calling
+               ;; w3-grok-tag-or-data, but it's not clear which will be
+               ;; faster in practice.
+               (or (setq content (w3-element-content w3-p-d-current-element))
+                   ;; *** Strictly speaking, in SGML the record end is
+                   ;; carriage return, not line feed.
+                   (if (eq ?\n (char-after between-tags-start))
+                       (setq between-tags-start (1+ between-tags-start))))
+               (if (= between-tags-start (point))
+                   ;; Do nothing.
+                   nil
+                 ;; We are definitely going to add data characters to the
+                 ;; content.
+                 (cond
+                  ((and (= ?\n (preceding-char))
+                        (/= between-tags-start (1- (point))))
+                   (setq content (cons (buffer-substring between-tags-start
+                                                         (1- (point)))
+                                       content))
+                   (setq content (cons "\n" content)))
+                  (t
+                   (setq content (cons (buffer-substring between-tags-start
+                                                         (point))
+                                       content))))
+                 (w3-set-element-content w3-p-d-current-element content))))))
           
-          (setq between-tags-end nil)))
+           (setq between-tags-end nil)))
       
-        ;; If the previous expression modified (point), then it went to
-        ;; the value of between-tags-end.
+         ;; If the previous expression modified (point), then it went to
+         ;; the value of between-tags-end.
       
-        ;; If we found a start or end-tag, we need to handle it.
-        (cond
-         (w3-p-d-tag-name
+         ;; If we found a start or end-tag, we need to handle it.
+         (cond
+          (w3-p-d-tag-name
         
-          ;; Move past the tag and prepare for next between-tags region.
-          (goto-char tag-end)
-          (setq between-tags-start (point))
+           ;; Move past the tag and prepare for next between-tags region.
+           (goto-char tag-end)
+           (setq between-tags-start (point))
         
-          (cond
-           (w3-p-d-end-tag-p
-            ;; Handle an end-tag.
-            (if (eq w3-p-d-tag-name (w3-element-name w3-p-d-current-element))
-                (w3-close-element)
-              ;; Handle the complex version.  We have to search up (down?)
-              ;; the open element stack to find the element that matches (if
-              ;; any).  Then we close all of the elements.  On a conforming
-              ;; SGML document this can do no wrong and it's not
-              ;; unreasonable on a non-conforming document.
+           (cond
+            (w3-p-d-end-tag-p
+             ;; Handle an end-tag.
+             (if (eq w3-p-d-tag-name (w3-element-name w3-p-d-current-element))
+                 (w3-close-element)
+               ;; Handle the complex version.  We have to search up (down?)
+               ;; the open element stack to find the element that matches (if
+               ;; any).  Then we close all of the elements.  On a conforming
+               ;; SGML document this can do no wrong and it's not
+               ;; unreasonable on a non-conforming document.
             
-              ;; Can't safely modify stack until we know the element we want
-              ;; to find is in there, so work with a copy.
-              (setq open-list w3-p-d-open-element-stack)
-              (while (and open-list
-                          (not (eq w3-p-d-tag-name
-                                   (w3-element-name (car open-list)))))
-                (setq open-list (cdr open-list)))
-              (cond (open-list
-                     ;; We found a match.  Pop elements.
-                     ;; We will use the following value as a sentinel.
-                     (setq open-list (cdr open-list))
-                     (while (not (eq open-list w3-p-d-open-element-stack))
-                       (w3-close-element t))
-                     (w3-close-element))
-                    (t
-                     ;; Bogus end tag.
-                     (w3-debug-html
+               ;; Can't safely modify stack until we know the element we want
+               ;; to find is in there, so work with a copy.
+               (setq open-list w3-p-d-open-element-stack)
+               (while (and open-list
+                           (not (eq w3-p-d-tag-name
+                                    (w3-element-name (car open-list)))))
+                 (setq open-list (cdr open-list)))
+               (cond (open-list
+                      ;; We found a match.  Pop elements.
+                      ;; We will use the following value as a sentinel.
+                      (setq open-list (cdr open-list))
+                      (while (not (eq open-list w3-p-d-open-element-stack))
+                        (w3-close-element t))
+                      (w3-close-element))
+                     (t
+                      ;; Bogus end tag.
+                      (w3-debug-html
                        (format "Unmatched end-tag </%s>"
                                (w3-sgml-name-to-string w3-p-d-tag-name)))))))
-           (t
-            ;; Handle a start-tag.
-            (cond
-             ;; Check if the new element is allowed in the current element's
-             ;; content model.
-             ((w3-grok-tag-or-data w3-p-d-tag-name)
-              (w3-open-element w3-p-d-tag-name tag-attributes)
+            (t
+             ;; Handle a start-tag.
+             (cond
+              ;; Check if the new element is allowed in the current element's
+              ;; content model.
+              ((w3-grok-tag-or-data w3-p-d-tag-name)
+               (w3-open-element w3-p-d-tag-name tag-attributes)
             
-              ;; Handle NET-enabling start tags.
-              (cond ((and net-tag-p
-                          (not w3-p-d-null-end-tag-enabled))
-                     ;; Save old values.
-                     (w3-set-element-undo-list 
-                      w3-p-d-current-element 
-                      (cons (cons 'w3-p-d-non-markup-chars
-                                  w3-p-d-non-markup-chars)
-                            (cons '(w3-p-d-null-end-tag-enabled . nil)
-                                  (w3-element-undo-list 
w3-p-d-current-element))))
-                     ;; Alter syntax.
-                     (setq w3-p-d-null-end-tag-enabled t)
-                     (w3-update-non-markup-chars)))
+               ;; Handle NET-enabling start tags.
+               (cond ((and net-tag-p
+                           (not w3-p-d-null-end-tag-enabled))
+                      ;; Save old values.
+                      (w3-set-element-undo-list 
+                       w3-p-d-current-element 
+                       (cons (cons 'w3-p-d-non-markup-chars
+                                   w3-p-d-non-markup-chars)
+                             (cons '(w3-p-d-null-end-tag-enabled . nil)
+                                   (w3-element-undo-list 
w3-p-d-current-element))))
+                      ;; Alter syntax.
+                      (setq w3-p-d-null-end-tag-enabled t)
+                      (w3-update-non-markup-chars)))
             
-              (setq content-model
-                    (w3-element-content-model w3-p-d-current-element))
+               (setq content-model
+                     (w3-element-content-model w3-p-d-current-element))
             
-              ;; If the element does not have parsed contents, then we
-              ;; can find its contents immediately.
-              (cond
-               ((memq content-model '(EMPTY CDATA XCDATA XXCDATA RCDATA))
-                (cond
-                 ((eq 'EMPTY content-model)
-                  (w3-close-element))
-                 ((eq 'CDATA content-model)
-                  ;; CDATA: all data characters until an end-tag.  We'll
-                  ;; process the end-tag on the next loop.
-                  (if (re-search-forward (if w3-p-d-null-end-tag-enabled
-                                             "</[a-z>]\\|/"
-                                           "</[a-z>]")
-                                         nil 'move)
-                      (goto-char (match-beginning 0))))
-                 ((eq 'XCDATA content-model)
-                  ;; XCDATA: special non-SGML-standard mode which includes
-                  ;; all data characters until "</foo" is seen where "foo"
-                  ;; is the name of this element (for XMP and LISTING).
-                  (if (search-forward 
-                       (concat "</" (symbol-name
-                                     (w3-element-name w3-p-d-current-element)))
-                       nil 'move)
-                      (goto-char (match-beginning 0))))
-                 ((eq 'XXCDATA content-model)
-                  ;; XXCDATA: special non-SGML-standard mode which includes
-                  ;; all data until end-of-entity (end-of-buffer for us)
-                  ;; (for PLAINTEXT).
-                  (goto-char (point-max)))
-                 ((eq 'RCDATA content-model)
-                  ;; RCDATA: all data characters until end-tag is seen,
-                  ;; except that entities are expanded first, although the
-                  ;; expansions are _not_ scanned for end-tags, although the
-                  ;; expansions _are_ scanned for further entity
-                  ;; references.
-                  (while (progn
-                           (if (re-search-forward (if 
w3-p-d-null-end-tag-enabled
-                                                      "</[a-z>]\\|[/&]"
-                                                    "</[a-z>]\\|&")
-                                                  nil 'move)
-                               (goto-char (match-beginning 0)))
-                           (eq ?& (char-after (point))))
-                    (w3-expand-entity-at-point-maybe)))))))
-             (t
-              ;; The element is illegal here.  We'll just discard the start
-              ;; tag as though we never saw it.
-              ))))
+               ;; If the element does not have parsed contents, then we
+               ;; can find its contents immediately.
+               (cond
+                ((memq content-model '(EMPTY CDATA XCDATA XXCDATA RCDATA))
+                 (cond
+                  ((eq 'EMPTY content-model)
+                   (w3-close-element))
+                  ((eq 'CDATA content-model)
+                   ;; CDATA: all data characters until an end-tag.  We'll
+                   ;; process the end-tag on the next loop.
+                   (if (re-search-forward (if w3-p-d-null-end-tag-enabled
+                                              "</[a-z>]\\|/"
+                                            "</[a-z>]")
+                                          nil 'move)
+                       (goto-char (match-beginning 0))))
+                  ((eq 'XCDATA content-model)
+                   ;; XCDATA: special non-SGML-standard mode which includes
+                   ;; all data characters until "</foo" is seen where "foo"
+                   ;; is the name of this element (for XMP and LISTING).
+                   (if (search-forward 
+                        (concat "</" (symbol-name
+                                      (w3-element-name 
w3-p-d-current-element)))
+                        nil 'move)
+                       (goto-char (match-beginning 0))))
+                  ((eq 'XXCDATA content-model)
+                   ;; XXCDATA: special non-SGML-standard mode which includes
+                   ;; all data until end-of-entity (end-of-buffer for us)
+                   ;; (for PLAINTEXT).
+                   (goto-char (point-max)))
+                  ((eq 'RCDATA content-model)
+                   ;; RCDATA: all data characters until end-tag is seen,
+                   ;; except that entities are expanded first, although the
+                   ;; expansions are _not_ scanned for end-tags, although the
+                   ;; expansions _are_ scanned for further entity
+                   ;; references.
+                   (while (progn
+                            (if (re-search-forward (if 
w3-p-d-null-end-tag-enabled
+                                                       "</[a-z>]\\|[/&]"
+                                                     "</[a-z>]\\|&")
+                                                   nil 'move)
+                                (goto-char (match-beginning 0)))
+                            (eq ?& (char-after (point))))
+                     (w3-expand-entity-at-point-maybe)))))))
+              (t
+               ;; The element is illegal here.  We'll just discard the start
+               ;; tag as though we never saw it.
+               ))))
         
-          (setq w3-p-d-tag-name nil)
-          (setq w3-p-d-end-tag-p nil)
-          (setq net-tag-p nil)
-          (setq tag-attributes nil)
-          (setq tag-end nil)))
+           (setq w3-p-d-tag-name nil)
+           (setq w3-p-d-end-tag-p nil)
+           (setq net-tag-p nil)
+           (setq tag-attributes nil)
+           (setq tag-end nil)))
         
-        ;; End of main while loop.
-        )
+         ;; End of main while loop.
+         )
     
-      ;; We have finished parsing the buffer!
-      (if status-message-format
-          (message "%sdone" (format status-message-format 100)))
+       ;; We have finished parsing the buffer!
+       (if status-message-format
+           (message "%sdone" (format status-message-format 100)))
     
-      ;; *** For debugging, save the true parse tree.
-      ;; *** Make this look inside *DOCUMENT.
-      (setq w3-last-parse-tree
-            (w3-element-content w3-p-d-current-element))
-
-      (w3-element-content w3-p-d-current-element)
-      )))
+       ;; *** For debugging, save the true parse tree.
+       ;; *** Make this look inside *DOCUMENT.
+       (setq w3-last-parse-tree
+             (w3-element-content w3-p-d-current-element))
+
+       (set-syntax-table old-syntax-table)
+       (w3-element-content w3-p-d-current-element)
+       ))))
 
 
 
diff --git a/lisp/w3-sysdp.el b/lisp/w3-sysdp.el
index 5d28c7a..d7471be 100644
--- a/lisp/w3-sysdp.el
+++ b/lisp/w3-sysdp.el
@@ -233,6 +233,11 @@
 (sysdep-defalias 'lower-frame 'lower-screen)
 (sysdep-defalias 'mail-other-frame 'mail-other-screen)
 
+(sysdep-defun frame-parameter (frame parameter)
+  "Return FRAME's value for parameter PARAMETER.
+  If FRAME is omitted, describe the currently selected frame."
+  (cdr (assq parameter (frame-parameters frame))))
+
 (sysdep-defalias 'make-frame
   (cond ((fboundp 'make-screen)
         (function (lambda (&optional parameters device)
diff --git a/lisp/w3.el b/lisp/w3.el
index 3bfdc87..a6f1d97 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/30 11:26:51 $
-;; Version: $Revision: 1.6 $
+;; Created: $Date: 1999/03/25 05:30:07 $
+;; Version: $Revision: 1.7 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -143,16 +143,18 @@ the subprocess exits."
 
 (defun w3-viewer-filter (proc string)
   ;; A process filter for asynchronous external viewers
-  (let ((buff (get-buffer-create (url-generate-new-buffer-name
-                                 (symbol-name
-                                  (read (nth 2 (process-command proc))))))))
-    (save-excursion
-      (set-buffer buff)
-      (erase-buffer)
-      (insert string)
-      (set-process-buffer proc buff)
-      (w3-notify-when-ready buff)
-      (set-process-filter proc nil))))
+  (if (= (length string) 0)
+      nil
+    (let ((buff (get-buffer-create (url-generate-new-buffer-name
+                                   (symbol-name
+                                    (read (nth 2 (process-command proc))))))))
+      (save-excursion
+       (set-buffer buff)
+       (erase-buffer)
+       (insert string)
+       (set-process-buffer proc buff)
+       (w3-notify-when-ready buff)
+       (set-process-filter proc nil)))))
 
 (defun w3-viewer-sentinel (proc string)
   ;; Delete any temp files left from a viewer process.
@@ -410,7 +412,7 @@ With prefix argument, use the URL of the hyperlink under 
point instead."
           (string-match url-nonrelative-link (car command-line-args-left)))
       (setq url (car command-line-args-left)
            command-line-args-left (cdr command-line-args-left)))
-  (if (equal url "") (error "No document specified!"))
+  (if (or (null url) (equal url "")) (error "No document specified!"))
   ;; legal use for relative URLs ?
   (if (string-match "^www:[^/].*" url)
       (setq url (concat (file-name-directory (url-filename

commit 0f701e3e671f74c53e8b73b368e1b7146533d863
Author: William M. Perry <address@hidden>
Date:   Sun Jan 10 16:26:06 1999 +0000

    *** empty log message ***

diff --git a/build-dist b/build-dist
index 4a5c6be..19292f6 100755
--- a/build-dist
+++ b/build-dist
@@ -30,6 +30,7 @@ export CVSROOT
 ( cd lisp ; cvs admin -s"p${version}" w3-vars.el )
 ( cd lisp ; cvs admin -s"p${version}" url-vars.el )
 ( cd texi ; cvs admin -s"v${version}" w3.txi )
+( cd texi ; cvs admin -s"v${version}" w3-faq.txi )
 
 cd /usr/tmp/
 rm -fr w3

commit 3e156f4cdb06a4063b1099adae837df6ff16a2db
Author: William M. Perry <address@hidden>
Date:   Sun Jan 10 13:48:53 1999 +0000

    New file to make updates a little more silent

diff --git a/.cvsignore b/.cvsignore
new file mode 100644
index 0000000..0941190
--- /dev/null
+++ b/.cvsignore
@@ -0,0 +1,9 @@
+Makefile
+w3-cfg.el
+w3-auto.el
+custom-load.el
+auto-autoloads.el
+*.elc
+config.log
+config.cache
+config.status

commit 8b91e04e1f426a1789ddabaf3166e6ea55563c12
Author: William M. Perry <address@hidden>
Date:   Sun Jan 10 13:46:38 1999 +0000

    *** empty log message ***

diff --git a/.version b/.version
index e522732..a272009 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-38
+39
diff --git a/ChangeLog b/ChangeLog
index e109511..0f31d86 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+1999-01-08  William M. Perry  <address@hidden>
+
+* lisp/docomp.el (emacs-build-autoloads): Only do the autoloads one way
+  for Emacs or XEmacs.
+
 1999-01-07  William M. Perry  <address@hidden>
 
 * build.bat: More tweaking of finding EMACSDIR automatically.

commit 0294ca1f619ac6a49f046a72bb695e7b6e53a94b
Author: William M. Perry <address@hidden>
Date:   Sun Jan 10 13:46:22 1999 +0000

    * lisp/docomp.el (emacs-build-autoloads): Only do the autoloads one way
      for Emacs or XEmacs.

diff --git a/lisp/docomp.el b/lisp/docomp.el
index 67ff9dd..592f101 100644
--- a/lisp/docomp.el
+++ b/lisp/docomp.el
@@ -124,23 +124,15 @@
 (defun emacs-build-autoloads (dir autofile)
   (require 'autoload)
 
-  ;; First we need to build the autoloads.  This leaves an
-  ;; auto-autoloads.el file that the XEmacs package system expects.
-  (if (and (fboundp 'batch-update-directory)
-          (fboundp 'update-autoloads-from-directory))
-      (let ((autoload-package-name "w3")
-           (generated-autoload-file autofile))
-       (update-autoloads-from-directory dir)
-       (save-some-buffers t))
-    (let ((files (directory-files dir t ".*.[eE][lL]$" nil)))
-      (save-excursion
-       (find-file autofile)
-       (erase-buffer)
-       (mapcar 'generate-file-autoloads files)
-       (goto-char (point-max))
-       (insert "\n(provide 'w3-autoloads)\n")
-       (save-buffer)
-       (kill-buffer (current-buffer)))))
+  (let ((files (directory-files dir t ".*.[eE][lL]$" nil)))
+    (save-excursion
+      (find-file autofile)
+      (erase-buffer)
+      (mapcar 'generate-file-autoloads files)
+      (goto-char (point-max))
+      (insert "\n(provide 'w3-autoloads)\n")
+      (save-buffer)
+      (kill-buffer (current-buffer))))
 
   ;; Now we need to munge that file to deal with
   (find-file "w3-auto.el")

commit a233d08290a6c475519ea8b379f978d345805b5c
Author: William M. Perry <address@hidden>
Date:   Thu Jan 7 15:34:32 1999 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index 354f4c8..e109511 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
+1999-01-07  William M. Perry  <address@hidden>
+
+* build.bat: More tweaking of finding EMACSDIR automatically.
+
+* lisp/w3-vars.el (w3-mode-map): Don't use read-kbd-macro
+
 1999-01-05  William M. Perry  <address@hidden>
 
+* build.bat: Make sure that we build the autoload files under windows.
+  Easier setting of the environment variables.  Also can now pass in
+  EMACSDIR on the command line.
+
 * lisp/docomp.el (byte-compile-dest-file): Downcase file names if we are
   in windows of any flavor.  Sometimes we get foo.EL instead of foo.el and 
   we were just naming the output file foo.EL.elc

commit 816c1731103a6d9d75f98bce31547dfe9975ea9c
Author: William M. Perry <address@hidden>
Date:   Thu Jan 7 15:25:41 1999 +0000

    *** empty log message ***

diff --git a/build.bat b/build.bat
index 37c85dc..a9a7f92 100644
--- a/build.bat
+++ b/build.bat
@@ -1,11 +1,24 @@
-set EMACSDIR=c:\emacs
-
-set EMACS=%EMACS%\bin\emacs.exe
-set WIDGETDIR=%EMACS%\lisp
-set GNUSDIR=%EMACS%\lisp
-
-cd lisp
-copy w3-cfg.nt w3-cfg.el
-%EMACS% -batch -q -l ./docomp.el -f emacs-batch-build-autoloads . 
auto-autoloads.el
-%EMACS% -batch -q -l ./docomp.el -f compile-it
-cd ..
address@hidden off
+
+set FALLBACKEMACSDIR=c:\emacs
+
+REM This allows the user to specify the emacs root on the command
+REM line.
+set COMMANDLINEGIVEN=yes
+if "%1" == "" set COMMANDLINEGIVEN=no
+if "%COMMANDLINEGIVEN%" == "yes" set EMACSDIR=%1
+
+REM If no emacs directory is set in the default environment, use our
+REM fallback.
+if "%EMACSDIR%" == "" echo EMACSDIR not set!  Using %FALLBACKEMACSDIR% as a 
default...
+if "%EMACSDIR%" == "" set EMACSDIR=%FALLBACKEMACSDIR%
+
+set EMACS=%EMACSDIR%\bin\emacs.exe
+set WIDGETDIR=%EMACSDIR%\lisp
+set GNUSDIR=%EMACSDIR%\lisp
+
+cd lisp
+copy w3-cfg.nt w3-cfg.el
+%EMACS% -batch -q -l ./docomp.el -f emacs-batch-build-autoloads . 
auto-autoloads.el
+%EMACS% -batch -q -l ./docomp.el -f compile-it
+cd ..

commit f08bd2e573ef587428120f260196891c0e6a1d9c
Author: William M. Perry <address@hidden>
Date:   Thu Jan 7 15:10:36 1999 +0000

    don't use read-kbd-macro

diff --git a/lisp/w3-vars.el b/lisp/w3-vars.el
index 63df7e0..aca559b 100644
--- a/lisp/w3-vars.el
+++ b/lisp/w3-vars.el
@@ -1,12 +1,12 @@
 ;;; w3-vars.el,v --- All variable definitions for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:11 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/01/07 15:10:36 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: comm, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -34,7 +34,7 @@
 (require 'wid-edit)                    ; For `widget-keymap'
 
 (defconst w3-version-number
-  (let ((x "$State: Exp $"))
+  (let ((x "$State: p4.0pre.42 $"))
     (if (string-match "State:[ \t\n]+.\\([^ \t\n]+\\)" x)
        (setq x (substring x (match-beginning 1) (match-end 1)))
       (setq x (substring x 1)))
@@ -42,7 +42,7 @@
      (function (lambda (x) (if (= x ?-) "." (char-to-string x)))) x ""))
   "Version # of w3-mode.")
 
-(defconst w3-version-date (let ((x "$Date: 1998/12/01 22:12:11 $"))
+(defconst w3-version-date (let ((x "$Date: 1999/01/07 15:10:36 $"))
                            (if (string-match "Date: \\([^ \t\n]+\\)" x)
                                (substring x (match-beginning 1) (match-end 1))
                              x))
@@ -609,8 +609,8 @@ for a charset indication")
 (define-key w3-mode-map [(control meta t)] 'url-list-processes)
 
 ;; Have fun with document ordering
-(define-key w3-mode-map (read-kbd-macro "M-SPC") 'w3-next-document)
-(define-key w3-mode-map (read-kbd-macro "M-DEL") 'w3-prev-document)
+(define-key w3-mode-map [(meta space)] 'w3-next-document)
+(define-key w3-mode-map [(meta delete)] 'w3-prev-document)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Keyword definitions

commit 72b9207fb9b8c66837588a211ddc0a9e47cea744
Author: William M. Perry <address@hidden>
Date:   Tue Jan 5 12:41:32 1999 +0000

    1999-01-05  William M. Perry  <address@hidden>
    
    * lisp/docomp.el (byte-compile-dest-file): Downcase file names if we are
      in windows of any flavor.  Sometimes we get foo.EL instead of foo.el and
      we were just naming the output file foo.EL.elc
      (compile-it): Make sure we get *.EL from directory-files as well.
      (emacs-build-autoloads): Ditto.  address@hidden windows file systems.
      (emacs-build-autoloads): Deal with Emacs or XEmacs way of rebuilding
      autoloads in lisp instead of relying on autoconf.  This will make
      everything much happier under windows.
    
    1999-01-04  William M. Perry  <address@hidden>
    
    * Makefile.in (dotemacs): Wrap the require we stick into $(DOTEMACS) in a
      `condition-case' for people that share their setups between emacsen or
      machines with different installed packages.
    
    * lisp/w3-forms.el (w3-form-encode-xwfu): Don't forget to deal with the
      new attributes if we are doing just a plain old form submission!
    
    1999-01-04  Milan Zamazal <address@hidden>
    
    * lisp/w3-forms.el (w3-submit-form): Correctly shorten the separator
      generated... was including too few characters.
      (w3-form-encode-helper): Added ability to specify additional attributes
      for the `file' input type so that we can keep track of the filename.
      (w3-form-encode-make-mime-part): Create content-disposition header
      instead of content-id and content-length
      (w3-form-encode-multipart/x-www-form-data): Use CRLF instead of just LF
      for separators.
      (w3-form-encode-multipart/x-www-form-data): Don't forget to add in the
      separator at the end of the message.
    
    1998-01-04  William M. Perry  <address@hidden>
    
    * lisp/w3-forms.el (w3-form-encode-multipart/x-www-form-data): Better
      separator generation.
    
    1999-01-04  Laurent Martelli <address@hidden>
    
    * lisp/w3-hotindex.el: Added autoload statements.
    
    1999-01-04  Kenichi Handa  <address@hidden>
    
    * lisp/Makefile.in (w3-auto.el): Generate w3-auto.el from
      auto-autoloads.el just build in the current directory.

diff --git a/ChangeLog b/ChangeLog
index b6bd6be..354f4c8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,76 @@
+1999-01-05  William M. Perry  <address@hidden>
+
+* lisp/docomp.el (byte-compile-dest-file): Downcase file names if we are
+  in windows of any flavor.  Sometimes we get foo.EL instead of foo.el and 
+  we were just naming the output file foo.EL.elc
+  (compile-it): Make sure we get *.EL from directory-files as well.
+  (emacs-build-autoloads): Ditto.  address@hidden windows file systems.
+  (emacs-build-autoloads): Deal with Emacs or XEmacs way of rebuilding
+  autoloads in lisp instead of relying on autoconf.  This will make
+  everything much happier under windows.
+
+1999-01-04  William M. Perry  <address@hidden>
+
+* Makefile.in (dotemacs): Wrap the require we stick into $(DOTEMACS) in a
+  `condition-case' for people that share their setups between emacsen or
+  machines with different installed packages.
+
+* lisp/w3-forms.el (w3-form-encode-xwfu): Don't forget to deal with the
+  new attributes if we are doing just a plain old form submission!
+
+1999-01-04  Milan Zamazal <address@hidden>
+
+* lisp/w3-forms.el (w3-submit-form): Correctly shorten the separator
+  generated... was including too few characters.
+  (w3-form-encode-helper): Added ability to specify additional attributes
+  for the `file' input type so that we can keep track of the filename.
+  (w3-form-encode-make-mime-part): Create content-disposition header
+  instead of content-id and content-length
+  (w3-form-encode-multipart/x-www-form-data): Use CRLF instead of just LF
+  for separators.
+  (w3-form-encode-multipart/x-www-form-data): Don't forget to add in the
+  separator at the end of the message.
+
+1998-01-04  William M. Perry  <address@hidden>
+
+* lisp/w3-forms.el (w3-form-encode-multipart/x-www-form-data): Better
+  separator generation.
+
+1999-01-04  Laurent Martelli <address@hidden>
+
+* lisp/w3-hotindex.el: Added autoload statements.
+
+1999-01-04  Kenichi Handa  <address@hidden>
+
+* lisp/Makefile.in (w3-auto.el): Generate w3-auto.el from
+  auto-autoloads.el just build in the current directory.
+
+1998-12-31  William M. Perry  <address@hidden>
+
+* lisp/font.el: Various mergings with the XEmacs distributed version of
+  font.el.  Lots of byte-compile warnings squashed when not building with
+  Emacs/W3.
+
+1998-12-31  Jonathan Harris  <address@hidden>
+
+* font.el: Split font-family-mappings into X and mswindows-specific
+  versions.  mswindows-font-create-[object|name]: Treat supplied size as a
+  pointsize. Added underline and strikethru handling.
+
+1998-12-30  William M. Perry  <address@hidden>
+
+* lisp/url.el (url-file-exists): If url-user is nil use anonymous ftp.
+  (url-file-size): Ditto.
+
+* lisp/w3.el (w3-find-this-file): Protect against sticking 'nil@' in the
+  filename spec when we go to retrieve something.
+
+1998-12-30  Milan Zamazal <address@hidden>
+
+* lisp/url-auth.el (url-basic-auth): Make sure to use base64-encode-string 
+  instead of base64-encode to work with new Emacs/XEmacs that have native
+  base64 encoding/decoding primitives.
+
 1998-12-29  William M. Perry  <address@hidden>
 
 * Emacs/W3 4.0pre38 released
diff --git a/Makefile.in b/Makefile.in
index 23cdc90..c24f9e3 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -42,7 +42,7 @@ dotemacs:
                (echo >> $(DOTEMACS)); \
                (echo ";;; Emacs/W3 Configuration" >> $(DOTEMACS)); \
                (echo "(setq load-path (cons \"$(lispdir)\" load-path))" >> 
$(DOTEMACS)); \
-               (echo "(require 'w3-auto \"w3-auto\")" >> $(DOTEMACS)); \
+               (echo "(condition-case () (require 'w3-auto \"w3-auto\") (error 
nil))" >> $(DOTEMACS)); \
                echo "Added Emacs/W3 setup to $(DOTEMACS)"; \
        fi
 
@@ -58,7 +58,7 @@ $(srcdir)/configure: $(srcdir)/configure.in 
$(srcdir)/aclocal.m4
 ###############################################################################
 # Distribution building, the joy of my life
 ###############################################################################
-SUPPORTFILES =  HOWTO TODO README INSTALL README.NT README.VMS
+SUPPORTFILES =  HOWTO TODO README INSTALL README.NT README.VMS BUGS
 DISTFILES    =  configure.in aclocal.m4 Makefile.in install-sh \
                configure descrip.mms ChangeLog build.bat       \
                $(SUPPORTFILES)
diff --git a/aclocal.m4 b/aclocal.m4
index d05b302..837e43f 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -183,24 +183,6 @@ fi
 ])
 
 dnl
-dnl Figure out how we can rebuild the auto-autoloads.el files
-dnl
-AC_DEFUN(AC_CHECK_AUTOLOADS, [
-AC_MSG_CHECKING(how to rebuild autoloads)
-AC_CACHE_VAL(EMACS_cv_REBUILD_AUTOLOADS,[
-AC_EMACS_CHECK_LIB(autoload,batch-update-directory,"noecho")
-EMACS_cv_REBUILD_AUTOLOADS=${HAVE_autoload}
-])
-if test "${EMACS_cv_REBUILD_AUTOLOADS}" != "no"; then
-   REBUILD_AUTOLOADS='$(EMACS) $(BATCHFLAGS) -eval "(setq 
autoload-package-name \"w3\")" -l autoload -f batch-update-directory $(srcdir)'
-else
-   REBUILD_AUTOLOADS='$(EMACS) $(BATCHFLAGS) -l $(srcdir)/docomp.el -f 
emacs-batch-build-autoloads $(srcdir) auto-autoloads.el'
-fi
-AC_MSG_RESULT("${REBUILD_AUTOLOADS}")
-AC_SUBST(REBUILD_AUTOLOADS)
-])
-
-dnl
 dnl Figure out how we can rebuild the custom-load.el files
 dnl
 AC_DEFUN(AC_CHECK_CUSTOMLOADS, [
diff --git a/build.bat b/build.bat
index 24f76c2..37c85dc 100644
--- a/build.bat
+++ b/build.bat
@@ -1,5 +1,11 @@
-set EMACS=emacs
+set EMACSDIR=c:\emacs
+
+set EMACS=%EMACS%\bin\emacs.exe
+set WIDGETDIR=%EMACS%\lisp
+set GNUSDIR=%EMACS%\lisp
 
 cd lisp
 copy w3-cfg.nt w3-cfg.el
+%EMACS% -batch -q -l ./docomp.el -f emacs-batch-build-autoloads . 
auto-autoloads.el
 %EMACS% -batch -q -l ./docomp.el -f compile-it
+cd ..
diff --git a/configure b/configure
index be87df7..4e5b8fd 100755
--- a/configure
+++ b/configure
@@ -1082,72 +1082,21 @@ fi
    echo "$ac_t"""${GNUS}"" 1>&6
 
 
-echo $ac_n "checking how to rebuild autoloads""... $ac_c" 1>&6
-echo "configure:1087: checking how to rebuild autoloads" >&5
-
-
-
-if test -z ""noecho""; then
-       echo $ac_n "checking for batch-update-directory in autoload""... $ac_c" 
1>&6
-echo "configure:1093: checking for batch-update-directory in autoload" >&5
-fi
-library=`echo autoload | tr _ -`
-
-elisp="(progn (fmakunbound 'batch-update-directory) (condition-case nil (progn 
(require '$library) (fboundp 'batch-update-directory)) (error nil)))"
-if test -z ""noecho""; then
-       echo $ac_n "checking for autoload""... $ac_c" 1>&6
-echo "configure:1100: checking for autoload" >&5
-fi
-
-
-       OUTPUT=./conftest-$$
-       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
-       retval=`cat ${OUTPUT}`
-       rm -f ${OUTPUT}
-       EMACS_cv_SYS_autoload=$retval
-
-
-autoload=${EMACS_cv_SYS_autoload}
-if test -z ""noecho""; then
-       echo "$ac_t""$autoload" 1>&6
-fi
-
-if test "${EMACS_cv_SYS_autoload}" = "nil"; then
-       EMACS_cv_SYS_autoload=no
-fi
-HAVE_autoload=${EMACS_cv_SYS_autoload}
-
-if test -z ""noecho""; then
-       echo "$ac_t""$HAVE_autoload" 1>&6
-fi
-
-EMACS_cv_REBUILD_AUTOLOADS=${HAVE_autoload}
-
-
-if test "${EMACS_cv_REBUILD_AUTOLOADS}" != "no"; then
-   REBUILD_AUTOLOADS='$(EMACS) $(BATCHFLAGS) -eval "(setq 
autoload-package-name \"w3\")" -l autoload -f batch-update-directory $(srcdir)'
-else
-   REBUILD_AUTOLOADS='$(EMACS) $(BATCHFLAGS) -l $(srcdir)/docomp.el -f 
emacs-batch-build-autoloads $(srcdir) auto-autoloads.el'
-fi
-echo "$ac_t"""${REBUILD_AUTOLOADS}"" 1>&6
-
-
-
 echo $ac_n "checking how to rebuild custom autoloads""... $ac_c" 1>&6
-echo "configure:1138: checking how to rebuild custom autoloads" >&5
+echo "configure:1087: checking how to rebuild custom autoloads" >&5
 
 
 
 if test -z ""noecho""; then
        echo $ac_n "checking for Custom-make-dependencies in cus_dep""... 
$ac_c" 1>&6
-echo "configure:1144: checking for Custom-make-dependencies in cus_dep" >&5
+echo "configure:1093: checking for Custom-make-dependencies in cus_dep" >&5
 fi
 library=`echo cus_dep | tr _ -`
 
 elisp="(progn (fmakunbound 'Custom-make-dependencies) (condition-case nil 
(progn (require '$library) (fboundp 'Custom-make-dependencies)) (error nil)))"
 if test -z ""noecho""; then
        echo $ac_n "checking for cus_dep""... $ac_c" 1>&6
-echo "configure:1151: checking for cus_dep" >&5
+echo "configure:1100: checking for cus_dep" >&5
 fi
 
 
@@ -1340,8 +1289,6 @@ address@hidden@%$HAVE_wid_edit%g
 address@hidden@%$CUSTOM%g
 address@hidden@%$HAVE_mm_decode%g
 address@hidden@%$GNUS%g
address@hidden@%$HAVE_autoload%g
address@hidden@%$REBUILD_AUTOLOADS%g
 address@hidden@%$HAVE_cus_dep%g
 address@hidden@%$REBUILD_CUSTOMLOADS%g
 address@hidden@%$INSTALL%g
diff --git a/configure.in b/configure.in
index ce13559..f51a05a 100644
--- a/configure.in
+++ b/configure.in
@@ -36,7 +36,6 @@ AC_PATH_LISPDIR
 AC_EMACS_VERSION
 AC_CHECK_CUSTOM
 AC_CHECK_GNUS
-AC_CHECK_AUTOLOADS
 AC_CHECK_CUSTOMLOADS
 
 if test "${MAKEINFO}" = "no"; then
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index 771f5a1..a7fd21b 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -65,11 +65,10 @@ EXTRAS = w3-sysdp.el docomp.el url-cid.el
 all:   $(AUTOSOURCES) w3
 
 w3-auto.el: auto-autoloads.el
-       $(RM) $@
-       cat $(srcdir)/auto-autoloads.el | sed 's/w3-autoloads/w3-auto/g' > $@
+       GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) W3SRCDIR=$(srcdir) $(EMACS) 
$(BATCHFLAGS) -l $(srcdir)/docomp.el -f emacs-batch-build-autoloads $(srcdir) 
auto-autoloads.el
 
 auto-autoloads.el: $(SOURCES) $(URLSOURCES)
-       GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) W3SRCDIR=$(srcdir) 
@REBUILD_AUTOLOADS@
+       GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) W3SRCDIR=$(srcdir) $(EMACS) 
$(BATCHFLAGS) -l $(srcdir)/docomp.el -f emacs-batch-build-autoloads $(srcdir) 
auto-autoloads.el
 
 custom-load.el: $(SOURCES) $(URLSOURCES)
        GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) W3SRCDIR=$(srcdir) 
@REBUILD_CUSTOMLOADS@
diff --git a/lisp/docomp.el b/lisp/docomp.el
index ad781b1..67ff9dd 100644
--- a/lisp/docomp.el
+++ b/lisp/docomp.el
@@ -85,6 +85,8 @@
   (setq filename (byte-compiler-base-file-name filename))
   (setq filename (file-name-sans-versions filename))
   (setq filename (file-name-nondirectory filename))
+  (if (memq system-type '(win32 w32 mswindows windows-nt))
+      (setq filename (downcase filename)))
   (cond ((eq system-type 'vax-vms)
         (concat (substring filename 0 (string-match ";" filename)) "c"))
        ((string-match emacs-lisp-file-regexp filename)
@@ -112,7 +114,7 @@
        form)))
 
 (defun compile-it ()
-  (let ((files (directory-files "." t ".*.el$" nil)))
+  (let ((files (directory-files "." t ".*.[eE][lL]$" nil)))
     (while files
       (if (and (not (file-directory-p (car files)))
               (not (string-match "w3-sysdp.el$" (car files))))
@@ -121,15 +123,35 @@
 
 (defun emacs-build-autoloads (dir autofile)
   (require 'autoload)
-  (let ((files (directory-files dir t ".*.el$" nil)))
-    (save-excursion
-      (find-file autofile)
-      (erase-buffer)
-      (mapcar 'generate-file-autoloads files)
-      (goto-char (point-max))
-      (insert "\n(provide 'w3-autoloads)\n")
-      (save-buffer)
-      (kill-buffer (current-buffer)))))
+
+  ;; First we need to build the autoloads.  This leaves an
+  ;; auto-autoloads.el file that the XEmacs package system expects.
+  (if (and (fboundp 'batch-update-directory)
+          (fboundp 'update-autoloads-from-directory))
+      (let ((autoload-package-name "w3")
+           (generated-autoload-file autofile))
+       (update-autoloads-from-directory dir)
+       (save-some-buffers t))
+    (let ((files (directory-files dir t ".*.[eE][lL]$" nil)))
+      (save-excursion
+       (find-file autofile)
+       (erase-buffer)
+       (mapcar 'generate-file-autoloads files)
+       (goto-char (point-max))
+       (insert "\n(provide 'w3-autoloads)\n")
+       (save-buffer)
+       (kill-buffer (current-buffer)))))
+
+  ;; Now we need to munge that file to deal with
+  (find-file "w3-auto.el")
+  (erase-buffer)
+  (insert-file-contents autofile)
+  (goto-char (point-min))
+  (while (re-search-forward "w3-autoloads" nil t)
+      (replace-match "w3-auto"))
+  (save-buffer)
+  (kill-buffer (current-buffer))
+  (kill-emacs))
 
 (defun emacs-batch-build-autoloads ()
   (emacs-build-autoloads (nth 0 command-line-args-left)
diff --git a/lisp/url-ldap.el b/lisp/url-ldap.el
index 544c9ea..a27538a 100644
--- a/lisp/url-ldap.el
+++ b/lisp/url-ldap.el
@@ -1,7 +1,7 @@
 ;;; url-ldap.el --- LDAP Uniform Resource Locator retrieval code
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/26 14:50:05 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1999/01/05 12:41:57 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -138,7 +138,7 @@
     ;; Now, let's actually do something with it.
     (setq connection (ldap-open host (if binddn (list 'binddn binddn)))
          results (ldap-search-internal connection filter base-object scope 
attributes nil))
-
+    (ldap-close connection)
     (set-buffer (get-buffer-create url-working-buffer))
     (erase-buffer)
     (setq url-current-mime-type "text/html"
diff --git a/lisp/w3-forms.el b/lisp/w3-forms.el
index 0d0194f..acb90ef 100644
--- a/lisp/w3-forms.el
+++ b/lisp/w3-forms.el
@@ -1,12 +1,12 @@
 ;;; w3-forms.el --- Emacs-w3 forms parsing code for new display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:12 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1999/01/05 12:41:59 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: faces, help, comm, data, languages
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -809,7 +809,10 @@ This can be used as the :help-echo property of all w3 form 
entry widgets."
                                  (insert-file-contents-literally fname)
                                (error (concat "Error accessing " fname))))
                        (cons (w3-form-element-name formobj)
-                             (buffer-string)))))
+                             (cons (list (cons
+                                          "filename"
+                                          (file-name-nondirectory fname)))
+                                   (buffer-string))))))
                   (option
                    (cons (w3-form-element-name formobj)
                          (cdr-safe
@@ -836,23 +839,32 @@ This can be used as the :help-echo property of all w3 
form entry widgets."
     result))
 
 (defun w3-form-encode-make-mime-part (id data separator)
-  (concat separator "\nContent-id: " id
-         "\nContent-length: " (length data)
-         "\n\n" data))
+  (let (addons)
+    (if (listp data)
+       (progn
+         (setq addons (mapconcat (lambda (x)
+                                   (format "; %s=\"%s\"" (car x) (cdr x)))
+                                 (car data) " "))
+         (setq data (cdr data)))
+      (setq addons ""))
+    (format "%s\r\nContent-Disposition: form-data; name=\"%s\"%s\r\n\r\n%s"
+           separator id addons data)))
 
 (defun w3-form-encode-multipart/x-www-form-data (formobjs)
   ;; Create a multipart form submission.
   ;; Returns a cons of two strings.  Car is the separator used.
   ;; cdr is the body of the MIME message."
-  (let ((separator "---some-separator-for-www-form-data"))
+  (let ((separator (format-time-string 
"---separator-%Y%j%H%M%S-for-www-form-data")))
     (cons separator
-         (mapconcat
-          (function
-           (lambda (formobj)
-             (w3-form-encode-make-mime-part (car formobj) (cdr formobj)
-                                            separator)))
-          (w3-form-encode-helper formobjs)
-          "\n"))))
+         (concat
+          (mapconcat
+           (function
+            (lambda (formobj)
+              (w3-form-encode-make-mime-part (car formobj) (cdr formobj)
+                                             separator)))
+           (w3-form-encode-helper formobjs)
+           "\r\n")
+          "\r\n" separator "--\r\n"))))
 
 (fset 'w3-form-encode-multipart/form-data
       'w3-form-encode-multipart/x-www-form-data)
@@ -891,6 +903,11 @@ This can be used as the :help-echo property of all w3 form 
entry widgets."
   "Escape characters in a string for application/x-www-form-urlencoded.
 Blasphemous crap because someone didn't think %20 was good enough for encoding
 spaces.  Die Die Die."
+  ;; This will get rid of the 'attributes' specified by the file type,
+  ;; which are useless for an application/x-www-form-urlencoded form.
+  (if (consp chunk)
+      (setq chunk (cdr chunk)))
+
   (mapconcat
    (function
     (lambda (char)
@@ -943,9 +960,9 @@ spaces.  Die Die Die."
      ((or (string= "POST" themeth)
          (string= "PUT" themeth))
       (if (consp query)
-         (setq enctype (concat enctype "; separator=\""
-                               (substring (car query) 3 nil)
-                               "\"")
+         (setq enctype (concat enctype "; boundary="
+                               (substring (car query) 2 nil)
+                               "")
                query (cdr query)))
       (let ((url-request-method themeth)
            (url-request-data query)
diff --git a/lisp/w3-hotindex.el b/lisp/w3-hotindex.el
index 87dd992..2ae4e98 100644
--- a/lisp/w3-hotindex.el
+++ b/lisp/w3-hotindex.el
@@ -62,6 +62,7 @@ Returns a list of the keys appearing in HOTINDEX."
       (setq hotindex (cdr hotindex)))
     key-list))
 
+;;;###autoload
 (defun w3-hotindex-add-key (name keyword)
   "*Add a keyword to an item in w3-hotindex. Completion is done
 on the list of all keywords."
@@ -92,6 +93,7 @@ on the list of all keywords."
   ;; It would better to do this incrementally
   (setq w3-hotindex-key-list (w3-hotindex-build-key-list w3-hotindex)))
 
+;;;###autoload
 (defun w3-hotindex-rm-key (entry keyword)
   "*Remove a keyword from an item of w3-hotindex."
   (interactive (let ((entry nil)
@@ -113,6 +115,7 @@ on the list of all keywords."
   (setq w3-hotindex-key-list (w3-hotindex-build-key-list w3-hotindex))
   )
 
+;;;###autoload
 (defun w3-hotindex-rename-entry (old new)
   "Renames an entry in the HotIndex. Intended to be called from 
 w3-hotlist-rename-entry. OLD should equal the entry to be renamed.
@@ -122,6 +125,7 @@ Case is therefore important."
        (progn (setcar entry new)
               (w3-hotindex-save nil)))))
 
+;;;###autoload
 (defun w3-hotindex-delete-entry (title)
   "Deletes an entry in the HotIndex. Intended to be called from 
 w3-hotlist-delete. OLD should equal the entry to be deleted.
@@ -133,6 +137,7 @@ Case is therefore important."
                                           w3-hotindex-key-list))
               (w3-hotindex-save nil)))))
 
+;;;###autoload
 (defun w3-hotindex-query (key)
   "Query the HotIndex for KEY."
   (interactive (list (let ((completion-ignore-case t))
@@ -196,7 +201,7 @@ Raises an error if some entries are unresolved."
 (defun w3-hotindex-load ()
   "Load the file containing the hotindex, and updates w3-hotindex-key-list."
   (interactive)
-  (load-file (concat w3-hotindex-file))
+  (load w3-hotindex-file t)
   (w3-hotindex-check)
   (setq w3-hotindex-key-list (w3-hotindex-build-key-list w3-hotindex))
   )
diff --git a/lisp/w3-speak-table.el b/lisp/w3-speak-table.el
index cd25413..99e1041 100644
--- a/lisp/w3-speak-table.el
+++ b/lisp/w3-speak-table.el
@@ -1,4 +1,4 @@
-;;;$Id: w3-speak-table.el,v 1.1 1998/12/01 22:12:11 wmperry Exp $
+;;;$Id: w3-speak-table.el,v 1.2 1999/01/05 12:42:03 wmperry Exp $
 ;;;Authors: Thierry Emery <address@hidden>, T.V. Raman <address@hidden>
 ;;;Description: Speak W3 tables
 
@@ -370,7 +370,7 @@ Prefix arg can be used to specify the desired table 
nesting."
        (mapconcat 'identity
                   (extract-rectangle (w3-cell-info-start cell-info)
                                      (w3-cell-info-end cell-info))
-                  " ")))))
+                  "\n")))))
 
 (defun w3-table-speak-this-cell-info (&optional at-depth)
   "Speak coordinates of current table cell.
@@ -388,11 +388,32 @@ Prefix arg can be used to specify the desired table 
nesting."
                  (format " at nesting level %s" at-depth)
                ""))))
 
+(defun w3-table-focus-on-this-cell (&optional at-depth)
+  "Focus on current cell --optional argument at-depth
+specifies nesting level. Focusing on a cell results in its
+contents being displayed in a separate buffer in W3 mode.
+This is useful to navigate pages that use a single table
+cell for a newspaper style column"
+  (interactive "p")
+  (let ((contents (w3-table-this-cell-contents at-depth))
+        (buffer (get-buffer-create
+                 (format "Cell-%s" (buffer-name))))
+        (inhibit-read-only t))
+    (save-excursion
+      (set-buffer buffer)
+      (erase-buffer)
+      (w3-mode)
+      (insert contents)
+      (goto-char (point-min)))
+    (switch-to-buffer buffer)))
+
+
 (defun w3-table-speak-this-cell (&optional at-depth)
   "Speak contents of current table cell.
 Prefix arg can be used to specify the desired table nesting."
   (interactive "p")
-  (dtk-speak (w3-table-this-cell-contents at-depth)))
+  (let ((contents (w3-table-this-cell-contents at-depth)))
+  (dtk-speak contents)))
 
 ;;}}}
 ;;{{{  Table navigation

commit d504ffe86001eaec6111f51a404f4efd14ca1f7d
Author: William M. Perry <address@hidden>
Date:   Thu Dec 31 10:04:21 1998 +0000

    1998-12-31  William M. Perry  <address@hidden>
    
    * lisp/font.el: Various mergings with the XEmacs distributed version of
      font.el.  Lots of byte-compile warnings squashed when not building with
      Emacs/W3.
    
    1998-12-31  Jonathan Harris  <address@hidden>
    
    * font.el: Split font-family-mappings into X and mswindows-specific
      versions.  mswindows-font-create-[object|name]: Treat supplied size as a
      pointsize. Added underline and strikethru handling.

diff --git a/lisp/font.el b/lisp/font.el
index 04bdb7a..6d82ec7 100644
--- a/lisp/font.el
+++ b/lisp/font.el
@@ -1,12 +1,12 @@
 ;;; font.el --- New font model
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:07 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1998/12/31 10:04:21 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: faces
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1995, 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -51,12 +51,13 @@
     (defun try-font-name (fontname &rest args)
       (case window-system
        ((x win32 w32 pm) (car-safe (x-list-fonts fontname)))
-       (ns (car-safe (ns-list-fonts fontname)))
+       (mswindows (car-safe (mswindows-list-fonts fontname)))
        (otherwise nil))))
 
 (if (not (fboundp 'facep))
     (defun facep (face)
       "Return t if X is a face name or an internal face vector."
+      (declare (special global-face-data))
       (if (not window-system)
          nil                           ; FIXME if FSF ever does TTY faces
        (and (or (internal-facep face)
@@ -91,6 +92,10 @@
 (defconst font-running-xemacs (string-match "XEmacs" (emacs-version))
   "Whether we are running in XEmacs or not.")
 
+(defconst font-running-emacs-new-redisplay (and (fboundp 'set-face-attribute)
+                                               (fboundp 
'set-face-background-pixmap))
+  "Whether we are running in Emacs with the new redisplay engine.")
+
 (defmacro define-font-keywords (&rest keys)
   (`
    (eval-and-compile
@@ -102,7 +107,6 @@
 
 (defconst font-window-system-mappings
   '((x        . (x-font-create-name x-font-create-object))
-    (ns       . (ns-font-create-name ns-font-create-object))
     (mswindows . (mswindows-font-create-name mswindows-font-create-object))
     (win32    . (x-font-create-name x-font-create-object))
     (w32      . (x-font-create-name x-font-create-object))
@@ -137,7 +141,19 @@ information to use")
   "An assoc list mapping keywords to actual Xwindow specific strings
 for use in the 'weight' field of an X font string.")
 
-
+(defconst font-new-redisplay-weight-mappings
+  '((:extra-light . extra-light)
+    (:light       . light)
+    (:demi-light  . semi-light)
+    (:demi        . semi-light)
+    (:book        . normal)
+    (:medium      . normal)
+    (:normal      . normal)
+    (:demi-bold   . semi-bold)
+    (:bold        . bold)
+    (:extra-bold  . extra-bold))
+  "An assoc list mapping font weights to the actual symbols used by
+the new redisplay engine.")
 
 (defconst font-possible-weights
   (mapcar 'car x-font-weight-mappings))
@@ -148,40 +164,6 @@ for use in the 'weight' field of an X font string.")
 (defvar font-maximum-slippage "1pt"
   "How much a font is allowed to vary from the desired size.")
 
-(defvar font-family-mappings
-  '(
-    ("serif"        . ("new century schoolbook"
-                      "utopia"
-                      "charter"
-                      "times"
-                      "lucidabright"
-                      "garamond"
-                      "palatino"
-                      "times new roman"
-                      "baskerville"
-                      "bookman"
-                      "bodoni"
-                      "computer modern"
-                      "rockwell"
-                      ))
-    ("sans-serif"   . ("lucida"
-                      "helvetica"
-                      "gills-sans"
-                      "avant-garde"
-                      "univers"
-                      "optima"))
-    ("elfin"        . ("tymes"))
-    ("monospace"    . ("courier"
-                      "courier new"
-                      "fixed"
-                      "lucidatypewriter"
-                      "clean"
-                      "terminal"))
-    ("cursive"      . ("sirene"
-                      "zapf chancery"))
-    )
-  "A list of font family mappings.")
-
 (define-font-keywords :family :style :size :registry :encoding)
 
 (define-font-keywords
@@ -308,8 +290,7 @@ for use in the 'weight' field of an X font string.")
     (and (fboundp font-func) (funcall font-func fontobj t))))
 
 (defsubst font-properties-from-style (fontobj)
-  (let ((style (font-style fontobj))
-       (todo font-style-keywords)
+  (let ((todo font-style-keywords)
        type func retval)
     (while todo
       (setq func (cdr (cdr (car todo)))
@@ -470,147 +451,20 @@ for use in the 'weight' field of an X font string.")
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; The window-system dependent code (mswindows-style)
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;; mswindows fonts look like:
-;;;    fontname[:[weight][ style][:pointsize[:effects[:charset]]]]
-;;; A minimal mswindows font spec looks like:
-;;;    Courier New
-;;; A maximal mswindows font spec looks like:
-;;;    Courier New:Bold Italic:10:underline strikeout:ansi
-;;; Missing parts of the font spec should be filled in with these values:
-;;;    Courier New:Normal:10::ansi
-;;  "^[a-zA-Z ]+:[a-zA-Z ]*:[0-9]+:[a-zA-Z ]*:[a-zA-Z 0-9]*$"
-(defvar font-mswindows-font-regexp
-  (eval-when-compile
-    (let ((-           ":")
-         (fontname     "\\([a-zA-Z ]+\\)")
-         (weight       "\\([a-zA-Z]*\\)")
-         (style        "\\( [a-zA-Z]*\\)?")
-         (pointsize    "\\([0-9]+\\)")
-         (effects      "\\([a-zA-Z ]*\\)")q
-         (charset      "\\([a-zA-Z 0-9]*\\)"))
-      (concat "^"
-             fontname - weight style - pointsize - effects - charset "$"))))
-
-(defconst mswindows-font-weight-mappings
-  '((:extra-light . "Extralight")
-    (:light       . "Light")
-    (:demi-light  . "Demilight")
-    (:demi        . "Demi")
-    (:book        . "Book")
-    (:medium      . "Medium")
-    (:normal      . "Normal")
-    (:demi-bold   . "Demibold")
-    (:bold        . "Bold")
-    (:regular    . "Regular")
-    (:extra-bold  . "Extrabold"))
-  "An assoc list mapping keywords to actual mswindows specific strings
-for use in the 'weight' field of an mswindows font string.")
-
-(defun mswindows-font-create-object (fontname &optional device)
-  (let ((case-fold-search t)
-       (font (mswindows-font-canicolize-name fontname)))
-    (if (or (not (stringp font))
-           (not (string-match font-mswindows-font-regexp font)))
-       (make-font)
-      (let ((family    (match-string 1 font))
-           (weight     (match-string 2 font))
-           (style      (match-string 3 font))
-           (pointsize  (match-string 4 font))
-           (effects    (match-string 5 font))
-           (charset    (match-string 6 font))
-           (retval nil)
-           (size nil)
-           (case-fold-search t)
-           )
-       (if pointsize (setq size (concat pointsize "pt")))
-       (if weight (setq weight (intern-soft (concat ":" (downcase weight)))))
-       (setq retval (make-font :family family
-                               :weight weight
-                               :size size
-                               :encoding charset))
-       (set-font-bold-p retval (eq :bold weight))
-       (cond
-        ((null style) nil)
-        ((string-match "^ *[iI]talic" style)
-         (set-font-italic-p retval t)))
-       retval))))
-
-(defun mswindows-font-create-name (fontobj &optional device)
-  (if (and (not (or (font-family fontobj)
-                   (font-weight fontobj)
-                   (font-size fontobj)
-                   (font-registry fontobj)
-                   (font-encoding fontobj)))
-          (= (font-style fontobj) 0))
-      (face-font 'default)
-    (or device (setq device (selected-device)))
-    (let* ((default (font-default-object-for-device device))
-          (family (or (font-family fontobj)
-                      (font-family default)))
-          (weight (or (font-weight fontobj) :regular))
-          (style (font-style fontobj))
-          (size (or (if font-running-xemacs
-                        (font-size fontobj))
-                    (font-size default)))
-          (registry (or (font-registry fontobj)
-                        (font-registry default)))
-          (encoding (or (font-encoding fontobj)
-                        (font-encoding default))))
-      (if (stringp family)
-         (setq family (list family)))
-      (setq weight (font-higher-weight weight
-                                      (and (font-bold-p fontobj) :bold)))
-      (if (stringp size)
-         (setq size (truncate (font-spatial-to-canonical size device))))
-      (setq weight (or (cdr-safe 
-                       (assq weight mswindows-font-weight-mappings)) ""))
-      (let ((done nil)                 ; Did we find a good font yet?
-           (font-name nil)             ; font name we are currently checking
-           (cur-family nil))           ; current family we are checking
-       (while (and family (not done))
-         (setq cur-family (car family)
-               family (cdr family))
-         (if (assoc cur-family font-family-mappings)
-             ;; If the family name is an alias as defined by
-             ;; font-family-mappings, then append those families
-             ;; to the front of 'family' and continue in the loop.
-             (setq family (append
-                           (cdr-safe (assoc cur-family
-                                            font-family-mappings))
-                           family))
-           ;; We treat oblique and italic as equivalent.  Don't ask.
-           ;; Courier New:Bold Italic:10:underline strikeout:ansi
-           (setq font-name (format "%s:%s%s:%s:%s:%s"
-                                   cur-family weight
-                                   (if (font-italic-p fontobj)
-                                       " Italic" "")
-                                   (if size
-                                       (int-to-string size) "10")
-                                   ""
-                                   encoding)
-                 done (try-font-name font-name device))))
-       (if done font-name)))))
-
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; The window-system dependent code (TTY-style)
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (defun tty-font-create-object (fontname &optional device)
   (make-font :size "12pt"))
 
 (defun tty-font-create-plist (fontobj &optional device)
-  (let ((styles (font-style fontobj))
-       (weight (font-weight fontobj)))
-    (list
-     (cons 'underline (font-underline-p fontobj))
-     (cons 'highlight (if (or (font-bold-p fontobj)
-                             (memq weight '(:bold :demi-bold))) t))
-     (cons 'dim       (font-dim-p fontobj))
-     (cons 'blinking  (font-blink-p fontobj))
-     (cons 'reverse   (font-reverse-p fontobj)))))
+  (list
+   (cons 'underline (font-underline-p fontobj))
+   (cons 'highlight (if (or (font-bold-p fontobj)
+                           (memq (font-weight fontobj) '(:bold :demi-bold)))
+                       t))
+   (cons 'dim       (font-dim-p fontobj))
+   (cons 'blinking  (font-blink-p fontobj))
+   (cons 'reverse   (font-reverse-p fontobj))))
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -623,9 +477,9 @@ for use in the 'weight' field of an mswindows font string.")
      ((-               "[-?]")
       (foundry         "[^-]*")
       (family          "[^-]*")
-      (weight          "\\(bold\\|demibold\\|medium\\|black\\)")
+      ;(weight         "\\(bold\\|demibold\\|medium\\|black\\)")
       (weight\?                "\\([^-]*\\)")
-      (slant           "\\([ior]\\)")
+      ;(slant          "\\([ior]\\)")
       (slant\?         "\\([^-]?\\)")
       (swidth          "\\([^-]*\\)")
       (adstyle         "\\([^-]*\\)")
@@ -641,7 +495,7 @@ for use in the 'weight' field of an mswindows font string.")
    (concat "\\`\\*?[-?*]"
           foundry - family - weight\? - slant\? - swidth - adstyle -
           pixelsize - pointsize - resx - resy - spacing - avgwidth -
-          registry - encoding "\\'"
+          registry - encoding - "*" "\\'"
           ))))
 
 (defvar font-x-registry-and-encoding-regexp
@@ -653,13 +507,45 @@ for use in the 'weight' field of an mswindows font 
string.")
            (encoding "[^-]+"))
        (concat - "\\(" registry "\\)" - "\\(" encoding "\\)\\'"))))
 
+(defvar font-x-family-mappings
+  '(
+    ("serif"        . ("new century schoolbook"
+                      "utopia"
+                      "charter"
+                      "times"
+                      "lucidabright"
+                      "garamond"
+                      "palatino"
+                      "times new roman"
+                      "baskerville"
+                      "bookman"
+                      "bodoni"
+                      "computer modern"
+                      "rockwell"
+                      ))
+    ("sans-serif"   . ("lucida"
+                      "helvetica"
+                      "gills-sans"
+                      "avant-garde"
+                      "univers"
+                      "optima"))
+    ("elfin"        . ("tymes"))
+    ("monospace"    . ("courier"
+                      "fixed"
+                      "lucidatypewriter"
+                      "clean"
+                      "terminal"))
+    ("cursive"      . ("sirene"
+                      "zapf chancery"))
+    )
+  "A list of font family mappings on X devices.")
+ 
 (defun x-font-create-object (fontname &optional device)
   (let ((case-fold-search t))
     (if (or (not (stringp fontname))
            (not (string-match font-x-font-regexp fontname)))
        (make-font)
       (let ((family nil)
-           (style nil)
            (size nil)
            (weight  (match-string 1 fontname))
            (slant   (match-string 2 fontname))
@@ -694,29 +580,28 @@ for use in the 'weight' field of an mswindows font 
string.")
          (set-font-italic-p retval t))
         ((member slant '("o" "O"))
          (set-font-oblique-p retval t)))
-       (if (string-match font-x-registry-and-encoding-regexp fontname)
-           (progn
-             (set-font-registry retval (match-string 1 fontname))
-             (set-font-encoding retval (match-string 2 fontname))))
+       (when (string-match font-x-registry-and-encoding-regexp fontname)
+         (set-font-registry retval (match-string 1 fontname))
+         (set-font-encoding retval (match-string 2 fontname)))
        retval))))
 
 (defun x-font-families-for-device (&optional device no-resetp)
-  (condition-case ()
-      (require 'x-font-menu)
-    (error nil))
+  (ignore-errors (require 'x-font-menu))
   (or device (setq device (selected-device)))
   (if (boundp 'device-fonts-cache)
-      (let ((menu (or (cdr-safe (assq device device-fonts-cache)))))
+      (let ((menu nil))
+       (declare (special device-fonts-cache))
+       (setq menu (cdr-safe (assq device device-fonts-cache)))
        (if (and (not menu) (not no-resetp))
            (progn
              (reset-device-font-menus device)
              (x-font-families-for-device device t))
-         (let ((scaled (mapcar (function (lambda (x) (if x (aref x 0))))
+         (let ((scaled (mapcar (lambda (x) (if x (aref x 0)))
                                (aref menu 0)))
-               (normal (mapcar (function (lambda (x) (if x (aref x 0))))
+               (normal (mapcar (lambda (x) (if x (aref x 0)))
                                (aref menu 1))))
            (sort (font-unique (nconc scaled normal)) 'string-lessp))))
-    (cons "monospace" (mapcar 'car font-family-mappings))))
+    (cons "monospace" (mapcar 'car font-x-family-mappings))))
 
 (defvar font-default-cache nil)
 
@@ -735,32 +620,25 @@ for use in the 'weight' field of an mswindows font 
string.")
 ;;;###autoload
 (defun font-default-object-for-device (&optional device)
   (let ((font (font-default-font-for-device device)))
-    (or (cdr-safe 
-        (assoc font font-default-cache))
-       (progn
-         (setq font-default-cache (cons (cons font
-                                              (font-create-object font))
-                                        font-default-cache))
-         (cdr-safe (assoc font font-default-cache))))))
+    (or (cdr-safe (assoc font font-default-cache))
+       (let ((object (font-create-object font)))
+         (push (cons font object) font-default-cache)
+         object))))
 
 ;;;###autoload
 (defun font-default-family-for-device (&optional device)
-  (or device (setq device (selected-device)))
   (font-family (font-default-object-for-device device)))
 
 ;;;###autoload
 (defun font-default-registry-for-device (&optional device)
-  (or device (setq device (selected-device)))
   (font-registry (font-default-object-for-device device)))
 
 ;;;###autoload
 (defun font-default-encoding-for-device (&optional device)
-  (or device (setq device (selected-device)))
   (font-encoding (font-default-object-for-device device)))
 
 ;;;###autoload
 (defun font-default-size-for-device (&optional device)
-  (or device (setq device (selected-device)))
   ;; face-height isn't the right thing (always 1 pixel too high?)
   ;; (if font-running-xemacs
   ;;    (format "%dpx" (face-height 'default device))
@@ -780,7 +658,6 @@ for use in the 'weight' field of an mswindows font string.")
                       (font-family default)
                       (x-font-families-for-device device)))
           (weight (or (font-weight fontobj) :medium))
-          (style (font-style fontobj))
           (size (or (if font-running-xemacs
                         (font-size fontobj))
                     (font-size default)))
@@ -804,13 +681,13 @@ for use in the 'weight' field of an mswindows font 
string.")
        (while (and family (not done))
          (setq cur-family (car family)
                family (cdr family))
-         (if (assoc cur-family font-family-mappings)
+         (if (assoc cur-family font-x-family-mappings)
              ;; If the family name is an alias as defined by
-             ;; font-family-mappings, then append those families
+             ;; font-x-family-mappings, then append those families
              ;; to the front of 'family' and continue in the loop.
              (setq family (append
                            (cdr-safe (assoc cur-family
-                                            font-family-mappings))
+                                            font-x-family-mappings))
                            family))
            ;; Not an alias for a list of fonts, so we just check it.
            ;; First, convert all '-' to spaces so that we don't screw up
@@ -840,68 +717,168 @@ for use in the 'weight' field of an mswindows font 
string.")
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; The window-system dependent code (NS-style)
+;;; The window-system dependent code (mswindows-style)
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defun ns-font-families-for-device (&optional device no-resetp)
-  ;; For right now, assume we are going to have the same storage for
-  ;; device fonts for NS as we do for X.  Is this a valid assumption?
-  (or device (setq device (selected-device)))
-  (if (boundp 'device-fonts-cache)
-      (let ((menu (or (cdr-safe (assq device device-fonts-cache)))))
-       (if (and (not menu) (not no-resetp))
-           (progn
-             (reset-device-font-menus device)
-             (ns-font-families-for-device device t))
-         (let ((scaled (mapcar (function (lambda (x) (if x (aref x 0))))
-                               (aref menu 0)))
-               (normal (mapcar (function (lambda (x) (if x (aref x 0))))
-                               (aref menu 1))))
-           (sort (font-unique (nconc scaled normal)) 'string-lessp))))))
-
-(defun ns-font-create-name (fontobj &optional device)
-  (let ((family (or (font-family fontobj)
-                   (ns-font-families-for-device device)))
-       (weight (or (font-weight fontobj) :medium))
-       (style (or (font-style fontobj) (list :normal)))
-       (size (font-size fontobj))
-       (registry (or (font-registry fontobj) "*"))
-       (encoding (or (font-encoding fontobj) "*")))
-    ;; Create a font, wow!
-    (if (stringp family)
-       (setq family (list family)))
-    (if (or (symbolp style) (numberp style))
-       (setq style (list style)))
-    (setq weight (font-higher-weight weight (car-safe (memq :bold style))))
-    (if (stringp size)
-       (setq size (font-spatial-to-canonical size device)))
-    (setq weight (or (cdr-safe (assq weight ns-font-weight-mappings))
-                    "medium"))
-    (let ((done nil)                   ; Did we find a good font yet?
-         (font-name nil)               ; font name we are currently checking
-         (cur-family nil)              ; current family we are checking
-         )
-      (while (and family (not done))
-       (setq cur-family (car family)
-             family (cdr family))
-       (if (assoc cur-family font-family-mappings)
-           ;; If the family name is an alias as defined by
-           ;; font-family-mappings, then append those families
-           ;; to the front of 'family' and continue in the loop.
-           (setq family (append
-                         (cdr-safe (assoc cur-family
-                                          font-family-mappings))
-                         family))
-         ;; CARL: Need help here - I am not familiar with the NS font
-         ;; model
-         (setq font-name "UNKNOWN FORMULA GOES HERE"
-               done (try-font-name font-name device))))
-      (if done font-name))))
+
+;;; mswindows fonts look like:
+;;;    fontname[:[weight][ style][:pointsize[:effects]]][:charset]
+;;; A minimal mswindows font spec looks like:
+;;;    Courier New
+;;; A maximal mswindows font spec looks like:
+;;;    Courier New:Bold Italic:10:underline strikeout:western
+;;; Missing parts of the font spec should be filled in with these values:
+;;;    Courier New:Regular:10::western
+;;  "^[a-zA-Z ]+:[a-zA-Z ]*:[0-9]+:[a-zA-Z ]*:[a-zA-Z 0-9]*$"
+(defvar font-mswindows-font-regexp
+  (let
+      ((-              ":")
+       (fontname       "\\([a-zA-Z ]+\\)")
+       (weight         "\\([a-zA-Z]*\\)")
+       (style          "\\( [a-zA-Z]*\\)?")
+       (pointsize      "\\([0-9]+\\)")
+       (effects                "\\([a-zA-Z ]*\\)")
+       (charset                "\\([a-zA-Z 0-9]*\\)")
+       )
+    (concat "^"
+           fontname - weight style - pointsize - effects - charset "$")))
+
+(defconst mswindows-font-weight-mappings
+  '((:extra-light . "Extralight")
+    (:light       . "Light")
+    (:demi-light  . "Demilight")
+    (:demi        . "Demi")
+    (:book        . "Book")
+    (:medium      . "Medium")
+    (:normal      . "Normal")
+    (:demi-bold   . "Demibold")
+    (:bold        . "Bold")
+    (:regular    . "Regular")
+    (:extra-bold  . "Extrabold"))
+  "An assoc list mapping keywords to actual mswindows specific strings
+for use in the 'weight' field of an mswindows font string.")
+
+(defvar font-mswindows-family-mappings
+  '(
+    ("serif"        . ("times new roman"
+                      "century schoolbook"
+                      "book antiqua"
+                      "bookman old style"))
+    ("sans-serif"   . ("arial"
+                      "verdana"
+                      "lucida sans unicode"))
+    ("monospace"    . ("courier new"
+                      "lucida console"
+                      "courier"
+                      "terminal"))
+    ("cursive"      . ("roman"
+                      "script"))
+    )
+  "A list of font family mappings on mswindows devices.")
+
+(defun mswindows-font-create-object (fontname &optional device)
+  (let ((case-fold-search t)
+       (font (mswindows-font-canonicalize-name fontname)))
+    (if (or (not (stringp font))
+           (not (string-match font-mswindows-font-regexp font)))
+       (make-font)
+      (let ((family    (match-string 1 font))
+           (weight     (match-string 2 font))
+           (style      (match-string 3 font))
+           (pointsize  (match-string 4 font))
+           (effects    (match-string 5 font))
+           (charset    (match-string 6 font))
+           (retval nil)
+           (size nil)
+           (case-fold-search t)
+           )
+       (if pointsize (setq size (concat pointsize "pt")))
+       (if weight (setq weight (intern-soft (concat ":" (downcase weight)))))
+       (setq retval (make-font :family family
+                               :weight weight
+                               :size size
+                               :encoding charset))
+       (set-font-bold-p retval (eq :bold weight))
+       (cond
+        ((null style) nil)
+        ((string-match "^ *[iI]talic" style)
+         (set-font-italic-p retval t)))
+       (cond
+        ((null effects) nil)
+        ((string-match "^[uU]nderline [sS]trikeout" effects)
+         (set-font-underline-p retval t)
+         (set-font-strikethru-p retval t))
+        ((string-match "[uU]nderline" effects)
+         (set-font-underline-p retval t))
+        ((string-match "[sS]trikeout" effects)
+         (set-font-strikethru-p retval t)))
+       retval))))
+
+(defun mswindows-font-create-name (fontobj &optional device)
+  (if (and (not (or (font-family fontobj)
+                   (font-weight fontobj)
+                   (font-size fontobj)
+                   (font-registry fontobj)
+                   (font-encoding fontobj)))
+          (= (font-style fontobj) 0))
+      (face-font 'default)
+    (or device (setq device (selected-device)))
+    (let* ((default (font-default-object-for-device device))
+          (family (or (font-family fontobj)
+                      (font-family default)))
+          (weight (or (font-weight fontobj) :regular))
+          (size (or (if font-running-xemacs
+                        (font-size fontobj))
+                    (font-size default)))
+          (underline-p (font-underline-p fontobj))
+          (strikeout-p (font-strikethru-p fontobj))
+          (encoding (or (font-encoding fontobj)
+                        (font-encoding default))))
+      (if (stringp family)
+         (setq family (list family)))
+      (setq weight (font-higher-weight weight
+                                      (and (font-bold-p fontobj) :bold)))
+      (if (stringp size)
+         (setq size (truncate (font-spatial-to-canonical size device))))
+      (setq weight (or (cdr-safe
+                       (assq weight mswindows-font-weight-mappings)) ""))
+      (let ((done nil)                 ; Did we find a good font yet?
+           (font-name nil)             ; font name we are currently checking
+           (cur-family nil)            ; current family we are checking
+           )
+       (while (and family (not done))
+         (setq cur-family (car family)
+               family (cdr family))
+         (if (assoc cur-family font-mswindows-family-mappings)
+             ;; If the family name is an alias as defined by
+             ;; font-mswindows-family-mappings, then append those families
+             ;; to the front of 'family' and continue in the loop.
+             (setq family (append
+                           (cdr-safe (assoc cur-family
+                                            font-mswindows-family-mappings))
+                           family))
+           ;; We treat oblique and italic as equivalent.  Don't ask.
+            ;; Courier New:Bold Italic:10:underline strikeout:western
+           (setq font-name (format "%s:%s%s:%s:%s:%s"
+                                   cur-family weight
+                                   (if (font-italic-p fontobj)
+                                       " Italic" "")
+                                   (if size
+                                       (int-to-string size) "10")
+                                   (if underline-p
+                                       (if strikeout-p
+                                           "underline strikeout"
+                                         "underline")
+                                     (if strikeout-p "strikeout" ""))
+                                   (if encoding
+                                       encoding ""))
+                 done (try-font-name font-name device))))
+       (if done font-name)))))
 
 
 ;;; Cache building code
 ;;;###autoload
 (defun x-font-build-cache (&optional device)
-  (let ((hashtable (make-hash-table :test 'equal :size 15))
+  (let ((hash-table (make-hash-table :test 'equal :size 15))
        (fonts (mapcar 'x-font-create-object
                       (list-fonts "-*-*-*-*-*-*-*-*-*-*-*-*-*-*")))
        (plist nil)
@@ -909,7 +886,7 @@ for use in the 'weight' field of an mswindows font string.")
     (while fonts
       (setq cur (car fonts)
            fonts (cdr fonts)
-           plist (cl-gethash (car (font-family cur)) hashtable))
+           plist (cl-gethash (car (font-family cur)) hash-table))
       (if (not (memq (font-weight cur) (plist-get plist 'weights)))
          (setq plist (plist-put plist 'weights (cons (font-weight cur)
                                                      (plist-get plist 
'weights)))))
@@ -922,8 +899,8 @@ for use in the 'weight' field of an mswindows font string.")
       (if (and (font-italic-p cur)
               (not (memq 'italic (plist-get plist 'styles))))
          (setq plist (plist-put plist 'styles (cons 'italic (plist-get plist 
'styles)))))
-      (cl-puthash (car (font-family cur)) plist hashtable))
-    hashtable))
+      (cl-puthash (car (font-family cur)) plist hash-table))
+    hash-table))
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -971,6 +948,54 @@ for use in the 'weight' field of an mswindows font 
string.")
     (set-face-property face 'font-specification nil)
     (apply 'set-face-font face font args))))
 
+(defun font-find-available-family (fontobj &optional device)
+  (let* ((default (font-default-object-for-device device))
+        (family (or (font-family fontobj)
+                    (font-family default)
+                    (x-font-families-for-device device)))
+        (cur-family nil)
+        (done nil))
+    (if (stringp family)
+       (setq family (list family)))
+    (while (and family (not done))
+      (setq cur-family (pop family))
+      (if (assoc cur-family font-x-family-mappings)
+         ;; If the family name is an alias as defined by
+         ;; font-x-family-mappings, then append those families to the
+         ;; front fo 'family' and continue in the loop.
+         (setq family (append (cdr-safe
+                               (assoc cur-family font-x-family-mappings))
+                              family))
+       ;; Not an alias for a list of fonts, so we just check it.
+       ;; First, convert all '-' to spaces so that we don't screw up
+       ;; the oh-so wonderful X font model.  Wheee.
+       (let ((x (length cur-family)))
+         (while (> x 0)
+           (if (= ?- (aref cur-family (1- x)))
+               (aset cur-family (1- x) ? ))
+           (setq x (1- x))))
+       (setq done (try-font-name (format "-*-%s-*-*-*-*-*-*-*-*-*-*-*-*" 
family) device))))
+    (and done family)))
+
+(defun font-set-face-font-new-redisplay (&optional face font &rest args)
+  (cond
+   ((and (vectorp font) (= (length font) 12))
+    (set-face-property face 'font-specification font)
+    (set-face-attribute face nil
+                       :underline (font-underline-p font)
+                       :weight (or (cdr-safe (assoc (font-weight font)
+                                                    
font-new-redisplay-weight-mappings))
+                                   'normal)
+                       :family (font-find-available-family font))
+    (if (font-size font)
+       (set-face-attribute face nil
+                           :height (* 10 (font-spatial-to-canonical (font-size 
font))))))
+   (t
+    (set-face-property face 'font-specification nil)
+    (apply 'set-face-font face font args))))
+
+(if font-running-emacs-new-redisplay
+    (fset 'font-set-face-font 'font-set-face-font-new-redisplay))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Now for emacsen specific stuff
@@ -981,7 +1006,6 @@ for use in the 'weight' field of an mswindows font 
string.")
   ;; create-device-hook.  This is XEmacs 19.12+ specific
   (let ((faces (face-list 2))
        (cur nil)
-       (font nil)
        (font-spec nil))
     (while faces
       (setq cur (car faces)
@@ -997,8 +1021,7 @@ for use in the 'weight' field of an mswindows font 
string.")
   (if (devicep device-list)
       (setq device-list (list device-list)))
   (let* ((cur-device nil)
-        (font-spec (face-property face 'font-specification))
-        (font nil))
+        (font-spec (face-property face 'font-specification)))
     (if (not font-spec)
        ;; Hey!  Don't mess with fonts we didn't create in the
        ;; first place.
@@ -1203,7 +1226,7 @@ The variable x-library-search-path is use to locate the 
rgb.txt file."
      ((and (vectorp color) (= 3 (length color)))
       (list (aref color 0) (aref color 1) (aref color 2)))
      ((and (listp color) (= 3 (length color)) (floatp (car color)))
-      (mapcar (function (lambda (x) (* x 65535))) color))
+      (mapcar (lambda (x) (* x 65535)) color))
      ((and (listp color) (= 3 (length color)))
       color)
      ((or (string-match "^#" color)
@@ -1282,10 +1305,15 @@ is returned."
           (color (apply 'format "#%02x%02x%02x" rgb)))
       (w32-define-rgb-color (nth 0 rgb) (nth 1 rgb) (nth 2 rgb) color)
       color))
+   (mswindows
+    (let* ((rgb (font-color-rgb-components color))
+          (color (apply 'format "#%02x%02x%02x" rgb)))
+      (mswindows-define-rgb-color (nth 0 rgb) (nth 1 rgb) (nth 2 rgb) color)
+      color))
    (tty
     (apply 'font-tty-find-closest-color (font-color-rgb-components color)))
    (ns
-    (let ((vals (mapcar (function (lambda (x) (>> x 8)))
+    (let ((vals (mapcar (lambda (x) (>> x 8))
                        (font-color-rgb-components color))))
       (apply 'format "RGB%02x%02x%02xff" vals)))
    (otherwise

commit 1d6aa842f2bd0bdb809f5490804a02e4f321855c
Author: William M. Perry <address@hidden>
Date:   Wed Dec 30 11:26:49 1998 +0000

    * lisp/url.el (url-file-exists): If url-user is nil use anonymous ftp.
      (url-file-size): Ditto.
    
    * lisp/w3.el (w3-find-this-file): Protect against sticking 'nil@' in the
      filename spec when we go to retrieve something.

diff --git a/lisp/url.el b/lisp/url.el
index 597310e..64665e2 100644
--- a/lisp/url.el
+++ b/lisp/url.el
@@ -1,13 +1,13 @@
 ;;; url.el --- Uniform Resource Locator retrieval tool
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/29 18:15:22 $
-;; Version: $Revision: 1.8 $
+;; Created: $Date: 1998/12/30 11:26:49 $
+;; Version: $Revision: 1.9 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;; LCD Archive Entry:
 ;;; url|William M. Perry|address@hidden|
 ;;; Functions for retrieving/manipulating URLs|
-;;; $Date: 1998/12/29 18:15:22 $|$Revision: 1.8 $|Location Undetermined
+;;; $Date: 1998/12/30 11:26:49 $|$Revision: 1.9 $|Location Undetermined
 ;;;
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -662,7 +662,7 @@ accessible."
                       (concat "/"
                               (if (url-user urlobj)
                                   (concat (url-user urlobj) "@")
-                                "")
+                                "anonymous@")
                               (url-host urlobj) ":"
                               (url-filename urlobj))
                     (url-filename urlobj))))
@@ -722,7 +722,7 @@ numbers, etc."
                       (concat "/"
                               (if (url-user urlobj)
                                   (concat (url-user urlobj) "@")
-                                "")
+                                "anonymous@")
                               (url-host urlobj) ":"
                               (url-filename urlobj))
                     (url-filename urlobj))))
diff --git a/lisp/w3.el b/lisp/w3.el
index fcbd5f3..3bfdc87 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/22 20:45:31 $
-;; Version: $Revision: 1.5 $
+;; Created: $Date: 1998/12/30 11:26:51 $
+;; Version: $Revision: 1.6 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1064,8 +1064,9 @@ ftp: reference"
       (find-file (url-filename url-current-object)))
      ((equal type "ftp")
       (find-file
-       (format "/address@hidden:%s"
-              (url-user url-current-object)
+       (format "/%s%s:%s"
+              (if (url-user url-current-object)
+                  (concat (url-user url-current-object) "@"))
               (url-host url-current-object)
               (url-filename url-current-object))))
      (t (message "Sorry, I can't get that file so you can alter it.")))))

commit 100fa94496dfb69680de3bffca5939c727a365ab
Author: William M. Perry <address@hidden>
Date:   Wed Dec 30 11:14:35 1998 +0000

    1998-12-30  Milan Zamazal <address@hidden>
    
    * lisp/url-auth.el (url-basic-auth): Make sure to use base64-encode-string
      instead of base64-encode to work with new Emacs/XEmacs that have native
      base64 encoding/decoding primitives.

diff --git a/lisp/url-auth.el b/lisp/url-auth.el
index e922a20..f91d781 100644
--- a/lisp/url-auth.el
+++ b/lisp/url-auth.el
@@ -1,14 +1,14 @@
 ;;; url-auth.el --- Uniform Resource Locator authorization modules
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:08 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1998/12/30 11:14:35 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;; This file is part of GNU Emacs.
 ;;;
 ;;; GNU Emacs is free software; you can redistribute it and/or modify
 ;;; it under the terms of the GNU General Public License as published by
@@ -82,7 +82,7 @@ instead of the pathname inheritance method."
            (cons (list server
                        (cons path
                              (setq retval
-                                   (base64-encode
+                                   (base64-encode-string
                                     (format "%s:%s" user pass)))))
                  url-basic-auth-storage)))
      (byserv
@@ -102,7 +102,7 @@ instead of the pathname inheritance method."
            (setq user (read-string (url-auth-user-prompt url realm)
                                    (user-real-login-name))
                  pass (funcall url-passwd-entry-func "Password: ")
-                 retval (base64-encode (format "%s:%s" user pass))
+                 retval (base64-encode-string (format "%s:%s" user pass))
                  byserv (assoc server url-basic-auth-storage))
            (setcdr byserv
                    (cons (cons path retval) (cdr byserv))))))

commit 1e7422b2a92498c4aba4871b32a50d6c884c0fd7
Author: William M. Perry <address@hidden>
Date:   Tue Dec 29 18:15:22 1998 +0000

    * lisp/url.el (url-file-attributes): use 'anonymous' instead of 'ftp' as
      the username if none specified.

diff --git a/lisp/url.el b/lisp/url.el
index 3787c69..597310e 100644
--- a/lisp/url.el
+++ b/lisp/url.el
@@ -1,13 +1,13 @@
 ;;; url.el --- Uniform Resource Locator retrieval tool
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/29 17:43:31 $
-;; Version: $Revision: 1.7 $
+;; Created: $Date: 1998/12/29 18:15:22 $
+;; Version: $Revision: 1.8 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;; LCD Archive Entry:
 ;;; url|William M. Perry|address@hidden|
 ;;; Functions for retrieving/manipulating URLs|
-;;; $Date: 1998/12/29 17:43:31 $|$Revision: 1.7 $|Location Undetermined
+;;; $Date: 1998/12/29 18:15:22 $|$Revision: 1.8 $|Location Undetermined
 ;;;
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -585,7 +585,7 @@ If file does not exist, returns nil."
                                     ((url-user urlobj)
                                      (concat (url-user urlobj) "@"))
                                     ((member type '("ftp"))
-                                     "ftp@")
+                                     "anonymous@")
                                     (t ""))
                                    (url-host urlobj) ":"
                                    (url-filename urlobj))

commit 22fd3942f9e612bfe584587a4ab945b896235ca9
Author: William M. Perry <address@hidden>
Date:   Tue Dec 29 18:06:46 1998 +0000

    use 'anonymous' instead of 'ftp' as the username if none specified.

diff --git a/ChangeLog b/ChangeLog
index 207cf3d..b6bd6be 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+1998-12-29  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre38 released
+
+* lisp/url.el (url-file-attributes): use 'anonymous' instead of 'ftp' as
+  the username if none specified.
+
 1998-12-29  Markus Rost  <address@hidden>
 
 * url.el (url-file-attributes): If url-user is nil use anonymous ftp.

commit fd238b5ead44cfffaab5cc7f3a375d7114b25e33
Author: William M. Perry <address@hidden>
Date:   Tue Dec 29 17:46:14 1998 +0000

    *** empty log message ***

diff --git a/.version b/.version
index 81b5c5d..e522732 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-37
+38
diff --git a/ChangeLog b/ChangeLog
index 9164679..207cf3d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
+1998-12-29  Markus Rost  <address@hidden>
+
+* url.el (url-file-attributes): If url-user is nil use anonymous ftp.
+
 1998-12-29  William M. Perry  <address@hidden>
 
+* lisp/mule-sysdp.el (mule-detect-coding-version): Doh - make sure we
+  don't blow up in XEmacs w/Mule when making sure we have a valid coding
+  system.
+
+* Emacs/W3 4.0pre37 released
+       
 * lisp/socks.el (socks-find-route): Fixed bug where we would not honor the
   '!' at the front of the regexp to mean _do_ redirect the connection.  I
   need to finish the socks-redirection-rules stuff sometime soon.
diff --git a/TODO b/TODO
index bae717f..4b1ae5a 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1,5 @@
 BUGS (4.0):
+- trim down w3-sysdp.el to be just the stuff it really needs
 - border-color can have multiple color specifications, but we
   currently choke with 'args out of range' when we see this.
 - widget appears to be stealing button3 to mean 'activate' - this is

commit aab28c32f0f848a307b4d47d1870505f94ecaa3b
Author: William M. Perry <address@hidden>
Date:   Tue Dec 29 17:43:31 1998 +0000

    1998-12-29  Markus Rost  <address@hidden>
    
    * url.el (url-file-attributes): If url-user is nil use anonymous ftp.

diff --git a/lisp/url.el b/lisp/url.el
index 0a9a7e8..3787c69 100644
--- a/lisp/url.el
+++ b/lisp/url.el
@@ -1,13 +1,13 @@
 ;;; url.el --- Uniform Resource Locator retrieval tool
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/28 16:30:47 $
-;; Version: $Revision: 1.6 $
+;; Created: $Date: 1998/12/29 17:43:31 $
+;; Version: $Revision: 1.7 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;; LCD Archive Entry:
 ;;; url|William M. Perry|address@hidden|
 ;;; Functions for retrieving/manipulating URLs|
-;;; $Date: 1998/12/28 16:30:47 $|$Revision: 1.6 $|Location Undetermined
+;;; $Date: 1998/12/29 17:43:31 $|$Revision: 1.7 $|Location Undetermined
 ;;;
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -581,9 +581,12 @@ If file does not exist, returns nil."
          ((member type '("ftp" "file"))
           (let ((fname (if (url-host urlobj)
                            (concat "/"
-                                   (if (url-user urlobj)
-                                       (concat (url-user urlobj) "@")
-                                     "")
+                                   (cond
+                                    ((url-user urlobj)
+                                     (concat (url-user urlobj) "@"))
+                                    ((member type '("ftp"))
+                                     "ftp@")
+                                    (t ""))
                                    (url-host urlobj) ":"
                                    (url-filename urlobj))
                          (url-filename urlobj))))

commit 32a95a323d6ccb95d481deab3348b68596fbdbd1
Author: William M. Perry <address@hidden>
Date:   Tue Dec 29 15:49:32 1998 +0000

    * lisp/mule-sysdp.el (mule-detect-coding-version): Doh - make sure we
      don't blow up in XEmacs w/Mule when making sure we have a valid coding
      system.

diff --git a/lisp/mule-sysdp.el b/lisp/mule-sysdp.el
index 9d83230..54eb5f3 100644
--- a/lisp/mule-sysdp.el
+++ b/lisp/mule-sysdp.el
@@ -193,9 +193,10 @@ find-file-hooks, etc.
                 ;; We can use HIGHEST arg t for faster detection.
                 (detect-coding-region st nd t))
                (otherwise nil))))
-    (if (mule-coding-system-p coding-system)
-       coding-system
-      mule-no-coding-system)))
+    (if (and (not (listp coding-system))
+            (not (mule-coding-system-p coding-system)))
+       (setq coding-system mule-no-coding-system))
+    coding-system))
 
 (defun mule-code-convert-region (code)
   (if (and (listp code) (car code))

commit a9eb669b8ebc30bf9531677e1d86534c8f95d135
Author: William M. Perry <address@hidden>
Date:   Tue Dec 29 14:50:48 1998 +0000

    *** empty log message ***

diff --git a/.version b/.version
index 7facc89..81b5c5d 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-36
+37
diff --git a/ChangeLog b/ChangeLog
index 5e3a868..9164679 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,35 @@
+1998-12-29  William M. Perry  <address@hidden>
+
+* lisp/socks.el (socks-find-route): Fixed bug where we would not honor the
+  '!' at the front of the regexp to mean _do_ redirect the connection.  I
+  need to finish the socks-redirection-rules stuff sometime soon.
+
+* lisp/mule-sysdp.el (mule-detect-coding-version): Put back in the
+  ultra-anal checks to make sure that what detect-coding-region and
+  friends find is actually a coding system.  Apparently the bug where
+  bizarre combinations of CRLF and LF separators in a file make Emacs 20.3
+  return a number as a coding system is back.  Bug reported to the Emacs
+  maintainers.
+
+1998-12-28  Milan Zamazal <address@hidden>
+
+* lisp/mm.el (mm-possible-viewers): Don't reverse exact & wildcard when
+  concatenating them.  Reason: `mm-mime-data' contains mailcap entries in
+  the opposite order than they are in the mailcap file.  The function
+  `mm-possible-viewers' should return found items in the opposite order
+  again, so that the first viewer from the mailcap was invoked.  The patch
+  ensures this.
+
+* lisp/mm.el (mm-mime-data-default): New variable that holds all the
+  defaults.  mm-mime-data now holds _only_ the user supplied viewers.
+
+* lisp/mm.el (mm-mime-info): Give preference to things found in
+  mm-mime-data (the user stuff) and then fall back onto
+  mm-mime-data-default.
+
+* lisp/url-http.el (url-parse-viewer-types): Apply both mm-mime-data and
+  mm-mime-data-default when building the acceptable viewer list.
+
 1998-12-28  William M. Perry  <address@hidden>
 
 * lisp/w3-display.el (w3-prepare-buffer): Use an unwind-protect form
@@ -7,6 +39,10 @@
   (w3-pause): Mark the buffer as temporarily read-only, so that
   self-inserting keystrokes will signal an error, which will be caught and 
   ignored by the condition-case.
+  (w3-widget-buffer): New function to get the buffer a widget is in.
+  (w3-widget-echo): Use it, since with Gnus, it is very likely that you
+  will be in a different buffer when you are mousing around the rendered
+  HTML.
 
 * lisp/url-file.el (url-file): Modify the filename in the URL if we are
   actually visiting a directory without a trailing '/' or '\', and we do
diff --git a/TODO b/TODO
index 54cb8ee..bae717f 100644
--- a/TODO
+++ b/TODO
@@ -1,6 +1,4 @@
 BUGS (4.0):
-- /etc/mailcap cannot overide builtin mm-mime-data stuff?
-- try to protect people from using '~' in file URLs
 - border-color can have multiple color specifications, but we
   currently choke with 'args out of range' when we see this.
 - widget appears to be stealing button3 to mean 'activate' - this is

commit 0895ec3b7abd3f487f5c11a2f8c31fce12aeed14
Author: William M. Perry <address@hidden>
Date:   Tue Dec 29 14:49:33 1998 +0000

    * lisp/socks.el (socks-find-route): Fixed bug where we would not honor the
      '!' at the front of the regexp to mean _do_ redirect the connection.  I
      need to finish the socks-redirection-rules stuff sometime soon.

diff --git a/lisp/socks.el b/lisp/socks.el
index d488189..6ed1986 100644
--- a/lisp/socks.el
+++ b/lisp/socks.el
@@ -1,13 +1,14 @@
 ;;; socks.el --- A Socks v5 Client for Emacs
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:08 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1998/12/29 14:49:33 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: comm, firewalls
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1996 - 1998 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;; This file is part of GNU Emacs.
 ;;;
 ;;; GNU Emacs is free software; you can redistribute it and/or modify
 ;;; it under the terms of the GNU General Public License as published by
@@ -441,8 +442,7 @@ If PATTERN is omitted, it defaults to \"[ 
\\f\\t\\n\\r\\v]+\"."
     (while noproxy
       (if (eq ?! (aref (car noproxy) 0))
          (if (string-match (substring (car noproxy) 1) host)
-             (setq route nil
-                   noproxy nil))
+             (setq noproxy nil))
        (if (string-match (car noproxy) host)
            (setq route nil
                  noproxy nil)))

commit 6186411f9099ec672cee8b2f08c4f6ad1a0849e4
Author: William M. Perry <address@hidden>
Date:   Tue Dec 29 14:46:20 1998 +0000

    * lisp/mule-sysdp.el (mule-detect-coding-version): Put back in the
      ultra-anal checks to make sure that what detect-coding-region and
      friends find is actually a coding system.  Apparently the bug where
      bizarre combinations of CRLF and LF separators in a file make Emacs 20.3
      return a number as a coding system is back.  Bug reported to the Emacs
      maintainers.

diff --git a/lisp/mule-sysdp.el b/lisp/mule-sysdp.el
index ffe8864..9d83230 100644
--- a/lisp/mule-sysdp.el
+++ b/lisp/mule-sysdp.el
@@ -193,7 +193,9 @@ find-file-hooks, etc.
                 ;; We can use HIGHEST arg t for faster detection.
                 (detect-coding-region st nd t))
                (otherwise nil))))
-    coding-system))
+    (if (mule-coding-system-p coding-system)
+       coding-system
+      mule-no-coding-system)))
 
 (defun mule-code-convert-region (code)
   (if (and (listp code) (car code))

commit e0d245d27b359969b4cf10450725bcf190293aed
Author: William M. Perry <address@hidden>
Date:   Mon Dec 28 22:18:38 1998 +0000

    1998-12-28  Milan Zamazal <address@hidden>
    
    * lisp/mm.el (mm-possible-viewers): Don't reverse exact & wildcard when
      concatenating them.  Reason: `mm-mime-data' contains mailcap entries in
      the opposite order than they are in the mailcap file.  The function
      `mm-possible-viewers' should return found items in the opposite order
      again, so that the first viewer from the mailcap was invoked.  The patch
      ensures this.
    
    * lisp/mm.el (mm-mime-data-default): New variable that holds all the
      defaults.  mm-mime-data now holds _only_ the user supplied viewers.
    
    * lisp/mm.el (mm-mime-info): Give preference to things found in
      mm-mime-data (the user stuff) and then fall back onto
      mm-mime-data-default.

diff --git a/lisp/mm.el b/lisp/mm.el
index 0021241..3beed90 100644
--- a/lisp/mm.el
+++ b/lisp/mm.el
@@ -6,9 +6,9 @@
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1994, 1995, 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;; This file is part of GNU Emacs.
 ;;;
 ;;; GNU Emacs is free software; you can redistribute it and/or modify
 ;;; it under the terms of the GNU General Public License as published by
@@ -112,7 +112,7 @@
 (modify-syntax-entry ?{ "(" mm-parse-args-syntax-table)
 (modify-syntax-entry ?} ")" mm-parse-args-syntax-table)
 
-(defvar mm-mime-data
+(defvar mm-mime-data-default
   '(
     ("multipart"   . (
                      ("alternative". (("viewer" . mm-multipart-viewer)
@@ -295,6 +295,10 @@ viewer specified is always valid.  If it is a list of 
strings,
 these are used to determine whether a viewer passes the 'test' or
 not.")
 
+(defvar mm-mime-data ()
+  "Parsed mailcap entries.
+It has the same format as `mm-mime-data-default'.")
+
 (defvar mm-content-transfer-encodings
   '(("base64"     . base64-decode-region)
     ("7bit"       . ignore)
@@ -441,7 +445,10 @@ not.")
        fname)
     (while fnames
       (setq fname (car fnames))
-      (if (and (file-exists-p fname) (file-readable-p fname))
+      (if (and fname
+              (file-exists-p fname)
+              (file-readable-p fname)
+              (file-regular-p fname))
          (mm-parse-mailcap (car fnames)))
       (setq fnames (cdr fnames)))))
 
@@ -661,7 +668,7 @@ not.")
        ((string-match (car (car major)) minor)
        (setq wildcard (cons (cdr (car major)) wildcard))))
       (setq major (cdr major)))
-    (nconc (nreverse exact) (nreverse wildcard))))
+    (nconc exact wildcard)))
 
 (defun mm-unescape-mime-test (test type-info)
   (let ((buff (get-buffer-create " *unescape*"))
@@ -796,10 +803,13 @@ viewer is returned."
        info                            ; Other info
        save-pos                        ; Misc. position during parse
        major-info                      ; (assoc major mm-mime-data)
+       major-info-default              ; (assoc major mm-mime-data-default)
        minor-info                      ; (assoc minor major-info)
        test                            ; current test proc.
        viewers                         ; Possible viewers
+       viewers-default                 ; Possible W3 default viewers
        passed                          ; Viewers that passed the test
+       passed-default                  ; W3 viewers that passed the test
        viewer                          ; The one and only viewer
        )
     (save-excursion
@@ -826,15 +836,22 @@ viewer is returned."
              (skip-chars-forward "^/")
              (downcase-region save-pos (point))
              (setq major (buffer-substring save-pos (point)))
-             (if (not (setq major-info (cdr (assoc major mm-mime-data))))
+             (setq major-info (cdr (assoc major mm-mime-data))
+                   major-info-default (cdr (assoc major
+                                                  mm-mime-data-default)))
+             (if (and (not major-info)
+                      (not major-info-default))
                  (throw 'mm-exit nil))
              (skip-chars-forward "/ \t\n")
              (setq save-pos (point))
              (skip-chars-forward "^ \t\n;")
              (downcase-region save-pos (point))
              (setq minor (buffer-substring save-pos (point)))
-             (if (not
-                  (setq viewers (mm-possible-viewers major-info minor)))
+             (setq viewers (mm-possible-viewers major-info minor)
+                   viewers-default (mm-possible-viewers
+                                    major-info-default minor))
+             (if (and (not viewers)
+                      (not viewers-default))
                  (throw 'mm-exit nil))
              (skip-chars-forward "; \t")
              (if (eolp)
@@ -848,7 +865,21 @@ viewer is returned."
                    (setq passed (cons (car viewers) passed)))
                (setq viewers (cdr viewers)))
              (setq passed (sort (nreverse passed) 'mm-viewer-lessp))
-             (car passed)))
+             (while viewers-default
+               (if (mm-viewer-passes-test (car viewers-default) info)
+                   (setq passed-default
+                         (cons (car viewers-default) passed-default)))
+               (setq viewers-default (cdr viewers-default)))
+             (setq passed-default (sort (nreverse passed-default)
+                                        'mm-viewer-lessp))
+             (if (or (not passed)
+                     (and passed-default
+                          (not (stringp
+                                (or (cdr-safe (assoc
+                                               "viewer" (car passed-default)))
+                                    "")))))
+                 (car passed-default)
+               (car passed))))
       (if (and (stringp (cdr (assoc "viewer" viewer)))
               passed)
          (setq viewer (car passed)))

commit ebfba8eb6e4a88ee2aa29d0eccec922fa39ac2ee
Author: William M. Perry <address@hidden>
Date:   Mon Dec 28 22:18:19 1998 +0000

    1998-12-28  Milan Zamazal <address@hidden>
    
    * lisp/url-http.el (url-parse-viewer-types): Apply both mm-mime-data and
      mm-mime-data-default when building the acceptable viewer list.

diff --git a/lisp/url-http.el b/lisp/url-http.el
index a630281..9b9c1e6 100644
--- a/lisp/url-http.el
+++ b/lisp/url-http.el
@@ -1,14 +1,14 @@
 ;;; url-http.el --- HTTP Uniform Resource Locator retrieval code
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:09 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1998/12/28 22:18:19 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;; This file is part of GNU Emacs.
 ;;;
 ;;; GNU Emacs is free software; you can redistribute it and/or modify
 ;;; it under the terms of the GNU General Public License as published by
@@ -40,7 +40,7 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (defun url-parse-viewer-types ()
   "Create a string usable for an Accept: header from mm-mime-data"
-  (let ((tmp mm-mime-data)
+  (let ((tmp (append mm-mime-data mm-mime-data-default))
        label mjr mnr cur-mnr (str ""))
     (while tmp
       (setq mnr (cdr (car tmp))
@@ -549,58 +549,49 @@ HTTP/1.0 specification for more details." x redir) 'error)
       (if (equal port "") (setq port "80"))
       (if (equal file "") (setq file "/"))
       (if (not server)
+         (message "Malformed URL: `%s'" url)
+       (if (or (not (member port url-bad-port-list))
+               (funcall url-confirmation-func
+                        (concat
+                         "Warning!  Trying to connect to port "
+                         port
+                         " - continue? ")))
+           (progn
+             (setq request (url-create-mime-request file ref-url))
+             (url-lazy-message "Contacting %s:%s" server port)
+             (let ((process
+                    (url-open-stream "WWW" url-working-buffer server
+                                     (string-to-int port))))
+               (if (not (processp process))
+                   (url-sentinel url-working-buffer nil)
+                 (progn
+                   (url-process-put process 'url (or proxy-info url))
+                   (set-process-sentinel process 'ignore)
+                   (process-kill-without-query process)
+                   (process-send-string process request)
+                   (url-lazy-message "Request sent, waiting for response...")
+                   (setq url-current-content-length nil)
+                   (make-local-variable 'after-change-functions)
+                   (add-hook 'after-change-functions 
'url-after-change-function)
+                   (if url-be-asynchronous
+                       (set-process-sentinel process 'url-sentinel)
+                     (unwind-protect
+                         (save-excursion
+                           (set-buffer url-working-buffer)
+                           (while (memq (url-process-status process)
+                                        '(run open))
+                             (url-accept-process-output process)))
+                       (condition-case ()
+                           (url-kill-process process)
+                         (error nil))))
+                   (if url-be-asynchronous
+                       nil
+                     (message "Retrieval complete.")
+                     (remove-hook 'after-change-functions
+                                  'url-after-change-function))))))
          (progn
-           (url-warn
-            'url
-            (eval-when-compile
-              (concat
-               "Malformed URL got passed into url-retrieve.\n"
-               "Either `url-expand-file-name' is broken in some\n"
-               "way, or an incorrect URL was manually entered (more likely)."
-               )))
-           (error "Malformed URL: `%s'" url)))
-      (if (or (not (member port url-bad-port-list))
-             (funcall url-confirmation-func
-                      (concat
-                       "Warning!  Trying to connect to port "
-                       port
-                       " - continue? ")))
-         (progn
-           (setq request (url-create-mime-request file ref-url))
-           (url-lazy-message "Contacting %s:%s" server port)
-           (let ((process
-                  (url-open-stream "WWW" url-working-buffer server
-                                  (string-to-int port))))
-             (if (not (processp process))
-                 (url-sentinel url-working-buffer nil)
-               (progn
-                 (url-process-put process 'url (or proxy-info url))
-                 (set-process-sentinel process 'ignore)
-                 (process-kill-without-query process)
-                 (process-send-string process request)
-                 (url-lazy-message "Request sent, waiting for response...")
-                 (setq url-current-content-length nil)
-                 (make-local-variable 'after-change-functions)
-                 (add-hook 'after-change-functions 'url-after-change-function)
-                 (if url-be-asynchronous
-                     (set-process-sentinel process 'url-sentinel)
-                   (unwind-protect
-                       (save-excursion
-                         (set-buffer url-working-buffer)
-                         (while (memq (url-process-status process)
-                                      '(run open))
-                           (url-accept-process-output process)))
-                     (condition-case ()
-                         (url-kill-process process)
-                       (error nil))))
-                 (if url-be-asynchronous
-                     nil
-                   (message "Retrieval complete.")
-                   (remove-hook 'after-change-functions
-                                'url-after-change-function))))))
-       (progn
-         (ding)
-         (url-warn 'security "Aborting connection to bad port..."))))))
+           (ding)
+           (url-warn 'security "Aborting connection to bad port...")))))))
 
 (defun url-https (url)
   ;; Retrieve a URL via SSL

commit 872020c28b6bb2afa74c448698aa9f823195d7e4
Author: William M. Perry <address@hidden>
Date:   Mon Dec 28 21:44:07 1998 +0000

      (w3-widget-buffer): New function to get the buffer a widget is in.
      (w3-widget-echo): Use it, since with Gnus, it is very likely that you
      will be in a different buffer when you are mousing around the rendered
      HTML.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index ee3e879..8693c7d 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/28 16:38:40 $
-;; Version: $Revision: 1.7 $
+;; Created: $Date: 1998/12/28 21:44:07 $
+;; Version: $Revision: 1.8 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -496,27 +496,37 @@ If the face already exists, it is unmodified."
            (setq w3-cookie-cache (cons (cons href fname) w3-cookie-cache))))
       (cookie fname st nd))))
 
+(defun w3-widget-buffer (widget)
+  (let ((overlay (or (widget-get widget :button-overlay)
+                    (widget-get widget :field-overlay)))
+       (extent (or (widget-get widget :button-extent)
+                   (widget-get widget :field-extent))))
+    (or (and overlay (overlay-buffer overlay))
+       (and extent (extent-buffer extent)))))
+
 (defun w3-widget-echo (widget &rest ignore)
-  (let* ((url (widget-get widget :href))
-        (name (widget-get widget :name))
-        (text (buffer-substring-no-properties (widget-get widget :from)
-                                              (widget-get widget :to)))
-        (title (widget-get widget :title))
-        (check w3-echo-link)
-        (msg nil))
-    (if url
-       (setq url (url-truncate-url-for-viewing url)))
-    (if name
-       (setq name (concat "anchor:" name)))
-    (if (not (listp check))
-       (setq check (cons check '(title url text name))))
-    (catch 'exit
-      (while check
-       (and (boundp (car check))
-            (stringp (symbol-value (car check)))
-            (> (length (symbol-value (car check))) 0)
-            (throw 'exit (symbol-value (car check))))
-       (pop check)))))
+  (save-excursion
+    (set-buffer (or (w3-widget-buffer widget) (current-buffer)))
+    (let* ((url (widget-get widget :href))
+          (name (widget-get widget :name))
+          (text (buffer-substring-no-properties (widget-get widget :from)
+                                                (widget-get widget :to)))
+          (title (widget-get widget :title))
+          (check w3-echo-link)
+          (msg nil))
+      (if url
+         (setq url (url-truncate-url-for-viewing url)))
+      (if name
+         (setq name (concat "anchor:" name)))
+      (if (not (listp check))
+         (setq check (cons check '(title url text name))))
+      (catch 'exit
+       (while check
+         (and (boundp (car check))
+              (stringp (symbol-value (car check)))
+              (> (length (symbol-value (car check))) 0)
+              (throw 'exit (symbol-value (car check))))
+         (pop check))))))
 
 (defun w3-follow-hyperlink (widget &rest ignore)
   (let* ((target (or (widget-get widget :target) w3-base-target))

commit 245688556105e3ab828d6342f74045d982ed8768
Author: William M. Perry <address@hidden>
Date:   Mon Dec 28 20:36:11 1998 +0000

    Removed obsolete file

diff --git a/lisp/w3-xem20.el b/lisp/w3-xem20.el
deleted file mode 100644
index 5a51280..0000000
--- a/lisp/w3-xem20.el
+++ /dev/null
@@ -1,79 +0,0 @@
-;;; w3-xem20.el -- XEmacs 20.0 with Mule specific functions
-;; Author: MORIOKA Tomohiko
-;; Created: $Date: 1998/12/01 22:12:11 $
-;; Version: $Revision: 1.1 $
-;; Keywords: faces, help, i18n, mouse, hypermedia
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Copyright (c) 1996 by MORIOKA Tomohiko
-;;;
-;;; This file is part of GNU Emacs.
-;;;
-;;; GNU Emacs is free software; you can redistribute it and/or modify
-;;; it under the terms of the GNU General Public License as published by
-;;; the Free Software Foundation; either version 2, or (at your option)
-;;; any later version.
-;;;
-;;; GNU Emacs is distributed in the hope that it will be useful,
-;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;;; GNU General Public License for more details.
-;;;
-;;; You should have received a copy of the GNU General Public License
-;;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;;; Boston, MA 02111-1307, USA.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Printing a mule buffer as postscript.  Requires m2ps
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(require 'mule-sysdp)
-
-(defun w3-m2ps-buffer (&optional buffer)
-  "Print a buffer by passing it through m2ps and lpr."
-  (or buffer (setq buffer (current-buffer)))
-  (let ((x (save-excursion (set-buffer buffer) tab-width)))
-    (save-excursion
-      (set-buffer (get-buffer-create " *mule-print*"))
-      (erase-buffer)
-      (insert-buffer buffer)
-      (if (/= x tab-width)
-         (progn
-           (setq tab-width x)
-           (message "Converting tabs")
-           (untabify (point-min) (point-max))))
-      (setq file-coding-system *internal*)
-      (shell-command-on-region (point-min) (point-max)
-                              "m2ps | lpr" t))))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; Multi-Lingual Emacs (MULE) Specific Functions
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defvar attributed-region nil
-  "Bogus definition to get rid of compile-time warnings.")
-
-(defun w3-inhibit-code-conversion (proc buf)
-  "Inhibit Mule's subprocess PROC from code converting in BUF."
-  (save-excursion
-    (set-buffer buf)
-    (setq mc-flag nil))
-  (set-process-input-coding-system proc mule-no-coding-system)
-  (set-process-output-coding-system proc mule-no-coding-system))
-
-(defvar w3-mime-list-for-code-conversion
-  '("text/plain" "text/html")
-  "List of MIME types that require Mules' code conversion.")
-(make-variable-buffer-local 'w3-mime-list-for-code-conversion)
-
-(defun w3-convert-code-for-mule (mmtype)
-  "Convert current data into the appropriate coding system"
-  (and (or (not mmtype) (member mmtype w3-mime-list-for-code-conversion))
-       (let* ((c (detect-coding-region (point-min) (point-max)))
-             (code (or (and (listp c) (car c)) c)))
-        (setq mc-flag t)
-        (decode-coding-region (point-min) (point-max) code)
-        (set-file-coding-system code)
-        )))
-
-(provide 'w3-xem20)

commit 4efd91fe614a2e71156e35ff772017afa3fd94ae
Author: William M. Perry <address@hidden>
Date:   Mon Dec 28 16:43:40 1998 +0000

    *** empty log message ***

diff --git a/BUGS b/BUGS
index 638f1b2..ff666e7 100644
--- a/BUGS
+++ b/BUGS
@@ -22,10 +22,10 @@ under NeXTstep or OS/2.
 If the problem is actually causing Emacs to crash, then you will need
 to also mail the maintainers of the various Emacs distributions with
 the bug.  Please use the 'gnu.emacs.bug' newgroup for reporting bugs
-with GNU Emacs, and 'comp.emacs.xemacs' for reporting bugs with XEmacs
-.  I am actively involved with the beta testing of the latest versions
-of both branches of Emacs, and if I can reproduce the problem, I will
-do my best to see it gets fixed in the next release.
+with GNU Emacs, and 'comp.emacs.xemacs' for reporting bugs with
+XEmacs.  I am actively involved with the beta testing of the latest
+versions of both branches of Emacs, and if I can reproduce the
+problem, I will do my best to see it gets fixed in the next release.
 
 It is also important to always maintain as much context as possible in
 your responses.  I get so much email from my various Emacs-activities
diff --git a/ChangeLog b/ChangeLog
index aeb97bd..5e3a868 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,47 @@
+1998-12-28  William M. Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-prepare-buffer): Use an unwind-protect form
+  around w3-draw-tree.  This means that even if something in the drawing
+  causes an error, the buffer will still be thrown into w3-mode
+  (w3-region): Make w3-region interactive and give it a doc string.
+  (w3-pause): Mark the buffer as temporarily read-only, so that
+  self-inserting keystrokes will signal an error, which will be caught and 
+  ignored by the condition-case.
+
+* lisp/url-file.el (url-file): Modify the filename in the URL if we are
+  actually visiting a directory without a trailing '/' or '\', and we do
+  the auto-find of the index.html file.
+
+* lisp/url.el (url-looks-like-html): New function that determines whether
+  a document looks like HTML or not.  This is for ancient HTTP/0.9
+  responses for things without a file extension (ie: /, /a/b/, etc)
+  (url-retrieve-internally): Use it if we cannot find a content-type any
+  other way.
+
+* lisp/url-cid.el: Try to avoid compile-time-errors when gnus' mm-decode
+  cannot be found.
+
+1998-12-26  William M. Perry  <address@hidden>
+
+* lisp/url.el (url-expand-file-name): Make sure to normalize the 'default' 
+  value before we get to the point of bailing out if we get the empty
+  string, otherwise the vector-ized version of the URL could sneak out,
+  and the 'nil' default case would screw us too.
+
+1998-12-26  Markus Rost  <address@hidden>
+
+* w3-display.el (w3-display-get-cookie): No buffer-file-name for "
+  *cookie*" buffers.
+
+1998-12-26  William M. Perry  <address@hidden>
+
+* lisp/base64.el: Added alias for base64-encode-string -> base64-encode
+  and base64-decode-string -> base64-decode, for compatibility with
+  Emacs/XEmacs with native base64 support.
+
+* lisp/w3-about.el: Use base64-encode-string instead of base64-encode, for 
+  compatibility with Emacs/XEmacs with native base64 support.
+
 1998-12-25  William M. Perry  <address@hidden>
 
 * lisp/url-ldap.el: New file to implement LDAP support ala RFC2255
diff --git a/TODO b/TODO
index f643a3c..54cb8ee 100644
--- a/TODO
+++ b/TODO
@@ -1,24 +1,12 @@
 BUGS (4.0):
-- need to support HTTP/0.9 (http://c2.com:8080) responses
-- When auto-loading the index.html file out of a directory, if the
-  directory does not have the trailing '/', relative URL references
-  are wrong.
 - /etc/mailcap cannot overide builtin mm-mime-data stuff?
 - try to protect people from using '~' in file URLs
-- keystrokes entered while in w3-pause self-insert under XEmacs - the
-  loop around dispatch-event needs to be smarter about what it
-  swallows.
 - border-color can have multiple color specifications, but we
   currently choke with 'args out of range' when we see this.
 - widget appears to be stealing button3 to mean 'activate' - this is
   bogus!  We lose all context-sensitive menus because of this.
 - We still seem to be growing the line size under Emacs 19.x/20.x
-- It would be really nice if w3 buffers were put into w3-mode as soon
-  as they were created. Then if the rendering craps out somehow then
-  the buffer could be browsed such as it was. Ideally, links and
-  widgets would be functional.
 - document how to translate Netscape foo.pac files to emacs lisp
-- Should we stop using reporter.el?
 
 BUGS (4.1):
 - background colors are not heeded on table rows (<tr>).  Same
@@ -58,7 +46,6 @@ FEATURES (4.1)
   people to use HTTP PUT to upload documents to HTTP servers, etc.
 - cache a formatted version of documents, with enough info to recreate
   the widgets in them.
-- w3-preview-region command
 - keystrokes and supporting infrastructure to prefetch URLs from
   within a document that you are likely to read next.  Don't even parse
   or render them David Kastrup <address@hidden>

commit aca720a34f7ddb1934280e5fc62c5b75db670e91
Author: William M. Perry <address@hidden>
Date:   Mon Dec 28 16:38:40 1998 +0000

      (w3-pause): Mark the buffer as temporarily read-only, so that
      self-inserting keystrokes will signal an error, which will be caught and
      ignored by the condition-case.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 048466d..ee3e879 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/28 16:33:58 $
-;; Version: $Revision: 1.6 $
+;; Created: $Date: 1998/12/28 16:38:40 $
+;; Version: $Revision: 1.7 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -165,7 +165,8 @@
      (w3-running-xemacs
       (if (and (not (sit-for 0)) (input-pending-p))
          (condition-case ()
-             (dispatch-event (next-command-event))
+             (let ((buffer-read-only t))
+               (dispatch-event (next-command-event)))
            (error nil))))
      (t
       (if (and (not (sit-for 0)) (input-pending-p))

commit 685aa5413918cd3c3504b39f34db951409fff6ad
Author: William M. Perry <address@hidden>
Date:   Mon Dec 28 16:33:58 1998 +0000

      (w3-region): Make w3-region interactive and give it a doc string.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 4e21743..048466d 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/28 16:28:37 $
-;; Version: $Revision: 1.5 $
+;; Created: $Date: 1998/12/28 16:33:58 $
+;; Version: $Revision: 1.6 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2661,6 +2661,8 @@ Format: (((image-alt row column) . offset) ...)")
 
 ;;;###autoload
 (defun w3-region (st nd)
+  "Parse and display the region of this buffer between ST and ND."
+  (interactive "r")
   (if (not w3-setup-done) (w3-do-setup))
   (let* ((source (buffer-substring st nd))
         (w3-display-same-buffer t)

commit 183e1670d04b2ad15ee792c8373e1d3217d6df2b
Author: William M. Perry <address@hidden>
Date:   Mon Dec 28 16:30:47 1998 +0000

    * lisp/url.el (url-looks-like-html): New function that determines whether
      a document looks like HTML or not.  This is for ancient HTTP/0.9
      responses for things without a file extension (ie: /, /a/b/, etc)
      (url-retrieve-internally): Use it if we cannot find a content-type any
      other way.

diff --git a/lisp/url.el b/lisp/url.el
index 274eef7..0a9a7e8 100644
--- a/lisp/url.el
+++ b/lisp/url.el
@@ -1,13 +1,13 @@
 ;;; url.el --- Uniform Resource Locator retrieval tool
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/27 02:01:52 $
-;; Version: $Revision: 1.5 $
+;; Created: $Date: 1998/12/28 16:30:47 $
+;; Version: $Revision: 1.6 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;; LCD Archive Entry:
 ;;; url|William M. Perry|address@hidden|
 ;;; Functions for retrieving/manipulating URLs|
-;;; $Date: 1998/12/27 02:01:52 $|$Revision: 1.5 $|Location Undetermined
+;;; $Date: 1998/12/28 16:30:47 $|$Revision: 1.6 $|Location Undetermined
 ;;;
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1960,6 +1960,13 @@ retrieve a URL by its HTML source."
       (url-warn 'url (format "Unknown proxy directive: %s" proxy) 'critical)
       nil))))
 
+(defun url-looks-like-html (&optional buf)
+  (save-excursion
+    (set-buffer (or buf (current-buffer)))
+    (goto-char (point-min))
+    (let ((case-fold-search t))
+      (re-search-forward "<\\(html\\|head\\|title\\|body\\).*>" nil t))))
+
 (defun url-retrieve-internally (url &optional no-cache)
   (let* ((url-working-buffer (if (and url-multiple-p
                                      (string-equal
@@ -2016,14 +2023,20 @@ retrieve a URL by its HTML source."
      ((and (not url-inhibit-mime-parsing)
           (or cached (url-mime-response-p t)))
       (or cached (url-parse-mime-headers nil t))))
+
     (if (and (or (not url-be-asynchronous)
                 (not (equal type "http")))
             url-current-object
             (not url-current-mime-type))
-       (setq url-current-mime-type (mm-extension-to-mime
-                                    (url-file-extension
-                                     (url-filename
-                                      url-current-object)))))
+       (progn
+         (setq url-current-mime-type (mm-extension-to-mime
+                                      (url-file-extension
+                                       (url-filename
+                                        url-current-object))))
+         (if (and (not url-current-mime-type)
+                  (url-looks-like-html))
+             (setq url-current-mime-type "text/html"))))
+
     (if (not url-be-asynchronous)
        (url-store-in-cache url-working-buffer))
     (if (not url-global-history-hash-table)

commit f685552f135de02d55546cb7c98204734dade31d
Author: William M. Perry <address@hidden>
Date:   Mon Dec 28 16:29:16 1998 +0000

    * lisp/url-file.el (url-file): Modify the filename in the URL if we are
      actually visiting a directory without a trailing '/' or '\', and we do
      the auto-find of the index.html file.

diff --git a/lisp/url-file.el b/lisp/url-file.el
index e199e54..ede42cc 100644
--- a/lisp/url-file.el
+++ b/lisp/url-file.el
@@ -1,14 +1,14 @@
 ;;; url-file.el --- File retrieval code
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:08 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1998/12/28 16:29:16 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;; This file is part of GNU Emacs.
 ;;;
 ;;; GNU Emacs is free software; you can redistribute it and/or modify
 ;;; it under the terms of the GNU General Public License as published by
@@ -215,6 +215,13 @@ and exchanges any | in the drive identifier with a :."
           (efs-set-passwd site user pass))
          (t
           nil)))
+
+    (if (and url-current-object
+            (file-directory-p filename)
+            (not (string-match (format "%c$" directory-sep-char) filename)))
+       (url-set-filename url-current-object
+                         (format "%s%c" filename directory-sep-char)))
+
     (if (and pos-index
             (file-exists-p pos-index)
             (file-readable-p pos-index))

commit 0e76bd62e54104ed6c5ab27f63e62de6a7090db0
Author: William M. Perry <address@hidden>
Date:   Mon Dec 28 16:28:37 1998 +0000

    * lisp/w3-display.el (w3-prepare-buffer): Use an unwind-protect form
      around w3-draw-tree.  This means that even if something in the drawing
      causes an error, the buffer will still be thrown into w3-mode

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 748cf0c..4e21743 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/28 15:11:01 $
-;; Version: $Revision: 1.4 $
+;; Created: $Date: 1998/12/28 16:28:37 $
+;; Version: $Revision: 1.5 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2699,13 +2699,14 @@ Format: (((image-alt row column) . offset) ...)")
         (source-buf (current-buffer))
         (parse (w3-parse-buffer source-buf)))
     (set-buffer-modified-p nil)
-    (w3-draw-tree parse)
-    (kill-buffer source-buf)
-    (set-buffer-modified-p nil)
-    (setq w3-current-source source
-         w3-current-parse parse)
-    (w3-finish-drawing)
-    (w3-mode)
+    (unwind-protect
+       (w3-draw-tree parse)
+      (kill-buffer source-buf)
+      (set-buffer-modified-p nil)
+      (setq w3-current-source source
+           w3-current-parse parse)
+      (w3-finish-drawing)
+      (w3-mode))
     (set-buffer-modified-p nil)
     (if url-keep-history
        (let ((url (url-view-url t)))

commit c184ae6522cfeb30e2918b6a63781d6d46cab343
Author: William M. Perry <address@hidden>
Date:   Mon Dec 28 15:12:21 1998 +0000

    Try to avoid compile-time-errors when gnus' mm-decode cannot be found.

diff --git a/lisp/url-cid.el b/lisp/url-cid.el
index db3adcb..317c128 100644
--- a/lisp/url-cid.el
+++ b/lisp/url-cid.el
@@ -1,7 +1,7 @@
 ;;; url-cid.el --- Content-ID URL loader
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/18 02:20:05 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1998/12/28 15:12:21 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -29,7 +29,9 @@
 (require 'url-parse)
 (require 'widget)
 
-(require 'mm-decode)
+(condition-case ()
+    (require 'mm-decode)
+  (error nil))
 
 (defun url-cid-gnus (cid)
   (set-buffer (get-buffer-create url-working-buffer))

commit 6ef463ab8e0a95a88383bc321edf855f4a6763d4
Author: William M. Perry <address@hidden>
Date:   Mon Dec 28 15:11:01 1998 +0000

    1998-12-26  Markus Rost  <address@hidden>
    
    * w3-display.el (w3-display-get-cookie): No buffer-file-name for "
      *cookie*" buffers.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 7d48e5c..748cf0c 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/23 00:38:55 $
-;; Version: $Revision: 1.3 $
+;; Created: $Date: 1998/12/28 15:11:01 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -489,6 +489,8 @@ If the face already exists, it is unmodified."
          (save-excursion
            (set-buffer (generate-new-buffer " *cookie*"))
            (url-insert-file-contents href)
+           (setq buffer-file-name nil)
+           (set-buffer-modified-p nil)    
            (mule-write-region-no-coding-system (point-min) (point-max) fname 5)
            (setq w3-cookie-cache (cons (cons href fname) w3-cookie-cache))))
       (cookie fname st nd))))

commit e9daf5281fc92e6aa86c9848c6c0193815247243
Author: William M. Perry <address@hidden>
Date:   Sun Dec 27 02:01:52 1998 +0000

    * lisp/url.el (url-expand-file-name): Make sure to normalize the 'default'
      value before we get to the point of bailing out if we get the empty
      string, otherwise the vector-ized version of the URL could sneak out,
      and the 'nil' default case would screw us too.

diff --git a/lisp/url.el b/lisp/url.el
index b61fa65..274eef7 100644
--- a/lisp/url.el
+++ b/lisp/url.el
@@ -1,13 +1,13 @@
 ;;; url.el --- Uniform Resource Locator retrieval tool
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/26 02:40:13 $
-;; Version: $Revision: 1.4 $
+;; Created: $Date: 1998/12/27 02:01:52 $
+;; Version: $Revision: 1.5 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;; LCD Archive Entry:
 ;;; url|William M. Perry|address@hidden|
 ;;; Functions for retrieving/manipulating URLs|
-;;; $Date: 1998/12/26 02:40:13 $|$Revision: 1.4 $|Location Undetermined
+;;; $Date: 1998/12/27 02:01:52 $|$Revision: 1.5 $|Location Undetermined
 ;;;
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1137,32 +1137,33 @@ path components followed by `..' are removed, along 
with the `..' itself."
                                         (char-to-string x))))
                           (url-strip-leading-spaces
                            (url-eat-trailing-space url)) "")))
+  (setq default (cond
+                ((vectorp default) default)
+                (default (url-generic-parse-url default))
+                (url-current-object url-current-object)
+                (t (url-generic-parse-url (url-view-url t)))))
+
   (cond
    ((= (length url) 0)                 ; nil or empty string
-    default)
+    (url-recreate-url default))
    ((string-match "^#" url)            ; Offset link, use it raw
     url)
    (t
     (let* ((urlobj (url-generic-parse-url url))
           (inhibit-file-name-handlers t)
-          (defobj (cond
-                   ((vectorp default) default)
-                   (default (url-generic-parse-url default))
-                   (url-current-object url-current-object)
-                   (t (url-generic-parse-url (url-view-url t)))))
           (expander (cdr-safe
                      (cdr-safe
                       (assoc (or (url-type urlobj)
-                                 (url-type defobj))
+                                 (url-type default))
                              url-registered-protocols)))))
       (if (string-match "^//" url)
-         (setq urlobj (url-generic-parse-url (concat (url-type defobj) ":"
+         (setq urlobj (url-generic-parse-url (concat (url-type default) ":"
                                                      url))))
       (if (fboundp expander)
-         (funcall expander urlobj defobj)
+         (funcall expander urlobj default)
        (message "Unknown URL scheme: %s" (or (url-type urlobj)
-                                            (url-type defobj)))
-       (url-identity-expander urlobj defobj))
+                                            (url-type default)))
+       (url-identity-expander urlobj default))
       (url-recreate-url urlobj)))))
 
 (defun url-default-expander (urlobj defobj)

commit 8b139598504c221b5afd4f568521f75a455c6aba
Author: William M. Perry <address@hidden>
Date:   Sun Dec 27 01:54:10 1998 +0000

    *** empty log message ***

diff --git a/lisp/w3-about.el b/lisp/w3-about.el
index fd799cd..a2eebc1 100644
--- a/lisp/w3-about.el
+++ b/lisp/w3-about.el
@@ -1,7 +1,7 @@
 ;;; w3-about.el --- About pages for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/27 01:50:02 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1998/12/27 01:54:10 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -427,7 +427,7 @@ experiment! :)
  <body>
   <hr width=\"85%\">
   <hr width=\"75%\" label=\" The Emacs-W3 Team \">
-  <hr width=\"65%\" label=\" 1993 - 1996 \">
+  <hr width=\"65%\" label=\" 1993 - 1999 \">
   <hr width=\"55%\">
   <dl>
    <dt> Author

commit a06f795fbaee8aac97f585cea5b8e11c269f9655
Author: William M. Perry <address@hidden>
Date:   Sun Dec 27 01:50:02 1998 +0000

    Works with Emacs/XEmacs with native base64 support now.

diff --git a/lisp/w3-about.el b/lisp/w3-about.el
index 6e7bda7..fd799cd 100644
--- a/lisp/w3-about.el
+++ b/lisp/w3-about.el
@@ -1,12 +1,12 @@
 ;;; w3-about.el --- About pages for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:10 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1998/12/27 01:50:02 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -192,7 +192,7 @@ static char *arena[] = {
                '(("content-type"              . "image/x-pixmap"))
                url-current-mime-type "image/x-pixmap"
                url-current-mime-viewer (mm-mime-info "image/x-pixmap" nil 5)))
-        ((string= "cXVvdGVz" (base64-encode node))
+        ((string= "cXVvdGVz" (base64-encode-string node))
          (insert
           "
 H4sIAMtPtS8AA5VZTZPbNhLdM38FrMtcNPoBe5kax+tYW/HGtXHWtUeIhERkSIABQDPMr9/3ukFq
@@ -267,7 +267,7 @@ QN4UE7C2FZxu54iv23yPFj0H3fvIhW/0atSQC+ZSWvc/LM46zb4fAAA=
          (setq url-current-mime-headers
                '(("content-transfer-encoding" . "base64")
                  ("content-encoding" . "x-gzip"))))
-        ((string= "emlwcHk=" (base64-encode node))
+        ((string= "emlwcHk=" (base64-encode-string node))
          (insert
           "
 /9j/4AAQSkZJRgABAQAAAQABAAD//gBLCgpDUkVBVE9SOiBYViBWZXJzaW9uIDMuMTBhICBSZXY6
@@ -461,7 +461,7 @@ experiment! :)
 </html>
 "))
 
-        ((string= "cGhvdG8=" (base64-encode node))
+        ((string= "cGhvdG8=" (base64-encode-string node))
          (insert "
 R0lGODdhbAB4APQAADIyMjo6Ojw8PENDQ05OTldXV19fX2dnZ21tbXV1dXh4eIaGho+Pj5GRkZqa
 mqWlpaysrLW1tb29vcnJydHR0dPT0+Dg4Ofn5+zs7Pn5+fz8/AAAAAAAAAAAAAAAAAAAACwAAAAA
@@ -540,7 +540,7 @@ oTW7tBCrAr/JoNOKGGwLByEAADs=
                url-current-mime-headers
                '(("content-transfer-encoding" . "base64")
                  ("content-type" . "image/gif"))))
-        ((string= "bW96aWxsYQ==" (base64-encode node))
+        ((string= "bW96aWxsYQ==" (base64-encode-string node))
          (insert
           "
 PGh0bWw+CiAgPGhlYWQ+CiAgICA8dGl0bGU+VGhlIEJvb2sgb2YgTW96aWxsYSwgMTg6Mjc8L3Rp

commit e8ef9257806ed3307cbc640d5eea7c74c48ef538
Author: William M. Perry <address@hidden>
Date:   Sun Dec 27 01:48:52 1998 +0000

    Added some aliases to work better with emacs/xemacs with native base64 
support.

diff --git a/lisp/base64.el b/lisp/base64.el
index 0f1f931..497bbf1 100644
--- a/lisp/base64.el
+++ b/lisp/base64.el
@@ -1,7 +1,7 @@
 ;;; base64.el,v --- Base64 encoding functions
 ;; Author: Kyle E. Jones
-;; Created: $Date: 1998/12/01 22:12:07 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1998/12/27 01:48:52 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: extensions
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -271,4 +271,7 @@ base64-encoder-program.")
        (buffer-string)
       (kill-buffer (current-buffer)))))  
 
+(defalias 'base64-encode 'base64-encode-string)
+(defalias 'base64-decode 'base64-decode-string)
+
 (provide 'base64)

commit 1b50b7244de5a1c130b7f2e4180cc9a9bf366c42
Author: William M. Perry <address@hidden>
Date:   Sat Dec 26 14:50:05 1998 +0000

    *** empty log message ***

diff --git a/lisp/url-ldap.el b/lisp/url-ldap.el
index 3099e11..544c9ea 100644
--- a/lisp/url-ldap.el
+++ b/lisp/url-ldap.el
@@ -1,7 +1,7 @@
 ;;; url-ldap.el --- LDAP Uniform Resource Locator retrieval code
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/26 02:40:13 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1998/12/26 14:50:05 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -32,10 +32,17 @@
 ;;
 ;; basic format is: ldap://host:port/dn?attributes?scope?filter?extensions
 ;;
-;;
 ;; Test URLs:
 ;; 
ldap://ldap.itd.umich.edu/cn%3Dumbflabmanager%2C%20ou%3DUser%20Groups%2C%20ou%3DGroups%2C%20o%3DUniversity%20of%20Michigan%2C%20c%3DUS
 ;; ldap://ldap.itd.umich.edu/o=University%20of%20Michigan,c=US
+;;
+;; For simple queries, I have verified compatibility with Netscape
+;; Communicator v4.5 under linux.
+;;
+;; For anything _useful_ though, like specifying the attributes,
+;; scope, filter, or extensions, netscape claims the URL format is
+;; unrecognized.  So I don't think it supports anything other than the
+;; defaults (scope=base,attributes=*,filter=(objectClass=*)
 
 (defvar url-ldap-default-host "ldap"
   "*Default LDAP server to contact when none has been specified in the URL.")

commit 93c9836c58ed0350e6633c1bab87bbd7e9d810ba
Author: William M. Perry <address@hidden>
Date:   Sat Dec 26 02:40:08 1998 +0000

    Added first cut at LDAP support.

diff --git a/ChangeLog b/ChangeLog
index f5d1914..aeb97bd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 1998-12-25  William M. Perry  <address@hidden>
 
+* lisp/url-ldap.el: New file to implement LDAP support ala RFC2255
+
+* lisp/url.el (url-do-setup): Register the LDAP URL handler if the feature 
+  is present.
+
 * Emacs/W3 4.0pre36 released
 
 * lisp/url.el (url-default-expander): Make sure that we remove any query
diff --git a/TODO b/TODO
index cea8795..f643a3c 100644
--- a/TODO
+++ b/TODO
@@ -3,8 +3,6 @@ BUGS (4.0):
 - When auto-loading the index.html file out of a directory, if the
   directory does not have the trailing '/', relative URL references
   are wrong.
-- Make sure that we pass all the relative URL expansion tests at
-  http://www.ics.uci.edu/%7Efielding/url/test1.html
 - /etc/mailcap cannot overide builtin mm-mime-data stuff?
 - try to protect people from using '~' in file URLs
 - keystrokes entered while in w3-pause self-insert under XEmacs - the
@@ -64,8 +62,6 @@ FEATURES (4.1)
 - keystrokes and supporting infrastructure to prefetch URLs from
   within a document that you are likely to read next.  Don't even parse
   or render them David Kastrup <address@hidden>
-- LDAP support (XEmacs)
-- New proxy type for sending requests via mail to a mail->web->mail gateway.
 - Emacspeak Interaction
   - some way of specifying in a stylesheet whether certain text is
     inaudible.  use the 'inaudible text property for this.
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index 1792aa6..771f5a1 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -26,7 +26,7 @@ URLSOURCES = \
        url-nfs.el url-file.el url-cookie.el url-parse.el url-irc.el    \
        url-gopher.el url-http.el url-mail.el url-misc.el url-news.el   \
        url-vars.el url-auth.el mm.el md5.el url-gw.el ssl.el base64.el \
-       url.el socks.el url-cache.el url-ns.el @CIDFILE@
+       url.el socks.el url-cache.el url-ns.el url-ldap.el @CIDFILE@
 
 URLOBJECTS    = $(URLSOURCES:.el=.elc)
 
diff --git a/lisp/url-ldap.el b/lisp/url-ldap.el
new file mode 100644
index 0000000..3099e11
--- /dev/null
+++ b/lisp/url-ldap.el
@@ -0,0 +1,176 @@
+;;; url-ldap.el --- LDAP Uniform Resource Locator retrieval code
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/26 02:40:13 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1998 - 1999 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'url-vars)
+(require 'url-parse)
+
+;; This has been implemented from RFC2255 'The LDAP URL Format' (Dec 1997)
+;;
+;; basic format is: ldap://host:port/dn?attributes?scope?filter?extensions
+;;
+;;
+;; Test URLs:
+;; 
ldap://ldap.itd.umich.edu/cn%3Dumbflabmanager%2C%20ou%3DUser%20Groups%2C%20ou%3DGroups%2C%20o%3DUniversity%20of%20Michigan%2C%20c%3DUS
+;; ldap://ldap.itd.umich.edu/o=University%20of%20Michigan,c=US
+
+(defvar url-ldap-default-host "ldap"
+  "*Default LDAP server to contact when none has been specified in the URL.")
+
+(defvar url-ldap-pretty-names
+  '(("l"           . "City")
+    ("objectClass" . "Object Class")
+    ("o"           . "Organization")
+    ("ou"          . "Organizational Unit")
+    ("mail"        . "Email")
+    ("c"           . "Country")
+    ("postalCode"  . "ZIP Code")
+    ("telephoneNumber" . "Phone Number")
+    ("postalAddress"   . "Mailing Address")
+    ("description"     . "Notes"))
+  "*An assoc list mapping LDAP attribute names to pretty descriptions of 
them.")
+
+(defvar url-ldap-attribute-formatters
+  '(("mail"       . (lambda (x) (format "<a href='mailto:%s'>%s</a>" x x)))
+    ("owner"      . url-ldap-dn-formatter)
+    ("member"     . url-ldap-dn-formatter))
+  "*An assoc list mapping LDAP attribute names to pretty formatters for them.")
+
+(defsubst url-ldap-attribute-pretty-name (n)
+  (or (cdr-safe (assoc n url-ldap-pretty-names)) n))
+
+(defsubst url-ldap-attribute-pretty-desc (n v)
+  (funcall (or (cdr-safe (assoc n url-ldap-attribute-formatters)) 'identity) 
v))
+
+(defun url-ldap-dn-formatter (dn)
+  (concat "<a href='/"
+         (url-hexify-string dn)
+         "'>" dn "</a>"))
+  
+(defun url-ldap (url)
+  (let* ((urlobj (url-generic-parse-url url))
+        (binddn nil)
+        (data (url-filename urlobj))
+        (host (url-host urlobj))
+        (port (url-port urlobj))
+        (base-object nil)
+        (attributes nil)
+        (scope nil)
+        (filter nil)
+        (extensions nil)
+        (connection nil)
+        (results nil))
+
+    ;; Get rid of leading /
+    (if (string-match "^/" data)
+       (setq data (substring data 1)))
+
+    ;; Fill in the default host
+    (if (not host)
+       (setq host url-ldap-default-host))
+
+    (setq data (mapcar (lambda (x) (if (/= (length x) 0) x nil)) (split-string 
data "\\?"))
+         base-object (nth 0 data)
+         attributes (nth 1 data)
+         scope (nth 2 data)
+         filter (nth 3 data)
+         extensions (nth 4 data))
+
+    ;; fill in the defaults
+    (setq base-object (url-unhex-string (or base-object ""))
+         scope (intern (url-unhex-string (or scope "base")))
+         filter (url-unhex-string (or filter "(objectClass=*)")))
+
+    (if (not (memq scope '(base one tree)))
+       (error "Malformed LDAP URL: Unknown scope: %S" scope))
+
+    ;; Convert to the internal LDAP support scoping names.
+    (setq scope (cdr (assq scope '((base . base) (one . onelevel) (sub . 
subtree)))))
+
+    (if attributes
+       (setq attributes (mapcar 'url-unhex-string (split-string attributes 
","))))
+
+    ;; Parse out the exentions
+    (if extensions
+       (setq extensions (mapcar (lambda (ext)
+                                  (if (string-match "\\([^=]*\\)=\\(.*\\)" ext)
+                                      (cons (match-string 1 ext) (match-string 
2 ext))
+                                    (cons ext ext)))
+                                (split-string extensions ","))
+             extensions (mapcar (lambda (ext)
+                                  (cons (url-unhex-string (car ext))
+                                        (url-unhex-string (cdr ext))))
+                                extensions)))
+
+    (setq binddn (cdr-safe (or (assoc "bindname" extensions)
+                              (assoc "!bindname" extensions))))
+    
+    ;; Now, let's actually do something with it.
+    (setq connection (ldap-open host (if binddn (list 'binddn binddn)))
+         results (ldap-search-internal connection filter base-object scope 
attributes nil))
+
+    (set-buffer (get-buffer-create url-working-buffer))
+    (erase-buffer)
+    (setq url-current-mime-type "text/html"
+         url-current-can-be-cached nil)
+    (insert "<html>\n"
+           " <head>\n"
+           "  <title>LDAP Search Results</title>\n"
+           "  <base href='" url "'>\n"
+           " </head>\n"
+           " <body>\n"
+           "  <h1>" (int-to-string (length results)) " matches</h1>\n")
+
+    (mapc (lambda (obj)
+           (insert "  <hr>\n"
+                   "  <table border=1>\n")
+           (mapc (lambda (attr)
+                   (if (= (length (cdr attr)) 1)
+                       ;; single match, easy
+                       (insert "   <tr><td>"
+                               (url-ldap-attribute-pretty-name (car attr))
+                               "</td><td>"
+                               (url-ldap-attribute-pretty-desc (car attr) (car 
(cdr attr)))
+                               "</td></tr>\n")
+                     ;; Multiple matches, slightly uglier
+                     (insert "   <tr>\n"
+                             (format "    <td valign=top>" (length (cdr attr)))
+                             (url-ldap-attribute-pretty-name (car attr)) 
"</td><td>"
+                             (mapconcat (lambda (x)
+                                          (url-ldap-attribute-pretty-desc (car 
attr) x))
+                                        (cdr attr)
+                                        "<br>\n")
+                             "</td>"
+                             "   </tr>\n")))
+                 obj)
+           (insert "  </table>\n"))
+         results)
+
+    (insert "  <hr>\n"
+           " </body>\n"
+           "</html>\n")))
+
+(provide 'url-ldap)
diff --git a/lisp/url.el b/lisp/url.el
index e30b24c..b61fa65 100644
--- a/lisp/url.el
+++ b/lisp/url.el
@@ -1,13 +1,13 @@
 ;;; url.el --- Uniform Resource Locator retrieval tool
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/25 21:54:57 $
-;; Version: $Revision: 1.3 $
+;; Created: $Date: 1998/12/26 02:40:13 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;; LCD Archive Entry:
 ;;; url|William M. Perry|address@hidden|
 ;;; Functions for retrieving/manipulating URLs|
-;;; $Date: 1998/12/25 21:54:57 $|$Revision: 1.3 $|Location Undetermined
+;;; $Date: 1998/12/26 02:40:13 $|$Revision: 1.4 $|Location Undetermined
 ;;;
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -104,6 +104,9 @@
 (autoload 'url-nntp "url-news")
 (autoload 'url-cid "url-cid")
 
+(if (featurep 'ldap)
+    (autoload 'url-ldap "url-ldap"))
+
 (autoload 'url-open-stream "url-gw")
 (autoload 'url-mime-response-p "url-http")
 (autoload 'url-parse-mime-headers "url-http")
@@ -923,6 +926,8 @@ dumped with emacs."
     (url-register-protocol 'telnet)
     (url-register-protocol 'tn3270)
     (url-register-protocol 'proxy)
+    (if (featurep 'ldap)
+       (url-register-protocol 'ldap))
     (url-register-protocol 'auto 'url-handle-no-scheme)
 
     ;; Register all the authentication schemes we can handle

commit a635f6569162ee1c92a88fcd9dfabec832345ded
Author: William M. Perry <address@hidden>
Date:   Fri Dec 25 22:17:13 1998 +0000

    *** empty log message ***

diff --git a/.version b/.version
index 8f92bfd..7facc89 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-35
+36
diff --git a/ChangeLog b/ChangeLog
index e2eeda3..f5d1914 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 1998-12-25  William M. Perry  <address@hidden>
 
+* Emacs/W3 4.0pre36 released
+
 * lisp/url.el (url-default-expander): Make sure that we remove any query
   strings from the URL before we remove relative links.
   (url-remove-relative-links): Tack on a trailing '/' if necessary so that 

commit 00d2319dc3b7bb55c9ff1ce25783ae3932274085
Author: William M. Perry <address@hidden>
Date:   Fri Dec 25 21:54:53 1998 +0000

    * lisp/url.el (url-default-expander): Make sure that we remove any query
      strings from the URL before we remove relative links.
      (url-remove-relative-links): Tack on a trailing '/' if necessary so that
      we don't fail any URL parsing tests on things like 'g/.', which should
      be normalized to just 'g/'
    
    Added new 'tests' subdirectory that will include any HTML files or
    lisp that helps to detect or demonstrate current bugs.

diff --git a/ChangeLog b/ChangeLog
index 41022c7..e2eeda3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,34 @@
+1998-12-25  William M. Perry  <address@hidden>
+
+* lisp/url.el (url-default-expander): Make sure that we remove any query
+  strings from the URL before we remove relative links.
+  (url-remove-relative-links): Tack on a trailing '/' if necessary so that 
+  we don't fail any URL parsing tests on things like 'g/.', which should
+  be normalized to just 'g/'
+
+1998-12-24  William M. Perry  <address@hidden>
+
+* lisp/url-cookie.el (url-cookie-host-can-set-p): Fixed cookie
+  vulnerability as described in
+  http://www.paradise.net.nz/~glineham/cookiemonster.html
+
+1998-12-23  Markus Rost  <address@hidden>
+
+* w3-menu.el (w3-menu-initialize-w3-mode-menu-map): Block also
+  the global menubar entry [menubar mule].
+
+1998-12-23  William M. Perry  <address@hidden>
+
+* lisp/w3-cus.el (w3-force-conversion-alist): Mixed mismatched custom type
+  (w3-default-stylesheet): Ditto.
+  (w3-html-errors-font-lock-keywords): Ditto.
+  (w3-default-configuration-file): Ditto.
+  (w3-modeline-format): Ditto.
+
 1998-12-22  William M. Perry  <address@hidden>
 
+* Emacs/W3 4.0pre35 released
+
 * lisp/w3-display.el (w3-get-default-color): Function to get the default
   foreground or background color, even if face-(fore|back)ground returns
   nil, which it does under Emacs fairly often.  We fall back to getting
diff --git a/lisp/url.el b/lisp/url.el
index 42be156..e30b24c 100644
--- a/lisp/url.el
+++ b/lisp/url.el
@@ -1,13 +1,13 @@
 ;;; url.el --- Uniform Resource Locator retrieval tool
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/22 20:42:34 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1998/12/25 21:54:57 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;; LCD Archive Entry:
 ;;; url|William M. Perry|address@hidden|
 ;;; Functions for retrieving/manipulating URLs|
-;;; $Date: 1998/12/22 20:42:34 $|$Revision: 1.2 $|Location Undetermined
+;;; $Date: 1998/12/25 21:54:57 $|$Revision: 1.3 $|Location Undetermined
 ;;;
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1133,7 +1133,8 @@ path components followed by `..' are removed, along with 
the `..' itself."
                           (url-strip-leading-spaces
                            (url-eat-trailing-space url)) "")))
   (cond
-   ((null url) nil)                    ; Something hosed!  Be graceful
+   ((= (length url) 0)                 ; nil or empty string
+    default)
    ((string-match "^#" url)            ; Offset link, use it raw
     url)
    (t
@@ -1161,23 +1162,33 @@ path components followed by `..' are removed, along 
with the `..' itself."
 
 (defun url-default-expander (urlobj defobj)
   ;; The default expansion routine - urlobj is modified by side effect!
-  (url-set-type urlobj (or (url-type urlobj) (url-type defobj)))
-  (url-set-port urlobj (or (url-port urlobj)
-                          (and (string= (url-type urlobj)
-                                        (url-type defobj))
-                               (url-port defobj))))
-  (if (not (string= "file" (url-type urlobj)))
-      (url-set-host urlobj (or (url-host urlobj) (url-host defobj))))
-  (if (string= "ftp"  (url-type urlobj))
-      (url-set-user urlobj (or (url-user urlobj) (url-user defobj))))
-  (if (string= (url-filename urlobj) "")
-      (url-set-filename urlobj "/"))
-  (if (string-match "^/" (url-filename urlobj))
+  (if (url-type urlobj)
+      ;; Well, they told us the scheme, let's just go with it.
       nil
-    (url-set-filename urlobj
-                     (url-remove-relative-links
-                      (concat (url-basepath (url-filename defobj))
-                              (url-filename urlobj))))))
+    (url-set-type urlobj (or (url-type urlobj) (url-type defobj)))
+    (url-set-port urlobj (or (url-port urlobj)
+                            (and (string= (url-type urlobj)
+                                          (url-type defobj))
+                                 (url-port defobj))))
+    (if (not (string= "file" (url-type urlobj)))
+       (url-set-host urlobj (or (url-host urlobj) (url-host defobj))))
+    (if (string= "ftp"  (url-type urlobj))
+       (url-set-user urlobj (or (url-user urlobj) (url-user defobj))))
+    (if (string= (url-filename urlobj) "")
+       (url-set-filename urlobj "/"))
+    (if (string-match "^/" (url-filename urlobj))
+       nil
+      (let ((query nil)
+           (file nil)
+           (sepchar nil))
+       (if (string-match "[?#]" (url-filename urlobj))
+           (setq query (substring (url-filename urlobj) (match-end 0))
+                 file (substring (url-filename urlobj) 0 (match-beginning 0))
+                 sepchar (substring (url-filename urlobj) (match-beginning 0) 
(match-end 0)))
+         (setq file (url-filename urlobj)))
+       (setq file (url-remove-relative-links
+                   (concat (url-basepath (url-filename defobj)) file)))
+       (url-set-filename urlobj (if query (concat file sepchar query) 
file))))))
 
 (defun url-identity-expander (urlobj defobj)
   (url-set-type urlobj (or (url-type urlobj) (url-type defobj))))
@@ -1404,12 +1415,25 @@ forbidden in URL encoding."
   (let ((new (if (not (string-match "^/" name))
                 (concat "/" name)
               name)))
+
+    ;; If it ends with a '/.' or '/..', tack on a trailing '/' sot hat
+    ;; the tests that follow are not too complicated in terms of
+    ;; looking for '..' or '../', etc.
+    (if (string-match "/\\.+$" new)
+       (setq new (concat new "/")))
+
+    ;; Remove '/./' first
     (while (string-match "/\\(\\./\\)" new)
       (setq new (concat (substring new 0 (match-beginning 1))
                        (substring new (match-end 1)))))
+
+    ;; Then remove '/../'
     (while (string-match "/\\([^/]*/\\.\\./\\)" new)
       (setq new (concat (substring new 0 (match-beginning 1))
                        (substring new (match-end 1)))))
+
+    ;; Remove cruft at the beginning of the string, so people that put
+    ;; in extraneous '..' because they are morons won't lose.
     (while (string-match "^/\\.\\.\\(/\\)" new)
       (setq new (substring new (match-beginning 1) nil)))
     new))
diff --git a/tests/borderless-tables.html b/tests/borderless-tables.html
new file mode 100644
index 0000000..f732d2d
--- /dev/null
+++ b/tests/borderless-tables.html
@@ -0,0 +1,77 @@
+<xmp>
+In the following page (http://www.mit.edu/) there are several display botches.
+
+1) The <li> doesn't line up.
+2) The pictures in the second table aren't aligned
+3) The second table is wider than the display (80 characters)
+
+Notice they all go away in the second rendering in which borders are forced
+on. I think this is all related to the new code to skip the extra spaces when
+borders are turned off. 
+
+                                  GIF GIF
+
+     This is a student maintained web server, run by the Student Information   
+ Processing Board (SIPB) at the Massachusetts Institute of Technology (MIT). 
+     For official information about MIT see the links below or visit the     
+                    official MIT homepage at web.mit.edu.                    
+       -------------------------------------------------------------------     
+             Of Interest:    o MIT Party/Events Listing                        
+                           o New Help Pages                                  
+       -------------------------------------------------------------------     
+
+        GIF               GIF                 GIF         GIF            GIF   
    
+  Personal Home     Groups and          Web         Content        Help      
+  Pages             Activities          Services                             
+            ------------------------------------------------------------------ 
    
+        Official Information                                                   
    
+        GIF               GIF                 GIF         GIF            GIF   
    
+  Academics         Admissions          Research    Administration Campus    
+                                                                   map       
+            ------------------------------------------------------------------ 
    
+                                                   Maintained by 
address@hidden 
+
+Here's another rendering with w3-display-table-force-borders turned on:
+
+                                  GIF GIF
+
++---------------------------------------------------------------------------+
+|  This is a student maintained web server, run by the Student Information  |
+|Processing Board (SIPB) at the Massachusetts Institute of Technology (MIT).|
+|    For official information about MIT see the links below or visit the    |
+|                   official MIT homepage at web.mit.edu.                   |
+|---------------------------------------------------------------------------|
+|    -------------------------------------------------------------------    |
+|---------------------------------------------------------------------------|
+|          Of Interest:|   o MIT Party/Events Listing                       |
+|                      |   o New Help Pages                                 |
+|---------------------------------------------------------------------------|
+|    -------------------------------------------------------------------    |
++---------------------------------------------------------------------------+
+
+ +--------------------------------------------------------------------------+
+ |GIF              |GIF                |GIF        |GIF           |GIF      |
+ |Personal Home    |Groups and         |Web        |Content       |Help     |
+ |Pages            |Activities         |Services   |              |         |
+ |--------------------------------------------------------------------------|
+ |    ------------------------------------------------------------------    |
+ |--------------------------------------------------------------------------|
+ |Official Information                                                      |
+ |--------------------------------------------------------------------------|
+ |GIF              |GIF                |GIF        |GIF           |GIF      |
+ |Academics        |Admissions         |Research   |Administration|Campus   |
+ |                 |                   |           |              |map      |
+ |--------------------------------------------------------------------------|
+ |    ------------------------------------------------------------------    |
+ |--------------------------------------------------------------------------|
+ |                                           Maintained by address@hidden|
+ +--------------------------------------------------------------------------+
+</xmp>
+
+<table border=0>
+<tr><td>text <br>in col1</td><td>text<br>in col2</td></tr>
+</table>
+
+<table border=1>
+<tr><td>text <br>in col1</td><td>text<br>in col2</td></tr>
+</table>
diff --git a/tests/url-expansion.html b/tests/url-expansion.html
new file mode 100644
index 0000000..95fedbe
--- /dev/null
+++ b/tests/url-expansion.html
@@ -0,0 +1,194 @@
+<HTML><HEAD>
+<TITLE>Examples of Resolving Relative URLs</TITLE>
+<BASE href="http://a/b/c/d;p?q";>
+</HEAD><BODY>
+<H1>Examples of Resolving Relative URLs</H1>
+
+This document has an embedded base URL of
+<PRE>
+   Content-Base: http://a/b/c/d;p?q
+</PRE>
+the relative URLs should be resolved as shown below.
+<P>
+I will need your help testing the examples on multiple browsers. 
+What you need to do is point to the example anchor and compare it to the
+resolved URL in your browser (most browsers have a feature by which you
+can see the resolved URL at the bottom of the window/screen when the anchor
+is active).
+
+<H2>Tested Clients and Client Libraries</H2>
+
+<DL COMPACT>
+<DT>[R]
+<DD>RFC 2396 (the right way to parse)
+<DT>[X]
+<DD>RFC 1808
+<DT>[1]
+<DD>Mozilla/4.03 [en] (X11; U; SunOS 5.5 sun4u; Nav)
+<DT>[2]
+<DD>Lynx/2.7.1 libwww-FM/2.14
+<DT>[3]
+<DD>MSIE 3.01; Windows 95
+<DT>[4]
+<DD>NCSA_Mosaic/2.6 (X11;SunOS 4.1.2 sun4m) libwww/2.12
+<DT>[5]
+<DD>libwww-perl/5.14 [Martijn Koster]
+</DL>
+
+<H2>Normal Examples</H2>
+<PRE>
+              RESULTS                     from
+ 
+<a href="g:h">g:h</a>        =  g:h                         [R,X,2,3,4,5]
+              http://a/b/c/g:h            [1]
+
+<a href="g">g</a>          =  http://a/b/c/g              [R,X,1,2,3,4,5]
+
+<a href="./g">./g</a>        =  http://a/b/c/g              [R,X,1,2,3,4,5]
+
+<a href="g/">g/</a>         =  http://a/b/c/g/             [R,X,1,2,3,4,5]
+
+<a href="/g">/g</a>         =  http://a/g                  [R,X,1,2,3,4,5]
+
+<a href="//g">//g</a>        =  http://g                    [R,X,1,2,3,4,5]
+
+<a href="?y">?y</a>         =  http://a/b/c/?y             [R,1,2,3,4]
+              http://a/b/c/d;p?y          [X,5]
+
+<a href="g?y">g?y</a>        =  http://a/b/c/g?y            [R,X,1,2,3,4,5]
+
+<a name="s" href="#s">#s</a>         =  (current document)#s        [R,2,4]
+              http://a/b/c/d;p?q#s        [X,1,3,5]
+
+<a href="g#s">g#s</a>        =  http://a/b/c/g#s            [R,X,1,2,3,4,5]
+
+<a href="g?y#s">g?y#s</a>      =  http://a/b/c/g?y#s          [R,X,1,2,3,4,5]
+
+<a href=";x">;x</a>         =  http://a/b/c/;x             [R,1,2,3,4]
+              http://a/b/c/d;x            [X,5]
+
+<a href="g;x">g;x</a>        =  http://a/b/c/g;x            [R,X,1,2,3,4,5]
+
+<a href="g;x?y#s">g;x?y#s</a>    =  http://a/b/c/g;x?y#s        [R,X,1,2,3,4,5]
+
+<a href=".">.</a>          =  http://a/b/c/               [R,X,2,5]
+              http://a/b/c/.              [1]
+              http://a/b/c                [3,4]
+
+<a href="./">./</a>         =  http://a/b/c/               [R,X,1,2,3,4,5]
+
+<a href="..">..</a>         =  http://a/b/                 [R,X,2,5]
+              http://a/b                  [1,3,4]
+
+<a href="../">../</a>        =  http://a/b/                 [R,X,1,2,3,4,5]
+
+<a href="../g">../g</a>       =  http://a/b/g                [R,X,1,2,3,4,5]
+
+<a href="../..">../..</a>      =  http://a/                   [R,X,2,5]
+              http://a                    [1,3,4]
+
+<a href="../../">../../</a>     =  http://a/                   [R,X,1,2,3,4,5]
+
+<a href="../../g">../../g</a>    =  http://a/g                  [R,X,1,2,3,4,5]
+</PRE>
+
+<H2>Abnormal Examples</H2>
+
+Although the following abnormal examples are unlikely to occur in
+normal practice, all URL parsers should be capable of resolving them
+consistently.  Each example uses the same base as above.<P>
+
+An empty reference refers to the start of the current document.
+<PRE>
+<a href="">&lt;&gt;</a>         =  (current document)          [R,2,4]
+              http://a/b/c/d;p?q          [X,3,5]
+              http://a/b/c/               [1]
+</PRE>
+Parsers must be careful in handling the case where there are more
+relative path ".." segments than there are hierarchical levels in the
+base URL's path.  Note that the ".." syntax cannot be used to change
+the site component of a URL.
+<PRE>
+<a href="../../../g">../../../g</a>    =  http://a/../g            [R,X,2,4,5]
+                 http://a/g               [R,1,3]
+
+<a href="../../../../g">../../../../g</a> =  http://a/../../g         
[R,X,2,4,5]
+                 http://a/g               [R,1,3]
+</PRE>
+In practice, some implementations strip leading relative symbolic
+elements (".", "..") after applying a relative URL calculation, based
+on the theory that compensating for obvious author errors is better
+than allowing the request to fail.  Thus, the above two references
+will be interpreted as "http://a/g"; by some implementations.
+<P>
+Similarly, parsers must avoid treating "." and ".." as special when
+they are not complete components of a relative path.
+<PRE>
+<a href="/./g">/./g</a>      =  http://a/./g                 [R,X,2,3,4,5]
+             http://a/g                   [1]
+
+<a href="/../g">/../g</a>     =  http://a/../g                [R,X,2,3,4,5]
+             http://a/g                   [1]
+
+<a href="g.">g.</a>        =  http://a/b/c/g.              [R,X,1,2,3,4,5]
+
+<a href=".g">.g</a>        =  http://a/b/c/.g              [R,X,1,2,3,4,5]
+
+<a href="g..">g..</a>       =  http://a/b/c/g..             [R,X,1,2,3,4,5]
+
+<a href="..g">..g</a>       =  http://a/b/c/..g             [R,X,1,2,3,4,5]
+</PRE>
+Less likely are cases where the relative URL uses unnecessary or
+nonsensical forms of the "." and ".." complete path segments.
+<PRE>
+<a href="./../g">./../g</a>     =  http://a/b/g                [R,X,1,2,5]
+              http://a/b/c/../g           [3,4]
+
+<a href="./g/.">./g/.</a>      =  http://a/b/c/g/             [R,X,2,5]
+              http://a/b/c/g/.            [1]
+              http://a/b/c/g              [3,4]
+
+<a href="g/./h">g/./h</a>      =  http://a/b/c/g/h            [R,X,1,2,3,4,5]
+
+<a href="g/../h">g/../h</a>     =  http://a/b/c/h              [R,X,1,2,3,4,5]
+
+<a href="g;x=1/./y">g;x=1/./y</a>  =  http://a/b/c/g;x=1/y        [R,1,2,3,4]
+              http://a/b/c/g;x=1/./y      [X,5]
+
+<a href="g;x=1/../y">g;x=1/../y</a> =  http://a/b/c/y              [R,1,2,3,4]
+              http://a/b/c/g;x=1/../y     [X,5]
+
+</PRE>
+All client applications remove the query component from the base URL
+before resolving relative URLs.  However, some applications fail to
+separate the reference's query and/or fragment components from a
+relative path before merging it with the base path.  This error is
+rarely noticed, since typical usage of a fragment never includes the
+hierarchy ("/") character, and the query component is not normally
+used within relative references.
+<PRE>
+<a href="g?y/./x">g?y/./x</a>    =  http://a/b/c/g?y/./x        [R,X,5]
+              http://a/b/c/g?y/x          [1,2,3,4]
+
+<a href="g?y/../x">g?y/../x</a>   =  http://a/b/c/g?y/../x       [R,X,5]
+              http://a/b/c/x              [1,2,3,4]
+
+<a href="g#s/./x">g#s/./x</a>    =  http://a/b/c/g#s/./x        [R,X,2,3,4,5]
+              http://a/b/c/g#s/x          [1]
+
+<a href="g#s/../x">g#s/../x</a>   =  http://a/b/c/g#s/../x       [R,X,2,3,4,5]
+              http://a/b/c/x              [1]
+</PRE>
+   Some parsers allow the scheme name to be present in a relative URI if
+   it is the same as the base URI scheme.  This is considered to be a
+   loophole in prior specifications of partial URI [RFC1630]. Its use
+   should be avoided.
+<PRE>
+<a href="http:g">http:g</a>    =  http:g                       [R,X,5]
+          |  http://a/b/c/g               [1,2,3,4]  (ok for compat.)
+
+<a href="http:">http:</a>     =  http:                        [R,X,5]
+             http://a/b/c/                [1]
+             http://a/b/c/d;p?q           [2,3,4]
+</PRE>
+</BODY></HTML>
diff --git a/tests/url-test.el b/tests/url-test.el
new file mode 100644
index 0000000..7060172
--- /dev/null
+++ b/tests/url-test.el
@@ -0,0 +1,88 @@
+;; This test suite derived from:
+;; http://www.ics.uci.edu/%7Efielding/url/test1.html
+
+(defun url-parsing-test-suite ()
+  (interactive)
+  (let* ((base-url "http://a/b/c/d;p?q";)
+        (tests `(
+                 ;; Normal examples
+                 ("g:h" . "g:h")
+                 ("g"   . "http://a/b/c/g";)
+                 ("./g" . "http://a/b/c/g";)
+                 ("g/"  . "http://a/b/c/g/";)
+                 ("/g"  . "http://a/g";)
+                 ("//g" . "http://g";)
+                 ("?y"  . "http://a/b/c/?y";)
+                 ("g?y" . "http://a/b/c/g?y";)
+                 ("#s"  . "#s")
+                 ("g#s" . "http://a/b/c/g#s";)
+                 ("g?y#s" . "http://a/b/c/g?y#s";)
+                 (";x"    . "http://a/b/c/;x";)
+                 ("g;x"   . "http://a/b/c/g;x";)
+                 ("g;x?y#s" . "http://a/b/c/g;x?y#s";)
+                 ("."       . "http://a/b/c/";)
+                 ("./"      . "http://a/b/c/";)
+                 (".."      . "http://a/b/";)
+                 ("../"     . "http://a/b/";)
+                 ("../g"    . "http://a/b/g";)
+                 ("../.."   . "http://a/";)
+                 ("../../"  . "http://a/";)
+                 ("../../g" . "http://a/g";)
+
+                 ;; Abnormal examples
+                 ("" . ,base-url)
+                 ("../../../g" . ("http://a/g"; "http://a/../g";))
+                 ("../../../../g" . ("http://a/g"; "http://a/../../g";))
+                 ("/./g" . "http://a/./g";)
+                 ("/../g" . "http://a/../g";)
+                 ("g." . "http://a/b/c/g.";)
+                 (".g" . "http://a/b/c/.g";)
+                 ("g.." . "http://a/b/c/g..";)
+                 ("..g" . "http://a/b/c/..g";)
+                 ("./../g" . "http://a/b/g";)
+                 ("./g/."  . "http://a/b/c/g/";)
+                 ("g/./h"  . "http://a/b/c/g/h";)
+                 ("g/../h" . "http://a/b/c/h";)
+                 ("g;x=1/./y" . "http://a/b/c/g;x=1/y";)
+                 ("g;x=1/../y" . "http://a/b/c/y";)
+
+                 ;; Query stuff
+                 ("g?y/./x" . "http://a/b/c/g?y/./x";)
+                 ("g?y/../x" . "http://a/b/c/g?y/../x";)
+                 ("g#s/./x" . "http://a/b/c/g#s/./x";)
+                 ("g#s/../x" . "http://a/b/c/g#s/../x";)
+
+                 ;; RFC1630 lossage
+                 ("http:g" . ("http:g" "http://a/b/c/g";))
+                 ("http:"  . "http:")
+                 )
+               )
+        (results nil))
+    (setq results (mapcar
+                  (lambda (test)
+                    (let ((url (url-expand-file-name (car test) base-url))
+                          (expected (cdr test))
+                          (ok nil))
+                      (if (stringp expected)
+                          (setq ok (string-equal url expected))
+                        (while (and expected (not ok))
+                          (if (string= (car expected) url)
+                              (setq ok t))
+                          (setq expected (cdr expected))))
+                      (or ok (list test url))))
+                  tests)
+         results (delq t results))
+    (if (not results)
+       (message "All tests passed successfully!")
+      (set-buffer (get-buffer-create "Test Results"))
+      (erase-buffer)
+      (mapcar
+       (lambda (err)
+        (insert (format "Failed to expand `%s' - expecting `%s' - got `%s'\n"
+                        (car (car err))
+                        (if (stringp (cdr (car err)))
+                            (cdr (car err))
+                          (mapconcat 'identity (cdr (car err)) "' or `"))
+                        (cdr err))))
+       results)
+      (display-buffer (current-buffer)))))

commit 62753afa11bc4e87a44ddd5e46743431cef086c7
Author: William M. Perry <address@hidden>
Date:   Thu Dec 24 19:29:26 1998 +0000

    Fixed cookie vulnerability as described in
    http://www.paradise.net.nz/~glineham/cookiemonster.html

diff --git a/lisp/url-cookie.el b/lisp/url-cookie.el
index 59bf442..d428f64 100644
--- a/lisp/url-cookie.el
+++ b/lisp/url-cookie.el
@@ -1,14 +1,14 @@
 ;;; url-cookie.el --- Netscape Cookie support
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:08 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1998/12/24 19:29:26 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;; This file is part of GNU Emacs.
 ;;;
 ;;; GNU Emacs is free software; you can redistribute it and/or modify
 ;;; it under the terms of the GNU General Public License as published by
@@ -285,7 +285,7 @@
        (last nil)
        (case-fold-search t)
        (mindots 3))
-    (while (setq last (string-match "\\." host last))
+    (while (setq last (string-match "\\." domain last))
       (setq numdots (1+ numdots)
            last (1+ last)))
     (if (string-match url-cookie-two-dot-domains domain)
@@ -293,10 +293,12 @@
     (cond
      ((string= host domain)            ; Apparently netscape lets you do this
       t)
-     ((< numdots mindots)              ; Not enough dots in domain name!
-      nil)
+     ((>= numdots mindots)             ; We have enough dots in domain name
+      ;; Need to check and make sure the host is actually _in_ the
+      ;; domain it wants to set a cookie for though.
+      (string-match (concat (regexp-quote domain) "$") host))
      (t
-      (string-match (concat (regexp-quote domain) "$") host)))))
+      nil))))
 
 (defun url-header-comparison (x y)
   (string= (downcase x) (downcase y)))

commit 739797cadd6d16bc983ad4d5071f4424e7e7dcc8
Author: William M. Perry <address@hidden>
Date:   Wed Dec 23 19:34:05 1998 +0000

    Patch from Markus Rost  <address@hidden>
    
        * w3-menu.el (w3-menu-initialize-w3-mode-menu-map): Block also
        the global menubar entry [menubar mule].

diff --git a/lisp/w3-menu.el b/lisp/w3-menu.el
index 6cf8c20..891994d 100644
--- a/lisp/w3-menu.el
+++ b/lisp/w3-menu.el
@@ -1,12 +1,12 @@
 ;;; w3-menu.el --- Menu functions for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:11 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1998/12/23 19:34:05 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: menu, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -512,6 +512,7 @@ on that platform."
        (define-key map [rootmenu w3 edit] 'undefined)
        (define-key map [rootmenu w3 options] 'undefined)
        (define-key map [rootmenu w3 buffer] 'undefined)
+       (define-key map [rootmenu w3 mule] 'undefined)
        (define-key map [rootmenu w3 tools] 'undefined)
        (define-key map [rootmenu w3 help] 'undefined)
        (define-key map [rootmenu w3 help-menu] 'undefined)

commit 688a936239cf149d1f126115ef00a6646d950ed7
Author: William M. Perry <address@hidden>
Date:   Wed Dec 23 14:19:56 1998 +0000

    Fixed mismatches in several customizations.

diff --git a/lisp/w3-cus.el b/lisp/w3-cus.el
index 812d2c7..8d285cb 100644
--- a/lisp/w3-cus.el
+++ b/lisp/w3-cus.el
@@ -1,12 +1,12 @@
 ;;; w3-cus.el --- Customization support for Emacs-W3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:10 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1998/12/23 14:19:56 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: comm, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -37,6 +37,8 @@
     (defmacro defcustom (var value doc &rest args) 
       (` (defvar (, var) (, value) (, doc))))))
 
+(require 'mule-sysdp)
+
 (defgroup w3 '((url custom-group))
   "Emacs-W3 - the web browser of choice."
   :group 'hypermedia)
@@ -82,10 +84,12 @@
   :group 'w3-files
   :type 'directory)  
 
-(defcustom w3-default-configuration-file nil
-  "*Where per-user customizations of w3 are kept."
+(defcustom w3-default-configuration-file "profile"
+  "*Base filename where per-user customizations are kept.
+This filename is relative to `w3-configuration-directory' if
+not fully specified."
   :group 'w3-files
-  :type 'file)
+  :type 'string)
 
 (defcustom w3-default-homepage nil
   "*The url to open at startup.  It can be any valid URL.
@@ -98,7 +102,8 @@ default to  the hypertext documentation for W3 at Indiana 
University."
 (defcustom w3-default-stylesheet nil
   "*The filename of the users default stylesheet."
   :group 'w3-files
-  :type 'file)
+  :type '(choice (const :tag "None" :value nil)
+                (file)))
 
 (defcustom w3-hotlist-file nil
   "*Hotlist filename.
@@ -141,7 +146,9 @@ t           display frame hyperlinks and fetch them."
   "*An assoc list of unordered list types mapping to characters to use
 as the bullet character."
   :group 'w3-display
-  :type 'list)
+  :type '(repeat (cons :format "%v"
+                      (symbol :tag "Type")
+                      (character :tag "Character"))))
 
 (defcustom w3-echo-link '(title url text name)
   "*Whether to display the URL of a link when tabbing through links.
@@ -174,7 +181,8 @@ If nil W3 will use a terminal graphic character if 
possible."
 (defcustom w3-force-conversion-alist nil
   "*An assoc list of URL host/filename regexps and coding systems in which to 
force conversion in Mule"
   :group 'w3-display
-  :type 'list)
+  :type `(repeat (cons (string :tag "Host / filename")
+                      (symbol :tag "Coding system" :value 
,mule-no-coding-system))))
 
 ;;; these three variables control how w3-setup-terminal-chars works
 (defcustom w3-use-terminal-characters t
@@ -387,7 +395,7 @@ of the menu."
        "%p" "  " global-mode-string))
   "*The modeline format string when in w3 mode"
   :group 'w3-advanced
-  :type 'list)
+  :type 'sexp)
 
 (defcustom w3-netscape-compatible-comments t
   "*Whether to honor netscape-style <! > comments.
@@ -467,7 +475,8 @@ and used as the new fill-column."
   "*Maximum length of a line.
 If nil, then lines can extend all the way to the window margin."
   :group 'w3-display
-  :type 'integer)
+  :type '(radio (const :tag "Use all available space" :value nil)
+               (integer :tag "Limit to")))
 
 (defcustom w3-track-mouse t
   "*Whether to track the mouse and message the url under the mouse."
@@ -543,7 +552,7 @@ Certain fonts can cause problems under Emacs."
     ("\\*ERROR\\*" 0 font-lock-keyword-face t))
   "*Font locking keywords used for HTML error display"
   :group 'w3
-  :type 'list)
+  :type 'sexp)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Internationalization

commit 736c47ece4e1cedc233eb4ef3f14b2d506196982
Author: William M. Perry <address@hidden>
Date:   Wed Dec 23 00:50:27 1998 +0000

    *** empty log message ***

diff --git a/.version b/.version
index a787364..8f92bfd 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-34
+35
diff --git a/ChangeLog b/ChangeLog
index defd964..41022c7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 1998-12-22  William M. Perry  <address@hidden>
 
+* lisp/w3-display.el (w3-get-default-color): Function to get the default
+  foreground or background color, even if face-(fore|back)ground returns
+  nil, which it does under Emacs fairly often.  We fall back to getting
+  the colors out of the frame properties.  I think this is gross, but oh
+  well.
+  (w3-display-background-useless-p): Use it.
+  (w3-display-foreground-useless-p): Use it.
+
 * lisp/w3.el (w3-reload-document): Avoid using interactive spec 'Z', since 
   it doesn't exist in older versions of Emacs (19.xx)
 

commit 567616c5a13bcad583a5c92f131e5849ebf894af
Author: William M. Perry <address@hidden>
Date:   Wed Dec 23 00:48:33 1998 +0000

    Make sure that we provide WIDGETDIR and friends to the 'fast' target
    building, or else the new logic/safety checks in docomp.el will always
    fail.

diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index 8c636e6..1792aa6 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -85,7 +85,7 @@ xemacs-w3: $(ALLSOURCES) $(ALLOBJECTS)
        @echo Build of w3 complete...
 
 fast:  $(ALLSOURCES) $(EXTRAS)
-       $(EMACS) $(BATCHFLAGS) $(DEPS) -f batch-byte-compile $(ALLSOURCES)
+       GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) W3SRCDIR=$(srcdir) $(EMACS) 
$(BATCHFLAGS) $(DEPS) -f batch-byte-compile $(ALLSOURCES)
        @echo Build of w3 complete...
 
 autoloads:

commit a0d280f6c1e92c26d4a18f8cd06187f6bc055bdc
Author: William M. Perry <address@hidden>
Date:   Wed Dec 23 00:38:55 1998 +0000

    * lisp/w3-display.el (w3-get-default-color): Function to get the default
      foreground or background color, even if face-(fore|back)ground returns
      nil, which it does under Emacs fairly often.  We fall back to getting
      the colors out of the frame properties.  I think this is gross, but oh
      well.
      (w3-display-background-useless-p): Use it.
      (w3-display-foreground-useless-p): Use it.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index 086d95d..7d48e5c 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,7 +1,7 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/22 20:43:22 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1998/12/23 00:38:55 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -259,19 +259,26 @@
   ;; within some user-configurable delta?
   (equal foreground background))
 
+(defun w3-get-default-color (backgroundp)
+  (if w3-running-xemacs
+      (or (if backgroundp
+             (face-background-name 'default)
+           (face-foreground-name 'default))
+         (frame-property nil (if backgroundp 'background-color 
'foreground-color)))
+      (or (if backgroundp
+             (face-background 'default)
+           (face-foreground 'default))
+         (frame-parameter nil (if backgroundp 'background-color 
'foreground-color)))))
+
 (defun w3-display-background-useless-p (color)
   (let ((foreground-color (font-color-rgb-components
-                          (if (fboundp 'face-foreground-name)
-                              (face-foreground-name 'default)
-                            (face-foreground 'default))))
+                          (w3-get-default-color nil)))
        (background-color (font-color-rgb-components color)))
     (w3-display-colors-too-close-p foreground-color background-color)))
 
 (defun w3-display-foreground-useless-p (color)
   (let ((background-color (font-color-rgb-components
-                          (if (fboundp 'face-background-name)
-                              (face-background-name 'default)
-                            (face-background 'default))))
+                          (w3-get-default-color t)))
        (foreground-color (font-color-rgb-components color)))
     (w3-display-colors-too-close-p foreground-color background-color)))
 

commit 72c11323ebe02e8bf885fe5507b2e39017e90501
Author: William M. Perry <address@hidden>
Date:   Tue Dec 22 20:46:33 1998 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index c911162..defd964 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,46 @@
+1998-12-22  William M. Perry  <address@hidden>
+
+* lisp/w3.el (w3-reload-document): Avoid using interactive spec 'Z', since 
+  it doesn't exist in older versions of Emacs (19.xx)
+
+* lisp/w3-parse.el (w3-parse-buffer): Add ',' to the `whitespace' at the
+  front of an attribute that we should skip over.  This is so that people
+  can do horrible nasty things like <input type="foo", name="bar"> and
+  still have it work.  Sometimes I feel so... unclean.
+
+* lisp/url-news.el (url-check-gnus-version): Use gnus-continuum-version if 
+  at all possible.  This way I will never have to add another string-match 
+  to the list of acceptable versions (at least not until another 15
+  releases of Gnus.
+
+1998-12-22  Dave Love <address@hidden>
+
+* lisp/w3-display.el (w3-image-alt): Pay better attention to the alt
+  specified by the document.  Don't try to special case the empty string
+  so much.
+
+1998-12-22  William Perry  <address@hidden>
+
+* lisp/css.el (css-parse): Wrap the calls to forward sexp in
+  condition-case so that an invalid stylesheet does not completely choke.
+
+1998-12-22  Milan Zamazal <address@hidden>
+
+* lisp/w3.el (w3-replace-invalid-chars): Make sure we tell replace-regexp
+  to be 'literal' so that somet hings in the invalid chars table don't
+  signal an error (ie: S\\v was looking for the regexp quote match, etc)
+
+1998-12-22  William Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-display-table): Backed out old change to use less 
+  space for borderless tables - it was screwing up spacing at the
+  beginning of celles.
+
+1998-12-22  Thierry Emery <address@hidden>
+
+* lisp/url.el (url-expand-file-name): Do not remove blanks from target
+  anchors (#xxx).
+
 1998-12-21  William M. Perry  <address@hidden>
 
 * lisp/docomp.el: If WIDGETDIR is not set, or set to `no', then scream and 
diff --git a/TODO b/TODO
index fd484ca..cea8795 100644
--- a/TODO
+++ b/TODO
@@ -54,11 +54,16 @@ FEATURES (4.1)
     additional methods to automatically index documents.
 
     * Multi keyword search
+- w3-(un)?plugged, w3-toggle-plugged to control url-standalone-mode in
+  a convenient, user-friendly way.
 - Nice custom-y way to create an HTTP request.  This would allow
   people to use HTTP PUT to upload documents to HTTP servers, etc.
 - cache a formatted version of documents, with enough info to recreate
   the widgets in them.
 - w3-preview-region command
+- keystrokes and supporting infrastructure to prefetch URLs from
+  within a document that you are likely to read next.  Don't even parse
+  or render them David Kastrup <address@hidden>
 - LDAP support (XEmacs)
 - New proxy type for sending requests via mail to a mail->web->mail gateway.
 - Emacspeak Interaction

commit 49a106d506121abfc63d2bf593096ad9dc75b387
Author: William M. Perry <address@hidden>
Date:   Tue Dec 22 20:46:11 1998 +0000

    lisp/w3-parse.el (w3-parse-buffer): Add ',' to the `whitespace' at the
    front of an attribute that we should skip over.  This is so that
    people can do horrible nasty things like <input type="foo",
    name="bar"> and still have it work.  Sometimes I feel so... unclean.

diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
index 15f5b4b..2c79f44 100644
--- a/lisp/w3-parse.el
+++ b/lisp/w3-parse.el
@@ -2189,7 +2189,7 @@ Returns a data structure containing the parsed 
information."
                   (eval-when-compile
                     (concat
                      ;; Leading whitespace.
-                     "[ \n\r\t]*"
+                     "[ \n\r\t,]*"
                      ;; The attribute name, possibly with a bad syntax
                      ;; component.
                      "\\([a-z_][-a-z0-9.]*\\(\\([_][-a-z0-9._]*\\)?\\)\\)"

commit f35040878262648279c1aeee9a943a351e8fa3e8
Author: William M. Perry <address@hidden>
Date:   Tue Dec 22 20:45:31 1998 +0000

    lisp/w3.el (w3-replace-invalid-chars): Make sure we tell replace-regexp
    to be 'literal' so that somet hings in the invalid chars table don't
    signal an error (ie: S\\v was looking for the regexp quote match, etc)
    
    lisp/w3.el (w3-reload-document): Avoid using interactive spec 'Z',
    since it doesn't exist in older versions of Emacs (19.xx)

diff --git a/lisp/w3.el b/lisp/w3.el
index b7e88a7..fcbd5f3 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/21 16:26:41 $
-;; Version: $Revision: 1.4 $
+;; Created: $Date: 1998/12/22 20:45:31 $
+;; Version: $Revision: 1.5 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1222,7 +1222,7 @@ invokes some commands which read a coding system from the 
user.")
          (let ((str (char-to-string (caar invalid-char-alist)))
                (repl (cdar invalid-char-alist)))
            (while (search-forward str nil t)
-             (replace-match repl))))
+             (replace-match repl nil t))))
       (setq invalid-char-alist (cdr invalid-char-alist)))))
 
 (defun w3-sentinel (&optional proc string)
@@ -1768,7 +1768,9 @@ cached and in local mode."
 (defun w3-reload-document (&optional explicit-coding-system)
   "Reload the current document.
 With prefix argument, it reads a coding system to decode the document."
-  (interactive "ZCoding system: ")
+  (interactive
+   (list (if (and (featurep 'mule) current-prefix-arg)
+            (read-coding-system "Coding system: "))))
   (let ((tmp (url-view-url t))
        (pnt (point))
        (window-start (progn

commit 3d6658c10822e70e68aa3d87aa07a0d05d34baf9
Author: William M. Perry <address@hidden>
Date:   Tue Dec 22 20:43:22 1998 +0000

    lisp/w3-display.el (w3-image-alt): Pay better attention to the alt
    specified by the document.  Don't try to special case the empty string
    so much.
    
    lisp/w3-display.el (w3-display-table): Backed out old change to use
    less space for borderless tables - it was screwing up spacing at the
    beginning of celles.

diff --git a/lisp/w3-display.el b/lisp/w3-display.el
index c9699cd..086d95d 100644
--- a/lisp/w3-display.el
+++ b/lisp/w3-display.el
@@ -1,12 +1,12 @@
 ;;; w3-display.el --- display engine
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:12 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1998/12/22 20:43:22 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: faces, help, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;
 ;;; This file is part of GNU Emacs.
@@ -251,6 +251,64 @@
          (setq voice nil))
        (or voice (car w3-active-voices)))))
 
+(defun w3-display-colors-too-close-p (foreground background)
+  ;; This algorithm could be _MUCH_ better. :)
+  ;;
+  ;; Perhaps doing something along the lines of converting them both
+  ;; to grayscale values, then considering them worthless if they are
+  ;; within some user-configurable delta?
+  (equal foreground background))
+
+(defun w3-display-background-useless-p (color)
+  (let ((foreground-color (font-color-rgb-components
+                          (if (fboundp 'face-foreground-name)
+                              (face-foreground-name 'default)
+                            (face-foreground 'default))))
+       (background-color (font-color-rgb-components color)))
+    (w3-display-colors-too-close-p foreground-color background-color)))
+
+(defun w3-display-foreground-useless-p (color)
+  (let ((background-color (font-color-rgb-components
+                          (if (fboundp 'face-background-name)
+                              (face-background-name 'default)
+                            (face-background 'default))))
+       (foreground-color (font-color-rgb-components color)))
+    (w3-display-colors-too-close-p foreground-color background-color)))
+
+(defun w3-display-infer-contrasting-color (color)
+  ;; Simple little algorithm suggested by Adam Hammer
+  ;; <address@hidden>
+  ;; 
+  ;; Extremes are black and white, so make those the two
+  ;; choices. Convert the color to grayscale (0.299R + 0.587G +
+  ;; 0.114B) and then choose either black or white depending upon
+  ;; which one is furthest away from the grayscale color calculated.
+  ;;
+  ;; Found via research? Tested?  Haha.
+  (let* ((rgb (font-color-rgb-components color))
+        (r (nth 0 rgb))
+        (g (nth 1 rgb))
+        (b (nth 2 rgb))
+        (grayscale nil)
+        (white nil)
+        (max nil)
+        (black nil))
+    (if (and (<= r 255) (<= g 255) (<= b 255))
+       (setq max 255)
+      (setq max 65535))
+    (setq grayscale (+ (* 0.299 r) (* 0.587 g) (* 0.114 b))
+         black grayscale
+         white (- max grayscale))
+    (if (> white black)
+       "white"
+      "black")))
+
+;; Test function for XEmacs and the color inference code.
+;; (defun w3-display-test-inference (color)
+;;  (interactive "sColor: ")
+;;  (set-face-background 'default color (current-buffer))
+;;  (set-face-foreground 'default (w3-display-infer-contrasting-color color) 
(current-buffer)))
+
 (defun w3-make-face-emacs19 (name &optional doc-string temporary)
   "Defines and returns a new FACE described by DOC-STRING.
 If the face already exists, it is unmodified."
@@ -866,9 +924,7 @@ If the face already exists, it is unmodified."
 (defmacro w3-image-alt (src)
   (`
    (let* ((doc-alt (w3-get-attribute 'alt))
-         (alt (or (and doc-alt
-                       (not (string-equal doc-alt ""))
-                       doc-alt)
+         (alt (or doc-alt
                   (cond
                    ((null w3-auto-image-alt) "")
                    ((eq t w3-auto-image-alt)
@@ -1654,10 +1710,14 @@ Can sometimes make the structure of a document clearer")
                 (cond
                  ((= (aref prev-rowspans i) 0)
                   ;; First row, insert the top horizontal divider
-                  (if border
+;;; Everything in this functino commented out with ;;; is done so to
+;;; borderless tables work better.  This was an attempt to not show
+;;; the 'spaces' border around the table, to save screen real estate,
+;;; but it messes up indentation on cell columns.
+;;;               (if border
                       (w3-insert-terminal-char
                        (w3-table-lookup-char t nil t nil border-char) 
-                       (aref column-dimensions i)))
+                       (aref column-dimensions i));;;)
                   (setq i (1+ i)))
                  ((car (aref formatted-cols i))
                   ;; Slap in the rows
@@ -1671,11 +1731,11 @@ Can sometimes make the structure of a document clearer")
                   (setq lflag nil)
                   (setq i (+ i (max (aref table-colspans i)
                                     (aref prev-colspans  i) 1))))))
-              (if (not border)
-                  nil
+;;;           (if (not border)
+;;;               nil
                 (w3-insert-terminal-char
                  (w3-table-lookup-char lflag (/= row 1) nil t border-char))
-                (insert "\n")))
+                (insert "\n"));;;)
             
             ;; recalculate height (in case we've shortened a rowspanning cell)
             (setq height 0 
@@ -2282,6 +2342,32 @@ Format: (((image-alt row column) . offset) ...)")
                     (progn
                       (setq fore (w3-fix-color (w3-get-attribute 'text)))
                       (setf (car w3-face-color) fore)))
+
+                ;; Here we do some sanity checking of the colors
+                ;; selected by the author.
+
+                ;; If they specify the foreground and not the
+                ;; background, _AND_ we determine the contrast is not
+                ;; enough, then don't honor the foreground at all.
+                (if (and fore (not back) (not pixm) 
(w3-display-foreground-useless-p fore))
+                    (setq fore nil))
+
+                ;; If we wanted to be really weird, we could infer
+                ;; the background for them instead of just ignoring
+                ;; the foreground.  But I think this might be too
+                ;; shocking for the average user. :)
+                ;; 
+                ;; (setq back (w3-display-infer-contrasting-color fore)))
+
+                ;; If they specify the background and not the
+                ;; foreground, _AND_ we determine the contrast is not
+                ;; enough, then infer a new foreground color.
+                (if (and back (not pixm) (not fore) 
(w3-display-background-useless-p back))
+                    (setq fore (w3-display-infer-contrasting-color back)))
+
+                (setf (car w3-face-color) fore)
+                (setf (car w3-face-background-color) back)
+
                 (if (not font-running-xemacs)
                     (setq w3-display-background-properties (cons fore back))
                   (if pixm

commit 609cf336f1abc06ec3ad48626952753bf3e919d0
Author: William M. Perry <address@hidden>
Date:   Tue Dec 22 20:42:34 1998 +0000

    lisp/url.el (url-expand-file-name): Do not remove blanks from target
    anchors (#xxx).

diff --git a/lisp/url.el b/lisp/url.el
index 69eb201..42be156 100644
--- a/lisp/url.el
+++ b/lisp/url.el
@@ -1,20 +1,20 @@
 ;;; url.el --- Uniform Resource Locator retrieval tool
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:12 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1998/12/22 20:42:34 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: comm, data, processes, hypermedia
 
 ;;; LCD Archive Entry:
 ;;; url|William M. Perry|address@hidden|
 ;;; Functions for retrieving/manipulating URLs|
-;;; $Date: 1998/12/01 22:12:12 $|$Revision: 1.1 $|Location Undetermined
+;;; $Date: 1998/12/22 20:42:34 $|$Revision: 1.2 $|Location Undetermined
 ;;;
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;; This file is part of GNU Emacs.
 ;;;
 ;;; GNU Emacs is free software; you can redistribute it and/or modify
 ;;; it under the terms of the GNU General Public License as published by
@@ -102,7 +102,7 @@
 (autoload 'url-netrek "url-misc")
 (autoload 'url-news "url-news")
 (autoload 'url-nntp "url-news")
-(autoload 'url-cid "url-misc")
+(autoload 'url-cid "url-cid")
 
 (autoload 'url-open-stream "url-gw")
 (autoload 'url-mime-response-p "url-http")
@@ -1125,7 +1125,7 @@ Second arg DEFAULT is a URL to start with if URL is 
relative.
 If DEFAULT is nil or missing, the current buffer's URL is used.
 Path components that are `.' are removed, and 
 path components followed by `..' are removed, along with the `..' itself."
-  (if url
+  (if (and url (not (string-match "^#" url)))
       (setq url (mapconcat (function (lambda (x)
                                       (if (memq x '(?  ?\n ?\r))
                                           ""

commit 125cb038f6742bb0b14fd6613623b7dcb75f7088
Author: William M. Perry <address@hidden>
Date:   Tue Dec 22 20:41:01 1998 +0000

    lisp/url-news.el (url-check-gnus-version): Use gnus-continuum-version
    if at all possible.  This way I will never have to add another
    string-match to the list of acceptable versions (at least not until
    another 15 releases of Gnus.

diff --git a/lisp/url-news.el b/lisp/url-news.el
index a4ec787..d73dae4 100644
--- a/lisp/url-news.el
+++ b/lisp/url-news.el
@@ -1,14 +1,14 @@
 ;;; url-news.el --- News Uniform Resource Locator retrieval code
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:10 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1998/12/22 20:41:01 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: comm, data, processes
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;; This file is part of GNU Emacs.
 ;;;
 ;;; GNU Emacs is free software; you can redistribute it and/or modify
 ;;; it under the terms of the GNU General Public License as published by
@@ -162,10 +162,11 @@
       (require 'gnus)
     (error (setq gnus-version "GNUS not found")))
   (if (or (not (boundp 'gnus-version))
+         (and (fboundp 'gnus-continuum-version)
+              (>= (gnus-continuum-version gnus-version) 5))
          (string-match "v5.[.0-9]+$" gnus-version)
          (string-match "Red" gnus-version)
-         (string-match "Quassia" gnus-version)
-         (string-match "Pterodactyl" gnus-version))
+         (string-match "Quassia" gnus-version))
       nil
     (url-warn 'url (concat
                    "The version of GNUS found on this system is too old and 
does\n"

commit f47331148fd7de783fca3b8f06686d092d849a67
Author: William M. Perry <address@hidden>
Date:   Tue Dec 22 20:40:13 1998 +0000

    lisp/css.el (css-parse): Wrap the calls to forward sexp in
    condition-case so that an invalid stylesheet does not completely
    choke.

diff --git a/lisp/css.el b/lisp/css.el
index 8d1e5ac..0d3c39f 100644
--- a/lisp/css.el
+++ b/lisp/css.el
@@ -1,14 +1,14 @@
 ;;; css.el -- Cascading Style Sheet parser
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:07 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1998/12/22 20:40:13 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
-;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;; This file is part of GNU Emacs.
 ;;;
 ;;; GNU Emacs is free software; you can redistribute it and/or modify
 ;;; it under the terms of the GNU General Public License as published by
@@ -808,6 +808,8 @@ For a terminal frame, the value is always 1."
 (defun css-active-device-types (&optional device)
   (let ((types (list 'all
                     (if css-running-xemacs 'xemacs 'emacs)
+                    (if (or css-running-xemacs 
font-running-emacs-new-redisplay)
+                        'multifont 'unifont)
                     (if (css-color-light-p 'default) 'light 'dark)))
        (type (device-type device)))
     ;; For reasons I don't really want to get into, emacspeak and TTY
@@ -954,11 +956,15 @@ For a terminal frame, the value is always 1."
            (cond
             ((looking-at "[^{]*\\({\\)")
              (goto-char (match-beginning 1))
-             (forward-sexp 1)
+             (condition-case ()
+                 (forward-sexp 1)
+               (error (goto-char (point-max))))
              (setq data (buffer-substring save-pos (1- (point)))))
             ((looking-at "[\"']+")
              (setq save-pos (1+ save-pos))
-             (forward-sexp 1)
+             (condition-case ()
+                 (forward-sexp 1)
+               (error (goto-char (point-max))))
              (setq data (buffer-substring save-pos (1- (point)))))
             (t
              (skip-chars-forward "^;")))

commit de5e17efb0abf89d3ca47941f85d038e660a14b9
Author: William M. Perry <address@hidden>
Date:   Mon Dec 21 22:17:18 1998 +0000

    *** empty log message ***

diff --git a/ChangeLog b/ChangeLog
index db3dce5..c911162 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,23 @@
+1998-12-21  William M. Perry  <address@hidden>
+
+* lisp/docomp.el: If WIDGETDIR is not set, or set to `no', then scream and 
+  bitch and die, to avoid more arcane errors later on.
+  (emacs-build-custom-load): Try to work around emacs19 that doesn't have
+  cus-dep installed.
+
+* lisp/w3.el (w3-fetch): Avoid use of with-current-buffer, since it
+  doesn't exist in Emacs 19.xx 
+  (w3-convert-code-for-mule): Finished rename to mule-coding-system-p
+
+1998-12-20  Bertil Askelid <address@hidden>
+
+* lisp/w3-mouse.el: Don't bind mouse-movement unless w3-track-mouse is
+  set.
+
 1998-12-19  William M. Perry  <address@hidden>
 
+* Emacs/W3 4.0pre34 released
+
 * lisp/mule-sysdp.el (mule-coding-system-p-version): Renamed and fixed
   mule-coding-system-p for non-MULE Emacs/XEmacs.
 
diff --git a/TODO b/TODO
index 06d4887..fd484ca 100644
--- a/TODO
+++ b/TODO
@@ -54,6 +54,8 @@ FEATURES (4.1)
     additional methods to automatically index documents.
 
     * Multi keyword search
+- Nice custom-y way to create an HTTP request.  This would allow
+  people to use HTTP PUT to upload documents to HTTP servers, etc.
 - cache a formatted version of documents, with enough info to recreate
   the widgets in them.
 - w3-preview-region command

commit dc295372fcc7544a33800118524ffd5abba41bf0
Author: William M. Perry <address@hidden>
Date:   Mon Dec 21 22:15:48 1998 +0000

    lisp/docomp.el: If WIDGETDIR is not set, or set to `no', then scream
    and bitch and die, to avoid more arcane errors later on.
    
    (emacs-build-custom-load): Try to work around emacs19 that doesn't
    have cus-dep installed.

diff --git a/lisp/docomp.el b/lisp/docomp.el
index 2d59a9a..ad781b1 100644
--- a/lisp/docomp.el
+++ b/lisp/docomp.el
@@ -1,3 +1,13 @@
+;;; First things first - if they do not have the WIDGETDIR environment
+;;; variable set, choke, scream, and die.
+(if (or (not (getenv "WIDGETDIR"))
+       (string= (getenv "WIDGETDIR") "no"))
+    (progn
+      (message "Could not find custom libraries.")
+      (message "Please rerun `configure' in the top level directory, and")
+      (message "provide the `--with-custom=XXX' flag.")
+      (kill-emacs 1)))
+
 (setq load-path (append (list (expand-file-name 
                               (or (getenv "W3SRCDIR") "./"))
                              "."
@@ -126,10 +136,15 @@
                         (nth 1 command-line-args-left)))
 
 (defun emacs-build-custom-load (dir)
-  (save-excursion
-    (load-library "cus-dep")
-    (let ((command-line-args-left (list dir)))
-      (custom-make-dependencies))))
+  (let ((foundit t))
+    (save-excursion
+      (condition-case ()
+         (load-library "cus-dep")
+       (error (setq foundit nil)))
+      (if foundit
+         (let ((command-line-args-left (list dir)))
+           (custom-make-dependencies))
+       (write-region "\n" nil "cus-dep.el")))))
 
 (defun emacs-batch-build-custom-load ()
   (emacs-build-custom-load (car command-line-args-left)))

commit c101d355a42125d4bf22962056443d83841a63f6
Author: William M. Perry <address@hidden>
Date:   Mon Dec 21 16:28:39 1998 +0000

    Don't bind mouse-movement unless w3-track-mouse is set.

diff --git a/lisp/w3-mouse.el b/lisp/w3-mouse.el
index a7260d1..5feddd2 100644
--- a/lisp/w3-mouse.el
+++ b/lisp/w3-mouse.el
@@ -1,12 +1,12 @@
 ;;; w3-menu.el --- Mouse specific functions for emacs-w3
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:11 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1998/12/21 16:28:39 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -85,7 +85,8 @@ the mouse click, opening it in another frame."
 
 (if (not w3-running-xemacs)
     (progn
-      (define-key w3-mode-map [mouse-movement] 'w3-mouse-handler)
+      (if w3-track-mouse
+         (define-key w3-mode-map [mouse-movement] 'w3-mouse-handler))
       (if w3-popup-menu-on-mouse-3
          (define-key w3-mode-map [down-mouse-3] 'w3-popup-menu))))
   

commit 7c84f63436af73abd785372c6092fc4f7c71f04a
Author: William M. Perry <address@hidden>
Date:   Mon Dec 21 16:26:41 1998 +0000

    (w3-fetch): Avoid use of with-current-buffer, since it doesn't exist in 
Emacs 19.xx
    (w3-convert-code-for-mule): Finished rename to mule-coding-system-p

diff --git a/lisp/w3.el b/lisp/w3.el
index a0d8ea4..b7e88a7 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/20 02:03:30 $
-;; Version: $Revision: 1.3 $
+;; Created: $Date: 1998/12/21 16:26:41 $
+;; Version: $Revision: 1.4 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -475,7 +475,8 @@ With prefix argument, use the URL of the hyperlink under 
point instead."
                  (w3-history-push x url)
                  (w3-sentinel lastbuf)))
              (w3-history-push x url)))
-       (with-current-buffer buf
+       (save-excursion
+         (set-buffer buf)
          (setq w3-current-last-buffer lastbuf))
        (w3-history-push x url)
        (if w3-track-last-buffer
@@ -1178,7 +1179,7 @@ invokes some commands which read a coding system from the 
user.")
        (let (charset-symbol coding-system)
         (cond (;; explicit coding system ? (through C-u [w3-reload-document])
                (and w3-explicit-coding-system
-                    (mule-coding-system-p-version w3-explicit-coding-system))
+                    (mule-coding-system-p w3-explicit-coding-system))
                (setq coding-system w3-explicit-coding-system))
               (;; explicit charset ? (through MIME headers or META tag)
                (and (stringp mmcharset)
@@ -1207,7 +1208,7 @@ invokes some commands which read a coding system from the 
user.")
        (l w3-mime-charset-coding-alist))
     (while l
       (if (string-match (car (car l)) mmcharset)
-         (setq coding-system (if (mule-coding-system-p-version (cdr (car l)))
+         (setq coding-system (if (mule-coding-system-p (cdr (car l)))
                                  (cdr (car l)))
                l nil)
        (setq l (cdr l))))

commit b2efaf5dec98f859031741c32b04894698d3c06c
Author: William M. Perry <address@hidden>
Date:   Sun Dec 20 02:27:31 1998 +0000

    *** empty log message ***

diff --git a/.version b/.version
index bb95160..a787364 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-33
+34

commit 49468c384be84b51e5895068597435f8ac382caa
Author: William M. Perry <address@hidden>
Date:   Sun Dec 20 02:18:37 1998 +0000

    Duh - need to update CVSROOT in the build scripts since the move to gnu.org.

diff --git a/build-dist b/build-dist
index b2d11a0..4a5c6be 100755
--- a/build-dist
+++ b/build-dist
@@ -23,7 +23,7 @@ if [ -z "${version}" ]; then
    exit
 fi
 
-CVSROOT=/usr/people/wmperry/.cvs/
+CVSROOT=:pserver:address@hidden:/gd/gnu/cvsroot
 export CVSROOT
 
 ( cd .    ; cvs admin -s"p${version}" README )

commit 0fd3edd1c919313cd74abe3fd30702079753d278
Author: William M. Perry <address@hidden>
Date:   Sun Dec 20 02:04:00 1998 +0000

    *** empty log message ***

diff --git a/.version b/.version
index 64bb6b7..bb95160 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-30
+33

commit fe5c2a9dc3e2240ded18682e2cec0cdcb86b7101
Author: William M. Perry <address@hidden>
Date:   Sun Dec 20 02:03:21 1998 +0000

    Patches for mule-coding-system-p from Ken'ichi Handa

diff --git a/ChangeLog b/ChangeLog
index 14780b9..db3dce5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,22 @@
 1998-12-19  William M. Perry  <address@hidden>
 
+* lisp/mule-sysdp.el (mule-coding-system-p-version): Renamed and fixed
+  mule-coding-system-p for non-MULE Emacs/XEmacs.
+
+1998-12-18  Kenichi Handa  <address@hidden>
+
+* lisp/mule-sysdp.el (mule-coding-system-p-version): New function.
+  (mule-coding-system-version): Use mule-coding-system-p-version.
+  (mule-detect-coding-version): Likewise.
+  (mule-invalid-char-coding-systems): Change iso-latin-1 to iso-8859-1.
+  (mule-coding-system-with-invalid-chars): Check mule-sysdep-version
+  for XEmacs.
+
+* lisp/w3.el (w3-convert-code-for-mule): Use mule-coding-system-p-version.
+  (w3-coding-system-for-mime-charset): Likewise.
+
+1998-12-19  William M. Perry  <address@hidden>
+
 * configure.in: Ditto
 
 * aclocal.m4: Added appropriate magic to run autoconf whenever aclocal.m4
diff --git a/lisp/mule-sysdp.el b/lisp/mule-sysdp.el
index 9050ab8..ffe8864 100644
--- a/lisp/mule-sysdp.el
+++ b/lisp/mule-sysdp.el
@@ -36,11 +36,21 @@
 ;; Emacs 20.x   - 3.0
 ;; Emacs 20.3+  - 4.0 (with character encapsulation)
 
+;; Return non-nil if CODING-SYSTEM is a valid coding system system.
+(defun mule-coding-system-p (coding-system)
+  (case mule-sysdep-version
+    (xemacs
+     (find-coding-system coding-system))
+    (0
+     nil)
+    (otherwise
+     (coding-system-p coding-system))))
+
 ;; Return the first valid coding system in the list ARGS.
 (defun mule-coding-system-version (&rest args)
   (if (featurep 'mule)
       (progn
-       (while (and args (not (coding-system-p (car args))))
+       (while (and args (not (mule-coding-system-p (car args))))
          (setq args (cdr args)))
        (car args))))
 
@@ -119,21 +129,22 @@ find-file-hooks, etc.
 ;; w3-replace-invalid-chars after decoding a text by them.
 (defconst mule-invalid-char-coding-systems
   (list (mule-coding-system-version 'raw-text '*noconv*)
-       (mule-coding-system-version 'iso-latin-1 '*ctext*)))
+       (mule-coding-system-version 'iso-8859-1 '*ctext*)))
 
 ;; Return non-nil if CODING-SYSTEM requires calling
 ;; w3-replace-invalid-chars after decoding a text.
 (defun mule-coding-system-with-invalid-chars (coding-system)
   (or (null coding-system)
-      (let (base)
+      (progn
        (if (listp coding-system)
            (setq coding-system (car coding-system)))
-       (if (fboundp 'coding-system-base)
-           (setq base (coding-system-base coding-system))
-         (while (not (vectorp (get coding-system 'coding-system)))
-           (setq coding-system (get coding-system 'coding-system)))
-         (setq base coding-system))
-       (memq base mule-invalid-char-coding-systems))))
+       (case mule-sysdep-version
+         ((2.3 2.4)
+          (while (not (vectorp (get coding-system 'coding-system)))
+            (setq coding-system (get coding-system 'coding-system))))
+         (3.0
+          (setq coding-system (coding-system-base coding-system))))
+       (memq coding-system mule-invalid-char-coding-systems))))
 
 (defun mule-detect-coding-version (host st nd)
   "Return a coding system of the current data."
@@ -158,7 +169,8 @@ find-file-hooks, etc.
        (let ((l w3-url-domain-coding-alist))
          (while l
            (if (string-match (car (car l)) host)
-               (setq coding-system (if (coding-system-p (cdr (car l)))
+               (setq coding-system (if (mule-coding-system-p
+                                        (cdr (car l)))
                                        (cdr (car l)))
                      l nil)
              (setq l (cdr l))))))
diff --git a/lisp/w3.el b/lisp/w3.el
index 31e1df5..a0d8ea4 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,7 +1,7 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/19 03:57:16 $
-;; Version: $Revision: 1.2 $
+;; Created: $Date: 1998/12/20 02:03:30 $
+;; Version: $Revision: 1.3 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1178,8 +1178,7 @@ invokes some commands which read a coding system from the 
user.")
        (let (charset-symbol coding-system)
         (cond (;; explicit coding system ? (through C-u [w3-reload-document])
                (and w3-explicit-coding-system
-                    (fboundp 'coding-system-p)
-                    (coding-system-p w3-explicit-coding-system))
+                    (mule-coding-system-p-version w3-explicit-coding-system))
                (setq coding-system w3-explicit-coding-system))
               (;; explicit charset ? (through MIME headers or META tag)
                (and (stringp mmcharset)
@@ -1208,8 +1207,7 @@ invokes some commands which read a coding system from the 
user.")
        (l w3-mime-charset-coding-alist))
     (while l
       (if (string-match (car (car l)) mmcharset)
-         (setq coding-system (if (and (fboundp 'coding-system-p)
-                                      (coding-system-p (cdr (car l))))
+         (setq coding-system (if (mule-coding-system-p-version (cdr (car l)))
                                  (cdr (car l)))
                l nil)
        (setq l (cdr l))))

commit 0efde19fde81a0481f3a04ce1561b791b2384c4d
Author: William M. Perry <address@hidden>
Date:   Sun Dec 20 01:57:14 1998 +0000

    Well, bite the bullet and check in the configure script.  It is nice
    to get the whole thing when you use CVS.

diff --git a/ChangeLog b/ChangeLog
index 010a5eb..14780b9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+1998-12-19  William M. Perry  <address@hidden>
+
+* configure.in: Ditto
+
+* aclocal.m4: Added appropriate magic to run autoconf whenever aclocal.m4
+  is modified.
+
 1998-12-18  William M. Perry  <address@hidden>
 
 * lisp/Makefile.in: No longer include auto-autoloads.el and custom-load in 
diff --git a/configure b/configure
new file mode 100755
index 0000000..be87df7
--- /dev/null
+++ b/configure
@@ -0,0 +1,1480 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.12 
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+--with-xemacs             Use XEmacs to build"
+ac_help="$ac_help
+--with-emacs              Use Emacs to build"
+ac_help="$ac_help
+--with-makeinfo           Specify how to build info files"
+ac_help="$ac_help
+--enable-site-install     Perform a sitewide installation"
+ac_help="$ac_help
+--with-package-dir        Configure as a XEmacs package in directory"
+ac_help="$ac_help
+--with-lispdir            Where to install lisp files"
+ac_help="$ac_help
+--with-custom             Specify where to find the custom package"
+ac_help="$ac_help
+--with-gnus             Specify where to find the gnus package"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  case "$ac_option" in
+  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) ac_optarg= ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case "$ac_option" in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir="$ac_optarg" ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build="$ac_optarg" ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file="$ac_optarg" ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir="$ac_optarg" ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 
1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    eval "enable_${ac_feature}=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 
1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix="$ac_optarg" ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he)
+    # Omit some internal or obsolete options to make the list less imposing.
+    # This message is too long to be a string in the A/UX 3.1 sh.
+    cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+  --cache-file=FILE       cache test results in FILE
+  --help                  print this message
+  --no-create             do not create output files
+  --quiet, --silent       do not print \`checking...' messages
+  --version               print the version of autoconf that created configure
+Directory and file names:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [same as prefix]
+  --bindir=DIR            user executables in DIR [EPREFIX/bin]
+  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
+  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
+  --datadir=DIR           read-only architecture-independent data in DIR
+                          [PREFIX/share]
+  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
+                          [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
+  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
+  --includedir=DIR        C header files in DIR [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
+  --infodir=DIR           info documentation in DIR [PREFIX/info]
+  --mandir=DIR            man documentation in DIR [PREFIX/man]
+  --srcdir=DIR            find the sources in DIR [configure dir or ..]
+  --program-prefix=PREFIX prepend PREFIX to installed program names
+  --program-suffix=SUFFIX append SUFFIX to installed program names
+  --program-transform-name=PROGRAM
+                          run sed PROGRAM on installed program names
+EOF
+    cat << EOF
+Host type:
+  --build=BUILD           configure for building on BUILD [BUILD=HOST]
+  --host=HOST             configure for HOST [guessed]
+  --target=TARGET         configure for TARGET [TARGET=HOST]
+Features and packages:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --x-includes=DIR        X include files are in DIR
+  --x-libraries=DIR       X library files are in DIR
+EOF
+    if test -n "$ac_help"; then
+      echo "--enable and --with options recognized:$ac_help"
+    fi
+    exit 0 ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host="$ac_optarg" ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir="$ac_optarg" ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir="$ac_optarg" ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir="$ac_optarg" ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir="$ac_optarg" ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir="$ac_optarg" ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir="$ac_optarg" ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir="$ac_optarg" ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix="$ac_optarg" ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix="$ac_optarg" ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix="$ac_optarg" ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name="$ac_optarg" ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir="$ac_optarg" ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir="$ac_optarg" ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site="$ac_optarg" ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir="$ac_optarg" ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir="$ac_optarg" ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target="$ac_optarg" ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers)
+    echo "configure generated by autoconf version 2.12"
+    exit 0 ;;
+
+  -with-* | --with-*)
+    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 
1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_${ac_package}='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 
1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    eval "with_${ac_package}=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes="$ac_optarg" ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries="$ac_optarg" ;;
+
+  -*) { echo "configure: error: $ac_option: invalid option; use --help to show 
usage" 1>&2; exit 1; }
+    ;;
+
+  *)
+    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+      echo "configure: warning: $ac_option: invalid host type" 1>&2
+    fi
+    if test "x$nonopt" != xNONE; then
+      { echo "configure: error: can only configure for one host and one target 
at a time" 1>&2; exit 1; }
+    fi
+    nonopt="$ac_option"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  { echo "configure: error: missing argument to --`echo $ac_prev | sed 
's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 
2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+  exec 6>/dev/null
+else
+  exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+  case "$ac_arg" in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c) ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+  *" "*|*"     "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+  esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set.  These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=configure.in
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_prog=$0
+  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; 
exit 1; }
+  else
+    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+  fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site 
$ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    echo "loading site script $ac_site_file"
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  echo "loading cache $cache_file"
+  . $cache_file
+else
+  echo "creating cache $cache_file"
+  > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext 
$LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+  # Stardent Vistra SVR4 grep lacks -e, says address@hidden
+  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+    ac_n= ac_c='
+' ac_t='       '
+  else
+    ac_n=-n ac_c= ac_t=
+  fi
+else
+  ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { echo "configure: error: can not find install-sh or install.sh in $srcdir 
$srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:571: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+
+  IFS="${IFS=  }"; ac_save_IFS="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    # Account for people who put trailing slashes in PATH elements.
+    case "$ac_dir/" in
+    
/|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      for ac_prog in ginstall installbsd scoinst install; do
+        if test -f $ac_dir/$ac_prog; then
+         if test $ac_prog = install &&
+            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           # OSF/1 installbsd also uses dspmsg, but is usable.
+           :
+         else
+           ac_cv_path_install="$ac_dir/$ac_prog -c"
+           break 2
+         fi
+       fi
+      done
+      ;;
+    esac
+  done
+  IFS="$ac_save_IFS"
+
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL="$ac_cv_path_install"
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL="$ac_install_sh"
+  fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+if test "${EMACS}" = "t"; then
+   EMACS=""
+fi
+
+# Check whether --with-xemacs or --without-xemacs was given.
+if test "${with_xemacs+set}" = set; then
+  withval="$with_xemacs"
+   if test "${withval}" = "yes"; then EMACS=xemacs; else EMACS=${withval}; fi 
+fi
+
+# Check whether --with-emacs or --without-emacs was given.
+if test "${with_emacs+set}" = set; then
+  withval="$with_emacs"
+   if test "${withval}" = "yes"; then EMACS=emacs; else EMACS=${withval}; fi 
+fi
+
+# Check whether --with-makeinfo or --without-makeinfo was given.
+if test "${with_makeinfo+set}" = set; then
+  withval="$with_makeinfo"
+   MAKEINFO="$withval" 
+fi
+
+# Check whether --enable-site-install or --disable-site-install was given.
+if test "${enable_site_install+set}" = set; then
+  enableval="$enable_site_install"
+   DOTEMACS='$(prefix)/share/emacs/site-lisp/default.el' 
+else
+   DOTEMACS=`( cd ; pwd)`/.emacs 
+fi
+
+
+# Extract the first word of "texi2html", so it can be a program name with args.
+set dummy texi2html; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:652: checking for $ac_word" >&5
+
+if test -n "$TEXI2HTML"; then
+  ac_cv_prog_TEXI2HTML="$TEXI2HTML" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_TEXI2HTML="texi2html"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_TEXI2HTML" && ac_cv_prog_TEXI2HTML="echo Cannot create 
html version of"
+fi
+TEXI2HTML="$ac_cv_prog_TEXI2HTML"
+if test -n "$TEXI2HTML"; then
+  echo "$ac_t""$TEXI2HTML" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "xemacs", so it can be a program name with args.
+set dummy xemacs; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:678: checking for $ac_word" >&5
+
+if test -n "$EMACS"; then
+  ac_cv_prog_EMACS="$EMACS" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_EMACS="xemacs"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_EMACS" && ac_cv_prog_EMACS="emacs"
+fi
+EMACS="$ac_cv_prog_EMACS"
+if test -n "$EMACS"; then
+  echo "$ac_t""$EMACS" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "makeinfo", so it can be a program name with args.
+set dummy makeinfo; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:704: checking for $ac_word" >&5
+
+if test -n "$MAKEINFO"; then
+  ac_cv_prog_MAKEINFO="$MAKEINFO" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_MAKEINFO="makeinfo"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_MAKEINFO" && ac_cv_prog_MAKEINFO="\$(EMACS) -batch -q 
-l texinfmt -f batch-texinfo-format"
+fi
+MAKEINFO="$ac_cv_prog_MAKEINFO"
+if test -n "$MAKEINFO"; then
+  echo "$ac_t""$MAKEINFO" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "install-info", so it can be a program name with 
args.
+set dummy install-info; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:730: checking for $ac_word" >&5
+
+if test -n "$INSTALLINFO"; then
+  ac_cv_prog_INSTALLINFO="$INSTALLINFO" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_INSTALLINFO="install-info"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_INSTALLINFO" && ac_cv_prog_INSTALLINFO="true"
+fi
+INSTALLINFO="$ac_cv_prog_INSTALLINFO"
+if test -n "$INSTALLINFO"; then
+  echo "$ac_t""$INSTALLINFO" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+
+# Check whether --with-package-dir or --without-package-dir was given.
+if test "${with_package_dir+set}" = set; then
+  withval="$with_package_dir"
+   EMACS_PACKAGE_DIR="${withval}"
+fi
+
+if test -n "$EMACS_PACKAGE_DIR"; then
+  if test "$prefix" != "NONE"; then
+       { echo "configure: error: --with-package-dir and --prefix are mutually 
exclusive" 1>&2; exit 1; }
+  fi
+    prefix=$EMACS_PACKAGE_DIR
+  datadir='$(prefix)/etc/w3'
+  infodir='$(prefix)/info'
+  lispdir='$(prefix)/lisp/w3'
+fi
+
+
+
+  
+  echo $ac_n "checking if $EMACS is really XEmacs""... $ac_c" 1>&6
+echo "configure:775: checking if $EMACS is really XEmacs" >&5
+  
+elisp="(if (string-match \"XEmacs\" emacs-version) \"yes\" \"no\") "
+if test -z ""noecho""; then
+       echo $ac_n "checking for xemacsp""... $ac_c" 1>&6
+echo "configure:780: checking for xemacsp" >&5
+fi
+
+
+       OUTPUT=./conftest-$$
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       retval=`cat ${OUTPUT}`
+       rm -f ${OUTPUT}
+       EMACS_cv_SYS_xemacsp=$retval
+
+
+xemacsp=${EMACS_cv_SYS_xemacsp}
+if test -z ""noecho""; then
+       echo "$ac_t""$xemacsp" 1>&6
+fi
+
+  XEMACS=${EMACS_cv_SYS_xemacsp}
+  EMACS_FLAVOR=emacs
+  if test "$XEMACS" = "yes"; then
+     EMACS_FLAVOR=xemacs
+  fi
+  echo "$ac_t""$XEMACS" 1>&6
+  
+  
+
+  if test "$prefix" = "NONE"; then
+       echo $ac_n "checking prefix for your Emacs""... $ac_c" 1>&6
+echo "configure:807: checking prefix for your Emacs" >&5
+       
+elisp="(expand-file-name \"..\" invocation-directory)"
+if test -z ""noecho""; then
+       echo $ac_n "checking for prefix""... $ac_c" 1>&6
+echo "configure:812: checking for prefix" >&5
+fi
+
+
+       OUTPUT=./conftest-$$
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       retval=`cat ${OUTPUT}`
+       rm -f ${OUTPUT}
+       EMACS_cv_SYS_prefix=$retval
+
+
+prefix=${EMACS_cv_SYS_prefix}
+if test -z ""noecho""; then
+       echo "$ac_t""$prefix" 1>&6
+fi
+
+       prefix=${EMACS_cv_SYS_prefix}
+       echo "$ac_t""$prefix" 1>&6
+  fi
+  # Check whether --with-lispdir or --without-lispdir was given.
+if test "${with_lispdir+set}" = set; then
+  withval="$with_lispdir"
+  lispdir=${withval}
+fi
+
+  echo $ac_n "checking where .elc files should go""... $ac_c" 1>&6
+echo "configure:838: checking where .elc files should go" >&5
+  if test -z "$lispdir"; then
+        theprefix=$prefix
+    if test "x$theprefix" = "xNONE"; then
+       theprefix=$ac_default_prefix
+    fi
+    lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp"
+    for thedir in share lib; do
+       potential=
+       if test -d ${theprefix}/${thedir}/${EMACS_FLAVOR}/site-lisp; then
+          lispdir="\$(prefix)/${thedir}/${EMACS_FLAVOR}/site-lisp"
+          break
+       fi
+    done
+  fi
+  echo "$ac_t""$lispdir" 1>&6
+  
+
+
+
+echo $ac_n "checking for emacs version""... $ac_c" 1>&6
+echo "configure:859: checking for emacs version" >&5
+
+elisp="(and (boundp 'emacs-major-version) (format \"%d.%d\" 
emacs-major-version emacs-minor-version))"
+if test -z ""noecho""; then
+       echo $ac_n "checking for version""... $ac_c" 1>&6
+echo "configure:864: checking for version" >&5
+fi
+
+
+       OUTPUT=./conftest-$$
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       retval=`cat ${OUTPUT}`
+       rm -f ${OUTPUT}
+       EMACS_cv_SYS_version=$retval
+
+
+version=${EMACS_cv_SYS_version}
+if test -z ""noecho""; then
+       echo "$ac_t""$version" 1>&6
+fi
+
+
+EMACS_VERSION=${EMACS_cv_SYS_version}
+
+echo "$ac_t""${EMACS_VERSION}" 1>&6
+
+
+echo $ac_n "checking for acceptable custom library""... $ac_c" 1>&6
+echo "configure:887: checking for acceptable custom library" >&5
+
+
+
+if test -z ""noecho""; then
+       echo $ac_n "checking for widget-convert-text in widget""... $ac_c" 1>&6
+echo "configure:893: checking for widget-convert-text in widget" >&5
+fi
+library=`echo widget | tr _ -`
+
+elisp="(progn (fmakunbound 'widget-convert-text) (condition-case nil (progn 
(require '$library) (fboundp 'widget-convert-text)) (error nil)))"
+if test -z ""noecho""; then
+       echo $ac_n "checking for widget""... $ac_c" 1>&6
+echo "configure:900: checking for widget" >&5
+fi
+
+
+       OUTPUT=./conftest-$$
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       retval=`cat ${OUTPUT}`
+       rm -f ${OUTPUT}
+       EMACS_cv_SYS_widget=$retval
+
+
+widget=${EMACS_cv_SYS_widget}
+if test -z ""noecho""; then
+       echo "$ac_t""$widget" 1>&6
+fi
+
+if test "${EMACS_cv_SYS_widget}" = "nil"; then
+       EMACS_cv_SYS_widget=no
+fi
+HAVE_widget=${EMACS_cv_SYS_widget}
+
+if test -z ""noecho""; then
+       echo "$ac_t""$HAVE_widget" 1>&6
+fi
+
+
+if test -z ""noecho""; then
+       echo $ac_n "checking for widget-convert-text in wid_edit""... $ac_c" 
1>&6
+echo "configure:928: checking for widget-convert-text in wid_edit" >&5
+fi
+library=`echo wid_edit | tr _ -`
+
+elisp="(progn (fmakunbound 'widget-convert-text) (condition-case nil (progn 
(require '$library) (fboundp 'widget-convert-text)) (error nil)))"
+if test -z ""noecho""; then
+       echo $ac_n "checking for wid_edit""... $ac_c" 1>&6
+echo "configure:935: checking for wid_edit" >&5
+fi
+
+
+       OUTPUT=./conftest-$$
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       retval=`cat ${OUTPUT}`
+       rm -f ${OUTPUT}
+       EMACS_cv_SYS_wid_edit=$retval
+
+
+wid_edit=${EMACS_cv_SYS_wid_edit}
+if test -z ""noecho""; then
+       echo "$ac_t""$wid_edit" 1>&6
+fi
+
+if test "${EMACS_cv_SYS_wid_edit}" = "nil"; then
+       EMACS_cv_SYS_wid_edit=no
+fi
+HAVE_wid_edit=${EMACS_cv_SYS_wid_edit}
+
+if test -z ""noecho""; then
+       echo "$ac_t""$HAVE_wid_edit" 1>&6
+fi
+
+if test "${HAVE_widget}" = "yes"; then
+       EMACS_cv_ACCEPTABLE_CUSTOM=yes
+else
+       if test "${HAVE_wid_edit}" != "no"; then
+               EMACS_cv_ACCEPTABLE_CUSTOM=yes
+       else
+               EMACS_cv_ACCEPTABLE_CUSTOM=no
+       fi
+fi
+if test "${EMACS_cv_ACCEPTABLE_CUSTOM}" = "yes"; then
+       
+elisp="(file-name-directory (locate-library \"widget\"))"
+if test -z ""noecho""; then
+       echo $ac_n "checking for widget_dir""... $ac_c" 1>&6
+echo "configure:974: checking for widget_dir" >&5
+fi
+
+
+       OUTPUT=./conftest-$$
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       retval=`cat ${OUTPUT}`
+       rm -f ${OUTPUT}
+       EMACS_cv_SYS_widget_dir=$retval
+
+
+widget_dir=${EMACS_cv_SYS_widget_dir}
+if test -z ""noecho""; then
+       echo "$ac_t""$widget_dir" 1>&6
+fi
+
+       EMACS_cv_ACCEPTABLE_CUSTOM=$EMACS_cv_SYS_widget_dir
+fi
+
+
+   # Check whether --with-custom or --without-custom was given.
+if test "${with_custom+set}" = set; then
+  withval="$with_custom"
+   EMACS_cv_ACCEPTABLE_CUSTOM=`( cd $withval && pwd || echo "$withval" ) 2> 
/dev/null` 
+fi
+
+   CUSTOM=${EMACS_cv_ACCEPTABLE_CUSTOM}
+   
+   echo "$ac_t"""${CUSTOM}"" 1>&6
+
+
+echo $ac_n "checking for recent gnus version""... $ac_c" 1>&6
+echo "configure:1006: checking for recent gnus version" >&5
+
+
+
+if test -z ""noecho""; then
+       echo $ac_n "checking for mm-get-content-id in mm_decode""... $ac_c" 1>&6
+echo "configure:1012: checking for mm-get-content-id in mm_decode" >&5
+fi
+library=`echo mm_decode | tr _ -`
+
+elisp="(progn (fmakunbound 'mm-get-content-id) (condition-case nil (progn 
(require '$library) (fboundp 'mm-get-content-id)) (error nil)))"
+if test -z ""noecho""; then
+       echo $ac_n "checking for mm_decode""... $ac_c" 1>&6
+echo "configure:1019: checking for mm_decode" >&5
+fi
+
+
+       OUTPUT=./conftest-$$
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       retval=`cat ${OUTPUT}`
+       rm -f ${OUTPUT}
+       EMACS_cv_SYS_mm_decode=$retval
+
+
+mm_decode=${EMACS_cv_SYS_mm_decode}
+if test -z ""noecho""; then
+       echo "$ac_t""$mm_decode" 1>&6
+fi
+
+if test "${EMACS_cv_SYS_mm_decode}" = "nil"; then
+       EMACS_cv_SYS_mm_decode=no
+fi
+HAVE_mm_decode=${EMACS_cv_SYS_mm_decode}
+
+if test -z ""noecho""; then
+       echo "$ac_t""$HAVE_mm_decode" 1>&6
+fi
+
+if test "${HAVE_mm_decode}" = "yes"; then
+       EMACS_cv_ACCEPTABLE_GNUS=yes
+else
+       EMACS_cv_ACCEPTABLE_GNUS=no
+fi
+
+if test "${EMACS_cv_ACCEPTABLE_GNUS}" = "yes"; then
+       
+elisp="(file-name-directory (locate-library \"mm-decode\"))"
+if test -z ""noecho""; then
+       echo $ac_n "checking for gnus_dir""... $ac_c" 1>&6
+echo "configure:1055: checking for gnus_dir" >&5
+fi
+
+
+       OUTPUT=./conftest-$$
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       retval=`cat ${OUTPUT}`
+       rm -f ${OUTPUT}
+       EMACS_cv_SYS_gnus_dir=$retval
+
+
+gnus_dir=${EMACS_cv_SYS_gnus_dir}
+if test -z ""noecho""; then
+       echo "$ac_t""$gnus_dir" 1>&6
+fi
+
+       EMACS_cv_ACCEPTABLE_GNUS=$EMACS_cv_SYS_gnus_dir
+fi
+
+
+   # Check whether --with-gnus or --without-gnus was given.
+if test "${with_gnus+set}" = set; then
+  withval="$with_gnus"
+   EMACS_cv_ACCEPTABLE_GNUS=`( cd $withval && pwd || echo "$withval" ) 2> 
/dev/null` 
+fi
+
+   GNUS=${EMACS_cv_ACCEPTABLE_GNUS}
+   
+   echo "$ac_t"""${GNUS}"" 1>&6
+
+
+echo $ac_n "checking how to rebuild autoloads""... $ac_c" 1>&6
+echo "configure:1087: checking how to rebuild autoloads" >&5
+
+
+
+if test -z ""noecho""; then
+       echo $ac_n "checking for batch-update-directory in autoload""... $ac_c" 
1>&6
+echo "configure:1093: checking for batch-update-directory in autoload" >&5
+fi
+library=`echo autoload | tr _ -`
+
+elisp="(progn (fmakunbound 'batch-update-directory) (condition-case nil (progn 
(require '$library) (fboundp 'batch-update-directory)) (error nil)))"
+if test -z ""noecho""; then
+       echo $ac_n "checking for autoload""... $ac_c" 1>&6
+echo "configure:1100: checking for autoload" >&5
+fi
+
+
+       OUTPUT=./conftest-$$
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       retval=`cat ${OUTPUT}`
+       rm -f ${OUTPUT}
+       EMACS_cv_SYS_autoload=$retval
+
+
+autoload=${EMACS_cv_SYS_autoload}
+if test -z ""noecho""; then
+       echo "$ac_t""$autoload" 1>&6
+fi
+
+if test "${EMACS_cv_SYS_autoload}" = "nil"; then
+       EMACS_cv_SYS_autoload=no
+fi
+HAVE_autoload=${EMACS_cv_SYS_autoload}
+
+if test -z ""noecho""; then
+       echo "$ac_t""$HAVE_autoload" 1>&6
+fi
+
+EMACS_cv_REBUILD_AUTOLOADS=${HAVE_autoload}
+
+
+if test "${EMACS_cv_REBUILD_AUTOLOADS}" != "no"; then
+   REBUILD_AUTOLOADS='$(EMACS) $(BATCHFLAGS) -eval "(setq 
autoload-package-name \"w3\")" -l autoload -f batch-update-directory $(srcdir)'
+else
+   REBUILD_AUTOLOADS='$(EMACS) $(BATCHFLAGS) -l $(srcdir)/docomp.el -f 
emacs-batch-build-autoloads $(srcdir) auto-autoloads.el'
+fi
+echo "$ac_t"""${REBUILD_AUTOLOADS}"" 1>&6
+
+
+
+echo $ac_n "checking how to rebuild custom autoloads""... $ac_c" 1>&6
+echo "configure:1138: checking how to rebuild custom autoloads" >&5
+
+
+
+if test -z ""noecho""; then
+       echo $ac_n "checking for Custom-make-dependencies in cus_dep""... 
$ac_c" 1>&6
+echo "configure:1144: checking for Custom-make-dependencies in cus_dep" >&5
+fi
+library=`echo cus_dep | tr _ -`
+
+elisp="(progn (fmakunbound 'Custom-make-dependencies) (condition-case nil 
(progn (require '$library) (fboundp 'Custom-make-dependencies)) (error nil)))"
+if test -z ""noecho""; then
+       echo $ac_n "checking for cus_dep""... $ac_c" 1>&6
+echo "configure:1151: checking for cus_dep" >&5
+fi
+
+
+       OUTPUT=./conftest-$$
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       retval=`cat ${OUTPUT}`
+       rm -f ${OUTPUT}
+       EMACS_cv_SYS_cus_dep=$retval
+
+
+cus_dep=${EMACS_cv_SYS_cus_dep}
+if test -z ""noecho""; then
+       echo "$ac_t""$cus_dep" 1>&6
+fi
+
+if test "${EMACS_cv_SYS_cus_dep}" = "nil"; then
+       EMACS_cv_SYS_cus_dep=no
+fi
+HAVE_cus_dep=${EMACS_cv_SYS_cus_dep}
+
+if test -z ""noecho""; then
+       echo "$ac_t""$HAVE_cus_dep" 1>&6
+fi
+
+EMACS_cv_REBUILD_CUSTOMLOADS=${HAVE_cus_dep}
+
+
+if test "${EMACS_cv_REBUILD_CUSTOMLOADS}" != "no"; then
+   REBUILD_CUSTOMLOADS='$(EMACS) $(BATCHFLAGS) -l cus-dep -f 
Custom-make-dependencies $(srcdir)'
+else
+   REBUILD_CUSTOMLOADS='$(EMACS) $(BATCHFLAGS) $(DEPS) -f 
emacs-batch-build-custom-load $(srcdir)'
+fi
+echo "$ac_t"""${REBUILD_CUSTOMLOADS}"" 1>&6
+
+
+
+if test "${MAKEINFO}" = "no"; then
+   MAKEINFO='$(EMACS) -batch -q -l texinfmt -f batch-texinfo-format'
+fi
+
+if test "${TEXI2HTML}" = "texi2html"; then
+   TEXI2HTML_FLAGS="-menu -glossary -number -split_node"
+fi
+
+
+
+
+
+
+
+
+
+
+if test "${GNUS}" != "no"; then
+CIDFILE=url-cid.el
+
+fi
+
+if test "${CUSTOM}" = "no"; then
+echo "configure: warning: " "" 1>&2
+echo "configure: warning: No usable version of the widget/custom libraries 
have been" 1>&2
+echo "configure: warning: detected on your system.  This version of Emacs/W3 
requires" 1>&2
+echo "configure: warning: features present in newer versions of the widget 
library." 1>&2
+echo "configure: warning: " "" 1>&2
+echo "configure: warning: Please upgrade to the latest version of custom 
available." 1>&2
+echo "configure: warning: This package is included with Emacs 20.1 and XEmacs 
20.3" 1>&2
+echo "configure: warning: or from http://www.dina.kvl.dk/~abraham/custom/"; 1>&2
+echo "configure: warning: or 
/ftp.dina.kvl.dk:/pub/Staff/Per.Abrahamsen/custom/" 1>&2
+echo "configure: warning: " "" 1>&2
+echo "configure: warning: You may still continue, but you must modify 
lisp/Makefile" 1>&2
+echo "configure: warning: to have the correct WIDGETDIR setting." 1>&2
+echo "configure: warning: " "" 1>&2
+fi
+
+trap '' 1 2 15
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 
2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[        ]*VPATH[        ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
+s%[    `~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+  case "\$ac_option" in
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create 
--no-recursion"
+    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create 
--no-recursion ;;
+  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+    echo "$CONFIG_STATUS generated by autoconf version 2.12"
+    exit 0 ;;
+  -help | --help | --hel | --he | --h)
+    echo "\$ac_cs_usage"; exit 0 ;;
+  *) echo "\$ac_cs_usage"; exit 1 ;;
+  esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile
+         etc/Makefile
+         texi/Makefile
+         lisp/Makefile
+         lisp/w3-cfg.el
+         " | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
address@hidden@%$CFLAGS%g
address@hidden@%$CPPFLAGS%g
address@hidden@%$CXXFLAGS%g
address@hidden@%$DEFS%g
address@hidden@%$LDFLAGS%g
address@hidden@%$LIBS%g
address@hidden@%$exec_prefix%g
address@hidden@%$prefix%g
address@hidden@%$program_transform_name%g
address@hidden@%$bindir%g
address@hidden@%$sbindir%g
address@hidden@%$libexecdir%g
address@hidden@%$datadir%g
address@hidden@%$sysconfdir%g
address@hidden@%$sharedstatedir%g
address@hidden@%$localstatedir%g
address@hidden@%$libdir%g
address@hidden@%$includedir%g
address@hidden@%$oldincludedir%g
address@hidden@%$infodir%g
address@hidden@%$mandir%g
address@hidden@%$INSTALL_PROGRAM%g
address@hidden@%$INSTALL_DATA%g
address@hidden@%$TEXI2HTML%g
address@hidden@%$EMACS%g
address@hidden@%$MAKEINFO%g
address@hidden@%$INSTALLINFO%g
address@hidden@%$EMACS_PACKAGE_DIR%g
address@hidden@%$XEMACS%g
address@hidden@%$EMACS_FLAVOR%g
address@hidden@%$lispdir%g
address@hidden@%$EMACS_VERSION%g
address@hidden@%$HAVE_widget%g
address@hidden@%$HAVE_wid_edit%g
address@hidden@%$CUSTOM%g
address@hidden@%$HAVE_mm_decode%g
address@hidden@%$GNUS%g
address@hidden@%$HAVE_autoload%g
address@hidden@%$REBUILD_AUTOLOADS%g
address@hidden@%$HAVE_cus_dep%g
address@hidden@%$REBUILD_CUSTOMLOADS%g
address@hidden@%$INSTALL%g
address@hidden@%$DOTEMACS%g
address@hidden@%$TEXI2HTML_FLAGS%g
address@hidden@%$CIDFILE%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+  if test $ac_beg -gt 1; then
+    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+  else
+    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+  fi
+  if test ! -s conftest.s$ac_file; then
+    ac_more_lines=false
+    rm -f conftest.s$ac_file
+  else
+    if test -z "$ac_sed_cmds"; then
+      ac_sed_cmds="sed -f conftest.s$ac_file"
+    else
+      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+    fi
+    ac_file=`expr $ac_file + 1`
+    ac_beg=$ac_end
+    ac_end=`expr $ac_end + $ac_max_sed_cmds`
+  fi
+done
+if test -z "$ac_sed_cmds"; then
+  ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile
+         etc/Makefile
+         texi/Makefile
+         lisp/Makefile
+         lisp/w3-cfg.el
+         "}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+  # Remove last slash and all that follows it.  Not all systems have dirname.
+  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+    # The file is in a subdirectory.
+    test ! -d "$ac_dir" && mkdir "$ac_dir"
+    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+    # A "../" for each directory in $ac_dir_suffix.
+    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+  else
+    ac_dir_suffix= ac_dots=
+  fi
+
+  case "$ac_given_srcdir" in
+  .)  srcdir=.
+      if test -z "$ac_dots"; then top_srcdir=.
+      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+  *) # Relative path.
+    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+    top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+  case "$ac_given_INSTALL" in
+  [/$]*) INSTALL="$ac_given_INSTALL" ;;
+  *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+  esac
+
+  echo creating "$ac_file"
+  rm -f "$ac_file"
+  configure_input="Generated automatically from `echo $ac_file_in|sed 
's%.*/%%'` by configure."
+  case "$ac_file" in
+  *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+  *) ac_comsub= ;;
+  esac
+
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% 
$ac_given_srcdir/%g"`
+  sed -e "$ac_comsub
address@hidden@%$configure_input%g
address@hidden@%$srcdir%g
address@hidden@%$top_srcdir%g
address@hidden@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+
+echo "$ac_t""" "" 1>&6
+echo "$ac_t"""Sucessfully configured Emacs/W3"" 1>&6
+if test -n "$EMACS_PACKAGE_DIR"; then
+   echo "$ac_t"""Using package root:                ${EMACS_PACKAGE_DIR}"" 1>&6
+fi
+echo "$ac_t"""Using custom package installed in: ${CUSTOM}"" 1>&6
+echo "$ac_t"""Emacs/W3 will be compiled with:    ${EMACS}"" 1>&6
+echo "$ac_t""" "" 1>&6
+echo "$ac_t"""To finish building Emacs/W3 type \'make\' now."" 1>&6
+echo "$ac_t"""To install Emacs/W3 type \'make install\'."" 1>&6
+echo "$ac_t"""To create autoloads in \'${DOTEMACS}\' type \'make dotemacs\'"" 
1>&6
+

commit 66ca0c78453f19f0ed03d9cfc8850f3e391ae998
Author: William M. Perry <address@hidden>
Date:   Sun Dec 20 01:56:07 1998 +0000

    Make sure that the custom-load building still works under XEmacs.

diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index 92e99b1..8c636e6 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -73,7 +73,7 @@ auto-autoloads.el: $(SOURCES) $(URLSOURCES)
 
 custom-load.el: $(SOURCES) $(URLSOURCES)
        GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) W3SRCDIR=$(srcdir) 
@REBUILD_CUSTOMLOADS@
-       test -f cus-load.el && mv cus-load.el custom-load.el
+       if [ -f cus-load.el ]; then mv cus-load.el custom-load.el; fi
 
 w3-cfg.el: $(srcdir)/w3-cfg.el.in ../config.status
        ( cd ../ ; CONFIG_FILES=lisp/w3-cfg.el CONFIG_HEADERS= ./config.status)

commit 768cb22cdbeb8c8060862f49cd54dc4b782dcfe5
Author: William M. Perry <address@hidden>
Date:   Sun Dec 20 01:52:32 1998 +0000

    Added appropriate magic to run autoconf whenever configure.in is
    modified.

diff --git a/configure.in b/configure.in
index 8ddaa81..ce13559 100644
--- a/configure.in
+++ b/configure.in
@@ -56,16 +56,9 @@ AC_SUBST(DOTEMACS)
 AC_SUBST(TEXI2HTML)
 AC_SUBST(TEXI2HTML_FLAGS)
 
-if test "${GNUS}" = "no"; then
-AC_MSG_WARN(" ")
-AC_MSG_WARN(Emacs/W3 will be unable to deal with Content-ID (CID) URLs)
-AC_MSG_WARN(because the version of Gnus you are running does not support)
-AC_MSG_WARN(" ")
-AC_MSG_WARN(If you routinely receive multipart/related MIME messages,)
-AC_MSG_WARN(you may wish to upgrade to the latest version of Gnus that)
-AC_MSG_WARN(is natively MIME aware.  Please see http://www.gnus.org/ for)
-AC_MSG_WARN(information on Gnus and how to download it.)
-AC_MSG_WARN(" ")
+if test "${GNUS}" != "no"; then
+CIDFILE=url-cid.el
+AC_SUBST(CIDFILE)
 fi
 
 if test "${CUSTOM}" = "no"; then
@@ -103,3 +96,8 @@ AC_MSG_RESULT("To finish building Emacs/W3 type \'make\' 
now.")
 AC_MSG_RESULT("To install Emacs/W3 type \'make install\'.")
 AC_MSG_RESULT("To create autoloads in \'${DOTEMACS}\' type \'make dotemacs\'")
 
+dnl (aclocal.m4) Local variables:
+dnl (aclocal.m4) eval: (make-local-hook 'kill-buffer-hook)
+dnl (aclocal.m4) eval: (defun w3-rebuild-configure-files () (if 
(file-newer-than-file-p (buffer-file-name) (expand-file-name "configure" 
(file-name-directory (buffer-file-name)))) (shell-command "autoreconf")))
+dnl (aclocal.m4) eval: (add-hook 'kill-buffer-hook 'w3-rebuild-configure-files 
nil t)
+dnl (aclocal.m4) End: ***

commit 850345da19e74528e6b34f6ba887dc9279eee171
Author: William M. Perry <address@hidden>
Date:   Sun Dec 20 01:51:57 1998 +0000

    Added appropriate magic to run autoconf whenever aclocal.m4 is
    modified.

diff --git a/aclocal.m4 b/aclocal.m4
index 123cf62..d05b302 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -217,3 +217,9 @@ fi
 AC_MSG_RESULT("${REBUILD_CUSTOMLOADS}")
 AC_SUBST(REBUILD_CUSTOMLOADS)
 ])
+
+dnl (aclocal.m4) Local variables:
+dnl (aclocal.m4) eval: (make-local-hook 'kill-buffer-hook)
+dnl (aclocal.m4) eval: (defun w3-rebuild-configure-files () (if 
(file-newer-than-file-p (buffer-file-name) (expand-file-name "configure" 
(file-name-directory (buffer-file-name)))) (shell-command "autoreconf")))
+dnl (aclocal.m4) eval: (add-hook 'kill-buffer-hook 'w3-rebuild-configure-files 
nil t)
+dnl (aclocal.m4) End: ***

commit 05de9aae50c9c93ea65092871b1677dfe196eed2
Author: William M. Perry <address@hidden>
Date:   Sat Dec 19 04:20:55 1998 +0000

    Make sure that we remove AUTOSOURCES when we do a distclean.

diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index 76ed68f..92e99b1 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -103,7 +103,7 @@ install: all
        done;
 
 distclean: clean
-       $(RM) config.* Makefile w3-cfg.el w3-auto.el
+       $(RM) config.* Makefile w3-cfg.el w3-auto.el $(AUTOSOURCES)
 
 clean:
        $(RM) *.elc *~

commit 1d888b1c32264175311de98d1109c5e85acdc6b3
Author: William M. Perry <address@hidden>
Date:   Sat Dec 19 04:20:11 1998 +0000

    *** empty log message ***

diff --git a/lisp/docomp.el b/lisp/docomp.el
index 5d12c84..2d59a9a 100644
--- a/lisp/docomp.el
+++ b/lisp/docomp.el
@@ -129,9 +129,7 @@
   (save-excursion
     (load-library "cus-dep")
     (let ((command-line-args-left (list dir)))
-      (custom-make-dependencies)
-      (if (file-exists-p "cus-load.el")
-         (rename-file "cus-load.el" "custom-load.el")))))
+      (custom-make-dependencies))))
 
 (defun emacs-batch-build-custom-load ()
   (emacs-build-custom-load (car command-line-args-left)))

commit ce52d08205591ad28d36bf51e219d1d51a98aadb
Author: William M. Perry <address@hidden>
Date:   Sat Dec 19 04:19:57 1998 +0000

    Moved the renaming of cus-load to custm-load into the makefile, since
    custom-make-dependencies under Emacs is rude and does an exit-emacs
    for us.  Bah!

diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index 38e3e09..76ed68f 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -73,6 +73,7 @@ auto-autoloads.el: $(SOURCES) $(URLSOURCES)
 
 custom-load.el: $(SOURCES) $(URLSOURCES)
        GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) W3SRCDIR=$(srcdir) 
@REBUILD_CUSTOMLOADS@
+       test -f cus-load.el && mv cus-load.el custom-load.el
 
 w3-cfg.el: $(srcdir)/w3-cfg.el.in ../config.status
        ( cd ../ ; CONFIG_FILES=lisp/w3-cfg.el CONFIG_HEADERS= ./config.status)

commit 613673fe5f7e89662747a179c8235ed0e0c4ac06
Author: William M. Perry <address@hidden>
Date:   Sat Dec 19 04:14:43 1998 +0000

    More changes to support the creation of auto-autoloads and custom-load on 
any emacsen

diff --git a/ChangeLog b/ChangeLog
index 9e44771..010a5eb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 1998-12-18  William M. Perry  <address@hidden>
 
+* lisp/Makefile.in: No longer include auto-autoloads.el and custom-load in 
+  the distribution.  We can rebuild it anywhere now.
+
 * aclocal.m4 (AC_CHECK_CUSTOMLOADS): Use the new functions in the
   appropriate place.
   (EMACS_REBUILD_AUTOLOADS): Ditto.
diff --git a/aclocal.m4 b/aclocal.m4
index f5370b8..123cf62 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -192,9 +192,9 @@ AC_EMACS_CHECK_LIB(autoload,batch-update-directory,"noecho")
 EMACS_cv_REBUILD_AUTOLOADS=${HAVE_autoload}
 ])
 if test "${EMACS_cv_REBUILD_AUTOLOADS}" != "no"; then
-   REBUILD_AUTOLOADS='$(EMACS) $(BATCHFLAGS) -eval "(setq 
autoload-package-name \"w3\")" -l autoload -f batch-update-directory .'
+   REBUILD_AUTOLOADS='$(EMACS) $(BATCHFLAGS) -eval "(setq 
autoload-package-name \"w3\")" -l autoload -f batch-update-directory $(srcdir)'
 else
-   REBUILD_AUTOLOADS='$(EMACS) $(BATCHFLAGS) $(DEPS) -f 
emacs-batch-build-autoloads $(srcdir) auto-autoloads.el'
+   REBUILD_AUTOLOADS='$(EMACS) $(BATCHFLAGS) -l $(srcdir)/docomp.el -f 
emacs-batch-build-autoloads $(srcdir) auto-autoloads.el'
 fi
 AC_MSG_RESULT("${REBUILD_AUTOLOADS}")
 AC_SUBST(REBUILD_AUTOLOADS)
@@ -210,9 +210,9 @@ 
AC_EMACS_CHECK_LIB(cus_dep,Custom-make-dependencies,"noecho")
 EMACS_cv_REBUILD_CUSTOMLOADS=${HAVE_cus_dep}
 ])
 if test "${EMACS_cv_REBUILD_CUSTOMLOADS}" != "no"; then
-   REBUILD_CUSTOMLOADS='$(EMACS) $(BATCHFLAGS) -l cus-dep -f 
Custom-make-dependencies .'
+   REBUILD_CUSTOMLOADS='$(EMACS) $(BATCHFLAGS) -l cus-dep -f 
Custom-make-dependencies $(srcdir)'
 else
-   REBUILD_AUTOLOADS='$(EMACS) $(BATCHFLAGS) $(DEPS) -f 
emacs-batch-build-custom-load $(srcdir)'
+   REBUILD_CUSTOMLOADS='$(EMACS) $(BATCHFLAGS) $(DEPS) -f 
emacs-batch-build-custom-load $(srcdir)'
 fi
 AC_MSG_RESULT("${REBUILD_CUSTOMLOADS}")
 AC_SUBST(REBUILD_CUSTOMLOADS)
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index deebdfa..38e3e09 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -69,10 +69,10 @@ w3-auto.el: auto-autoloads.el
        cat $(srcdir)/auto-autoloads.el | sed 's/w3-autoloads/w3-auto/g' > $@
 
 auto-autoloads.el: $(SOURCES) $(URLSOURCES)
-       ( cd $(srcdir) ; GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) 
@REBUILD_AUTOLOADS@ )
+       GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) W3SRCDIR=$(srcdir) 
@REBUILD_AUTOLOADS@
 
 custom-load.el: $(SOURCES) $(URLSOURCES)
-       ( cd $(srcdir) ; GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) 
@REBUILD_CUSTOMLOADS@ )
+       GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) W3SRCDIR=$(srcdir) 
@REBUILD_CUSTOMLOADS@
 
 w3-cfg.el: $(srcdir)/w3-cfg.el.in ../config.status
        ( cd ../ ; CONFIG_FILES=lisp/w3-cfg.el CONFIG_HEADERS= ./config.status)
@@ -127,3 +127,4 @@ $(top_srcdir)/configure: $(top_srcdir)/configure.in 
$(top_srcdir)/aclocal.m4
 version: $(ALLSOURCES) $(EXTRAS) descrip.mms
        test -d $(DIRNAME)/lisp || mkdir -p $(DIRNAME)/lisp
        for x in descrip.mms $(ALLSOURCES) $(EXTRAS) w3-cfg.el.in w3-cfg.nt 
Makefile.in; do $(INSTALL) -m 644 $$x $(DIRNAME)/lisp; done
+       cd $(DIRNAME)/lisp && $(RM) $(AUTOSOURCES)
diff --git a/lisp/docomp.el b/lisp/docomp.el
index 140d4f3..5d12c84 100644
--- a/lisp/docomp.el
+++ b/lisp/docomp.el
@@ -1,5 +1,6 @@
 (setq load-path (append (list (expand-file-name 
                               (or (getenv "W3SRCDIR") "./"))
+                             "."
                              (or (getenv "WIDGETDIR")
                                  (expand-file-name "../widget"))
                              (or (getenv "GNUSDIR")
@@ -110,11 +111,13 @@
 
 (defun emacs-build-autoloads (dir autofile)
   (require 'autoload)
-  (let ((files (directory-files "." t ".*.el$" nil)))
+  (let ((files (directory-files dir t ".*.el$" nil)))
     (save-excursion
       (find-file autofile)
       (erase-buffer)
       (mapcar 'generate-file-autoloads files)
+      (goto-char (point-max))
+      (insert "\n(provide 'w3-autoloads)\n")
       (save-buffer)
       (kill-buffer (current-buffer)))))
 
@@ -133,6 +136,7 @@
 (defun emacs-batch-build-custom-load ()
   (emacs-build-custom-load (car command-line-args-left)))
 
+(provide 'w3-auto)
 (autoload 'w3-load-flavors "w3")
 
 (w3-load-flavors)

commit bc17b696ce0352dc618c1092531414149d70ad66
Author: William M. Perry <address@hidden>
Date:   Sat Dec 19 03:57:14 1998 +0000

    Changes from Ken'ichi HANDA for building in separate srcdir

diff --git a/ChangeLog b/ChangeLog
index 07814e5..9e44771 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,117 @@
+1998-12-18  William M. Perry  <address@hidden>
+
+* aclocal.m4 (AC_CHECK_CUSTOMLOADS): Use the new functions in the
+  appropriate place.
+  (EMACS_REBUILD_AUTOLOADS): Ditto.
+
+* lisp/docomp.el (emacs-build-custom-load): New function to build
+  custom-load.el under Emacs.
+  (emacs-build-autoloads): Ditto for the auto-autoloads.el file.
+
+1998-12-15  Kenichi Handa  <address@hidden>
+
+* lisp/Makefile.in (.el.elc): Set shell variable W3SRCDIR to $(srcdir).
+
+* lisp/docomp.el (load-path): Check shell variable W3SRCDIR.
+
+* lisp/w3.el (w3-convert-code-for-mule): Call
+  mule-coding-system-with-invalid-chars.
+ (w3-coding-system-with-invalid-chars): This function deleted.
+
+* lisp/mule-sysdp.el (w3-mime-charset-coding-alist): Fix coding
+  system for Mule.
+  (mule-invalid-char-coding-systems): New variable.
+  (mule-coding-system-with-invalid-chars): New function.
+  (mule-write-region-no-coding-system): Fix argument of write-region for
+  Mule 2.3.
+ 
+1998-12-17  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre32 released
+
+* lisp/font.el (font-x-font-regexp): Add a trailing dash to the
+  font-regexp.  For some reason Emacs 19.xx under 95/NT sticks a trailing
+  slash on the end.  This was the cause of the odd errors in
+  font-spatial-to-canonical since it was getting an empty font object
+  because the regexp failed to match.
+
+1998-12-16  William M. Perry  <address@hidden>
+
+* lisp/w3.el (w3-coding-system-for-mime-charset): Make sure the
+  coding-system-p is defined before we use it.
+  (w3-convert-code-for-mule): Ditto.
+
+* Makefile.in (SUPPORTFILES): Now include 'BUGS' support file in the
+  distributions.
+
+1998-12-16  Simon Josefsson <address@hidden>
+
+* lisp/mm.el (mm-parse-mailcaps): More protection against badly formed
+  MAILCAPS variable.
+
+1998-12-16  William M. Perry  <address@hidden>
+
+* lisp/w3-cus.el (w3-bullets): Fixed customization type for this option.
+  Would lead to mismatches in customize buffers.  Ick!
+  (w3-maximum-line-length): Ditto.
+
+1998-12-08  Ken'ichi HANDA <address@hidden>
+
+* lisp/mule-sysdp.el (mule-detect-coding-version): Check that
+  mule-sysdep-version is a number before comparing it to one.  Under
+  XEmacs it is a symbol `xemacs'.
+
+1998-12-03  William M. Perry  <address@hidden>
+
+* Updated all copyright dates and now specify that this _is_ a
+  part of Emacs, since it soon will be.  Maybe.  If I get ambitious.  what 
+  are the odds posted in vegas?
+
+* lisp/w3-display.el (w3-display-infer-contrasting-color): New function to 
+  chooise black or white as an appropriate color if the author of an HTML
+  page was stupid enough to do something like: <body bgcolor="white"> (ie: 
+  not specifying the foreground color as well).  If this conflicts with
+  the users foreground, the text used to be invisible.  Now it will be
+  whichever contrasts best (black on mint cream, white on dark red, etc)
+  (w3-display-node): If the foreground specified conflicts with the users' 
+  background, ignore it.
+  (w3-display-node): If the background specified conflicts with the users' 
+  foreground, infer an appropriate foreground.
+
+* Emacs/W3 4.0pre31 released
+
+* configure.in (CIDFILE): Stop spitting out a warning about
+  multipart/related stuff if we can't find Gnus at configure time.  We're
+  hacking around it in a different way now.
+
+* lisp/Makefile.in (URLSOURCES): Add url-cid.el into the definition via
+  configure substitutions ONLY.  It will still get installed because we
+  stick it in EXTRAS.  This means 1 extra file copy at install time, but
+  who cares?  The file isn't that large.
+
+* lisp/url-cid.el: New file to contain the content-id handling stuff,
+  because we cannot compile this file unless we can find a very recent
+  version of Gnus at compile time (without .emacs).
+
+* etc/default.css: Use the newer @media tags instead of @x*emacs so that
+  everything will work right with the new Emacs redisplay.
+
+* lisp/css.el (css-active-device-types): Added new @media tags.
+  multifont is now defined if the Emacsen we are running in can display
+  multiple font families and sizes correctly (new emacs redisplay or
+  XEmacs), and unifont if it cannot.
+
+* lisp/font.el (font-set-face-font-new-redisplay): New function for
+  dealing with the new Emacs redisplay font abstraction.  You can now beat 
+  the crap out of the new redisplay engine with Emacs/W3.  Ahh, feels like 
+  the heady old days of Lucid Emacs 19.10 and XEmacs 19.12.
+
+1998-12-02  Simon Josefsson <address@hidden>
+
+* lisp/mm.el (mm-parse-mailcaps): Deal gracefully with bad entries in the
+  MAILCAP list, or it would bug out with things like 'file:' where it
+  would try to open the current directory.
+
 1998-11-29  William M. Perry  <address@hidden>
 
 * lisp/docomp.el (load-path): Append the GNUSDIR environment variable to
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index 24382f5..deebdfa 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -26,7 +26,7 @@ URLSOURCES = \
        url-nfs.el url-file.el url-cookie.el url-parse.el url-irc.el    \
        url-gopher.el url-http.el url-mail.el url-misc.el url-news.el   \
        url-vars.el url-auth.el mm.el md5.el url-gw.el ssl.el base64.el \
-       url.el socks.el url-cache.el url-ns.el
+       url.el socks.el url-cache.el url-ns.el @CIDFILE@
 
 URLOBJECTS    = $(URLSOURCES:.el=.elc)
 
@@ -52,7 +52,7 @@ ALLSOURCES = $(SOURCES) $(URLSOURCES) $(AUTOSOURCES)
 ALLOBJECTS = $(OBJECTS) $(URLOBJECTS) $(AUTOOBJECTS)
 
 # Warning!  Currently, the following file can _NOT_ be bytecompiled.
-EXTRAS = w3-sysdp.el docomp.el
+EXTRAS = w3-sysdp.el docomp.el url-cid.el
 
 .SUFFIXES: .elc .el
 
@@ -60,7 +60,7 @@ EXTRAS = w3-sysdp.el docomp.el
        co -q $<
 
 .el.elc:
-       GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) $(EMACS) $(BATCHFLAGS) 
$(DEPS) -f batch-byte-compile $<
+       GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) W3SRCDIR=$(srcdir) $(EMACS) 
$(BATCHFLAGS) $(DEPS) -f batch-byte-compile $<
 
 all:   $(AUTOSOURCES) w3
 
@@ -84,7 +84,7 @@ xemacs-w3: $(ALLSOURCES) $(ALLOBJECTS)
        @echo Build of w3 complete...
 
 fast:  $(ALLSOURCES) $(EXTRAS)
-       $(EMACS) $(BATCHFLAGS) $(DEPS) -f batch-byte-compile $^
+       $(EMACS) $(BATCHFLAGS) $(DEPS) -f batch-byte-compile $(ALLSOURCES)
        @echo Build of w3 complete...
 
 autoloads:
@@ -102,10 +102,10 @@ install: all
        done;
 
 distclean: clean
-       $(RM) config.* Makefile w3-cfg.el
+       $(RM) config.* Makefile w3-cfg.el w3-auto.el
 
 clean:
-       $(RM) $(ALLOBJECTS)
+       $(RM) *.elc *~
 
 w3-vars.elc: w3-cus.elc w3-vars.el
 w3-display.elc: w3-display.el css.elc font.elc w3-imap.elc
diff --git a/lisp/mule-sysdp.el b/lisp/mule-sysdp.el
index fb530a4..9050ab8 100644
--- a/lisp/mule-sysdp.el
+++ b/lisp/mule-sysdp.el
@@ -1,6 +1,6 @@
 ;;; mule-sysdp.el --- consolidate MULE-version dependencies in one file.
 
-;; Copyright (c) 1996 - 1998 William Perry
+;; Copyright (c) 1996 - 1999 William Perry
 
 ;; Author: William Perry <address@hidden>
 ;; Keywords: lisp, tools
@@ -46,7 +46,7 @@
 
 (defconst w3-mime-charset-coding-alist
   `(("big5" . ,(mule-coding-system-version 'cn-big5 '*big5*))
-    ("euc-jp" . ,(mule-coding-system-version 'euc-jp '*euc-jp*))
+    ("euc-jp" . ,(mule-coding-system-version 'euc-jp '*euc-japan*))
     ("euc-kr" . ,(mule-coding-system-version 'euc-kr '*euc-korea*))
     ("gb" . ,(mule-coding-system-version 'cn-gb-2312 '*euc-china*))
     ("iso-2022-jp" . ,(mule-coding-system-version 'iso-2022-jp '*iso-2022-jp*))
@@ -115,12 +115,33 @@ find-file-hooks, etc.
            (input-coding-system mule-no-coding-system))
        (insert-file-contents file visit beg end replace))))
 
+;; List of coding systems that require calling
+;; w3-replace-invalid-chars after decoding a text by them.
+(defconst mule-invalid-char-coding-systems
+  (list (mule-coding-system-version 'raw-text '*noconv*)
+       (mule-coding-system-version 'iso-latin-1 '*ctext*)))
+
+;; Return non-nil if CODING-SYSTEM requires calling
+;; w3-replace-invalid-chars after decoding a text.
+(defun mule-coding-system-with-invalid-chars (coding-system)
+  (or (null coding-system)
+      (let (base)
+       (if (listp coding-system)
+           (setq coding-system (car coding-system)))
+       (if (fboundp 'coding-system-base)
+           (setq base (coding-system-base coding-system))
+         (while (not (vectorp (get coding-system 'coding-system)))
+           (setq coding-system (get coding-system 'coding-system)))
+         (setq base coding-system))
+       (memq base mule-invalid-char-coding-systems))))
+
 (defun mule-detect-coding-version (host st nd)
   "Return a coding system of the current data."
   (let ((coding-system nil))
     ;; The facility of detecting a coding system by language
     ;; environment is provided only in Emacs 20.3 (Mule 4.0) or later.
     (if (and host
+            (numberp mule-sysdep-version)
             (>= mule-sysdep-version 4.0))
        (let ((l w3-url-domain-language-environment-alist))
          (while l
@@ -235,7 +256,7 @@ find-file-hooks, etc.
        (file-coding-system-alist nil))
     (case mule-sysdep-version
       (2.3
-       (write-region st nd file append visit *noconv*))
+       (write-region st nd file append visit lockname mule-no-coding-system))
       (3.0
        (let ((enable-multibyte-characters t))
         (write-region st nd file append visit lockname)))
diff --git a/lisp/w3.el b/lisp/w3.el
index 957c1cf..31e1df5 100644
--- a/lisp/w3.el
+++ b/lisp/w3.el
@@ -1,12 +1,12 @@
 ;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
 ;; Author: $Author: wmperry $
-;; Created: $Date: 1998/12/01 22:12:07 $
-;; Version: $Revision: 1.1 $
+;; Created: $Date: 1998/12/19 03:57:16 $
+;; Version: $Revision: 1.2 $
 ;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
-;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;; Copyright (c) 1996 - 1999 Free Software Foundation, Inc.
 ;;;
 ;;; This file is part of GNU Emacs.
 ;;;
@@ -1178,6 +1178,7 @@ invokes some commands which read a coding system from the 
user.")
        (let (charset-symbol coding-system)
         (cond (;; explicit coding system ? (through C-u [w3-reload-document])
                (and w3-explicit-coding-system
+                    (fboundp 'coding-system-p)
                     (coding-system-p w3-explicit-coding-system))
                (setq coding-system w3-explicit-coding-system))
               (;; explicit charset ? (through MIME headers or META tag)
@@ -1199,7 +1200,7 @@ invokes some commands which read a coding system from the 
user.")
                      (mule-detect-coding-version (url-host url-current-object)
                                                  (point-min) (point-max)))))
         (mule-code-convert-region coding-system)
-        (if (w3-coding-system-with-invalid-chars coding-system)
+        (if (mule-coding-system-with-invalid-chars coding-system)
             (w3-replace-invalid-chars)))))
 
 (defun w3-coding-system-for-mime-charset (mmcharset)
@@ -1207,18 +1208,13 @@ invokes some commands which read a coding system from 
the user.")
        (l w3-mime-charset-coding-alist))
     (while l
       (if (string-match (car (car l)) mmcharset)
-         (setq coding-system (if (coding-system-p (cdr (car l)))
+         (setq coding-system (if (and (fboundp 'coding-system-p)
+                                      (coding-system-p (cdr (car l))))
                                  (cdr (car l)))
                l nil)
        (setq l (cdr l))))
     coding-system))
 
-(defun w3-coding-system-with-invalid-chars (coding-system)
-  (or (null coding-system)
-      (let* ((coding-system (if (listp coding-system) (car coding-system) 
coding-system))
-            (base (coding-system-base coding-system)))
-       (memq base '(raw-text iso-latin-1)))))
-
 (defun w3-replace-invalid-chars ()
   (let ((invalid-char-alist w3-invalid-sgml-char-replacement))
     (while invalid-char-alist

commit 8c0aa7f559f69a3e47a55a65a4c750fbd7f6699a
Author: William M. Perry <address@hidden>
Date:   Sat Dec 19 03:55:50 1998 +0000

    New way to build the custom-load and auto-autoloads file under Emacs.

diff --git a/aclocal.m4 b/aclocal.m4
index 748c3e9..f5370b8 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -194,14 +194,14 @@ EMACS_cv_REBUILD_AUTOLOADS=${HAVE_autoload}
 if test "${EMACS_cv_REBUILD_AUTOLOADS}" != "no"; then
    REBUILD_AUTOLOADS='$(EMACS) $(BATCHFLAGS) -eval "(setq 
autoload-package-name \"w3\")" -l autoload -f batch-update-directory .'
 else
-   REBUILD_AUTOLOADS='touch auto-autoloads.el'
+   REBUILD_AUTOLOADS='$(EMACS) $(BATCHFLAGS) $(DEPS) -f 
emacs-batch-build-autoloads $(srcdir) auto-autoloads.el'
 fi
 AC_MSG_RESULT("${REBUILD_AUTOLOADS}")
 AC_SUBST(REBUILD_AUTOLOADS)
 ])
 
 dnl
-dnl Figure out how we can rebuild the auto-autoloads.el files
+dnl Figure out how we can rebuild the custom-load.el files
 dnl
 AC_DEFUN(AC_CHECK_CUSTOMLOADS, [
 AC_MSG_CHECKING(how to rebuild custom autoloads)
@@ -212,7 +212,7 @@ EMACS_cv_REBUILD_CUSTOMLOADS=${HAVE_cus_dep}
 if test "${EMACS_cv_REBUILD_CUSTOMLOADS}" != "no"; then
    REBUILD_CUSTOMLOADS='$(EMACS) $(BATCHFLAGS) -l cus-dep -f 
Custom-make-dependencies .'
 else
-   REBUILD_CUSTOMLOADS='touch custom-load.el'
+   REBUILD_AUTOLOADS='$(EMACS) $(BATCHFLAGS) $(DEPS) -f 
emacs-batch-build-custom-load $(srcdir)'
 fi
 AC_MSG_RESULT("${REBUILD_CUSTOMLOADS}")
 AC_SUBST(REBUILD_CUSTOMLOADS)

commit 61813434b6c7a08d1d36ba14fa02168e79483909
Author: William M. Perry <address@hidden>
Date:   Sat Dec 19 03:54:17 1998 +0000

    Added functions to build autoloads and custom loads for non-XEmacs
    flavors.

diff --git a/lisp/docomp.el b/lisp/docomp.el
index 235c6b3..140d4f3 100644
--- a/lisp/docomp.el
+++ b/lisp/docomp.el
@@ -1,4 +1,5 @@
-(setq load-path (append (list (expand-file-name "./")
+(setq load-path (append (list (expand-file-name 
+                              (or (getenv "W3SRCDIR") "./"))
                              (or (getenv "WIDGETDIR")
                                  (expand-file-name "../widget"))
                              (or (getenv "GNUSDIR")
@@ -107,6 +108,31 @@
          (byte-compile-file (car files)))
       (setq files (cdr files)))))
 
+(defun emacs-build-autoloads (dir autofile)
+  (require 'autoload)
+  (let ((files (directory-files "." t ".*.el$" nil)))
+    (save-excursion
+      (find-file autofile)
+      (erase-buffer)
+      (mapcar 'generate-file-autoloads files)
+      (save-buffer)
+      (kill-buffer (current-buffer)))))
+
+(defun emacs-batch-build-autoloads ()
+  (emacs-build-autoloads (nth 0 command-line-args-left)
+                        (nth 1 command-line-args-left)))
+
+(defun emacs-build-custom-load (dir)
+  (save-excursion
+    (load-library "cus-dep")
+    (let ((command-line-args-left (list dir)))
+      (custom-make-dependencies)
+      (if (file-exists-p "cus-load.el")
+         (rename-file "cus-load.el" "custom-load.el")))))
+
+(defun emacs-batch-build-custom-load ()
+  (emacs-build-custom-load (car command-line-args-left)))
+
 (autoload 'w3-load-flavors "w3")
 
 (w3-load-flavors)

commit 76e07d77f700bc900b9ab5207e7ffeb93504ade1
Author: William M. Perry <address@hidden>
Date:   Fri Dec 18 02:18:38 1998 +0000

    Initial revision

diff --git a/BUGS b/BUGS
new file mode 100644
index 0000000..638f1b2
--- /dev/null
+++ b/BUGS
@@ -0,0 +1,37 @@
+If any bugs are discovered in Emacs/W3, please report them to the
+mailing list address@hidden --- this is where the brave souls who
+beta test the latest versions of Emacs/W3 reside, and are generally
+very responsive to bug reports.
+
+Please make sure to use the bug submission feature of Emacs/W3, so
+that all relevant information will be sent along with your bug report.
+By default this is bound to the `w' key when in an Emacs/W3 buffer, or
+you can use 'M-x w3-submit-bug' from anywhere within Emacs.
+
+For problems that are causing emacs to signal and error, please send a
+backtrace.  You can get a backtrace by 'M-x set-variable RET
+debug-on-error RET t RET', and then reproduce the error.
+
+If the problem is visual, please capture a copy of the output and mail
+it along with the bug report (preferably as a MIME attachment, but
+anything will do).  You can use the @code{xwd} program under X-windows
+for this, or @key{Alt-PrintScreen} under Windows 95/NT.  Sorry, but I
+don't remember what the magic incarnation is for doing a screen dump
+under NeXTstep or OS/2.
+
+If the problem is actually causing Emacs to crash, then you will need
+to also mail the maintainers of the various Emacs distributions with
+the bug.  Please use the 'gnu.emacs.bug' newgroup for reporting bugs
+with GNU Emacs, and 'comp.emacs.xemacs' for reporting bugs with XEmacs
+.  I am actively involved with the beta testing of the latest versions
+of both branches of Emacs, and if I can reproduce the problem, I will
+do my best to see it gets fixed in the next release.
+
+It is also important to always maintain as much context as possible in
+your responses.  I get so much email from my various Emacs-activities
+and work, that I cannot remember everything.  If you send a bug
+report, and I send you a reply, and you reply with 'no that didn't
+work', then odds are I will have no clue what didn't work, much less
+what that was trying to fix in the first place.  It will be much
+quicker and less painful if I don't have to waste a round-trip email
+exchange saying 'what are you talking about'.
diff --git a/lisp/url-cid.el b/lisp/url-cid.el
new file mode 100644
index 0000000..db3adcb
--- /dev/null
+++ b/lisp/url-cid.el
@@ -0,0 +1,66 @@
+;;; url-cid.el --- Content-ID URL loader
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/18 02:20:05 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1998 - 1999 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'url-vars)
+(require 'url-parse)
+(require 'widget)
+
+(require 'mm-decode)
+
+(defun url-cid-gnus (cid)
+  (set-buffer (get-buffer-create url-working-buffer))
+  (let ((content-type nil)
+       (encoding nil)
+       (part nil)
+       (data nil))
+    (setq part (mm-get-content-id cid))
+    (if (not part)
+       (message "Unknown CID encountered: %s" cid)
+      (setq data (buffer-string nil nil (mm-handle-buffer part))
+           content-type (mm-handle-type part)
+           encoding (symbol-name (mm-handle-encoding part)))
+      (if (= 0 (length content-type)) (setq content-type "text/plain"))
+      (if (= 0 (length encoding)) (setq encoding "8bit"))
+      (if (listp content-type)
+         (setq content-type (car content-type)))
+      (setq url-current-content-length (length data)
+           url-current-mime-type content-type
+           url-current-mime-encoding encoding
+           url-current-mime-headers (list (cons "content-type" content-type)
+                                          (cons "content-encoding" encoding)))
+      (and data (insert data)))))
+
+(defun url-cid (url)
+  (if (not (string-match "^cid:\\(.*\\)" url))
+      (message "Malformed CID URL: %s" url)
+    (setq url (url-unhex-string (match-string 1 url)))
+    (cond
+     ((fboundp 'mm-get-content-id)
+      ;; Using Pterodactyl Gnus or later
+      (url-cid-gnus url))
+     (t
+      (message "Unable to handle CID URL: %s" url)))))

commit 3ff5c3e67e1e7fa8004bc2f2eddc3cc183a3aed8
Author: William M. Perry <address@hidden>
Date:   Tue Dec 1 22:11:55 1998 +0000

    Initial revision

diff --git a/.version b/.version
new file mode 100644
index 0000000..64bb6b7
--- /dev/null
+++ b/.version
@@ -0,0 +1 @@
+30
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..07814e5
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,4381 @@
+1998-11-29  William M. Perry  <address@hidden>
+
+* lisp/docomp.el (load-path): Append the GNUSDIR environment variable to
+  the load-path, similar to how we deal with WIDGETDIR
+
+* INSTALL: Document the new --with-gnus arguments.
+
+* configure.in: Use AC_CHECK_GNUS and spit out appropriate warnings about
+  cid URLS not working when appropriate.
+
+* aclocal.m4 (AC_CHECK_GNUS): Try to find mm-get-content-id in mm-decode
+  for newer gnus releases that can handle the content-id stuff.  Also
+  added new configure switch '--with-gnus=/path/to/gnus/lisp/dir' to
+  override this, similar to how the custom stuff works.
+
+* lisp/url-misc.el (url-cid-gnus): Try to load mm-decode at compile time.
+  (url-cid-gnus): Fixed some compilation warnings.
+
+* lisp/url.el (url-cid): Ooops - forgot to add an autoload for url-cid
+
+* Emacs/W3 4.0pre30 released
+
+* lisp/url.el (url-do-setup): Duh, forgot to register the CID handler.
+  Good thing lars was doing it too.
+
+* Emacs/W3 4.0pre29 released
+
+* lisp/url-misc.el (url-cid): New URL handler for dealing with content-id
+  based references.  Able to be extended for different mail/news readers.
+  Need to coordinate with Lars and Kyle on exactly how to determine which
+  UA is invoking us, so we don't try and use Gnus functions when VM is
+  giving us the data, etc.
+  (url-cid-gnus): First implementation of CID retrieval for Pterodactyl
+  Gnus.
+
+* lisp/w3-display.el (w3-finalize-image-download): Make sure we call
+  url-uncompress in w3-finalize-image-download, or content-id and data URL 
+  based images won't get uncompressed correctly.  Arguably this should be
+  done in url-default-callback, but I'm not sure what that would fubar
+  right now.
+
+* lisp/w3-parse.el (w3-parse-buffer): Changed regexp for handling
+  NET-enabling start tags to be not so restrictive.  I don't think this
+  will have any negative side-effects
+
+1998-11-28  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre28 released
+
+1998-11-23  Thierry Emery <address@hidden>
+
+* lisp/mule-sysdp.el
+  (w3-mime-charset-coding-alist): completed and reordered;
+  (mule-detect-coding-version): removed MIME type parsing (already done in
+  w3-sentinel) and moved use of w3-mime-charset-coding-alist to
+  w3-coding-system-for-mime-charset;
+
+* lisp/w3.el
+  (w3-convert-code-for-mule): added call to w3-coding-system-for-mime-charset
+  for handling specified MIME charset;
+  (w3-coding-system-for-mime-charset): code moved from
+  mule-detect-coding-version, which uses w3-mime-charset-coding-alist;
+  (w3-sentinel): moved downcase of MIME type and charset to
+  w3-convert-code-for-mule call arguments and generalized it to encoding;
+  replaced hacking out "x-" in MIME charsets with proper reference to
+  w3-mime-charset-coding-alist in w3-coding-system-for-mime-charset.
+
+1998-11-20  Ken'ichi HANDA <address@hidden>
+
+* lisp/w3.el
+  (w3-explicit-coding-system): new variable for user-specified coding system
+  on C-u [w3-reload-document];
+  (w3-convert-code-for-mule, w3-reload-document): added handling of
+  w3-explicit-coding-system.
+
+1998-11-24  Kenichi Handa  <address@hidden>
+
+* lisp/mule-sysdp.el (mule-sysdep-version): Check the mule version
+  correctly.
+  (mule-coding-system-version): New function.
+  (w3-mime-charset-coding-alist): New variable.
+  (w3-url-domain-language-environment-alist): New variable.
+  (w3-url-domain-coding-alist): New variable.
+  (mule-retrieval-coding-system): Call mule-coding-system-version.
+  (mule-no-coding-system): Likewise.
+  (insert-file-contents-literally): Re-define this function for Mule
+  Ver.2.3.
+  (mule-detect-coding-version): Pay attention to
+  w3-mime-charset-coding-alist,
+  w3-url-domain-language-environment-alist, and
+  w3-url-domain-coding-alist.
+  (mule-code-convert-region): Change argument to CODE only.  If
+  default-enable-multibyte-characters is nil, does no code
+  conversion.
+
+* lisp/url-cache.el (url-store-in-cache): Write to a file with no
+  code conversion.
+
+* lisp/w3.el (w3-convert-code-for-mule): Call
+  mule-code-convert-version with one arg CODING-SYSTEM.
+
+1998-11-22  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre27 released
+
+* lisp/w3.el (w3-mode): ditto
+
+* lisp/w3-display.el (w3-display-node): Make sure we don't try to
+  save/restore variables in w3-persistent-variables if they are not
+  'boundp'
+
+1998-11-20  Thierry Emery  <address@hidden>
+
+* lisp/mule-sysdp.el
+  (mule-write-region-no-coding-system): added additional write-region arguments
+  and protections moved from w3-download-callback.
+
+* lisp/mm.el (mm-find-available-multiparts), lisp/url-cache.el
+  (url-store-in-cache), lisp/w3-display.el (w3-display-get-cookie,
+  w3-finalize-image-download), lisp/w3-latex.el (w3-show-dvi), lisp/w3-print.el
+  (w3-print-this-url), lisp/w3.el (w3-save-as, w3-download-callback):
+  use mule-write-region-no-coding-system.
+
+* lisp/url-vars.el, lisp/url-http.el (url-parse-mime-headers): added
+  url-current-mime-charset and url-mime-content-type-charset-regexp.
+
+* lisp/w3-cus.el (w3-force-conversion-alist): new user option, alist of URL
+  host/filename regexps and coding systems.
+
+* lisp/w3-vars.el
+  (w3-meta-content-type-charset-regexp, w3-meta-charset-content-type-regexp):
+  new variables for parsing <META Content-Type...> tag;
+
+  (w3-persistent-variables): added buffer-file-coding-system.
+
+* list/w3.el
+  (w3-mail-current-document): use buffer-file-coding-system or iso-8859-1;
+  (w3-compression-encodings, w3-no-conversion-encodings): new variables used to
+  inhibit conversion;
+  (w3-convert-code-for-mule): removed regexp matching on
+  w3-mime-list-for-code-conversion (replaced by downcase in w3-sentinel);
+  (w3-sentinel): switch to other window if in minibuffer, handle specified
+  charset (in MIME headers or META tag), handle w3-force-conversion-alist, hack
+  out "x-" in MIME charsets.
+
+1998-11-18  Kenichi Handa  <address@hidden>
+
+* Makefile.in (Makefile): Correct the dependency.  Execute
+  config.status in the current directory.
+
+* etc/Makefile.in (install): If a file is not in the current
+  directory, install that file of the source directory.
+
+* lisp/Makefile.in (w3-auto.el): Update target in the current
+  directory.
+  (auto-autoloads.el): Do the work in $(srcdir).
+  (custom-load.el): Likewise.
+  (install): If a file is not in the current directory, install that
+  file of the source directory.
+
+* lisp/docomp.el (byte-compile-dest-file): New function for
+  writing out *.elc to the current directory.
+
+1998-09-26  Gareth Jones  <address@hidden>
+
+* lisp/w3-vars.el: defvar'ed w3-current-buffer.
+
+* lisp/w3.el (w3-fetch): set w3-current-last-buffer for reused URLs.
+  (w3-pass-to-viewer): set w3-current-last-buffer to w3-current-buffer.
+  (w3-fetch): bind w3-current-buffer to (current-buffer).
+        Make history work with url-be-asynchronous t.  
+
+1998-09-25  Gareth Jones  <address@hidden>
+
+* lisp/w3-vars.el (w3-mode-map): Bind [backspace] to scroll-down.      
+
+1998-09-09  Gareth Jones  <address@hidden>
+
+* lisp/w3-emulate.el (w3-lynx-emulation-minor-mode-map): Corrected C-f
+  to be `scroll-up', added bindings for C-b, C-n and C-p.
+
+* lisp/w3-cus.el (w3-latex-use-latex2e): Documentation fix.  LaTeX
+  "generator" makes more sense than "parser".
+
+* lisp/url.el (url-do-setup): ditto for url-cookie-file and
+  url-global-history-file.     
+
+* lisp/url-cache.el (url-cache-directory): use w3-configuration-directory
+  rather than hardwire "~/.w3/"
+
+* lisp/url-news.el (url-nntp): fixed call to url-news-fetch-newsgroup with
+  only one argument.
+  (url-check-gnus-version): Added Pterodactyl Gnus to the list of
+  acceptable Gnusen.
+
+* lisp/url-mail.el (url-mailto): url-mailto would not handle %3F (`?')
+  in addresses because url-unhex-string changed match-end.
+  Added support for "body" hname.  Emit style warning for <mailto:/.*>.
+
+1998-10-29  William Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-region): Make me autoloaded.
+
+1998-10-28  William M. Perry  <address@hidden>
+
+* lisp/mule-sysdp.el (mule-code-convert-region): Try to avoid lossage when 
+  point-max changes due to a set-buffer-multibyte operation.
+
+1998-10-28  Laurent Martelli <address@hidden>
+
+* Patches to add hotindex support.  It's a patch to W3/Emacs allowing you
+  to associate keywords to your  hotlist  entries.  You can then query
+  for  the entries matching a keyword. I  did  this because  I find it
+  hard  to find  a particular bookmark when  you more than  a hundred,
+  even with hotlist-apropos. And I think  that folders and subfolders
+  are not  very convenient because  an entry usually belongs to more
+  than one folder.
+
+1998-10-26  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre25 released
+
+* lisp/w3-display.el (w3-get-all-face-info): Fixed stupid problem where
+  w3-user-fonts-take-precedence was being used backwards!
+
+* Emacs/W3 4.0pre24 released
+
+1998-10-25  Thierry Emery <address@hidden>
+
+* lisp/w3-speak-table.el: Various patches from Thierry to help Emacspeak
+
+1998-10-23  William Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-get-all-face-info): Better way to ignore font
+  family stuff if w3-user-fonts-take-precedence != nil
+
+1998-10-23  Lars Marius Garshol <address@hidden>
+
+* lisp/url-file.el (url-cleanup-file): New function for removing
+  questionable practices from file urls before we fetch them.  Should fix
+  lots of the problems where we tried to ftp when we shouldn't have.
+
+1998-10-23  William Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-face-for-element): Use it.
+
+* lisp/w3-cus.el: New variable on whether to ignore document fonts or
+  not.
+
+1998-10-23  Toby Speight <address@hidden>
+
+* lisp/w3.el (w3-internal-handle-preview): Fix for previewing files under
+  windows that have UNC paths (ie: //foo/bar).  Would try to use ftp
+  otherwise.
+
+* lisp/w3-vars.el (w3-mode-map): Added keybindings for them.
+
+* lisp/w3.el (w3-prev-document): Added new function
+(w3-next-document): ditto
+
+* Added w3-hotindex.el to the contrib directory - adds keyword searching
+  to the hotlist code.
+
+1998-09-20  William M. Perry  <address@hidden>
+
+* */Makefile.in: Fixed the automatic rebuilding based on
+  configure/aclocal.m4 and config.status.  Everything should build in a
+  separate source directory now.
+
+1998-09-08  William M. Perry  <address@hidden>
+
+* lisp/font.el (define-font-keywords): build the :regular keyword with the
+  rest, for v19 emacs
+
+1998-09-08  Charles Levert <address@hidden>
+
+* lisp/w3-parse.el: Patch to deal with incredibly bad HTML that specifies
+  attributes like font="foo","bar","baz".  Ick.
+
+* lisp/w3-forms.el (w3-form-create-image): Fix for image submit buttons.
+
+1998-09-08  William M. Perry  <address@hidden>
+
+* lisp/w3-parse.el: Allow '?' in unquoted attribute values, so that CGI
+  queries in unquoted HREFs work correctly.
+
+1998-08-30  William M. Perry  <address@hidden>
+
+* lisp/docomp.el: Added approprate magic to add the
+  custom-declare-variable byte-hunk-handler so that in version of Emacs <=
+  19.34, customized variables do not show up as 'free' to the byte
+  compiler.
+
+1998-08-22  T. V. Raman <address@hidden>
+
+* lisp/w3-speak-table.el: Implemented table navigation for nested tables 
+  Also implemented emacspeak/w3 command for querying info about the
+  current cell.  cleaned up keybindings
+
+1998-06-22  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre23 released
+
+* lisp/w3-cfg.el.in (w3-configuration-data): Allow the cdr of the assoc
+  list to be something to be eval'd.  Allows things to work better under
+  NT/95 Emacs/XEmacs without needing to do a 'configure' run.  See new
+  file w3-cfg.nt.
+
+* lisp/w3.el (w3-viewer-filter): Start showing output from the viewer
+  program as soon as we get it instead of after it exits.  This allows
+  viewers to spit out instructions on their use (ie: imageviewer under
+  solaris says things like 'hit q to make the window disappear'.
+
+* build.bat: Copy new w3-cfg.nt file over to w3-cfg.el before doing the
+  compile for those NT/Win95 people.
+
+Wed Jun 17 18:30:11 1998  Jonathan Harris <address@hidden>
+
+* lisp/font.el (mswindows-font-create-object): various mswindows fixes -
+  please speak up if anything is broken!
+
+1998-06-18  Stefan Hornburg  <address@hidden>
+
+* lisp/url-file.el (url-file): Fixed a regexp that should match drive
+  letters.  This fixes a longstanding bug where efs/ange-ftp would get
+  invoked instead of looking locally.
+
+1998-06-13  William M. Perry  <address@hidden>
+
+* lisp/w3-hot.el (finish-submenu): Ignore empty strings when searching for 
+  sublist titles.  Reading netscape bookmark files works correctly again.
+
+1998-06-12  William M. Perry  <address@hidden>
+
+* lisp/w3-xemac.el (w3-mouse-handler): Make sure we don't do anything if
+  the current buffer is not the one our event is destined for.  Avoids
+  some weird errors in XEmacs on corner cases w/mouse movement.
+
+* lisp/w3-annotat.el: Removed some old variables - evidently nobody uses
+  this shit any more. :)
+
+* lisp/w3-menu.el (w3-menu-breakup): Moved into this file because it is
+  where it belongs.  Also changed so that 'more...' menu items are spliced 
+  in at the end of the menu where they belong.
+  All the filter menus should work under Emacs 20.3 now.
+  (w3-popup-menu): No longer use 'popup-menu' - this removes the need
+  under Emacs to (require 'lmenu), which caused lots and lots of problems
+  with invalid macros, etc.
+
+1998-06-10  William M. Perry  <address@hidden>
+
+* lisp/w3-menu.el (w3-menu-filters-supported-p): New variable to determine 
+  whether this flavor of Emacs supports the :filter keyword on
+  menus.  Emacs 20.3 will support the :filter keyword, so lets use it.
+  (w3-menu-go-menu): Use it.
+  (w3-menu-bookmark-menu): Ditto.
+  (w3-menu-html-links-constructor): Make this work with easymenu.
+  (w3-menu-hotlist-constructor): Ditto.
+  (w3-menu-links-constructor): Ditto.
+  (w3-menu-e19-show-navigate-menu): Moved from w3-e19.el
+  (w3-menu-e19-show-links-menu): Ditto.
+  (w3-menu-e19-show-hotlist-menu): Ditto.
+
+* lisp/w3-xemac.el (w3-store-in-clipboard): Make this work under mswindows 
+  devices.
+
+1998-06-09  William M. Perry  <address@hidden>
+
+* lisp/w3.el (w3-find-default-stylesheets): Use w3-configuration-data to
+  slap the 'datadir' macro into the search path for stylesheets.
+
+* lisp/w3-cfg.el.in: New file that will store information from the
+  configure run for use later.
+  (w3-configuration-data): New function to retrieve configure-time
+  information later.
+
+* lisp/url-vars.el (url-privacy-level): changed customization properties.
+
+1998-06-08  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0.pre21 released
+
+* lisp/w3-parse.el (w3-parse-buffer): Better dealing with the
+  sera-to-fidel stuff in MULE - and don't bother calling it when
+  default-enable-multibyte-characters is nil for mule 4.x
+
+* lisp/w3.el (w3-download-callback): Use
+  mule-write-region-no-coding-system so that all the MULE variations are
+  hidden within mule-sysdp.el, where they belong.
+
+1998-06-05  Dave Love  <address@hidden>
+
+* lisp/mule-sysdp.el (mule-retrieval-coding-system,
+  mule-no-coding-system, mule-detect-coding-version,
+  mule-inhibit-code-conversion, mule-encode-string,
+  truncate-string-to-width, mule-coding-system-name,
+  mule-find-coding-system): Test for mule-sysdep-version == 4.0.
+  (mule-code-convert-region, mule-make-iso-character): Test for
+  mule-sysdep-version == 4.0.  Also test
+  default-enable-multibyte-characters.
+  (mule-truncate-string): Test for mule-sysdep-version == 4.0.  Use
+  truncate-string-to-width in Emacs 20.
+
+1998-06-04  William M. Perry  <address@hidden>
+
+* lisp/url-http.el (url-create-mime-request): New behaviour wrt
+  url-mime-language-string - if it is nil, then no accept-language header
+  will be sent.  This is to work around problem when dealing with apache - 
+  the old default of '*' would cause the server to return the first
+  version of a document it could find (w3c site would typically send out
+  danish or japanese) - definitely suboptimal.  I don't know how this will 
+  impact you MULE folks though - speak up!
+
+* lisp/url-vars.el (url-mime-language-string): Better customization of
+  this - new default value of nil.
+
+1998-06-02  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0.pre20 released
+
+1998-06-02  Thierry Emery <address@hidden>
+
+* lisp/w3-display.el (w3-refresh-buffer): Try to stay as close to current
+  point as we can when you do a refresh-buffer.
+
+* lisp/w3-display.el (w3-display-table): Fix for Emacspeak table
+  traversal that was broken by the new borderless table features.
+
+* lisp/w3-display.el: Various fixes for alternate image text in tables.
+
+1998-05-25  William M. Perry  <address@hidden>
+
+* lisp/w3-menu.el (w3-menu-options-menu): Fixed problem where newest
+  easymenu (emacs 20.2.93) is a little pickier than before and dies on
+  'nil' menu entries.
+
+* lisp/mule-sysdp.el: Avoid setting enable-multibyte-characters directly
+  under Emacs 20.3-to-be, since it is now a read-only variable.  Use
+  set-buffer-multibyte instead.
+
+1998-05-24  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre19 released
+
+* lisp/url.el (url-file-extension): Make sure we run this through
+  url-basepath to strip out CGI queries.
+  (url-basepath): Strip out any CGI queries from a file when we get its
+  basepath.  This means that relative URLs in CGI results will work much
+  more sanely.
+
+* lisp/mule-sysdp.el (mule-detect-coding-version): Work around incredibly
+  weird bug in Emacs 20.2 where detect-coding-region can return 100%
+  insane results whcih then case code-convert-region to die a horrible
+  death.
+
+* lisp/w3.el (w3-download-callback): Don't blindly bind
+  file-name-handler-alist to nil just to get around auto-compression
+  packages, use the ugly internal knowledge of the most popular ones and
+  disable them like we do in the url-file-* routines.  Otherwise you
+  cannot download a file directory to an EFS filename.
+
+Fri May 22 14:39:52 1998  William M. Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-display-table): Don't insert empty space for
+  borderless tables - this will allow you to display much more data on a
+  page.
+
+Thu May 21 16:09:57 1998  William M. Perry  <address@hidden>
+
+* lisp/w3-forms.el (w3-form-encode-helper): Fixed 'file' submissions -
+  return value of insert-file-contents-literally changed.
+
+* lisp/w3-hot.el (w3-hotlist-break-shit): Make everything interactive!
+
+1998-05-19  William M. Perry  <address@hidden>
+
+* lisp/css.el (css-contextual-match): Fixed scoping bug in CSS - you could 
+  not specify something like '.menu a { color: red }' - it was not walking 
+  up the list correctly when it found a rule with *document as the
+  element.
+
+Thu May 14 11:49:42 1998  William M. Perry  <address@hidden>
+
+* lisp/font.el (mswindows-font-create-object): Now correctly deals with
+  mswindows fonts under XEmacs thanks to Andy Piper.
+
+1998-04-17  T. V. Raman  <address@hidden>
+
+* lisp/w3-speak-table.el (w3-table-setup-keys): Base keymappings off of
+  emacspeak-prefix, instead of hardcoded C-z.
+
+1998-04-17  William M. Perry  <address@hidden>
+
+* lisp/: updated copyright statements, removed quite a few old files from
+  the tree.
+
+* lisp/xml.el: New way to parse XML documents using an external process
+  and some new support tools based upon 'expat', the XML parser from James 
+  Clark.
+
+* aclocal.m4 (AC_EMACS_PACKAGES): resurrected the --with-package-dir
+  option.
+
+1998-04-15  William M. Perry  <address@hidden>
+
+* configure.in: Changes to where it installs things by default, more
+  GNUish now.  Need to think about how packages need to be done in
+  autoconf more.
+
+* lisp/w3-cus.el (w3): Put the 'url' group within the W3 group
+  automatically.
+
+* lisp/w3-menu.el (w3-menu-options-menu): Do customize-browse instead of
+  w3-preferences-edit for Options->Edit Preferences menu item.
+
+* lisp/docomp.el: Use w3-load-flavors and w3-setup-version-specifics in
+  docomp.el, just to make sure everything works.
+
+* lisp/w3.el (w3-load-flavors): Don't bitch about XEmacs being unsupported 
+  on windows anymore, because it is again!
+
+* lisp/w3-xemac.el: Force loading of new widget/custom libraries on
+  XEmacsen that are too old, but had them dumped in, so load-path munging
+  doesn't do anything.
+
+* lisp/socks.el: Added socks v4 support.  To do this I had to change how
+  socks servers are defined - try the new customization support: C-u M-x
+  customize [RET] socks to see what has changed. 
+
+* lisp/mule-sysdp.el (mule-sysdep-version): Try to deal with MBSK Emacs
+  not really being mule, but still mostly lying about it.
+
+* lisp/w3-speak-table.el: New file to actually take advantage of the new
+  table structure.
+
+* lisp/w3-display.el: Changes from Raman and Thierry for keeping track of
+  table structure.
+
+1998-04-13  William M. Perry  <address@hidden>
+
+* lisp/w3-parse.el (w3-parse-buffer): Wrap calls to sera-to-fidel-marker
+  in a condition-case to avoid lossage on MBSK emacsen.
+
+1998-03-08  Laurent Martelli <address@hidden>
+
+* lisp/w3-hot.el (w3-hotlist-rename-entry): Could select the wrong entry
+  if one hotlist title was the same as the beginning of another one.
+
+1998-03-07  William M. Perry  <address@hidden>
+
+* lisp/docomp.el: require lmenu during compiles, or Emacs 20.x will
+  choke.
+
+1998-03-07  Greg Stark <address@hidden>
+
+* lisp/w3-forms.el (w3-form-determine-size): Fix various misalignments in
+  tables.
+
+1998-02-22  William M. Perry  <address@hidden>
+
+* lisp/docomp.el (compile-it): This should now work in v19 emacsen, since
+  they didn't support the 'files-only' final argument.
+
+1998-01-29  Dieter Maurer <address@hidden>
+
+* lisp/mm.el (mm-parse-mime-headers): Handle continuation lines in headers 
+
+1998-01-29  William M. Perry  <address@hidden>
+
+* lisp/socks.el: Fixed various int vs. char problems, made the error
+  reporting a little clearer that they were actual errors from the SOCKS
+  server, not necessarily the ultimate destination.
+
+1998-01-28  William M. Perry  <address@hidden>
+
+* lisp/url-cookie.el (url-cookie-handle-set-cookie): Allow
+  url-privacy-level == paranoid to deny all cookies.
+
+1998-01-27  William M. Perry  <address@hidden>
+
+* lisp/w3.el (w3-download-url): Fix in the case where a filename is passed
+  in - was calling the callback with the wrong # of arguments.
+
+1998-01-20  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre14 released
+
+* lisp/w3-toolbar.el (w3-toolbar-make-buttons): Don't die horribly if you
+  cannot make the toolbar buttons - this made TTY XEmacs 20.5beta +
+  Emacs/W3 choke big time.  all better now.
+
+1998-01-09  William M. Perry  <address@hidden>
+
+* lisp/w3-parse.el (w3-parse-buffer): Don't use insert-char for SGML
+  entities, because with the new MULE replacements for stupid windows
+  character sets, some of them are no longer single characters.
+
+1998-01-06  Laurent MARTELLI  <address@hidden
+
+* lisp/w3-menu.el (w3-menu-search-menu): Added 'ftp search' at
+  http://ftpsearch.ntnu.no/home.html to the search menu.
+
+1998-01-06  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre13 released
+
+* lisp/url-http.el (url-create-mime-request): Added better protection
+  around calls to getting proxy authentication when we aren't really
+  proxying anything.
+
+* lisp/w3-hot.el (w3-hotlist-refresh): Make sure w3-do-setup has been
+  run.
+
+* lisp/url-http.el (url-create-mime-request): Fixed proxy authentication
+  and excessive prompting
+
+1998-01-05  William M. Perry  <address@hidden>
+
+* lisp/w3-menu.el (w3-menu-make-xemacs-menubar): Fixed problem where
+  XEmacs would never install the 'buffers' menu
+  (w3-menu-install-menubar): Fixed test for whether to initialize the
+  menubar.
+
+1998-01-05  Laurent Martelli <address@hidden>
+
+* lisp/w3-cus.el (w3-defined-link-types): Added 'contents' and 'top' from
+  the HTML 3.2 reference spec to the predefined sets of <LINK> types.
+
+1997-12-31  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre12 released
+
+1997-12-29  William M. Perry  <address@hidden>
+
+* lisp/Makefile.in: don't remove the old custom-load.el and
+  auto-autoloads.el, so that people using Emacs 19/20 can muck with the
+  source and not destroy the autoloads in the process.
+
+1997-12-26  William M. Perry  <address@hidden>
+
+* lisp/url-misc.el (url-do-terminal-emulator): Removed extra ')' DUGH!
+
+1997-12-25  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre11 released
+
+* lisp/url.el (url-lazy-message): Don't show messages if there is an
+  active minibuffer window.
+
+* lisp/Makefile.in (w3-auto.el): removed use of $^ macro, since some SYSV
+  machines seem to croak on it.
+
+1997-12-24  Ching-Mo Chang  <address@hidden>
+
+* lisp/url-file.el (url-file): fix for stripping out leading '/' from
+  local filenames under OS/2.
+
+1997-12-24  William M. Perry  <address@hidden>
+
+* lisp/url-misc.el (url-do-terminal-emulator): Fixed for the case where
+  the user was not specified (vast majority)
+
+* lisp/w3.el (w3-save-as): Don't double latex output
+
+* lisp/w3-parse.el (w3-parse-buffer): Deal with comments slightly
+  differently - on large documents, we could hit a stack overflow in the
+  regexp engine.
+
+* lisp/css.el (css-expand-value): default to using :normal for unknown
+  weights, not :bold.
+
+1997-12-24  Vladimir Alexiev <address@hidden>
+* lisp/w3-xemac.el: Compatibility stuff for XEmacs 19.13
+
+1997-12-24  William M. Perry  <address@hidden>
+
+* lisp/w3-forms.el (w3-form-determine-size): If someone specifies a 'size'
+  of 0 for a form element, bring sanity back to the world.
+
+* lisp/w3-cus.el (w3-display-frames): Changed default to 't' to
+  automatically display frames.
+
+* lisp/w3-parse.el: Added nobr tag to %special - it should parse fine
+  now.
+
+* lisp/socks.el (socks-override-functions): New variable to control
+  whether or not to overwrite the builtin open-network-stream function
+  with one of our own.
+
+* lisp/font.el: Added explicit require of disp-table, so we will work with 
+  older XEmacsen.
+
+* lisp/w3-style.el (w3-display-stylesheet): Default to using
+  w3-user-stylesheet if w3-current-stylesheet is not set yet (ie: no page
+  loaded in current window).  Also throws an error if none of those are
+  defined yet.
+
+1997-12-22  Michael Ernst <address@hidden>
+
+* url.el (url-get-url-at-point): Strip surrounding parens from a
+  potential URL.
+
+1997-12-22  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-pause): Use a dedicated variable instead of
+  coopting cur-viewing-pos, to protect against errors.
+
+1997-12-22  Thierry Emery <address@hidden>
+
+* w3-parse.el: Deal with invalid SGML characters in mule better.
+
+1997-12-22  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0.pre10 released
+
+* lisp/w3-parse.el (w3-parse-buffer): Make sure we expand the 'background' 
+  tag, so stylesheets created after mucking with the <body> attributes
+  will work correctly.
+
+* configure.in: Disable caching of configure results - I've become
+  convinced this is the right thing to do.
+
+* Makefile.in (install): Don't automatically hack up someone's .emacs file 
+  - make them explicitly do a 'make dotemacs'
+
+* configure.in: Moved some of the --with-FOO stuff into aclocal.m4 and the
+  appropriate AC_DEFUN macros, where they belong.
+
+* aclocal.m4 (library): Fixed setting of package directory (typo).
+
+1997-12-04  Thierry Emery <address@hidden>
+
+* lisp/w3.el (w3-mail-current-document): ditto.
+
+* lisp/w3-display.el (w3-maybe-start-image-download): ditto.
+
+* lisp/url.el (url-insert-file-contents): protects url-be-asynchronous
+  against elisp errors in code sections where its default value is
+  temporarily modified.
+
+1997-11-27  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0.pre9 released
+
+1997-11-27  Cord Kielhorn <address@hidden>
+
+* lisp/w3-hot.el (w3-grok-html-bookmarks-internal): Some fixes for HTML
+  hotlists in xmosaic hotlist format 3
+
+1997-11-27  William M. Perry  <address@hidden>
+
+* lisp/w3-cus.el (w3-delay-image-loads): Default to not loading images if
+  this version of Emacs does not support any image formats other than XPM
+  or XBM.
+
+1997-11-20  William M. Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-resurrect-hyperlinks): Keep track of start and
+  end of the widget, since widget-convert-text doesn't appear to.
+  (w3-display-node): Keep track of :visited and :active faces for
+  hyperlinks.
+  (w3-follow-hyperlink): Apply the :visited face to a widget after we
+  fetch it.
+
+1997-11-20  Thierry Emery  <address@hidden>
+
+* lisp/w3-display.el (w3-display-node): more frames work
+
+1997-11-07  William M. Perry  <address@hidden>
+
+* lisp/css.el (css-expand-length): Fixed percentages in css-expand-length
+
+1997-11-05  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0.pre8 released
+
+* aclocal.m4 (elisp): Use a temporary file for elisp configuration tests,
+  to avoid weirdness that gets shoved to stdout/stderr by the various
+  emacsen.
+
+* lisp/w3-cus.el (w3-image-mappings): Use imagick for everything if XEmacs 
+  was compiled with it.
+
+* lisp/w3-display.el (w3-maybe-start-image-download): Protect against bad
+  instantiation of glyphs of already loaded images.
+
+1997-11-04  Thierry Emery <address@hidden>
+
+* Support relative frameset dimensions (ie: "2*,*")
+
+* Fixed problem with doubling or tripling of image 'alt' text for images
+  in tables.
+
+1997-11-03  William M. Perry  <address@hidden>
+
+* aclocal.m4 (elisp): Simplified version of AC_EMACS_VERSION that just
+  uses AC_EMASC_LISP to print out emacs-major-version . emacs-minor-version
+
+1997-10-28  William M. Perry  <address@hidden>
+
+* lisp/url-cookie.el (url-cookie-parse-file): Fixed autoload cookie (hah)
+
+1997-10-27  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre7 released
+
+1997-10-27  Jens-Ulrik Holger Petersen  <address@hidden>
+
+* url.el (url-retrieve-internally): Ensure that coding system for
+  the url buffer is set to no-conversion.
+
+1997-10-23  William M. Perry  <address@hidden>
+
+* aclocal.m4: Fixed detection of how to rebuild custom-loads.el and
+  auto-autoloads.el
+
+1997-10-23  Thierry Emery <address@hidden>
+
+* lisp/w3-display.el lisp/w3-widget.el: Lots of fixes for images.
+  image hyperlinks are active, even when inside tables (thanks to a
+  w3-hyperimage-info text-property, a content for w3-resurrect-images
+  and the fact that :href and :target info are now passed on down to
+  the children widgets),
+
+  a face can be specified in the stylesheet, which will be used for
+  the `alt' tags, e.g.:
+  img:link    { color: goldenrod  }
+  img:active  { color: goldenrod  }
+  img:visited { color: firebrick  }
+       
+  the `alt' tag of image maps is displayed, to ease visual
+  recognition,
+
+  when the `alt' tag is "" and w3-auto-image-alt is non nil,
+  an `alt' tag is made from the image src file basename. (WMP change)
+
+1997-10-20  Ching-Mo Chang  <address@hidden>
+
+* lisp/url-file.el (url-host-is-local-p): recognize XXX:/ as local file
+  under NT/Win95/OS2.
+
+* lisp/url-cache.el (url-cache-extract): replace 'os2' with 'emx' when
+  comparing system-type.
+
+* lisp/w3-e19.el (w3-store-in-clipboard): Deal gracefully with
+  interprogram-cut-function being bound, but nil - we should fall back to 
+  the device-specific stuff, not just do nothing.
+
+1997-10-20  William M. Perry  <address@hidden>
+
+* texi/w3-faq.txi (Runtime FAQ): New FAQ about Mule 20.x and \201 in front 
+  of everything.
+
+1997-10-17  William M. Perry  <address@hidden>
+
+* Emacs/W3 4.0pre6 released
+
+* lisp/images.el (image-register-netpbm-utilities): Don't automatically
+  dither PNM/PPM files to 256 colors when converting to XPM - its not
+  necessary.
+
+1997-10-17  Colin Rafferty <address@hidden>
+
+* lisp/url-auth.el (url-auth-user-prompt): New function to create a pretty 
+  prompt that shows the realm or URL that the user should be
+  authenticating to.
+
+1997-10-17  William M. Perry  <address@hidden>
+
+* contrib/w3-imenu.el: New version of w3-imenu for the contrib directory.
+
+* Emacs/W3 4.0pre5 released.
+
+* lisp/w3.el (w3-find-default-stylesheets): Should now find the stylesheet
+  much more often given the new directory layout under Emacs 19.x & 20.x
+
+* lisp/Makefile.in (custom-load.el): Automatically rebuild auto-autoloads
+  and custom-load.el if any of the source files have changed.  configure
+  now auto-detects how to rebuild them.
+
+Fri Oct 17 06:27:07 1997  William M. Perry  <address@hidden>
+
+* lisp/url-cookie.el: autoload url-cookie-parse-file
+
+1997-10-16  William M. Perry  <address@hidden>
+* lisp/w3-display.el (w3-insert-terminal-char): better handling of HR
+  within borderless tables 
+
+* lisp/w3-parse.el (w3-p-s-entity): Don't cons up a string just to insert
+  a single character.
+
+* lisp/w3-display.el (w3-display-line-break): 2.3 Mule's char-before requires
+  the 'pos' argument, so always send in (point).
+
+* lisp/w3-display.el (w3-dingbats): don't crap out in mule 2.3
+
+* lisp/w3.el (w3-find-default-stylesheets): Make finding no stylesheets a
+  fatal error.
+
+1997-10-15  William M. Perry  <address@hidden>
+
+* configure.in: Deal with EMACS="t", so you can now configure Emacs/W3
+  from within an emacs shell buffer.
+
+1997-10-13  William M. Perry  <address@hidden>
+
+* lisp/w3-toolbar.el (w3-toolbar-make-buttons): Default to using text only 
+  buttons if w3-toolbar-icon-directory doesn't exist (or is nil if
+  locate-data-directory fails)
+
+1997-10-04  SL Baur  <address@hidden>
+
+* lisp/w3.el (w3-find-default-stylesheets): Use `locate-data-directory' if 
+  it exists.
+
+* lisp/w3-toolbar.el (w3-toolbar-make-buttons): Use `locate-data-directory'
+  if it exists.
+
+1997-10-03  William M. Perry  <address@hidden>
+
+* texi/Makefile.in (install): Ignore errors from the installinfo stage.
+
+1997-10-02  William M. Perry  <address@hidden>
+
+* lisp/w3.el: Added autoload for w3-version
+
+* texi/Makefile.in (install): Don't global when doing install-info
+
+1997-09-30  William M. Perry  <address@hidden>
+
+* lisp/w3.el (w3-map-links): Use the exposed widget-map-buttons function,
+  since XEmacs no longer uses overlays for its internal representation of
+  widgets.
+
+1997-09-29  William M. Perry  <address@hidden>
+
+* lisp/url-news.el (url-news-version-too-old): Deal with quassia gnus
+
+1997-09-25  William M. Perry  <address@hidden>
+
+* lisp/url-news.el (url-format-news): Use 'gnus-article-display-hook
+  instead of manually calling gnus-article-hide-headers
+  (url-format-news): Also bind gnus-article-current, because some hooks
+  might need to use it.
+
+1997-09-22  William M. Perry  <address@hidden>
+
+* lisp/url-ns.el (url-ns-prefs): Can now parse a netscape preferences.js
+  file and query items out of it.
+
+1997-09-19  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.105 released
+
+* Removed the custom and widget libraries from the distribution.
+
+* configure.in, aclocal.m4: Lots of changes and additional macros for
+  detecting features in Emacs Lisp.  New way of detecting acceptable
+  widget/custom combinations, and warnings about where to go to get the
+  newest version.
+
+1997-09-16  William M. Perry  <address@hidden>
+
+* Updated to Widget/Custom 1.9958
+
+1997-09-16  Thierry Emery <address@hidden>
+
+* lisp/w3-display.el, lisp/w3.el: Better frame navigation -- 'q','l', etc
+  should now back up by framesets, not just by single buffers.
+
+Sat Sep 13 16:26:47 1997  Istvan Marko <address@hidden>
+
+* lisp/w3-mouse.el (w3-follow-inlined-image): Fixed
+  w3-follow-inlined-image
+
+Thu Sep 11 15:17:27 1997  William M. Perry  <address@hidden>
+
+* lisp/w3-display.el: Go back to creating the 'nil' face all the time,
+  even in Emacs - otherwise ps-print chokes.
+
+1997-09-10  William M. Perry  <address@hidden>
+
+* lisp/w3-parse.el (w3-parse-buffer): Latest Emacs 20.x has renamed the
+  sera-to-fidel-marker function to ethio-sera-to-fidel-marker, so we were
+  losing on ethiopic texts.
+
+1997-09-05  William M. Perry  <address@hidden>
+
+* Makefile.in: Now includes the 'contrib' directory in distributions.
+
+* aclocal.m4: Fixed custom detection - would sometimes set CUSTOM to the
+  directory, sometimes to the filename... ick.
+
+* Makefile.in (dotemacs): Tweaked the install of autoloads into .emacs file
+
+* lisp/font.el (font-normalize-color): Ditto
+
+* lisp/url.el (url-setup-privacy-info): Ditto
+
+* lisp/devices.el: Everything now recognizes 'w32' as an alias for the
+  'win32' device type.  This is for Emacs 20.x compatibility, which will
+  have this change.
+
+1997-09-04  William M. Perry  <address@hidden>
+
+* Updated to Widget/Custom 1.9956
+
+1997-08-25  William M. Perry  <address@hidden>
+
+* lisp/w3.el (w3-document-information): Fixed bug with empty 'meta' links.
+
+1997-08-20  William M. Perry  <address@hidden>
+
+* lisp/w3-menu.el ((fboundp 'id-menubar-set)): Avoid fset'ing
+  id-menubar-set - it was confusing oobr
+
+1997-08-19  William M. Perry  <address@hidden>
+
+* New file w3-imenu.el from T.V. Raman <address@hidden>
+
+1997-08-15  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.102 released
+
+* lisp/Makefile.in: Fix for some buggy makes that didn't like my very long
+  substitutions on the SOURCES macro.
+
+1997-08-14  Roland McGrath <address@hidden>
+
+* lisp/md5.el (md5): protect kill-buffer from getting already dead buffers
+  by using 'buffer-name'
+
+1997-08-12  William M. Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-display-nil-face): Don't make the 'nil' face
+  under Emacs 19.
+
+* lisp/wid-edit.el (widget-before-change): Allow inhbit-read-only to
+  override the before-change checks for if we are at a widget or not.
+
+* lisp/cus-face.el: Path to make cus-face.el play nice with
+  emacs 19 without X support.
+
+* lisp/w3-e19.el (w3-mode-version-specifics): Dont' do read-only 
+
+1997-08-10  Thierry Emery <address@hidden>
+
+* lisp/w3-display.el: Patch for frames on TTY devices.
+
+1997-08-08  William M. Perry  <address@hidden>
+
+* lisp/w3-display.el (w3-table-ascii-border-chars): Back to more
+  rectangular ascii art for table borders.
+
+* lisp/socks.el (socks-find-route): Allow negation of regexps by
+  prepending a ! to them for a 'proxy if they match' type rule.  The whole 
+  configuration of this module needs to change.
+
+1997-08-08  Istvan Marko <address@hidden>
+
+* lisp/url-misc.el (url-proxy): Fix for all proxy access.
+
+1997-08-08  William M. Perry  <address@hidden>
+
+* lisp/w3-display.el: Fixed compilation problems under Emacs 20.x that had
+  to do with char tables and such.
+
+* lisp/w3-e20.el (w3-e20): Added provide statement for this file - duh.
+
+1997-08-07  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.98 released
+
+* Synch'd up to custom 1.9954
+
+Thu Aug  7 08:16:Denys Duchier <address@hidden>
+
+* lisp/w3-display.el (w3-widget-echo): Use
+  buffer-substring-no-properties for w3-widget-echo to avoid spurious
+  'attempt to change text outside editable field' errors.  Is this needed
+  with the new custom?  Doubtful, but its still a good idea. (wmp)
+
+Fri Aug  1 06:00:02 1997  Thierry Emery <address@hidden>
+
+* w3-display.el: take into account hierarchical framesets in a same page
+  and discards useless "*" values for cols or rows.
+
+Sun Jul 27 18:43:41 1997  William M. Perry  <address@hidden>
+
+* configure.in: Added --with-lispdir configure option.
+
+* lisp/url-misc.el (url-proxy): Strip out "#foo" anchors in proxy requests
+
+* configure.in: Fixed guessing of .emacs location to work in shells where
+  ~/ is not expanded.
+
+1997-07-26  SL Baur  <address@hidden>
+
+* mm.el (mm-extension-to-mime): Use `eq' for character comparison.
+
+Sun Jun 29 22:26:43 1997  William M. Perry  <address@hidden>
+
+* lisp/w3-emulate.el: Make sure we call widget-button-press not w3-follow-link
+
+* configure.in: New --enable-site-install option to control whether init
+  code goes in user's .emacs file or default.el
+
+* Makefile.in (dotemacs): New target for modifying the user's .emacs file
+  or the sitewide default init.
+  (html): New target for building html versions of the manuals.
+
+Fri Jun 27 21:08:24 1997  William M. Perry  <address@hidden>
+
+* texi/Makefile.in (%.html): Added targets for making HTML versions of the
+  info files.
+
+1997-06-27  William M. Perry  <address@hidden>
+
+* lisp/w3.el: In non-XEmacs, the version-specific stuff is loaded from
+  (format "w3-e%d" emacs-major-version), in case we need to do anything
+  special for Emacs 20.x with Mule support.
+
+* Only use one conditionalization variable - w3-running-xemacs
+
+1997-06-26  William M. Perry  <address@hidden>
+
+* Makefile.in: Make sure we recursively make usin $(MAKE), not
+  vanilla 'make'.
+
+* lisp/w3.el (w3-insert-formatted-url): Works again, forgot to update it
+  to use the new widget properties.
+  (w3-maybe-follow-link): Ditto.
+  (w3-view-this-url): Ditto.
+  (w3-follow-link): Ditto.
+  (w3-complete-link): Ditto.
+
+Wed Jun 25 07:29:46 1997  William M. Perry  <address@hidden>
+
+* lisp/w3.el (w3-find-default-stylesheets): Added more directories to the
+  stylesheet search path.
+
+* Emacs/W3 3.0.92 released
+
+* Moved lisp stuff into its own subdirectory, integrated into configure,
+  make, and install procedures.
+
+* Makefile.in (Makefile): Ditto
+
+* texi/Makefile.in: Automatically rebuilds out-of-date Makefiles
+
+* configure.in: Make sure we create texi/Makefile
+
+* w3-display.el (w3-table-ascii-border-chars): Slightly nicer rounded
+  edges for ascii borders on tables.
+
+Tue Jun 24 14:35:05 1997  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.91 Released
+
+* Moved texinfo stuff into its own subdirectory, integrated into
+  configure, make, and install procedures.
+
+* url-file.el: Visiting directories with an index file works in asynch
+  mode now.
+
+* docomp.el (cl): Load cl during builds
+
+* w3.el (w3-find-default-stylesheets): Added more directories to the
+  stylesheet search path.
+  (w3-do-setup): Make sure we don't infinitely recurse if we are using
+  html bookmarks.  w3-parse-hotlist could call w3-parse-buffer, which will
+  call w3-do-setup if we don't set our global flag as 't'.
+
+* Makefile.in (SOURCES): Some reordering to make the stupid thing at least
+  compile with Emacs 19.
+
+Tue Jun 24 11:44:59 1997  Per Abrahamsen  <address@hidden>
+
+* w3.el (w3-mode): Avoid calling the global bindings for RET and mouse-2. 
+
+1997-06-24  William M. Perry  <address@hidden>
+
+* Synch'd up to custom/widget 1.9936
+       
+* Emacs/W3 3.0.90 released
+
+* Moved the documentation into its own subdirectory
+
+* w3-menu.el: Slightly less complete version of id-menubar-set when not in 
+  InfoDock - was causing lots of errors in XEmacs when trying to run a
+  non-existent hook.  Bleah.
+
+* configure.in: Fixed AC_CHECK_PROG for emacs/xemacs - duh.
+
+* aclocal.m4: Don't check custom sanity if it was specified on the
+  configure line
+
+1997-06-23  William M. Perry  <address@hidden>
+
+* url-file.el (url-file): Make sure we set the content-type when loading
+  files.  Was screwed when we were asynch.
+
+* Upped planned release # to 4.0
+
+* Emacs/W3 3.0.89 released.
+
+* configure.in: Fixed --with-x*emacs switches.
+
+* Emacs/W3 3.0.88 aborted.
+
+* w3-display.el (w3-display-node): deal with empty selections
+
+* Now uses autoconf to deal with all configuration issues, including
+  sanity checking the installation of the custom and widget libraries.
+
+Mon Jun 23 17:08:55 1997  Per Abrahamsen  <address@hidden>
+
+* w3.el (w3-mode): Don't call `widget-minor-mode'.
+
+* w3-vars.el (w3-mode-map): Use `make-sparse-keymap'.
+  Use `widget-keymap' as parent.
+  (wid-edit): require.
+
+Mon Jun 23 07:09:51 1997  William M. Perry  <address@hidden>
+
+* w3-parse.el (w3-parse-buffer): Make sure we always have a newline at the
+  end of the buffer before starting the parse.
+
+Fri Jun 20 11:23:28 1997  William M. Perry  <address@hidden>
+
+* Synch'd up to Widget 1.9929
+
+* w3-mouse.el: Deal with InfoDock button bindings - we don't need to bind
+  _anything_ since hyperbole knows all about hyperlinks and stuff.
+
+* w3-menu.el (w3-menu-install-menubar): Deal with InfoDock way of
+  specifying mode menubars.
+
+* w3-toolbar.el (w3-add-toolbar-to-buffer): Don't install the toolbar
+  under InfoDock - it uses different toolbars than straight XEmacs.
+
+* w3-mouse.el: Don't bind shift-button2 - this is reserved for hyperbole.
+  This is now on meta.
+
+1997-06-19  William M. Perry  <address@hidden>
+
+* w3.el (w3-map-links): Deal with new keywords.
+
+* w3-menu.el (w3-menu-links-constructor): Deal with new keywords on
+  links/images.
+  (w3-popup-menu): Ditto.
+
+* w3-display.el (w3-widget-echo): Deal with new keywords we use on widgets.
+  (w3-follow-hyperlink): Ditto.
+  (w3-balloon-help-callback): Ditto.
+  (w3-maybe-start-image-download): Ditto.
+  (w3-handle-image): Use new keywords.
+  (w3-display-convert-arglist): New function to convert an assoc list into 
+  a property list with real CL-style keywords.
+  (w3-display-node): Use it when building a hyperlink.
+  (w3-resurrect-hyperlinks): Now uses widget-convert-text instead of nasty 
+  knowledge of internals of the widget library.
+
+Tue Jun 17 21:45:06 1997  William M. Perry  <address@hidden>
+
+* custom-check: Was misusing 'tr'
+
+Sun Jun 15 22:17:01 1997  William M. Perry  <address@hidden>
+
+* Synch'd up to custom 1.9920
+
+Sat Jun 14 15:37:09 1997  William M. Perry  <address@hidden>
+
+* Synch'd up to custom 1.9918 - now distribute all of custom, just to be
+  anal.
+
+* w3-display.el (w3-display-line-break): Ebola vaccination
+  (w3-maybe-start-background-image-download): Don't try to load background
+  images in Emacs 19 or on a TTY.
+  (w3-display-node): Keep track of the active face of a hyperlink.  Need
+  to make the widget library smarter about this.
+
+Fri Jun 13 22:16:59 1997  William M. Perry  <address@hidden>
+
+* w3-parse.el:  Some stupid sites put meta tags in the middle of their
+  documents.  Sigh. Allow it, but bitch and moan.
+
+* Added custom library to the distribution.
+
+1997-06-11  William M. Perry  <address@hidden>
+
+* w3-parse.el : Allow <meta> tags in %body.content for stupid cnn.com
+  site.
+
+* Emacs/W3 3.0.87 released.
+
+* Synched up to Widget 1.9907 - you must be running this version for most
+  things to work.  Make sure you are not picking up a widget library from
+  gnus or something like that before the one in the w3 directory.
+
+* w3-display.el (w3-maybe-start-background-image-download): New function
+  that takes a URL and a face and does its best to set the background
+  pixmap of that face to the image pointed to by the URL.
+  (w3-display-node): Implemented 'background' property on 'body' or 'html' 
+  tags.
+  (w3-finalize-image-download): Changed a fair bit - shared between normal 
+  image downloads and background image downloads.
+  (w3-display-node): w3-user-colors-take-precedence now controls whether
+  background faces are retrieved or not.
+  (w3-face-for-element): Stylesheets use of background-image should almost 
+  work now.
+  (w3-display-node): Stylesheets use of background-image should work
+  completely now.
+
+Tue Jun 10 07:24:09 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-only-links): This will now use w3-map-links
+  (w3-mode): Dont' set inhibit-read-only, ever.
+  (w3-mode): back to using widget-minor-mode, since inheriting the keymap
+  doesn't seem to do much good.
+
+* w3-vars.el: Don't bind anything to widget-button-press, let
+  widget-minor-mode do that.
+
+* w3.el (w3-map-links): Revamped this to work with the new way widget is
+  using overlays instead of text properties.
+  (w3-mode): Use widget-minor-mode instead of binding a lot of
+  navigational commands ourselves.
+
+* w3-display.el: Make sure we don't try to redefine the w3-dingbats
+  character set when loading this file more than once.
+  (w3-display-node): Rearranged some of the insert-before handling so that 
+  any text inserted does _not_ have the properties of the tag on it
+  (colors on hyperlinks won't bleed anymore)
+  (w3-resurrect-hyperlinks): New semi-working way of resurrecting
+  hyperlinks
+
+Mon Jun  9 22:53:14 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-display-node): Protect against stylesheet specified
+  widths on horizontal rules.
+
+Mon Jun  9 22:42:26 1997  Istvan Marko <address@hidden>
+
+* w3-hot.el (w3-hotlist-apropos): Let this work when reuse-buffers != no
+
+Mon Jun  9 22:35:04 1997  Dieter Maurer <address@hidden>
+
+* mm.el (mm-decode-quoted-printable): Fix for some multipart attachments
+  showing up empty due to badness in mm-decode-quoted-printable and
+  'ignore' not moving to the end of the region just decoded.
+
+Mon Jun  9 22:35:04 1997  William M. Perry  <address@hidden>
+
+* w3-parse.el (w3-parse-buffer): Call w3-do-setup to make sure our
+  hashtables and things are set up correctly or gnus can choke big time.
+
+Mon Jun  9 22:26:29 1997  Michael Ernst <address@hidden>
+
+* url.el (url-get-url-filename-chars): Fixed problem with bad use of a
+  hyphen in the regexp.  Would cause problems when invoking
+  url-get-url-at-point when point was in front of a hyphen.
+
+1997-05-28  William M. Perry  <address@hidden>
+
+* w3-cus.el: Use a :prefix on most of the groups to make the options look
+  nicer.
+
+Thu May 15 05:06:30 1997  William M. Perry  <address@hidden>
+
+* w3-sysdp.el: removed bogus definition of buffer-substring-no-properties
+  - will now use the more correct one that was already there.
+
+* w3-display.el (w3-pause): Now has its own mini-event loop to pass off
+  scrolling commands, etc.  Keeps buffer position constant while doing
+  incremental display.
+
+Mon May 12 08:13:27 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-view-this-url): Check the parent widget for an href if you
+  don't find one right away.  This means that all commands that act on the
+  URL at point will now work on image widgets, etc. that are hyperlinks.
+
+Sat May 10 14:37:25 1997  William M. Perry  <address@hidden>
+
+* css.el (css-parse): Deal better with newline-challenged stylesheets
+  (css-parse): Don't be so aggressive in finding block data for @xyzzy
+  directives.
+
+* mm.el (mm-viewer-passes-test): Always run the tests in the users home
+  directory.
+
+* w3-mouse.el: Use down-mouse-N in Emacs 19, to be more consistent with
+  how the XEmacs keybindings work.
+
+Fri May  9 11:32:46 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-document-information): some formatting changes
+
+Thu May  8 14:06:40 1997  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.86 released
+
+* mule-sysdp.el (mule-code-convert-region): Try to deal gracefully with
+  the recent XEmacs 20.0 -> 20.2 renaming of the autodetect coding system
+  to automatic-conversion
+
+* w3-sysdp.el (event-point): New stub.
+
+* url-cookie.el (url-cookie-handle-set-cookie): Don't use the 'warn'
+  facility for bad cookie 'set' commands, was too annoying.
+
+* w3.el (w3-save-as): Make sure to require ps-print before trying to
+  save/mail a document as postscript.  The local binding of
+  ps-spool-buffer-name was causing the defvar not to happen, and you would 
+  get errors when trying to kill emacs later.  Ugh.
+  (w3-document-information): Make sure to escape entities for meta and
+  other info we throw in.
+
+* url-file.el (url-file): ftp/file retrieval can now be asynchronous
+  through the magic of [ange-ftp|efs]-copy-file-internal
+
+* url.el (url-sentinel): Allow a buffer as the first argument to
+  the sentinel function.
+  (url-retrieve-internally): Allow asynch ftp transfers
+
+* url-file.el (url-file): Asynchronous ftp downloads work now.
+
+* w3.el (w3-download-url): Made this function interactive.
+
+Mon Apr 28 13:31:36 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-download-url-at-point): new function to download document
+  under point.
+  (w3-download-this-url): new function to download current document.
+
+* w3-vars.el (w3-mode-map): Added 'D' and 'd' bindings for starting
+  document downloads.
+
+Thu Apr 24 08:29:34 1997  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.85 released
+
+* w3-display.el (w3-display-table-dimensions): Deal with
+  colgroup/thead/tfoot/col better.  Before was ignoring the rest of the
+  table.  ack.
+  (w3-display-table): ditto
+
+* w3-prefs.el (w3-preferences-restore-variables): Slap things into
+  custom-land where they belong.
+
+* A few customization tweaks.
+
+Wed Apr 23 21:44:59 1997  <address@hidden>
+
+* w3-e19.el (w3-store-in-clipboard): Make this work under OS/2
+
+Tue Apr 22 07:23:51 1997  William M. Perry  <address@hidden>
+
+* devices.el: Removed defsubsts so that we should be able to share .elc
+  files again between emacs and XEmacs.
+
+* font.el: Added in code to make a face blink.  Causes lots of screen
+  flicker under Emacs 19 though, so it is turned off by default.  Turn it
+  on with ESC-: (font-blink-initialize) - should be able to optimize when
+  the callback actually does anything based on what fonts are visible in
+  the visible buffers.
+  (font-face-visible-in-window-p): New function to tell if a face is
+  visible in a buffer window.
+  (font-map-windows): New function to map a function over all visible
+  windows.
+  (font-blink-callback): Use them to optimize so that invert-face is not
+  called unless absolutely necessary.
+
+Mon Apr 21 08:58:02 1997  William M. Perry  <address@hidden>
+
+* w3-e19.el: Added in compile-time require of w3-props so that pages with
+  backgrounds don't puke and die.
+
+* w3.el (w3-find-default-stylesheets): Don't load a user's personal
+  stylesheet if we started up in '-q' mode.
+
+* Emacs/W3 3.0.84 released
+
+* w3-display.el: When using XEmacs 20.x w/mule support, we now define our
+  own special character set.  This means that the table border chars work
+  again in XEmacs/mule
+
+* devices.el: Added magic to not optimize this file under XEmacs - its not 
+  actually used, so no damage.  It wouldn't compile under XEmacs because
+  it has subrs for all these, and our declaring them as defsubsts
+  thoroughly confuses the byte-compiler.
+
+Sun Apr 20 12:19:56 1997  William M. Perry  <address@hidden>
+
+* w3-sysdp.el: Moved device stuf out into its own devices.el file so that
+  it can be correctly byte-compiled.
+  Ditto for the text properties stuff (into w3-props.el)
+
+Fri Apr 18 13:09:31 1997  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.83 released
+
+* Synch'd up to Widget 1.89
+
+Thu Apr 17 06:20:56 1997  "T. V. Raman" <address@hidden>
+
+* default.css (pre/xmp/plaintext/key/code/tt): Changes to default
+  stylesheet for spoken output of normally `monospaced' text.
+
+Tue Apr 15 16:28:11 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-find-specific-link): Don't signal an error in a target anchor
+  (#foo) is not found.
+
+Tue Apr 15 08:22:37 1997  John Palmieri <address@hidden>
+
+* w3.el (w3-complete-link): protect against errors when hitting return
+  when point isn't on a link
+
+Mon Apr 14 16:18:43 1997  William M. Perry  <address@hidden>
+
+* mm.el (mm-parse-mailcaps): Moved ~/.mailcap to the front of the list so
+  that it gets parsed last, and has the highest priority.
+
+Sun Apr 13 20:28:30 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-complete-link): now correctly defaults to following the link
+  at point.
+
+Sat Apr 12 19:35:26 1997  William M. Perry  <address@hidden>
+
+* w3-speak.el: use widget-at instead of emacspeak-widget-at
+
+Fri Apr 11 07:39:26 1997  William M. Perry  <address@hidden>
+
+* w3-menu.el (w3-menu-edit-menu): Addded a preferences submenu with all
+  the W3 & URL customization items underneat it.
+
+* css.el (css-split-font-shorthand): Handle bad lists better
+
+* Emacs/W3 3.0.82 released
+
+* Synch'd up with Widget 1.78
+
+* w3-display.el (w3-get-face-info): Don't look for face attributes on tags
+  unless w3-user-colors-take-precedence is nil
+  (w3-display-node): Don't honor face attributes on <body> tag unless
+  w3-user-colors-take-precedence is nil
+
+* url-vars.el: Modified a few customizations to make them prettier
+
+* url-cache.el (url-cache-creation-function): Modified customization
+
+Fri Apr 11 07:03:20 1997  Hrvoje Niksic <address@hidden>
+
+* url-cache.el, url-gw.el, url-cookie.el, url-irc.el, url-vars.el, url.el:
+  All URL related variables are now customizable.
+
+Wed Apr  9 16:46:52 1997  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.81 released
+
+* w3-xemac.el (w3-text-pixel-width): And a XEmacs specific version of it.
+
+* w3-e19.el (w3-text-pixel-width): New function to return the pixel width
+  of a piece of text.
+
+* url.el (url-handle-no-scheme): Use it.
+
+* url-vars.el (url-handle-no-scheme-hook): New hook that should expand a
+  partial url like 'gnu' to a full URL, like 'http://www.gnu.org/'.
+
+* w3-sysdp.el (run-hook-with-args-until-success): Added a stub for
+  run-hook-with-args-until-success
+
+Tue Apr  8 12:20:39 1997  William M. Perry  <address@hidden>
+
+* w3-auto.el: Added autoloads for all the functions in url-ns for proxy
+  functions, and url-mail
+
+* url-ns.el (isPlainHostName): Fixed isPlainHostName
+
+* w3-parse.el (w3-parse-buffer): now throws up a bad style warning for
+  images without ALT attributes.
+
+* mm.el (mm-parse-mailcaps): Reverse the ':|;' separated path for MAILCAPS
+  so that earlier items take precedence, like standard unix PATH-like
+  variables do.
+  (mm-parse-mimetypes): Ditto for MIMETYPES
+
+Mon Apr  7 06:23:11 1997  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.80 released
+
+* w3-parse.el: Some more transitions - don't imply <p> after some form
+  tags.
+
+* url-misc.el (url-finger): Ditto
+
+* url-http.el (url-http): Ditto
+
+* url-gopher.el (url-gopher-retrieve): Put in a process-sentinel of
+  'ignore so that stupid 'process xxx exited with code nnn' messages are
+  not shown.
+
+* url.el (url-sentinel): Ditto
+
+* w3.el (w3-sentinel): remove call to url-clean-text - no longer needed
+
+Mon Apr  7 02:57:19 1997  Greg Stark  <address@hidden>
+
+* url.el (url-sentinel): once and for all eliminate the "first character
+  goes to wrong buffer" bug through brute force by setting the current
+  buffer to the buffer of the selected window at the end of a sentinel.
+
+* w3.el (w3-viewer-sentinel): ditto
+
+* w3-widget.el (widget-image-value-create): set tab-order to -1 on the
+  choice-items of client-side imagemaps to avoid having tab stop on them
+  three times, (it still stops on them twice) 
+
+* Makefile: add "make fast" rule to not run a bazillion emacsen
+
+* FAQ: typos
+
+* docomp.el: try setting byte-compile-dynamic to t to reduce memory usage
+
+Fri Apr  4 06:23:31 1997  William M. Perry  <address@hidden>
+
+* url-file.el (url-format-directory): Use insert-file-contents instead of
+  -literally, so that ftp index files will work.
+
+* w3-emulate.el: lots of new commands to spoof the user-agent string.  See
+  turn-[on|off]-[lynx|netscape|ie|arena]-masquerade-mode functions.
+
+Thu Apr  3 07:22:27 1997  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.79 released
+
+* w3-parse.el: Put in <p> as part of the content-model of <ul/ol> so that
+  <p> at the front of a list doesn't cause a bogus list item to be shown.
+
+* url-http.el (url-parse-mime-headers): Make proxy authentication sort of
+  work again.
+
+* w3-display.el (w3-setup-terminal-chars): Check to see whether face is
+  actually different before trying to set its font to a terminal one.
+
+* url.el (url-buffer-visiting): Better matching of URLs - it was taking
+  the target into account - bad bad bad.
+
+Wed Apr  2 18:05:11 1997  William M. Perry  <address@hidden>
+
+* w3-forms.el (w3-form-add-element): New way to do hidden form
+  fields that retains the order information - damned idiots out there rely
+  on ordering.  !#%!@
+
+* w3.el (w3-fetch): Put some of the logic about _blank/_top frame targets
+  into w3-fetch
+
+* w3-display.el (w3-get-all-face-info): Added in support for the 'face'
+  attribute to specify font-family
+
+Wed Apr  2 13:08:36 1997  Frederic Lepied <address@hidden>
+
+* w3-print.el (w3-print-this-url): Need to run LaTeX to get the indices
+  right.
+
+Tue Apr  1 11:20:54 1997  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.78 released
+
+* css.el (css-color-light-p): New function
+  (css-active-device-types): Use it to add a 'dark' or 'light' property to
+  the active device types as necessary
+
+Mon Mar 31 09:07:13 1997  William M. Perry  <address@hidden>
+
+* w3-parse.el: More error transitions for tables (push tr before td/th
+  just after a table)
+
+* w3-display.el (w3-display-node): Use it for body/html attribute handling
+  (w3-fix-color): New function to make sure we don't pass hex values without
+  "#" in front of them.
+
+Sun Mar 30 15:00:59 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-display-node): Now honors alink/vlink/link attributes
+  on the body tag.
+  (w3-fixup-eol-faces): Fixed nuking of faces at end of line to deal with
+  bad underlining behaviour of Emacs 19.
+
+Sun Mar 30 14:28:32 1997  Greg Stark <address@hidden>
+
+* w3-e19.el (w3-mode-version-specifics): Fixed buffer read-only errors
+  when trying to set a background face.
+
+Fri Mar 28 10:41:43 1997  William M. Perry  <address@hidden>
+
+* Emacs/W3 3.0.77 released
+
+* w3-display.el (w3-display-table): Face properties specified on the
+  'table' element now propogate to table cells correctly.
+
+Fri Mar 28 07:53:48 1997  Greg Stark <address@hidden>
+
+* w3-forms.el: Make sure we set the button-face on all widgets
+
+Fri Mar 28 07:53:48 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-frames): Use make-frame, not make-frame-command, so it
+  will work on XEmacs.
+
+* w3-e19.el (w3-mode-version-specifics): Now honors background/foreground
+  color requests in Emacs19 by coloring in the whole buffer.  Oh how I
+  wish Emacs 19 had buffer-local faces.
+
+* w3-display.el (w3-display-table): Tables now look better under Emacs 19
+
+Thu Mar 27 08:05:34 1997  William M. Perry  <address@hidden>
+
+* font.el (font-x-registry-and-encoding-regexp): got rid of compile
+  warning under Emacs 19
+
+* w3-display.el (w3-display-handle-list-type): manually remove faces on
+  bullet/list items
+  (w3-display-node): We were being a bit rude to inhibit-read-only -
+  sometimes would leave it 't', which is bad bad bad, some might even say
+  pure evil.
+
+* Emacs-W3 3.0.76 released
+
+* Synch'd up to Widget 1.68
+
+* w3-display.el (w3-display-node): Handles 'text' attribute correctly now
+  to set the default foreground when requested.
+
+* mm.el (mm-play-sound-file): Fixed it for new mule stuff
+
+* url-gw.el (url-gateway-nslookup-host): Added autoload for
+  gateway-nslookup-host
+
+* w3-display.el (w3-display-table): Expand each line of a table cell out
+  to the border, so that we get nicely colors backgrounds for table cells
+  now.
+
+* font.el (font-x-registry-and-encoding-regexp): New variable to match the
+  registry and encoding of a font name under X
+  (x-font-create-object): Use it to set the default registry and encoding
+  for font objects we create from font names.
+  (x-font-create-name): Grab the registry and encoding from the default
+  object for this device before defaulting back to '*'
+
+* w3-display.el (w3-setup-terminal-chars): Explicitly specify wildcard
+  registry and encoding for the table-hack-x-face, to deal with changes in
+  the font library.
+
+Wed Mar 26 06:23:51 1997  William M. Perry  <address@hidden>
+
+* custom-check: Should work better now, and spit out better instructions
+  for rebuilding correctly.
+
+* Emacs-W3 3.0.75 released
+
+* url.el (url-clean-text): Better matching of bogus process exited
+  messages.
+
+* font.el (font-rgb-color-p): No longer match "^#xxyyzz" as an rgb-color,
+  this screwed up bigtime in font-color-rgb-components.
+  (font-set-face-foreground): Do the test here instead.
+  (font-set-face-background): and here.
+
+* w3-widget.el (widget-image-value-create): For client side imagemaps,
+  make sure case-fold-search or :ignore-case is specified.
+
+* url-gw.el (url-gateway-nslookup-program): Default to using 'nslookup' as
+  url-gateway-nslookup-program
+
+Tue Mar 25 16:06:28 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.74 released
+
+Tue Mar 25 15:31:56 1997  Greg Stark <address@hidden>
+
+* url-cookie.el (url-cookie-handle-set-cookie): don't deal with address@hidden
+  microsoft web site cookies - they break good, clean, wholesome sites
+  like yahoo's stock pages.
+
+* ssl.el (ssl-program-arguments): Make sure everything gets turned into a
+  string, not an integer.
+  (open-ssl-stream): use a pipe instead of a pty if possible (why?)
+
+* w3-display.el (w3-display-node): Added back in <keygen> support
+
+* w3.el (w3-notify-when-ready): protect against bad buffer switching
+  (minibuffer as active window lossage, etc)
+
+* w3-toolbar.el (w3-toolbar-make-buttons): Don't warn about toolbar
+  directory on Emacsen that can't do toolbars!
+
+Tue Mar 25 15:31:56 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.73 released
+
+* w3-display.el (w3-get-face-info): Allow passing in a second argument
+  that means 'check this attribute of the html tag if you don't find
+  something in the stylesheet'.  This automatically enables <font color>
+  and <table|td|tr bgcolor>.
+
+Tue Mar 25 06:45:02 1997  T. V. Raman <address@hidden>
+
+* w3-forms.el (w3-form-keymap): patch to avoid lossage with emacspeak &
+  using terminal.el
+
+Tue Mar 25 06:45:02 1997  William M. Perry  <address@hidden>
+
+* ssl.el (ssl-program-arguments): Removed -quiet switch, since it requires
+  patches to s_client
+
+Mon Mar 24 10:56:11 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.72 released
+
+* w3-display.el (w3-display-node): Better handling of body and html style
+  attributes in XEmacs
+
+* w3.el (w3-mode): Removed call to kill-all-local-variables, as it
+  nukes buffer-local faces as well.
+
+* css.el (css-expand-length): Don't choke and use the wrong damn thing to
+  base percentages off of on percentage heights (ie: font-size: 80%)
+
+Mon Mar 24 07:12:52 1997  Gerry S Hayes <address@hidden>
+
+* url-gw.el (url-open-telnet): Fixed stupid typo into-to-string ->
+  int-to-string
+  (url-open-rlogin): Ditto.
+
+Sun Mar 23 09:43:24 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-table-ascii-border-chars): Use a '+' in the ascii art
+  version of table borders.
+
+Sat Mar 22 00:45:34 1997  William M. Perry  <address@hidden>
+
+* w3-menu.el (w3-use-menus): Customized this variable
+
+* w3-display.el (w3-display-node): Don't run multiline text area's default
+  value through w3-normalize-spaces
+
+Thu Mar 20 23:44:50 1997  Greg Stark  <address@hidden>
+
+* w3-cus.el (w3-use-terminal-characters): New variable
+  (w3-use-terminal-characters-on-tty): New variable
+  (w3-use-terminal-glyphs): New variable
+  (w3-horizontal-rule-char): Make setting it to nil allow use of graphic
+  characters (also means people can avoid using graphic charactes for
+  horizontal rules if they wish)
+* w3-display.el (w3-handle-image): clean up whitespace in alt tags
+  (w3-table-glyph-border-chars): New variable
+  (w3-table-graphic-border-chars): New variable
+  (w3-terminal-properties): New variable
+  (w3-insert-terminal-char): New inline function
+  (w3-horizontal-rule-char): New inline function 
+  (w3-setup-terminal-chars): Set up all of these and make using graphic
+  characters work on XEmacs using text properties (and optionally use text
+  properties on FSF Emacs too). 
+  (w3-table-hack-borders): Remove, obsoleted by w3-setup-terminal-chars
+  (w3-table-unhack-borders): don't have to fiddle with
+  w3-horizontal-rule-char any more.
+  (w3-display-table): Use w3-insert-terminal-char
+  (w3-size-of-tree):  Use w3-horizontal-rule-char
+  (w3-display-node):  Use w3-horizontal-rule-char, w3-insert-terminal-char,
+  uhm, i'm not sure if it was correct to remove the handle-content
+* w3-forms.el (w3-fixup-eol-faces): try to remove mouse-face from end-of-lines 
as
+  well, uhm, this doesn't seem to work though. 
+  (w3-form-determine-size): add keygen 
+  (w3-form-encode-helper): add keygen support for the day when the ssl code
+  itself is released. 
+* w3-widget.el (widget-image-value-create): use 'item widgets instead of
+  'push-button widgets and specify the format ourselves so we don't get
+  widget.el's arbitrary formatting.
+* w3.el (w3-do-setup): call w3-setup-terminal-chars to make nice tables and
+  horizontal rules the default at least under X.
+* mm.el added x-x509-ca-cert and x-x509-user-cert viewers but the tests
+  will fail so no one should should see this change until i release the
+  functions.
+       
+Fri Mar 21 18:52:31 1997  William M. Perry  <address@hidden>
+
+* css.el (css-expand-length): Better support for percentage values in
+  lengths
+
+Thu Mar 20 06:22:29 1997  Istvan Marko <address@hidden>
+
+* Added slot for no_proxy settings under the preferences panel
+
+Thu Mar 20 06:22:29 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.71 released
+
+* w3-parse.el:Added more transitions for error handling of raw 'td' or
+  'th' outside of a 'tr' in tablebody.
+
+* url.el (url-default-callback): asynch downloads should now be cached
+
+* w3-script.el (w3-do-scripting): Customized, turned off by default
+
+Wed Mar 19 20:53:23 1997  Steven L Baur  <address@hidden>
+
+* Makefile (xemacs-w3): Special target for XEmacs Build.
+
+Wed Mar 19 05:56:56 1997  William M. Perry  <address@hidden>
+
+* font.el (x-font-families-for-device): Just in case
+  font-default-family-for-device fails under Emacs/NT, return "monospace"
+  at the front of the list.
+
+* url-vars.el (url-privacy-level): Now defaults to not sending your email
+  address in HTTP requests.
+
+Tue Mar 18 13:09:13 1997  William M. Perry  <address@hidden>
+
+* url-cookie.el (url-cookie-handle-set-cookie): Fixed variable typos -
+  doh.  Today just hasn't been my day.
+
+* Emacs-W3 3.0.70 released
+
+* We now pass all tests on the forms tester page
+  http://www.research.digital.com/nsl/formtest/home.html
+
+* w3-display.el (w3-display-node): Better handling of <select multiple>
+  and <select> in general.
+
+* w3-forms.el (w3-form-encode-xwfu): Encode : and / in xwfu, since the
+  form tester expects it.
+
+* url-cookie.el (url-cookie-trusted-urls): New variable - list of regexps
+  of URLs that you will accept cookies from without question.
+  (url-cookie-untrusted-urls): New variable - list of regexps of URLs that
+  you will _never_ accept cookies from.
+  (url-cookie-handle-set-cookie): Use them
+  (url-cookie-handle-set-cookie): When asking whether to allow a site to
+  set a cookie, show the cookies they are wanting to set.
+
+Tue Mar 18 06:47:46 1997  Thierry Emery <address@hidden>
+
+* w3-display.el: Latest round of patches for <frames> support.
+
+* w3-cus.el (w3-display-frames): can now have 4 values.
+       nil             no frame display whatsoever (currently the default)
+       'as-links       display frame hyperlinks, but do not fetch them
+       'ask            display frame hyperlinks and ask whether to fetch them
+       t               display frame hyperlinks and fetch them
+
+Tue Mar 18 06:47:46 1997  William M. Perry  <address@hidden>
+
+* w3-parse.el (w3-parse-buffer): Duh, don't do `=' comparison on results
+  of char-after, since it is nil at the end of the buffer.
+
+Mon Mar 17 08:44:46 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.69 released
+
+* w3-sysdp.el (buffer-substring-no-properties): Added stub
+
+* url-gopher.el (url-gopher-retrieve): Ditto.
+
+* url.el: Ditto
+
+* w3-parse.el: Removed all sorts of fun (following-char) commands that can
+  cause ebola warnings under XEmacs 20.x
+
+* w3.el (w3-popup-info): Default to the URL under point instead of the
+  documents URL
+
+* w3-auto.el: updated autoloads - made sure everything was interactive if
+  appropriate.
+
+* w3-menu.el (w3-popup-menu): If w3-popup-menu-on-mouse-3 is nil, call
+  whatever button3 is bound to in global-map
+
+* w3-display.el: Added XEmacs version of frame-char-height and
+  frame-char-width
+  (w3-frames): If w3-display-frames is non-nil, then do a refresh with it
+  bound locally, so everything should just work.
+
+* url.el (url-do-setup): Global history file now defaults to ~/.w3/history
+  (url-do-setup): Cookie storage now defaults to ~/.w3/cookies
+
+Mon Mar 17 06:51:07 1997  Paul Stodghill <address@hidden>
+
+* mm.el (mm-temporary-directory): Initialize variable from TMPDIR
+  environment variable
+
+Fri Mar 14 13:35:56 1997  William M. Perry  <address@hidden>
+
+* w3-forms.el (w3-form-create-custom): Fixed the 'custom' input type for
+  new filenames in the widget/custom package.
+
+* ssl.el (ssl-certificate-verification-depth): New variable to control how
+  far up a cert chain to look.
+  (ssl-view-certificate-program-name): New variable.
+  (ssl-view-certificate-program-arguments): New variable.
+  (ssl-certificate-directory-style): New variable.
+  (ssl-rehash-program-name): New variable.
+  (ssl-certificate-directory): New variable.
+  (ssl-program-arguments): Use some of them.
+  (ssl-accept-ca-certificate): Use the rest.
+
+* css.el (css-parse-args): Removed old code that could cause infinite loop
+  in stylesheet parsing on bad things like "foo=bar" instead of "foo:bar"
+
+* w3-cus.el: Added better groupings for the customization stuff.
+
+Thu Mar 13 19:54:50 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.68 released
+
+* w3-cus.el: Added customization support for Emacs-W3
+
+* w3.el (w3-mail-current-document): Use url-mail-command instead of
+  w3-mail-command
+
+Thu Mar 13 11:41:42 1997  Greg Stark  <address@hidden>
+
+* w3-prefs.el: Implemented privacy panel
+
+Wed Mar 12 10:25:38 1997  William M. Perry  <address@hidden>
+
+* w3-e19.el (w3-mode-version-specifics): Use the nasty crufty
+  buffer-access-fontify-functions to make sure that we never yank
+  read-only text out of the Emacs-W3 buffer.
+
+* Synch'd up to Widget 1.62
+
+Wed Mar 12 06:36:41 1997  Paul Stodghill <address@hidden>
+
+* base64.el (base64-decode-region): Fixed typo in calling
+  command-on-region.
+
+Tue Mar 11 07:03:48 1997  William M. Perry  <address@hidden>
+
+* w3-auto.el (w3-use-hotlist): Made autoload interactive
+
+* w3-widget.el (widget-image-value-create): Was a little too aggressive
+  about when to apply the -1 :tab-order property.  Now only images that
+  are not hyperlinks or imagemaps will not be tabbed to.
+
+* w3-prefs.el (w3-preferences-init-proxy-panel): Updated preferences panel
+  for new format of url-proxy-services
+
+* w3-vars.el (w3-hyperlink-menu): Fixed problem with calling wrong
+  bookmark function - would create a bookmark to the current document, not
+  the document under the mouse.
+  (w3-popup-menu): Added a few menu itmes (reload, show images, add bookmark)
+
+* w3-hot.el (w3-hotlist-add-document-at-point): Extract the title
+  correctly for the new widget implementation of hyperlinks.
+
+Mon Mar 10 06:31:48 1997  William M. Perry  <address@hidden>
+
+* w3-menu.el (w3-menu-options-menu): Fixed problem with XEmacs when
+  building without toolbars - would insert nil in the menu in a very wrong
+  place.
+
+* font.el (font-normalize-color): Under win32, make sure we define the
+  color before we try to use it, since Emacs doesn't support raw #RRGGBB
+  color specifications yet.
+  (font-rgb-color-p): make all #RRGGBB color specs go through
+  font-normalize-color
+
+* Emacs-W3 3.0.67 released
+
+Mon Mar 10 1997  Dave Love  <address@hidden>
+
+* w3.el (w3-do-setup): Make configuration file loading contingent
+  on init-file-user (i.e. suppressed with -q).
+
+Sun Mar  9 13:09:38 1997  William M. Perry  <address@hidden>
+
+* w3-widget.el (widget-image-value-create): Set :tab-order to -1 so the
+  latest widget library won't tab to image widgets.
+
+* w3.el (w3-mode): Make sure w3-mode-hook is run last, so that people can
+  turn off truncate-lines if they want.
+
+* ssl.el (open-ssl-stream): ssl-program-arguments is now dynamically
+  evaluated, similar to ps-lpr-switches.  The special symbols 'host' and
+  'port' are available, and bound to the hostname and port#/service we are
+  about to connect to.
+
+* w3-display.el (w3-finish-drawing): Remove all read-only properties on
+  text.
+
+* url-cache.el (url-cache-expired): fixed standalone mode
+
+Sat Mar  8 09:13:59 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.66 released.
+
+* url-cache.el (url-cache-prepare): Threw a condition-case around the
+  make-directory call, just in case we can't create the file for some
+  reason.  Also fixed bug where the file wouldn't be cached until the
+  second time you visited it.
+
+* url.el (url-retrieve-internally): Deal with https asynch
+
+* w3-xemac.el (w3-mode-version-specifics): Don't try to add the toolbar if
+  device-type == 'stream.
+
+* w3-vars.el (w3-temporary-directory): Ditto.
+
+* url-vars.el (url-temporary-directory): Initialize from TMPDIR
+  environment variable.
+
+* w3.el (w3-start-viewer): Ditto.
+
+* md5.el (md5): Ditto.
+
+* mm.el (mm-compose-type): Don't use hardcoded /bin/sh and -c - use
+  shell-file-name and shell-command-switch
+  (mm-viewer-passes-test): ditto.
+
+* w3-sysdp.el: Better device-* functions for Emacs-19 under win32 and OS/2
+
+* w3-display.el (w3-display-node): Better handling for <noframes> support.
+
+Fri Mar  7 06:13:20 1997  William M. Perry  <address@hidden>
+
+* w3-script.el (w3-script-evaluate-form): protect against bad input during
+  the read-from-string when parsing emacs-lisp scripts.
+
+* w3-auto.el (w3-preferences-edit): Make the autoload for this be
+  interactive so that the user can actually find it!
+
+* Emacs-W3 3.0.65 released.
+
+* w3.el (w3-document-information): Better handling of last-modified
+  findings.
+
+* w3-forms.el (w3-form-create-image): Try to use the value of an
+  image-input area as the label for the widget we create.
+
+* w3-elisp.el (w3-elisp-safe-eval): Throw a condition-case() around the
+  eval to catch bad forms, etc.
+
+* w3-script.el (w3-script-evaluate-form): Don't signal an error on unknown
+  scripting languages, just show a warning.
+
+Thu Mar  6 08:24:49 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-complete-link): Protect against malformed widgets (null :from
+  or :to).  Is this from delayed image widgets?
+
+* w3-vars.el (w3-mode-map): Changed binding of M-s to w3-save-as instead
+  of w3-search - does anybody use that instead of the forms interface?
+
+* w3.el (w3-document-information): Show document size
+
+* css.el (css-parse): Removed warning about old-style stuff for
+  device-dependent styles - was too annoying.  Need to just remove this
+  support totally for the 3.0 release.
+
+* w3.el (w3-internal-handle-preview): When previewing a buffer, remove all
+  text properties from the document source before doing anything.
+  (w3-mail-current-document): Bind case-fold-search when looking for where
+  to insert the <base> tag.
+  (w3-loaded-stylesheets): New variable to keep track of what stylesheets
+  were loaded at startup.
+
+* url-cache.el (url-cache-create-filename-human-readable): New function to
+  create cached filenames using the old method, that was slightly more
+  human readable.
+
+Wed Mar  5 15:38:00 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.64 released
+
+* w3-parse.el: OH god, finally got raw text inside a <tr> to push a <td>
+  onto the parse tree.  got raw text inside a <table> to push a <tr>
+  onto the parse tee.
+
+* w3-widget.el: Support 'target' in img widgets
+
+Tue Mar  4 07:55:56 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-display-node): Support 'seqnum' attribute
+
+* w3.el (w3-mail-document-author): Fixed for new 'link' representation
+  (w3-document-information): If a document has a 'Last modified: blah' line,
+  use it as the last modified information as a last resort.
+
+* Synch'ed up with widget 1.50
+
+* w3-forms.el: Try to play nice with old and new versions of
+  widget-edit/wid-edit.el
+
+Tue Mar  4 06:23:41 1997  Michael Ernst <address@hidden>
+
+* url.el (url-get-url-at-point): If a possible URL starts with www., slap
+  on 'http://', as someone probably just forgot it.
+
+Tue Mar  4 06:23:41 1997  William M. Perry  <address@hidden>
+
+* w3-prefs.el (w3-preferences-hooks-variables): Removed some old variables.
+  (w3-preferences-edit): The preferences panel actually works again.  No
+  longer tries to use an imagemap - a dropdown is good enough dammit.
+
+* w3-vars.el: Removed some old variables
+
+* w3-display.el (w3-display-node): For <a> tags, do not embed a widget in
+  the buffer unless it actually has an 'href' attribute.  This helps a
+  _lot_ with <a name="blah">...</a> constructs.
+
+Tue Mar  4 06:18:06 1997  Toby Speight <address@hidden>
+
+* w3.el (w3-mail-current-document): Allow TM (if it's in use) to choose
+  the appropriate Transfer-Encoding of a mailed document.
+  (w3-mail-current-document): Try real hard to put <base> where it belongs
+  (in the <head>, if that is not found, then just after <html>, otherwise
+  just at the beginning of the document)
+
+Mon Mar  3 07:10:11 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.63 released
+
+* w3-forms.el (w3-form-field-label): Labels are now reimplemented for form
+  fields
+
+* w3-display.el (w3-parse-link): Now honors the old variable
+  w3-honor-stylesheets, which hadn't made it back onto the reimplemented
+  features list yet.
+
+* font.el: Added quite a few autoloads.  Package no longer overwrites the
+  set-face-* functions, as this was deemed evil in the extreme.
+
+* w3-display.el (w3-face-for-element): Use the font-set-face-* functions
+  instead of the raw set-face-* functions.
+
+* w3-widget.el (widget-image-inaudible-p): New variable that controls
+  whether image widgets are rendered inaudible by emacspeak or not.
+  (widget-image-value-set): Use it.
+
+* url-cache.el (url-cache-directory): New variable that controls where you
+  cache files will be stored.  Defaults to "~/.w3/cache"
+  (url-cache-creation-function): New variable that controls what function
+  will be used to create cached filenames.
+  (url-cache-create-filename-using-md5): This is now the default (and
+  only) cache-file-creation function.  Suitably fast under Emacs 19 (lisp
+  implementation), _very_ fast under XEmacs, where it is written in C.
+
+Thu Feb 27 07:27:43 1997  William M. Perry  <address@hidden>
+
+* w3-sysdp.el: Added alias of make-symbolic-link to copy-file for NTEmacs
+
+* w3-elisp.el: Removed face functions from the safe list.
+
+Wed Feb 26 16:08:08 1997  Per Abrahamsen  <address@hidden>
+
+* font.el (font-create-object): Added autoload.
+
+Wed Feb 26 08:17:37 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-region): Fixed typo when binding
+  w3-display-same-buffer - no wonder it wasn't working right.
+
+* images.el (image-normalize): Bind file-coding-system to the appropriate
+  no-conversion so that running subprocesses doesn't munge the data when
+  running under MULE.
+  (image-normalize): Now uses call-process-region instead of
+  shell-command-on-region, and removed the explicit mention of '/bin/sh'
+  and friends.  Uses the ability of call-process-region to specify a
+  separate file to use for stderr - yipeee.
+
+* url.el (url-setup-privacy-info): Slight change as to how url-system-type
+  and url-os-type are set up.  No longer uses nested parens, as this seems
+  to confuse some sites that try to use the User-Agent header as a
+  state-tracker.
+
+Mon Feb 24 10:15:45 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-widget-echo): Make sure that nothing that will be
+  echoed is the empty string.
+
+Sun Feb 23 08:34:18 1997  William M. Perry  <address@hidden>
+
+* url-cache.el (url-store-in-cache): fixed stupid bug in caching logic
+
+Sat Feb 22 07:21:29 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.62 released
+
+Thu Feb 20 13:40:22 1997  William M. Perry  <address@hidden>
+
+* w3-forms.el (w3-form-summarize-password): By default, don't summarize
+  password entry boxes.
+
+Thu Feb 20 07:33:59 1997  Thierry Emery <address@hidden>
+
+* w3-display.el (w3-frames): Better support for Frames
+
+Thu Feb 20 07:33:59 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-complete-link): Fixed bug in using try-completion to make sure
+  we have a match before passing a URL off to w3-fetch.
+
+* Synch'd up to widget 1.44
+
+* url.el (url-default-callback): Caching works in asynch mode now.
+
+Wed Feb 19 05:48:40 1997  William M. Perry  <address@hidden>
+
+* css.el (css-split-font-shorthand): Make sure that the subelements of the
+  'font' shorthand property get run through the property value-expansion
+  routines before getting returned.  This royally screwed up font-family,
+  font-weight, and friends.
+  (css-expand-color):  Now recognizes 'transparent' and 'none' as special
+  color names.
+  (css-expand-value): When dealing with color-shorthand, make sure
+  everything gets run through the value-expansion routines as well.  Ack.
+
+* w3-elisp.el (w3-elisp-safe-function): You can now supply a validation
+  function for the arguments of a script-enabled function, its no longer a
+  binary operation on just the function name.  You can also give it a
+  variable name, and the value of that variable at the time of execution
+  is what controls whether it is safe or not.
+
+* w3.el (w3-download-url): Finally fixed bug where w3-download-url would
+  not save in the correct directory if you just accepted the default
+  pathname it offered.
+
+* url-cache.el (url-cache-ignored-protocols): New variable controlling
+  what protocols we should never cache to disk.
+  (url-cache-cachable-p): use it.
+
+* w3.txi: Updated all nodes and menus, a few stylistic changes
+
+* w3-elisp.el: Added read-access to devices, frames, windows, buffers, and
+  property-lists.  Also added function, lambda, point, and list accessors
+  (member, memq, assoc)
+
+* w3-display.el (w3-display-node): Bind widget-push-button-gui to nil in
+  w3-display-node so that images don't run into the
+  visible-portion-of-buffer-is-not-modifiable-bug.  Ick.
+
+* w3-elisp.el: Don't allow access to 'set'-type text-property functions
+  from scripts.
+
+Tue Feb 18 15:11:08 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.61 released
+
+* w3.txi (Supported URLs): added sections on each protocol supported -
+  needs lots of fleshing out.
+
+* url-misc.el (url-info): Info URL loader now unhex's the target, so that
+  you can have something like info:w3.info#Getting%20Started
+
+* url.el (url-do-setup): Removed secure-http (SHTTP) handler - who the
+  hell cares anymore, it lost.
+
+* w3-display.el (w3-display-node): Correctly calculates right margin as
+  documented (from window-width and right-margin)
+
+* w3.el: Removed w3-batch-fetch
+
+* url-vars.el: Removed lots of old variables
+
+* url-misc.el: Removed x-exec URL handler - no interest anymore.
+
+* w3-script.el (w3-script-evaluate-form): Use it.
+(w3-do-scripting): New variable to control whether to do _any_ scripting
+or not.
+
+* The URL package now stores the current parsed URL object instead of 5 or
+  6 separate variables.
+
+* dist.Makefile: Removed old pgp and wais support, it was gross and
+  apparently nobody was using it.
+
+Tue Feb 18 06:13:03 1997  "T. V. Raman" <address@hidden>
+
+* w3-forms.el (w3-form-summarize-radio-button): Better radio button
+  summarizer.
+
+Tue Feb 18 06:13:03 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-finish-drawing): Moved #blah target finding in here,
+  where it belongs.
+
+* w3-vars.el (w3-mode-map): Added binding for raw '\t' instead of relying
+  on [tab].  Apparently this keysym isn't aliased under Emacs 19 on a
+  TTY.
+
+Mon Feb 17 15:10:38 1997  William M. Perry  <address@hidden>
+
+* w3-elisp.el: Interface to Emacs-Lisp for safe scripting.
+
+* w3-script.el: Basic client-side scripting has been implemented.
+
+* w3-xemac.el (w3-mouse-handler): Ditto
+
+* w3-e19.el (w3-mouse-handler): Plugged in handling of the onMouseOver event
+
+* w3-display.el (w3-handle-string-content): Now adds a text property that
+  contains w3-display-open-element-stack, so that from anywhere in the
+  buffer you can find out where you are in the parse tree.
+
+* default.css (input): ome default stylesheet updates for input fields on
+  TTYs
+
+Sun Feb 16 09:01:18 1997  Shuji Narazaki <address@hidden>
+
+* mule-sysdp.el: Updated for mule 3.0
+
+Sat Feb 15 15:35:15 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.60 released
+
+* w3-display.el (w3-display-node): use it.
+
+* w3-vars.el (w3-display-frames): New variable for whether to show 'frame'
+  documents as a list of the subelements.
+
+* w3.txi (Speech Properties): finished this chapter.
+(Media Selection): ditto
+(Time Units): ditto
+(Angle Units): ditto
+(Properties): Explanatory text at beginnign of section
+
+Fri Feb 14 09:34:35 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.59 released
+
+* w3.txi: Lots of documentation about stylesheets, chapter layout
+  changes.
+
+Thu Feb 13 07:01:59 1997  William M. Perry  <address@hidden>
+
+* Synch'd up to widget 1.38
+
+* w3-forms.el (w3-form-resurrect-widgets): For now, don't use the nice new
+  GUI pushbuttons - they appear to suffer badly on long lines.
+
+* w3-mouse.el (w3-running-FSF19): Use new w3-popup-menu-on-mouse-3 variable
+
+* w3-vars.el: Removed _lots_ of obsolete variables
+(w3-popup-menu-on-mouse-3): New variable to control whether W3 should
+  override mouse-3 or not.
+
+* Emacs-W3 3.0.58 released
+
+* w3.txi: Added stubs for stylesheet chapters and supported URLs
+
+* images.el (image-register-netpbm-utilities): This is now safe to call
+  multiple times again.
+
+Wed Feb 12 06:26:55 1997  William M. Perry  <address@hidden>
+
+* w3-forms.el (w3-form-keymap): When binding widget-end-of-line, make sure
+  that we do not overwrite Emacspeak's prefix-key.  Now does a
+  where-is-internal to find the correct binding in global-map to
+  override.
+
+* w3-display.el (w3-display-node): bind :emacspeak-help to 'w3-widget-echo
+  in all the hypertext links.
+
+* w3-vars.el (w3-mode-map): New binding for \M-\t - this _should_ have
+  been taken care of by the [(meta tab)] definition, but evidently it
+  doesn't.  *sigh*
+
+Tue Feb 11 07:33:50 1997  William M. Perry  <address@hidden>
+
+* w3-forms.el (w3-form-create-option-list): Specify :menu-tag-get so that
+  keyboard-based-completion doesn't get confused by the fact that some
+  items will have spaces slapped in at the end.
+
+* ssl.el (ssl-program-arguments): New variable - a list of command line
+  switches to send to the SSL program in a subprocess, before the hostname
+  and port number.
+  (open-ssl-stream): Use it.
+
+Mon Feb 10 07:45:31 1997  William M. Perry  <address@hidden>
+
+* url-file.el (url-file): Removed refs to variable url-use-hypertext-dired
+
+* url-vars.el: Removed obsolete variable url-use-hypertext-dired
+
+* url-file.el (url-dired-find-file-mouse): fixed bad typo of 
+  (interactive...) spec, added documentation to a few functions.
+  (url-file): Removed refs to obsolete variable url-use-hypertext-dired
+
+* w3-xemac.el (w3-setup-version-specifics): Workaround for users of XEmacs
+  19.14 or 20.0 with the bad bad bad lossage with text properties that
+  have null values.  This  bug is fixed in XEmacs 19.15, and will be in
+  20.1 as well.  This bug would cause you to get errors like:
+       internal error: no text-prop <#extent ....> start-open
+
+* w3.el (w3-widget-button-click): Deal with new image capabilities of the
+  widget checkbox/radio-button stuff.
+
+* Synch'ed up to widget 1.31
+
+Sun Feb  9 15:39:19 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.57 released
+
+* url-file.el (url-dired-minor-mode): New minor mode that overrides a few
+  of direds keybindings to use Emacs-W3 instead of straight find-file.
+  (url-format-directory): Now just uses dired to display directory
+  listings, much more powerful than the old way.  Can copy files, act on
+  multiple files, you all know the drill.
+
+* w3.txi: Added more chapters, reorg of others.
+
+* w3-display.el (w3-maybe-start-image-download): Fixed handling of bad
+  images in the cache again.  Duh.
+  No longer log to the warnings buffer if we fail to load an image.  Just
+  use message - much less intrusive.  We just usually don't care that much
+  about failed image loads.
+
+* url-gw.el (url-open-stream): fixed typo - was calling old
+  url-nslookup-host instead of url-gateway-nslookup-host
+
+* w3.el (w3-insert-formatted-url): Now inserts markup in lowercase.
+
+Sat Feb  8 13:54:43 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.56 released.  Getting closer!
+
+* w3-forms.el (w3-form-summarize-radio-button): Finally, a decent
+  summarization of radio buttons
+  Fixed typo in specifying summarizer for hidden form fields.
+  (w3-form-keymap): Bind C-a and C-e by default.
+
+* w3-widget.el (widget-image-value-create): When using emacspeak, show
+  client side imagemaps as a table.  Need a more general solution for
+  this, but this makes us nicer than IE again. :)
+
+* Updated to widget 1.30
+
+Fri Feb  7 16:49:55 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-handle-string-content): Make sure faces text
+  properties are closed, so that things don't bleed over.
+  (w3-fixup-eol-faces): New function for Emacs 19 that removes face
+  information at newlines, so that underlining will not extend from the
+  end of a line to the window edges - very ugly.
+
+* w3-menu.el (w3-menu-initialize-w3-mode-menu-map): Don't support 'emacs
+  in w3-use-menus under Emacs in Windows 95/NT.
+
+* w3-display.el (w3-finalize-image-download): Deal with bad images better.
+  (w3-finish-drawing): Better protection of putting images in.
+
+* url-gw.el (url-open-stream): Don't auto-retry connections.  Don't throw
+  an error if you fail to connect to a site.  This is for image loadings
+  that fail for some reason or another.
+
+* css.el (css-expand-length): better handling of float values and 'ex'
+  unit type.
+
+* font.el (x-font-create-object): Unconditionally make case-fold-search
+  non-nil so that we don't lose big-time.  This was the cause of the very
+  weird font-spatial-to-canonical lossage under XEmacs with font sizes of
+  something like '+12pt'
+
+* w3.el (w3-view-this-url): Use widget-echo-help if we didn't find a URL
+  under point.
+
+Fri Feb  7 15:22:25 1997  Charles Levert <address@hidden>
+
+* w3-widget.el (widget-image-notify): Bad data being fed to w3-fetch if a
+  client-side imagemap had an alt attribute (but only if the <map> came
+  _after_ the use.
+
+Fri Feb  7 15:22:25 1997  William M. Perry  <address@hidden>
+
+* font.el (font-spatial-to-canonical): protect against bad input to this
+  function.
+
+Fri Feb  7 15:19:36 1997  Toby Speight <address@hidden>
+
+* w3-parse.el (w3-parse-buffer): Parser didn't allow for the fact that
+  TAGC is optional on end-tags as well as on start-tags (i.e. "<b<i>
+  bold-italic</i</b>" is legal).
+
+Fri Feb  7 06:28:37 1997  William M. Perry  <address@hidden>
+
+* w3-forms.el (w3-form-keymap): Now inherits from widget-keymap, with a
+  few exceptions.
+
+* url.el (url-uncompress): This function now no longer looks at the file
+  extension to determine a compression/encoding method.  This is so that
+  doing searches on `foo.tar.gz' will not bogusly cause the decompression
+  steps to run.  Ick!
+
+* url-file.el (url-insert-possibly-compressed-file): This function no
+  longer atempts to decompress the file after loading it in.  Instead, it
+  sets an appropriate content-transfer-encoding header based on the
+  filename, so that this will allow url-uncompress to work correctly on the
+  buffer.
+
+Thu Feb  6 06:24:26 1997  William M. Perry  <address@hidden>
+
+* w3-print.el (w3-postscript-print-function): New variable to control what
+  function is used to generate postscript output.
+  (w3-print-this-url): Use it.
+
+* w3-display.el (w3-handle-string-content): Make all inserted text
+  read-only
+
+* w3-forms.el (w3-form-use-old-style): New variable to control whether to
+  use the old-style interaction with form fields instead of the 'type
+  directly into the buffer' method
+  (w3-form-determine-size): Use it.
+  (w3-form-create-integer): Use it.
+  (w3-form-create-float): Use it.
+  (w3-form-create-text): Use it.
+  (w3-form-create-password): Use it.
+  (w3-revert-form): Fixed error with 'reset' buttons on forms that had
+  hidden form fields.
+
+* w3-vars.el (w3-mode-map): Define [backtab] by default
+
+* w3-display.el (w3-size-of-tree): Removed some warnings
+(w3-display-table-dimensions): ditto
+
+* Updated to widget 1.26
+
+* default.css: Some default formatting changes for input fields.
+  Everything is underlined by default except submit/reset/image/button
+  fields, so that they are a little easier to spot.
+
+* w3-parse.el (w3-parse-buffer): Now slaps pseudo-elements into input
+  fields so that stylesheets can access them.
+
+Wed Feb  5 14:42:12 1997  William M. Perry  <address@hidden>
+
+* Updated to widget 1.24
+
+* Happy birthday Jenny P.
+
+Tue Feb  4 08:21:03 1997  William M. Perry  <address@hidden>
+
+* font.el (x-font-create-name): Better checking/optimizing of when to just
+  return the default font.
+
+* w3-forms.el: Make use of the new information, and pass it down to the
+  widget library appropriately.
+
+* w3-display.el (w3-display-node): Now passes in the entire list of active
+  faces to form creation functions.
+
+Mon Feb  3 07:26:18 1997  William M. Perry  <address@hidden>
+
+* w3-emulate.el (w3-lynx-emulation-minor-mode-map): Lots of new
+  keybindings for lynx emulation minor mode.
+
+* Emacs-W3 3.0.55 released
+
+* w3-forms.el (w3-form-determine-size): Fixed _STUPID_ problem where
+  option lists would lose everything but the first option in them.  I'm a
+  dumbass.  Sort modifies its list parameter! ICK ICK ICK.
+
+* url.el (url-after-change-function): Show prettier status messages.
+  Sizes are converted to bytes, k, or M, depending on how big the file
+  is.
+
+* w3.txi: Lots of documentation changes - volunteers welcome.
+
+* Removed personal annotation support, since it wasn't shown with the new
+  display engine, it needs to be rethought, and nobody had complained in
+  the entire beta cycle.
+
+* w3.el (w3-history-find-url-internal): Redid the history mechanism.
+  Toolbar and menu entries are now grayed out appropriately.
+
+* url-http.el (url-create-mime-request): Fixed cookie support if not going
+  through a proxy gateway.
+
+Sun Feb  2 22:05:41 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-display-table): Fix for negative colwidth
+
+Fri Jan 31 14:28:54 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-fetch): Fixed targetted links (http://blah/#foo)
+
+Fri Jan 31 11:20:47 1997  Alf-Ivar Holm <address@hidden>
+
+* w3.el (w3-mail-current-document): Fixed problem with calling
+  w3-parse-buffer with too many arguments when mailing LaTeX-ified
+  files.
+
+Fri Jan 31 11:19:37 1997  Cord Kielhorn <address@hidden>
+
+* css.el (css-expand-length): Fixed bad regexps for percentage and
+  character based lengths
+
+Thu Jan 30 20:27:06 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.52 released
+
+* w3-display.el (w3-handle-image): When doing table auto layout, don't
+  start loading the images.
+
+Wed Jan 29 06:15:37 1997  William M. Perry  <address@hidden>
+
+* font.el (x-font-create-name): Yet another fix for not screwing up the
+  line-height in Emacs 19.
+
+* w3-display.el (w3-face-for-element): Uhh, oblique seems to work.
+
+* font.el (set-font-style-by-keywords): now deals with arguments that
+  aren't lists, for the font-style and font-variant CSS stuff
+
+* w3-display.el (w3-display-node): Reimplemented <cookie> tag.
+(w3-display-node): Reimplemented <flame> tag.
+
+* url.el (url-insert-file-contents): url-insert-file-contents now
+  decodes/uncompresses the data before returning.
+
+* w3-display.el (w3-display-node): Reimplemented <pinhead> tag
+
+Tue Jan 28 06:22:08 1997  William M. Perry  <address@hidden>
+
+* font.el (x-font-create-name): Never take font size into account under
+  Emacs - too much chance of totally screwing up the users leading by
+  choosing a bigger font than their default.  This sucks.  But I can't
+  find a better solution.
+
+* w3.el: w3-mode now turns on truncate-lines by default.
+
+* w3-forms.el (w3-form-create-image): Better image input type support.
+
+Mon Jan 27 08:21:58 1997  William M. Perry  <address@hidden>
+
+* w3-forms.el (w3-form-create-password): Now uses real password entry
+  widgets provided by 'widget' - you _MUST_USE_ the widget library that
+  comes with Emacs-W3 for this, otherwise the info won't be hidden
+  correctly.
+  (w3-form-add-element): Deal with hidden text areas better when they are
+  in forms
+
+* Synch'd up to widget 1.22
+
+Sun Jan 26 16:50:09 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.51 released
+
+* w3-forms.el (w3-form-create-text): Now uses the real text entry widgets
+  provided by 'widget' - still can't do this for password fields yet
+  though.
+
+* Synch'd up to Widget 1.20
+
+Sat Jan 25 13:38:12 1997  William M. Perry  <address@hidden>
+
+* url.el (url-expand-file-name): Now strips out spaces as well as
+  newlines/carriage returns. More fixes for that bastardized microsoft
+  home page.
+
+* url-http.el (url-create-mime-request): Make sure that we retrieve the
+  cookies for the real URL we are retrieving when going through a proxy.
+  Now the psychotic crap that is the microsoft home page should be
+  successfully retrieved if going through an HTTP proxy.
+
+* url-cookie.el (url-cookie-handle-set-cookie): Attempt to deal with
+  idiotic microsoft home page that sends out set-cookie headers that look
+  like MC1=ID=abc, and expects two cookies MC1='' and ID='abc'  *sigh*
+
+* w3-forms.el, w3-display.el: Form elements now keep all their attributes
+  with them.  Will be useful when we start allowing scripting.
+  (w3-form-create-custom): Rudimentary patches to allow embedding 'custom'
+  widgets into the buffer.  Interesting.
+
+* w3-forms.el (w3-form-determine-size): New function to calculate how big
+  a form field will be - option lists should look much better now.
+
+Thu Jan 23 08:48:59 1997  William M. Perry  <address@hidden>
+
+* Synch'ed up to custom 1.19
+
+* url-parse.el: document extra slots of url-generic-parse-url
+
+Thu Jan 23 08:34:34 1997 Joe Wells <address@hidden>
+
+* url-file.el (url-file): Patch to tell ange-ftp and/or efs the password
+  in a file/ftp URL so that you won't be prompted for the password, even
+  if one was specified in the URL 
+
+* url-parse.el (url-generic-parse-url): Fixed bug where specifying a
+  username and password in the URL would downcase the username and
+  password as well as the hostname.
+
+Wed Jan 22 08:28:13 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.50 released
+
+* base64.el (base64-encode-region): Pulled in code from VM for quicker
+  encoding/decoding
+
+* mm.el (mm-content-transfer-encodings): Better base64 decoding
+
+Wed Jan 22 07:31:03 1997  Alf-Ivar Holm <address@hidden>
+
+* w3-emulate.el (w3-lynx-emulation-minor-mode-map): Lynx [up] and [down]
+  bound to non-existing functions.
+
+* w3.el (w3-do-setup): Fixed installation of lynx emulation modes keymap.
+
+Tue Jan 21 07:56:51 1997  William M. Perry  <address@hidden>
+
+* url-misc.el (url-data): Make sure to url-decode the data before
+  inserting it into the buffer.
+
+* w3-menu.el (w3-toggle-minibuffer): better version
+
+* w3-forms.el (w3-form-create-integer): New form entry type
+  (w3-form-create-float): new form entry type
+  (w3-form-encode-helper): deal with the new integer/float types
+
+* w3-display.el (w3-display-node): Reimplemented <select multiple> as a
+  list of checkboxes
+
+Mon Jan 20 06:29:07 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-display-node): Keep track of the last form's action,
+  for theoretically 'naked' input fields that we want to try and handle as
+  best we can anyway.
+
+* w3-parse.el: Much more lenient about where form elements can be found.
+
+* w3-forms.el: summarizer functions now take the widget as an extra
+  parameter.
+
+* w3.el (w3-find-etc-directory): New function - not used yet.
+
+* w3.txi: Warning!  You now need a very new version of texinfo to compile
+  the .info or .dvi file yourself.
+
+* url-mail.el (url-mail): Now tries to use message-mail if it is bound
+  instead of just plain old 'mail'.
+
+* w3-forms.el (w3-form-add-element): Duh, fix hidden form fields.
+
+* font.el (font-normalize-color): Hopefully fixed color lossage under OS/2
+  and Windows
+
+* w3-forms.el (w3-form-summarize-field): Actually 'message' the string as
+  a workaround for emacspeak 5.0
+
+Sun Jan 19 09:32:15 1997  William M. Perry  <address@hidden>
+
+* w3-xemac.el (w3-mouse-handler): Ditto
+
+* w3-e19.el (w3-mouse-handler): Protect against 'bad format string' errors
+  when showing a hexified URL
+
+* w3-forms.el (w3-form-mark-widget): Be super paranoid and mark all
+  children and their children's children, and the parents of a widget.
+  (w3-form-create-radio-button): Make sure radio button children always
+  get updated via w3-form-mark-widget.
+  (w3-form-summarize-radio-button): Slightly better summarization of radio
+  buttons.
+
+* Emacs-W3 3.0.49 released
+
+* Synch'ed up with widget 1.18
+
+Fri Jan 17 06:25:36 1997  Dave Love <address@hidden>
+
+* w3-display.el: w3-echo-link now prefers the URL to the text of a link
+
+Fri Jan 17 06:25:36 1997  William M. Perry  <address@hidden>
+
+* w3-display.el: Fixed handling of inlined styles
+
+* w3-mouse.el: Some fixes for XEmacs when built with no X support
+
+* default.css: Now uses the new @media directives instead of the old
+  :blah: stuff
+
+* css.el (css-handle-media-directive): New function to handle @media
+  directives.
+  (css-parse): Deprecate the old :mediatype: way of specifying media
+  dependent styles.
+
+* w3-style.el (w3-handle-style): Now gets passed a plist instead of an
+  assoc list.
+  (w3-handle-style): Pay attention to the new 'media' attribute on
+  stylesheet links, and don't load the stylesheet if we aren't currently
+  running on that type of media.
+
+* css.el (css-properties): Added proposed printing properties from a W3C
+  draft.
+
+Thu Jan 16 06:06:45 1997  William M. Perry  <address@hidden>
+
+* css.el (css-handle-media-directive): Implemented the @media processing
+  instruction.
+
+* w3-forms.el (w3-form-summarize-option-list): Changed the summarize
+  function for option lists.  Much saner now.
+
+* w3.el (w3-read-url-with-default): Use the URL at point before falling
+  back to http://www.
+  (w3-source-document): When sourcing a document, let set-auto-mode do the
+  right thing.  .html comes up in html-mode, or whatever now.
+
+* url-cookie.el: Fixed some compile warnings under Emacs
+
+* w3-forms.el (w3-form-summarize-option-list): Make each choice-item have
+  emacspeak-help set.
+
+* w3-speak.el (w3-widget-backward): New advice
+(w3-widget-forward): New advice
+
+* w3-forms.el (w3-form-create-option-list): Renamed function
+
+* Emacs-W3 3.0.48 released
+
+* w3-display.el (w3-face-for-element): Use background-color instead of
+  just background for css property.
+
+* w3-forms.el (w3-form-encode-helper): Fixed radio buttons, duh.
+
+* url-misc.el (url-do-terminal-emulator): Fixed bad var reference left
+  from old code.
+
+* url-gw.el: Moved all the gateway variables into their own namespace to
+  make it easier to turn this into a standalone package.
+
+* dist.Makefile (SOURCES): Added url-gw and w3 to the build targets.
+
+Wed Jan 15 08:00:37 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.47 released
+
+* url.el (url-expand-file-name): Make sure to remove \r from the URL as
+  well as \n
+
+* url-gw.el (url-open-stream): Added in 'telnet' and 'rlogin' methods for
+  url-gateway-method.  Code stolen from GNUS.  Thanks lars! :)  It would
+  be nice to make this file its own package and be able to override
+  open-network-stream so that all apps could get this for free.
+
+* url-misc.el (url-generic-emulator-loader): Consolidated the tn3270,
+  telnet, and rlogin URL loaders into one smarter function
+
+* url.el: Made cookie and auth modules autoloaded, removed some old autoloads
+(url-open-stream) Moved to url-gw.el
+
+Mon Jan 13 22:11:00 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-widget-echo): w3-echo-link can now be a list, so the
+  user can explicitly control fallback behaviour.
+
+* w3.txi: Added some pointers to CSS documentation
+
+* mule-sysdp.el (mule-code-convert-region): ditto
+
+* w3.el (w3-convert-code-for-mule): Fixed bug in XEmacs 20.0 mule
+
+Mon Jan 13 11:14:29 1997  T. V. Raman <address@hidden>
+
+* w3.el (w3-widget-forward): Call widget-forward interactively so that
+  emacspeak will hook it correctly.
+
+Mon Jan 13 11:14:29 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-refresh-buffer): Finally reimplemented
+  w3-refresh-buffer.
+
+Sun Jan 12 10:32:50 1997  Karl Eichwalder  <address@hidden>
+
+* w3.txi: Add @dircategory and @direntry... @end.  `install-info'
+  from texinfo-3.9 know about those.
+
+Sun Jan 12 21:49:44 1997  William M. Perry  <address@hidden>
+
+* w3.el (w3-save-as): Can now save a page as postscript again
+
+* w3-display.el (w3-display-node): inline styles work again
+
+* url-misc.el (url-data): Updated data: URL to the spec.
+  ftp://ietf.org/internet-drafts/draft-masinter-url-data-02.txt
+
+Sat Jan 11 20:47:24 1997  William M. Perry  <address@hidden>
+
+* Emacs-w3 3.0.45 released
+
+* url-misc.el (url-data): Now supports the 'data' URL type, which just
+  'fetches' everything after the data: chunk of the URL
+
+Fri Jan 10 11:49:43 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-display-node): Multicolumn works, but puts things
+  across instead of down
+
+* w3-parse.el: Basic support for parsing <multicol>
+
+* w3-display.el (w3-display-node): Make our semi-widgety hyperlinks
+  start/end open under XEmacs.
+
+* w3.el (w3-complete-link): Make sure we take case into account when doing
+  link completion.  The user can use 'test' to complete to link titled
+  'Test'.  Uses try-completion for this, which seems to work since we
+  require a match.  Is this the best way to do this?  Other than not being
+  case-insensitive at this point?
+
+* w3-forms.el (w3-form-default-widget-creator): Better way of handling
+  updates to text entry fields.
+  (w3-revert-form): Everything should be reverted correctly, both in
+  internal storage and in the buffer
+  (w3-form-create-radio-button): Get a more unique identifier to store
+  radio elements by - old way could theoretically get collisions.
+
+* w3-display.el (w3-display-handle-list-type): Updated use of 'list-style'
+  to use new property 'list-style-type'
+  (w3-prepare-buffer): Now kills the source buffer before it starts
+  drawing the tree, to avoid *URL-n* buffers when not really necessary.
+
+* css.el (css-properties): Updated all the properties to the W3C's latest
+  'recommendation' level CSS specification.
+  (css-handle-import): much better handling of @import
+  (css-parse): Better handling of '@' directives in general
+  (css-expand-value): General cleanup, reference the CSS and ACSS specs
+  for how/why we are parsing something the way we are.
+
+Thu Jan  9 06:17:08 1997  William M. Perry  <address@hidden>
+
+* Updated all copyright notices.  Happy belated new year!
+
+* w3-display.el (w3-region): Fixed a few bugs with nuking too much of a
+  buffer when using w3-region
+
+* w3.el (w3-read-url-with-default): Use new variable.
+
+* w3-vars.el (w3-fetch-with-default): New variable to control whether or
+  not w3-fetch will figure out a good default value for the URL or not.
+
+* w3-forms.el (w3-form-mark-widget): New function to mark a widget and all
+  its children with an appropriate :emacspeak-help and 'w3-form-data
+  Now defines a few keywords to look more widget-y
+
+Wed Jan  8 09:27:47 1997  William M. Perry  <address@hidden>
+
+* css.el (css-expand-value): Added elevation, angle, and time units.
+
+* w3-display.el (w3-display-node): Turn on voice-lock-mode by default in
+  all w3 buffers.
+
+* css.el (css-properties): Added in new speech properties from the ACSS
+  note from the W3C.  Please see
+  http://www.w3.org/pub/WWW/Style/CSS/Speech/NOTE-ACSS for more
+  information.
+
+* w3-forms.el: Moved all the form entry summarization functions from
+  w3-speak.el into w3-forms.  Easier to keep in synch this way.
+
+* w3-display.el (w3-display-node): Reimplimented the 'keygen' form entry
+  type for netscape compatibility.
+
+Tue Jan  7 07:20:08 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-region): New function that parses the HTML in a region
+  'in-place', so that things like MIME mailers/gnus readers can show HTML
+  inline a lot easier.
+
+* w3-forms.el (w3-form-resurrect-widgets): Fixed case where a widget goes
+  all the way to point-max and next-single-property-change will return
+  nil.  Would pass bad args to delete-region.
+  (w3-form-summarize-field): Moved some of the smarts about summarizing W3
+  widgets from w3-speak into the core forms code.
+
+* font.el (define-font-keywords): New function for defining keywords that
+  will actually work across Emacs and XEmacs
+
+* w3-display.el (w3-display-node): Reimplemented 'note' functionality, by
+  converting it into a two-cell table.
+  (w3-display-node): Implemented <dir> as multi-column, as-per the RFC and
+  HTML 3.x specifications
+
+* default.css: Added default display type for dir and menu
+
+Mon Jan  6 21:49:52 1997  William M. Perry  <address@hidden>
+
+* url-http.el (url-create-mime-request): Fixed yet another stupid problem
+  in Host: header handling.  Was never sending the right information if
+  you were not going through a proxy this time.  *sigh*
+
+* w3-forms.el (w3-form-add-element): Fixed hidden form fields
+
+Sun Jan  5 22:38:54 1997  William M. Perry  <address@hidden>
+
+* url-vars.el (url-proxy-services): updated documentation string
+
+* w3-widget.el (widget-image-notify): Fixed client side handling of
+imagemaps on a TTY or a delayed/broken image. Duhhh
+
+Fri Jan  3  Dave Love  <address@hidden>
+
+* w3-e19.el (w3-mouse-handler): Fix link echoing.
+
+Fri Jan  3 08:43:56 1997  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.43 released
+
+* font.el (make-font): Treat args as a plist, just for sanity's sake.
+
+Thu Jan  2 12:19:31 1997  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-table-hack-borders): Fix stupid use of 'otheriwse'
+  instead of 'otherwise' in a case statement.
+
+* w3-forms.el (w3-form-add-element): Fix stupid use of 'otheriwse'
+  instead of 'otherwise' in a case statement.
+  (w3-form-resurrect-widgets): Fixed XEmacs handling of widget recreation,
+  and also fixed problem where some widgets would be skipped.
+
+Tue Dec 31 07:37:17 1996  William M. Perry  <address@hidden>
+
+* w3-e19.el: All the menus in Emacs-19 now use the same constructors that
+  the :filter entries under XEmacs do.  This will make things much easier
+  in the future in not duplicating crufty menu-construction code once for
+  XEmacs menu-structs and once for Emacs keymaps.
+
+* w3-menu.el (w3-menu-html-links-constructor): Now works with the Emacs 19
+  implementation of property lists.
+
+Mon Dec 30 06:25:28 1996  William M. Perry  <address@hidden>
+
+* w3-menu.el (w3-popup-menu): context-sensitive menus over delayed images
+  work again 
+
+* w3-display.el (w3-parse-link): New way to store <link> information from
+  an HTML document.
+
+* w3.el (w3-search): Deal with new <link> storage
+
+* w3-menu.el (w3-menu-html-links-constructor): Deal with new way <link>
+  items are stored - now uses the 'title' attribute if present.
+
+* w3-auto.el (w3-form-resurrect-widgets): Added autoload
+
+* url-file.el (url-format-directory): Removed url-forms-based-ftp option -
+  didn't really work anyway.
+
+Sun Dec 29 15:54:21 1996  William M. Perry  <address@hidden>
+
+* w3-forms.el (w3-form-resurrect-widgets): fixed stupid problem in munging
+  of the size of form elements.
+
+* Emacs-W3 3.0.42 released
+
+* w3-display.el (w3-table-hack-borders): Deal gracefully with not finding
+  a 'terminal' font to display hacked border chars in
+
+* w3-hot.el (w3-hotlist-add-document): don't hexify a url before sticking
+  it in the hotlist buffer
+
+* w3-display.el (w3-display-node): hyperlinks with images at the start
+  will now have a button associated with the entire link, not just the
+  image part.
+
+* w3-sysdp.el (fillin-text-property): made it work under Emacs19
+
+Sun Dec 29 00:07:39 1996  Takahiro Hayata <address@hidden>
+
+* mule-sysdp.el (mule-write-region-no-coding-system): Patch for Mule 2.3 
+
+Sun Dec 29 00:07:39 1996  William M. Perry  <address@hidden>
+
+* w3-forms.el (w3-form-add-element): Only insert stubs of the right length
+  for a for element, and do munging of that text into the actual widgets
+  later.  This saves us a lot of grief and heartache when handling things
+  like radio buttons that span table elements because the markers have
+  become completely insane by the time the next widget is ready to be
+  created.
+
+Sat Dec 28 17:24:08 1996  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-display-table): Don't crap out on invalid tables where
+  table-dimensions tells us we have a 0 column or 0 row table.
+
+* w3-widget.el (widget-image-value-create): Use :action instead of :notify
+  for widget-image-callback - hyperlinked images under Emacs 19 should
+  work again.
+
+Thu Dec 26 18:26:25 1996  William M. Perry  <address@hidden>
+
+* w3.el (w3-widget-forward): Use this instead of widget-forward.
+(w3-widget-backward): Ditto.  Need to make both of these smart for w3.
+
+* w3-display.el (w3-display-node): Implemented the display class 'none'
+  for turning off the rendering of an element and its subcontent.
+
+Thu Dec 26 07:21:58 1996  William Perry  <address@hidden>
+
+* w3-parse.el (w3-parse-buffer): *sigh* Allow _ in attribute names.
+
+* Emacs-W3 3.0.41 released
+
+* url-parse.el (url-generic-parse-url): bind inhibit-read-only to 't' in
+  url parsing buffers, to avoid 'attempt to modify read-only text'
+  problems when the string passed to url-generic-parse-url has the
+  read-only text property set.
+
+* w3-e19.el (w3-setup-version-specifics): popup menus should work in
+  Emacs19 again.
+
+* css.el (css-expand-value): For margin and padding, make sure we _always_
+  convert into a valid length spec.  Setting a 'margin' or 'padding'
+  property group instead of individual margin-* or padding-* values would
+  cause the display engine to crap out.
+  (css-get): Fixed generic class-only lookups (.foo, etc)
+
+* w3-display.el (w3-display-handle-list-type): Tweaks to list indentation
+
+* w3-menu.el (w3-menu-html-links-constructor): Fixed stupid problem with
+  the new navigate menu under XEmacs.
+
+Tue Dec 24 22:46:11 1996  William M. Perry  <address@hidden>
+
+* css.el (css-expand-color): Better handling of X-style color specs -
+  convert them to internal RGB format.
+
+Tue Dec 24 02:50:08 1996  Christian Limpach  <address@hidden>
+
+* font.el (ns-font-families-for-device): added test for unbound
+  device-fonts-cache variable.
+  (ns-font-create-name): handle font-styles which are numbers.
+
+* w3-sysdp.el (try-font-name): added support for Nextstep.
+
+Tue Dec 24 06:16:33 1996  William M. Perry  <address@hidden>
+
+* w3.el (w3-open-local): Send filename through expand-file-name in
+  w3-open-local to avoid having illegal URLs like file:/~/test.html
+
+* w3-widget.el (widget-image-value-create): fixed new problem with client
+  side imagemaps.  Should really work this time.
+
+* w3.el (w3-map-links): w3-map-links and hence w3-complete-link will now
+  find images that are also hyperlinks.
+
+Mon Dec 23 22:28:58 1996  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.40 released
+
+* w3-menu.el (w3-menu-go-menu): Added 'navigate' submenu to hold the
+  predefined <link> types.
+
+* w3-widget.el (widget-image-summarize): Image widgets should now be much
+  better at identifying themselves when being tab'ed to or waggled at with
+  the mouse.
+
+* w3-prefs.el: Fixed a few references to w3-glyphp (now widget-glyphp)
+
+* w3.el (w3-url-completion-function): Fixed completion of URLs
+
+Sat Dec 21 Dave Love  <address@hidden>
+
+* w3-display.el, w3-vars.el, w3.el: Define and use
+  w3-defined-link-types to canonicalize link descriptions' case for
+  ease of use.
+
+* w3-e19.el (w3-build-FSF19-menu): Add any recognised <link> items
+  to the menu in the absence of a toolbar.
+
+Thu Dec 19 13:52:35 1996  William Perry  <address@hidden>
+
+* Emacs-W3 3.0.39 released
+       
+* w3-forms.el (w3-form-encode-xwfu): Ditto.
+
+* url.el (url-hexify-string): Updated to use url-unreserved-chars when
+  escaping, ala
+  http://www.ics.uci.edu/pub/ietf/uri/draft-fielding-url-syntax-02.txt
+
+Wed Dec 18 22:09:41 1996  William M. Perry  <address@hidden>
+
+* w3.el (w3-mode): Removed bogus setting of widget-motion-hook from way
+  back
+
+* w3-parse.el (w3-parse-buffer): Better handling of <base> tag.
+
+* w3-display.el (w3-widget-echo): Better falling-back when the preferred
+  echo method yields nil.
+
+* url.el, w3-display.el, w3.el: Remove last vestiges of url-hash.el and
+  removed it from the distribution.
+
+Wed Dec 18 08:07:32 1996  William Perry  <address@hidden>
+
+* dsssl.el: Moved the DSSSL parser and friends into its own namespace.
+
+Removed dependencies on url-hash.
+
+* custom.el: Synch'd up to custom 1.13
+
+Tue Dec 17 16:36:05 1996  William M. Perry  <address@hidden>
+
+* url.el (url-expand-file-name): If we weren't given a base object to work
+  from, and url-current-object is null, set it to the object returned by
+  parsing url-view-url.
+
+* url-http.el (url-create-mime-request): Send the right information in the
+  'Host' header field when going through a proxy.
+  (url-setup-reload-timer): Emacs 19 doesn't deal well with 0-length
+  timeouts, so protect against trying to create one when dealing with the
+  refresh header.
+
+* w3-parse.el: Removed lots of crap for the old display engine - shouldn't
+  cons up as much garbage as before.  Now it will just cons up garbage
+  that we actually need.
+
+Tue Dec 17 07:10:47 1996  William Perry  <address@hidden>
+
+* css.el (css-properties): New property type 'string-list' for font-family
+
+* w3.el (w3-find-default-stylesheets): Make sure to look in
+  data-directory/../../w3 for stylesheets
+
+Tue Dec 17 06:07:08 1996  William M. Perry  <address@hidden>
+
+* w3-toolbar.el: wrapped a condition-case around the require for
+  xpm-button and xbm-button so that it will compile under Emacs
+
+Mon Dec 16 08:19:40 1996  William Perry  <address@hidden>
+
+* Emacs-W3 3.0.38 released.
+
+* dist.Makefile (OBJECTS): Removed xpm-button and xbm-button from the
+  distribution.  Any version of XEmacs that can run the latest 3.0 stuff
+  has them already.
+
+* default.css: Make nested ol/ul items display class 'line' so they look
+  prettier.
+
+* w3-display.el (w3-display-node): EVIL hack to make the first item in a
+  nested list get indented correctly.
+
+* w3-about.el (w3-about): Fixed the about:style stylesheet to be
+  up-to-date with new CSS spec.
+
+* default.css: Turned down indentation on list items by default.
+
+* w3-display.el (w3-display-node): Mouse tracking should work under XEmacs
+  again.
+
+* dist.Makefile (all): Removed 'emacs' from dependency list.
+
+Mon Dec 16 06:03:14 1996  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-table-hack-borders): This should work on TTY's again.
+
+Sun Dec 15 14:19:53 1996  William M. Perry  <address@hidden>
+
+* Emacs-W3 3.0.37 released
+
+* w3-display.el: Better handling of paragraphs (well, any block-level
+  element within a list-item display group.
+
+* default.css (address): Changed <address> display tpye to line so that
+  right-justification will take effect.
+
+Sat Dec 14 10:24:13 1996  William M. Perry  <address@hidden>
+
+* w3-sysdp.el: Removed stubs for add-submenu - it was confusing 'custom'
+
+* dist.Makefile: More GNU-ish project makefile
+
+* url.el (url-default-find-proxy-for-url): Fixed no_proxy handling
+(url-default-find-proxy-for-url): Don't pass 'www://' links to a proxy
+
+Fri Dec 13 22:50:45 1996  William M. Perry  <address@hidden>
+
+* dist.Makefile (URLSOURCES): Added socks.el to the distribution.  Not
+  used just yet.
+
+* css.el (css-copy-stylesheet): Fixed problem with sharing the list
+  structure between the hash tables - document stylesheets would infect
+  the main w3-user-stylesheet and cause weirdness.
+
+Fri Dec 13 09:47:40 1996  William Perry  <address@hidden>
+
+* w3-style.el (w3-display-stylesheet): Fixed problem where
+  w3-display-stylesheet would override the buffer css-display was showing
+  the stylesheet in.  Duhh.
+
+* mule-sysdp.el (mule-encode-string): Fixed stupid problem on non-XEmacs
+  mule
+  (mule-sysdep-version): Ditto.
+
+Fri Dec 13 06:25:45 1996  William M. Perry  <address@hidden>
+
+* css.el (css-get): Removed bogus recursive call to css-get, and moved the
+  guts of css-get out into its own fuction, which is in turn inlined into
+  css-get.  Might even make things faster.  At the least, I expect it to
+  get rid of the 'takes two makes to make w3-display.elc' problem some
+  people have been seeing.
+
+* w3-display.el (w3-display-handle-list-type): Fixed stupid problem with
+  margin handling where list-item display items were always flush-left
+
+Fri Dec 13 02:51:24 1996  Greg Stark  <address@hidden>
+* w3-display.el (w3-display-line-break): correct right justification code
+  (w3-min-size-of-string): removed unused function that didn't work.
+  (w3-size-of-tree): maintain consistent w3-display-open-element-stack
+  don't hard code assumption that hr's are drawn with '-'
+  (w3-display-table-dimensions): major bug if the last column rowspans
+  (w3-table-lookup-char): new function
+  (w3-table-hack-borders): new function makes table borders use pretty
+  graphic characters instead of ascii characters. 
+  (w3-table-unhack-borders): new function restore lame ascii borders.
+  (w3-display-table): Major changes to support drawing better borders
+  also fix various bugs and tweak various things.
+
+* w3-parse.el: remove = from set of characters that terminate an attribute
+               when guessing about an syntactically invalid attribute. 
+              (didn't this get changed once already?)
+
+* w3.el (w3-sentinel): hack around bug that bit w3-preview-this-buffer 
+                       but I don't know what the right thing for Mule.
+
+Thu Dec 12 08:36:01 1996  William Perry  <address@hidden>
+* Synch'd up to widget 1.13
+
+* w3-display.el (w3-get-pad-string): Ack - watch for negative values in
+  w3-get-pad-string
+
+* Released 3.0.36
+
+* w3-style.el (w3-display-stylesheet): Use new css-display function
+
+* css.el (css-get): Better class checking
+  (css-display): New function to pretty-print a stylesheet that is in
+  memory.
+
+* w3-parse.el (w3-parse-buffer): *sigh* Parser now keeps track of 'base'
+  of this document.  Also normalizes 'align' attribute, as well as
+  auto-expanding any SRC or HREF attributes.
+
+* w3-display.el (w3-display-handle-list-type): Now handles text-indent
+  style property.
+  (w3-display-table): Can now specify properties on 'tr', for
+  vertical-alignment, etc.
+  (w3-display-node): Lots of changes to deal with new method of munging
+  class/align/etc in the parser.
+
+Wed Dec 11 17:37:14 1996  William M. Perry  <address@hidden>
+
+* w3-parse.el (w3-parse-buffer): Do munging of align/src/href/class
+  attributes to save time in w3-display-node and friends.
+
+* w3-prefs.el (w3-preferences-compatibility-variables): Fixed problems
+  with renaming of w3-style-ie-compatibility to css-ie-compatibility
+
+* w3-display.el (w3-display-node): fix for hyperlinks / form info in
+  tables. Duhh.
+
+Wed Dec 11 07:36:08 1996  William Perry  <address@hidden>
+
+* css.el (css-copy-stylesheet): New function
+
+* w3-display.el (w3-display-node): use it
+
+* mule-sysdp.el (mule-encode-string): Fixes for XEmacs w/mule
+(mule-decode-string): Fixes for XEmacs w/mule
+
+* w3-display.el (w3-display-node): Fixed problem in isindex handling.
+  Using forms for isindex handling should work again.
+
+* css.el (css-specificity): new function css-specificity to find how
+  specific a certain rule is. Need to use this to sort rules in css-get.
+
+Tue Dec 10 22:37:59 1996  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-get-style-info): Changes to deal with new css.el -
+  should be much much faster now.
+
+* css.el (css-get): Radically changed the internal representation of
+  stylesheets, and how they are looked up.
+
+Mon Dec  9 22:31:11 1996  William M. Perry  <address@hidden>
+
+* w3-display.el (w3-face-for-element): Fixed bug in w3-face-for-element
+  where weight of the element wasn't being taken into account.
+
+* css.el: Changed font-variant style type from string to symbol-list
+
+Mon Dec  9 12:29:59 1996  William Perry  <address@hidden>
+
+* default.css: Changed default header sizes - should look better on most
+  machines
+
+Sun Dec  8 19:21:07 1996  William M. Perry  <address@hidden>
+
+* Emacs-w3 3.0.34 Released
+
+* w3-display.el: New macro w3-get-attribute to replace
+  (cdr (assq 'blah args)), just in case I ever decide to replace the 
+  assoc list currently used.
+
+* New file mule-sysdp.el, to make supporting Mule 2.3, Mule 2.4, and
+  XEmacs 20.0 easier.
+
+* url-file.el (url-insert-possibly-compressed-file): handle mule 2.4
+
+Fri Dec  6 06:54:03 1996  William Perry  <address@hidden>
+
+* w3-parse.el: Emit warnings when people try to slap attribute/value pairs
+  on end tags.  Evil bastards.
+  Added SPAN, BDO, OBJECT, BASEFONT
+
+Fri Dec  6 04:42:24 1996  Greg Stark  <address@hidden>
+
+* default.css: add th td and caption text-align information
+
+* docomp.el: increase max-specpdl-size so it can compile w3-display
+
+* url.el (url-sentinel): avoid save-excursion around switch-buffer 
+
+* w3-display (w3-display-line-break): if we're in nowrap mode but the
+  region doesn't end on a newline insert an extra newline, otherwise <br>
+  gets ignored inside a <pre> or nowrap environment. 
+  Also protect against fill-column less than the length of fill-prefix. 
+  Also avoid infloop in right justification, and
+  fix bug that caused right justification to never be executed.
+
+* w3-display (table-cut table-dimensions w3-display-table): 
+  lots of new code to handle rowspan and autolayout.
+
+* (w3-display-fix-widgets): be more agressive adjust even markers that have
+  buffers and adjust parent markers.
+
+* w3-display (w3-display-node): These changes are important for tables
+  Don't insert insert-before on <a> tags before the class is adjusted
+  Don't insert more than one class into an <a> tag when we adjust it. 
+  Protect against a negative fill-column when drawing <hr>s
+  Set adaptive-fill-mode (what's filladapt-mode?)
+
+* w3-parse.el: remove font from %block. WARNING, i have little idea what
+  consequences this has but it seems to have the desired effect of
+  handling table cells whose first tag is a <font> without discarding the
+  implied <p> tag.
+
+* w3-parse.el: skip-chars-forward "^>" when parsing end tags 
+  (some people seem to think you can put attributes in end tags)
+
+Fri Dec  6 14:08:30 1996  William M. Perry  <address@hidden>
+
+* css.el: Better handling of text-decoration, to go along with the new version
+  of set-font-style-by-keywords
+       
+* font.el: Faster version of set-font-style-by-keywords.
+  Fixed RGB spec. problem if you used non-floats.
+
+* w3-display.el: (w3-face-for-element) Obey some font function renaming.
+  (w3-face-for-element) Changed format specification on w3-style-face-xxx
+  creation.
+  (w3-display-node) Alignment specified via attributes overrides
+  stylesheet, not vice versa.
+  (w3-display-node) Fixed stupid mistake in 'link' handling where
+  stylesheets were ignored.
+
+Thu Dec  5 17:51:37 1996  William M. Perry  <address@hidden>
+
+* url.el: (url-retrieve-internally) Can now specify an alternative
+  function to determine whether a URL should be proxied or not.  modelled
+  off the netscape auto-proxy-configuration crap, so hopefully someday we
+  can just suck down one of their files and be 'happy' with it.
+
+* w3-display.el, css.el:
+  Modified some of the css properties to not be inherited - let
+  w3-display figure it out on its own - quicker this way.  Saves a few
+  thousand lookups over the life of a parse.
+
+Mon Dec  2 20:22:12 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: use better face names... avoids problems in xemacs
+  resource name checking.
+
+* w3-vars.el: Created version 3.0.33
+
+* w3-parse.el: Fixed problem parsing attribute values like <img alt=''> -
+  the regexp didn't like empty attribute values specified with single
+  quotes.
+
+* w3.el: -Patches from Dave Love
+
+* font.el: Renamed the font-set-*-p to set-font-*-p, to be more in line with
+set-face-underline-p and friends.  Fixed stupid problem in
+set-font-*-p where it would always just toggle the property, not
+actually set it.  Blah.  Added code in x-font-create-name to try
+oblique and italic versions of a font if italic is set.
+
+* default.css: Prettied up the :speech: section
+
+* w3-display.el:
+Conditionalized get-style-info calls in w3-voice-for-element on
+feature 'emacspeak
+
+* w3.el: Added code to try loading dtk-css-speech and w3-speak if the feature
+'emacspeak' is available.
+
+* css.el: Fixed a few stupid problems.
+
+* font.el:
+made tty-font-create-object return a 12pt font object, just for reference.
+
+* w3.txi: More updates to the documentation
+
+* w3.el, w3-style.el: Moved to using the new 'css' package
+
+* w3-parse.el:
+Removed some old functions.  Save some string creation by downcasing
+tag and atribute names in the buffer instead of using 'downcase'.
+
+* w3-display.el: Moved to using the new 'css' package
+
+* w3-auto.el: Removed some outdated autoloads
+
+* font.el: Added function font-set-style-by-keywords
+
+* css.el: Better handling of various entities - beter way of specifying new
+properties and how they should be handled.
+
+* default.css: *** empty log message ***
+
+* dist.Makefile: Added 'css.el' to targets
+
+* css.el: Initial revision
+
+* w3-vars.el: Renamed w3-right-border to w3-right-margin
+
+Sat Nov 30 17:42:38 1996  William M. Perry  <address@hidden>
+
+* custom-edit.el, custom.el, widget-edit.el, widget.el:
+-Synch'd up to Custom/Widget 1.09
+
+Fri Nov 29 23:12:42 1996  William M. Perry  <address@hidden>
+
+* font.el: Actually try to use the 'oblique' property under X
+
+* w3-display.el:
+Fix for sometimes getting an invalid glyph error in image retrieval.
+Fixed problem where table display would pop something off the open element 
stack.
+
+* custom-edit.el, custom.el, widget-edit.el, widget.el:
+-Synch'd up to Custom/Widget 1.08
+
+* w3-display.el: List filling seems to line up correctly now.
+Fixed bug in ordered list handling (wrong arg passed to a format).
+Changed the way spacing is handled.
+
+* w3-menu.el: Added new 'search' menu with common web indexes
+
+* dist.Makefile:
+Don't specify widget*.el twice in SOURCES _AND_ CUSTOMSOURCES or
+install under FreeBSD chokes.
+
+* w3-display.el: Protect against list-item display property outside of a list.
+
+* w3-sysdp.el: Fixed free var reference in make-device
+
+Thu Nov 28 23:01:11 1996  William M. Perry  <address@hidden>
+
+* w3-display.el:
+Protect against bad values of w3-last-fill-pos in w3-display-line-break
+
+* w3-e19.el, w3-menu.el:
+-Patches from Dave Love <address@hidden> for using title of link in menus
+
+Wed Nov 27 22:59:56 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.32
+
+* w3.txi: Started revamping some of the documentation
+
+* url-custom.el: Initial revision
+
+* w3-display.el: Handle 'menu' list type correctly
+
+* url.el: Patch from address@hidden;
+- insert information about processes in buffer "URL Status Display"
+  instead of *URL-<i>* : added a local variable `url-status-buf' and a
+  call to `set-buffer'
+
+- changed `url-get-working-buffer' to `url-get-working-buffer-name',
+  because `url-working-buffer' is expected to be a name, not a buffer
+  (my mistake)
+
+* w3-xemac.el, w3-vars.el:
+Removed some old variables that aren't used anywhere now.
+
+* w3-e19.el:
+Patch from Dave Love <address@hidden> for 'title' version of w3-echo-link.
+
+* w3-display.el:
+Patch from Dave Love <address@hidden> for 'title' version of w3-echo-link.
+Form info is now stuck on a stack instead of in a let-bound variable.
+Only call w3-display-fix-widgets once!  recursive calls to
+w3-display-node when rendering tables caused it to happen more than it
+should.
+
+* w3-forms.el:
+Patch from Dave Love <address@hidden> to protect against bad value
+for 'next' in w3-next-widget.
+
+* dist.Makefile: Don't use `install -d', use mkdir -p if necessary
+
+Tue Nov 26 16:21:32 1996  William M. Perry  <address@hidden>
+
+* custom-edit.el, custom.el: synch'd up to custom 1.05
+
+* widget.el, widget-edit.el: *** empty log message ***
+
+* widget-edit.el, widget.el: synch'd up to widget 1.05
+
+* w3-display.el: Handles the 'dir' list type correctly now.
+
+* url.el:
+Quick patch to check for url-working-buffer being a buffer, not a string.
+
+* w3-display.el:
+Backed out _BAD BAD BAD_ change to protect against invalid values for
+w3-last-fill-pos that basically fucked everything in regards to
+vertical whitespace.
+
+Mon Nov 25 21:12:17 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: *** empty log message ***
+
+* w3-display.el:
+Now only does incrememental display around block level elements.
+Does better munging of pre-formatted text CR -> LF CRLF->LF, etc.
+
+* w3.el: Protect against errors in w3-sentinel on bad buffers.
+
+* w3-vars.el: Created version 3.0.31
+
+* widget-edit.el: Fixed compile problems under emacs
+
+* w3-vars.el: *** empty log message ***
+
+* widget.el: Made widget.el compile in emacsen w/o native backquote support
+
+* w3-display.el: *** empty log message ***
+
+* w3-parse.el:
+Patch from greg stark for dealing with '=' in misquoted attribute value pairs
+
+Sun Nov 24 23:25:25 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: Reimplemented targetted anchors (#foo)
+
+* url.el: *** empty log message ***
+
+* url-vars.el:
+Changed default of url-mime-language-string to '*' to make some sites happy.
+
+* w3-display.el: Protect against w3-last-fill-pos getting an invalid position
+
+* w3.el, w3-display.el, w3-vars.el:
+Patch from Dave Love <address@hidden> to add new possibility 'title'
+to w3-echo-link to show the 'title' attribute of a link if its there.
+
+* w3-speak.el: Patch from raman.
+
+* font.el:
+Patch from address@hidden to handle fontsets correctly in mule
+
+* w3-display.el: Implemented a few more CSS properties.
+list-style - control how list items are displayed.  Ordered lists are
+             now different from unordered only in their list-style.
+             Need to implement contextual selectors to get ordered
+             lists to work out of the box though.
+white-space - control whether whitespace is collapsed or not, and
+              whether text is wrapped.  <pre> <xmp> and <plaintext>
+              are now all specified to use this in the default
+              stylesheet.
+text-align - this replaces the old 'align' attribute
+
+Reimplemented inlined styles.
+
+* default.css: Varius updates to take advantage of the new CSS properties
+white-space, list-style, etc.
+
+* w3-style.el: Handle url() and rgb() notation in color specifications
+
+* w3-vars.el: Removed a few outdated variables
+
+Sat Nov 23 02:10:37 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: *** empty log message ***
+
+* dsssl.el: Got rid of yet more compilation warnings.
+
+* custom.el, custom-edit.el: Synch'd up to custom 1.0.1
+
+* w3-display.el:
+Better handling of <hr> and <center>, and line spacing in general
+
+* default.css: Updates to default stylesheet to deal with <center> and <div>
+
+* w3.el, url.el, url-vars.el, url-http.el:
+Patches from Thierry Emery to allow multiple asynch fetches.
+
+Fri Nov 22 22:26:35 1996  William M. Perry  <address@hidden>
+
+* widget-edit.el, widget.el: -Synch'd up to widget 1.01
+
+* w3-style.el: Fixed a few fRemoved a few free variable sets/refs
+
+* w3.el:
+When saving a document as html source, try to get into the 'head' before 
inserting the base.
+
+* w3-display.el, w3-style.el:
+Stylesheets now store all there information as property lists instead
+of assoc lists.  Just easier.
+
+* font.el: Fix for font-normalize-color under nextstep
+
+Thu Nov 21 04:01:22 1996  William M. Perry  <address@hidden>
+
+* widget-edit.el, widget.el: synch'd to 1.00 of widget/custom
+
+Mon Nov 18 16:26:06 1996  William M. Perry  <address@hidden>
+
+* install.sh: Initial revision
+
+* html32.dsl: Updated to latest from jon bosak
+
+* w3-vars.el: Created version 3.0.30
+
+Thu Nov 14 22:39:36 1996  William M. Perry  <address@hidden>
+
+* w3.el: Changed this so you can actually just do a (require 'w3-sysdp) and
+each function will check to see if it should overwrite, instead of
+conditionalizing that on the whole file.
+
+* url.el: *** empty log message ***
+
+* images.el, font.el, docomp.el, w3-sysdp.el:
+Changed this so you can actually just do a (require 'w3-sysdp) and
+each function will check to see if it should overwrite, instead of
+conditionalizing that on the whole file.
+
+* w3-display.el: Moved some macros around.
+
+* widget.el, widget-edit.el, w3-forms.el: Sync'd up to Widget 0.999
+
+* w3-auto.el, w3-menu.el: *** empty log message ***
+
+Sun Nov 10 18:08:24 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.29
+
+* dsssl.el: Various changes, starting on the actual flow object stuff
+
+Tue Nov  5 05:26:07 1996  William M. Perry  <address@hidden>
+
+* url-news.el: Updated version checking of news to deal with 'red' gnus
+
+Mon Nov  4 14:47:47 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: Don't show the content of 'script' - typo
+
+Fri Nov  1 15:08:45 1996  William M. Perry  <address@hidden>
+
+* default.css: Changes from raman
+
+Thu Oct 31 18:51:52 1996  William M. Perry  <address@hidden>
+
+* widget-edit.el: -
+
+Tue Oct 29 19:53:38 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: *** empty log message ***
+
+Thu Oct 24 02:25:03 1996  William M. Perry  <address@hidden>
+
+* w3-widget.el: Updated the image widget to the new widget stuff.
+
+Wed Oct 23 13:26:09 1996  William M. Perry  <address@hidden>
+
+* docomp.el: *** empty log message ***
+
+* url.el: Fixed bug in url-remove-relative-links that would choke on something
+like: /foo/bar/./../baz/ - they /../ was removed first, removing its
+parent directory, the /./ - ack.
+
+* w3-display.el: Image loading is back!
+Client-side imagemaps are back!
+Forms that span tables are working now.
+
+Mon Oct 21 21:32:33 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.28
+
+* url-mail.el: Make mail handling a little more generic.
+
+* w3-display.el:
+Fix for w3-display-fix-widgets so that links right up against each
+other don't cause it to skip every-other-one.
+
+Sun Oct 20 16:47:05 1996  William M. Perry  <address@hidden>
+
+* w3-style.el: don't map a pitch of 9 to 0.
+
+* w3-speak.el:
+Added back in the advice for url-lazy-message that provided auditory
+feedback during URL retrieval.  Also added back in the
+w3-speak-browse-page command.
+
+* w3-speak.el:
+Some patches from TV Raman to fix multiline text entry area speaking
+and a bogus call to widget-get in text entry area speaking.
+
+Fri Oct 18 12:27:04 1996  William M. Perry  <address@hidden>
+
+* w3-display.el:
+Patches from Thierry Emery <address@hidden> to
+implement 'colspan' on tables.  Patch to support align=xxx on
+arbitrary tags.
+
+Thu Oct 17 22:27:44 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.27
+
+* w3-display.el:
+fixed voicification of hyperlinks.  Fixed problem in w3-normalize-spaces
+and multi-line strings.
+
+Wed Oct 16 20:56:40 1996  William M. Perry  <address@hidden>
+
+* w3-speak.el: Fix stupid problem.  function renaming lossage.  Fun
+
+* w3-display.el:
+Fixed <select> form items that had no <option value=xxx selected>
+entry in them.  Wheee.
+
+* w3-display.el:
+Fixed <select> form items that had an <option value=xxx selected>
+entry in them.  Wheee.
+
+* w3.el: document info is now shown as a table.
+
+* w3.el: Document information is now shown as a table.
+
+* w3-display.el, w3-vars.el: Now keeps better track of the <meta> tag info
+
+* w3-vars.el: Created version 3.0.26
+
+* w3-display.el: *** empty log message ***
+
+Tue Oct 15 13:21:54 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: Added back in <meta> and <link> handling.
+Fixed insert-before and insert-after for 'a' tag and pseudo-classes
+
+* w3-display.el:
+Fixed some potential runaway style inheritance - need to think about a
+better way to pop style info off the various stacks than
+(w3-handle-content node) on an empty element.
+
+* w3-display.el: Fixed <textarea> elements in forms
+
+* w3-display.el, w3-forms.el: Fixed <select> elements in forms
+
+Sun Oct 13 23:50:03 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.25
+
+* dsssl.el: Bug fixes
+
+* url-hash.el:
+Fixed bug in url-gethash where it wasn't honoring the 'default' parameter
+
+Sat Oct 12 20:32:49 1996  William M. Perry  <address@hidden>
+
+* widget.el, widget-edit.el: Synched up to widget 0.99.4
+
+Fri Oct 11 18:55:02 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: fix for xemacs w/ temp faces
+
+* w3-display.el: Fixed a bug with the insert-after handling. Duhh.
+
+* default.css, w3-display.el: Implemented insert-before and insert-after
+
+Wed Oct  9 19:00:59 1996  William M. Perry  <address@hidden>
+
+* ssl.el, url-cookie.el, url-file.el, url-gopher.el, url-hash.el, url-http.el, 
url-irc.el, url-mail.el, url-misc.el, url-news.el, url-nfs.el, url-parse.el, 
url-pgp.el, url-vars.el, url-wais.el, url.el, urlauth.el, w3-about.el, 
w3-annotat.el, w3-display.el, w3-e19.el, w3-emulate.el, w3-forms.el, w3-hot.el, 
w3-imap.el, w3-keyword.el, w3-latex.el, w3-menu.el, w3-mouse.el, w3-mule.el, 
w3-parse.el, w3-prefs.el, w3-print.el, w3-speak.el, w3-style.el, w3-toolbar.el, 
w3-vars.el, w3-widget.el, w3-xem20.el, w3-xemac.el, w3.el, xbm-button.el, 
xpm-button.el, base64.el, dsssl.el, font.el, images.el, md5.el, mm.el:
+-Updated copyrights/addresses
+
+Tue Oct  8 14:56:22 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: Tables now default to having no border
+
+* w3-forms.el: Require w3-vars so Gnus will work
+
+* w3-vars.el: Created version 3.0.24
+
+* w3-speak.el:
+Added a few patches from raman and the latest version of emacspeak -
+everything appears to work out of the box now.
+
+* w3-style.el:
+Added in a few autoloads for getting emacspeak to work right out of the box.
+
+* w3-display.el: Added back in the :help-echo stuff on widgets
+
+Mon Oct  7 18:09:17 1996  William M. Perry  <address@hidden>
+
+* w3-display.el:
+<isindex> works again.  Automatically turns off filladapt-mode now,
+since we apparently don't play well together.
+
+* default.css: Added some margins
+
+* w3-display.el: Fix for emacs 19
+
+Fri Oct  4 17:08:51 1996  William M. Perry  <address@hidden>
+
+* dsssl.el:
+Fixed a few errors in calling w3-dsssl-check-args.  Now _EVERYTHING_
+compiles cleanly.
+
+* docomp.el: Added a few more variables to the 'expected-to-be-free' list.
+Everything but dsssl.el compiles cleanly now.
+
+* url-news.el: Fixed a few typos that resulted in free variable references.
+
+* w3-display.el: New function w3-make-face to 'do the right thing' in
+Emacs/XEmacs/Emacs-with-no-X-support.
+Implemented margin-left and margin-right.
+Fixed a few problems with runaway or insufficient application of styles.
+
+Mon Sep 30 19:43:35 1996  William M. Perry  <address@hidden>
+
+* url-hash.el:
+Nasty hack to fix the   !! error (("file \"cl-extra\" didn't define 
\"gethash\"")) stuff people are seeing under Emacs-19
+
+* w3-vars.el: Created version 3.0.23
+
+* w3-prefs.el: Updates for new widget package
+
+* w3-display.el:
+No more recursion!  Lots more shit broke though.  Lists are totally broken.
+
+* w3.el: Updates for new widget package
+
+* w3-keyword.el: *** empty log message ***
+
+Sun Sep 29 21:26:47 1996  William M. Perry  <address@hidden>
+
+* widget.el, widget-edit.el: Updated to version 0.99 of the library
+
+* widget-edit.el: Allow the :help-echo widget stuff to be a symbol
+
+* w3.el: More updates for the latest widget package
+
+* w3-sysdp.el: New functions prepend-text-property, append-text-property,
+fillin-text-property
+
+* default.css, url.el: *** empty log message ***
+
+Wed Sep 25 10:53:08 1996  William M. Perry  <address@hidden>
+
+* dist.Makefile: Removed custom.el and custom-edit.el from the distribution.
+
+Tue Sep 24 05:04:47 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.22
+
+* widget.el, widget-edit.el: Updated to latest widget stuff from Per.
+
+* w3-parse.el:
+Added <script> to %body.content so that stupid IE 3.0 demo pages would work.
+
+* w3-keyword.el:
+Added some new keyword defs to get rid of compile-time warnings
+
+* w3-forms.el, w3-display.el: Now works with newest widget stuff
+
+* url.el: New function url-parse-query-string, to return an assoc list of name
+value pairs from a URL-style query. url-unhex-string now takes an
+optional second argument for whether to allow decoding of newlines or
+not.
+
+* url-mail.el:
+Now understands netscape-style 'extensions' to the mailto: specifier.
+ie: mailto:wmperry?subject=thesubject&bcc=root
+
+* font.el:
+Now always converts to points instead of pixels, seems to give better
+results this way.
+
+Mon Sep 23 04:53:56 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.20
+
+* dsssl.el: Made dsssl depend on url-hash
+
+Sun Sep 22 05:16:06 1996  William M. Perry  <address@hidden>
+
+* w3-display.el, w3-parse.el: *** empty log message ***
+
+* w3-display.el: Some spacing changes, fix for nested lists
+
+* custom.el, widget-edit.el, widget.el: -
+
+* custom-edit.el: *** empty log message ***
+
+Fri Sep 20 05:07:12 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.19
+
+* w3-display.el: *** empty log message ***
+
+* w3-sysdp.el: Added in stub for set-keymap-parents
+
+* w3-speak.el: Patches from raman
+
+* w3-prefs.el, w3-imap.el: *** empty log message ***
+
+* w3-hot.el: Fixed w3-read-html-bookmarks to work with some parser changes.
+
+* w3-forms.el: Made forms work again.
+
+* w3-display.el: Changed how the borders on tables are drawn.
+Added back in the voice support.
+
+Thu Sep 19 05:12:49 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.18
+
+* dist.Makefile:
+Moved the URL and W3 packages back into one big distrubtion again
+
+* w3-vars.el: Created version 3.0.18
+
+* w3-vars.el: Created version 3.0.19
+
+* w3-display.el: Don't crap out on tables with 0 columns
+
+* docomp.el, url.el: *** empty log message ***
+
+Wed Sep 18 12:50:03 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.18
+
+* docomp.el: *** empty log message ***
+
+* w3-display.el: Space filling fixes
+
+* w3-auto.el: Added autoload for w3-style-post-process-stylesheet
+
+Tue Sep 17 12:50:47 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.16
+
+* w3-display.el, w3-e19.el: *** empty log message ***
+
+Mon Sep 16 04:46:18 1996  William M. Perry  <address@hidden>
+
+* custom-edit.el, custom.el, widget-edit.el, widget-example.el, widget.el:
+Initial revision
+
+Sun Sep 15 22:47:53 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.15
+
+* w3-display.el: Alignment stuff works (right, left, full, center).
+Tables can now be borderless, and if it has borders, they are all there.
+<pre>/<xmp> work.
+
+* url-vars.el: Created version 1.0.42
+
+* url-http.el: *** empty log message ***
+
+* w3-vars.el: Created version 3.0.14
+
+* html32.dsl: Initial revision
+
+* w3.el: Use the new display code.
+
+* w3-forms.el: A few changes for the latest display code
+
+* w3-vars.el: Created version 3.0.14
+
+* w3-display.el: Actually mostly works
+
+* w3-parse.el: Removed hooks into the old display engine
+
+* url.el: *** empty log message ***
+
+* w3-speak.el: Update from raman
+
+* url.el: *** empty log message ***
+
+Sat Sep 14 16:48:24 1996  William M. Perry  <address@hidden>
+
+* url-gopher.el, url.el:
+Added '...' to the downloading messages so that they do not show up in
+the message log buffer under Emacs 19.xx
+
+* w3-parse.el: Changed content-model of <script> to fix problems on some sites
+(notably netscape's) that use an unescaped </ in the script.  BAD SGML
+DAMMIT.
+
+Fri Sep 13 05:24:53 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.13
+
+* w3-forms.el: Use the new :ignore-case stuff for choice items
+
+Thu Sep 12 05:57:47 1996  William M. Perry  <address@hidden>
+
+* w3-display.el: Holy shit tables work.
+
+Tue Sep 10 03:11:55 1996  William M. Perry  <address@hidden>
+
+* w3-speak.el: Bug-fixes from raman.
+
+Mon Sep  9 05:18:37 1996  William M. Perry  <address@hidden>
+
+* dsssl.el:
+Removed a few compiler warnings and fixed a few bugs (equal, error, time
+
+* dsssl.el:
+DSSSL (define ...)'d functions are now called correctly.  Wow.  Added
+in most of the rest of the DSSSL(o) application profile functions.
+
+* dsssl.el: Initial revision
+
+* w3-parse.el: *** empty log message ***
+
+* w3-about.el, w3-annotat.el, w3-draw.el, w3-e19.el, w3-emulate.el, 
w3-forms.el, w3-hot.el, w3-imap.el, w3-keyword.el, w3-menu.el, w3-mouse.el, 
w3-mule.el, w3-prefs.el, w3-print.el, w3-speak.el, w3-style.el, w3-toolbar.el, 
w3-vars.el, w3-widget.el, w3.el, w3-xemac.el, images.el:
+Changed copyright assignment
+
+* font.el: changed copyright assignment
+
+Sun Sep  8 00:31:52 1996  William M. Perry  <address@hidden>
+
+* w3-draw.el:
+Added in a stub handler for the 'frame' tag, so that you can still get
+to frame pages written by idiots who don't use a decent 'noframe'
+subdocument.
+
+* url.el: Removed nntp-after-change-function, since it screwed up GNUS
+
+Sat Sep  7 01:45:17 1996  William M. Perry  <address@hidden>
+
+* w3-latex.el: updated email address for stephen peters
+
+Wed Sep  4 02:09:08 1996  William M. Perry  <address@hidden>
+
+* socks.el: Initial revision
+
+Sun Sep  1 16:22:50 1996  William M. Perry  <address@hidden>
+
+* w3-draw.el: Don't load images on a TTY device in XEmacs.  General speedup
+
+Thu Aug 29 04:09:40 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.12
+
+Sun Aug 25 17:12:32 1996  William M. Perry  <address@hidden>
+
+* w3-draw.el: Added some stubs for tables
+
+Mon Aug 19 03:30:47 1996  William M. Perry  <address@hidden>
+
+* w3.el: fixed bug in w3-insert-formatted-url
+
+Mon Aug 12 03:10:30 1996  William M. Perry  <address@hidden>
+
+* w3-style.el: Don't make a null voice of paul-5555 if no stuff is specified.
+
+* default.css: Added speech elements to the default stylesheet.
+
+Sun Aug 11 16:41:58 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.11
+
+* font.el:
+Fix for font-default-font-for-device under XEmacs when you use a font
+like '10x20' instead of the fully specified version
+
+Sat Aug 10 16:14:08 1996  William M. Perry  <address@hidden>
+
+* w3-forms.el:
+Do not encode the '.' in application/x-www-form-urlencoded.  Fucking
+netscape compatbility.  What _SPEC_?!  There aren't any specs on the
+web, right?!
+
+* w3-forms.el:
+Fixed problem with submissions of a form with the exact same arguments
+causes elements from both form to be submitted.  ack.
+
+Tue Aug  6 14:03:52 1996  William M. Perry  <address@hidden>
+
+* w3-parse.el:
+fixed stupid mistake in DTD I made when changing to 3.2 DTD - left
+'style' out of head's content-model so no in-document stylesheet stuff
+was getting parsed.  gack.
+
+* w3-forms.el: No longer put a 'choose' in front of option menus
+
+* w3-speak.el: fixed bugs
+
+Mon Aug  5 14:03:09 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.10
+
+* default.css: A few mild changes, and docs.
+
+Sun Aug  4 23:51:26 1996  William M. Perry  <address@hidden>
+
+* w3-speak.el: new version of w3-speak from raman
+
+* w3-draw.el: Style search alg. now looks for tag/id|name first.  Now supports
+inlined 'style' keyword on any tag.  Gack *sigh*
+
+* w3-style.el:
+Can now have periods in class names.  Fixed bug where the class would
+be normalized to lowercase as well as the tag name.  BAD BAD BAD.
+
+* w3-speak.el: some changes from raman
+
+* w3-style.el: Think I finally fixed some stylesheet weirdness
+
+* w3.el: Don't override user prefs w/w3-user-colors-take-precedence -duh
+
+* w3-parse.el: fixed graphical entities
+
+Sat Aug  3 20:09:50 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el:
+Added textual representation of the 'artist formerly known as prince'
+graphical icons
+
+* md5.el: removed /bin/sh dependency in md5
+
+Fri Aug  2 14:08:38 1996  William M. Perry  <address@hidden>
+
+* url-vars.el: Created version 1.0.41
+
+* url.el:
+no longer special case file:// urls when checking for no_proxy - thats
+just stupid.
+
+Thu Aug  1 13:32:54 1996  William M. Perry  <address@hidden>
+
+* w3-vars.el: Created version 3.0.9
+
+* url.el: made url-insert-file-contents  interactive
+
+* w3-sysdp.el:
+added data-directory to sysdep version of x-library-search-path for
+emacs under windows 95/nt
+
+* w3-vars.el:
+Implemented &prince; and &princesymbol; graphical entities.  Thanks
+for the note Jamie Z!
+
+* w3-forms.el: fix for gopher searches
+
+* w3-draw.el: Added support for balloon-help
+
+Fri Jul 26 05:57:21 1996  William M. Perry  <address@hidden>
+
+* w3-display.el, w3-texinfo.el: Initial revision
diff --git a/ChangeLog.1 b/ChangeLog.1
new file mode 100644
index 0000000..cefd32b
--- /dev/null
+++ b/ChangeLog.1
@@ -0,0 +1,468 @@
+Fri Jul 26 05:57:21 1996  William M. Perry  <address@hidden>
+
+       * w3-display.el, w3-texinfo.el: Initial revision
+
+       * w3-parse.el: *** empty log message ***
+
+       * w3-hot.el: Should now be able to handle XMosaic style hotlist files
+
+       * w3-parse.el:
+       Added some HTML 3.2 stuff, reorged some of the content-models, et. c
+
+       * w3-draw.el: few fixes to the title handling.
+       don't display any text outside the <html></html> area
+
+       * w3-style.el:
+       Changes to w3-style-parse-css to gracefully ignore <!-- and --> in a
+       stylesheet, for those losers who insist on using SGML comments to hide
+       the <style> tag from stupid browsers.
+
+       * w3-parse.el:
+       Changed the content model of the <style> tag to CDATA so that idiots
+       who want to hide the style information from stupid old browsers by the 
absolutely braindead use of comments (<!-- ... -->) can.  *sigh*
+
+Thu Jul 25 05:00:55 1996  William M. Perry  <address@hidden>
+
+       * w3-style.el: Fixed stupid bug in :device: handling
+
+Tue Jul 23 00:40:54 1996  William M. Perry  <address@hidden>
+
+       * w3-keyword.el: more keywords for speech stuff
+
+       * docomp.el: *** empty log message ***
+
+       * w3-draw.el:
+       Beginnings of support for the new and improved fucked up netscapism
+       <spacer> tag
+
+       * url.el: fix for no_proxy checking for local files
+
+Mon Jul 22 03:22:52 1996  William M. Perry  <address@hidden>
+
+       * w3-sysdp.el:
+       added stub for make-local-hook - more Emacs 19.2x lossage.
+
+       * w3-forms.el:
+       always encode hex strigs into uppercase for stupid broken fucking
+       braindead forms decoders!!!
+
+Sun Jul 21 20:10:42 1996  William M. Perry  <address@hidden>
+
+       * url-vars.el: Created version 1.0.40
+
+       * w3-vars.el: Created version 3.0.8
+
+       * w3.txi: fixed a few compilation errors in w3.txi
+
+       * w3.txi:
+       Revamped a few nodes, removed the downloading/compiling notes, and
+       documented url-proxy-services and improved the proxy section in
+       general.
+
+       * w3-hot.el: Should now auto-recognize HTML bookmark files
+
+       * font.el: Allow a font to have a size like "+12pt"
+
+       * w3-draw.el:
+       Now handles <font face="xxxx"> ala Internet Exploiter and Nutscrape
+
+       * w3.el: Added function for reloading all stylesheets
+
+       * w3-menu.el:
+       Added option to the 'style' menu for reloading stylesheets
+
+       * w3-forms.el:
+       fixed problem with dropwon menus with the same 'value' would show the 
first item with that value, not necessarily the one the user selected.
+
+       * w3-widget.el: w3-follow-inlined-image works again
+
+       * w3-draw.el, w3-keyword.el, w3-menu.el, w3-vars.el, w3-xemac.el, w3.el:
+       You can now load delayed images
+
+       * url.el:
+       In url-after-change-function, don't change buffers if its been killed.
+
+Sat Jul 20 05:15:06 1996  William M. Perry  <address@hidden>
+
+       * w3.txi: Removed 16-bit windows section.
+       removed programming interface chapter.
+       fixed Gnus accessing function docs.
+       added pointer to browse-url-browser-function.
+       removed docs of w3-delimit-emphasis / w3-delimit-links.
+
+       * w3-forms.el:
+       If a form has an invalid encoding type, issue a warning about the bad
+       html and the fall back on application/x-www-form-urlencoded
+
+       * w3-style.el:
+       @import no longer causes a 'buffer-modified, kill it anyway?' question.
+       newer CSS font shorthand supported.
+       split the font-family on commas, not spaces, ala newer CSS.
+
+       * font.el: A few changes to the default font-family-mappings
+
+       * w3-draw.el:
+       Allow global document stuff to be specified on the 'body' tag as well
+       as the 'html' tag.
+
+Fri Jul 19 04:39:08 1996  William M. Perry  <address@hidden>
+
+       * url-vars.el: Created version 1.0.39
+
+       * w3-vars.el: Created version 3.0.7
+
+Thu Jul 18 14:20:20 1996  William M. Perry  <address@hidden>
+
+       * default.css:
+       moved monospaced font declaration for pre/xmp into the :xemacs: section
+
+       * url-vars.el: duh - make url-current-server buffer local.
+
+Tue Jul 16 02:49:55 1996  William M. Perry  <address@hidden>
+
+       * w3-latex.el: Lots of patches from stephen peters.
+       * Fix to backslash handling code so that it works.
+
+       * Fix to ~ (very important, that) so that it generates a
+         `\textasciitilde', since in a <tt> environment the previous call
+         would work incorrectly.  Similar fix for ^ characters.
+
+       * For carriage returns in a verbatim environment, use `\newline'
+         instead of `\ '.  Also adds a \nullspace command for use in <pre>
+         environments, since the existing code for <pre> tended to eat
+         leading whitespace without it.
+
+       * Use `\newline' instead of `\linebreak', since \linebreak tries to
+         justify the line out to the text width.
+
+       * Added `\batchmode' call at the beginning of the generated LaTeX, to
+         force attempted recovery of any errors.
+
+       * Added calls to not indent paragraphs and skip lines between
+         paragraphs.  I'm not sure whether I like this better or not, but I
+         figured that most HTML browsers currently use that formatting.  This
+         should be changed once stylesheets are working nicely, to use
+         whatever's specified in the stylesheet for LaTeX.
+
+Mon Jul 15 17:33:19 1996  William M. Perry  <address@hidden>
+
+       * w3-draw.el:
+       tty-closest-color-matching now works for netscape-style color crap as
+       well as stylesheet stuff
+
+       * w3-parse.el, w3-xemac.el:
+       anal retentive patch for mispelling in comments
+
+Sat Jul 13 22:47:21 1996  William M. Perry  <address@hidden>
+
+       * w3.el:
+       w3-echo-link stuff is now handled in the new widget-motion-hook 
variable.
+
+       * w3-draw.el:
+       w3-echo-link stuff is now handled in the new widget-motion-hook 
variable.
+       when following a link, its color is changed correctly.
+
+Fri Jul 12 06:10:02 1996  William M. Perry  <address@hidden>
+
+       * url.el:
+       Only match against the hostname in the URL for the no_proxy checking
+
+       * w3-style.el: fixed problem parsing class attributes in CSS
+
+       * url-hash.el: removed old aliases for w3-*hash functions
+
+       * w3-style.el: *** empty log message ***
+
+Thu Jul 11 18:00:20 1996  William M. Perry  <address@hidden>
+
+       * w3-style.el: deal gracefully with device-bitplanes returning nil
+
+       * w3-style.el:
+       You can now use a :speech: device section in a CSS stylesheet
+
+       * w3-sysdp.el:
+       version of valid-color-name-p and device-class for the OS/2
+       presentation manager.
+
+       * w3-e19.el: Some OS/2 hacks
+
+       * url.el, url-file.el: handle : in filenames gracefully
+
+       * w3-draw.el:
+       sanity check the fill-prefix before setting it, and issue a warning if
+       list indentation tries to overflow the right window margin.
+
+       * url-vars.el: Created version 1.0.38
+
+       * w3-vars.el: Created version 3.0.6
+
+Wed Jul 10 23:50:10 1996  William M. Perry  <address@hidden>
+
+       * w3-draw.el: fixed problem with emacspeak
+
+       * default.css: *** empty log message ***
+
+       * dist.Makefile: fixed install target - duh
+
+       * url-irc.el: fixed bad variable name
+
+       * mm.el: require cl to avoid stupid compiler errors
+
+       * w3.el: some more mule fixing
+
+       * url.el: new function url-remove-compressed-extensions
+
+       * w3.el: remove compression extensions from default save-as filenames
+
+       * url-vars.el: *** empty log message ***
+
+       * w3.el:
+       fixed w3-save-binary-file to set initial-contents on the call to
+       read-file-name
+
+       * mm.el: *** empty log message ***
+
+       * w3-hot.el: fixed problem with w3-hotlist-add-document-at-point
+
+       * w3-parse.el: Fix for mule and character entities > 127
+
+       * url-cookie.el, url-vars.el:
+       can now control when/how/if an HTTP cookie is accepted
+
+       * w3-draw.el:
+       fixed mysterious problem of stylesheet formatting info not working
+       correctly the first time a tag was seen.  *dumb* mistake on my part.
+
+Tue Jul  9 21:01:15 1996  William M. Perry  <address@hidden>
+
+       * w3-sysdp.el: added more overlay functions
+
+       * w3-vars.el: Created version 3.0.5
+
+       * url-vars.el: Created version 1.0.37
+
+       * url-vars.el, mm.el, w3.el: *** empty log message ***
+
+       * dist.Makefile:
+       Now uses 'install' to do the copying around, instead of trying to fake 
it.
+
+       * dist.Makefile: *** empty log message ***
+
+       * font.el:
+       Require disp-table so that display table stuff is loaded (apparently
+       XEmacs 19.13 didn't autoload or dump it - *sigh*)
+
+       * url.el: autoload url-nfs
+
+       * dist.Makefile: No longer mention THIS-IS-VERSION-XX in the makefile
+
+       * url-http.el, w3.el: *** empty log message ***
+
+       * mm.el: Fixed mm-save-binary-file
+
+       * w3.el: Fixed w3-save-binary-file
+
+       * w3.el, w3-speak.el, w3-style.el, w3-draw.el:
+       voices-via-stylesheet fixes
+
+       * dtk-css-speech.el: Initial revision
+
+       * url-vars.el: fix for mule stuff Emacs vs. XEmacs
+
+       * w3-forms.el: wais submissions work again
+
+       * url-wais.el: *** empty log message ***
+
+       * url.el: turn off url-download-minor-mode stuff
+
+       * w3-print.el:
+       fix problem with ps-print and forms printing (read-only text)
+
+Sun Jul  7 22:04:07 1996  William M. Perry  <address@hidden>
+
+       * w3-vars.el: Created version 3.0.4
+
+       * w3-forms.el: <input type=radio checked> works now
+
+       * w3-forms.el: Radio buttons work again.  *sigh*
+
+Thu Jul  4 16:32:06 1996  William M. Perry  <address@hidden>
+
+       * w3-draw.el: Let stylesheets handle the w3-delimit-links stuff
+
+Mon Jul  1 15:42:21 1996  William M. Perry  <address@hidden>
+
+       * w3-vars.el: Created version 3.0.3
+
+       * w3-sysdp.el: Added stub for buffer-substring-no-properties
+
+       * w3-menu.el:
+       Do not use menus under Emacs 19.28 - they are broken / incompatible
+       with that version of easymenu
+
+       * w3-sysdp.el: Fix to device-or-frame-type to work under Emacs 19.28
+
+       * w3.el: fix for set-auto-mode lossage on null buffer-file-name
+
+       * w3-sysdp.el:
+       Added in stubs for plist-put and plist-get, and an Emacs 19.2x
+       specific version of facep.  everything almost works in 19.28 now.
+
+Sun Jun 30 22:53:02 1996  William M. Perry  <address@hidden>
+
+       * w3-vars.el: Created version 3.0.2
+
+       * w3.txi: *** empty log message ***
+
+       * w3.el, w3-xemac.el, w3-widget.el, w3-toolbar.el, w3-sysdp.el, 
w3-style.el, w3-speak.el, w3-print.el, w3-prefs.el, w3-parse.el, w3-mule.el, 
w3-mouse.el, w3-menu.el, w3-latex.el, w3-keyword.el, w3-imap.el, w3-hot.el, 
w3-forms.el, w3-emulate.el, w3-e19.el, w3-draw.el, w3-annotat.el, w3-about.el, 
images.el, font.el, w3-vars.el:
+       Changed email address info
+
+       * dist.Makefile: Added w3-latex.el to the dist.Makefile
+
+       * w3-vars.el, default.css: *** empty log message ***
+
+       * font.el: final fix for font-height lossage
+
+       * docomp.el: added menubar-visible-p
+
+Fri Jun 28 16:08:08 1996  William M. Perry  <address@hidden>
+
+       * mm.el: Fix for stupid problem in mm-copy-tree
+
+Wed Jun 26 16:38:12 1996  William M. Perry  <address@hidden>
+
+       * font.el:
+       Use truncate instead of round for font sizes - usually gives better 
results
+
+       * w3-annotat.el, w3.el:
+       Patch from Darrell Kindred <address@hidden> for news problems
+       1. nnheader-init-server-buffer isn't called, so the
+            first call to nntp-open-server fails.  (Patch inserts
+            a call to nnheader-init-server-buffer in url-news-open-host.)
+         2. The `&', '<', and '>' characters don't get turned into
+            entities in news from lines, subject, body, etc.  The result
+            is that "William Perry <address@hidden>" shows up
+            as "William Perry @monolith.spry.com>".  (The patch moves
+            w3-insert-entities-in-string to url.el and renames it to
+            url-insert-entities-in-string, then calls it from url-format-news.
+         3. When displayed, news articles get an extra, empty
+            "References" entry.  (Patch inserts a `(delete "" ...)'
+            to remove the trailing empty reference from the list.)
+
+       * url-news.el, url.el:
+       Patch from Darrell Kindred <address@hidden> for news problems
+         1. nnheader-init-server-buffer isn't called, so the
+            first call to nntp-open-server fails.  (Patch inserts
+            a call to nnheader-init-server-buffer in url-news-open-host.)
+         2. The `&', '<', and '>' characters don't get turned into
+            entities in news from lines, subject, body, etc.  The result
+            is that "William Perry <address@hidden>" shows up
+            as "William Perry @monolith.spry.com>".  (The patch moves
+            w3-insert-entities-in-string to url.el and renames it to
+            url-insert-entities-in-string, then calls it from url-format-news.
+         3. When displayed, news articles get an extra, empty
+            "References" entry.  (Patch inserts a `(delete "" ...)'
+            to remove the trailing empty reference from the list.)
+
+Tue Jun 25 19:00:48 1996  William M. Perry  <address@hidden>
+
+       * w3-menu.el:
+       Revamped the options menu - added the edit-preferences button.
+
+       * w3.el: Fix for window-splitting with the back button
+
+       * mm.el:
+       Potential fix for cl's version of copy-tree fucking things up in mm.el
+
+       * w3-sysdp.el: Added bogus definition of set-marker-insertion-type
+
+Mon Jun 24 14:51:18 1996  William M. Perry  <address@hidden>
+
+       * w3-about.el: changed pointers for xemacs.cs.uiuc.edu to xemacs.org
+
+Fri Jun 14 17:45:16 1996  William M. Perry  <address@hidden>
+
+       * url-cookie.el: fixed bug in cookie support
+
+       * url-cookie.el: Require cl for the def. of assoc*
+
+       * w3-auto.el: *** empty log message ***
+
+       * w3-vars.el, w3.el, w3-forms.el:
+       Fixes for mule from MORIOKA Tomohiko <address@hidden>
+
+       * w3-xem20.el: Initial revision
+
+       * url-vars.el, url.el:
+       Fixes for mule from MORIOKA Tomohiko <address@hidden>
+
+       * w3-prefs.el: fixed problem under FSFmacs
+
+Thu Jun 13 14:31:38 1996  William M. Perry  <address@hidden>
+
+       * w3-menu.el:
+       Extended w3-menu-save-options to save more info.  Different way of
+       turning menubar on/off in XEmacs 19.14 (menubar-visible-p specifier)
+
+       * w3-latex.el:
+       Applied hypertext link printing patches from Stephen Peters
+       <address@hidden>
+
+       * w3.el: patch for imbalanced tags in w3-document-information
+
+       * url-misc.el, url.el: fixed asynch stuff through a proxy
+
+       * w3-prefs.el: All the panels work to some degree now
+
+Wed Jun 12 04:00:39 1996  William M. Perry  <address@hidden>
+
+       * url-nfs.el: Initial revision
+
+       * url.el: Added 'nfs' url type as per the WebNFS specification
+
+       * w3-prefs.el: More panels work
+
+       * w3-forms.el: fix for radio button munging
+
+Tue Jun 11 17:28:53 1996  William M. Perry  <address@hidden>
+
+       * url-vars.el: *** empty log message ***
+
+       * url-irc.el: Fixed bug when no channel was specified in the URL
+
+       * url.el: Added IRC loader
+
+       * url-irc.el: Initial revision
+
+       * w3.el: *** empty log message ***
+
+Mon Jun 10 18:58:03 1996  William M. Perry  <address@hidden>
+
+       * md5.el: compilation warnings removed
+
+       * md5.el:
+       New version of md5.el that actually incorporates an md5 implementation
+       in lisp!  Whoah.
+
+Sun Jun  9 17:32:55 1996  William M. Perry  <address@hidden>
+
+       * url-http.el:
+       protect against malformed HTTP URLs getting passed in via url-retrieve
+
+       * w3-speak.el: more renamings that I forgot before
+
+       * url.el:
+       fixed problem with writing out a history file for the first time
+
+       * url-file.el: fixed problem with ftp links
+
+       * w3.el: w3-find-default-stylesheets is now a little smarter (looks for
+       stylesheets in the directory it is being loaded from).  Error messages
+       when no default stylesheet can be found is much better now as well.
+
+       * dist.Makefile, clean-cache, default.css, w3.txi, descrip.mms, 
font.el, images.el, w3-about.el, w3-annotat.el, w3-auto.el, w3-draw.el, 
w3-e19.el, w3-emulate.el, w3-forms.el, w3-hot.el, w3-imap.el, w3-keyword.el, 
w3-latex.el, w3-menu.el, w3-mouse.el, w3-mule.el, w3-parse.el, w3-prefs.el, 
w3-print.el, w3-speak.el, w3-style.el, w3-sysdp.el, w3-toolbar.el, w3-vars.el, 
w3-widget.el, w3-xemac.el, w3.el, xbm-button.el, xpm-button.el, docomp.el:
+       Initial revision
+
+       * base64.el, md5.el, mm.el, ssl.el, url-cookie.el, url-file.el, 
url-gopher.el, url-hash.el, url-http.el, url-mail.el, url-misc.el, url-news.el, 
url-parse.el, url-pgp.el, url-vars.el, url-wais.el, url.el, urlauth.el:
+       Initial rev
+
diff --git a/ChangeLog.2 b/ChangeLog.2
new file mode 100644
index 0000000..7565780
--- /dev/null
+++ b/ChangeLog.2
@@ -0,0 +1,8487 @@
+Thu Jun  6 15:03:15 1996  William Perry  <address@hidden>
+
+
+* w3-auto.el: Added autoload for w3-show-dvi
+
+* w3-latex.el: w3-parse-tree-to-latex now takes optional URL argument.
+<pre> and <xmp> text now work correctly.
+Added a known-bugs section.
+Added a variable for whether to print hyperlinks as footnotes or not.
+
+
+* w3-annotat.el, w3-e19.el, w3-forms.el, w3-hot.el, w3-prefs.el, w3-xemac.el, 
w3.el:
+Replaced w3-insert w/insert - no longer needed
+
+* w3-latex.el: Added footnotes for hypertext links
+
+Wed Jun  5 20:18:36 1996  William Perry  <address@hidden>
+
+* w3-latex.el:
+Changed some things to be more like w3-draw in how it gets formatting
+informatino for each chunk
+
+* w3.el:
+Merged in new latex printing code from Stephen Peters <address@hidden>
+
+* w3-print.el: Stephen Peters <address@hidden>
+
+* w3-auto.el:
+Merged in new latex printing code from Stephen Peters <address@hidden>
+
+* w3-latex.el: Initial revision
+
+* w3-parse.el: patch from jbw for eveil <! comment syntax
+
+Mon Jun  3 20:43:37 1996  William Perry  <address@hidden>
+
+* w3-parse.el, w3-vars.el:
+added flag for whether to honor netscape style <! > comments.
+
+
+* w3-parse.el, w3-vars.el: Added alt text capabilities to w3-graphic-entities
+
+* w3-menu.el: Toggling menubar from Emacs->W3 works again
+
+* w3.el: w3-map-links works again, so does w3-complete-link
+
+* w3-e19.el, w3-xemac.el: removed old def. of w3-map-links
+
+* w3-draw.el: fixed url expansion
+
+* w3-forms.el:
+More fixes for netscape compatibility with single-text entry form
+submissions
+
+* w3-speak.el:
+Added a few patches from Raman (folding-mode stuff) and definition of
+advice for w3-scroll-up
+
+* w3-prefs.el:
+Got rid of some compiler warnings about free variables, and removed
+some bogus variables that I can get elsewhere now
+(w3-preferences-numglyphs)
+
+* w3-prefs.el: Added hooks for setting up the prefs buffer, and ok/cancel/reset
+hooks.  Fixed saving of proxy information
+
+* descrip.mms: Updated VMS MMS file
+
+* dist.Makefile: Added w3-prefs to the distribution
+
+Sun Jun  2 20:09:22 1996  William Perry  <address@hidden>
+
+* w3-draw.el: a few more emacspeak extensions
+
+
+* w3-e19.el: Fixed compile-time errors re: w3-form-element-* functions
+
+* w3-draw.el: fixed bug in w3-valid-voice-p
+
+
+* w3-speak.el: fixed some compiler warnings
+
+
+* dist.Makefile: Added w3-speak.el to the distribution
+
+* w3-speak.el:
+Move some functionality of the w3-fetch defadvice into a w3-mode-hook
+that is automatically added by w3-speak-use-voice-locking
+
+* w3-speak.el: Wow, I think it will work
+
+* w3-draw.el: reimplemented w3-echo-link
+
+* w3.el: fixed problem of not resetting the user's value of url-be-asynchronous
+in the new version of w3-download-url
+
+* w3.el: Made w3-download-url asynchronous by default, and make sure it asks
+for the filename before it starts the download.
+
+Sat Jun  1 20:04:22 1996  William Perry  <address@hidden>
+
+* w3.el: Fixed w3-download-url
+
+* w3-parse.el: Fixed graphic entities to use normal entity expansion instead of
+'STARTTAG - see commentary in the code for why exactly.
+
+* w3.el: Fixed w3-mail-document-author to do the right thing for 'made' links
+again.  Now searches for mail(to|server) links first.  If none found,
+takes the first 'made' link and fetches that.  If one found, fetch it.
+If more than one mail(to|server) link is found, present the user with
+a list and let them choose.
+
+* w3-speak.el: Initial revision
+
+Fri May 31 21:34:19 1996  William Perry  <address@hidden>
+
+* w3-draw.el, w3-style.el: Basic support for emacspeak out of the box
+
+* w3.el: Fixed typo in w3-popup-info
+
+* w3-parse.el: Fixed bug in graphic entity creation
+
+* w3.el: Added new function w3-describe-entities that lists all the entities
+currently defined.
+
+* w3-parse.el: Added in new definitions for graphic entities - they live again!
+
+* w3-vars.el: Added in new definitions for graphic entities
+
+
+Thu May 30 17:32:36 1996  William Perry  <address@hidden>
+
+
+* w3-prefs.el:
+Changed to only using one buffer instead of two stacked buffers - was
+too big a pain in the ass to navigate w/o the mouse.
+
+* w3-forms.el: fixed form submission changes
+
+* w3-draw.el:
+Supports target'ed windows to some extent (external, _blank, _top)
+
+* w3.el: delete-other-windows in w3-fetch-other-frame
+
+* w3-draw.el:
+the hyperlnk widgets now keep _all_ attributes that are specified on a
+link in them as widget properties.  This will eventually allow us to
+do targetted windows, etc.
+
+
+* w3-prefs.el: protect against errors in widget-forward
+
+* w3-prefs.el:
+Ok, cancel, and save buttons work.  Proxy configuration screen is
+complete.  Old window configuration restored when exiting.  Now
+selects the prefs window after choosing something from the toolbar
+
+* w3-sysdp.el: Added symbol-value-in-buffer
+
+
+* w3-draw.el, w3-forms.el: Single-entry form auto-submission now works again
+
+* w3-sysdp.el: Added insert-file-contents-literally function
+
+Wed May 29 21:52:40 1996  William Perry  <address@hidden>
+
+* w3-prefs.el: proxy panel sort of works
+
+* w3-print.el: Few patches to the latex printing by Stephen Peters
+<address@hidden>
+
+* w3-mouse.el: w3-follow-inlined-image works again
+
+* w3-draw.el:
+Fixed problem with paragraph filling screwups after <xmp></xmp> sections
+
+* w3-vars.el:
+new keybinding for return so that return doesn't self-insert when not
+on a hyperlink
+
+
+* font.el: don't error out on bad rgb color values
+
+* font.el: Don't error out if you cannot find the rgb.txt file
+
+* w3-parse.el:
+Supports stupid address@hidden netscape-style <! > `comments'.  What complete
+and utter horseshit.
+
+* w3-draw.el: fixed read-only errors once and for all. :)
+
+* w3-e19.el: removed old bogus definition of w3-follow-inlined-image-mouse
+
+
+* w3-prefs.el: progress
+
+* w3.el: Now correctly looks for 'stylesheet' in w3-configuration-directory.
+Avoid infinite recursion if url-be-asynch == t when
+w3-find-default-stylesheets is called
+
+* w3.el: fix for http 0.9 servers and asynchronous transfers
+
+* w3-widget.el:
+Actually added w3-image-widget-callback so 'href images work right
+
+Tue May 28 22:35:46 1996  William Perry  <address@hidden>
+
+* w3-prefs.el: Initial revision
+
+
+* w3-menu.el: Put the correct Emacs/XEmacs in the menubar toggle
+
+* w3-draw.el:
+fixed problems with badly specifid colors in netscape-crap <body> attributes
+
+* w3-forms.el: <input type=image> works minimally
+
+* w3-forms.el:
+Fixed a problem with option lists in forms.  The forms validator is cool
+
+* w3.el: previewing buffers now works much _MUCH_ better
+
+* w3.el: Added stub for w3-find-file, a more intuitive name for w3-open-local
+
+* w3-draw.el: Link-echoing now works
+
+* widget.el, widget-edit.el:
+Changed widget-forward to honor a new :help-echo property
+
+
+* widget-edit.el:
+Fix for widget-forward when widgets are _RIGHT_ on top of each other
+
+* w3.el: Fixed stupid problem on my part
+
+* w3-draw.el:
+Fix problem with <pre> segments from Mac-based web servers (^M only, no ^J)
+
+* w3.el: Don't do set-auto-mode under mule, as it wigs out with null filenames
+
+* w3.el: Fixes for www: hrefs
+
+* w3.el: Fix for file information & last-modified
+
+Mon May 27 23:08:26 1996  William Perry  <address@hidden>
+
+* w3-draw.el: problem in 19.30
+
+* w3-forms.el:
+Fixed problem with 'submit' button on forms _always_ being sent to the
+server - overanxious with making sure everything had a 'name' field at
+widget creation time.  Gack.
+
+* w3-xemac.el:
+Beginnings of a mode-motion-handler to do spiffy handling of client
+side imagemaps, etc.
+
+
+Sun May 26 01:17:31 1996  William Perry  <address@hidden>
+
+* images.el: removed duplicate converter
+
+Fri May 24 18:19:16 1996  William Perry  <address@hidden>
+
+* w3-draw.el: file: urls for images work now
+
+* w3.el: Fixed missing paren in configuration-file warning code
+
+* w3.el: New version of w3-version from "Robert J. Chassell"
+<address@hidden> that will let you do C-u M-x w3-version to insert
+the version information into the buffer at point.
+
+* w3.el, w3-hot.el, w3-forms.el, w3-emulate.el, w3-annotat.el:
+No longer use mm-insert-file-contents lossage
+
+* images.el: Added p[np]m<->ps converters
+
+
+* w3-widget.el: No more newlines after images w/alt text & no hyperlink
+
+* w3.el: Moved where w3-default-configuration gets loaded so that you can set
+some variables in it and have them honored by the rest of w3-do-setup
+
+Thu May 23 16:08:23 1996  William Perry  <address@hidden>
+
+
+* w3-draw.el:
+Now only grabs images with the same URL/SRC once per page, instead of
+starting up multiple transfers for the same one.  Yeah.
+
+* w3-menu.el: context-sensitive menus now work again on images
+
+* w3-sysdp.el: synching up with XEmacs 19.14's version
+
+* w3-sysdp.el: Added lots more device functions
+
+Wed May 22 17:08:21 1996  William Perry  <address@hidden>
+
+
+* w3-widget.el: Now checks for invalid glyphs before removing the textual
+representation from the buffer.
+
+* w3.el: Removed w3-beta from the distribution - functionality moved elsewhere
+
+* w3-widget.el:
+Better handling of images that are hyperlinks that have no 'alt' text.
+
+* w3-draw.el:
+Some stuff from the old w3-beta, image fixes, initial color of html page 
should be better.
+
+
+* dist.Makefile:
+Removed w3-beta from the distribution - functionality moved elsewhere
+
+* w3-emulate.el: Moved w3-read-netscape-config into w3-emulate
+
+* w3-widget.el: Few screwups w/markers fixed
+
+Tue May 21 05:31:56 1996  William Perry  <address@hidden>
+
+* w3-draw.el, w3-forms.el, w3.el: Some XEmacs 20.0 MULE changes
+
+* w3-xem20.el: Initial revision
+
+
+Mon May 20 16:17:37 1996  William Perry  <address@hidden>
+
+* w3-draw.el: Asynch image loading works!
+
+* w3-widget.el: Put a help-echo property on the image extent when necessary
+
+* w3-imap.el: Removed lots of stuff into the new image widget
+
+* w3-widget.el:
+Make sure you always use a marker for the 'where' of an image widget
+
+* w3.el: w3-my-safe-copy-face is now a little more paranoid so that it will not
+bomb on TTYs
+
+Sat May 18 22:44:53 1996  William Perry  <address@hidden>
+
+* widget-edit.el: some text property munging for XEmacs
+
+* w3-widget.el: Yet more bug fixes for ye olde image widget
+
+* w3-widget.el:
+reorded some checks in the image widget callback so that client side
+imagemaps got done correctly.
+
+* w3-draw.el:
+Fixed bug in the use of the new image widget when it was _not_ used
+like <a href=foo>test<img src=blah>test</a>
+
+* w3-forms.el: Support <input type=button> ala netscape
+
+* w3-forms.el: Give default labels to submit and reset buttons
+
+
+Fri May 17 19:52:49 1996  William Perry  <address@hidden>
+
+* w3-draw.el: Now uses the new image widget
+
+* w3-widget.el: Various fixes
+
+* dist.Makefile: Added w3-widget to the distribution
+
+* w3-forms.el:
+Fixed radio button formatting problems (similar to choice options)
+
+* w3-menu.el:
+Don't put the hide location and hide statusbar menu entries in under
+Emacs 19 just yet.
+
+* w3-imap.el: Few fixes for Emacs 19 in tty mode
+
+* w3-forms.el:
+Option lists now no longer insert a newline unconditionally.  Ack.
+
+* w3-draw.el: inhibit-read-only for some Emacs 19 lossage
+
+Thu May 16 16:15:01 1996  William Perry  <address@hidden>
+
+* w3-menu.el: Better fix for XEmacs w/no menus
+
+* w3-mouse.el:
+Do not use button keysyms if no X support is compiled in (button1, etc)
+
+* w3-xemac.el:
+Don't make toolbar buttons if not (featurep 'toolbar).  Don't add our
+help stuff to the help menu unless (featurep 'menubar)
+
+* w3-menu.el:
+Don't install menus under XEmacs unless (featurep 'menubar), otherwise it will 
bomb on a TTY-only XEmacs.
+
+Tue May 14 16:32:16 1996  William Perry  <address@hidden>
+
+* w3-widget.el: Initial revision
+
+* font.el: Strikethru stuff works again.
+
+* default.css: added some netscapisms in the default stylesheets
+
+* w3-style.el: Added a require 'cl for 'case' handling
+
+* w3-parse.el: Added 'strike' tag to %font in the DTD ala HTML 3.2
+
+Mon May 13 20:56:52 1996  William Perry  <address@hidden>
+
+* dist.Makefile: Removed w3.ad from the distribution, as it is no longer used.
+
+Fri May 10 16:28:13 1996  William Perry  <address@hidden>
+
+
+* w3-imap.el: Now displays client-side imagemaps pretty sweetly under Emacs 19
+(drop-down list of destinations)... Whoo hoo!
+
+
+* default.css: few changes to default stylesheet - nothing major
+
+
+* w3-draw.el: fixed problem in w3-decode-area-coords
+
+Thu May  9 13:46:42 1996  William Perry  <address@hidden>
+
+
+Wed May  8 17:52:10 1996  William Perry  <address@hidden>
+
+* w3.el: Avoid creating bad html in w3-document-information
+
+
+Tue May  7 16:06:20 1996  William Perry  <address@hidden>
+
+
+* w3-vars.el: New keybinding C-A-t for listing open network transfers
+
+
+* w3-draw.el, w3-forms.el, w3-parse.el: Support <keygen> tags in the parser
+
+Mon May  6 18:03:06 1996  William Perry  <address@hidden>
+
+* images.el: fixed image converter for tiff->pnm and pnm->tiff.  Also added
+converter for JBIG (?!) image type
+
+* w3-forms.el:
+Fall back to using old-style looking stuff for text entry areas - some
+HTML was truly confusing where the widget ended and began.  Gack.
+
+Thu May  2 16:24:12 1996  William Perry  <address@hidden>
+
+
+* dist.Makefile: now installs default.css
+
+* w3-imap.el:
+image order fixed on pages with consecutive images with no text in between.
+
+* w3.el: Now looks in the data-directory and data-directory/w3/ subdir for
+stylesheet files.  Now looks for several stylesheet files, not just
+the first one it finds.
+
+Wed May  1 21:36:37 1996  William Perry  <address@hidden>
+
+* w3-e19.el: fixed mouse waggling under fsf
+
+* w3-vars.el: Added default for w3-source-file-hook ... automatically goes into
+html-mode (should probably do font-lock as well to get netscap'y look)
+
+* w3-draw.el: Fixed <body> tags yet again... god am I stupid
+
+* w3-e19.el: Fixed mouse movement under FSF
+
+
+* w3.el: auto-autoload w3-do-setup
+
+* w3-vars.el: changed w3-documentation-root
+
+* w3-menu.el, w3-xemac.el, w3-toolbar.el, w3-mouse.el:
+
+* w3-menu.el:
+Now use w3-default-configuration-file for saving options from the menubar
+
+* w3-auto.el: removed a few autoloads due to the forms revamping
+
+* docomp.el: few more stub variables
+
+* w3-vars.el: More forms fixes
+
+* w3.el: Some jka-compr fixes
+
+* w3-style.el: removed annoying 'applying style hints' messages
+
+* w3-draw.el: Fixed the handling of default attributes on <body> tag for text
+coloring, etc.  Wasn't using the new syntax the stylesheet parser was
+expecting.
+
+* w3-hot.el, w3-menu.el: In XEmacs, changed the hotlist menu constructor to use
+w3-html-bookmarks instead of adding a separate menu item for it.
+Consitent with how it has to be done under Emacs19
+
+
+Tue Apr 30 20:45:20 1996  William Perry  <address@hidden>
+
+* w3-mouse.el: In netscape emulation mode, emulate the mouse bindings as well.
+
+* font.el:
+Now takes care of setting a display-table on the face for smallcaps and bigcaps
+
+* w3-forms.el: more fixes
+
+* w3-sysdp.el: Added definition of alist-to-plist
+
+* w3-draw.el: fixed some <select> issues
+
+* w3-forms.el: New round of cleanup of the forms code continues
+
+Sat Apr 27 04:31:57 1996  William Perry  <address@hidden>
+
+* widget-edit.el: fixed typo in the 'sexp' widget
+
+* w3-auto.el: autoload widget-forward/backward
+
+* widget-edit.el: Fix for file widget
+use 'keymap property when in xemacs, 'local-map when in fsf
+
+* w3-menu.el:
+Don't put the toggle toolbar menu item up in Emacs or a XEmacs with no
+toolbar support
+
+* w3-draw.el: More efficient handling of end of hyperlink
+
+* w3-beta.el: w3 buffers are no longer read only
+
+* w3-forms.el, w3.el, w3-mouse.el:
+Make middle-mouse-button run w3-widget-button-click, that will not
+call widget-button-click if there is no widget under the event - this
+avoids being able to paste into the buffer, etc.  Gack!
+
+
+* w3-vars.el:
+no longer show the read-only/modified status in the modeline for w3 buffers
+
+* w3-vars.el: Yet more key shuffling for the widget stuff
+
+Fri Apr 26 23:09:10 1996  William Perry  <address@hidden>
+
+* widget-edit.el, widget.el: Initial revision
+
+* w3-forms.el:
+Only set the face of a form element if one has been explicitly defined
+
+* w3-imap.el:
+Removing alt text from the buffer when loading images works again... yahhh
+
+* w3.el, w3-forms.el, w3-auto.el, w3-e19.el, w3-menu.el:
+Fixed the 'links' menu for both XEmacs and Emacs
+
+* w3-keyword.el:
+elc files should now be portable between XEmacs and Emacs again... as
+long as you don't use the byte-compile-dynamic stuff.
+
+* w3-draw.el:
+Fixed problem of w3-handle-hyperlink-end being a little too aggressive
+about putting the highlight and link properties on empty <a> tags.
+
+Thu Apr 25 19:08:45 1996  William Perry  <address@hidden>
+
+
+* w3-xemac.el, w3-vars.el, w3-style.el, w3-menu.el, w3-imap.el, w3-forms.el, 
w3-e19.el, w3-draw.el, w3.el:
+Lots and lots of changes...
+- config files are now all in ~/.w3/, ala netscape
+- everything is now done via the excellent 'widget' package and text
+  properties... most of the code in w3-e19 and w3-xemac is now gone
+- 90% of the forms code is gone, subsumed by widget
+- some stylesheet changes for the latest CSS level 1 draft
+- general cleanup of lots of other code
+- many changes all over the place to deal with the new widget package
+  and text-property representation
+
+* w3-auto.el: more autoloads
+
+
+* w3-hot.el: New way of extracting the default title of a link under point
+
+* w3-beta.el: No longer call w3-mule-attribute-zones
+
+
+* w3-emulate.el: No more special casing of keysyms based on emacs version...
+
+* w3-toolbar.el: Changed the default toolbar type to 'both
+
+
+* dist.Makefile: added w3-mouse.el to the distribution
+
+* w3-mouse.el: Initial revision
+
+* w3-menu.el:
+Moved new, unified version of context sensitive menu code into w3-menu
+
+
+* w3-mule.el: Removed lots of old crap
+
+
+* w3-keyword.el: Initial revision
+
+* font.el:
+Now tags colors that are actually vectors as [rgb #r #g #b] instead of
+just [#r #g #b]
+
+Mon Apr 22 16:48:31 1996  William Perry  <address@hidden>
+
+* docomp.el: Added bogus def of has-modeline-p to shut up emacs-19
+
+* w3-auto.el: renamed w3-annotate.el to w3-annotat.el
+
+
+Fri Apr 19 20:40:46 1996  William Perry  <address@hidden>
+
+* w3-auto.el: Added autoloads for widget package
+
+Thu Apr 18 12:57:47 1996  William Perry  <address@hidden>
+
+
+Wed Apr 17 13:35:41 1996  William Perry  <address@hidden>
+
+* w3-e19.el:
+Don't send the truncated URL that is used for displaying menus to the
+actual function.  D'oh!
+
+Tue Apr 16 17:37:59 1996  William Perry  <address@hidden>
+
+* w3-merge.el: Initial revision
+
+Mon Apr 15 21:24:04 1996  William Perry  <address@hidden>
+
+
+* w3-draw.el: Use temporary faces in XEmacs, so people don't puke when they do
+edit-faces and see all the crappy face names.
+
+Sat Apr 13 01:07:49 1996  William Perry  <address@hidden>
+
+* w3.el: New function w3-popup-image-info that displays info about an image ala
+netscape 2.x
+
+* w3-menu.el:
+slight re-ordering of the options menu.  Can now turn off the modeline
+and minibuffer
+
+* w3-e19.el, w3-xemac.el:
+When the menubar is turned off, add a turn menubar back on option to
+all context sensitive menus
+
+* w3-vars.el: Shortened the context-sensitive menu over hyperlinks
+
+Fri Apr 12 03:51:20 1996  William Perry  <address@hidden>
+
+
+Thu Apr 11 17:43:48 1996  William Perry  <address@hidden>
+
+* w3-draw.el: Now handles set-cookie commands from <meta> tags
+
+Wed Apr 10 14:30:19 1996  William Perry  <address@hidden>
+
+
+* w3-vars.el, w3-draw.el, w3.el:
+Set the variable list-buffers-directory appropriately to show the URL
+for all the various W3 buffers via list-buffers.
+
+Tue Apr  9 20:52:52 1996  William Perry  <address@hidden>
+
+* w3-e19.el:
+url-truncate-url-for-viewing can now take an optional width parameter.
+If an unknown URL type is found, put quotes around it in the error
+message so that its easier to know what exactly wasn't recognized.
+
+
+* w3-parse.el: Various patches from jbw.
+1. Parser-side fix for <XMP> duplication.
+2. Percentages would get way out of wack on large files
+
+Mon Apr  8 22:40:47 1996  William Perry  <address@hidden>
+
+* w3-draw.el: fixed problem in w3-decode-area-coords that would mess up on some
+client side imagemaps (namely www.excite.com)
+
+Wed Apr  3 15:45:43 1996  William Perry  <address@hidden>
+
+* images.el: more tcsh crap... please make it stop.
+
+* w3.el: Added new w3-fetch-other-window command
+
+Tue Apr  2 17:16:23 1996  William Perry  <address@hidden>
+
+* w3-sysdp.el: Some extent functions for emacs19
+
+* w3-imap.el: Client-side image mapping polygons work now.
+
+* images.el: Hopefully final fix for csh/tcsh
+
+Mon Apr  1 18:58:49 1996  William Perry  <address@hidden>
+
+
+* images.el: fixes for csh/tcsh shells, yet _AGAIN_!
+
+
+* w3-menu.el: Can now toggle the menubars from the options menu
+
+Thu Mar 28 20:04:03 1996  William Perry  <address@hidden>
+
+
+* docomp.el: fix for emacs 19.28 griping because of those address@hidden@ 
defsubsts.
+If you ar eusing 19.28, please please upgrade.
+
+* w3-menu.el: New 'style' menu item to control the IE 3.0 compatiblitiy parsing
+
+
+* w3-style.el:
+now :normal: or :default: in a stylesheet end a device-specific section
+
+* w3-style.el:
+CSS now handles C++ style // comments like the unreleased IE 3.0 with
+stylesheets.  Oh, the joy of compatibility!
+
+Wed Mar 27 19:44:12 1996  William Perry  <address@hidden>
+
+* images.el:
+Possible fix for image loading problems seen when people have csh or
+tcsh as their default shell.  Good lord, are these people insane?  See
+http://www.cs.ruu.nl/wais/html/na-faq/unix-faq-shell-csh-whynot.html
+for details.
+
+* w3-forms.el:
+fixed problem with some forms that don't deal well with following the
address@hidden@ing spec for application/x-www-form-urlencoded.  Now does not
+escape the _ character. address@hidden@address@hidden@#%!~@ - wow, its lucky we
+passed the CDA or someone might have gotten offended here.
+
+* w3-draw.el:
+now handles xmp slightly differently - waiting for patches from jbw
+for the parser end of the fix.
+
+* w3-style.el:
+You can now have emacsen specific sections of a CSS stylesheet by
+using the device-specific stuff.  Use :emacs: or :xemacs: as the
+device type and away you go.
+
+Tue Mar 26 21:14:19 1996  William Perry  <address@hidden>
+
+
+* w3-e19.el: Fixed the 'submit form to nil' bug in mouse movement
+
+
+* w3.el, w3-hot.el: HTML bookmark parsing now actually works.
+
+Mon Mar 25 14:53:56 1996  William Perry  <address@hidden>
+
+* w3-sysdp.el, w3-about.el:
+Changed some pointers to ben wing and pearl software.
+
+Wed Mar 20 15:50:50 1996  William Perry  <address@hidden>
+
+
+* w3.el:
+Prefix arg to w3-quit now kills all w3 buffers, not just the current one.
+
+* w3-draw.el: fixed a problem with ^M in <XMP> and <PRE> sections
+
+* w3-imap.el: protect against passing invalid data to make-glyph
+
+Sun Mar 17 23:20:14 1996  William Perry  <address@hidden>
+
+
+Tue Mar 12 18:23:12 1996  William Perry  <address@hidden>
+
+* w3-draw.el: Stubs for math mode
+
+Sat Mar  9 17:47:21 1996  William Perry  <address@hidden>
+
+* w3-toolbar.el:
+Should now work correctly with no toolbar support compiled into XEmacs.
+
+Wed Mar  6 01:52:32 1996  William Perry  <address@hidden>
+
+
+* w3-imap.el:
+Fixed problem with button2 usage in w3-imap.el when compiling with FSFMacs
+
+Fri Feb 23 01:58:21 1996  William Perry  <address@hidden>
+
+
+Wed Feb 21 17:06:00 1996  William Perry  <address@hidden>
+
+* w3-draw.el:
+Now outputs a warning when it runs into a table, just so people know
+its not my fault if it looks like crap. :)
+
+* w3.el: Now uses the real add-minor-mode
+
+* w3-sysdp.el: Added stub for add-minor-mode
+
+* w3.el: Now set buffer-file-truename and buffer-file-name to nil when sourcing
+a document.
+
+* w3-draw.el, w3-sysdp.el:
+Few fixes for #%!@ damn emacsen that don't sanely deal with make-face et. al
+on a TTY interface.
+
+
+Tue Feb 20 14:12:27 1996  William Perry  <address@hidden>
+
+
+Mon Feb 19 15:13:55 1996  William Perry  <address@hidden>
+
+* w3-e19.el:
+Changed binding of mouse-2 to 'ignore instead of 'undefined - more polite.
+
+Sun Feb 18 19:11:45 1996  William Perry  <address@hidden>
+
+* RelNotes2.3: Initial revision
+
+Sat Feb 17 23:50:00 1996  William Perry  <address@hidden>
+
+* w3.el: fixed loading of default stylesheet stuff.  gack.
+
+* w3-auto.el: fixed autoloading of css parser
+
+
+* w3.txi: manual formatting changes - wheee.
+
+
+* w3-menu.el:
+Now explicitly require easymenu for FSF19 - some older versions don't
+autoload it.  *sigh*
+
+Fri Feb 16 21:39:19 1996  William Perry  <address@hidden>
+
+
+Thu Feb 15 22:56:04 1996  William Perry  <address@hidden>
+
+* w3.el: w3-fetch now defaults to http://www. if you are not in a w3 buffer
+
+* w3-menu.el: Added menu item for incremental display
+
+Mon Feb  5 17:01:39 1996  William Perry  <address@hidden>
+
+* w3-draw.el:
+Fixed bug in the <font> handling if all you are doing is setting a color
+
+Tue Jan 30 15:16:43 1996  William Perry  <address@hidden>
+
+* w3.txi: Added section on emulation.  Updated copyright info and dates.
+
+Sun Jan 28 06:17:55 1996  William Perry  <address@hidden>
+
+* w3-menu.el: Fleshed out the doc string of w3-use-menus some more.
+
+Sat Jan 27 18:59:57 1996  William Perry  <address@hidden>
+
+* w3-style.el: Made more of the functions names be saner... don't pollute the
+namespace for when we support more stylesheet notations.  Need to
+extrapolate it some more and have a registry of acceptable notations.
+
+Fri Jan 26 18:40:42 1996  William Perry  <address@hidden>
+
+* w3-xemac.el: No longer adds WWW options submenu to the main options menu
+
+
+* w3.el, w3-xemac.el:
+Lots of changes for new client-side imagemap support and cleanup of old code.
+
+
+* w3-menu.el: New `style' menu
+
+* w3-imap.el:
+Lots of changes for new client-side imagemap support and cleanup of old code.
+
+* w3-emulate.el:
+Added keybindings for left & right arrow keys under netscape emulation.
+
+* w3-draw.el:
+Lots of changes for new client-side imagemap support and cleanup of old code.
+Removed inlined mpeg code, waiting for XEmacs 19.15 to support it again.
+
+* descrip.mms: Updated the VMS makefile for the new files
+
+* dist.Makefile: Added w3-menu.el to the distribution
+
+Thu Jan 25 17:51:39 1996  William Perry  <address@hidden>
+
+* w3-xemac.el:
+Moved over to new, more robust menu specifications - mainly stolen from VM.
+
+* w3.el, w3-vars.el, w3-emulate.el:
+Moved w3-search-* functions out of w3-emulate.el into w3.el where they belong.
+Moved some variables out as well.
+
+* w3-e19.el: Removed w3-emacs19-hack-faces-p support.
+Moved over to new, more robust menu specifications - mainly stolen from VM.
+
+* w3-menu.el:
+Menus now appear to work under both emacs19 and XEmacs.  Fixed problem
+where 'Search Again' was always available, even if no search had been
+done yet.
+
+
+* w3-menu.el: Initial revision
+
+Tue Jan 23 18:05:08 1996  William Perry  <address@hidden>
+
+* font.el: Fixed problem with latest XEmacs 19.14 beta
+
+
+* w3-emulate.el:
+lynx/netscape emulation now uses new w3-search-forward function
+
+* w3-toolbar.el: Toolbar now uses new w3-search-forward function
+
+* w3-imap.el: Work around small bug in the 19.14 beta byte compiler
+
+* w3.el: Don't choke and die if you can't find ange-ftp
+
+Mon Jan 22 16:15:42 1996  William Perry  <address@hidden>
+
+* dist.Makefile: Added w3-emulate.el to distribution
+
+* w3.el, w3-vars.el: Moved the emulation stuff into a separate file
+
+* w3-emulate.el: Initial revision
+
+Sun Jan 21 19:16:33 1996  William Perry  <address@hidden>
+
+
+* dist.Makefile: Added w3-imap.el to the distribution
+
+Sun Jan 14 01:00:30 1996  William Perry  <address@hidden>
+
+* w3.txi: updated w3.org mailing list addresses
+
+* w3.txi: Added section on reporting bugs... needs finishing
+
+Sat Jan 13 08:30:06 1996  William Perry  <address@hidden>
+
+
+Fri Jan 12 19:42:17 1996  William Perry  <address@hidden>
+
+* w3-parse.el: Added parsing stuff for client-side imagemaps
+
+* w3-draw.el, w3-vars.el, w3-imap.el:
+Client-side imagemaps parse correctly now, and the data is stored.
+
+* w3-e19.el:
+Make the options button look a little more like a button under emacs 19
+
+* w3.txi: Combined some of the indices to make it easier to find stuff.
+
+* w3-imap.el: Fixed macros x-coord and y-coord
+
+* w3-imap.el:
+Added definitions for point-in-rectangle|circle functions, and stub
+for point-in-polygon function
+
+* w3-imap.el: Initial revision
+
+Wed Jan 10 13:32:30 1996  William Perry  <address@hidden>
+
+* w3.el: Renamed w3-store-in-x-clipboard to w3-store-in-clipboard
+
+* w3-xemac.el: New version of w3-store-in-clipboard
+
+* w3-e19.el: Renamed w3-store-in-x-clipboard to w3-store-in-clipboard
+
+* w3-e19.el: w3-store-in-x-clipboard now uses x-select-text instead of
+x-set-selection, which is more correct as a good X citizen I guess.
+
+Sun Jan  7 17:03:38 1996  William Perry  <address@hidden>
+
+* w3.el: only check current-prefix-arg if interactive-p.  Otherwise we hose up
+things in ffap.el and probably lots of other things nobody has found
+yet.
+
+Wed Jan  3 19:47:47 1996  William Perry  <address@hidden>
+
+* w3-vars.el, w3.el:
+New netscape emulation minor mode that sets up a lot of keybindings.
+
+* font.el: Made set-face-background|foreground|font interactive again.
+
+* docomp.el: Now adds urldir to the load path
+
+* dist.Makefile: Now copies the THIS-IS-VERSION-* files when installing
+
+* docomp.el:
+Now adds URLDIR to load-path instead of unconditionally using ../url
+
+* dist.Makefile:
+Now puts URLDIR in the environment of the compiling emacsen so that
+docomp.el can get at it.
+
+Tue Jan  2 17:52:14 1996  William Perry  <address@hidden>
+
+* w3.el: Renamed a few things from style-sheet to stylesheet, to be consistent
+
+
+Wed Dec 20 18:21:29 1995  William Perry  <address@hidden>
+
+* w3-hot.el: Removed compile-time warnings
+
+* dist.Makefile: removed w3-srch.el from distribution
+
+* w3-hot.el:
+Basic handling of html hotlists... converts into XEmacs-style menu currently
+
+* w3-beta.el: Added definition of w3-normalize-spaces
+
+* font.el: Definition of define-new-mask macro should now work on older emacs
+19.2x that don't understand native backquoting.
+
+* w3-parse.el:
+No longer throw up a warning for <hr> in <pre> - it really is legal HTML 2.0
+
+* w3-xemac.el: Now stores the parse _tree_ in w3-current-parse.
+Modified the view-parse-tree menu item to show this (not just 
w3-last-parse-tree
+
+* w3-parse.el:
+Made w3-display-parse-tree able to take a parse tree as an argument
+
+* w3-beta.el:
+Make w3-refresh-buffer signal an error for now - not yet reimplemented.
+
+
+* w3-vars.el: Added entities
+     (sim         . 126)
+    (le          . "<=")
+    (agr         . "alpha")
+    (rdquo       . "''")
+    (ldquo       . "``")
+
+
+* w3-parse.el: Now allows <hr> inside of <pre>
+
+Tue Dec 19 22:21:15 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed textarea default input handling
+
+* w3-vars.el, w3-parse.el: Added variable w3-maximum-line-length
+
+Mon Dec 18 22:30:38 1995  William Perry  <address@hidden>
+
+* w3.el: Offer to save to disk if an external viewer fails
+
+* w3.el: If w3-fetch is given a prefix arg, dump to disk.
+
+* w3.el:
+Now defaults to using ~/.netscape/preferences instead of ~/.MCOM-preferences
+
+Sun Dec 17 21:26:41 1995  William Perry  <address@hidden>
+
+
+* w3-draw.el, w3-vars.el, w3.txi:
+Changed w3-link-delimiter-info to w3-link-info-display-function
+
+Sat Dec 16 17:23:39 1995  William Perry  <address@hidden>
+
+* font.el: fixed typo in tty-font-create-plist
+
+* font.el: Fixed stupid mistake in font-tty-find-closest-color
+
+Thu Dec 14 22:34:32 1995  William Perry  <address@hidden>
+
+* font.el: Now uses linethru if on XEmacs
+
+* default.css: Moved to new CSS comment syntax
+Added new stuff for TTYs
+
+
+Wed Dec 13 15:49:44 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: Removed a bunch of old code for XEmacs <= 19.13
+
+* w3-xemac.el: Now registers all netpbm utilities by default
+
+* font.el: Added a few new bitmasks (overline linethrough)
+
+* w3-style.el:
+Now handles the new CSS style syntax - will they every address@hidden decide
+on one and stick with it?!!?!?
+
+
+Tue Dec 12 22:53:43 1995  William Perry  <address@hidden>
+
+* w3.el: fixed problem in w3-insert-entities-in-string under XEmacs
+
+
+* w3-forms.el: Few form fixes
+
+* w3-vars.el: Modified the default stylesheet
+
+
+* font.el: Bold now works on ttys
+
+* w3-sysdp.el:
+Added stubs for make-face set-face-foreground and set-face-background
+for non-X emacsen
+
+
+Mon Dec 11 22:52:38 1995  William Perry  <address@hidden>
+
+* font.el: Some emacs19 patches
+
+* font.el: Changed all the style stuff to use bitmasks for speed.
+More TTY changes
+If no size specified for font, defaults to size of default font for device.
+If no family specified  for font, defaults to family of default font for 
device.
+
+* w3-style.el: All stylesheet stuff now uses the new font package
+
+Sun Dec 10 17:55:13 1995  William Perry  <address@hidden>
+
+* font.el: Some of the font stuff now works on TTYs (bold/dim/etc)
+
+* w3-sysdp.el: Added stubs for face-property and set-face-property
+
+* w3-parse.el: Added wired
+
+Sat Dec  9 23:36:21 1995  William Perry  <address@hidden>
+
+* font.el:
+Added definition of x-font-regexp for emacs19 that has everything font.el
+needs in it.
+
+Fri Dec  8 18:05:48 1995  William Perry  <address@hidden>
+
+
+* w3-draw.el:
+Better handling of links - now keeps _all_ links with the same rel or rev
+
+* w3.el: New presentation of document information
+
+
+* w3-xemac.el, images.el: Can now compile under Emacs19
+
+Wed Dec  6 14:37:12 1995  William Perry  <address@hidden>
+
+* w3-vars.el, w3.el: Now comes with a global fallback stylesheet
+
+
+* w3-style.el: No longer make '/' a 'string' type in the syntax-table - it was
+screwing up non-quoted URLs big time.
+
+* font.el: If running under emacs19, always condition-case where we do a
+set-face-font, since it handles different fonts badly right now.
+
+Tue Dec  5 22:29:28 1995  William Perry  <address@hidden>
+
+* w3-vars.el:
+New image/hyperlink/default context-sensitive menus.  Can now have a
+'%s' in the w3-graphlink and w3-hyperlink-menu entries that will be
+replaced by the URL under point
+
+* w3-xemac.el: Now merges context-sensitive menus when appropriate
+
+* w3-vars.el: Added image mapping for image/png to 'png
+
+* images.el: Modified the pnm and ppm to gif converters to actually work now.
+
+* images.el: Added converters for PNG
+
+Mon Dec  4 19:22:26 1995  William Perry  <address@hidden>
+
+
+* w3-xemac.el: XBM images now work again - gross
+
+
+* w3-parse.el:
+defvar of w3-sgml-md-syntax-table no longer uses an eval-when-compile
+form, since this makes MULE and XEmacs 20.0 croak, and makes the .elc
+files non-portable, now that Emacs 19.30 uses a separate data type for
+them.
+
+* default.css: More fun stylesheet things
+
+* w3.el: When dumping to disk, only send "*/*" in the acceptheader
+
+* w3-vars.el: Now uses the new 'images' package for image conversion.
+
+* w3-xemac.el: Now uses the new 'images' package for image conversion.
+Removed some stuff for old lemacsen
+
+
+* images.el: Wow, it works
+
+* new.el: Now handles pre-formatted sections correctly
+
+* font.el: Default to 12pt font
+
+
+Sat Dec  2 16:55:58 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Applied some patches from joe wells.
+
+* w3-parse.el: Applied some patches from joe wells.
+1. Added error transitions to infer <TBODY>, <TR>, and <TD> when seeing
+   bad stuff inside a TABLE.  A lot of people write shit like this:
+   <TABLE> Text to be centered in a pretty frame in Netscape </TABLE>
+2. Took out a particular error transition for P start tags in the state
+   transition table that was leading to horrible handling of some bad
+   HTML I was seeing.  I had thought this transition would improve
+   handling of bad HTML, but I hadn't seen this particular kind of bad
+   HTML.
+3. Fixed a use of w3-invalid-sgml-chars (that didn't work at all) and
+   fixed its documentation string.
+
+Fri Dec  1 16:25:58 1995  William Perry  <address@hidden>
+
+* images.el: Initial revision
+
+Thu Nov 30 14:33:14 1995  William Perry  <address@hidden>
+
+
+Wed Nov 29 15:06:58 1995  William Perry  <address@hidden>
+
+* w3-sysdp.el: Define x-font-regexp-foundry-and-family for Emacs 19
+
+* dist.Makefile:
+No longer compile w3-sysdp.el - was causing problems in emacs 19.29/19.30
+
+* w3-auto.el: Added autoload for w3-form-format-unknown
+
+Tue Nov 28 16:33:12 1995  William Perry  <address@hidden>
+
+* w3-toolbar.el: Finally fixed nil specifier problem in w3-toggle-toolbar
+
+
+* font.el: Added a new generic font family 'elfin'.  New keyword :oblique.  New
+function font-create-object that converts a window-system-dependent
+font specification into our internal representation
+
+* new.el: Shit, it works!
+
+* w3-style.el: Now intern's the 'break' items, for faster comparison later.
+
+Mon Nov 27 22:21:04 1995  William Perry  <address@hidden>
+
+
+Sun Nov 26 01:31:44 1995  William Perry  <address@hidden>
+
+
+Sat Nov 25 04:47:31 1995  William Perry  <address@hidden>
+
+* new.el: Initial revision
+
+Fri Nov 24 22:53:55 1995  William Perry  <address@hidden>
+
+* w3.txi: Lots of changes and restructuring
+
+* w3.txi:
+Documented the recent keymap changes for history/annotation/hotlist actions
+
+* w3-vars.el: Moved history commands onto their own keymap
+
+* w3-vars.el:
+Moved all hotlist and annotation functions into their own keymap 'h'
+and 'a' respectively.  Comments on the new keybindings are welcome.
+
+* w3-style.el:
+font-size-index now scales by 1.44 instead of 1.2, as CSSv5 recommends
+
+Thu Nov 23 22:33:22 1995  William Perry  <address@hidden>
+
+
+* default.css: Few piddly changes
+
+* w3.txi: Lots of documentation changes.  Thanks to jon konrath
+
+* w3-style.el: Fixed typo in w3-style-font-size-for-index
+
+* w3-draw.el: Can now handle <font color=xxx>
+
+* w3-style.el: The output device specific stuff works now
+
+* w3-draw.el:
+Fixed conversion of netscape <body> attributes into a CSS stylesheet
+
+Wed Nov 22 16:49:32 1995  William Perry  <address@hidden>
+
+* w3-style.el: Now correctly parses the ":foo:" stuff in CSS to handle multiple
+media. Doesn't actually do anything with it yet, but at least it
+doesn't make the thing choke and die any more.
+
+Tue Nov 21 16:33:37 1995  William Perry  <address@hidden>
+
+* default.css: Various tweaks and changes to the default stylesheet
+
+* w3-style.el: Removed old cssv3 stuff - is now completely cssv5
+Added correct handling of comments
+
+* w3-draw.el: Setting default background works again
+
+* w3-xemac.el:
+Added a debugging menu for right now to show the last parse tree and the
+current stylesheet.
+
+* font.el: Few changes to not always default to 'medium' font weight, for those
+fonts that don't have one.
+
+Mon Nov 20 14:14:06 1995  William Perry  <address@hidden>
+
+* w3-about.el: Converted about:style to CSSv5
+
+* w3.txi: Started revamping some sections
+
+Sun Nov 19 22:13:17 1995  William Perry  <address@hidden>
+
+
+* w3-e19.el: Fixed w3-overlays-at
+
+
+* w3-beta.el, w3-draw.el, w3-e19.el, w3-forms.el:
+Everything and its grandmother now uses a default stylesheet - no more
+Xresources!
+
+* w3-mule.el: Fixed a few MULE bugs
+
+* w3-style.el:
+w3-generate-stylesheet-faces does not actually create any of the faces
+now - delays that until they are actually needed/used in
+w3-face-for-element
+
+* w3-vars.el:
+Everything and its grandmother now uses a default stylesheet - no more
+Xresources!
+
+* w3.el: Everything and its grandmother now uses a default stylesheet - no more
+Xresources!
+Much faster version of w3-insert-entities-in-string.
+Now binds require-final-newline to nil when saving a binary file.
+Fixed a few MULE bugs with coding systems and www: URLs
+Fixed reading of initial stylesheet.
+
+* w3-xemac.el:
+Everything and its grandmother now uses a default stylesheet - no more
+Xresources!
+
+* w3-auto.el: Now autoloads w3-generate-stylesheet-faces
+
+* docomp.el: Moved some variable stubs around
+
+* w3-parse.el: Several patches from jbw to the new parser
+
+Sat Nov 18 02:54:18 1995  William Perry  <address@hidden>
+
+
+* w3-vars.el: Fixed typo in one of the new defvars
+
+* w3-vars.el: Changed the format of w3-list-chars-assoc and w3-style-tags-assoc
+
+* w3-draw.el: Removed conversion of old style entity stuff
+
+* w3-vars.el: Moved w3-html-entities variable
+
+* w3.el: Now correctly generates stylesheet faces for the user stylesheet.
+w3-insert-entities-in-string should now be more efficient.
+
+* w3-parse.el: Moved w3-html-entities variable
+
+Fri Nov 17 18:42:54 1995  William Perry  <address@hidden>
+
+* w3-auto.el: Added autoload for w3-parse-arena-stylesheet
+
+* w3.el: Fixed hashtable stuff under XEmacs - the key of a hashtable must be
+able to compare with 'eq', not 'equal', so had to change it to use
+symbols instead of the url string.
+
+* w3-beta.el:
+No longer bind pop-up-windows to nil through all of w3-prepare-buffer
+
+* dist.Makefile:
+Now requires that the URL package be installed before continuing
+
+* w3-parse.el: Added the 'label' tag.
+
+* w3-draw.el: Fixed dumb mistake in the handling of
+w3-visited-node-style/w3-node-style for links under a window system.
+
+* w3-forms.el: Removed old bogus code
+
+
+* w3-parse.el: Fixed bug in the new entity expansion
+
+* w3-style.el:
+Fixed a problem with the font-weight keyword in style specs.  Now
+stores the font specification in the stylesheet as well
+
+* w3.el: No longer unconditionally load w3-sysdp.el
+
+* w3-draw.el: Fixed some spacing problems
+
+* w3-parse.el: Various patches from jbw
+
+Thu Nov 16 18:52:56 1995  William Perry  <address@hidden>
+
+* w3-parse.el: Added in the emacs-w3 easter eggs to the DTD
+
+* w3-parse.el: Allow '_' in attribute names
+
+Wed Nov 15 23:10:23 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Fixed list items with new implied paragraph breaks immediately after
+
+* w3-draw.el: Fixed the yogsothoth handling
+
+* w3-xemac.el: Fixed image loading problem
+
+* w3-parse.el:
+Fixed w3-sgml-name-to-string to be a macro instead of a true function.
+Since it was wrapped within an eval-when-compile, all calls to it
+later on would be fucked due to an undefined function
+
+* w3-draw.el: Removed some dead code
+
+* font.el:
+Can now correctly combine any number of fonts with font-combine-fonts
+
+* w3-draw.el:
+Fixed problem with not swallowing newlines when necessary due to new parser
+
+
+* w3-forms.el: Moved lots of stuff out into new auxiliary files
+
+* w3-auto.el: Initial revision
+
+* w3.el: Moved lots of stuff out into new auxiliary files
+
+* w3-annotat.el: Initial revision
+
+* w3-hot.el: Removed the old, unused air mosaic hotlist parser
+
+
+* w3-parse.el, w3-draw.el:
+Make a display-table for use globally for things in the windows character set
+
+* w3-parse.el: The whole new parser from joe wells.  M-x amen
+
+* w3-draw.el: Few changes for the new parser
+
+Mon Nov 13 15:56:58 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed the <font size=+x> handling
+
+* w3-draw.el:
+Implemented messaging the 'title' of a link instead of just the naked URL
+Now honors the nasty netscapism 'seqnum' attribute on <li> tags
+
+* w3-vars.el, w3-xemac.el, w3-e19.el:
+Implemented messaging the 'title' of a link instead of just the naked URL
+
+* w3-toolbar.el: Activated the w3-toolbar-stop-icon stuff
+
+Fri Nov 10 17:30:43 1995  William Perry  <address@hidden>
+
+* w3.el:
+Fixed problem with application/x-www-form-urlencoding of names of form fields
+
+Thu Nov  9 20:56:02 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Few fixes for ordered lists in alpha and roman style
+
+* w3.el: Catch malformed www: URLs
+
+Fri Nov  3 21:34:35 1995  William Perry  <address@hidden>
+
+
+* w3-style.el, w3-draw.el:
+Can now specify alignment and textalignment in stylesheets for <hr>
+
+Thu Nov  2 22:25:50 1995  William Perry  <address@hidden>
+
+* w3-style.el:
+Fixed problem in stylesheet parser calling (char-after) at point-max
+
+
+* w3-hot.el: Now requires w3-vars, so that w3-setup-done is bound.
+
+Wed Nov  1 15:39:06 1995  William Perry  <address@hidden>
+
+* w3.el: More work on allowing the user to do a completing-read on the
+annotations of a buffer to delete one.  Fixed a few potential screwups
+in the annotations code with regard to improperly entity-ized strings.
+no longer refetches a text/plain document from the server when you do
+a document-source on it.
+
+* w3-hot.el:
+Don't leave backup copies of w3-hotlist-file or url-global-history-file
+
+Tue Oct 31 06:20:43 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Fixed stupid problem introduced when changing w3-set-fill-prefix-length to 
defsubst instead of defmacro
+
+* w3-draw.el, w3-e19.el, w3-vars.el, w3-xemac.el, w3.el:
+Now handles empty containers with name/id attributes
+
+* w3-beta.el: Different formatting for annotations
+
+* w3.el: Base of allowing the user to choose what annotation to delete when
+w3-delete-personal-annotation is called from a non-PAN
+
+* w3-parse.el, w3-beta.el, w3-vars.el, w3-draw.el: Few performance tweaks
+
+
+Sun Oct 29 02:14:10 1995  William Perry  <address@hidden>
+
+* w3-hot.el, w3.el:
+Removed old HTML <div1> so that the new display engine doesn't gripe
+
+* w3-vars.el, w3.el: Made w3-source-document honor w3-reuse-buffers.  Also made
+w3-reuse-buffers default to `reuse'
+
+* w3-draw.el: Fixed the form handling for isindex fields.
+
+* w3-draw.el: Include a working version of center-line for emacs 19.29
+
+* dist.Makefile: Now uses an implicit target.
+
+Sat Oct 28 04:16:16 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed stupid typos
+
+* w3-e19.el, w3-xemac.el:
+Now signals an error in w3-find-specific-link if the #link could not
+be found
+
+* w3.el: w3-show-history-list now works again
+
+
+* w3-draw.el: Fixed the <option value=xxx> handling
+
+* w3-draw.el: Make headers nuke <p> alignments on the stack
+
+
+* w3-parse.el: No longer swallows all the trailing '>' after a tag.  So
+<h1>>>>>></h1> will show up correctly.  Hmmmm... is this right?
+Comments anyone?
+
+* w3-draw.el:
+first paragraph breaks within a list item are now filled correctly
+
+
+Fri Oct 27 13:41:16 1995  William Perry  <address@hidden>
+
+
+* w3-style.el:
+Now correctly keeps track of the tags that something applies-to -
+correct handling of context and new level 2 attribute references
+instead of the old naive way.
+
+* w3-style.el: Now implements @import for stylesheets ala CSS v4
+
+Thu Oct 26 15:11:29 1995  William Perry  <address@hidden>
+
+* font.el: Fixed problem in Emacs 19.29 with the font-set-face-font stuff -
+copy-face sends us in the internal vector instead of the face symbol.
+Bleah!
+
+Wed Oct 25 22:35:42 1995  William Perry  <address@hidden>
+
+* w3.el: Fixed following a link to a fragment "#foo" does not add that URL to
+url-global-history-completion-list (and thus it will not be shown as a
+link that has been followed) if the base URL is already in a buffer.
+
+* default.css: Updated to new (unreleased) CSS v5 specification
+
+* font.el: Removed some old function definitions that are no longer used.
+
+* w3-draw.el:
+Will now create the face storage variables if make-face is not bound.
+Was causing some of the stuff later on in the display engine to crap
+out and die.
+
+Tue Oct 24 16:42:24 1995  William Perry  <address@hidden>
+
+* w3-draw.el, w3-style.el: More CSS hacks
+
+* w3-style.el: Some CSS v5 stuff
+
+* font.el: Added definition of font-warn
+
+* w3-style.el: No longer get everything set to a nil/nil/nil/nil font
+
+Mon Oct 23 23:49:51 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Now honors the special `link' and `visited' classes for anchor tags
+
+
+* w3-style.el: Now honors old back.color syntax
+
+* w3.el: Now honors the $html-source CSS special
+
+Thu Oct 19 21:12:50 1995  William Perry  <address@hidden>
+
+
+Wed Oct 18 22:20:59 1995  William Perry  <address@hidden>
+
+* w3-draw.el: few formatting tweaks.
+
+* w3-style.el: Few various tweaks for font-style
+
+
+Tue Oct 17 21:47:49 1995  William Perry  <address@hidden>
+
+* w3-xemac.el, w3-e19.el: Fixed form entries
+
+
+Mon Oct 16 20:35:42 1995  William Perry  <address@hidden>
+
+
+* w3.el: Fixed applicatin/x-www-form-urlencoded crap
+
+* font.el:
+Don't die if the set-face-xxxx functions are undefined when font.el[c]
+is loaded
+
+Sun Oct 15 23:33:49 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed handling of add.before and add-after
+
+* w3-style.el: Don't bomb out on ttys
+
+* w3-parse.el: Patch from jbw to handle more bad HTML
+
+* w3-parse.el:
+Correct handling of things like &quot; in an attribute/value pair
+
+
+* w3-beta.el: Better handling of personal annotations
+
+* w3-draw.el:
+Fixed fig and ol handling to be consistent with the new symbol-based
+argument lists
+
+* w3-parse.el:
+Moved default parameters for ol into w3-draw where they belong, courtesy of jbw
+
+* w3.el: Patches for personal annotations by jbw
+
+
+* w3.el: fixed some fuckups in the history list
+
+
+* w3.el: Check return value of url-get-url-at-point in w3-follow-url-at-point
+before passing to w3-fetch.
+
+* w3-vars.el: Fixed documentation for w3-header-chars-assoc
+
+Thu Oct 12 13:59:58 1995  William Perry  <address@hidden>
+
+* w3-e19.el: Implemented w3-active-link-color for emacs 19
+
+Tue Oct 10 16:17:52 1995  William Perry  <address@hidden>
+
+* w3-style.el: Some more CSS v4 stuff
+
+* w3-draw.el, w3-xemac.el, w3-vars.el: Now has w3-active-node-style
+
+
+Mon Oct  9 02:59:55 1995  William Perry  <address@hidden>
+
+* w3-about.el: Updated the about stylesheet to the new v4 syntax
+
+* default.css: Updated the default stylesheet to the new v4 syntax
+
+Sun Oct  8 23:48:10 1995  William Perry  <address@hidden>
+
+* w3-style.el:
+Now keeps track of address@hidden' directives - still need to actually do
+something sensible with them though.
+
+* w3-style.el:
+Now understands CSS v4 syntax.  Can handle either v3 or v4, based upon
+some state in the parser.
+
+
+Mon Oct  2 18:07:36 1995  William Perry  <address@hidden>
+
+* w3-vars.el: Removed some epoch stuff
+
+
+* w3-draw.el, w3-about.el, w3-vars.el, w3.el: Removed some epoch stuff
+
+
+Sun Oct  1 17:34:43 1995  William Perry  <address@hidden>
+
+
+Thu Sep 28 13:25:59 1995  William Perry  <address@hidden>
+
+* w3-e19.el:
+Disabled w3-shuffle-history-menu for now, since it cannot copy with
+url-history-list being a hashtable.
+
+* w3-xemac.el: The url-history-list is now really a hashtable
+
+* w3-beta.el, w3.el:
+Fixed a few problems in the hotlist and history handling where it was
+not escaping URLs correctly of < > &, etc.
+
+
+Wed Sep 27 21:44:58 1995  William Perry  <address@hidden>
+
+* font.el: Don't make the rgb.txt buffer visible to the user.
+
+
+Tue Sep 26 14:59:14 1995  William Perry  <address@hidden>
+
+* RelNotes: Initial revision
+
+Mon Sep 25 21:59:10 1995  William Perry  <address@hidden>
+
+
+* w3-xemac.el: No longer tries to auto-detect giftopnm or giftoppm
+
+
+* w3-style.el: Only create font objects when necessary
+
+* w3-style.el, w3-draw.el: New stylesheet mechanism
+
+
+* font.el: Added lots of color stuff
+
+Sun Sep 24 17:13:14 1995  William Perry  <address@hidden>
+
+* w3-sysdp.el: Added def of find-face
+
+* font.el: Various tweaks
+
+Sat Sep 23 04:04:14 1995  William Perry  <address@hidden>
+
+* w3-draw.el, w3-xemac.el, descrip.mms, dist.Makefile:
+
+* w3-toolbar.el: Moved all the toolbar specific stuff out into its own file
+
+
+* w3-toolbar.el: Initial revision
+
+Fri Sep 22 15:08:48 1995  William Perry  <address@hidden>
+
+
+Thu Sep 21 17:21:24 1995  William Perry  <address@hidden>
+
+
+Wed Sep 20 14:07:46 1995  William Perry  <address@hidden>
+
+
+* w3-hash.el: Initial revision
+
+Tue Sep 19 13:48:09 1995  William Perry  <address@hidden>
+
+* w3.el: Fixed fill out forms
+
+Mon Sep 18 18:13:14 1995  William Perry  <address@hidden>
+
+
+* w3.el: A few fixes for w3-url-completion-function to make sure
+url-global-history-hash-table is really a hashtable
+
+
+Sun Sep 17 18:04:25 1995  William Perry  <address@hidden>
+
+
+* w3-parse.el: fixed typo
+
+* w3-parse.el: Avoid lots of string-creation in w3-parse-args
+
+* w3.el: Use all-completions directly in emacs-19 in w3-url-completion-function
+for raw speed.
+
+* w3-draw.el: Fixed some _STUPID_ problems
+
+
+* w3-sysdp.el:
+make-hashtable now finds the next highest prime for the initial size.
+
+* w3-draw.el:
+Everything from w3-parse-args is now a symbol, so that the faster assq
+can be used when retrieving.  It is possible something was missed -
+keep an eye out for things getting fucked.
+
+
+* w3-vars.el, w3-draw.el:
+Now caches whether a URL has been visited or not between calls to
+w3-handle-hype and w3-handle-hyperlink-end, for speed
+
+* w3.el: Changes to w3-url-completion-function to handle the new internal
+representation of the global history.  Performance might suffer here
+(in XEmacs), but the majority of people don't ever notice the url
+completion anyway. :)
+
+* w3-sysdp.el: Added def of clrhash
+
+
+* w3-sysdp.el: Added hashtable functions
+
+Sat Sep 16 01:37:54 1995  William Perry  <address@hidden>
+
+* w3.el: Some MULE stuff
+
+* w3-beta.el: Fixed bug in finding #xxx links
+
+* w3-draw.el:
+Catch error in centering a horizontal rule due to brokenness in emacs 19.29
+
+
+* w3-vars.el, w3-parse.el, w3-draw.el:
+Lots of performance tweaks from address@hidden (Joe Wells)
+
+Mon Sep 11 14:32:40 1995  William Perry  <address@hidden>
+
+
+Sun Sep 10 23:26:47 1995  William Perry  <address@hidden>
+
+* w3-sysdp.el: Added defvar for x-library-search-path
+
+Sat Sep  9 03:17:37 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: Added options menu item for honroing stylesheets
+
+
+Wed Sep  6 15:12:24 1995  William Perry  <address@hidden>
+
+
+Tue Sep  5 17:41:31 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed stupid problem with new def of w3-warn
+
+Mon Sep  4 18:10:03 1995  William Perry  <address@hidden>
+
+
+* w3-vars.el: Added SGI rgb inlined image converter
+
+* w3-parse.el:
+Fixed problem where something like <a href=^M "foo" would use the ^M
+as the href value.  Bleah!
+
+
+* w3-beta.el: Integrated new version of w3-prepare-buffer from Shuji NARAZAKI
+<address@hidden> that gets rid of the horrid
+'asynchronous retrieval finishes when in minibuffer' lossage.  Yeah!
+
+* w3.el: Redirects should now no longer screw up the history list.
+
+
+Sun Sep  3 21:53:09 1995  William Perry  <address@hidden>
+
+* w3.el: Only do the absolute minimum setup necessary in
+w3-read-url-with-default - this yields faster response time upon first
+starting up via w3-fetch.  Uses custom completion routine to only do
+the url setup routines when the user requests completion on a URL.
+
+* w3-sysdp.el: fixed typo in device-mm-width
+
+Fri Sep  1 02:47:29 1995  William Perry  <address@hidden>
+
+* w3.el: Treat bogus METHODs on forms like GET, but still put up a warning
+buffer
+
+
+Thu Aug 31 23:59:33 1995  William Perry  <address@hidden>
+
+
+* default.css: Initial revision
+
+
+* w3-draw.el: Put in special test for CR or LF in name of a input field so that
+spaces would not be inserted and screw up cgi scripts that aren't
+expecting it.
+
+* w3-xemac.el: Fixed various toolbar problems
+
+Wed Aug 30 20:36:17 1995  William Perry  <address@hidden>
+
+* w3.el: Incorrectly 'typed' input types now default to `text'
+
+
+* w3.el: Applied patch from address@hidden (Joe Wells) for the extremely
+annoying ` Wrong type argument: overlayp, (w3form (("enctype"
+. "application/x- ...' stuff.
+
+Mon Aug 28 21:15:50 1995  William Perry  <address@hidden>
+
+
+* xbm-button.el: Initial revision
+
+
+* w3-xemac.el: Now uses xbm-button-create when necessary
+
+* w3-xemac.el: Fixed save options bug
+
+
+* w3-draw.el: Fixed bug where 'plain' lists would not be indented at all.
+
+
+* font.el: Initial revision
+
+Sun Aug 27 01:10:25 1995  William Perry  <address@hidden>
+
+
+Sat Aug 26 06:21:20 1995  William Perry  <address@hidden>
+
+* w3-sysdp.el: Added split-string
+
+Fri Aug 25 18:56:55 1995  William Perry  <address@hidden>
+
+* w3-sysdp.el: Added definition of try-font-name
+
+
+* w3-style.el, w3-xemac.el, w3-vars.el, w3-e19.el, w3-draw.el:
+Can now specify the default face in style sheets
+
+
+Thu Aug 24 19:08:16 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Changed w3-munge-color-XXX to strip spaces out of color names passed
+in.
+
+* w3-style.el: Some fixes for the arena 0.97 type style sheets
+
+Mon Aug 21 21:12:22 1995  William Perry  <address@hidden>
+
+
+* w3-style.el: Style sheet stuff now more up-to-snuff with CSS v3.  Also now
+normalizes all colors to their RGB tuples, so that faces can be shared
+between stylesheets that refer to them by different names (#FFF ->
+black -> #FFFFFF -> etc)
+
+
+Sun Aug 20 23:34:37 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed typo
+
+
+* w3-util.el: Added doc strings for the w3-hyperlink-element-xxxx functions
+
+* w3-util.el: Added a provide statement
+
+* w3-util.el: Initial revision
+
+* w3.el: New version of w3|url-warn
+
+* w3-draw.el, w3-e19.el, w3-epoch.el, w3-parse.el, w3-style.el, w3-xemac.el, 
w3.el:
+Use new warnings facility.  Reimplemented most of w3-debug-html
+
+* w3.el, w3-draw.el: Now stores the ID attribute of input elements
+
+
+* w3-parse.el: Nuke entities inside of a <textarea>
+
+* w3-parse.el, w3-draw.el:
+Don't parse any markup that occurs inside of a <TEXTAREA>
+
+* w3-vars.el:
+Removed textarea and textargs from w3-state-vector and 
w3-state-locator-variable
+
+* w3-draw.el: Fixed O-T-M-P error
+
+* w3-draw.el: Background bitmaps working again
+
+* w3-about.el: fixed typo
+
+
+Sat Aug 19 23:39:01 1995  William Perry  <address@hidden>
+
+* w3.el: Made the netpbm stuff come after the loading of the emacs-specific
+file, and now checks to see if w3-insert-graphic is bound before doing
+any of its checking, so that Emacs 19 etc users won't get the warning.
+Also now checks for either pbmtoxbm or ppmtoxbm, since NETPBM doesn't
+have ppmtoxpm
+
+* docomp.el: Added stub for emx-binary-mode
+
+Fri Aug 18 15:28:14 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: Hack to let old xpm icons work for now
+
+Thu Aug 17 23:46:58 1995  William Perry  <address@hidden>
+
+* w3-vars.el, w3-draw.el: Basic support for raman's <label> stuff for forms
+
+* w3.el: Fixed typo in w3-batch-fetch
+
+Mon Aug 14 15:00:37 1995  William Perry  <address@hidden>
+
+* w3.el, w3-xemac.el, w3-draw.el: Can now specify width and height on mpegs
+
+* w3-xemac.el: Use new version of xpm-button.el
+
+* xpm-button.el: New version from kyle
+
+* w3.el: Fixed typo in warning about netpbm utilities
+
+Sun Aug 13 17:50:20 1995  William Perry  <address@hidden>
+
+* xpm-button.el: Made it so it doesn't bomb out on a tty
+
+* dist.Makefile: added xpm-button to the distribution
+
+* xpm-button.el: Initial revision
+
+* w3-style.el: fixed a few typos
+
+
+* w3-xemac.el:
+Now uses the xpm-button program to make textual toolbar icons when necessary
+
+Sat Aug 12 02:33:49 1995  William Perry  <address@hidden>
+
+* w3-about.el: Added about:license and about:warranty URL nodes
+
+* w3-draw.el: Catch errors when making w3-graphic-face
+
+* w3.el: Changed the behaviour of url-keep-history - the history list is only
+saved to disk if this is eq to `t'.  Setting it to anything else
+(usually a number) will keep the list in memory so that
+w3-show-history-list can still work.
+
+* w3.el: Don't add the initial page to the history list, so hitting 'B' in the
+first W3 buffer won't take you out of any w3-mode buffers.
+
+* w3-beta.el, w3-hot.el, w3-style.el, w3.el:
+Always set coding-system to *noconv* in MULE when inserting file contents
+
+Fri Aug 11 13:43:14 1995  William Perry  <address@hidden>
+
+* w3-beta.el, w3-draw.el:
+Moved w3-show-invisible-href into w3-draw to avoid invalid macro stuff
+
+* w3-parse.el, w3-draw.el: Don't swallow spaces after <XMP>
+
+
+* w3-xemac.el:
+New function w3-start-image-cache-timer that will time out all images
+after 5 minutes and cause a garbage-collect so that the pixmaps get
+returned to the windowing system.  This function will get smarter
+soon.
+
+* w3-xemac.el:
+New variable w3-toolbar-type to control waht the toolbar looks like.
+Can be 'pictures' 'text' or 'both' for icons only, text only, or
+captioned icons repsectively.
+
+Thu Aug 10 23:15:44 1995  William Perry  <address@hidden>
+
+* w3.el: Put up a big ugly warning if cannot find any of the netpbm utilities
+at startup
+
+
+* w3-draw.el:
+The size of a <SELECT> area is now defined by the maximum of all the
+lengths of the displayed strings or the SIZE attribute.
+
+* w3-draw.el: No longer picks up the last item of a <SELECT> form area when no
+<OPTION DEFAULT> is present
+
+* w3-xemac.el: Asynch during images should be correctly turned off now
+
+Sun Aug  6 15:58:35 1995  William Perry  <address@hidden>
+
+
+Sat Aug  5 06:11:02 1995  William Perry  <address@hidden>
+
+* w3.el, w3-vars.el: New binding of space to w3-scroll-up
+
+
+* w3.el, w3-draw.el, w3-beta.el, w3-vars.el: More stuff from the MULE folks
+
+
+* w3-xemac.el: Added separators between toolbar buttons
+
+Sat Jul 29 19:13:33 1995  William Perry  <address@hidden>
+
+
+Sat Jul 22 02:51:16 1995  William Perry  <address@hidden>
+
+* w3-e19.el:
+Don't choke if w3-mode-go-menu is not a keymap in w3-create-hotlist-menu
+
+Fri Jul 21 13:44:30 1995  William Perry  <address@hidden>
+
+* w3-parse.el:
+Added let bninding around the call to sera-to-fidel-marker to bind
+sera-being-called-by-w3 so that all is well with the world when using
+it with mule 2.2.3 for ethiopic text
+
+Thu Jul 20 04:06:34 1995  William Perry  <address@hidden>
+
+* w3.el: Fixed doc string for w3-open-local - also added autoloads for the
+w3-maybe-follow-* functions
+
+Tue Jul 18 13:24:39 1995  William Perry  <address@hidden>
+
+* w3-beta.el, w3-hot.el:
+Moved all the hotlist stuff out into w3-hot.el, in preparation for writing
+more robust hotlist handling (HTML files, etc, as hotlists).
+
+Mon Jul 17 14:05:31 1995  William Perry  <address@hidden>
+
+* w3-draw.el: <HR> handling now inserts fill-prefix/etc if in lists.
+
+Wed Jul 12 12:42:03 1995  William Perry  <address@hidden>
+
+* w3-xemac.el:
+Patch from chuck to use XBM version of toolbar icons if XPM support
+not available.
+
+Tue Jul 11 00:01:49 1995  William Perry  <address@hidden>
+
+
+Mon Jul  3 15:28:33 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Fixed problem with multiple <textarea> tags would 'merge' the default
+contents.  Blah.
+
+
+* w3-draw.el:
+Fixed a slight formatting problem for <select multiple> lists when
+within a centered area - looked like crap.
+
+* w3-draw.el: Don't load background images if w3-delay-image-loads=nil
+
+Sun Jul  2 03:35:07 1995  William Perry  <address@hidden>
+
+* dist.Makefile: Added new target for w3-hot.elc
+
+* w3.el: Extracted hotlist functions into w3-hot.el
+
+* w3-hot.el: Initial revision
+
+* w3-vars.el, w3.el: Changed *-hooks to be *-hook'
+
+Sat Jul  1 17:14:23 1995  William Perry  <address@hidden>
+
+* w3-mule.el: Fixed problem in w3-convert-code-for-mule
+
+Thu Jun 29 16:27:33 1995  William Perry  <address@hidden>
+
+* dist.Makefile: Few more tweaks to the makefile
+
+* dist.Makefile: Now tries to create INFODIR if it doesn't exist
+
+* w3-e19.el, w3-mule.el, w3-vars.el, w3.el:
+Various patches from  Katsumi Yamaoka <address@hidden> Katsumi Yamaoka 
<address@hidden> for MULE stuff
+]
+
+* w3.el: Fixed a hidden forms problem.
+
+Tue Jun 27 04:17:59 1995  William Perry  <address@hidden>
+
+
+Mon Jun 26 02:29:33 1995  William Perry  <address@hidden>
+
+* w3-wemac.el, w3-xemac.el, w3-e19.el: Fixed problem pointing to w3_toc.html
+
+Sun Jun 25 22:28:28 1995  William Perry  <address@hidden>
+
+* w3-e19.el: Fixed problem in 19.29 where there were two help menus.
+
+
+* w3-sysdp.el: Some more device-* functions
+
+* w3-sysdp.el: More NS problems resolved
+
+* w3-xemac.el: Removed autoload for Info-goto-node
+
+* w3-sysdp.el: Fixed problem in w3-device-class on NeXTstep
+
+* w3-draw.el: Fixed problem in w3-get-resource on NeXTstep
+
+* w3-beta.el, w3-draw.el, w3-epoch.el, w3-mule.el, w3-srch.el, w3-style.el, 
w3-sysdp.el, w3-xemac.el, w3.el:
+Continue movement to using w3-sysdp.el defined functions instead of
+url-* funcs
+
+* dist.Makefile: Removed extraneous w3-sysdp.el from SOURCES macro
+
+Wed Jun 21 20:04:44 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: Few changes for 19.12
+
+* w3-draw.el: New version of w3-pause for XEmacs
+
+* w3-draw.el: Fixed blinking
+
+Tue Jun 20 14:10:49 1995  William Perry  <address@hidden>
+
+* w3-parse.el: <listing> now works.
+
+* w3-draw.el: Fixed <secret> handlig ng when not in XEmacs 19.12
+
+Mon Jun 19 15:12:18 1995  William Perry  <address@hidden>
+
+
+* w3-sysdp.el: Fixed problem in device-class with arg not being optional
+
+Sun Jun 18 21:41:36 1995  William Perry  <address@hidden>
+
+* w3-sysdp.el:
+Fixed bug in emacs-19 version of device-class on non-color displays
+
+* w3-sysdp.el: Rewrote device-class
+Added device-pixel-width and device-pixel-height
+
+* w3-xemac.el: New function w3-ensure-toolbar-visible
+
+
+* w3-draw.el: Moved valid-color-name-p definition over into w3-sysdp.el
+
+Sat Jun 17 17:50:44 1995  William Perry  <address@hidden>
+
+* docomp.el: More toolbar stuff
+
+* docomp.el: Removed lots of stuff that isn't necessary now that we are using
+w3-sysdp.el all over the place
+
+* w3-sysdp.el: Few more bugfixes
+
+
+* w3-sysdp.el: Fixes for nextstep
+
+* w3-sysdp.el:
+Fixed definition of device-class so that it won't choke and die under
+NeXTstep.
+
+* w3-draw.el:
+If w3-delimit-links is non-nil, put delimiters around submit/reset
+form areas.
+
+* w3-xemac.el, w3-e19.el:
+New options in menu to control honoring of refresh headers and color requests
+
+Fri Jun 16 21:52:39 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Now honors multiple <title></title> crap like netscape.
+
+* w3.el: Fixed handling of refresh header if url-honor-refresh-requests == 'ask
+
+* w3.el: Ask the user before submitting a bug.
+
+* w3-sysdp.el: Removed scrollbar functions.
+
+Thu Jun 15 23:42:26 1995  William Perry  <address@hidden>
+
+* dist.Makefile: Always use @echo so it doesn't show up twice.
+
+
+* w3-xemac.el: More <link>-controlled toolbar stuff
+
+
+* w3-xemac.el: Don't call device-type with an argument.
+
+* w3-beta.el, w3-draw.el:
+Fixed a few problems with compatibility with FSF19 in X mode
+
+
+* dist.Makefile: Added urlauth to makefile
+
+* w3-epoch.el: Fixed problem in w3-map-links
+
+
+Wed Jun 14 23:38:46 1995  William Perry  <address@hidden>
+
+
+* w3.el: Removed a few things that are now in w3-sysdp.el
+
+* w3-sysdp.el:
+Changed sysdep-defalias to make sure that 'def' is fboundp if its a
+symbol, so that bogus defs of make-frame, etc, are not created in
+emacs18
+
+* w3.el: Few things to get a nice clean compile using w3-sysdp
+
+* w3-xemac.el:
+Removed loading of w3-sysdp, since it is loaded for everything now.
+
+* w3-sysdp.el: More functions added
+
+* w3-print.el, w3-epoch.el, w3-emacs.el, w3-e19.el, w3-draw.el:
+Few things to get a nice clean compile using w3-sysdp
+
+* docomp.el: Now loads w3-sysdp during compilation
+
+* w3-xemac.el: Stubs for <LINK> specific toolbar stuff.
+
+* w3-parse.el: Rewrote w3-can-safely-ignore as a macro
+
+Tue Jun 13 15:38:32 1995  William Perry  <address@hidden>
+
+
+* w3-xemac.el:
+Moved some stuff over into w3-sysdp.el for a truly clean compile.
+Fixed the new 'privacy' menu item
+
+* w3.el: Added back in text/plain encoder for forms
+
+* w3-xemac.el:
+make sure that when we add our options/help menus to the menubar, we
+do it to the global menubar, not just the current one, which could be
+anything, but usually GNUS or VM if not the default.
+
+* w3-xemac.el: Fixed w3-x-poup-menu bug.
+
+* w3-xemac.el:
+Fixed problem skip was having at http://www.calendars.com/concerts/
+
+Mon Jun 12 20:32:04 1995  William Perry  <address@hidden>
+
+* w3-wemac.el: Added back in crufty old menu definitions for use in WinEmacs
+
+* w3-xemac.el: New 'save options' item
+
+
+* descrip.mms, dist.Makefile, w3.el:
+Added back in the requiring of w3-wemac - just too much different
+stuff between it and even 19.10.
+
+* w3-xemac.el:
+Check for what type of menu we are displaying in w3-sensitize menu, or
+some weird stuff could happen (like adding 'go' and 'view' menus to
+the 'Emacs' type menubar.
+
+* w3-xemac.el: Reordered some functions to avoid warnings in byte compiler
+
+* w3-xemac.el:
+Added a button ala VM to swap between the global menubar and the W3 one.
+
+* w3.txi: Added stub for VMS section of documentation
+
+* w3.el: Various patches from Richard Levitte <address@hidden>.
+(w3-do-setup): expand VMS Mosaic files correctly.
+
+* docomp.el: Various patches from Richard Levitte <address@hidden>.
+start with inserting the current directory into load-path.
+(hack-dot-emacs): remove the two first items from
+command-line-args-left.  Otherwise, Emacs tries to work on them when
+hack-dot-emacs is done.
+
+* descrip.mms:
+Added the VMS build file from Richard Levitte <address@hidden>
+
+* descrip.mms: Initial revision
+
+Sun Jun 11 22:50:50 1995  William Perry  <address@hidden>
+
+
+* w3.txi:
+Added in section on disk caching, filled out the Digest authentication
+mechanism and SSL sections as well.  Only things left to do are the
+sections on non-unix platforms.
+
+* w3-xemac.el:
+Deal gracefully with markers passed into w3-add-zone (for WinEmacs)
+
+
+* w3-draw.el:
+Fixed stupid FSF 19 lossage where x-color-defined-p signals an error
+in a tty instead of failing gracefully.  Robustness?  Whassat?
+
+
+* w3-draw.el:
+Fixed problem in w3-handle-paragraph where re-search-forward could signal an 
error because 'NOERROR' was not t.
+
+* w3.el: Fixed w3-find-this-file
+
+Sat Jun 10 23:19:30 1995  William Perry  <address@hidden>
+
+* w3.el: Fixed stupid screwup
+
+* w3.el: Run the value of a submit button through url-hexify-string
+
+* w3-vars.el, w3-draw.el:
+Renamed w3-user-colors-take-preference -> w3-user-colors-take-precedence
+
+* w3-draw.el, w3.el: IMAGE inputs in forms now work (sortof)
+
+Fri Jun  9 15:01:05 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed problem with unterminated <a> refs.
+
+Thu Jun  8 14:44:35 1995  William Perry  <address@hidden>
+
+
+* w3-draw.el: Fixed plaintext handling.
+
+Mon Jun  5 15:12:17 1995  William Perry  <address@hidden>
+
+* w3-e19.el: Added color printing toggle to emacs19 menus
+
+* w3-xemac.el: Added color printing toggle to xemacs menus
+
+* w3.el: After reading a form entry area, make sure we mark the buffer as not
+modified.
+
+
+* w3-draw.el:
+fixed w3-handle-paragraph to handle weird circumstances where it could
+try to make-string with a negative first arg.
+
+* w3.el: Patches from address@hidden for his local file handling
+stuff
+
+Sun Jun  4 20:58:40 1995  William Perry  <address@hidden>
+
+
+Sat Jun  3 17:07:32 1995  William Perry  <address@hidden>
+
+* dist.Makefile:
+Patch from Skip Montanaro <address@hidden> to make sure we delete
+old copies of the .el and info files, since they are read only by
+default, and this would cause the installation to fail.
+
+* w3-xemac.el:
+Make sure we don't try to set the X selection from a tty only xemacs -
+it signals a wrong-device-type error.
+
+
+Fri Jun  2 13:58:01 1995  William Perry  <address@hidden>
+
+* w3-beta.el:
+Removed dependence on url-grok-url from the netscape cache importing
+
+Tue May 30 16:29:16 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Now recognizes <link rel="style"> as well as <link rel="stylesheet">
+
+* w3.el: Fixed bug in w3-hotlist-delete that would choke and die on items named
+'hotlist' - fixed the regular expression it was working with.
+
+
+* w3.el: Few fixes
+
+
+* w3-draw.el: Nuke all faces when leaving a <pre> segment
+
+
+Mon May 29 18:24:04 1995  William Perry  <address@hidden>
+
+
+* w3-style.el, w3-print.el, w3-parse.el, w3-e19.el, w3-beta.el, w3-about.el, 
w3.el, w3-draw.el:
+Removed lots of function documentation and left it as comments.  These
+functions are not meant to be seen by everyone, and this saves space
+in the .elc files.
+
+* w3.el: Made w3-save-binary-file default to a sane filename
+
+
+* w3-10646.el:
+Removed bogus copyright, added back in the real one from Erik Naggum.
+gotta hate cut & paste
+
+* w3-xemac.el:
+Make sure the links menu is broken up when using the filter method in 19.12
+
+
+* w3.el, w3-xemac.el, w3-epoch.el, w3-draw.el:
+Now deals with the removal of url-parse-relative-link
+
+Sun May 28 22:28:55 1995  William Perry  <address@hidden>
+
+
+* w3.el, w3-about.el: Use the new url-register-protocol interface
+
+* w3-vars.el: Fixed w3-modeline-format to look nicer
+
+
+Sat May 27 22:00:15 1995  William Perry  <address@hidden>
+
+* dist.Makefile: Removed w3-wemac from the distribution and makefile rules
+
+* w3.el: No longer require w3-wemac if running under windows - the standard
+w3-xemac package should handle it now.
+
+* w3-vars.el, w3.el:
+New variable w3-modeline-format that controls the modeline look when
+in w3-mode buffers.
+
+* w3-vars.el: Removed crufty old menu definitions
+
+* w3-draw.el:
+The new color-frobbing stuff works in older versions of lemacs/xemacs
+
+* w3-xemac.el: First pass at a merger of w3-wemac.el and w3-xemac.el
+
+
+* w3-xemac.el:
+Add the options and help menus to the main menubar in all versions of
+xemacs
+
+Fri May 26 23:42:29 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: More patches from chuck for the next great xemacs beta
+
+* w3-style.el, w3-draw.el:
+Avoid calling of set-face-xxx functions directly, use 'apply' to avoid
+Emacs-19 lossage of defsubsts that makes .elc files non-portable to
+XEmacs.
+
+* w3-draw.el: Honor the <base> tag stuff when doing forms.
+
+* w3-vars.el: Few fixes for the latest beta of XEmacs 19.12
+
+Thu May 25 19:44:48 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+The body color handling stuff now deals gracefully with bad colors
+
+* w3.el: Few fixes for VRML
+
+* w3-style.el: Can now compile under Emacs 18 again.
+
+Wed May 24 13:47:17 1995  William Perry  <address@hidden>
+
+* w3-e19.el: Rearranged some of the menus to be like the XEmacs counterparts
+
+Tue May 23 14:30:05 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: More renamings for XEmacs 19.12
+
+Mon May 22 12:20:36 1995  William Perry  <address@hidden>
+
+* w3-xemac.el, w3-e19.el:
+Renamed url-automatic-cacheing -> url-automatic-caching
+
+* w3-xemac.el: Removed call to bogus exit-emacs func.
+
+Wed May 17 16:20:46 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: Support the newer way of doing toolbars in XEmacs 19.12
+
+* w3-xemac.el: Patch from chuck for latest XEmacs 19.12 toolbar stuff
+
+
+Tue May 16 20:18:40 1995  William Perry  <address@hidden>
+
+* w3.el: VRML stuff
+
+
+Mon May 15 03:38:36 1995  William Perry  <address@hidden>
+
+* w3.el: If no last-modified, don't try to refetch the head info if not in file
+or ftp mode.
+
+
+* w3-style.el:
+New w3-spatial-to-canonical function that can convert something like
+1in or 12pt to a pixel-based representation.
+
+* w3-xemac.el: Changed menus when under Lemacs 19.10 look just like 19.12
+
+Sun May 14 17:37:35 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Fixed problem with <p align="xxx"> .... <p> not properly terminating
+the alignment
+
+
+* w3-about.el: hehe
+
+* w3.el: Better cleanup of the temp directory.
+
+
+Sat May 13 21:03:14 1995  William Perry  <address@hidden>
+
+
+* w3-draw.el: Finished up cookie interface
+
+* w3-draw.el:
+Stub for interface to the cookie() function of emacs from within an HTML
+document.
+
+* w3-about.el: New stylesheet for about: pages
+
+* w3.el: Make w3-reload-document not recenter the window
+
+* w3-draw.el: Fixed isindex handling for prompt=xxx and action=xxx
+
+* w3-draw.el:
+Make sure the emphasis on quotes (<q></q>) includes _both_ quote chars.
+
+* w3-e19.el:
+Don't blindly set the mouse-face on anything with 'w3 in the property
+list.  would cause things like <a name=xxx> to highlight.
+
+
+* w3-xemac.el: XEmacs 19.12 tweaks
+
+* w3-about.el:
+New authors page that doesn't crap out in XEmacs 19.11 / Lemacs 19.10
+
+* w3-xemac.el: Few more tweaks to the menus
+
+* docomp.el: More garbage for a clean compile
+
+* w3-xemac.el, w3-draw.el, w3.el: Few fixes for the latest beta of XEmacs 19.12
+
+Thu May 11 16:32:17 1995  William Perry  <address@hidden>
+
+
+* w3-xemac.el: Added buffers menu to w3 menu
+
+Wed May 10 22:19:25 1995  William Perry  <address@hidden>
+
+* w3-xemac.el:
+Don't set up the toolbar if w3-toolbar-orientation is not 'top 'left
+'right or 'bottom.  Don't set the menubar for the w3 buffer if there
+is no default one.  Copy the options menu into the main options menu
+if in XEmacs 19.12
+
+* w3-xemac.el: Fixed images in 19.12
+
+* w3.txi: Lots of changes
+
+* w3.el: Added some stuff from the texinfo docs
+
+Tue May  9 16:43:46 1995  William Perry  <address@hidden>
+
+
+Mon May  8 21:45:28 1995  William Perry  <address@hidden>
+
+* w3-emacs.el:
+Fix from Michael Welsh Duggan <address@hidden> for w3-back-link
+in emacs 18
+
+* dist.Makefile: Added ssl.el file
+
+* w3-draw.el:
+Fixed problem with <br> in indented areas inserting the indentation twice
+
+* docomp.el: Turn off new emacs19 dynamic loading gunk
+
+Sun May  7 23:33:18 1995  William Perry  <address@hidden>
+
+
+* w3-style.el: Few fixed for XEmacs 19.12
+
+* w3-style.el: More style hackings
+
+* w3-parse.el:
+Gracefully handles stuff like '< ' in a document - this should be
+shown.  Screw document authors that do stuff like '< a' - its wrong.
+
+* w3.el: Make w3-mark-link-as-followed be a no-op if w3-emacs19-hack-faces-p is
+non-nil, otherwise weird things happen with too many spaces inserted
+in the buffer, and there was really no difference between the two
+renderings in that nasty mode anyway.
+
+* w3-xemac.el: Fixed typo in spiffy new menus for xemacs 19.12
+
+* w3.el: Let w3-notify-when-ready deal gracefully with a null argument
+
+* w3-draw.el: Make </pre> without matching <pre> act like <p>
+
+* w3-draw.el: Added the <flame> tag
+
+* RelNotes2.2: Initial revision
+
+* w3-draw.el: Only set w3-last-tag if non-text
+
+* w3-draw.el: Reverted to old <dt> handling - looks better.
+
+* w3-about.el: Removed a few dependencies on the old 'b64-xxxx' functions
+
+* w3-style.el:
+New stylesheet parser - can handle the new grammar agreed upon by
+H&kon and I.
+
+* dist.Makefile: Added new base64 package
+
+Sat May  6 21:46:21 1995  William Perry  <address@hidden>
+
+
+* w3-xemac.el: Now puts help-echo property on images that are links
+
+* w3.el: Now includes a mime-version header for mailed documents
+
+
+* w3-emacs.el: New version of w3-forward-link and w3-back-link that skip over
+'w3-graphic zones.
+
+* w3-draw.el: <tab id=xxx> and <tab to=xxx> work now
+
+* w3.el: Fixed problem with command-line-args-left being unbound when not in
+startup phase
+
+
+* w3-draw.el: New way to handle secrets fixed in old versions of emacs.
+Default background pixmap to nil
+
+* w3-about.el: New text for easter egg tag #1
+
+* w3-xemac.el: Image-type selector menu is back.
+
+
+* w3-xemac.el:
+Changed mouse activation for image links to button2 to be consistent
+
+* w3.txi: Few spelling changes
+
+Fri May  5 23:05:39 1995  William Perry  <address@hidden>
+
+* w3.el: Can now do:
+emacs -f w3-fetch [url]
+
+* w3.el: Can now have 'PUT' as the method for a form.
+
+* w3-xemac.el: Return the bitmap
+
+* w3-draw.el: Now handles the 'background' bitmap tag of netscape
+
+* w3-vars.el, w3-draw.el: Few changes to make the 'secret' tag work better.
+
+
+* w3-xemac.el: Reordering of defvars to make sure we can get a clean compile
+
+* w3-xemac.el: Use glyph-width if its available.
+
+
+* w3-draw.el: Netscape body tags would choke emacs18
+
+* w3.el: Do w3-setup in w3-batch-fetch
+
+
+* w3.el:
+w3-save-as can now take an optional argument to tell it what to save as
+
+Thu May  4 23:58:53 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: Cool new menus for XEmacs
+
+* w3-draw.el: Fixed bug in handling of multiple <dt> elements before a <dd>
+
+Mon May  1 20:10:36 1995  William Perry  <address@hidden>
+
+* w3-e19.el, w3-vars.el: Use the new about: pages
+
+* w3-draw.el: Fixed <link rel="stylesheet" href="xxxx"> handling
+
+* w3-style.el: fixed style handling from a URL/href
+
+Sun Apr 30 20:57:17 1995  William Perry  <address@hidden>
+
+
+* w3-xemac.el: New glyph interface for XEmacs 19.12
+
+* w3-about.el: More about: docs.
+
+* w3-epoch.el, w3-draw.el: More fixes for epoch
+
+* w3.el: Fixed links of just images in XEmacs
+
+Sat Apr 29 22:25:33 1995  William Perry  <address@hidden>
+
+* docomp.el, w3-epoch.el, w3-draw.el: More epoch fixes
+
+* w3-draw.el: The netscape background/foreground body colors work in epoch now.
+
+* w3-epoch.el: All the face stuff now works in epoch again.
+
+* w3-parse.el: Use w3-10646 if available
+
+
+* w3-10646.el: New keywords
+
+* w3-10646.el: Initial revision
+
+Fri Apr 28 22:52:46 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Implemented teh 'add.before' and 'add.after' stylesheet mechanism
+
+* w3.el: Fixed case where return would pop up an x-menu in emacs19
+
+* w3-style.el: Fixed problem with leading whitespace
+
+* w3.el: Added about URL handling
+
+* w3-draw.el: Fix to jnetscape body tags
+
+* w3-about.el: Initial revision
+
+
+Thu Apr 27 01:40:39 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Few updates for XEmacs 19.12
+
+Wed Apr 26 17:59:03 1995  William Perry  <address@hidden>
+
+
+Tue Apr 25 22:15:55 1995  William Perry  <address@hidden>
+
+* w3.el: w3-in-assoc now silently skips nonstrings in the car
+
+* w3-draw.el: Can now use regexps in stylesheets (h[1-6], etc)
+
+* w3-style.el: Added DSSSL-lite parser
+
+
+* w3-draw.el: Now handle <link rel=stylesheet href=xxxx>
+
+* w3-style.el: Modify the accept headers when retrieving a URL for a stylesheet
+
+Mon Apr 24 07:52:37 1995  William Perry  <address@hidden>
+
+* w3-print.el: Wrap w3-convert-html-to-latex in case-fold-search == t
+
+* w3-vars.el: Added w3-node-style and w3-visited-node-style to the persistent
+variables list - this is necessary for letting
+w3-mark-link-as-followed to work with the netscape body tags.
+
+* w3-vars.el: Make w3-node-style and w3-visited-node-style buffer-local, or the
+netscape tags on <body> screw up subsequent documents!
+
+* w3-parse.el: Removed a condition-case in w3-nuke-entities-in-region
+
+* w3-xemac.el: Few more toolbar fixes.
+Fixed autoload for Info-goto-node
+
+Sun Apr 23 22:01:08 1995  William Perry  <address@hidden>
+
+* w3.el: Fixed w3-backward-in-history
+
+* w3-style.el:
+New function w3-create-x-font to create a font based on the family,
+style, and size.
+
+* w3-xemac.el:
+New variable w3-toolbar-orientation to control what side of the frame
+the toolbar appears on.
+
+* w3-draw.el: New way of getting info from stylesheets to synch up with the new
+stuff from H&kon.
+
+* w3-xemac.el: Added button for hotlists in the toolbar
+
+* w3-xemac.el: Various and sundry toolbar stuff.
+
+* dist.Makefile: Now makes the install directory if it doesn't exist.
+
+* w3-draw.el: <blink> now works on tty's in XEmacs.
+Scaling of fonts in a tty-only XEmacs works also.
+
+Sat Apr 22 13:42:25 1995  William Perry  <address@hidden>
+
+* w3-print.el, w3.el, w3.txi: Changed references to info.cern.ch to w3.org
+
+
+Fri Apr 21 19:34:47 1995  William Perry  <address@hidden>
+
+* w3.el: Removed a few old variables
+
+* w3-draw.el:
+Don't set attributes on default face if they are nil - bad things man.
+
+* w3-epoch.el, w3-e19.el, w3-wemac.el: Removed a few old variables
+
+* w3-xemac.el:
+Finally fixed problem in lemacs/xemacs form entry where every once in
+a while it would choke with a 'wrong-type-argument stringp (wierd
+list)' error.
+
+* w3-draw.el: Fixed problem with the <body> attributes when in Emacs 19
+
+* w3-vars.el, w3-draw.el:
+New variable w3-user-colors-take-preference to control whether the
+netscape tags on <body> are honored or not.
+
+* w3-xemac.el: Provide a definition of add-submenu for older XEmacsen
+
+* w3.el, w3-vars.el: Removed a few old variables
+
+* w3-draw.el: Now honor the netscape attributes on <body>
+
+* w3-vars.el: Added keybinding for w3-mail-document-author
+
+* w3-beta.el: Reimplemented the w3-show-headers stuff.
+
+Thu Apr 20 20:23:06 1995  William Perry  <address@hidden>
+
+* w3.el: w3-document-information now looks much prettier
+
+* w3.el: Fixed w3-mail-to-author and Renamed it to w3-mail-document-author to
+avoid confusion about what 'author' we are mailing to - the documents,
+or Emacs-w3's
+
+
+* w3.el: Revamped the forward and backward history handling
+
+* w3-draw.el: Got <p nowrap> working
+
+Wed Apr 19 17:01:58 1995  William Perry  <address@hidden>
+
+
+* clean-cache: Initial revision
+
+* w3.el: Revamped how <link> is handled.  Added printing of <link> data in
+w3-document-information
+
+* w3-draw.el:
+Revamped how <link> is handled.  Fixed a bug in meta handling - was
+not downcasing the http-equiv, so it could not always find an old
+value in url-current-mime-headers to replace.
+
+* w3-vars.el: changed w3-list-chars-assoc to use symbols instead of strings
+
+* w3.txi: Documented change in w3-list-chars-assoc
+
+* w3-draw.el: Converting w3-list-chars-assoc won't die if you do it twice
+
+* w3-sysdp.el: Updated to latest version from XEmacs
+
+* w3-sysdp.el: Removed keywords
+
+Sun Apr 16 22:41:11 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed problem in w3-handle-emphasis-end
+
+* w3-draw.el: Added code to fixup spaces are . and !
+
+* w3-beta.el: Now parses out the link commands in the mime headers
+
+* w3.el: Issue an error if they chose a link type (rel or rev) that the
+document did not contain when in w3-use-links
+
+* w3-style.el:
+Make the buffer not modified before killing it when parsing a style sheet
+
+* w3.el: Fixed parsing of default stylesheet
+
+* w3.el: Fix for form field reversals in submissions
+
+Sat Apr 15 23:33:36 1995  William Perry  <address@hidden>
+
+* w3-beta.el: Can now import netscape bookmark files
+
+* w3-draw.el:
+Now handles <q></q> differently - inserts "" around the material, and
+you can specify the start and end quotes in stylesheets with:
+q: startquote=``
+q: endquote=''
+
+* w3-draw.el:
+Was not expanding relative URLs before checking whether they had been
+visited with w3-delimit-links non-nil.  This would lead to weird
+looking links like [[something}} - not very pretty.
+
+* w3-vars.el, w3.el: Now reads in a default stylesheet for the user if
+w3-default-stylesheet is non-nil.  This can be a URL.
+
+
+* w3.el: Made w3-pass-to-viewer be more like man when in asynchronous mode.
+
+* w3-vars.el: New variable w3-notify
+
+* w3-parse.el:
+Fixed problem in pre/xmp handling where it would choke if there were
+extra endtags and swallow-newlines went negative.
+
+Fri Apr 14 23:52:51 1995  William Perry  <address@hidden>
+
+* w3.el, w3-xemac.el, w3-wemac.el, w3-vars.el, w3-style.el, w3-srch.el, 
w3-print.el, w3-parse.el, w3-next.el, w3-mule.el, w3-mac.el, w3-epoch.el, 
w3-emacs.el, w3-e19.el, w3-draw.el, w3-beta.el:
+Changed keywords
+
+* w3-vars.el: removed old variable w3-global-history-completion-list
+
+
+* w3-draw.el: No inherent maxlength on <textarea> fields
+
+* w3.el: Added alias for w3-popup-info
+
+* w3.el: Always goto (point-min) in w3-document-information and w3-popup-info
+
+* w3-vars.el: Added keybindings for w3-document-information and w3-popup-info
+
+Thu Apr 13 21:12:33 1995  William Perry  <address@hidden>
+
+
+* w3-style.el: w3-blend-colors now works in XEmacs 19.12
+
+* w3-style.el: Added function w3-blend-colors (FSF Emacs-19 specific)
+
+* w3-parse.el:
+Make sure to clear the minibuffer when done parsing - otherwise it
+could leave a 'Parsed x of y (zz%)' message, which can make people
+think it is hung.
+
+* w3-draw.el, w3.el: Fixed <link> handling
+
+Wed Apr 12 03:24:02 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Fixed a few problems with stylesheets losing the alignment info from
+headers too soon.
+
+* w3-draw.el:
+<p></p>, <div></div>, and <note></note> can all specify the face to
+use for an element via the 'class' attribute.
+
+* w3-draw.el: Fixed a bug in using the 'class' attribute to add faces to text.
+Would forget what tag would end the current face, so faces went on
+forever.  Ugh!
+
+* w3-draw.el: The 'class' attribute can now be used to add faces to text.
+
+* w3-style.el: Changed how style sheet faces are regenerated.  Now stores the
+face-name as an item in w3-current-stylehseet (assoc "face" ...) to
+get it.
+
+Tue Apr 11 23:11:58 1995  William Perry  <address@hidden>
+
+* w3-sysdp.el: Added some more stuff from chuck
+
+* w3-draw.el: Fixed popping the alignment from an address tag if
+w3-right-justify-address is non-nil
+
+* w3-draw.el: Redid w3-get-default-style-info macro
+
+
+Mon Apr 10 22:46:14 1995  William Perry  <address@hidden>
+
+
+* w3-draw.el: Added thge marca sound for <hype> tag.
+
+* w3-draw.el: Now honors the 'class' attribute on any style-sheetable tag
+
+* w3-style.el:
+Few tweaks to how the style sheet is stored, to make using the 'class'
+attribute on tags quicker (stores an intern'd symbol and a string in
+the list)
+
+* w3.el: Fixed problem where inlined images on the local disk could get trashed
+because buffer-file-name was not nil in the buffer.
+
+
+* w3-draw.el: Fixed <font size=-x> handling
+
+* w3-parse.el: Call sera-to-fidel-marker if in mule.
+
+Sun Apr  9 18:37:24 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed <div> </div> handling
+
+* w3-draw.el:
+Use copy-tree on w3-use-stylesheet so we don't side-effect the original list
+
+
+* w3-xemac.el: Added in the code to create the toolbar.
+
+* w3-beta.el: Fixed the importing of netscape cache files
+
+
+* w3-draw.el:
+Changed w3-push-alignment to be a little smarter - if align is null,
+don't bother pushing it on the stack.
+
+* w3-parse.el:
+Fixed a spacing problem that would show up when doing progressive
+rendering but not a w3-refresh-buffer.  Ugh.
+
+
+Sat Apr  8 23:34:06 1995  William Perry  <address@hidden>
+
+* w3.el: Made w3-generate-error check the contents of the ' *url-error*' buffer
+and use it as part of the error message.
+
+* w3-draw.el:
+Got rid of bad use of concat in w3-handle-font, and better handling of
+the font scaling.
+
+Fri Apr  7 22:59:07 1995  William Perry  <address@hidden>
+
+
+* w3-e19.el: Remove the files menu in emacs 19.29
+
+* w3.el: Fixed problem in mule with w3-save-binary-file
+
+* dist.Makefile: Added -no-site-file to BATCHFLAGS
+
+* dist.Makefile: More renaming for DOS lossage
+
+Wed Apr  5 19:59:33 1995  William Perry  <address@hidden>
+
+* w3.el: Fixed w3-fetch for working in buffers with no default url... d'ohhh
+
+
+* w3-draw.el:
+Fixed screwup in w3-handle-p that would push an alignment onto the
+stack twice for headers
+
+* w3.el: w3-fetch now has a 'silent' default - it doesn't insert the default as
+the default option - it checks if the user presses return, and uses
+the default if they did.
+
+* w3-draw.el: Now uses a stack of alignments, and honors the <div></div> tag.
+
+Tue Apr  4 17:29:32 1995  William Perry  <address@hidden>
+
+* dist.Makefile: Makefile now works in Windows and NT
+
+* w3.el: Removed anonymous lambda from w3-hotlist-apropos
+
+* w3.txi: Fixed typo in texinfo node
+
+Mon Apr  3 23:03:19 1995  William Perry  <address@hidden>
+
+
+* hype.au: Initial revision
+
+Sun Apr  2 20:17:02 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed <meta> handling
+
+* w3.el: Fixed w3-popup-info
+
+
+* w3.txi: Basic documentation of the style sheet mechanism
+
+* w3-draw.el:
+Fixed the align=indent problem where first line of the indented region
+was not indented.
+
+* dist.Makefile: Renamed w3.texinfo to w3.txi, for 8.3 losingness
+
+
+* w3.txi: Removed all the 'WORK' areas except for the non-unix systems nodes.
+Put out a call for assistance to w3-beta and gnu-emacs-help for these
+areas.
+
+Tue Mar 28 23:36:30 1995  William Perry  <address@hidden>
+
+* w3.el: Fixed a few more concat'ing integer problems
+
+* w3-draw.el: Can now specify OL styles in stylesheets.
+
+
+* w3.el:
+Added w3-hotlist-apropos function from address@hidden (Michelangelo Grigni)
+
+* w3-xemac.el, w3-e19.el: Fixed concat'ing of ints
+
+Mon Mar 27 22:05:19 1995  William Perry  <address@hidden>
+
+* w3.el: Now requires w3-print
+
+* w3-draw.el: Only mangle headers if w3-delimit-emphasis is non-nil
+
+
+Sun Mar 26 19:50:16 1995  William Perry  <address@hidden>
+
+
+* dist.Makefile: Removed w3-main from the distribution - renamed to w3
+
+* w3.el: Moved w3-upcase-region into w3-draw.
+Now requires w3-style and all the new dipslay engine chunks.
+
+* w3-draw.el:
+Now initializes the current stylesheet to the user stylesheet before
+any drawing starts.
+
+* w3-vars.el:
+Made w3-header-chars-assoc work with the new display engine (mostly),
+and added a few more things to the state variables.
+
+* w3-style.el:
+Can now do font scaling in style sheets.  smarter about font.type.
+Only thing left is font.family
+
+
+* docomp.el: More var decls.
+
+* w3-wemac.el: Fixed w3-mouse-handler for windows
+
+* w3-draw.el:
+Make all face storage variables buffer-local for style-sheet stuff.
+
+* w3-style.el: Now handles fonts/colors in style sheets - whooo hooo!
+
+Sat Mar 25 23:38:49 1995  William Perry  <address@hidden>
+
+* w3-vars.el: Renamed w3-state-garbage-variable
+
+* w3-draw.el:
+Now uses style sheets to find alignment and width for the various tags
+before falling back on its defaults.
+
+
+* w3-parse.el:
+Fix for stupid people who don't use &amp; instead of & in the middle
+of a doc.
+
+
+* w3-xemac.el: Added w3-center-spaces and w3-right-spaces for
+centering/right-justifying pixmaps
+
+* w3-xemac.el, w3-sysdp.el:
+A few new functions for the latest and greatest beta
+
+* w3-vars.el: Changed a few of the menu names
+
+* w3-style.el: Now actually parses and stores the style sheet information
+
+* w3-draw.el: Handle case where tag is a list
+
+Fri Mar 24 14:36:09 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: Now uses device-type for XEmacs 19.12
+
+Wed Mar 22 21:14:30 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed a few spacing problems
+
+* w3-e19.el:
+Fixed w3-forward-link for links that were right up on top of each other.
+
+* w3-parse.el:
+Fixed screwup with unterminated quoted chars in attribute/value pairs
+
+
+* dist.Makefile: Removed w3-old
+
+* w3-draw.el: Fixed stupid typo when checking for faces.  d'ohhhh!
+
+Mon Mar 20 23:23:34 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: Fixed problem with w3-extend-zone and detached extents
+
+* w3-draw.el: <option selected> now works again
+
+
+* w3-xemac.el:
+Set the help-echo property when showing form elements if possible.
+
+* w3-vars.el, w3-beta.el, w3-draw.el:
+Redid how state is kept - now uses a vector, which should be faster,
+and is able to be buffer-local.
+
+* w3-parse.el:
+w3-nuke-entities-in-region should no longer choke in odd circumstances
+with just '&' in a document.
+
+* dist.Makefile: Removed w3-forms - it has been assimilated
+
+* dist.Makefile: Added a few new dependencies
+
+
+* w3-draw.el: Added message when scaling fonts, just to keep the user informed
+
+* w3-wemac.el, w3-xemac.el, w3-e19.el:
+When moving the mouse over a submit button in a form, shows where the
+form will be submitted.
+
+* w3-draw.el: Fixed emacs-18 lossage in skip-chars-backward
+
+* w3-draw.el: Another fix to make sure <li><p> construct doesn't look like crap
+
+* w3-draw.el:
+Split the handling of the refresh header out into its own function so
+that it can be used from the drawing/parsing code for META commands
+
+Sun Mar 19 02:12:24 1995  William Perry  <address@hidden>
+
+* w3-parse.el: Fixed problem with window focus.
+
+* w3.el: Few fixes for passing to viewers
+
+* w3-parse.el: Set fill-column in w3-preparse-document
+
+Sat Mar 18 23:47:37 1995  William Perry  <address@hidden>
+
+* w3-parse.el: If parsing, do incremental display as well
+
+* w3-draw.el: Removed ugly hacks from w3-pause for emacs19 - just too ugly.
+
+
+* dist.Makefile, docomp.el:
+Take LISPDIR on the command line for hack-emacs-file
+
+* dist.Makefile: Removed EMACSTEMPLATE
+
+* dist.Makefile, docomp.el: hack-dot-emacs now takes a command line argument
+
+* w3-draw.el: links in tty mode won't show [[/{{
+
+* w3-vars.el: All graphical entities now have textual alternativs
+
+* w3-draw.el: Added graphic entities back in.
+
+* w3-draw.el: Able to embed a few more types
+
+* w3-parse.el, w3-draw.el: Added the base functionality for the embed tag
+
+Fri Mar 17 15:44:16 1995  William Perry  <address@hidden>
+
+* dist.Makefile: Removed some old targets, added new ones for new files
+
+* w3-style.el: Initial revision
+
+
+* w3-parse.el: Special handling for the <style> argument.
+
+* w3-vars.el, w3-draw.el: Moved variables into w3-vars.el
+
+* w3-parse.el, w3-draw.el: Basis for the <style></style> notation done
+
+Thu Mar 16 19:44:12 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Fixed scaling of fonts, now handles cryptopt blocks for secure-http
+
+
+* w3-draw.el:
+Now no whitespace between link delimiters and the actual text of the link
+
+
+* dist.Makefile: Added md5 target
+
+* w3-parse.el, w3-draw.el, w3-beta.el:
+Now draws each signel item as it is parsed..
+
+Wed Mar 15 23:27:55 1995  William Perry  <address@hidden>
+
+
+* w3.el: Fixed a problem in w3-pass-to-viewer
+
+* w3-draw.el:
+Fixed problem with headers being hosed because of new way to do faces.
+
+* w3-draw.el, w3-xemac.el: Imagemaps work now
+
+Tue Mar 14 16:04:04 1995  William Perry  <address@hidden>
+
+
+* w3-draw.el: A few general performance increases
+
+Mon Mar 13 05:51:41 1995  William Perry  <address@hidden>
+
+* w3-beta.el, w3-draw.el, w3-e19.el, w3-mac.el, w3-next.el, w3-old.el, 
w3-vars.el, w3-xemac.el:
+Lots and lots of doc fixes to meet FSF/GNU guidelines.
+
+* w3-parse.el, w3.el, w3-e19.el, w3-draw.el: Few doc string fixes
+
+
+* w3-vars.el, w3.el:
+Now guess the value of w3-color-use-reducing based on values of
+x-display-visual-class and x-display-planes.
+
+* w3-draw.el:
+Fixed problem with indenting being lost in a list item after a sublist
+terminates.
+
+* w3-draw.el: Redid some of the font stuff.
+
+Sun Mar 12 17:31:59 1995  William Perry  <address@hidden>
+
+
+* w3-draw.el: Some basic table-drawing support put in.
+
+* w3-tables.el: Initial revision
+
+* w3.txi: Use active voice in keybinding descriptions.
+
+Sat Mar 11 22:20:21 1995  William Perry  <address@hidden>
+
+* w3-draw.el: More state kept - ugh.
+
+* w3-forms.el:
+Removed dependence on STREAM being defined - will make going totally asynch 
much easier
+
+* w3-vars.el, w3-parse.el, w3.el, w3-emacs.el: Removed 'backslashitis'
+
+* w3-e19.el: Removed a few unused variables
+
+* w3-draw.el: Optimized face stuff.
+
+* w3-beta.el: Removed 'backslashitis'
+
+* w3-vars.el, w3-e19.el: Change to the popup menu
+
+* w3-draw.el: Few fixes for blinking and wired text
+
+Fri Mar 10 23:18:30 1995  William Perry  <address@hidden>
+
+* w3-draw.el, w3-xemac.el: Fixed images as linkx
+
+
+* w3-draw.el: Fixed <br> in <dl> after a <dt> being indented too far
+
+* w3-draw.el: Fixed <br> in <ol> not being indented enough
+
+* w3-old.el: Now provides itself
+
+* w3-draw.el: New variable to turn off incremental display.
+
+* w3-draw.el: Does not display <certs> elements now.
+
+Thu Mar  9 20:35:12 1995  William Perry  <address@hidden>
+
+* w3-xemac.el, w3-epoch.el, w3-e19.el:
+Don't make so many faces if using the new display engine - we don't
+need any of the w3-xxxx-style ones.
+
+* w3-beta.el:
+Nuke w3-delayed-images and w3-delayed-movies in w3-refresh-buffer, or
+multiple images would get loaded!
+
+* w3-draw.el: Avoid calling w3-pause as often - speeds up redisplay a lot.
+
+* dist.Makefile:
+No longer byte-compile w3-sysdp - was causing too many problems.
+
+* w3-beta.el:
+No longer (goto-char (point-min)) in w3-show-buffer so that movement
+done while drawing is still honored.
+
+* w3-draw.el: Added a save-excursion around the last handle-paragraph so that
+movement done while drawing is still honored.
+
+* w3-xemac.el:
+Use copy-tree when available for menu copying - much more reliable
+
+* w3-mac.el: Added a provide for w3-mac
+
+* w3-xemac.el: Fixed problem with extents becoming detached in 19.12
+
+* w3-forms.el: Few forms fixes.
+
+* w3-beta.el: Added w3-install-latest from address@hidden
+
+* w3-beta.el: Fixed MCOM->netscape stuff.
+
+* w3-forms.el: Fixed misplaced parentheses
+
+Mon Mar  6 23:29:59 1995  William Perry  <address@hidden>
+
+
+Sat Mar  4 15:33:08 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Now handles images like in the old display engine if not in XEmacs/Lucid
+
+* w3-e19.el: Only create air hotlist menu if w3-air-hotlists is non-nil
+
+Fri Mar  3 16:01:38 1995  William Perry  <address@hidden>
+
+
+Thu Mar  2 15:50:57 1995  William Perry  <address@hidden>
+
+* w3.el: Run w3-add-hotlist-menu first time a hotlist is loaded in.
+
+* w3-e19.el: Let w3-add-hotlist-menu run even if not in w3-mode
+
+Wed Mar  1 16:22:46 1995  William Perry  <address@hidden>
+
+* w3-sysdp.el: Removed function call causing problems
+
+* w3-xemac.el: Don't load pictures if current frame is on a tty
+
+* w3-draw.el: Added back in a call to mule-attribute-zones
+
+* w3-parse.el:
+Don't nuke the windows chars for quote and trademark when in MULE
+
+Sun Feb 26 19:17:38 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Removed message about 'unknown tag <%s> skipped' - was causing
+confusion for some people.
+
+
+* W3.ad: Initial revision
+
+Sat Feb 25 23:53:08 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed incremental display in emacs 18.xx
+
+* w3-draw.el: Fixed paragraph spacing problem.
+
+* dist.Makefile: Made beta display engine the default.
+
+* w3.el: Removed LCD archive entry, moved into w3.el
+
+* w3-wemac.el: Various fixes for new display engine into WinEmacs
+
+* w3-vars.el: Don't die if cannot load 'annotations'
+
+* w3-sysdp.el:
+Removed anonymous lambda without 'function' wrapper for WinEmacs and
+early versoins of lucid emacs.
+
+* w3-srch.el: Provide w3-srch
+
+* w3.el: Changed _W3 on dos machines to W3.INI
+New function w3-force-reload-document to reload even if in standalone mode
+Added a default for w3-complete-link
+Provide w3-main
+
+* w3-draw.el:
+Defvard w3-last-fill-pos and w3-last-tag to better facilitate drawing
+in 2 buffers at once.
+Fixes for messed up percentages in WinEmacs/XEmacs < 19.12
+Fixed <br> and <p> in blockquotes and align=indent
+
+Mon Feb 20 04:54:30 1995  William Perry  <address@hidden>
+
+* w3.el, w3-vars.el: Removed w3-color-planes and w3-color-display variables.
+
+* w3-vars.el, w3.el: New variables w3-netscape-configuration-file and
+w3-use-netscape-configuration-file, for whether to parse and honor the
+options in a Netscape/X style configuration file.
+
+Sun Feb 19 22:27:00 1995  William Perry  <address@hidden>
+
+* w3-xemac.el: Don't change menubar if current-menubar is nil.
+
+* w3.el: Now shows whether you are using the beta version in the bug reports
+
+
+* w3-draw.el, w3-parse.el, w3-print.el, w3.el:
+Removed references to w3-working-buffer
+
+Sat Feb 18 19:51:53 1995  William Perry  <address@hidden>
+
+* docomp.el: Reworked the autoloads/defvars
+
+* dist.Makefile: Removed w3-lemac.el
+
+* w3.el, w3-draw.el, w3-vars.el:
+Removed variable w3-running-lemacs, since w3 now uses sysdep.el for
+[XL]emacs, so there is no distinction between lemacs and xemacs
+
+* w3-e19.el: Fixed problem with unquoted lambda in w3-e19-options-menu
+
+* w3-xemac.el:
+This version should theoretically work with lemacs and xemacs both
+
+* w3-draw.el: Fixed incremental display in xemacs.
+
+* w3-sysdp.el: Initial revision
+
+Thu Feb 16 15:58:44 1995  William Perry  <address@hidden>
+
+* w3.el: Changed messaging of viewer - would barf on undefined escape sequences
+in crufty mailcap-related stuff.
+
+Sun Feb 12 23:09:40 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Better event handling while drawing HTML
+
+* w3-beta.el: Fixed personal annotations.
+
+* w3-draw.el: Removed proclaim-inline calls.
+
+
+* w3.txi: Added docs for new 'label' and 'textalign' attributes of <hr>
+
+* w3-e19.el:
+Fixed problem in emacs 19 with mouse-selecting a link would sometimes
+say there was not a link, but selecting it with 'return' would work.
+Now both work.
+
+* w3-parse.el: fixed problems with entity-resolution in attribute values.
+
+* w3-draw.el:
+More spacing stuff, added 'label' and 'textalign' attributes to <hr>
+
+* w3-forms.el: Remove spaces at beginning of options.
+
+Sat Feb 11 22:10:46 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+Removed dependence on 'stream' from title handling.  This will make it
+easier to do totally streamed drawing, RSN.
+
+* w3-draw.el: Fixed more spacing problems.
+
+* w3-parse.el, w3-draw.el:
+Fixed various spacing bugs - seem to be all gone now!!!!
+
+* w3-vars.el: New function to read a netscape-style configuration file.
+
+* w3-parse.el: w3-nuke-entities-in-region can now accept null args.
+
+
+* w3-beta.el: New function to read a netscape-style configuration file.
+
+Fri Feb 10 06:19:26 1995  William Perry  <address@hidden>
+
+
+Tue Feb  7 15:51:23 1995  William Perry  <address@hidden>
+
+* w3-e19.el:
+Removed the file-name-handler-alist, to put it in url.el where it belongs.
+
+* w3.el:
+Finding the source of a url that is already in a buffer should work now.
+
+* w3-draw.el, w3-beta.el:
+Now will always get a 'completed' message when drawing/imaging.
+
+Mon Feb  6 02:13:31 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fix for emacs 18
+
+* w3-forms.el, w3-parse.el:
+Optimized the calling of w3-nuke-entities-in-region.  Parsing _much_
+faster, drawing only slightly slower, so its a win.
+
+* w3-draw.el: Semi-incremental display now works in all emacsen, and recognizes
+scroll-up and C-c to interrupt.
+
+* w3-draw.el: Fixed plaintext handling.
+
+Sun Feb  5 23:41:28 1995  William Perry  <address@hidden>
+
+
+* w3-e19.el, w3-vars.el: Fixed view menu.
+
+* w3-vars.el, w3.el:
+Let w3-color-filter be a string, for people brave enough to want to
+set it themselves.
+
+* w3-epoch.el: Now works with new display engine.
+
+* w3-draw.el: Few problems for epoch fixed, <br> in <dl> looks right now.
+
+* w3-draw.el: Reimplemented w3-link-delimiter-info
+
+* w3-draw.el: Re-implemented the 'linkname value of w3-delimit-emphasis
+
+
+* dist.Makefile:
+Removed hack to change w3.texinfo on the fly when creating info file.
+
+Sat Feb  4 18:11:14 1995  William Perry  <address@hidden>
+
+* w3.el: Removed setting of default-directory because it causes call-process to
+die a hideous death and not let you do anything like M-| lpr in the
+source buffers.
+
+
+* w3.el: Replaced w3-confirmation-func with url-confirmation-func
+
+Fri Feb  3 13:42:35 1995  William Perry  <address@hidden>
+
+* w3-draw.el:
+fixed insertion of w3-link-end-delimiter - was always inserting the
+'not visited' part.c
+
+Tue Jan 31 20:45:19 1995  William Perry  <address@hidden>
+
+* w3-e19.el: Right-mouse-menu now works
+
+Mon Jan 30 04:52:26 1995  William Perry  <address@hidden>
+
+* w3.txi: Added non-unix OS sections.  Need to flesh them out more.
+
+Sun Jan 29 22:15:48 1995  William Perry  <address@hidden>
+
+* w3-vars.el: Added w3-style-tags-assoc
+
+* w3-draw.el, w3-vars.el:
+Added new variable w3-right-justify-address to control whether
+text within an <address> tag is right justified.  Defaults to t.
+
+* w3-vars.el: Few new variables for fsf19
+
+* w3.el: Removed special cases for fsf19 to use the old lmenu package.
+
+* w3-e19.el: No longer needs the lmenu package.
+
+* w3-draw.el: Fixed typo
+
+* w3-epoch.el: Made all arguments to w3-make-face optional.
+
+* w3-draw.el: Few more fixes for epoch.  No longer have to remove \n\n, so
+incremental display looks better.  w3-delimit-emphasis now works in
+the new display engine.
+
+
+* w3.txi: Lots of cleanup work, addition of netscape extensions, new HTML 3.0
+stuff, variable name changes, xresource changes, all for the new
+display engine.
+
+Sat Jan 28 23:07:36 1995  William Perry  <address@hidden>
+
+* w3.el: Deal with url-get-url-at-point possibly returning nil.
+
+* w3-epoch.el: Got rid of error in new display engine.
+
+* w3-draw.el: w3-draw.el will now compile with emacs 18 again - the incremental
+display was messing it up.
+
+* w3-beta.el, w3-draw.el, w3-e19.el, w3-emacs.el, w3-epoch.el, w3-forms.el, 
w3-lemac.el, w3-mac.el, w3-mule.el, w3-next.el, w3-old.el, w3-parse.el, 
w3-print.el, w3-srch.el, w3-vars.el, w3-wemac.el, w3-xemac.el, w3.el:
+Added headers for finder package
+
+* w3-draw.el: Make sure w3-link-end-delimiter is never on a line by itself
+
+Thu Jan 26 04:56:42 1995  William Perry  <address@hidden>
+
+* w3-vars.el:
+moved w3-mule-retrieval-coding-system to url-mule-retrieval-coding-system
+
+Wed Jan 25 15:38:50 1995  William Perry  <address@hidden>
+
+* w3-beta.el:
+Added definition for (abs x) if none exists (for emacs 18, epoch, compat.)
+
+Mon Jan 23 03:32:40 1995  William Perry  <address@hidden>
+
+* w3.txi: Removed w3-bad-server-alist
+
+Sun Jan 22 21:53:19 1995  William Perry  <address@hidden>
+
+
+* w3-draw.el: Fixed space problems, hopefully for good.
+
+* w3-e19.el: New options item for relying solely on the cache
+
+Sat Jan 21 20:27:22 1995  William Perry  <address@hidden>
+
+* w3.el: Fixed problem where default-directory would sometimes be set to nil -
+bad things man!
+
+* w3-beta.el: replaced all occurances of htmlplus with html
+
+* w3-draw.el:
+Fixed problem with plaintext and embed.  <lit> now acts like <pre>,
+but with no mono-spaced font.  Fixed problem with null titles (empty
+string invalid for buffer name error).  <blink> works on xemacs 19.12
+in tty mode.  Small problem with <pre> segments with whitespace at
+beginning fixed.  A few small hacks to handle some pythia markup.
+
+* w3-e19.el:
+Protect against copying menu-bar-help-menu if in tty mode.  Also no
+longer disable the edit menu when in w3-mode.
+
+* w3-parse.el:
+Fixed problem with plaintext and embed.  <lit> now acts like <pre>,
+but with no mono-spaced font.
+
+* w3.el: replaced all occurances of htmlplus with html
+
+Wed Jan 18 02:31:59 1995  William Perry  <address@hidden>
+
+* w3-parse.el:
+fixed bug in w3-nuke-entities-in-region if nonterminated entity was
+last thing in a buffer (ie: &lt[EOB]);
+
+* w3.el: Remove duplicate links from links-alist when doing a completing-read
+on the links.
+
+Tue Jan 17 13:18:13 1995  William Perry  <address@hidden>
+
+* dist.Makefile: Make install should now copy w3.elc to the dest. directory
+
+Mon Jan 16 03:52:57 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Better handling of faces.
+
+* w3.el: Implemented <input type=file>
+
+Sat Jan 14 22:40:58 1995  William Perry  <address@hidden>
+
+* w3-parse.el: More spacing taken care of
+
+* w3-draw.el: Few fixes to <pre></pre> presentation
+
+Thu Jan 12 15:39:37 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Fixed formatting problem with <dd>
+
+Mon Jan  9 23:20:05 1995  William Perry  <address@hidden>
+
+* w3-print.el: Few fixes for ps-print 1.6 and 1.10
+
+* w3-parse.el: Recognizes the <embed> tag and treats it like XMP for parsing.
+
+
+Sun Jan  8 19:07:28 1995  William Perry  <address@hidden>
+
+* w3-draw.el, w3-emacs.el, w3-parse.el:
+Various changes to make the new display engine work under emacs 18.xx
+
+* docomp.el: more defvars for cleaner compile
+
+* w3-draw.el: Fixed more of the spacing problems
+
+* w3-e19.el:
+Fixed some of the spacing problems when using w3-emacs19-hack-faces-p
+
+* w3.el: Added w3-follow-url-at-point-other-frame
+
+Sat Jan  7 20:29:06 1995  William Perry  <address@hidden>
+
+* w3-parse.el:
+Fix for odd problem where an entity at the very end of a line (or
+flush against the next tag) would get left out of the parse structure.
+Ugh!
+
+* w3.el: Added new variable url-inhibit-uncompression for use when dumping to
+disk - very wasteful to uncompress it, store it in a buffer, then
+recompress when it got written out to disk.  Also changed the file:
+and ftp: handling to use copy-file when w3-dump-to-disk is bound and
+non-nil, so we can hopefully get asynchronous dumping-to-disk done.
+
+* w3-draw.el: More fixes for funky spacing
+
+* w3-old.el, w3-parse.el:
+Remove \r's in <pre> and <xmp> segments, for ugly DOSisms.
+
+Fri Jan  6 18:31:07 1995  William Perry  <address@hidden>
+
+* w3-draw.el, w3-parse.el:
+Can now change the index of an ordered list item (<li value=xxx>0
+
+* w3-print.el:
+w3-print-with-ps-print now works with ps-print 1.6, and uses the headers, etc.
+
+* w3-draw.el, w3-e19.el: Fixed links menu in v19
+Few drawing fixes
+
+Thu Jan  5 20:50:06 1995  William Perry  <address@hidden>
+
+* w3-draw.el: Now does 'lazy' creation of faces... this reduces the memory
+requirements when in X, since a lot of the faces will probably never
+be used.
+
+* w3-parse.el: Fixed weird spacing problem after <font> tags finally.
+
+* w3.el: Make sure that facep is defined in all versions of emacs
+
+* w3-vars.el:
+Changed the mail and print menus to be pull-right for xemacs/lemacs
+
+* w3-e19.el:
+Fixed the links menu to gracefully do nothing if there are no links on
+the page (was giving an 'Empty menu' error)
+
+Mon Jan  2 21:51:34 1995  William Perry  <address@hidden>
+
+* w3-e19.el: changed default of the mouse-face for links
+
+* w3.el: Removed extraneous newline from mail headers
+
+
+* w3-e19.el, w3.el:
+w3-mail-current-document can now take an optional 'format' parameter
+so that the mail menus can be pull-right.  Spiffy, eh?  Also now
+sticks in content-type and content-transfer-encoding headers.
+
+* w3-print.el:
+w3-print-this-url can now take an optional 'format' parameter so that
+the print menus can be pull-right.  Spiffy, eh?
+
+* w3-draw.el: Quicker way of right-justifying something.
+
+* w3.el, w3-beta.el, w3-print.el:
+Moved all the printing code into w3-print.el, and added the postscript
+option.  Changed the makefile to concatenate all the appropriate files
+for the beta or old version, sort of like VM.
+
+
+* w3-draw.el:
+Added <menu> and <dir> tags back in, as well as a few hacks to make
+Jamie Z.'s page look prettier. :)
+
+* w3-beta.el: Fixed importing of netscape cache
+
+* w3-beta.el: Added w3-import-netscape-cache, to convert a netscape-style cache
+directory to the emacs-w3 style.
+
+Sun Jan  1 09:59:25 1995  William Perry  <address@hidden>
+
+* w3-vars.el: Made w3-e19-links-menu buffer-local
+
+* w3-e19.el: Reinstituted the 'Links' submenu.
+
+
+Sat Dec 31 07:13:21 1994  William Perry  <address@hidden>
+
+* w3-parse.el: Various cleanups
+
+* w3.el: w3-mail-to-author now checks for the 'Reply-To' header of an HTTP/1.0
+response before checking the 'link' tags.
+
+Fri Dec 30 17:04:45 1994  William Perry  <address@hidden>
+
+* w3-old.el: Removed use of w3-last to avoid having to use cl.
+
+* w3.el: Added checks to see if url-view-url returned nil instead of file:nil
+Removed definition of w3-last
+
+* w3-draw.el: Fixed <secret> tag.
+
+Thu Dec 29 16:03:40 1994  William Perry  <address@hidden>
+
+* w3-parse.el:
+Added more stuff to get rid of windows-specific character references.
+
+* w3.el, w3-old.el: Moved defadvice stuff to w3-old
+
+* w3-e19.el:
+Totally reworked the menus as emacs19 keymaps.  This speeds them up.
+Also added routines to add AIR Mosaic hotlists to the menus
+automatically.  Works well.  First time through causes a bit of a
+slowdown for lots of hotlists, but this is emacs' problem since it
+needs to scan all the keymaps to create the menu.
+
+* w3-draw.el:
+New variable w3-indent-level to control how many spaces to indent list
+items, blockquotes, etc.  This is necessary so that the user doesn't
+have to change tab-width or tab-stop-list to change this formatting
+(so <pre> segments that use tabs will still be formatted correctly).
+
+Also made </pre> close out all character-level formatting attributes
+ala Arena.
+
+<pre> will also cause a paragraph break - chunks of text before a
+<pre> segment weren't getting filled correctly.
+
+Made <dt> tags cause a paragraph break.  Formatting now looks better,
+and beginning of <dl> list is separated better from the rest of the
+document.
+
+Fixed problem with w3-list-chars-assoc causing an error with the new
+display engine.
+
+Fixed problem where &gt; followed immediately by another tag wasn't
+showing up in the new display.
+
+* w3-beta.el: Added parser for AIR Mosaic style hotlists.
+
+Tue Dec 27 21:24:37 1994  William Perry  <address@hidden>
+
+
+* w3-beta.el, w3-e19.el:
+Added a dropdown history list that shows the last 5 homepages visited
+under the 'Go' menu
+
+* w3.el: Changed the viewer handling so that temp files have a correct filename
+extension (for broken things like Frame that won't read in a file
+without the 'correct' file extension).
+
+Mon Dec 26 18:18:43 1994  William Perry  <address@hidden>
+
+
+* w3-beta.el:
+(New display engine) Fixed bug in the new personal annotations code
+that ws not closing the list.
+
+* w3-forms.el:
+(New display engine) Fixed bug in <select> handling where it would
+never find the correct name.  Also put back in support for <select
+multiple>.
+
+
+* w3-vars.el: Added in all the rest of the entities
+
+* w3-vars.el:
+Fixed problem where reloading of a page would set the 'Referer' field
+of an HTTP/1.0 request to the url of the page being loaded.
+
+
+* w3.el: Changed gopher searches and ask block submissions to use the enctyp
+attribute like other types of searching.  More extensible/easier to
+maintain.
+
+* w3-draw.el, w3-beta.el:
+Personal annotations now work in the new display engine.  Visible
+headers will work soon also.
+
+* w3-beta.el, w3-draw.el, w3-e19.el, w3-emacs.el, w3-epoch.el, w3-forms.el, 
w3-lemac.el, w3-mac.el, w3-mule.el, w3-next.el, w3-old.el, w3-parse.el, 
w3-srch.el, w3-vars.el, w3-wemac.el, w3-xemac.el, w3.el:
+Updated copyright notices for 1995
+
+Sun Dec 25 22:30:16 1994  William Perry  <address@hidden>
+
+* dist.Makefile:
+Renamed w3.el to w3-main.el and create w3.elc from w3-main.elc and
+either w3-beta.elc or w3-old.elc
+
+
+* w3-e19.el, w3-lemac.el, w3-wemac.el, w3-xemac.el, w3.el: More menu changes
+
+* w3-print.el: Initial revision
+
+* w3-beta.el: Changed w3-face-type to return 'both if a face is bold and italic
+
+
+* w3-beta.el: Initial revision
+
+* w3-parse.el, w3-forms.el, w3-draw.el:
+Added provide statements for easier loading
+
+* w3.el: Moved loads of old code into w3-old.el
+
+* dist.Makefile: Added new targets beta and old.
+
+* w3-old.el: Initial revision
+
+* w3-draw.el: Made new display engine honor the w3-list-chars-assoc header.
+
+* w3-vars.el: Moved some old vars out to w3-old.el
+
+Sat Dec 24 20:41:46 1994  William Perry  <address@hidden>
+
+* w3-e19.el: Fixed w3-mouse-handler to work with the new display engine.
+
+Fri Dec 23 22:40:38 1994  William Perry  <address@hidden>
+
+* w3-forms.el, w3.el: Added in handler for <input type=range size="min,max">
+
+
+* w3-draw.el: Added function comments.
+
+* w3-draw.el:
+Rearranged the file a lot, and added support for the named BASE tags
+from HTML 3.0 - pretty cool stuff. :)
+
+Thu Dec 22 23:53:59 1994  William Perry  <address@hidden>
+
+
+* w3-draw.el: Various fixes to the parser to deal with bad html.  Automatically
+include the alt tag for an image if it is a link target, regardless of
+the setting of w3-auto-image-alt.
+
+* w3-parse.el: Various fixes to the parser to deal with bad html
+
+Mon Dec 19 00:30:38 1994  William Perry  <address@hidden>
+
+
+* w3-e19.el: Added 'xterms' as a terminal type.
+
+* w3.el: Changed w3-submit-bug to only send truly useful info.
+
+Sun Dec 18 23:42:30 1994  William Perry  <address@hidden>
+
+* docomp.el: Stifle more warnings in new xemacs
+
+* w3-vars.el, w3.el, w3-draw.el:
+Changed the behavior of w3-auto-image-alt so that it could be a string
+for 'format'.
+
+* docomp.el: Stifle more warnings
+
+* w3-parse.el, w3-draw.el:
+Changed w3-handle-unknown-tag to check if 'w3-handle-<tag>' is
+defined, and if so, to record that function as the handle for that
+tag.  This will cut down on maintenance of the top block of code that
+just does a lot of (put 'w3-formatters 'xxxx 'w3-handle-xxxx).  XMP
+sections will now also work correctly.
+
+* w3-parse.el:
+Now deals with comments properly, and can handle the old (broken)
+comments of Mosaic/X
+
+Fri Dec 16 19:23:35 1994  William Perry  <address@hidden>
+
+* w3-e19.el: More fixes to w3-forward-link
+
+* w3-draw.el: Fixed a few things with faces
+
+Thu Dec 15 23:08:54 1994  William Perry  <address@hidden>
+
+* w3-e19.el: Fixed w3-forward-link to work better with the new display engine.
+
+Wed Dec 14 17:55:30 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed a few problems with forms and the new display engine.
+
+* w3-xemac.el: Name changes (screen->frame)
+
+Tue Dec 13 17:56:45 1994  William Perry  <address@hidden>
+
+* w3-draw.el: Added a few optimizations for the <blink> tag.
+
+* w3-draw.el: Added in creation of 'underline' face if it is not defined.
+
+* w3-forms.el, w3.el:
+Changed the maxlength to being unlimited if unspecified, to conform to
+the new HTML 2.0 spec.
+
+* w3.el: Fixed bug in w3-document-informatino where it was relying on
+url-current-mime-headers when it wasn't guaranteed to be the same.
+
+Mon Dec 12 23:22:21 1994  William Perry  <address@hidden>
+
+* w3-vars.el, w3.el: Added function w3-document-information
+
+* w3-vars.el, w3-wemac.el, w3-xemac.el, w3-e19.el, w3-lemac.el:
+Added new 'view' menu.
+
+* w3.txi: Removed hook for gnus-article-prepare-hook - was corrupting uuencoded
+articles.
+
+
+* w3-xemac.el, w3-lemac.el:
+Fixed problem with image menus if graphic was a link
+
+* w3-epoch.el, w3-lemac.el, w3-xemac.el:
+More stuff to deal with changed names, and crypt++/jka-compr
+
+* w3.el: Fixed big problem in reset buttons on forms.
+
+* w3.el: Now supports the 'action', 'src', and 'prompt' attributes on the
+isindex element.  (new display engine only)
+
+* w3-draw.el: Now supports the 'action', 'src', and 'prompt' attributes on the
+isindex element.
+
+* w3-vars.el: Changed lots of the version variables so that they don't rely on
+having the RCS headers in them.
+
+* w3.el: Changed w3-mode so that if it is called interactively it will act like
+w3-preview-this-buffer.
+
+* w3.el: Changed w3-source-document so that it can reuse source buffers if the
+users wants to.
+
+Sun Dec 11 08:41:52 1994  William Perry  <address@hidden>
+
+
+* w3-draw.el:
+Added in code to scale fonts for <h[1-6]> so they are bigger, etc, if in 
XEmacs/Lemacs
+
+* w3.el: Few changes for asynch mode.
+
+
+Sat Dec 10 01:07:05 1994  William Perry  <address@hidden>
+
+* w3-xemac.el:
+Added some stuff to optimize the echoing of the URL in the minibuffer
+(not so many calls to mode-motion-hook, all done in the mouse-handler
+by using the 'help-echo property).  Is smart enough to notice if
+'help-echo is not defined and still use the old way if necessary.
+Also changed the image code so that it sets the 'detachable property
+so that images won't get nuked if the text they are attached to is
+deleted.
+
+Fri Dec  9 22:34:04 1994  William Perry  <address@hidden>
+
+* w3-draw.el: Few tweaks
+
+* w3-forms.el:
+Fixed problem with other markup (especially other form info) within a <select>.
+
+* w3-parse.el: Added status messages to parsing.
+
+* docomp.el: More vars to get rid of warnings.
+
+Thu Dec  8 21:16:09 1994  William Perry  <address@hidden>
+
+* w3-draw.el: Added in lots of the 'top ten' html tags. :)
+
+* w3-draw.el: Added <blink> stuff, and rewrote the init-state function.
+
+* w3-vars.el: Added w3-do-blinking to control whether <blink> </blink> works
+
+* w3-draw.el: Handle pinhead
+
+Wed Dec  7 15:47:47 1994  William Perry  <address@hidden>
+
+* w3.el: Fixes to wais stuff
+
+* w3-draw.el: Added indenting for blockquote tags.
+
+* w3-epoch.el, w3-wemac.el, w3-lemac.el, w3-xemac.el, w3-emacs.el, w3-e19.el:
+Let w3-back-link and w3-forward-link accept negative arguments and
+call each other if they get one.
+
+Tue Dec  6 22:16:34 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed typo in docs.
+
+* w3.el:
+Fixed w3-source-document so it will issue an error if done in a non-w3 buffer.
+
+* w3-vars.el: Fixed typo in docs.
+
+* w3.el: Patch from Michael Erns (address@hidden) to make
+w3-complete-link act like w3-follow-link when no menu item is
+specified.  That makes it act more like Info mode, and so is more
+intuitive to users used to it.
+
+* w3.el: Now set default-directory when sourcing a document
+
+* w3-forms.el: Added error checking to the <textarea> handling to deal with
+non-terminated textareas.
+
+* w3-forms.el:
+Added error checking to all the forms code to make sure you are within
+a <form> before doing anything.
+
+* w3-draw.el: Added support for the 'fig tag.
+
+* w3-draw.el: Changed how the <title> tag is handled.
+
+
+* w3-draw.el: Added SPRY align tag.
+
+* w3-forms.el: Trimmed lots of crap that is duplicated from w3.el
+
+* w3-draw.el:
+<pre> and <xmp> segments within a list item will now be indented correctly.
+
+* w3-draw.el: Fixed list filling after headers and br's
+
+* w3-draw.el: Few changes to the <hr> handling
+
+* w3.el, w3-draw.el:
+New variable w3-auto-image-alt that controls whether emacs-w3 will
+automatically generate the 'alt' text on an image where it was not
+specified.
+
+
+Mon Dec  5 23:54:51 1994  William Perry  <address@hidden>
+
+
+* w3-draw.el, w3-e19.el, w3-parse.el:
+Misc Changes to get around idiotic font tag
+
+
+* w3-draw.el: Center tag will now override header/paragraph stuff.
+
+* w3-draw.el: More image work.
+
+* w3-parse.el: Fixed problem if a tag was flush against a newline.
+
+* w3-vars.el: Added jpegs as a default inlined image type.
+
+* w3-xemac.el, w3-lemac.el: fixed problem with new parser and xemacs/lemacs
+
+* w3-parse.el: Fixed problem with entities.
+
+* w3-e19.el, w3-srch.el: more name changes
+
+* w3.el: Fixed problem if w3-default-homepage was nil.
+
+* w3-draw.el: <link> tags now work correctly.
+
+Sat Dec  3 23:05:24 1994  William Perry  <address@hidden>
+
+* w3-parse.el: Problem with entities lt and gt fixed a little.
+
+* w3.el: More naming changes.
+
+* w3-draw.el: <select> and <option> tags now work correctly.
+
+* w3-emacs.el: Added a few checks in for the amiga 18.5x emacs.
+
+* w3-forms.el: <select> and <option> tags now work correctly.
+
+* w3-draw.el: Added support for the 'note' tag.
+
+Fri Dec  2 18:05:31 1994  William Perry  <address@hidden>
+
+* w3.el:
+Fixed bug in w3-view-this-url that would message 'nil' in the minibuffer.
+
+* w3-draw.el: Now remembers "id" and "name" attributes on any tag.
+
+* w3-draw.el: Various fixes to painting.
+
+* w3-draw.el, w3-epoch.el, w3-forms.el, w3-parse.el, w3-srch.el:
+More name changes, handling or PRE/XMP
+
+* w3.el: Fixed problem in w3-fetch if url-request-method was nil.
+
+* w3-draw.el: Now correctly handles pre,/pre,xmp,and /xmp
+
+Thu Dec  1 17:21:34 1994  William Perry  <address@hidden>
+
+* w3-draw.el: Added new tags
+
+Wed Nov 30 18:48:41 1994  William Perry  <address@hidden>
+
+* w3-e19.el: Added vt300 to the hack-faces stuff.
+
+Mon Nov 28 17:11:38 1994  William Perry  <address@hidden>
+
+* w3-epoch.el, w3-lemac.el: More misc. name changes
+
+Wed Nov 23 21:12:59 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem when posting to a form, w3-reuse-buffers would reuse the
+'source' of the form.  Ugh.
+
+Tue Nov 22 15:37:02 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem in 'isindex' forms processing.
+
+Sun Nov 20 04:44:42 1994  William Perry  <address@hidden>
+
+* w3-draw.el, w3-forms.el, w3-mule.el, w3-vars.el, w3-xemac.el, w3.el:
+Lots of name changes from w3-* to use the native url-* functions
+
+Fri Nov 18 22:46:59 1994  William Perry  <address@hidden>
+
+* w3-vars.el: Added binding of Shift-tab for w3-back-link
+
+Thu Nov 17 20:52:03 1994  William Perry  <address@hidden>
+
+* w3-mule.el: Fixes for mule 2.1 from Shin-ya Sato <address@hidden>
+
+Mon Nov 14 17:02:29 1994  William Perry  <address@hidden>
+
+* w3-new.el: Initial revision
+
+Tue Nov  8 17:57:57 1994  William Perry  <address@hidden>
+
+
+* w3.el: Fixed handling of base tag
+
+Mon Nov  7 22:09:35 1994  William Perry  <address@hidden>
+
+* w3-draw.el: Correctly reset the state when going into w3-draw-html
+
+* w3-parse.el: Misc. fixes
+
+Sun Nov  6 07:19:52 1994  William Perry  <address@hidden>
+
+* w3-draw.el: Relative links work correctly now
+
+* w3-draw.el, w3-forms.el, w3-parse.el: Initial revision
+
+Fri Nov  4 22:43:44 1994  William Perry  <address@hidden>
+
+* w3.el: Support for STYLE attribute on ordered lists.  Supports i, I, a, A.
+Also still supports the HTML+ 'ROMAN' attribute.  Supports the VALUE
+attribute on the LI tag to change the value of a list item and all
+following items.
+
+* w3.el: Changed the advice for w3-*-link to use deactivate-mark if it is
+bound.  This gets rid of the problem of w3-*-link highlighting the
+region if in emacs-19 and in transient-mark-mode.
+
+Thu Nov  3 23:50:47 1994  William Perry  <address@hidden>
+
+* w3-epoch.el, w3-lemac.el, w3-xemac.el:
+Only send Accept: lines for the inlined images we accept when
+transferring an image
+
+Wed Nov  2 00:47:38 1994  William Perry  <address@hidden>
+
+* w3.el: Let the variable shell-file-name take precedence over environment
+variables and guessing
+
+* w3-e19.el, w3-vars.el:
+Added w3-echo-link to control what is displayed in the minibuffer in
+emacs-19.  'url, 'text, or nil.
+
+* w3.el: Added encoding type of application/ramp to forms
+
+Tue Nov  1 18:36:08 1994  William Perry  <address@hidden>
+
+
+* w3-vars.el: Removed definition of w3-using-proxy
+
+* w3.el:
+Fixed w3-find-this-file to work correctly for users other than anonymous
+
+* w3.el: Fixed problem where sentences ending with ! or ? had the ! or ? eaten.
+
+* w3.el: Added check for checkboxes/radio boxes that are turned off.
+
+Mon Oct 31 23:16:04 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed a stupid bug in the ....-other-frame
+
+* w3-e19.el: Changed binding from [shift mouse-2] to [S-mouse-2] -ugh
+
+* w3.el: Added functions w3-follow-link-other-frame and w3-fetch-other-frame
+
+* w3-lemac.el, w3-xemac.el, w3-e19.el:
+Added shift-middle-button default binding to be follow-link in other frame.
+
+Fri Oct 28 22:42:10 1994  William Perry  <address@hidden>
+
+* w3-vars.el: Can now pass parameters to url-current-callback-func
+
+Thu Oct 27 19:14:08 1994  William Perry  <address@hidden>
+
+* w3.el: Strip spaces off of the title after truncating it to 50 characters.
+
+Wed Oct 26 15:41:14 1994  William Perry  <address@hidden>
+
+* w3-vars.el: A few changes to how the entities are interpreted
+
+* w3.el: Now correctly strips off spaces from the front of a URL
+when in w3-fetch
+
+Tue Oct 25 17:28:43 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed <option value=xxx> handling for multiple selection lists.
+
+* w3.el: Fixed handling of the SIZE attribute of a SELECT tag.  Select MULTIPLE
+will now also allow different OPTION tags to have the SELECTED
+attribute.  Changed w3-insert-entities-in-string to use
+w3-html-entities, so it gets all the entities, not just the 6 or 7
+that were hardcoded in.
+
+Wed Oct 12 16:22:05 1994  William Perry  <address@hidden>
+
+
+Tue Oct 11 23:11:34 1994  William Perry  <address@hidden>
+
+* w3.el: More spacing at end of sentences hacks for ? and !
+
+* w3-vars.el: No longer rebind C-k - bad thing.
+
+* w3.el: Don't double-space after Prof.
+
+Tue Oct  4 01:17:33 1994  William Perry  <address@hidden>
+
+
+* w3.el, w3-vars.el:
+Changed w3-reuse-buffers to accept 'yes/no 'reuse/reload and 'always/never
+
+Mon Oct  3 14:04:15 1994  William Perry  <address@hidden>
+
+* w3-vars.el, w3.el:
+Patch for the inlined image processing for the buggy current release
+of ppmdither and viewing black and white gifs.  Also added comments to all
+the html entities in w3-html-entities.
+
+Fri Sep 30 21:28:54 1994  William Perry  <address@hidden>
+
+* w3.el:
+Fixed problem with paragraph just after an <hr> not being filled correctly.
+
+* w3-vars.el: Added more HTML entities
+
+Thu Sep 29 20:13:53 1994  William Perry  <address@hidden>
+
+* w3.el: Removed problem with first header having a blank line in it.
+
+* w3-e19.el, w3-emacs.el, w3-mule.el, w3-vars.el, w3.el:
+Lots of patches from Shin-ya Sato <address@hidden> to make
+w3 work with mule 2.0
+
+Tue Sep 27 23:58:36 1994  William Perry  <address@hidden>
+
+* w3.el: Now sends the NAME and VALUE of submit buttons if the submit button
+has a NAME.
+
+
+Mon Sep 26 18:51:52 1994  William Perry  <address@hidden>
+
+* w3.el: Change to w3-form-encode-multipart/x-www-form-data to include the
+content-length of each item
+
+Fri Sep 23 16:14:50 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem in w3-backward-in-history       when no back link was 
found.
+
+* w3-vars.el:
+Fixed setting of w3-running-FSF19 to take into account XEmacs 19.12
+
+Thu Sep 22 23:24:48 1994  William Perry  <address@hidden>
+
+* w3-lemac.el: Fixed problem in w3-insert-graphic where it would always do a
+url-file-attributes, even if we had the image loaded. (with
+url-be-anal-about-file-attributes == t, it would do a HEAD, which was
+stupid)
+
+* w3.el: Fixed forms doubling problem in FSF emacs 19 when doing a reset.
+
+* w3-vars.el, w3.el:
+New variable w3-track-last-buffer.  If non-nil, M-x w3 will take you
+to the last w3 buffer you fetched, instead of loading your home page.
+If the last buffer has been killed, then it acts normally and loads
+the home page.
+
+* w3.el: Changed w3-submit-bug
+
+
+* w3.el: patch from address@hidden to fix reporter problems in
+emacs 19.xx
+
+Wed Sep 21 17:25:16 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed small bug in DL handling when no <dt> items present
+
+
+* w3.el: Fixed problem in w3-pass-to-viewer if "/" is the filename, would get
+"" as the buffer-name, which would choke.
+
+* w3.el:
+Fixed bug in w3-delimit-emphasis w/headers that had spaces/newlines in them
+
+Tue Sep 20 18:04:03 1994  William Perry  <address@hidden>
+
+
+* w3.el:
+Fixed handling of blockquote's so they have a <p> at the beginning and end.
+
+
+Sun Sep 18 20:15:42 1994  William Perry  <address@hidden>
+
+* w3.txi: Few minor changes
+
+* w3.el: Changed w3-upcase-region so that it will take care of entities in the
+region.  ie: &auml; -> &Auml;, etc.
+
+* w3-e19.el:
+Fixed problem where the URL was not shown in the minibuffer if you hit
+'f' from a point in the document that was not a link.
+
+Fri Sep 16 17:18:03 1994  William Perry  <address@hidden>
+
+* w3-mac.el, w3.el: Lots of little fixes
+
+* w3-vars.el: Removed the old, redundant w3-gateway-x variables
+
+* w3-hypb.el: Removed all the code, since Hyperbole 3.12 handles it for you.
+
+Thu Sep  8 15:54:36 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem where the o/*/etc at the front of <dt> items would be
+upper-cased sometimes
+
+* w3.el: Started using reporter.el instead of rolling my own error logging
+routines.
+
+* w3-e19.el: w3-emacs19-unhack-faces now turns w3-delimit-emphasis and
+w3-delimit-links on.
+
+* w3-e19.el:
+w3-forward-link and w3-backward-link now ignore links without href's
+
+* w3.el: w3-complete-link now ignores links without href's
+
+* w3-vars.el, w3.el:
+Added new variable w3-source-file-hooks that is run after sourcing a document.
+
+* w3.el: Fixed problem with not quoting an align attribute when filling in
+defaults in w3-fix-paragraphs-in-region
+
+* w3.el: Fixed formatting problem with <dl>s finally
+
+Wed Sep  7 23:22:21 1994  William Perry  <address@hidden>
+
+
+* w3.el: Patch for not putting 2 spaces after Mr/Ms/Mrs.
+
+* w3-e19.el, w3.el:
+Lots of fixes brought about by Axel Boldt <address@hidden>
+
+
+* w3.el: Fixed problem in w3-finish-text-entry when deleting the sole window
+
+* w3-e19.el, w3-lemac.el, w3-wemac.el, w3-xemac.el, w3.el:
+Fix from address@hidden for converting newlines in
+menu entries/completions on links to spaces.
+
+
+* w3.el: Fixed dl attribute munging in w3-fixup-bad-html
+
+* w3-e19.el, w3-mule.el, w3.el: Misc. changes for Mule 2.0
+
+Tue Sep  6 21:07:16 1994  William Perry  <address@hidden>
+
+* w3-e19.el, w3-emacs.el, w3-epoch.el, w3-lemac.el, w3-xemac.el:
+Got rid of code to not interfere with hyperboles mouse-bindings, since
+it has changed to only use shift-clicks
+
+Sat Sep  3 21:50:09 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem where if url-be-asynchronous was non-nil,
+w3-show-history and w3-show-hotlist would fail.
+
+Fri Sep  2 18:42:25 1994  William Perry  <address@hidden>
+
+* w3.el: url-buffer-visiting now strips off the #xxx links.
+If reusing a buffer, the #xxx works will now work also.
+
+* w3-vars.el: Used real symbol for (TM) (&trade;)
+
+Sun Aug 28 22:41:15 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem with <dl> lists when there were no <dt> items.
+
+* w3.el: Fixed bug where hotlist urls were getting hexified too often
+
+
+Thu Aug 25 17:15:52 1994  William Perry  <address@hidden>
+
+* w3.txi: Few fixes to @cindex areas
+
+Tue Aug 23 12:30:18 1994  William Perry  <address@hidden>
+
+* w3.el: Added code to automatically call w3-update-hotlist-menu after all
+hotlist modification functions
+
+Mon Aug 22 02:30:51 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem with the new w3-fix-unknown-tags
+
+Sun Aug 21 23:34:49 1994  William Perry  <address@hidden>
+
+* w3.el: The isindex tag can now have an action=xxx specifier.  Works the same
+as link rel=index
+
+* w3.el: Don't include the [[ and ]] in w3-complete-link
+
+
+* w3-vars.el, w3.el:
+Added a 'debug' mode.  If w3-debug-html is non-nil, then display
+all semi-buggy html with error messages in a separate buffer
+that is displayed at the end of the parse.
+
+* w3-lemac.el, w3-vars.el, w3-wemac.el, w3.el:
+Added w3-xemac.el for the upcoming XEmacs 19.12 release
+
+* w3-xemac.el: Initial revision
+
+* dist.Makefile: Added w3-xemac.el
+
+
+* w3-vars.el: Changed how w3-version-number is created.
+
+* w3.txi: Added section on inlined images/mpegs
+
+* w3.el: w3-goto-last-buffer now works if w3-be-asynchronous == t
+
+* w3.el, w3-e19.el:
+Fixed emacs-19 forms problem - overlays would run together and mess up
+form entry.  Also fixed problem in the highlighting of links.
+
+Sat Aug 20 22:21:06 1994  William Perry  <address@hidden>
+
+
+* w3.txi, w3.el: Lots of changes suggested by Axel Boldt.
+
+* w3-e19.el: w3-forward-link and w3-back-link will show the link under point
+
+Thu Aug 18 12:56:43 1994  William Perry  <address@hidden>
+
+
+* w3-e19.el, w3-mac.el, w3.el: removed need for w3-quotify-percent hack
+
+Mon Aug 15 03:57:29 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed multipart viewer
+
+Sun Aug 14 22:50:31 1994  William Perry  <address@hidden>
+
+* w3.el: Made w3-popup-info interactive
+
+* w3-hypb.el: More error checking in hwww:start.
+
+* w3-vars.el: Added view source to the hyperlink-menu
+
+* w3-wemac.el, w3.el: More fixes to work under DOS/Windows
+
+
+* w3.el: Fixed x-www-form-urlencoded encoding.  Was stripping off the first
+character sometimes when it shouldn't have been.
+
+* w3-vars.el: Removed  bogus definition of w3-directory-format
+
+* w3-lemac.el, w3-e19.el:
+Fixed w3-mouse-handler so it doesn't need to muck with the % signs anymore.
+
+* w3-lemac.el, w3-e19.el: New links menu constructor
+
+* w3.el: Default URL for w3-fetch is now smarter.
+
+* w3.el: Fixed w3-complete-link so that it will not show extraneous markup in
+the completing-read
+
+* w3-srch.el, w3-lemac.el, w3-wemac.el, w3-epoch.el, w3-emacs.el, w3-e19.el:
+New w3-map-links - now passes the start and end positions to the
+appropriate function
+
+
+* w3.el: Forms fix for MAXSIZE, message when storing into the kill ring so the
+user has some sort of feedback, <P ID=xxx> works now.
+
+* w3-vars.el: New hotlist key bindings.
+
+Fri Aug 12 13:26:02 1994  William Perry  <address@hidden>
+
+* w3-lemac.el: Removed the * .5 so w3-lemac.el can compile under emacs 18
+
+* w3.el: Few fixes for using under windows.
+
+* w3.el: Fixed problem with directory-files with no <title> causing
+rename-buffer to fail.
+
+Thu Aug 11 13:56:35 1994  William Perry  <address@hidden>
+
+* w3.txi: Changes to the VM/Rmail nodes.
+
+* w3.el: Fixed dumbass problem in both types of forms submission that would
+always submit every checkbox and every radio button, regardless of its
+checked state.
+
+Wed Aug 10 13:51:18 1994  William Perry  <address@hidden>
+
+
+Tue Aug  9 03:39:45 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem with cleaning up of w3-temporary-directory and
+url-temporary-directory
+
+* w3-e19.el: Fixed a few problems with the loading of lmenu.
+
+Mon Aug  8 12:59:14 1994  William Perry  <address@hidden>
+
+* w3-e19.el: Made binding of track-mouse buffer-local
+
+Sat Aug  6 16:32:18 1994  William Perry  <address@hidden>
+
+
+* dist.Makefile:
+Removed viewers.el from the dist, since it has been moved into mm.el
+
+* w3-wemac.el, w3-lemac.el:
+New url-flush-cache function to remove all entries from the cache.
+Menu item in lemacs/wemacs for it.
+
+* w3.el: Fixed problem if </title> is malformed/nonexistent.
+
+* w3.el: Fixed problem with some </pre> markup sometimes leaving a trailing >
+in the parsed code.
+
+* w3.el: Fixed problem with mac web pages that use ^M instead of ^J as the
+newline char.
+
+Wed Aug  3 04:15:06 1994  William Perry  <address@hidden>
+
+
+* w3-vars.el, w3.el: Moved setting of w3-documents-menu-file,
+w3-personal-annotation-directory, and w3-hotlist-file into
+w3-do-setup, since they used expand-file-name and ~/, it would mess up
+if you dumped w3 with emacs.
+
+* w3-wemac.el:
+Do correct setting of the address@hidden up .mosaic-xxx-xxx filenames when in 
windows.
+
+* w3-wemac.el:
+Fix the setting of the mailcap/mime-types file list so that it won't
+choke on invalid filenames in windows.  Also do smart-checking of the
+TEMP environment variable if w3-temporary-directory or
+url-temporary-directory doesn't exist.
+
+* w3-lemac.el, w3.el:
+Fixed a problem in w3-kill-emacs-func when w3-temporary-directory
+didn't exist.  Also moved some stuff from w3-do-setup to
+w3-setup-version-specifics (mostly lemacs image stuff, etc)
+
+* w3.el: Load w3-wemac if running WinEmacs
+
+* w3.el: Highlighting of links is back...
+
+* w3-wemac.el: Initial revision
+
+Mon Aug  1 13:32:35 1994  William Perry  <address@hidden>
+
+* dist.Makefile:
+Removed sample-mailcap from distribution - everything is defaulted in
+lisp now.
+
+
+Sun Jul 31 23:53:36 1994  William Perry  <address@hidden>
+
+* w3.el: Accept --!> as the ending of an SGML comment.  UGH!
+
+
+* w3.el: Now sends off the value parameter of an <option> tag in a form.
+
+
+* w3.el: Use error in w3-save-url if there is no URL.  Moved loading of ~/.w3
+higher in w3-do-setup.
+
+* w3.txi: Fixed lots of grammatical mistakes, all stuff now uses the present
+tense instead of "will", and no more first-person crap.  Email
+addresses are handled in a standard way.
+
+* w3.el: Added support for the multipart/x-www-form-data enctype.  Also
+revamped forms support to be easily expandable for the enctype
+attribute.  Just need to have a function named
+w3-form-encode-<content-type> defined.  If this returns a cons pair,
+then the car is used as the "separator=xxx" chunk in the content-type,
+and the cdr is the body of the request.  If it returns a string, it
+just sends that as the body of the message.
+
+
+* w3.el, w3-vars.el: Rewrote the popup-info functions
+
+
+Sat Jul 30 22:55:31 1994  William Perry  <address@hidden>
+
+* w3-e19.el:
+Will no highlight the region that matches the ID of a #XXX search in a document
+
+
+Fri Jul 29 04:33:03 1994  William Perry  <address@hidden>
+
+* w3.txi: Few typos
+
+* w3.el, w3.txi:
+Misc. patches from address@hidden - doc/info fixes
+
+Thu Jul 28 13:52:49 1994  William Perry  <address@hidden>
+
+* w3.el: Rewrote DL handling
+
+Tue Jul 26 13:39:24 1994  William Perry  <address@hidden>
+
+
+* w3.el: Fixed dumb mistake in w3-personal-annotation-finish where I didn't
+insert the actual text of the annotation before finishing up.
+
+Mon Jul 25 14:04:09 1994  William Perry  <address@hidden>
+
+* add-to-dot-emacs: Added a few new autoloads
+
+
+* w3.txi: Fixed a few typos.
+
+* w3.el: Fixed problem with the rel=useindex support.
+
+* w3.el: Fixed small formatting problem with w3-delimit-links = 'linkname
+
+Sun Jul 24 20:19:18 1994  William Perry  <address@hidden>
+
+
+* w3-lemac.el:
+Several ugly hacks to get the image menus to work for images that
+downloaded successfully.
+
+* w3-lemac.el: New link and graphic specific menus enabled.
+
+* w3-vars.el: The popup menu has been trimmed down.
+
+
+* w3.el: A few changes for the new hyperlink-specific menus
+
+* w3-e19.el: Rewrote w3-forward-link - should not get stuck on links anymore
+
+* w3-e19.el: Implemented popup-menus on a linktype basis.  Can change the popup
+menu that shows up when you right-click on a hyperlink or an image.
+Default menus include viewing headers, dumping to disk, mailing,
+printing, and copying the url.
+
+* w3-vars.el, w3.el:
+New personal annotation entry code.  Uses a minor mode, and you can
+specify what major mode is used.  Set the variable w3-annotation-mode
+to the name of the major mode.  If set to nil, it will use
+default-major-mode.
+
+* w3-e19.el, w3-emacs.el, w3-epoch.el, w3-hypb.el, w3-lemac.el, w3-mac.el, 
w3-mule.el, w3-next.el, w3-vars.el, w3.el:
+Changed all references to address@hidden to use w3-bug-address
+instead.  Changed all copyright notices to use my new email address
+also.
+
+
+* w3.txi:
+Lots of changes to variable names, some new sections.  Should be about
+90% up-to-date now.
+
+
+* w3-vars.el: Removed definition of w3-passwd-entry-func - obsolete.
+
+
+* w3.el: Moved running of w3-mode-hooks to be after the resetting of
+w3-persistent-variables.
+
+
+* w3.el: Added in support for using <link rel=useindex href=xxx> for searching
+instead of the <ISINDEX> tag.  <ISINDEX> is still supported.
+
+Sat Jul 23 21:26:57 1994  William Perry  <address@hidden>
+
+* w3-e19.el: Rewrote the options menu
+
+* w3-e19.el: Removed image options from emacs 19 menubar
+
+
+* w3.el: Fixed problem with nested style tags.
+
+* w3-lemac.el: Fixed problem with images not appearing
+
+* w3.el: Fixed problem with first lines not being wrapped if no
+header/paragraph tags before them in the document.  Also added support
+for broken base tags - seems like some people are using <base=url>
+instead of <base href=url>
+
+
+* w3.el: PRE segments now get correctly put in the w3-tt-style face.
+
+Fri Jul 22 03:59:40 1994  William Perry  <address@hidden>
+
+
+Thu Jul 21 04:46:03 1994  William Perry  <address@hidden>
+
+* w3.el: Changed behavior of w3-show-headers.  If 't', then show all headers.
+Fixed bug in w3-in-assoc if there was a blank entry in the alist.
+
+* w3.el: Patch from address@hidden for not putting nil in the
+kill ring with w3-save-url.
+
+Sun Jul 17 17:17:19 1994  William Perry  <address@hidden>
+
+
+* w3-vars.el: New variable w3-dump-to-disk that will automatically download
+retrieved files to disk.
+
+* w3-lemac.el: Added 'dump to disk' item in options->www menu
+
+* w3-lemac.el: Added option for color filtering to the options->www menu
+
+* w3-lemac.el: Only read in the url-file-attributes of an image if
+w3-image-size-restriction is non-nil and a number.
+
+Sat Jul 16 18:55:24 1994  William Perry  <address@hidden>
+
+
+* w3.el: With prefix-arg, w3-fetch will default to the URL of link under point
+if any, otherwise default to current documents url if in w3-mode,
+otherwise default to url-get-url-at-point
+
+* w3.el: With prefix-arg, w3-follow-link will dump the file straight to disk
+
+Fri Jul 15 14:42:39 1994  William Perry  <address@hidden>
+
+* w3.el: Automatically switch to using giftoppm if giftopnm is not found on the
+system.
+
+
+Tue Jul 12 04:38:47 1994  William Perry  <address@hidden>
+
+
+Mon Jul 11 05:28:40 1994  William Perry  <address@hidden>
+
+* w3.el: w3-version now returns all the version #s of URL, WWW, and MM
+
+
+Sun Jul 10 19:14:06 1994  William Perry  <address@hidden>
+
+* w3.el: Only use w3-default-style in epoch
+
+
+* w3.el, w3-vars.el: w3-show-headers now takes regexps instead of exact matches
+
+Fri Jul  8 01:49:25 1994  William Perry  <address@hidden>
+
+
+Wed Jul  6 13:56:47 1994  William Perry  <address@hidden>
+
+* w3.el: Patches to make the history work again, as well as keep w3
+from trying to re-select deleted buffers
+
+Tue Jul  5 07:38:00 1994  William Perry  <address@hidden>
+
+* w3.el: No longer delete the zone when making an ALT tag hot, since there
+could have been other text in the link
+
+* w3.el:
+If an IMG is within a <A> tag, then the alt tag will be a hyperlink also.
+
+* w3.el: Fixed finding of url#xxx links from w3-fetch
+
+Mon Jul  4 23:48:07 1994  William Perry  <address@hidden>
+
+* w3.el: Forms submissions can now have ? embedded in them, for recursive
+creation of subsequent forms.
+
+
+* w3.el: Fixed formatting problems with nested lists, etc.
+
+* w3-vars.el: Removed C-q binding
+
+* w3-e19.el: Automatically turn on track-mouse if w3-track-mouse is non-nil.
+
+* w3.el: Various patches from Alastair Burt
+
+* w3-lemac.el: Create w3-superscript-style correctly
+
+Sun Jul  3 05:05:43 1994  William Perry  <address@hidden>
+
+
+* w3.el: Fixed a problem with fetching of #xxx links.
+
+* w3.el: Applied patch from Darrell Kindred <address@hidden> that
+fixed quite a few problems in the news handling.  Should be
+a lot faster now.
+
+* w3.txi: Fixed a few problems in the VM, RMAIL, and GNUS sections
+
+Sat Jul  2 18:31:50 1994  William Perry  <address@hidden>
+
+* w3-vars.el: Removed bogus entry in w3-persistent-variables
+
+* w3.el: Fixed storing of w3-current-last-buffer and w3-goto-last-buffer
+
+Thu Jun 30 23:39:02 1994  William Perry  <address@hidden>
+
+* w3-vars.el:
+Changed definition of w3-running-lemacs to take WinEmacs into account.
+
+* w3-lemac.el:
+Changed references to string-to-number to string-to-int for older
+lemacs versions
+
+Wed Jun 29 05:24:53 1994  William Perry  <address@hidden>
+
+* w3-lemac.el, w3-e19.el:
+Added an option for local cacheing of files to the Options menu
+
+Mon Jun 27 15:03:12 1994  William Perry  <address@hidden>
+
+* w3-e19.el:
+Added check for whether menu-bar-help-menu was bound before defining
+keys in it
+
+Tue Jun 14 12:25:09 1994  William Perry  <address@hidden>
+
+* w3-e19.el: Fixed problem with the menu
+
+Mon Jun 13 14:13:56 1994  William Perry  <address@hidden>
+
+* w3.el: Made sure everywhere w3 does a completing-read binds
+completion-ignore-case to t
+
+* w3.el: Few fixes from using url-maybe-relative
+
+Thu Jun  9 12:51:03 1994  William Perry  <address@hidden>
+
+* w3-e19.el: Activated the Help menu in FSF v19 again.
+
+Wed Jun  8 01:20:36 1994  William Perry  <address@hidden>
+
+
+Tue Jun  7 20:08:20 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem with empty titles.
+
+* w3-lemac.el:
+Fixed references to w3-use-hypertext-gopher and w3-directory-format variables
+
+* w3.el: Hacked up w3-submit-bug to be able to use mh-smail
+
+
+* w3.el: Changed the color-reducing process to be optional
+
+Mon Jun  6 19:56:46 1994  William Perry  <address@hidden>
+
+* w3-vars.el: More HTML+ latin1 entities
+
+Sun May 29 02:26:30 1994  William Perry  <address@hidden>
+
+* w3-vars.el: More HTML+ entities
+
+Sat May 28 14:14:19 1994  William Perry  <address@hidden>
+
+* w3-e19.el:
+Fixed problem with w3-back-link.  Could not go back to the only link
+in a buffer if you were past its endpoint
+
+* w3.el: w3-preview-buffer should work again, along with
+w3-show-hotlist/history-list, etc.
+
+* w3-vars.el: Yet more HTML+ entities.  Only 22 left to figure out.
+
+* w3-vars.el: Added more of the HTML+ entities
+
+Fri May 27 19:54:49 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed a problem with PRE fixing
+
+Sat May 21 10:23:16 1994  William Perry  <address@hidden>
+
+
+* w3.el: Fixed the URL completion
+
+* w3.el: Fixed a problem with the <embed> tag and the url package
+
+
+* w3-e19.el, w3-emacs.el, w3-epoch.el, w3-lemac.el, w3-mac.el, w3-mule.el, 
w3-srch.el, w3-vars.el, w3.el:
+Lots and lots of changes to use the new url.el package
+
+Fri May 20 16:20:59 1994  William Perry  <address@hidden>
+
+* w3-lemac.el: Fixed problem where graphic entities were disappearing
+
+Thu May 19 12:18:41 1994  William Perry  <address@hidden>
+
+* w3.txi: Fixed a few bad pointers
+
+* add-to-dot-emacs: Initial revision
+
+
+* w3-lemac.el:
+Moved back in the old code for w3-insert, w3-fix-extent-endpoints to
+get around bug in lucid emacs 19.10 with 'start-open and 'end-open
+extent properties.
+
+Wed May 18 20:30:24 1994  William Perry  <address@hidden>
+
+
+* w3.el: Now can have a max # of password entry attempts before bombing out and
+displaying the error message from the server.  w3-max-password-attempts
+
+
+* w3.el: Fixed problem in w3-mail-document-under-point
+
+
+* dist.Makefile: The great name change to 8.3 compatible
+
+
+* w3.el: Fixed problem in file/ftp handling if there was no file in the url
+(ftp://host.domain), etc.
+
+* w3-e19.el: Provide w3-e19
+
+* w3.txi: Added chapter/example for interfacing with RMAIL
+
+* w3-lemac.el:
+Added definition of emacs-major-version and emacs-minor-version if
+they aren't already defined.  Use this to merge w3-lemacs.el and
+w3-old-lemacs.el
+
+* w3-vars.el: Removed references to w3-running-old-lemacs
+
+
+Tue May 17 23:30:23 1994  William Perry  <address@hidden>
+
+
+* w3.el: Honor the new nametemplate mailcap clause
+
+* w3-e19.el, w3-lemac.el, w3-vars.el, w3.el:
+Removed the annotations menu.  moved to one entry in the main WWW menu
+Cleaned up some of the annotation code.
+
+* w3-e19.el:
+Only allow use of overlays in emacs19, due to some bugfixes in 19.23
+
+* w3-lemac.el: Disabled graphics in lemacs 19.9, since I switched to using
+annotations, and they don't exist in 19.9
+
+Mon May 16 20:49:09 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem with an old mm-mime-viewer call that didn't get fixed,
+and a work around for the autoloading of ange-ftp in emacs19
+
+* w3.el: Change to w3-grok-file-href to check for whether a file exists, even
+if a // is in the string (for something like file://usr/local/ blah
+blah blah.  Thanks to David Hughes for the patch.
+
+* w3.el: Removed group annotation code.
+Sped up the removal of whitespace by using subst-char-in-region
+instead of replace-regexp .
+
+* w3-lemac.el:
+Changed the options menu -> delay by image type to be actual toggle items.
+
+
+* w3.el: Removed klunky caching strategy.
+w3-current-mime-viewer now holds the complete information returned by
+mm-mime-info.
+The viewer code now only shows the output of commands if it gets any.
+No more prompting or setting of w3-always-show-output is necessary.
+
+* w3-vars.el: Removed obsolete w3-always-show-output
+
+Sun May 15 19:23:57 1994  William Perry  <address@hidden>
+
+* dist.Makefile: Now distribute mm.el
+
+
+* w3-lemac.el:
+Now add options menu before the Save Options menu in lemacs 19.10
+
+
+* w3.el: Switched to using my new mm.el package for mime stuff.
+
+* w3-vars.el: Removed old w3-xxx vars related to mailcap and mimetype parsing.
+
+* w3-mac.el: The Macintosh menus now work.
+
+Fri May 13 20:45:39 1994  William Perry  <address@hidden>
+
+* w3-vars.el: Added ` to the syntax table as a quote operator
+
+* w3-vars.el: Switched from giftoppm to giftopnm
+
+* w3.el: Changed the x-exec handling so that it can't mess up the
+process-environment by accident (thanks to Jamie Zawinski) for the
+info.  Also changed it so that the environment is only messed with if
+the executable is actually found somewhere in w3-local-exec-path.
+Save a few conses and string creations.
+
+Thu May 12 18:11:51 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed a few problems in the cleanup of unrecognized tags, as well as
+header handling.
+
+* w3-lemac.el: Fixed a few image-related quirks.
+
+
+* w3-lemac.el: Removed cursor changing code.
+
+
+* w3.el: Forgot to (widen) after the new MIME parasing code.
+
+
+* w3.el: Rewrote w3-parse-mime-headers to extract its information from the
+buffer instead of doing lots of work on strings/etc.  Also rewrote
+part of the guessing of mime-types when no content-type explicitly
+given.
+
+* w3.el: The no_proxy environment variable can now hold a unix-shell-type
+comma-separated list of wildcards, and it will be transformed into a
+real regular expression.
+
+* w3.el: Will now send Pragma: no-cache when doing a reload. . .
+Also now supports the no_proxy environment variable.
+
+* w3.el:
+Fixed a few places where w3-insert-graphic was still called the old way.
+Also fixed problem where local images weren't being converted correctly.
+
+* w3-lemac.el, w3.el: Fixed various compilation errors
+
+* w3-lemac.el:
+Basis for ismap image clicking enabled.  Sends off quite the wrong
+area (x,y relative to emacs frame, not the image).  Should be trivial
+to fix with a few additions to the C code.
+
+
+* w3.el:
+Seem to have fixed the problem of inlined images not being used as links.
+
+
+* w3-lemac.el:
+w3-find-specific-link will now highlight the correct extent until
+input is available.
+
+* w3.el: Finally really fixed the bug in the infinite recursion when building
+lists.  Problem was with unterminated lists.
+
+* w3.el: Following a named link (#XXX) will now push the mark so you can get
+back to it with C-u C-space
+
+Wed May 11 22:35:33 1994  William Perry  <address@hidden>
+
+
+* w3.el: Fixed problem of remote files being formatted incorrectly.
+w3-buffer-is-hypertext was not always returning the correct value.
+
+
+* w3.el: Links within headers should look better now.
+
+* w3-e19.el: New versions of the overlay-specific functions, plus changed the
+default under emacs19 to be using overlays.
+
+* w3-e19.el: Few patches for highlighting headers.
+
+* w3.el: No longer assume temporary files go in /tmp... now uses
+w3-temporary-directory and expand-file-name for all temporary file
+creations
+
+
+* w3.el: Patches from Bob Weiner to get asynchronous retrieval through a 'host
+gateway working.
+
+* w3.el:
+Hopefully fixed the not-guessing-if-a-buffer-is-html bug for remote file access
+
+* w3.el: Fixed problem in w3-follow-link with NAMEd links with no href.
+
+* w3.el: Fixed problem with infinite recursion during list building.
+
+* w3-vars.el:
+w3-mime-viewers has been trimmed down a lot, will depend on the users
+mailcap much more.
+
+* dist.Makefile: Can now 'make mailcap'
+
+* w3.el: w3-parse-mailcap can now take a URL.
+
+* w3.el: Killing of HTML comments will now make sure there is whitespace where
+the comment used to be. ie: (some text<!-- ack -->more text ==> some
+text more text)
+
+* w3.el: Fixed problem where text immediately after a </pre> tag but before a
+<p> tag weren't filled correctly.
+
+* w3.el: Changed w3-mailcap-entry-passes-test to check for the common "test -n
+$DISPLAY" cases and handle them automatically in elisp instead of
+shelling out to check the return status.
+
+* w3.el: Changed all after-hook-function references to be after-hook-functions,
+and use add-hook instead of explicit setq's
+
+* w3.el: The mailcap parsing routine now honors the 'test' clause
+
+* w3.el: fixed problem in w3-parse-args
+
+Tue May 10 23:56:29 1994  William Perry  <address@hidden>
+
+* w3-lemac.el: Few changes to the extent handling code.  No more hacks for
+w3-fix-extent-endpoints or w3-insert
+
+* w3.txi: Few bug fixes to the docs.
+
+Mon May  9 20:41:03 1994  William Perry  <address@hidden>
+
+* w3-lemac.el:
+If an image is more than 1/2 the size of the current screen, it will
+be moved down onto a line by itself.
+
+* w3.el: Fixed bug in title handling if there was an end tag like <title >
+
+* w3-lemac.el:
+Workaround for bug in lucid emacs where deleting text in map-extents
+would do _very_ bad things.  Loading inlined images/mpegs would
+sometimes cause it to crash.
+
+* w3-lemac.el: More changes to the image handling
+
+Sun May  8 17:46:14 1994  William Perry  <address@hidden>
+
+* w3-lemac.el: Changed to using annotations for inlined images
+
+Sat May  7 16:22:58 1994  William Perry  <address@hidden>
+
+
+* w3.el: Changed w3-file-attributes to not use HTTP/1.0 to HEAD a file unless
+w3-be-anal-about-file-attributes is non-nil
+
+* w3-lemac.el:
+Can now filter inlined image loads based on MIME type and/or file size.
+
+Thu May  5 16:26:19 1994  William Perry  <address@hidden>
+
+* w3-lemac.el: New submenu for lemacs - restrict image loads by type.
+
+* w3.el: Fixed problem in the after-change-function yet again.
+
+
+* w3.el: Few changes to the after-change-function handling, as well as changes
+to the mpeg loading code
+
+* w3-lemac.el:
+New menu items for showing inlined mpegs or not, as well as functions
+to load single and multiple delayed mpegs.
+
+* w3-vars.el: New variable w3-delay-mpeg-loads
+
+* w3-e19.el:
+Builtin support for mouse-movement keys, if 19.23 ever works with them...
+
+Tue May  3 20:25:40 1994  William Perry  <address@hidden>
+
+* w3-lemac.el, w3-vars.el, w3.el:
+Lucid emacs 19.10 or higher can now display inlined mpegs by default.
+Use <embed src="url of mpeg to play" type="video/mpeg"> to try it out.
+
+Mon May  2 22:02:21 1994  William Perry  <address@hidden>
+
+* w3.txi:
+Added in documentation of the emacs19 faces hacking for dumb terminals
+
+* w3-lemac.el: Applied patch by Alastair Burt to fix dumb typo on my part.
+
+* w3.el: Few changes to the 'host gateway code
+
+* w3-e19.el: Fixed problem in w3-find-specific-link in emacs19
+
+* w3.el: Changed w3-parse-args to extract the information out f the original
+buffer instead of wasting 2 or 3 string/buffer creations
+
+* w3-vars.el: Changes to the w3-parse-args-syntax-table
+
+Sun May  1 22:58:34 1994  William Perry  <address@hidden>
+
+* w3.el:
+Fixed problem in w3-after-change-function and escaping % from w3-lazy-message
+
+Fri Apr 29 21:48:26 1994  William Perry  <address@hidden>
+
+* w3-vars.el: New variables for keeping track of status messages better
+
+* w3.el: New way of doing the HTTP transfer status messages.  Now uses the
+after-change-function if available.  This way even asynchronous
+transfers get the good XXX of YYY (ZZ%) transfer messages.  Also now
+support the Status: header, which will be shown instead of the normal
+XXX bytes message.
+
+* w3-vars.el: More HTML+ entities
+
+Thu Apr 28 14:51:32 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed a few problems with the x-exec stuff.
+
+* w3-emacs.el: Fixed problem in v18 mouse support
+
+Wed Apr 27 16:14:01 1994  William Perry  <address@hidden>
+
+* w3-vars.el:
+New variables w3-mime-editors, w3-mime-bitmaps, w3-mime-composers, and
+w3-mime-printers that are initialized from the entries in the mailcap
+file
+
+* w3.el: Rewrote w3-parse-mailcap so that it keeps a _LOT_ more information
+from the mailcap file, including composers, editors, labels, and
+bitmaps.
+
+* w3-e19.el: Few changes to the options and popup menus
+
+* w3-lemac.el: New options menu for new lemacs
+
+* w3-vars.el: Revamped the main menu and popup menus to be shorter
+
+* w3-lemac.el:
+Changed w3-zone-at and w3-zone-data to use new 'w3delayed for delayed images.
+
+* w3.el: Reworked who delayed image processing works.  You can now click on a
+delayed image and it will load just that image.  Similar to how the
+Mosaic clients work.  Also, the ALT tag is inserted if available.  It
+is deleted from the buffer when the image is loaded.
+
+Tue Apr 26 21:33:26 1994  William Perry  <address@hidden>
+
+
+Mon Apr 25 21:16:33 1994  William Perry  <address@hidden>
+
+* w3-lemac.el:
+Should have fixed the ugly interaction between emacs-vers.el and lemacs 19.9
+
+* w3.el: Fixed problem in w3-fix-unknown-tags
+
+Sun Apr 24 19:30:51 1994  William Perry  <address@hidden>
+
+* w3.el:
+A few fixes to the native wais handling - still a little broken though.
+
+* w3-vars.el:
+Changed the help on xxxx menu item to fetch the .html files instead of
+the ones with no extensions - our server sends text/plain with no
+extension - ugh
+
+
+Sat Apr 23 18:57:30 1994  William Perry  <address@hidden>
+
+
+* w3.el: Fixed a problem in w3-parse-relative-link that would cause #X links to
+be doubled to #X#X
+
+* w3-e19.el:
+Can now choose whether you want to use overlays or text properties for
+keeping track of the internal w3 information.  Try
+(put 'w3-emacs19 'use-overlays t) in your .emacs to try it out.
+
+Fri Apr 22 14:53:15 1994  William Perry  <address@hidden>
+
+* w3-e19.el: Removed ugly emacs 19.23 hack that could mess up buffers
+
+* w3.el: Added a function to generate a FORM for posting/mailing a reply to a
+newsgroup.
+
+* w3-lemac.el: Added w3-view-ppm to view p[bp]m files in an xwindow glyph
+
+Thu Apr 21 20:37:24 1994  William Perry  <address@hidden>
+
+* w3-vars.el: Redid the help menu
+
+* w3-lemac.el:
+Changed button binding and menu stuff to conform to new lucid emacs style
+
+* w3.el: Changed w3-prepare-buffer to return the title of the document
+
+Tue Apr 19 23:17:48 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed up w3-parse-args so that it can deal with no trailing " or ' on
+an attribute that started with one.
+
+* w3-lemac.el: Fixed a few of the w3-toggle-xxxx
+
+* w3.el: Made epoch use the old V18-style kill-emacs-hook
+
+* w3.el: Fixed problem with headers having the last char moved down onto a new
+line when using w3-emacs19-hack-faces-p
+
+
+* w3.el: Try using .newsrc-SERVERNAME before just plain old .newsrc.
+
+* docomp.el: More defvar's
+
+* w3.el:
+Backed out one optimization of w3-parse-args that caused emacs19 to barf.
+
+* w3.el: w3-news-server now consults gnus-default-nntp-server,
+gnus-nntp-server, and nntp-server-name if they're bound and non-nil
+and != "".
+
+* w3-e19.el:
+Use glyphs in the display table so that emacs doesn't get as confused
+about the cursor position when using w3-emacs19-hack-faces-p
+
+
+* w3.el: Moved the finding of #xxx links after the loading of images, just in
+case point gets confused.  If no #xxx link, make sure to go to
+(point-min)
+
+Mon Apr 18 23:40:19 1994  William Perry  <address@hidden>
+
+* w3.el:
+Optimized w3-parse-args some more.  Thanks to address@hidden for the input
+
+* w3.el: Fixed problems with ../ as the first part of a relative url
+
+* w3-lemac.el:
+Wrapped the new definition of the options menu in a check for the
+latest version of lemacs
+
+* w3-lemac.el:
+Changed the menus to use the new 19.10 method of menus so that it uses
+Toggle buttons, etc.
+
+* w3.el: Finished implementing the SRC attribute for SUBMIT buttons
+
+* w3-e19.el: Added a hack-vt102 function
+
+* w3.el: New w3-parse-args
+
+
+* w3.el: Added support for a SRC attribute to the submit button
+
+Sun Apr 17 22:28:08 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed error message in w3-hotlist-add-entry, and added function
+w3-hotlist-refresh.
+
+* w3.txi: New hotlist func
+
+Fri Apr 15 21:25:21 1994  William Perry  <address@hidden>
+
+
+* w3-vars.el: Removed some obsolete variables
+
+* w3.el: Fixed the history mechanisms
+
+
+* w3-vars.el: Moved defvar of w3-emacs19-hack-faces-p into main variables file.
+Also moved the default setting of w3-delimit-emphasis and
+w3-delimit-links into w3-do-setup so they will be set correctly if
+dumped with emacs.
+
+
+* w3-e19.el: Can now hack faces for xterm and linux console
+
+* w3.el: Added in support for user:address@hidden ftp URLs
+
+
+* w3-e19.el: Fixed problems in w3-mouse-handler
+
+* w3-e19.el: If you are using VT100's and emacs 19.22, you CAN GET BOLD AND
+UNDERLINED text now.  Please try setting the variable
+w3-emacs19-hack-faces-p to non-nil.  To get rid of it, use M-x
+w3-emacs19-unhack-vt100
+
+
+* w3.el:
+Fixed bug in w3-parse-relative-link that could cause major problems with
+~ and w3-current-file = nil.
+
+Thu Apr 14 22:28:06 1994  William Perry  <address@hidden>
+
+* w3-lemac.el:
+Removed colorize-pixmap call since lemacs takes care of that now.
+
+* w3.el: Fixed problem in w3-search where it did not nuke the last search term
+from the url before appending the latest search string.
+
+* w3.el: the x-exec URL handler will now make sure that all returned messages
+are HTTP/1.0 messages, using the return value of call-process-region
+to get the HTTP/1.0 return status code if one is not explicitly given
+by the script.
+
+* w3.el: Include definition of emacs19-ism 'setenv' for old versions of emacs.
+This function is required to use the x-exec URL.
+
+* w3.el: Fixed some odd formatting of <hr>
+
+
+* w3.el: Added support for the x-exec url
+
+Wed Apr 13 21:58:09 1994  William Perry  <address@hidden>
+
+
+* w3.el: Fixed problem in w3-fix-proxy
+
+* w3-e19.el:
+Fixed a problem with emacs 19.23 and the previous-single-property-change
+
+* w3-lemac.el: Fixed w3-insert to deal with extent-start > extent-end
+
+* w3.el: Fixed the proxy support so that w3-view-url will show the url of the
+proxy'd document, not the entiry 'proxyservice''realurl' garbage
+
+* w3.el: Fixed w3-parse-args yet again...
+
+* w3.el: Few fixes to the newsrc parsing (unbound variables from cut&paste)
+
+* w3.el: Lots more news work.  Now supports parsing the newsrc and only showing
+unread articles in newsgroups, as well as displaying a list of all the
+newsgroups (distinguishes subscribed and unsubscribed groups).
+
+* w3.el: Added links to post to the newsgroup and reply to the author in news
+handling
+
+* w3-vars.el: Added newspost to the list of allowable link types
+
+* w3.el: w3-view-url now works with news: urls
+w3-parse-relative-link now works with news: urls
+w3-format-whole-newsgroup now spits out valid HTML+, and better looking too
+w3-format-news now spits out valid HTML+, looks like GNUS under lucid
+
+Tue Apr 12 08:01:20 1994  William Perry  <address@hidden>
+
+* w3.el: Fixed problem where using a gateway could screw up the recognition of
+an http/1.0 response
+
+* w3-e19.el, w3-emacs.el, w3-epoch.el, w3-lemac.el:
+Changed w3-forward-link and w3-back-link to take a prefix-arg for
+how many links to go forward.
+
+* w3.el:
+Fixed a bug in w3-parse-relative-link that would expand ~/ when it shouldn't
+
+Mon Apr 11 23:27:43 1994  William Perry  <address@hidden>
+
+* w3.el: Revamped w3-create-multipart-request to only use valid separator chars
+
+
+* w3.el: Fixed problem in w3-parse-docs-menu.  Added code to create a MIME
+multi-part request.
+
+* w3.el: Fixed problem in w3-form-encode for name=isindex when it wasn't the
+only entry area in the form (a submit button, etc)
+
+* w3.el: fixed problem in list-expansion
+
+* w3.el: Fixed problem in w3-parse-args if something was (read) as a number
+instead of a string.
+
+* w3.el: Fixed a problem in w3-parse-args with emacs19
+
+Sun Apr 10 21:51:40 1994  William Perry  <address@hidden>
+
+* w3-e19.el: w3-add-zone now uses the mouse-face property in emacs 19.23
+
+* w3-e19.el: Fixed various problems related to lmenu in emacs 19.23
+
+* w3.el: Fix to the mosaic docs-menu parsing
+
+* w3.el: No longer send the SUBMIT button when submitting forms
+
+* w3.el: New code to parse the Mosaic documents.menu file to add user-specified
+menus in lucid/FSF19
+
+
+Sat Apr  9 20:49:30 1994  William Perry  <address@hidden>
+
+* w3.el: Rewrote the SGML-comment killing code... should work better now.  Not
+sure if it is still compatible with the Mosaic way of killing
+comments, but Mosaic is broken in that regard, so I don't really
+care. :)
+
+* w3.el: w3-show-hotlist will show the hotlist entries in the same order that
+they were stored, instead of the old reverse-order behavior.  Also
+changed some of the automatically generated HTML to be strictly
+correct HTML+.
+
+* w3-vars.el:
+Also removed www.cis.ohio-state.edu from the bad-server-list... is now
+an HTTP/1.0 server
+
+* w3-vars.el:
+Removed cs.indiana.edu from the w3-bad-server-list, as we have finally
+upgraded to plexus.
+
+* w3.el: w3-submit-bug now sends me the URL of the current buffer (if any)
+
+* w3.el: Fixed a problem with file:./foo being interpreted wrong.
+
+* w3.el: Rewrote w3-basepath and w3-parse-relative-link to use
+expand-file-name, file-name-nondirectory, and file-name-directory.
+More reliable than the old regular expressions
+
+
+* w3.txi: Fixed more texinfo bugs.
+
+* w3-srch.el: Few tweaks in searching.
+
+* w3.el: Another bugfix to w3-parse-args
+
+* w3.el: Generate errors for non-existent local files now
+
+Fri Apr  8 23:10:20 1994  William Perry  <address@hidden>
+
+* w3-vars.el: Fixed all the missing HTML entities, and fixed several others.
+
+* w3.el: Fixed problem in w3-insert-entities-in-string using &nsp; instead of
+&ensp;
+
+* w3.el: Added a 'binary' option to w3-save-as
+
+* w3.el: New w3-parse-args
+
+
+* w3.txi: Wrote the PGP/PEM doc. (well, borrowed them from address@hidden).
+
+* w3.txi: Wrote the using with vm and using with gnus nodes.
+
+* w3.el: Added an autoload for w3-follow-link
+
+* w3.txi: Fixed a few reference problems.
+
+* w3.txi: Lots of variable definitions added.
+
+Thu Apr  7 22:32:06 1994  William Perry  <address@hidden>
+
+* w3.txi: Actually wrote the gateway/firewall documentation.
+
+* w3-e19.el: Fix-extent-endpoints will now work better.
+
+* w3.el: Fixed a problem with w3-create-mime-request and interaction with the
+CMU-BEAK server
+
+* w3.el: Fixed w3-parse-args for good I hope... now infers missing "s
+
+* w3.txi: Fixed some validation errors
+
+* w3.el: Ignore case in completing-read in w3-use-links
+
+<hr> parsing should now be more robust.  Paragraph filling after the
+<hr> will no longer be hosed.
+
+* w3.el: More work on w3-parse-args - think I got it right this time.
+
+* w3.txi: Fixed problem with setting the info filename
+
+* w3.txi: Fixed a few heirarchy bugs
+
+* w3.el: Rewrote w3-insert-entities-in-string to use mapconcat - quicker/more
+efficient than lots of string-matches and substrings, especially for
+small strings.
+
+Fixed problem in w3-parse-args that would swallow multiple spaces,
+even from quoted attributes (ALT=" " => ALT=" ")
+
+* w3-vars.el: Added &lt back into the w3-html-entities list.
+
+* w3.el: Fixed bug in the single-form-entry-in-a-form submission.  Was only
+sending the form value, not the name/value pair.
+
+Reworded the 'fixing bad html' messages to be 'checking for bad html'
+so that it wouldn't confuse people and make them log a bug.
+
+* w3.el: New way to retrieve wais doc-ids... doesn't work all the time
+  though - why not?
+* w3.el: Removed the call to dps-display-color-cells, as it causes a
+  coredump in all the versions I have ever tried on the NeXT.
+* w3-lemacs.el: Fixed problem with quoting percents in w3-track-mouse.
+
+Thu Mar  3 18:57:03 1994  William M. Perry  (address@hidden)
+* w3.el: Fixed problem in new header handling.
+* w3.el: w3-file-attributes will no longer choke if given a null argument.
+* w3-search.el: Remove all '#XXXX' references from URLs, so it is easier
+  to tell if we have visited them before
+* w3-vars.el: Changed w3-header-chars-assoc to use characters instead of
+  strings, and use make-string to make the header delimiters the same size
+  as the header.  This can still mess up on headers with inlined images,
+  but all in all it looks much better.  Thanks to Jared Rhine for the
+  suggestion.
+* w3.el: Changed lots of functions to use mapcar instead of while loops -
+  sould be slightly faster.
+* w3.el: Added hook to kill-emacs-hook to write out the global history if
+  necessary.  Also rewrote part of w3-write-global-history 
+
+Wed Mar  2 21:57:44 1994  William M. Perry  (address@hidden)
+* w3.el: Fixed problem with w3-file-attributes and non-existend
+  local/remote files.
+* dist.Makefile: Added mac and searching files to the distribution.
+* w3.el: w3-retrieve now updates w3-global-history-completion-list
+* w3.el: w3-fetch now does a completing read so that you can have
+  completion based on your .mosaic-global-history file.
+* w3-search.el: w3-do-search can now take an optional BASE argument, that
+  is the url to start searching from.  The search function also now checks
+  to see if there is a buffer visiting a url in the queue before
+  retrieving it.
+* w3.el: w3-save-as now uses w3-current-source if possible.  Saves time on
+  retrieval.
+* w3-vars.el: Fixed menu entry for 'View Source' that was still calling
+  old function names.
+* w3-lemacs.el: If w3-track-mouse is non-nil, and w3-link-cursor is
+  defined, change the mouse cursor to w3-link-cursor when over a link.
+  w3-link-cursor defaults to "hand2".  w3-link-cursor is set up in
+  w3-do-setup only if w3-link-cursor is a string, so the user can set it
+  to a pixmap in their .emacs file if they wish.
+* w3.el: <BR>s in lists now handled better.
+* w3.el: The new graphic entity support now honors the
+  w3-delay-image-loads variable
+
+Tue Mar  1 23:55:50 1994  William M. Perry  (address@hidden)
+* w3-lemacs.el, w3-epoch.el: Added binding of w3-source to 't' so that
+  w3-retrieve will always grab a buffer for retrieving inlined images
+* w3-search.el: Miscellaneous fixes...
+* w3.el: More changes to w3-file-attributes to compensate for HTTP/1.0
+  servers that don't implement HEAD
+* w3.el: Fixed error in determining if a URL exists or not in
+  w3-file-attributes
+* w3.el: w3-file-attributes won't send a HEAD request to a known
+  non-http/1.0 server
+* w3-search.el: Can now specify the search term as a function, and it will
+  be funcall'd with the URL as an argument.  RESTRICTION can be either a
+  regular expression or a function name - if string-match or funcall
+  against the URL fails, don't insert it into the queue.  Also now smarter
+  about not visiting the same URL multiple times.
+* w3.el: Fixed a dumb mistake in w3-file-attributes
+* w3-search.el: The searching functions work now.  Takes a regular
+  expression and a max-hops argument.  Returns a list of URLs that the
+  regular expression was found in.
+* w3-emacs19.el: Fixed problem with radio buttons/checkboxes at the end of
+  lines in emacs19
+* w3.el: Don't send the referer: field if using as a home-page or manually
+  requested URL
+
+Mon Feb 28 22:12:18 1994  William M. Perry  (address@hidden)
+* w3-emacs19.el, w3-lemacs.el, w3-old-lemacs.el, w3-vars.el: Removed
+  redundant definitions of w3-XXXX-menu.  w3-options-menu is still in each
+  file, since new lucid emacs has some extra features I can use in it.
+* w3.el: Will no longer copy local files into a buffer, then into /tmp
+  when passing to an external viewer - creates a symbolic link instead.
+
+Mon Feb 28 03:24:33 1994  William M. Perry  (address@hidden)
+* Release of v2.0.22
+* w3.texinfo: Description of new proxy services.
+* w3.el: Fixed problem in w3-fix-ampersands
+
+Sun Feb 27 23:37:53 1994  William M. Perry  (address@hidden)
+* w3-vars.el: Fixed un-escaped "s in defvar for w3-proxy-services
+* w3.el: Changed gopher/ftp/file directory handling to use the new
+  graphical entities instead of IMG
+* w3-vars.el: New variable w3-graphics-entities-alist holds an assoc list
+  of entities and the names of bitmaps to replace them with.
+  w3-icon-directory is appended to the front of each filename
+  automatically.
+  New variable w3-gopher-icons which holds the new graphic entity
+  references to describe each type of object.
+* w3.el: Tweaks to wais code... seems to be working now.
+* w3.el: Fixed stupid problem in the basic authorization code where I
+  wasn't setting the variable in a while loop to (cdr var)
+* w3.el: Added in proxy gateway support as put forth by Lou Montulli and
+  others.  Uses the new ACCESS_proxy environment variables.
+* w3.el: Multiline text entry boxes now reset correctly when
+  w3-revert-form is called
+* w3.el: Single input-area forms now submit themselves after you enter the
+  data.  No need for a submit button.
+* w3.el: Fixed error in w3-http, where it was sending the output of
+  w3-view-this-url instead of w3-view-url to w3-create-mime-request.
+  Referer: fields will work better now.
+  Basic authorization will now work with inheritance from protected
+  directories. (/foo/bar/baz.html is protected, then so is
+  /foo/bar/quuux.html, as is /foo/bar/baz/temp.html, etc)
+* w3.el: Wais support seems to be working...
+* w3.el: More fixes to the wais searching functions.
+
+Sat Feb 26 20:44:39 1994  William M. Perry  (address@hidden)
+* w3.el: Changed w3-prepare-buffer to take an optional argument,
+  no-display, which if t will keep it from renaming the buffer and
+  displaying it.
+* w3-vars.el: Added &lt and &gt to the list of entities, even though they
+  are wrong, since so many people seem to be using them.
+* w3.el: Strip out port numbers in ftp requests.
+* w3-lemacs.el: Spaces are now inserted after a graphic in lucid, and the
+  graphic extent is only on that one space.
+* w3-emacs19.el, w3-lemacs.el, w3-old-lemacs.el: Changed w3-zone-at to
+  return the extent, not the data.
+* w3.el: Better cleaning of telnet buffers before parsing.
+* w3.el: Fully implemented the Referer: field.  Also, w3-mime-response-p
+  should be a little more robust.  Should also kill an http request when
+  using the gateway support.
+* w3-vars.el: New variable w3-telnet-header-regexp that takes the place of
+  w3-telnet-header-length.  Addition of dvi, tex, and texinfo files to the
+  w3-mime-extensions list.
+* w3.el: Few changes to w3-format-directory in case file-attributes
+  returns nil
+* w3-emacs.el: w3-map-links will actually work in emacs 18 now.
+
+Fri Feb 25 23:17:51 1994  William M. Perry  (address@hidden)
+* w3-lemacs.el: Another dumb mistake in w3-zone-at
+* w3-emacs.el, w3-emacs19.el, w3-lemacs.el, w3-old-lemacs.el, w3.el: Fixed
+  dumb mistakes in w3-zone-at and the newly rewritten commands
+* w3.el: Fixed a few typos in w3-source-document
+* w3-emacs.el, w3-emacs19.el, w3-epoch.el, w3-lemacs.el, w3-old-lemacs.el,
+  w3.el: Rewrote w3-load-delayed-images, w3-view-this-url, and
+  w3-follow-link to use the generic w3-zone-at/w3-zone-data functions, so
+  they won't have to be in the emacs-specific files anymore.  Much easier
+  to maintain them this way.
+* w3-emacs.el, w3-emacs19.el, w3-epoch.el, w3-lemacs.el, w3-old-lemacs.el,
+  w3.el: Removed all emacs-specific versions of w3-complete-link, and put
+  w3-complete-link into w3.el and have it use the new w3-map-links.
+  Easier to maintain.
+* w3-emacs.el, w3-emacs19.el, w3-lemacs.el, w3-old-lemacs.el: New function
+  w3-map-links that calls a specified function on all the links in a
+  certain buffer.
+* w3-mac.el: Basic support for Macintosh menus... wrote a function to use
+  the lucid style menu descriptions.
+* w3-lemacs.el: Fixed problem with bad add-menu structure when the Options
+  menu already exists.
+
+Thu Feb 24 22:37:32 1994  William M. Perry  (address@hidden)
+* w3.texinfo: New chapter on future directions
+* w3-epoch.el: Fixed epoch graphics handling so it won't get a buffer
+  read-only-error, and also won't always look in w3-working-buffer, in
+  case the buffer has been renamed by the time it gets called.
+* w3.el: Renamed several functions so that it will be easier for new users
+  to do command completion (all hotlist stuff is w3-hotlist-XXX, etc).
+  Also several new functions to operate on the url the cursor is on
+  (w3-mail-document-under-point, w3-source-document-at-point, others).
+* w3-vars.el: Changed lots of keybindings.  General rule is now that
+  lowercase keys act on the current URL, and uppercase works on the url
+  under point. Major changes:
+  s -> document source, NOT SEARCH
+  M-s -> search document
+  p -> print document, NOT back link
+  Q -> w3-leave-buffer
+* w3.el: Rewrote w3-store-in-cache so that it stores info on disk instead
+  of in memory - can have a larger cache this way and not use up all your
+  memory.
+* w3-lemacs.el: New function w3-write-zones that creates lisp expressions
+  that restores extents when it is eval'd.
+
+Wed Feb 23 03:50:06 1994  William M. Perry  (address@hidden)
+* w3.el: A few more changes to the wais code
+* w3.el: More refinements to the WAIS code... now outputs URLs that are
+  like lynx/Mosaic, and also compatible with the WAIS gateway that NCSA
+  provides.
+
+Tue Feb 22 23:39:43 1994  William M. Perry  (address@hidden)
+* w3-old-lemacs.el: Fixed a few nesting errors in w3-view-this-url
+* w3-emacs19.el: Few fixes to file-name-handler stuff
+* w3.el: WAIS handling can now output an html document of a search.
+  Outputs the score and the file name.  Also function to retrieve a
+  document given its doc-id.
+* w3-emacs19.el: Patch for setting up the file-name-handler-alist from
+  address@hidden
+* w3.el: New function to parse out the .mosaic-global-history file and
+  store it in an assoc list for use in completion.
+* w3-mac.el: Initial revision
+* w3.el: More changes to the wais handling code.
+* w3-vars.el: New variable w3-waisq-prog that controls where the waisq
+  executable is looked for.
+* w3.el: Small change to w3-convert-html-to-latex to have slightly better
+  stripping of unknown tags.
+  Skeleton of wais support - requires waisq from Thinking Machines Corp's
+  wais8-5b1.
+
+Mon Feb 21 17:36:25 1994  William M. Perry  (address@hidden)
+* w3.el: New function w3-quotify-attributes to try and fix bad html docs.
+* w3.el: Added a few changes to convert-html-to-latex to honor
+  w3-latex-docstyle, and also allows inlining of postscript images.
+  Thanks to address@hidden (Benno Blumenthal) for the
+  batches.
+
+* w3-vars.el: New variable w3-latex-docstyle that controls what
+  documentstyle a latex document has.  Useful for going into two-column
+  mode or doublesided, etc.
+* w3-lemacs.el: Changed w3-back-link to go to 1+ the extent start position
+  to get around (extent-at) bug
+* w3-vars.el: Added www to the nonrelative link regular expression so that
+  links of that type will be parsed correctly.  New variable
+  w3-current-source holds the HTML source of a document.
+* w3.el: Most of the automatically generated html can now be referenced
+  with URLs like WWW://type/data.  Errors are generated this way, and you
+  can get the source for things like hotlists, history lists, help items,
+  etc.
+  Now stores the complete source of a document in a buffer-local variable,
+  so printing/mailing HTML and/or LaTeX is _MUCH_ faster, as is getting
+  the documents source - never any need to refetch it.  w3-reload-document
+  still does a fresh fetch though.
+* w3-emacs.el: w3-next-zone and w3-previous-zone now skip 'w3graphic zones
+* w3.el: Fixed small bug in re-insertion of SELECT menu items.  Stuck too
+  many spaces at the end of it.
+* w3-emacs.el: Make sure that x-popup-menu is bound before fset'ing
+  w3-x-popup-menu to it when in emacs 18
+
+Fri Feb 18 02:50:42 1994  William M. Perry  (address@hidden)
+* w3.el: Fixed problem in the textarea handling... misplaced a )...
+
+Thu Feb 17 19:38:50 1994  William M. Perry  (address@hidden)
+* w3.el: Fixed problem with w3-quotify-percents and null arguments...
+* w3-emacs.el, w3-emacs19.el, w3-lemacs.el, w3-old-lemacs.el, w3.el: Use
+  w3-quotify-percents in the (format ...) command in w3-view-this-url and
+  w3-view-url so that form queries don't mess up the format command` and
+  make it think it needs more arguments.
+* w3-emacs.el: Use insert-before markes in emacs 18
+* w3.el: Append fill-prefix to the paragraph parsing code.
+
+Wed Feb 16 21:47:33 1994  William M. Perry  (address@hidden)
+* w3-emacs19.el: Fixed dumb mistake in the setting up of
+  file-name-handler-alist... losing because of a misplaced ')'.  Gotta
+  love lisp :)
+* w3.el: Lots more file-ish type functions that will work with URLs.
+  w3-directory-p, real file-attributes, and stubs for more.
+* w3-emacs19.el: Redid the file-name-handler functions.  Stole
+  layout/ideas from the ange-ftp stuff from v19.
+* w3.el: Will check if running on a mono display and do dithering if it
+  is. Fixed problem with <LINK> parsing where it would delete too many
+  chars. Fixed problem with queries in w3-form-encode... too many &'s
+  Few more NeXTstep changes.
+* w3-lemacs.el: Lemacs menu's should no longer nuke people's Options menu
+  if it already exists.  Will add a submenu called 'WWW' to the
+  already-existing menu.
+* w3-emacs19.el: Added file-name-handler-alist support for emacs 19.
+  Works for find-file-other-window, find-file-other-screen, file-exists-p,
+  file-readable-p, file-executable-p, file-attributes, and
+  file-directory-p.
+* w3.el: Added new functions w3-file-size and w3-file-exists.
+* w3-emacs19.el: A few changes for NeXTstep emacs 19.  Menus now work,
+  storing URLS into the kill ring/NeXT clipboard, and loading of lmenu if
+  in dps. Still no [x|dps]-popup-menu though.
+
+Tue Feb 15 03:42:45 1994  William M. Perry  (address@hidden)
+* w3.el: Fixed w3-form-encode so that it actually returns the correct
+  query string if in a gopher or isindex form area...
+
+Mon Feb 14 19:12:31 1994  William M. Perry  (address@hidden)
+* w3.el: Multiline text area entry should now work in emacs 18 (put the
+  w3-do-text-entry outside of the save-excursion)
+* w3.el: Make w3-prepare-buffer mark the buffer as not modified.
+* w3-lemacs.el: Change w3-insert to insert-before-markers so that inlined
+  images will show up in the right place more often.
+
+Sat Feb 12 03:15:46 1994  William M. Perry  (address@hidden)
+* w3.el: Fixed a read-only buffer problem when fetching images...
+* w3-lemacs.el: New version of w3-track-mouse that doesn't need to move
+  (point) in the buffer... should be faster.
+
+Thu Feb 10 21:47:56 1994  William M. Perry  (address@hidden)
+* w3.el: Moved the image parsing until after everything else has been
+  parsed... this should fix everyones problems with inlined images
+  disappearing sometimes - they were attached to parts of the buffer that
+  was removed by other parsing routines.
+* dist.Makefile: The making of w3.info now changes the setfilename
+  directive in w3.texinfo to point to INFODIR.
+* w3-lemacs.el: Set end-open and start-open extent properties if setting
+  up a form.
+* w3.el: Fixed a type in one of the mule/forms patches.
+* w3-mule.el, w3-vars.el, w3.el: Miscellaneous fixes from Shin-ya Sato
+  <address@hidden> that make forms work much better in Mule.
+
+Wed Feb  9 23:37:11 1994  William M. Perry  (address@hidden)
+* w3-lemacs.el: Don't mess with graphic extents in w3-fix-extent-endpoints
+* w3-epoch.el, w3-lemacs.el, w3-vars.el, w3.el: More error checking in the
+  image code
+* w3.el: Fixed typo in w3-fetch-with-pgp...
+* w3.el: Slightly more intelligent way of doing w3-form-encode.
+
+Mon Feb  7 03:31:17 1994  William M. Perry  (address@hidden)
+* w3.texinfo: miscellaneous fixes/grammatical fixups
+* w3-epoch.el, w3-lemacs.el: Removed stupid message about possibly failing
+  to load an image because of the color map.
+
+Sun Feb  6 19:24:27 1994  William M. Perry  (address@hidden)
+* w3-vars.el: Changed w3-default-homepage to be defvar'd to nil, so that
+  w3-do-setup will grab the WWW_HOME variable if it can.
+* w3.texinfo: Fixed a few stupid bugs in @node structures that occurred
+  because I removed a node.
+* w3.el: Fix entity references in <TITLE> of documents.
+
+Sat Feb  5 02:55:05 1994  William M. Perry  (address@hidden)
+* Version 2.0 released.
+* w3.el: w3-public-key-exists will actually work now.
+* w3.el: Moved the w3-handle-graphics call within the let binding of
+  w3-handle-base, so that inlined images will work with <BASE> tags.  This
+  also fixes the problem of not being able to select the link an image is
+  covering with an ALT tag.
+* w3.el: Renamed w3-lemacs-19.8 to w3-old-lemacs because of problems with
+  v18 byte compiler.
+
+Fri Feb  4 17:11:03 1994  William M. Perry  (address@hidden)
+* w3-vars.el: Change w3-running-lemacs and w3-running-new-lucid to be
+  w3-running-old-lemacs and w3-running-lemacs, respectively.
+* w3-epoch.el, w3-lemacs.el, w3-vars.el, w3.el: Revamped some of the
+  w3-insert-graphic code so the conversion functions can be shared between
+  epoch & lucid.  Also added in code so that people with only XBM support
+  can use the inlined image code.
+* w3.el: Added functions to grab the servers public key from finger
+  information if possible when using PGP and PEM encryption
+* w3-html+.el: Much better table parsing routines - still not finished yet.
+
+Thu Feb  3 22:17:19 1994  William M. Perry  (address@hidden)
+* w3.el: Allow ~s in urls in w3-get-url-at-point
+* w3.el: Moved just the variable definitions to an outside file to ease
+  byte-compiling.  No longer loads whole w3.el just to get variable
+  definitions
+* w3.el: Moved w3-load-flavors into w3-do-setup
+
+Wed Feb  2 22:41:48 1994  William M. Perry  (address@hidden)
+* w3.el: w3-make-sequence now returns the sequence in ascending order.
+* w3.el: Changed the nntp/flee handling in w3-nntp-stat-newsgroup so that
+  it won't hang indefinitely.
+* w3.el: Made a few changes to the require functions so that mailcrypt and
+  nntp are not required until absolutely necessary.
+* w3-hyperbole.el: New version from address@hidden
+* w3-mule.el: Changed w3-grok-gopher-url to w3-grok-gopher-href
+* w3-docomp.el, w3-new-lucid.el: More compiler warnings fixed
+
+Tue Feb  1 21:47:04 1994  William M. Perry  (address@hidden)
+* w3.el: Fixed a few problems in w3-grok-http-href
+* w3.el: Support for the <BASE> tag.  New w3-grok-*-href functions that
+  can be used anywhere and return lists of server/port/file/etc.
+
+Mon Jan 31 22:32:52 1994  William M. Perry  (address@hidden)
+* w3-new-lucid.el: Fixed a free variable reference in w3-insert-graphics
+* w3-emacs.el, w3-emacs19.el, w3-epoch.el, w3-lucid.el, w3-new-lucid.el,
+  w3-next.el, w3.el: Moved some version-specific stuff out of the
+  definition of w3-mode and into the function w3-mode-version-specifics in
+  the w3-*.el files.
+* w3.el: Set w3-delimit-emphasis and w3-delimit-links to nil when doing
+  batch fetches.
+* w3.el: Mailing and batch-fetching now insert a <BASE> tag if
+  sending/saving the raw HTML.
+* w3.el: Fixed a few typos in w3-tn3270
+* w3-emacs19.el: Fixed a misplaced ( so that w3-follow-inlined-image works
+  in emacs19
+* w3.el: Added more descriptive function documentation to the autoloaded
+  functions.
+* w3.el: New variable w3-use-transparent.  If t, then it will use
+  transparent.el to do telnet/tn3270 links.  This is automatically set to
+  nil if you are in lucid emacs, epoch, or in a windowing system.
+* w3-mule.el: Added function w3-m2psbuffer that will print a buffer as
+  postscript in mule.
+* Renamed w3.texi to w3.texinfo
+* w3.el: Replaced <= with equal in case file size is nil...
+
+Sun Jan 30 18:40:16 1994  William M. Perry  (address@hidden)
+* w3.el: Added support for PGP and PEM encryption of requests.  Requires
+  the excellent mailcrypt.el by Jin S Choi (address@hidden)
+* w3.el: Added autoloads for 'gopher-dispatch-object and 'html-mode if
+  they didn't already exist.  Also added a patch from Jamie Zawinski that
+  fixes the ###autoload statements used by autoload.el
+* w3.texi: Now creates .info files just fine from makeinfo.
+
+Sat Jan 29 23:35:59 1994  William M. Perry  (address@hidden)
+* w3-emacs19.el, w3-epoch.el, w3-lucid.el, w3-new-lucid.el, w3.el: Added
+  an (fset 'w3-insert 'insert) to all but the epoch file, and used the
+  w3-insert written by Henry A. Rowley that will keep the zones intact.
+  Replaced all occurences of (insert) with (w3-insert)
+* w3-epoch.el: Getting the resource for underlining should work now.
+* w3.el: w3-add-document-to-hotlist now checks to see if the current
+  document is already in the hotlist.  If it is, it signals an error.
+* w3-new-lucid.el: Fixed problem in converting xbitmaps - left out a ' in
+  the sed command
+* w3-epoch.el, w3-new-lucid.el, w3.el: Changed how the
+  w3-graphic-converter-alist is specified.  Must now leave off the
+  ppmtoxpm command, and leave a stray '| ' at the en end of the
+  conversion.  The contents of the variable w3-ppmtoxpm-command are
+  appended to this string.
+* w3.el: Added a w3-convert-code-for-mule call in w3-sentinel if
+  w3-be-asynchronous is t.
+* w3-new-lucid.el: Several changes suggested by Jamie Zawinski
+  (address@hidden) More errror checking for the image loading, and display
+  a buffer describing each error in a buffer after parsing the buffer.
+  Also, if the image load fails, put a 'w3graphic zone over the [alt] tag.
+* w3.el: Several changes suggested by Jamie Zawinski (address@hidden) The
+  small extent made for graphics has the 'w3graphic property, so using
+  w3-follow-inlined-image on it will retrieve the full picture (for things
+  like lucid where it gets clipped to the line height).  No longer shows
+  'read 1 byte' messages - will only show a message when it has acually
+  received some info.
+* w3.el: Removed assumption that /usr/lib/X11/rgb.txt exists when using
+  ppmtoxpm
+
+Fri Jan 28 13:39:11 1994  William M. Perry  (address@hidden)
+* w3.el: Applied patch from address@hidden (Dong Liu) that fixed
+  a stupid problem with the w3-use-starting-points function.
+
+Wed Jan 26 23:36:02 1994  William M. Perry  (address@hidden)
+* w3-new-lucid.el: Changed w3-add-zone to always set end-open and
+  start-open - need more data for bug fixes.
+* w3-new-lucid.el: Added patch from Alastair Burt <address@hidden> to
+  fix not being able to get past graphic extents in 19.9
+* w3.el: The w3-nonrelative-link regexp now includes wais link types.
+* w3-emacs.el: Added a patch from address@hidden that fixed yet another dumb
+  mistake on my part in the emacs 18 w3-follow-link function.
+* w3.el: Basics of w3-pem-auth for the new httpd pgp/pem security
+* w3.texi: Documentation mime-types parsing, and viewer specifications.
+* w3.el: Viewers can now be lists, in which case it will be passed thru
+  'eval'.
+
+Tue Jan 25 20:33:15 1994  William M. Perry  (address@hidden)
+* w3-emacs.el: Fix from address@hidden for a problem in w3-follow-link for
+  emacs 18
+* w3-new-lucid.el: The problem with coredumps with lots of empty links in
+  lemacs 19.9 should (hopefully) be fixed.
+* w3.el: Added wais gateway support - not sure if it  works, but I get the
+  same results as I do with Mosaic, so good enough.
+* w3.el: Asynchronous retrieval over http works again.
+* w3-new-lucid.el, w3-epoch.el: Made sure w3-insert-graphic retrieved
+  graphics synchronously.
+
+Mon Jan 24 23:30:40 1994  William M. Perry  (address@hidden)
+* w3.el: Added w3-use-starting-documents and w3-show-starting-documents
+  that display the contents of the hotlist-type w3-starting-documents
+  variable.
+* w3.el: Added function w3-insert-formatted-url... inserts a formatted <A
+  HREF...></A> construct in a buffer.  Url is the url of the current
+  buffer (or link under point with prefix arg), text of the link defaults
+  to the title of the buffer or the text of the link under cursor.  Buffer
+  to insert into is prompted for.
+* w3-emacs19.el, w3-epoch.el, w3-lucid.el, w3-new-lucid.el: Added function
+  w3-zone-at that returns the zone at the position passed to the function
+  (can be point or marker).
+* w3.el: Changed the inlined images to have the highlight attribute if
+  possible.
+* w3-emacs.el, w3-emacs19.el, w3-new-lucid.el, w3.el: Rewrote lots of
+  functions so that inlined images are stored in their own zone, and
+  control-middle-mouse-button or M-x w3-follow-inlined-image will fetch
+  the inlined image and send it to an external viewer. w3-follow-link will
+  also get an inlined image if it cannot find a hyperlink or a form entry
+  area under cursor.
+* w3-emacs.el: Added w3-zone-eq for emacs 18 so that radio buttons will
+  work.
+* w3.el: Changed w3-handle-graphics so that if w3-delay-image-loads is t,
+  use a marker instead of an absolute (point) reference.
+* w3-new-lucid.el: Fixed a problem in the delayed image loading - would
+  always try to find w3-working-buffer, which would (should) not exist
+  when doing a delayed load.
+* w3-new-lucid.el: Added missing interactive spec to
+  w3-load-delayed-images
+* w3-new-lucid.el: Added function w3-load-delayed-images, and activated
+  the delay image load menu choice, added load delayed images menu choice.
+* w3.el: A few changes to the gopher support - should recognize gopher
+  directories more reliably.
+* dist.Makefile: Fixed distribution makefile to use the new system of 1
+  large file.
+* w3.el: Fixed problem with radio buttons - if more than one was set due
+  to bad use of the CHECKED argument, then it would not let you turn one
+  of them off.
+
+Sat Jan 22 12:36:28 1994  William M. Perry  (address@hidden)
+* w3.el: Fixed problem where unknown tags in a <PRE> or <XMP> segment were
+  getting nuked - bad when trying to show source code with < and > in them
+  - large chunks would disappear.  Thanks to Magnus Y Alvestad
+  <address@hidden> for noticing the problem.
+
+Fri Jan 21 20:52:24 1994  William M. Perry  (address@hidden)
+* w3.el: Merged most of the files into one large one.
+* w3.el: Parse out mime-types file if it exists at startup.
+* w3-epoch.el: Changed epoch to use the class name Emacs instead of emacs.
+* w3.texi: Fixed dumb mistake in documentation about w3-mode-hooks and
+  list indentation
+* w3.el: Keep/restore tab-stop-list when going into w3-mode
+* w3-new-lucid.el, w3-lucid.el, w3-emacs19.el: Renamed a few menu items,
+  and activated 'forward' and 'back' buttons.
+
+Thu Jan 20 23:27:31 1994  William M. Perry  (address@hidden)
+* w3-epoch.el: No longer remove numbers and periods from zones in
+  w3-fix-extent-endpoints
+* dist.Makefile: Fixed the 'make install' target.
+
+Thu Jan 20 15:55:04 1994  William M. Perry  (address@hidden)
+* w3-parse.el: Did a bit of cleaning up in the parsing code -
+  obsolete/short functions removed or merged.
+
+Wed Jan 19 20:15:14 1994  William M. Perry  (address@hidden)
+* w3.el: Added version # of efs/ange-ftp to the bug report template.
+* w3-new-lucid.el: Took out deletion of region when conversion of pixmaps
+  failed . . . don't need it in lucid
+* w3-new-lucid.el: Put in quick hack to go to 1+ extent-start-position to
+  get around bug in lemacs 19.9
+* w3-new-lucid.el, w3-epoch.el: Changes to the graphics code to work with
+  the new w3-request-* variables
+* w3-forms.el, w3-mime.el, w3-misc.el, w3-url.el, w3-vars.el: Using new
+  variables to control extra headers in MIME requests, as well as
+  specifying methods/data.
+
+Tue Jan 18 15:13:33 1994  William M. Perry  (address@hidden)
+* w3-mime.el: Changed mailcap parsing to strip out leading/trailing spaces
+* w3-forms.el: Changed w3-form-encode to check if the query is empty
+  before doing a substring.  Thanks to Michael Jankowski for noticing the
+  problem
+* w3-forms.el: Applied patch from Michael Jankowski to fix a problem in
+  w3-finish-text-entry in emacs 19 - tried to change text properties in a
+  read-only buffer
+* w3-misc.el, w3-mule.el, w3-url.el, w3-viewers.el: Miscellaneous patches
+  by Shin-ya Sato <address@hidden> for MULE support
+* w3-lucid.el, w3-new-lucid.el: Removed reference to 'value' from
+  w3-x-popup-menu - might not always be bound.
+* w3-url.el: Changed newsgroup handling yet again - can now work with
+  either Flee's nntp or the original nntp.el by Umeda.  No longer
+  require's gnus.
+* w3-new-lucid.el: Wrapped the make-pixmap call in a condition-case for
+  safety.
+* w3-epoch.el: Changed w3-insert-graphic to insert a '^' to attach the
+  graphic to.
+* w3-new-lucid.el: Changed w3-insert-graphic to create a larger extent
+  instead of using '^' - looks much better now.
+* w3-parse.el: Changed w3-handle-graphics to not insert a '^' for each
+  graphic - leave that up to w3-insert-graphic if it needs it.
+
+Mon Jan 17 22:32:40 1994  William M. Perry  (address@hidden)
+* w3-vars.el: Added image/x-xbitmap to the list of graphics converters.
+* w3-lists.el, w3-parse.el: Changed handling of <LI SRC> to only check if
+  w3-insert-graphic is defined, not hardcoded just for epoch.
+* w3-url.el: Directory listings in local file and ftp access now have
+  icons.
+* w3-epoch.el: Cacheing of images will now only store the image once, not
+  once for every time it is used.
+* w3-new-lucid.el: Graphics work now - image/xbm's are translated into the
+  foreground and background color of the 'default face.
+* w3-gopher.el: Gopher handling now spits out icons with appropriate ALT
+  refs.
+* w3-epoch.el: w3-insert-graphic is now only defined if epoch was compiled
+  with graphic zone support.
+
+Sat Jan 15 20:20:59 1994  William M. Perry  (address@hidden)
+* w3-gopher.el: Added patch to w3-grok-gopher-link from Alastair Burt.
+  Also added support for gopher urls with searches embedded in them
+  (Mosaic-style searches with '?' instead of tab.
+* w3.el: Added printing of whether you are in Mule, and the window system
+  andd window system version in w3-submit-bug.
+
+Fri Jan 14 22:37:42 1994  William M. Perry  (address@hidden)
+* w3-mime.el: Fixed authentication - was looking for the wrong header.
+  Also added support for using the URI: field instead of the Location:
+  field to get in sync with the latest HTTP/1.0 specification.
+* w3-lists.el: Few more message->w3-lazy-message conversion
+
+Thu Jan 13 23:15:36 1994  William M. Perry  (address@hidden)
+* w3-gopher.el: Added patches to w3-gopher.el from Alastair Burt
+  <address@hidden> that fixed a few problems.
+* w3-mule.el, w3-url.el: Miscellaneous mule enhancements
+
+Wed Jan 12 19:41:05 1994  William M. Perry  (address@hidden)
+* w3-new-lucid.el: Fixed problem with my misunderstanding of the 'end-open
+  and 'start-open extent properties.
+* w3-lucid.el, w3-new-lucid.el: Added patch by Alastair Burt
+  <address@hidden> that changes w3-x-popup-menu to do a
+  completing-read if the last event was not a button/menu event.
+* w3-viewers.el: Fixed w3-save-binary-file
+* w3-mime.el: Changed w3-parse-mailcap to use new variable
+  w3-mime-mailcap-overrides.  If t, then entries in the users mailcap file
+  will replace the defaults in w3-mime-viewers.
+* w3-misc.el: Changed w3-upcase-region so that it will not touch entity
+  declarations either.
+
+Mon Jan 10 22:43:51 1994  William M. Perry  (address@hidden)
+* w3-parse.el: REL and REV attributes of links can now be comma-separated
+  lists.
+* w3-parse.el: Fixed broken regular expression in <LINK> parsing
+* w3-lists.el: Fixed problem of paragraphs within lists having the
+  highlighting stripped from the first character.
+* w3-parse.el, w3-url.el: Changed most of the unimportant 'message's to
+  use w3-lazy-message instead.
+* w3-url.el: Added variable w3-show-status.  If nil, no messages will be
+  shown in the modeline showing where the current retrieval/parse is at.
+* w3-parse.el: Added patch by Rainer Pruy
+  <address@hidden> that shows the SRC attribute of
+  IMG tags if no ALT tag is given.
+* w3-emacs.el: Added mouse support for emacs 18
+
+Sat Jan  8 20:32:46 1994  William M. Perry  (address@hidden)
+* w3-url.el: more support for bad HTTP: links
+* w3-misc.el, w3-mule.el, w3-viewers.el: Applied a patch from Shin-ya Sato
+  <address@hidden> that keeps MULE from encoding binary data it
+  receives from subprocesses, etc.
+* w3.el: Added tab-width to the list of variables saved in w3-mode.
+* w3-gopher.el: CSO searching now works.
+* w3-vars.el: Changed default value of w3-delimit-emphasis to take MULE
+  into account.
+* w3-url.el: Added function w3-build-url that will build a URL in stages.
+  Not used anywhere yet.  Thanks to T.V. Raman for suggesting it.
+* w3-gopher.el: Fixed gopher support for using gateways.  Won't give
+  errors at top and bottom of buffer.
+* w3-misc.el: Changed w3-hexify-string so that it won't hex slashes in the
+  string.
+* w3.el: Another check for efs-auto added
+
+Fri Jan  7 23:53:19 1994  William M. Perry  (address@hidden)
+* w3.el: Changed checking of efs/ange-ftp to also check for efs-auto
+  before loading ange-ftp.
+* w3-emacs19.el, w3-lucid.el, w3-new-lucid.el: Changed menu handling to
+  ignore links with nil HREFs when making the 'links...' menu.
+* w3-gopher.el: Changed w3-convert-ask-to-form for better handling of
+  SELECT boxes that have no choices.
+* w3.el: Added w3-leave-buffer.  Does a bury-buffer on the current buffer
+  instead of killing it.
+* w3-mime.el: Fixed problem where using telnet in a subprocess would chop
+  off lots of front of incoming data.  Bad kill-line in
+  w3-is-mime-response.
+* w3-misc.el, w3-url.el, w3-viewers.el: Changed all yes-or-no-p/y-or-n-p
+  functions to use the function specified by w3-confirmation-func
+
+Thu Jan  6 23:58:37 1994  William M. Perry  (address@hidden)
+* w3-gopher.el: Changed gopher parsing routines to print the type of the
+  link in the listing.  The text describing the link is configurable by
+  the variable w3-gopher-labels.
+* w3-gopher.el: More tweaks for more mosaic-like behavior
+* w3-parse.el: Searchable gopher objects no longer become inlined forms -
+  selecting them creates the form, as in Mosaic.
+* w3-gopher.el, w3-url.el: Switched gopher handling to use Mosaic's type
+  of double-typing.  This makes it much easier to get searching done right
+  (whether it needs a 7/ or not, etc).
+
+Wed Jan  5 14:15:02 1994  William M. Perry  (address@hidden)
+* w3-typecheck.el: Use new variable w3-passwd-entry-func instead of
+  hard-coding ange-ftp-read-passwd.
+* w3.el: Reworked some of w3-do-setup, and added comments
+* w3.el: Changed to only require 'ange-ftp if not using efs.
+* w3-lists.el: Did some work on the DL handling
+* w3-url.el: Directory formatting routine will now include last file
+  modification date and size if possible.  If not date data is returned by
+  file-attributes, or current-time-string does not take a parameter, then
+  no date is shown.  Size is usually shown (almost always if you use EFS
+  instead of ange-ftp)
+* w3.texi: Round and round he texinfo's, where he stops, noone knows.
+
+Tue Jan  4 23:00:35 1994  William M. Perry  (address@hidden)
+* w3-gopher.el: Fixed problem in handling of gopher text files . . . were
+  always being parsed as HTML.
+* w3-forms.el: Fixed dumb problem in encoding a gopher+ ASK form.
+* w3.texi: Initial revision
+
+Mon Jan  3 19:06:17 1994  William M. Perry  (address@hidden)
+* All files: Updated copyright notices
+* w3-lists.el: UL and OL lists can now have <LI ALT="some text" SRC="some
+  image">
+* w3-misc.el: Renamed w3-rassq-with-equal to w3-rassoc
+* w3-emacs.el, w3-emacs19.el: Fixed stupid problem where I was trying to
+  call the x-store-cut-buffer function even if not in X
+
+Sun Jan  2 22:47:02 1994  William M. Perry  (address@hidden)
+* w3-misc.el: Added a function to break up a menu description into smaller
+  chunks and submenus.
+* w3-gopher.el: Now smarter about when to parse out a gopher object as a
+  directory listing
+* w3-emacs19.el, w3-lucid.el, w3-new-lucid.el, w3-emacs.el, w3-epoch.el:
+  Added function w3-store-in-x-clipboard
+* w3.el: w3-save-url will now copy the url into the X clipboard
+* w3.el: Added autoloads that autoload.el can understand.
+* w3-forms.el: Forms links will now highlight when the mouse moves over
+  them in lucid emacs (and any other flavor that eventually supports them
+  in its version of w3-add-zone)
+* w3-gopher.el: Fixed dumb problem where parts of the gopher+ selector
+  string were being left in w3-current-file, so things like w3-view-url,
+  etc were getting the wrong information.
+* w3-gopher.el: Fixed stupid problem where I didn't convert the gopher
+  selector strings into url encoding before creating the <A> tags in
+  w3-format-gopher-link.  This caused gopher links with spaces/tabs/etc to
+  not be parsed correctly.  Thanks to John Ladwig <address@hidden>
+  for noticing the problem.
+
+Sat Jan  1 20:08:19 1994  William M. Perry  (address@hidden)
+* w3-parse.el: Added support for showing some of the HTTP/1.0 headers in a
+  buffer. Controlled by the new variable w3-show-headers.  Should be a
+  list of HTTP/1.0 headers (all lowercase) to include at the end of the
+  buffer. If nil, nothing will be shown.  Thanks to Jared Rhine for
+  suggesting it.
+* w3-gopher.el: Removed multiple definitions of w3-parse-gopher, and
+  revamped the handling of gopher titles. 
+* w3-misc.el: Changed w3-batch-fetch to be more robust - is now able to
+  retrieve any type of information, and the user can specify whether they
+  want formatted text, raw HTML, or transfer in binary mode.
+* w3-parse.el: Changed the fill-column and <HR> calculation routines to
+  honor the new variable w3-strict-width.
+* w3-misc.el: Removed some useless variables from w3-get-url-at-point in
+  the eternal quest for less compilation warnings.
+* w3-misc.el: Fixed problem in w3-strip-leading-spaces and
+  w3-eat-trailing-space
+* w3-parse.el: The link building code will now remove all entity
+  references in the link text before storing it in the zone - this means
+  that the menu building code and w3-complete-link will no longer have
+  unresolved entities in them looking nasty.
+* w3-misc.el: Added function w3-fix-entities-in-string.  Takes any string
+  and removes all entity references within it, and replaces it with normal
+  text (uses the w3-html-entities assoc list).
+* w3-new-lucid.el, w3-lucid.el: Added function w3-x-popup-dialog
+
+Fri Dec 31 21:45:04 1993  William M. Perry  (address@hidden)
+* w3-new-lucid.el, w3-lucid.el: Fixed problem in w3-fix-extent-endpoints
+* w3-misc.el: Fixed problem in w3-eat-trailing-space that would always
+  remove one too many spaces.
+* w3-mosaic.el: Added function w3-rename-hotlist-entry to give a new title
+  to an item in your hotlist.  Will not let you use a title that is
+  already a member of the hotlist.
+* w3-emacs19.el, w3-lucid.el, w3-new-lucid.el: Added a few options to the
+  navigation menu
+* w3-url.el: Added a patch from Fran Litterio <address@hidden> that
+  adds variable w3-reuse-buffers.  Also changed the buffer reusing code
+  will skip over w3-working-buffer in its search for a matching url.
+* w3-url.el: Fixed problem in passing things off to gopher-mode with blank
+  selector strings - was not defining a good type (type was set to 0
+  instead of ?1).
+* w3-url.el: Fixed typo in gopher handling
+* w3-gopher.el: Added % retrieved messages when retrieving a gopher+
+  object, fixed problem in gopher parsing for emacs 19.
+
+Thu Dec 30 23:58:19 1993  William M. Perry  (address@hidden)
+* w3-gopher.el: Fixed dumb problem in gopher formatting - didn't check if
+  the selector string was longer than 1 character before trying to extract
+  the first char.
+* w3-misc.el: Fixed major problems with w3-strip-leading-spaces and
+  w3-eat-trailing-space again.
+* w3-forms.el: Added support for submitting gopher+ ASK blocks
+* w3-url.el: Changed gopher support/url parsing routines to handle gopher+
+  and gopher ASK blocks without warping the URLs too much.
+* w3-gopher.el: Added in gopher+ support
+* w3.el: Fixed viewing of gopher links for new storage format.
+* w3-gopher.el, w3-url.el: Revamping gopher
+* w3-vars.el: Added variable w3-gopher-to-mime
+* w3-vars.el: Added variable w3-gopher-types
+
+Thu Dec 30 13:57:53 1993  William M. Perry  (address@hidden)
+* Added support for Mule (Multi-Lingual Emacs), mainly highlighting of
+  links.  Thanks to address@hidden for the patches.
+* w3-next.el: Added provide 'w3-next
+* w3-parse.el: Might have fixed the over-run into other words/spaces
+  in link highlighting.
+
+Wed Dec 29 23:33:07 1993  William M. Perry  (address@hidden)
+* w3-misc.el: Added function w3-fetch-url-at-point... thanks to Torre
+  J. Wenaus <address@hidden> for the code.
+* w3-parse.el: Back to using window-width as starting point for
+  w3-right-border.
+* w3-vars.el: Removed variable w3-hypertext-extns
+* w3-mosaic.el:  Removed support for adding old gopher-mode pages to
+  the hotlist.  Trying to get people to use hypertext-gopher-mode.
+* w3-next.el: Initial revision
+* w3-gopher+.el: Added new function w3-convert-ask-to-form that
+  converts a Gopher+ ASK block into an HTML form.
+* w3-forms.el: Value and default value are now reset for each SELECT
+  area in forms.
+* w3-vars.el: Changed default gopher handling to be in hypertext.
+
+Tue Dec 28 17:41:51 1993  William M. Perry  (address@hidden)
+* w3-url.el: Can now handle http:/somefile - it will substitute the
+  server and port of the current document to make a complete url.
+* w3-forms.el: Names in INPUT tags can be empty
+* w3-auth.el, w3-emacs.el, w3-emacs19.el, w3-epoch.el, w3-forms.el,
+  w3-lists.el, w3-mime.el, w3-misc.el, w3-parse.el, w3-typecheck.el,
+  w3-url.el, w3-vars.el, w3.el: Removed lots of references to bound
+  but unreferenced variables.
+* w3-misc.el, w3-url.el, w3-vars.el, w3.el: Added new variables
+  w3-mail-command and w3-mail-other-window-command. These variables
+  will control what functions are called when w3 needs to send mail.
+  W3 tries w3-mail-other-window-command only if w3-mutable-windows is
+  t, then w3-mail-command if this function is not bound.  Then goes to
+  mail-other-window, then just to mail.
+
+Fri Dec 24 03:21:58 1993  William M. Perry  (address@hidden)
+* w3-url.el: Formatting directories now gives a progress indicator in
+  % of files converted to hypertext listing.
+* w3-url.el: Added code to check for whether a file is a symbolic
+  link.  If it is, then put in an arrow and the name of the link (like
+  ls -l).
+
+Thu Dec 23 18:53:54 1993  William M. Perry  (address@hidden)
+* w3-epoch.el, w3-misc.el, w3-parse.el, w3-typecheck.el, w3-vars.el:
+  Replaced long regular expressions for checking whether a URL is
+  relative  or not with a variable w3-nonrelative-link to save
+  space/typing, and it will be easier to change in the future.
+* w3-misc.el: Added function w3-batch-fetch to retrieve all the urls
+  passed to it on the command line and save them as text files.
+  Thanks to Jared Rhine for suggesting it.
+* w3-parse.el: Removed use of screen-width/window-width when computing
+  fill column.  Uses old value of fill-column.
+* w3-mosaic.el: Fixed problem in new personal annotation parsing code
+  that would barf if you didn't have any personal annotations.
+
+Thu Dec 23 16:28:22 1993  William M. Perry  (address@hidden)
+* w3-mosaic.el: Made lots of changes to the personal annotation
+  handling.  Deletion will work properly now (won't mess up the
+  internal representation of the annotations), support for the real
+  Mosaic annotation format (more than one annotation on a url yields
+  only one line in the annotation LOG file), figures out the highest
+  annotation number instead of using the last line in the file +1.
+* w3-emacs.el: Added definition of w3-create-faces.
+* w3-gopher+.el: Initial revision
+* w3-gopher.el: Fixed quite a few problems with gopher support.
+
+Tue Dec 21 06:47:50 1993  William M. Perry  (address@hidden)
+* w3-parse.el: Fixed idiotic problem where no PRE segments were being
+  rendered.  *sigh*
+
+Sat Dec 18 15:03:59 1993  William M. Perry  (address@hidden)
+* w3-url.el, w3-gopher.el, w3-forms.el: Added support for searching in
+  gopher.  Transforms into a special type of form, like <ISINDEX>
+  tags.  Only works if retrieved from a gopher listing right now.
+* w3-vars.el: Changed default viewer for text/plain to be w3-mode
+* w3-parse.el: Fixed problem with recursive filling of paragraphs - if
+  there were too many <PRE> segments, then it would die from recursing
+  too much. Thanks to Tom Tromey <address@hidden> for pointing
+  out the problem.
+
+Fri Dec 17 23:01:57 1993  William M. Perry  (address@hidden)
+* w3-url.el: Changed the display of XX of YY bytes transferred in
+  HTTP/1.0 responses to be optional.  Would mess some people up that
+  are behind gateways using telnet, etc.  Variable is
+  w3-show-http2-transfer.
+* w3-lists.el: Added support for <LI SRC="blahblahblah"> for list
+  items with icons, etc.
+* w3-epoch.el:  Rewrote the resource fetching routines to me
+  consistent with emacs 19 and lucid emacs.
+* w3-lucid.el, w3-emacs19.el, w3-epoch.el, w3-new-lucid.el: Moved all
+  face creation stuff into w3-create-faces.
+* w3-vars.el: Fixed typo in w3-graphic-converter-alist
+* w3-vars.el: Added keybindings > & < to go to end/beginning of
+  document.  Added functions w3-end-of-document and
+  w3-start-of-document to go the end and beginning of a document
+  respectively.
+* w3-forms.el: Fixed a problem in the new text area support.
+* w3-forms.el, w3-typecheck.el: Reworked quite a bit of stuff to get
+  forms submissions working correctly. You no longer have to keep
+  buffers around until you submit the form, and the default text (or
+  the current value of the button) is inserted each time you edit the
+  form area.
+* w3-mime.el:  Changed w3-parse-mime-viewers to split the Accept:
+  string onto one or more lines as appropriate, as the NCSA server
+  doesn't seem to like the long Accept: line when POSTing a form.
+* w3.el: Merged in support for NeXT emacs from Laurent Dami
+  <address@hidden> (emacs 18.58 on NeXTstep)
+* w3-emacs.el, w3-emacs19.el, w3-epoch.el, w3-lucid.el,
+  w3-new-lucid.el: Added function w3-setup-version-specifics that will
+  do any required fiddling for each version of emacs.
+
+Thu Dec 16 23:22:08 1993  William M. Perry  (address@hidden)
+* w3-new-lucid.el: Fixed problem with w3-fix-extent-endpoints failing
+  when an extent was completey spaces/newlines
+* w3-forms.el: Changed regular expressions to allow one or more =
+  signs in name/value tags.
+* w3-forms.el: Made input tags with NAME of isindex do an automatic
+  submission, ala Mosaic, and address@hidden's suggestion on
+  www-talk that browsers should standardize on this hack.
+* w3-parse.el: Changed form-based searching to use an input tag of
+  NAME isindex like Mosaic.
+* w3-parse.el: Fixed error in new header routines. Would bomb if a
+  header was not terminated correctly.
+* w3-parse.el: No longer remove tabs at the beginning of the buffer -
+  was messing up lists.  Still removes spaces/newlines
+* w3-forms.el, w3-parse.el: Added real support for TEXTAREA tags, and
+  wrap TEXTAREA input tags in PRE segments.
+* w3-forms.el: Fixed bad regular expression in forms mode that would
+  cause tags with VALUE="" to be drawn wrong.
+* w3-newparse.el, w3-url.el: Use new function w3-lazy-message instead
+  of message.  Will not update the modeline if called more than once a
+  second.  Thanks to Jamie Zawinski <address@hidden> for the patches.
+* w3-viewers.el: Starting viewers no longer starts an interactive
+  shell & exec.  Thanks to Jamie Zawinski for showing me that it was a
+  dumb thing to do :)
+* w3-new-lucid.el: Initial revision
+* w3-vars.el, w3.el, w3-lists.el: Changed occurences of w3-running-era
+  to w3-running-new-lucid
+* w3.el: Moved creation of w3-mime-accept-string into w3-do-setup
+* w3-epoch.el: Fixed problem in epoch form entry.
+* w3-forms.el: Changed assignment to free variable method in w3-handle-forms.
+* w3-forms.el: Fixed the revert button bugs in emacs 19.
+* w3-emacs19.el: changed w3-delete-zone to use remove-text-properties
+  instead of putting nil text properties.
+* w3-emacs19.el: Changed w3-delete-zone to remove the face and
+  mouse-face properties. 
+
+Wed Dec 15 22:56:43 1993  William M. Perry  (address@hidden)
+* w3-lists.el: Added a 't' to calls to replace-match so that the case
+  is preserved.
+* w3-vars.el: Added variable w3-list-chars-assoc for specifying what
+  characters to insert at the front of lists.
+* w3-lists.el: Can now control what characters are inserted at the
+  front of a list. See w3-list-chars-assoc for details.
+
+Wed Dec 15 20:41:02 1993  William M. Perry  (address@hidden)
+* Version 1.7.14
+* w3-forms.el: Fixed problem with resetting popdown menus to the
+  defaults.
+* w3-epoch.el: Rewrote w3-fix-extent-endpoints to remove
+  newlines/whitespace from front of zones also, as well as numbers &
+  periods.  This will fix lists, but might mess up real links once in a
+  while.  Oh well, epoch won't be around much longer anyway.
+* w3-mosaic.el: Fixed bug in w3-write-global-history where 'nil' in
+  the history would cause it to choke.  Thanks to address@hidden
+  for noticing the problem.
+* w3-emacs.el: Changed the w3-fix-extent-endpoints to remove
+  newlines/whitespace from the front of zones also.
+* w3-lists.el: Changed the list handling code to use
+  insert-before-markers if using emacs 18.  This keeps the
+  indentation/numbering to not become part of the zones.
+* w3-emacs19.el: Fixed a few errors with the new forms/link movement
+  code
+* w3-emacs19.el: Changed w3-follow-link to not die on links with no
+  data.
+* w3-emacs19.el: Changed w3-forward-link and w3-back-link to honor
+  forms entry areas.
+* w3-vars.el: Changed definition of w3-header-char-assoc to use BR correctly
+* w3-parse.el: <BR> tags are rendered a little better now - no extra
+  spaces from the fill-region will make them look odd.
+  
+Tue Dec 14 21:41:29 1993  William M. Perry  (address@hidden)
+* w3-url.el: Added checking to w3-fetch to see if a buffer visiting a
+  URL already exists before fetching it.  Offers to reuse the old one if
+  found.
+* w3.el: Changed w3-save-url to be more consistent with the other
+  commands that muck with URLs.  C-k grabs the current URL into the kill
+  ring, and C-k with a prefix arg grabs the URL under pt into the kill
+  ring.  Thanks to Jared Rhine for pointing out the inconsistency.
+* w3-mosaic.el: Added function w3-append-hotlist.  This will append a
+  hotlist to the one currently in memory.
+* w3-parse.el: Fixed problem where <P> breaks after a header item were
+  not being erased.
+* w3-misc.el: Added function w3-upcase-region that will convert a
+  region of text to uppercase, but ignore any text in it that is between
+  < and >.  This will stop it from changing the links references within
+  <A> tags.
+* w3-vars.el: Changed the header assoc list to use w3-upcase-region
+  instead of upcase region.  Was causing links in headers to point to
+  the wrong files.
+* w3-era.el, w3-lucid.el: Added patch from Alastair Burt that fixes a
+  few problems in the lucid menu handling code (malformed, plus trims
+  the menu items to w3-lucid-max-item-size so that they don't shoot off
+  the sides of your screen.
+* w3-url.el: Added a space at the end of the prompt in w3-open-local
+* w3.el: Changed w3-reload-document so that it remembers where you
+  were in the buffer and repositions you there.
+* w3-mime.el: Changed the format of w3-mime-accept-string so that it
+  can be used in other places.
+* w3-misc.el: Added functions w3-forward-in-history and
+  w3-backward-in-history.  This will first try to find the actual buffer
+  recorded in the history list, then any buffer with the same URL, then
+  goes to point in those buffers.
+* w3-vars.el: Added new variable w3-current-next-link and
+  w3-current-last-link that are buffer-local.  These store the history
+  information for this buffer.
+* w3.el: Changed a few functions to use the new history mechanism
+* w3-url.el: Modified w3-fetch to store history items in the new
+  variables
+  
+Mon Dec 13 23:39:20 1993  William M. Perry  (address@hidden)
+* w3-emacs.el: Finished function w3-fix-extent-endpoints, but need to
+  do something about the markers moving in front of list items.
+  w3-fix-extent-startpoints or something similar.
+* w3-lucid.el: Added missing function 'w3-delete-zone Fixed menu
+  generation error
+* w3-misc.el: Changed w3-maybe-relative and a few other functions to
+  take an optional 'DATA' parameter for using the POST command,etc.
+* w3-forms.el: Fixed a few problems with non-POSTing forms submissions
+* w3-parse.el: Removed code to eat newlines/whitespace at the
+  beginning/end of links.  Was causing errors if links were within PRE
+  segmens (actually, only if a link was the last thing in a PRE segment,
+  and it had whitespace after it, and before the </PRE>
+* w3-forms.el: Fixed problem with forms <SELECTION MULTIPLE> support.
+  Wasn't giving the fake checkboxes any 'value's, so it was reported as
+  'ON' to the server, not the name of what was selected.  Also fixed a
+  problem where the option variable in SELECTION handling wasn't being
+  set to nil each time, so each successive SELECTION tag would get more
+  and more choices.
+* w3-parse.el: Added call to function w3-fix-extent-endpoints.  Should
+  fix the problem with forms eating newlines/spaces at the end of form
+  entry areas when new data is entere.
+* w3-forms.el: Fixed problem in forms submission.  Would die if the
+  first item in a form was a SELECTION - it was not storing the
+  method/actionurl if it was.
+
+Sun Dec 12 20:54:44 1993  William M. Perry  (address@hidden)
+* w3-epoch.el: Added function w3-fix-extent-endpoints
+* w3-emacs.el, w3-emacs19.el, w3-era.el, w3-lucid.el: Added new
+  function w3-fix-extent-endpoints.  Makes extents smaller if they have
+  newlines/whitespace at the end.  This will keep the forms support from
+  killing newlines whenever you do a form entry.
+* w3-cache.el: Added code to store stuff in cache as compressed
+  (gzipped) data.
+* w3-url.el: HTTP links like http://cs.indiana.edu are now recognized
+  (no longer needs the trailing '/'
+* w3-lists.el: Fixed problem where alternating <P> tags would
+  disappear within lists.  Over-aggressive regular expression.
+* w3-url.el: Changed the handling of content-length - using
+  w3-parse-mime-headers was causing an infinite loop in redirection.
+* w3-mime.el: Fixed a few problems in the redirection handling because
+  of switching to lower-case headers in w3-current-mime-headers.
+* w3-url.el: Added support for using the content-length header in
+  HTTP/1.0 responses to show how big the file is in the minibuffer.
+* w3-mime.el: Changed the MIME parsing routines to save the header
+  fields in lowercase.
+* w3-emacs.el: Fixed dumb problem in w3-complete-link for emacs 18.
+  Left out a call to w3-zone-data.
+* w3-url.el, w3-forms.el: Replaced use of member with w3-member.
+* w3-forms.el: Fixed error in regular expression where buttons with
+  spaces in their VALUE fields would not be rendered.
+* w3-viewers.el: New way to specify whether to view process output or
+  not.  w3-working-buffer is always destroyed if a viewer is invoked.
+* w3-vars.el: Added variable w3-always-show-output.
+* w3-vars.el: Changed def. of &yuml; to be ?\377 instead of the actual
+  character 377.  Was causing problems with CVS.
+* w3-parse.el: Whitespace at the beginning of buffers will now be
+  erased.  Headers will now be a little more intelligent about how they
+  do line/paragraph breaks.  Headers can now be shown on text terminals
+  by the variable w3-header-chars-assoc.  Thanks to Jared Rhine for the
+  suggestion.
+* w3-parse.el: Added support for user-customizable text before and
+  after headers
+* w3-misc.el: Changed w3-eat-trailing-spaces and
+  w3-strip-leading-spaces to get ride of newlines too.
+* w3-vars.el: Added the variable w3-header-chars-assoc to have
+  formatting of headers on dumb terminals.
+
+Fri Dec 10 21:14:07 1993  William M. Perry  (address@hidden)
+* w3-lists.el: Fixed bug where lowercase list tags (ol instead of OL)
+  would cause an infinite loop if there were within another list.  Left
+  out an (upcase (..))
+  
+Thu Dec  9 23:24:10 1993  William M. Perry  (address@hidden)
+* w3-forms.el: Changed the handling of MULITPLE selections in option
+  lists to be a <UL> of the options, all checkboxes with the same name.
+
+Wed Dec  8 22:46:07 1993  William M. Perry  (address@hidden)
+* w3-lists.el: Fixed a bug where PRE segments within lists would be
+  ignored and filled.
+* w3-forms.el: Added support for the SEVERAL/MULTIPLE attribute on the
+  SELECT input tag.  Rendered as a preformatted list of checkboxes.
+* w3-misc.el: Added function w3-eat-trailing-space
+* w3-mime.el: Fixed a dumb problem where I forgot a "%s" in a format
+  string and so wasn't sending any data during a POST forms submission
+* w3-forms.el: Added support for POST submission of forms
+* w3-mime.el: Added a 'data' field to the w3-create-mime-request
+  function.  This will make it easy to implement post in a more
+  generalized way later.
+* w3-url.el: Added ability to send arbitrary data down through
+  w3-fetch, w3-retrieve, and w3-http.  Useful for POST method.
+* w3-emacs19.el: Removed patch for double-skipping of links in early
+  versions of emacs.  People using < 19.21 should upgrade.
+* w3-lists.el: Nested lists should now be a little quicker.  Also
+  fixed the problem where paragraphs within lists would have an extra
+  space at the beginning of the first line.
+* w3-forms.el: Changed w3-do-form-entry to do w3-delete-zone before
+  deleting the text contained by the zone.  Previous behavior would make
+  emacs19 bomb with an error.
+* w3-typecheck.el: Changed the option reading so that it checks
+  whether w3-x-popup-menu returns a cons pair or a plain string and acts
+  accordingly.
+* w3-docomp.el: Added lots of autoloads to get rid of compilation errors
+* w3-mime.el: Changed the header parsing to get _ALL_ the headers and
+  store them in an assoc list instead of just getting the 3 or 4 I need
+  now.  Will make it easier to expand on later when the HTTP/1.0 spec
+  grows.
+* w3-vars.el: New variable w3-current-mime-headers, which is an assoc
+  list of MIME headers for each document.
+* w3-url.el: Changed w3-retrieve so that if a response it not an
+  HTTP/1.0 response, add its name to w3-bad-server-list if it is not
+  already a 'member'.
+* w3-mime.el: Added support for the new '204 NoResponse' HTTP/1.0
+  response.  No new document is displayed.
+
+Tue Dec  7 21:09:21 1993  William M. Perry  (address@hidden)
+* w3-forms.el: Some revisions to try and make the radio button
+  toggling faster.  Will now only change the radio button(s) that are
+  set to be off, and the one that is supposed to be on, on.
+* w3-lucid.el, w3-epoch.el, w3-era.el, w3-emacs19.el: Added function
+  w3-zone-eq
+* w3-era.el: Fixed typo in w3-zone-data that was causing forms to
+  screw up.
+* w3-forms.el, w3-newparse.el: Use 'intern' instead of read
+* w3-emacs19.el: Removed the local-map from the text properties.  Put
+  it in the distribution by mistake.
+* w3-emacs19.el: applied patch from <address@hidden> to fix
+  skipping 2 links when going backwards.
+* w3-html+.el: Fixed a missing ) or two
+* w3-cache.el: Initial revision
+* w3-vars.el: Added variables for document caching.
+* w3-html+.el: Trying to get tables working better
+
+Mon Dec  6 23:04:01 1993  William M. Perry  (address@hidden)
+* w3-era.el: Fixed dumb error where w3-follow-link would try to fetch
+  the text of the link, not the url of the link.
+* w3-emacs19.el: Fixed a few things with the new text properties
+  support.
+* w3-forms.el: Removed reference to free variable prompt in
+  w3-do-form-entry.  Cut & pasted a few too many lines.
+* w3-forms.el: Changed all the form handling routines that reformatted
+  the buffer to use w3-form-format-<input-tag-type> instead of reusing
+  the code.  Was causing some inconsistent redraws.  Thanks to Arup
+  Mukherjee <address@hidden> for noticing the problem.
+* w3-parse.el: Styles will now work again in epoch.  Needed to
+  re-apply a patch that got lost in a hard drive crash.  Thanks to Henry
+  A. Rowley <address@hidden> for the patch.
+* w3-emacs19.el: Fixed problem in the making of menus.  Had a (list
+  ...) that included the 'displayable' option in the menu vectors.
+  Thanks to Jorge Sousa Pinto <address@hidden> for noticing the
+  problem.
+* w3-emacs19.el: Fixed a cut&paste error - multiply defined functions
+  and a lot of typos in w3-complete-link
+* w3-misc.el: Added function w3-strip-leading-spaces
+* w3-era.el: Changed the w3-complete-link routine to strip spaces from
+  the front of links so that all of them will be visible.
+* w3-lucid.el, w3-epoch.el, w3-emacs19.el, w3-emacs.el: Changed the
+  w3-complete-link routine to strip spaces from the front of links so
+  that all of them will be visible.
+* w3-vars.el: A few revisions to the default settings of
+  w3-style-chars-assoc
+* w3-vars.el: Added the variables w3-style-chars-assoc and
+  w3-delimit-emphasis for doing text-based markup.
+* w3-parse.el: Added the ability to have characters that define the
+  start and end of a region of formatting (ie: * surrounds bold text, _
+  surrounds underlined text, etc).  Controlled by w3-style-chars-assoc
+  and w3-delimit-emphasis variables.  Thanks to Jared Rhine for
+  suggesting it.
+
+Sun Dec  5 21:38:23 1993  William M. Perry  (address@hidden)
+* w3-url.el: fixed typo in w3-open-local-internal.
+* w3-url.el: Disabled use of w3-be-asynchronous for now
+* w3-era.el: Enabling/disabling of Era menus now cleaner than in lucid
+* w3.el: Menus will now be created when running in Era
+* w3-vars.el: Added face-specific stuff for Era, and modified the
+  default value of w3-delimit-links to take the w3-running-era variable
+  into account.
+* w3-vars.el: Better checking of the various w3-running-* variables.
+  I long for the day when they will all merge. :)
+* w3-era.el: Added support for 'viewing' a form entry area with
+  w3-view-this-url Will message the name and type of the form entry
+  area, but returns nil if called with no-show 't'.
+* w3-era.el: More changes to be era-specific
+* w3-era.el: Basic switch to era-specific functions from the lucid
+  cust. file
+* w3-epoch.el: Added alias w3-delete-zone (to epoch::delete-zone)
+* w3-emacs19.el: Added function w3-delete-zone
+* w3-forms.el: Use function w3-delete-zone instead of a large (cond
+  (...)) for using delete-zone, etc.  Easier to add support for new
+  flavors of emacs.
+* w3-vars.el: Added the variable w3-running-era
+* w3.el: Added loading of specific routines for 'era' - the
+  epoch/lucid merge
+* w3-era.el: Initial revision
+* w3-emacs19.el: Fixed a problem in w3-only-links that would return
+  the wrong position if the link was only one character long.
+* w3-misc.el: Added the function w3-reload-all-files.  This will
+  remove all the 'features' 'provided by w3, and then do a (require 'w3)
+  so that the files will all be reloaded.
+* w3-mime.el: Changed the w3-is-mime-response function so that it will
+  remove the HTTP/1.0 request if it has been echoed to the screen,
+  either by telnet or by the tcp.el emulation package.  Thanks to
+  everyone who reported the bug.
+* w3-parse.el: Moved handling of telnet header lines into
+  w3-is-mime-response
+* w3-emacs19.el: Believe I have fixed the w3-complete-links to work
+  with the new use of text properties instead of overlays.  This should
+  fix the problem of the links menu not showing up in X also.  Thanks to
+  T V Raman <address@hidden> for noticing it was broken.
+* w3-mime.el: Framework for '204 No Response' put in
+* w3-auth.el: Removed function w3-encode-password, and put the code
+  into the actual w3-basic-auth, since future versions will probably use
+  different encodings for the username/password pair.
+
+Sat Dec  4 12:54:43 1993  William M. Perry  (address@hidden)
+* w3-forms.el (w3-handle-selections): Added <OPTION SELECTED> support.
+  Thanks to Darrell Kindred for telling me to do it.
+* w3-mime.el (w3-parse-mime-headers): Fixed a problem where redirection of
+  URLS would lose the content-type and other headers of the URL it was
+  redirected to.  Thanks to Jared Rhine for noticing the problem.
+* w3-forms.el (w3-do-form-entry): Fixed a problem where form submission
+  buffers would not stay on top of the buffer stack.  Moved the submit
+  code outside the save-excursion.  Thanks to Darrell Kindred for the
+  suggestion on how to fix it.
+* w3-lists.el (w3-fill-paragraphs-in-list): Dumb problem with too many
+  newlines in paragraphs within lists.  Thanks to Jared Rhine for noticing
+  the problem.
+* w3-parse.el (w3-fix-paragraphs): Fixed a problem where paragraphs before
+  the last <HR> in a buffer were not filled.  Thanks to Jared Rhine and
+  Darrell Kindred for fixes.
+* w3-typecheck.el (w3-read-correct-format): Added a default type checker
+  for unknown tag types.
+* w3-emacs19.el (w3-follow-link): This no longer signals an error if there
+  is no link under point.
+* w3-mime.el (w3-parse-mime-headers): Changed the regexp to extract the
+  Location header from an HTTP/1.0 response so that newlines are stripped
+  from it correctly.  Thanks to Darrell Kindred for sending me the patch.
+* w3-misc.el (w3-open-stream): Added a pause in when connections failed.
+  Thanks to Jost Krieger <address@hidden> for
+  suggesting it.
+* w3-emacs.el (w3-add-zone): Fixed a problem in normal emacs where
+  highlighted text <CODE>TEXT</CODE> would be interpreted as a link.
+  Thanks to T V Raman <address@hidden> for noticing the problem.
+* w3-vars.el (w3-mime-extensions): Changed the default MIME content type
+  to be text/html so that pages like http://cs.indiana.edu/ will be
+  formatted when they don't have a file extension.
+* w3-forms.el: Applied a path from Darrell Kindred that fixed some very
+  odd radio button behavior.
+* w3-forms.el: Believe I have fixed the problem in lucid emacs where
+  choosing a form entry box would eat the character immediately after the
+  input tag.
+* w3-forms.el: Fixed a regexp that would gobble newlines/paragraph breaks
+  after an input tag.  Thanks to Skip Montanaro
+  <address@hidden> for noticing the problem.
+* w3-lists.el: Dumb error in a regexp that would make all <DL> lists
+  disappear was fixed.
+* w3-lists.el: Added roman numeral handing to ordered lists.  Thanks to
+  Tom Loos (address@hidden) for explaining the algorithm and writing
+  some C code I could translate into lisp.
+
+Fri Dec  3 12:04:18 1993  William M. Perry  (address@hidden)
+* w3-lucid.el: Fixed stupid problem where going backwards by 1 link always
+  took you to the first link of a buffer.   Mispaced ) in
+  w3-previous-extent. 
+* w3-emacs19.el: Changed everything to use text-properties instead of
+  overlays.
+* w3-emacs19.el (w3-add-zone): Added preliminary support for just typing
+  into the emacs19 forms.  Will talk to jwz about adding this
+  functionality to lucid emacs.
+
+Wed Dec  1 08:05:02 1993  William M. Perry  (address@hidden)
+* w3-newparse.el: Created this file - has new parsing routines.  Very
+  experimental.  Don't use unless you want it to choke, and then figure
+  out why it choked. :)
+
+Fri Nov 26 03:52:19 1993  William M. Perry  (address@hidden)
+* w3-forms.el: Changed the forms handling routines so that it handles
+  METHOD, ACTION, and ENCTYPE attributes of the <FORM> tag.  METHOD and
+  ENCTYPE aren't used yet.  Thanks to Darrell Kindred for noticing the
+  problem.
+* w3-parse.el: Fixed a formatting problem with the ISINDEX forms
+  replacements.  Was doing a fixed-case replace.  Thanks to Jared Rhine
+  <address@hidden> for noticing the problem.
+* w3-parse.el: Fixed a formatting error with <BR> tags - sometimes spaces
+  were left at the beginning of the continued line.  Thanks to Erich
+  Schneider  <address@hidden> for noticing the problem.
+* w3-misc.el (w3-lookup-style): Fixed dumb bug where I was not
+  de-referencing the variables to the actual #<style> value in epoch.
+  Thanks to Paul Furnanz <address@hidden> for the initial fix.
+  I generalized it a little.
+* w3-parse.el: Added a check to make sure that long URLs don't show up as
+  extremely long buffer names.  Thanks to Heiko Muenkel
+  <address@hidden> for noticing the problem.
+* w3-lucid.el: Added a patch from Sjoerd Mullender
+  <address@hidden> to add a menu bar to lucid emacs if there
+  wasn't one by default.
+* w3-emacs19.el: Added a few patches from Jin S Choi (address@hidden).
+  Mostly fixed the hotlist menu updating code, as well as a few cosmetic
+  changes to the FSF19 menus.
+* w3-epoch.el: Added a few patches from Henry Rowley <address@hidden> to
+  fix a few functions that assumed epoch was compiled with
+  add-graphic-zone.
+* w3-lists.el (w3-fill-paragraphs-in-list): Fixed a stupid bug where the
+  first letter of every paragraph would be removed when filling.  Thanks
+  to Arup Mukherjee <address@hidden> for noticing the problem, and Darrell
+  Kindred for the fix.
+
+Tue Nov 16 10:55:56 1993  William M. Perry  (address@hidden)
+* Makefile (install): Fixed problem where I was only copying W3FILES to
+  the install directory, and should have used W3FILES and W3BINS.
+* w3-forms.el: Stupid problem where I was always trying to call
+  w3-form-format-unknown.  Simple 'not' around a statement to fix.
+* w3-forms.el: Yet another stupid typo - w3-format-unkown instead of
+  w3-format-unknown.  Thanks to Dan Sullivan
+  <address@hidden> for the fix.
+
+Mon Nov 15 21:02:50 1993  William M. Perry  (address@hidden)
+* Various small changes (wrote over the new ChangeLog when doing a restore
+  of some files).
+* w3-vars.el: Changed the order of w3-html-entities so that &amp; is at
+  the end.  This was causing the entities later in the list to be messed
+  up if they occurred in the same document.
+* w3-lucid.el: Changed the w3-extent-at, w3-find-specific-link, and
+  w3-next-extent to not use a free variable.  Thanks to Jamie Zawinksi
+  <address@hidden> for the patch.  Dumb oversite on my part.
+* w3-forms.el: Made the forms formatting very extensible.  The formatting
+  function is determined by reading in lisp expression from a formatted
+  string.  w3-form-format-<type> will now be called and expected to return
+  a string to use as the prompt.
+* w3-emacs19.el: Fixed dumb problem where emacs19 on a tty would not be
+  able to find a list of links in the current document for
+  w3-complete-link.
+* w3-lists.el: Fixed the filling of paragraphs within lists.  No longer
+  inserts too many newlines.
+* Fixed a few problems where w3-do-setup was not being called correctly at
+  startup.  This would result in an error about w3-style-regexp being nil.
+* w3-mosaic.el: Fixed a problem with the hotlist handling code.  Mistake
+  in a regular expression.  Thanks to Jin S Choi (address@hidden) for
+  reporting the problem and sending a fix.
+
+Fri Nov 12 07:31:36 1993  William M. Perry  (address@hidden)
+* w3.el: The mailcap entries are now parsed at startup.
+* Made changes to several files so that the new NeXTstep port of emacs 19
+  will use faces, and not think its on a dumb terminal.  Mostly involved
+  changing a bunch of (eq window-system 'x) to an or (eq window-system
+  'dps).  While I was at it I also changed the statements so that the
+  Presentation Manager port of emacs 19 under OS/2 will use faces, etc.
+
+Thu Nov 11 07:20:13 1993  William M. Perry  (address@hidden)
+* Realized I should get sick more often - I seem to get more done. :)
+* w3-vars.el: Added the ABSTRACT, QUOTE, and BYLINE tags to the list of
+  emphasis tags.
+* w3-parse.el (w3-handle-notes): Added support for the HTML+ NOTE tags.
+  Handles any role, and also honors the SRC= for the warning image.
+* w3-parse.el (w3-handle-footnotes): Added support for the HTML+ footnote
+  and margin-note tags.  Handles as links to footnotes at the end of the
+  document. 
+* w3-parse.el (w3-fix-render-hints): Added support for the HTML+ RENDER
+  tag to extend the set of logical emphasis roles on a per-document basis.
+* w3-parse.el: Changed the emphasis handling to be more extensible.  New
+  variables w3-style-assoc and w3-style-regexp.  w3-style-assoc maps tags
+  onto style names.
+* w3-parse.el: Added ability to have IDS within headers.   This is in
+  conformance with the HTML+ specification.
+* w3-lists.el: Added ability to have IDs within <P> tags.  This is in
+  conformance with the HTML+ specification.
+* w3-lists.el: Added function w3-fill-paragraphs-in-list.  This will fill
+  all paragraphs within any type of list.  This allows for <P> elements
+  within lists without odd looking results.
+* w3-forms.el (w3-split): Changed this so that it no longer puts strings
+  with only spaces and tabs in the assoc list that is returned.  This
+  error caused every popup FORM item to have a blank line at the end.
+* Added new variable w3-default-action.  This specifies the lisp function
+  to run instead of w3-prepare-buffer when W3 can't figure out the MIME
+  type by looking at the file extension.  (Things like .README or .patch
+  would be parsed as HTML - not good).  Thanks to Alastair Burt
+  <address@hidden> for noticing the problem.
+
+Wed Nov 10 08:02:31 1993  William M. Perry  (address@hidden)
+* General cleanup, better documentation in all files.  Trying to merge
+  files so that there are fewer dependencies between files.  Thank
+  goodness for the optimizing byte compiler and call-trees. :)
+* w3-parse.el: Removed the handling of <EM> tags.  No longer part of the
+  HTML+ specification.
+* w3-vars.el: Excercise in anal-retentiveness. :)  Organized and
+  alphabetized all the variables and added to quite a few documentation
+  strings.  Yeah yeah yeah, but it needed it! :)
+* w3-vars.el: Added a few more new keybindings from Tom Tromey
+  <address@hidden>.
+* w3-misc.el (w3-maybe-eval): Added new MIME type application/emacs-lisp
+  along with a viewer that asks whether to evaluate it after viewing it.
+* w3-url.el (w3-open-local): Made this a stub to call w3-fetch with file:
+  prepended to the filename you type in.  w3-open-local-internal now does
+  all the work.  Thanks to Bill Benedetto <address@hidden> for
+  noticing it was bombing out when called non-interactively.
+* w3-url.el (w3-news): Added the ability to specify a news server in the
+  news url in the proposed news://server:port/article|newsgroup method.
+* w3-typecheck.el (w3-optionp): Changed this to correctly handle when you
+  don't select anything from the menu.  Would mess up the page and remove
+  the link before dying on an error.  Thanks to Jin S. Choi <address@hidden>
+  for noticing the problem.
+
+Tue Nov  9 14:59:59 1993  William M. Perry  (address@hidden)
+* w3-url.el (w3-file): Added proper handling of ftp://address@hidden commands.
+* w3-forms.el (w3-revert-form): Fixed this function so it will work if
+  there are pull-down lists in the form.  Also changed the forms parsing
+  code to use the first item in a list as the default.
+* w3-forms.el (w3-submit-form): TEXTAREA's will now be submitted
+  correctly.  The buffer containing the information you typed in must not
+  be killed though.  I need to find a better way to store it.  Maybe a new
+  major mode?  But then how to relay the info back to the w3-typecheck
+  function as the value?
+
+Mon Nov  8 13:05:29 1993  William M. Perry  (address@hidden)
+* Added function w3-complete-link to do a completing-read on all the links
+  in a buffer.  Should work in all emacsen.
+* Changed printing, saving, and mailing of documents so that you can
+  print/mail/save LaTeX, formatted text, or HTML source.
+* w3-url.el, w3-gopher.el: Changed the reading.... messages to display the
+  actual number of bytes retrieved.
+
+Sun Nov  7 11:37:53 1993  William M. Perry  (address@hidden)
+* w3-url.el (w3-http): Fixed a problem where fetching something that had a
+  viewer associated with it when the connection was down or the file was
+  not found would still drop you into the viewer... often with odd
+  results.
+* w3-lucid.el: Fixed a few bugs in the new lucid menus - was adding a nil
+  menu item (buffers with no links, no hotlist in memory, etc).  Caused
+  system crashes on linux, headaches on other operating systems.  Thanks
+  to Alastair Burt <address@hidden> and Arup Mukherjee
+  <address@hidden> for noticing the problem and for the initial
+  patches.
+* w3-mosaic.el: Think I fixed a problem with the hotlist parsing code.
+  Thanks to Jin S. Choi <address@hidden> for noticing the problem.
+
+Wed Nov  3 21:35:44 1993  William M. Perry  (address@hidden)
+* w3-lucid.el: Completely reworked the menu setup.  Several different
+  menus, mirroring the setup of Xmosaic.
+* w3-vars.el: Assigned a few new keybindings to make w3 a little closer to
+  info mode.  Also redefined the M-C-v and M-b keys to use the C-c prefix
+  as they should.
+
+Mon Nov  1 09:42:18 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-build-links-list): Changed this so that it no longer
+  puts the delimiters around links with no HREFs. Thanks to Ivan Herman
+  <address@hidden> for noticing that it was still broken.
+* w3-epoch.el (w3-insert-graphic): Changed this function to redirect
+  the output into the file instead of outputting it to STDOUT and then
+  saving it in a buffer and then writing the buffer.  Faster,
+  especially for large files, and don't have to worry about how many
+  lines to delete at the top of the buffer.
+
+Sun Oct 31 10:31:04 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-build-links-list): Think I've fixed the problem of
+  links in headers being formatted with newlines.
+* w3.el (w3-parse-relative-link): Fixed a problem where links of the
+  type "#something" would retrieve the current directory.  Stupid
+  mistake.  Thanks to address@hidden for noticing it.
+* w3-forms.el: Fixed quite a few problems with the Emacs 18 support.
+  Problem was with using markers as start and end positions to
+  creating new zones - they got set to nil when the whole region was
+  deleted, so subsequent delete-regions failed.  This also caused a
+  problem when trying to use the submit or reset buttons.
+* w3-typecheck.el (w3-read-correct-format): Fixed a problem with the
+  pulldown menu support in emacs 18.  The last-input-event variable
+  doesn't exist, so wrapped its use in an if boundp ..., etc.
+* w3-gopher.el (w3-do-gopher): Fixed problem where links like
+  gopher://somesite/11/etc/etc/ would not get parsed - was seeing 11
+  and thinking it wasn't a directory.
+* w3-url.el (w3-gopher): Fixed a problem where a match-beginning got
+  lost because of a misplaced w3-unhex-string.  Thanks to   Arup
+  Mukherjee <address@hidden> for noticing the problem.
+* w3-emacs.el: Changed the forward and backward link handling code so
+  that it will skip white space at the beginning of a link.  Thanks to
+  Arup Mukherjee <address@hidden> for noticing the problem.
+* w3-parse.el (w3-handle-comments): Fixed this function to handle either
+  comments written according to the HTML spec (with a trailing -->) or the
+  Xmosaic-handled way (with no --).  Thanks to Darrell Kindred
+  <address@hidden> for noticing the problem.
+* w3-mosaic.el (w3-parse-hotlist): Applied a patch by Arup Mukherjee
+  <address@hidden> and Darrell Kindred <address@hidden> to fix
+  an annoying problem where the first page you retrieved in a w3 session
+  would not be shown, and the buffer you started out in would be put into
+  w3-mode.
+
+Sat Oct 30 13:38:43 1993  William M. Perry  (address@hidden)
+* w3-misc.el (w3-preview-this-buffer): Fixed this so that it does a
+  buffer-file-name instead of just buffer-name so that it will be able
+  to reload documents correctly.
+* w3-epoch.el: Fixed stupid problem in w3-follow-link where it called
+  w3-do-form-entry with the arguments in the wrong order.
+* w3-emacs19.el: Removed requirement of cl.  Took up lots of space - was
+  old anyway.  'last' is no longer needed.
+* Applied patches to Makefile from Jamie Zawinskie <address@hidden> so it
+  will compile in a better way.
+* Added full GNU copyleft notice to all the source files so that it can be
+  distributed with Lucid Emacs.  Also changed lots of functions to make the
+  files compile with fewer warnings about unbound variables.
+
+Wed Oct 27 07:10:56 1993  William M. Perry  (address@hidden)
+* w3-forms.el (w3-handle-selections): Added this function to handle the
+  new <SELECT> tag in HTML+.  Supercedes the TYPE="OPTION" tag.  This also
+  handles the scrolling list boxes and multiple pick lists.  Multiple pick
+  lists don't work correctly yet though.
+* w3-mime.el (w3-parse-mailcap): New function to parse the .mailcap file
+  used by Mosaic/metamail/etc.  Appends it to the w3-mime-viewers assoct
+  list - format is preserved correctly.  If the MIME type is already in
+  the assoc list, then it is skipped.
+
+Tue Oct 26 08:39:23 1993  William M. Perry  (address@hidden)
+* w3-epoch.el (w3-follow-link): Fixed a problem where w3-follow-link
+  would not work correctly - needed to wrap the 't' start of an if
+  statement with a progn.
+* w3-epoch.el (w3-create-hrule): Created this function to generate a
+  pixmap the size of the current window width to use for horizontal
+  rules.  Also changed the parser to use add-graphic-zone if it is in
+  epoch and it finds an <HR>, otherwise it will use the dashes.
+
+Mon Oct 25 17:15:05 1993  William M. Perry  (address@hidden)
+* w3-vars.el (w3-mime-extensions): Added _LOTS_ more MIME types +
+  descriptions of _ALL_ of them.
+* w3-lucid.el (w3-mouse-handler): Changed this to use the new function
+  w3-link-info.  Is a little easier to use.
+* w3-misc.el (w3-link-info): New function to give an intelligent guess of
+  what the link is pointing to.  ie: 'A hypertext file on the local file
+  system' or 'A newsgroup (comp.infosystems.www) from NNTP server
+  usenet.ucs.indiana.edu'
+* w3-url.el (w3-open-local): Fixed a problem where opening a local file as
+  ~/..../fname.html would cause an error if you had a relative reference
+  past the ~/ point.  Thanks to Benjamin Pierce <address@hidden> for
+  noticing the problem.
+* w3.el (w3-search): Changed this function to make sure that only 1 '?' is
+  appeneded to the url when searching.  Thanks to Arup Mukherjee
+  <address@hidden> for noticing the problem.
+
+Sat Oct 23 10:25:32 1993  William M. Perry  (address@hidden)
+* w3-epoch.el: Fixed w3-follow-link so it will work again - was
+  messing up once in a while because of the new code to let images be
+  used as links.
+* w3-epoch.el: Using images as links should work now.  Need to have it
+  check for failure of reading the XPM and use the ALT attribute if it
+  does.
+* w3-url.el (w3-format-news): Fixed this function so that it will no
+  longer call w3-sentinel on its own.  Also changed it so that the <TITLE>
+  is set to the subject, not the newsgroup name.
+* w3-epoch.el: redid the image code to limit the images to 40 colors.
+  This allows more images to be read in before the conversions start
+  failing.  Can change this arbitrary limit by changing the argument
+  to ppmquant in w3-graphic-converter-alist.
+* w3-misc.el (w3-hexify-string): Fixed this function - it would mess
+  up when sending hex codes < F.  (ie: %F instead of %0F).
+
+Fri Oct 22 12:37:26 1993  William M. Perry  (address@hidden)
+* w3-url.el: Removed all the references to &optional source in all the
+  different retrieval areas (w3-http, w3-file, w3-gopher, etc).  This will
+  all be handled in w3-build-continuation from now on.  Also changed it so
+  that printing/sourcing a document doesn't explicitly set the w3-source
+  variable or w3-print-next, it just wraps the calls to w3-sentinel in a
+  let statement.
+* w3-url.el (w3-http): Changed w3-http to insert an error message into
+  w3-working-buffer if it couldn't connect to the server.  Thanks to 
+  Bengt Andersson <address@hidden> for noticing the problem.
+
+Thu Oct 21 06:31:09 1993  William M. Perry  (address@hidden)
+* w3-mime.el (w3-parse-mime-headers): Changed the detection of circular
+  redirection to insert a warning at the end of whatever it did retrieve
+  instead of signalling an error.  This way people will know who to
+  contact for the problem.
+* w3-epoch.el (w3-insert-graphic): Added support for ALIGN attribute
+  of the IMG tag.
+* w3-parse.el (w3-fix-paragraphs-in-region): Fixed stupid problem where
+  ordered lists would not be filled correctly if unordered lists were
+  positioned before them in the buffer.  Thanks to Bengt Andersson
+  <address@hidden> for noticing the problem.
+
+Wed Oct 20 11:35:40 1993  William M. Perry  (address@hidden)
+* w3-auth.el (w3-basic-auth): Fixed a stupid problem in a regular
+  expression that caused it to only do access-authorization lookups on the
+  first part of the path.  Now passes all cern tests successfully.  On to
+  pubkey!
+* w3-mime.el (w3-create-mime-request): Took out all the \r's.  Was
+  screwing up Cern's experimental authorization server.
+* w3-forms.el: Fixed problem in the handling of TEXT input tags when the
+  initial value was longer than the visible size. Also fixed problem where
+  typing in a password longer than the visible size caused an error.
+* w3-url.el (w3-open-local): Changed this function to call w3-sentinel
+  if it was called interactively.  This way 'o' in a w3 buffer still
+  works.
+* w3-epoch.el (w3-insert-graphic): Completely rewrote this function.
+  It should be able to get graphics over any type of protocol (it
+  goes thru w3-retrieve).  w3-graphic-converter-alist also now goes by
+  MIME types.
+
+Tue Oct 19 10:12:49 1993  William M. Perry  (address@hidden)
+* w3-misc.el (w3-use-links): New function to do a completing read on the
+  <LINK> tags in the current document.  No keybinding yet.
+* w3-misc.el (w3-mail-to-author): New function to send mail to the author
+  of a document.  Uses the <LINK> tag with REV=made if any is found.
+* w3-parse.el: Added storage of the <LINK> attributes.  w3-mail-to-author
+  will send mail to the author if the 'made' LINK is found.
+* w3-url.el (w3-fetch): Added in check to see if w3-working-buffer exists
+  before calling w3-sentinel.  Would give error "No such buffer  *W3*" if
+  you followed a telnet/tn3270/rlogin link.
+* w3-gopher.el: Changed the hypertext gopher support to just return raw
+  HTML like all the other functions now.
+* w3.el (w3-parse-relative-link): Changed w3-relative-link to just call
+  w3-fetch on the results of this function so I could use it in
+  w3-parse-mime-headers for redirection.
+* w3-url.el (w3-retrieve): Moved everything from w3-fetch into this
+  function.  It just returns the name of the buffer the raw HTML is put
+  into - no processing is done.  w3-fetch is now just a call to this
+  function and then w3-sentinel.  HTTP/1.0 redirection and authorization
+  are handled before exiting.
+* w3-auth.el: Added an optional argument to the w3-XXX-auth functions.  If
+  third argument OVERWRITE is non-nil, and a password is found, it is
+  ignored and a new user/pass combination are prompted for.
+
+Mon Oct 18 08:38:00 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-prepare-buffer): Moved the call to w3-handle-forms to be
+  after w3-restore-pre so that forms inside <PRE> segments would turn out
+  right.  Not part of the spec, but useful.  Thanks to Rob Tillotson
+  <address@hidden> for noticing the problem and suggesting the
+  fix.
+* w3-auth.el (w3-b64-encoding): Actually wrote the base 64 encoding
+  function in lisp.  Much faster than using the subprocess.
+* w3-lucid.el (x-popup-menu): Added this function to do a blocking popup
+  menu.  Thanks to Jamie Zawinski (address@hidden) for telling me where to
+  look - its a hacked up version of yes-or-no-p-dialog-box from
+  prim/menubar.el.
+* w3-mime.el (w3-create-mime-request): Added in checking for authorization
+  into the MIME request.  If a match is found using w3-basic-auth, then a
+  new line is added with the encoded password.
+* w3-auth.el (w3-basic-auth): This now takes an optional parameter PROMPT,
+  that if non-nil and a server and/or directory is not found in the list,
+  then the user is prompted for a username/password.  If nil, it just
+  returns nil if not user/pass found.
+* w3-auth.el (w3-encode-password): Due to some problems with numbers
+  getting too large when doing base64 encoding, have reworked this
+  function to call a program in a subprocess.  Program is specified by the
+  variable w3-b64-encoder, and defaults to b64encode, from
+  ftp://cs.utk.edu/pub/MIME/b64encode.c.
+
+Sun Oct 17 10:21:06 1993  William M. Perry  (address@hidden)
+* w3-auth.el (w3-encode-password): I think this does base64 encoding
+  correctly now.  Have to test it more though.
+* w3-auth.el: Started work on 'Basic' authentication.  Not working yet,
+  but storage of servers/usernames/passwords/paths works.  Subdirectories
+  of 'protected' directories will find the username/password for the
+  parent directory, as per the specification (/foo/bar/baz.html will
+  locate the password entered before for /foo/test.html or / if any were
+  entered).
+* w3-mime.el (w3-parse-mime-headers): Added error checking into the server
+  redirection to see if something points to itself.
+* w3-typecheck.el (w3-floatp): Fixed regular expression problem where
+  floating point numbers would not be parsed correctly.
+* w3-typecheck.el (w3-urlp): Wrote this function to do basic typechecking
+  of URLS that are input into a <FORM>.
+* w3-mime.el (w3-parse-mime-headers): Added support for server-side
+  redirection (301, 302) and the Method: header also (303).
+* w3-forms.el (w3-set-radio-button): First pass at doing Radio buttons the
+  correct way.  Works (to a point) - it doesn't delete one of the zones
+  after changing their values though.  Not sure why.
+
+Sat Oct 16 14:55:39 1993  William M. Perry  (address@hidden)
+* w3-forms.el: Added support for PASSWORD input tag.  Will use
+  ange-ftp-read-passwd and display '*****' as the value.
+* w3-forms.el: Added support for OPTIONS INPUT tag.  If in Xwindows and
+  able to use x-popup-menu it will pop up a menu.  If not in Xwindows,
+  will use a completing read of the possible options.
+
+Fri Oct 15 16:15:59 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-nuke-unsupported): Changed this so that it will support
+  the ALT tag in IMG statements.
+* w3-gopher.el: Changed the gopher handling so that it will pass
+  everything but directories off to the main viewer-handling procedures.
+
+Thu Oct 14 18:26:55 1993  William M. Perry  (address@hidden)
+* w3.el (w3-save-url): Fixed problem in w3-save-url where the text was
+  saved in the kill-ring, but the kill-ring-yank-pointer was not updated.
+  Thanks to Bengt Andersson <address@hidden> for noticing
+  it.
+* w3.el (w3-quit): Fixed a problem where quitting from links would take
+  you back one level of buffers too far.  Thanks to Bill Benedetto
+  <address@hidden> for noticing it.
+
+Wed Oct 13 07:10:04 1993  William M. Perry  (address@hidden)
+* w3.el (w3-quit): Added the variable w3-keep-old-buffers.  If t, old w3
+  buffers are kept.  If nil, w3 buffers are deleted after you follow a
+  link from them.  Need to work on getting the parent of a w3 buffer now
+  though.
+* w3-lucid.el (w3-extent-at): Fixed problem where Lucid would not realize
+  that you were on a link if it was at the first character.
+* w3-url.el (w3-build-continuation): Fixed problem where a file with no
+  MIME viewer would die - just a misplaced set of parentheses.
+* w3-parse.el (w3-check-index): Changed this function so it only inserts
+  the <FORM> tags if protocol is HTTP.
+
+Mon Oct 11 07:19:59 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-prepare-buffer): Ordered lists will now have their
+  numbers aligned correctly.
+* w3-misc.el (w3-fix-fake-urls): This function will turn 'fake' urls like
+  ftp://somesite/some/file/ into real links like <A
+  HREF="ftp://somesite/some/file/";> - the text of the link is the text it
+  replaces.  Will be useful for mail/news reading hooks.
+
+Sat Oct  9 08:14:45 1993  William M. Perry  (address@hidden)
+* w3.el (w3-quit): fixed a problem where quitting from a 'previewed'
+  buffer would signal an error.
+* w3-parse.el (w3-prepare-buffer): Fixed this so that <PLAINTEXT> can
+  appear anywhere in a buffer, and will be treated appropriately.  Thanks
+  to Darrell Kindred (address@hidden) for noticing the problem.
+
+Fri Oct  8 08:51:37 1993  William M. Perry  (address@hidden)
+* Changed all the (set buffer " *W3*") to now use the variable
+  w3-work-buffer instead - this will allow me to have multiple receives
+  going at the same time.  Also allow me to parse out different buffers
+  for urls and not have to copy back and forth to " *W3*". Not fully
+  implemented yet.
+
+Tue Oct  5 11:56:30 1993  William M. Perry  (address@hidden)
+* w3-misc.el (w3-in-assoc): Changed this funcion so that it returns the
+  first match.  Was messing up on some of the wildcards in the default
+  MIME viewers.
+* w3-viewers.el: Several bugfixese/enhancements to the MIME viewer
+  handling.  Everything (including printing, sourcing, and presentation of
+  hypertext) is now handled by the MIME viewers.
+* w3.el: Will now load the file "~/.w3" if it exists.  Will let you store
+  all your w3 variables in the same place.  Only loaded after all the
+  different modules.
+* w3-viewers.el, w3-url.el: Changed the viewer handling to be by MIME
+  content-types all the time.  A new variable, w3-mime-extensions,
+  controls how file extensions are mapped onto MIME content-types.
+  Inspired by the way MacMosaic handles its viewers.  Should be easier to
+  maintain just one viewer list.
+
+Mon Oct  4 06:19:10 1993  William M. Perry  (address@hidden)
+* w3-viewers.el: Changed the viewing to ask if you wish to view the output
+  of the process.  Generates unique buffer names, etc.  Thanks to T.V.
+  Raman <address@hidden> for suggesting it.
+* w3-viewers.el: Moved all the external/internal viewer handling into this
+  file.
+* w3.el (w3-quit): Fixed problem where w3 would signal an error when you
+  quit and the buffer that preceded it has been killed.  Just goes to the
+  next buffer now.  Thanks to Bengt Andersson
+  <address@hidden> for noticing it.
+* w3-lucid.el: Applied patch from Darrell Kindred
+  <address@hidden> which fixed a problem with finding tags of
+  hyperlinks when it had other attributes (<ADDRESS>,<B>, etc) as well.
+
+Fri Oct  1 06:29:37 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-fix-paragraphs-in-region):  Added support for the <HR>
+  tag (horizontal rule).
+* w3-mime.el (w3-mime-viewer): Fixed a problem where this returned a cons
+  where it should have returned a string.  Thanks to Bengt Andersson
+  <address@hidden> for noticing it (yet again).
+
+* w3-gopher.el: Fixed a few problems with searching
+* w3-url.el: removed newlines from regexps - were messing up <PRE>
+  segments.
+* w3-url.el: changed mailto to include the url that it was sent from.
+
+Mon Sep 27 13:57:34 1993  William M. Perry  (address@hidden)
+* w3-typecheck.el (w3-intp): Changed the function to check whether an
+  integer was valid.  Would mess up in emacs19, where 12.5 is a good
+  parameter to string-to-int.
+
+Sat Sep 25 06:48:55 1993  William M. Perry  (address@hidden)
+* w3-typecheck.el: Added this file to control typechecking of forms entry
+  fields.  Checks dates, ints, floats, urls, and text.
+* w3-forms.el (w3-do-form-entry): changed so that it will use the new
+  typechecking functions.
+
+Fri Sep 24 14:01:54 1993  William M. Perry  (address@hidden)
+* w3-lucid.el: completely rewrote the forward and backward link movement.
+  Works a lot better now.
+
+Thu Sep 23 11:36:35 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-prepare-buffer): fixed <TITLE> handling so it takes out
+  leading and trailing spaces/tabs.  Could make it difficult to find a
+  buffer when the name began with a space.
+* w3-parse.el (w3-build-links-list): Fixed problem where link names would
+  be too long (would include part of the HREF) when the HREF was not
+  quoted.  Thanks to Dong-Ping Deng (address@hidden) for noticing
+  it.
+
+Wed Sep 22 10:49:37 1993  William M. Perry  (address@hidden)
+* w3-misc.el (w3-maybe-relative): Fixed stupid bug where I didn't add the
+  new tn3270 link type to a few regular expressions.
+
+Tue Sep 21 10:51:09 1993  William M. Perry  (address@hidden)
+* w3-url.el: Added support for tn3270://... links.  Thanks to T V Raman
+  <address@hidden> for noticing its lack.
+* w3-parse.el (w3-check-index): Added variable w3-use-forms-index.  If
+  non-nil, will replace <ISINDEX> tags with a very short <FORM> for
+  searching.  Default is t, like Xmosaic.
+* w3-vars.el: Added more styles for the <EM> tag.
+
+Mon Sep 20 07:02:28 1993  William M. Perry  (address@hidden)
+* w3-emacs19.el (w3-find-specific-link): Emacs19 can now find #identifier
+  marks in documents.
+* w3-gopher.el (w3-gopher-retrieve): Fixed a problem with gopher sending
+  more than one character 'description' to the server.  Would result in
+  'Can't open 1/whatever' in some cases.
+* w3-misc.el (w3-show-hotlist): Added this function to show the hotlist in
+  a hypertext form.  Thanks to Stephen Simpson (address@hidden) for
+  suggesting it.
+* w3-forms.el: Added in support for emacs 18
+* w3-emacs.el: Added in support for deleting an arbitrary zone.  This
+  was needed to make forms support work correctly.
+* w3-vars.el (w3-be-asynchronous): added this variable to control whether
+  documents would be retrieved in a non-blocking way over HTTP.
+
+Sun Sep 19 14:15:39 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-handle-em-tags): Fixed problem where emacs18 would
+  die on handling any <EM> tag.  Thanks to address@hidden
+  (Michael Richardson) for pointing it out.
+* w3-mime.el (w3-mime-viewer): Fixed problem with the viewer finder - was
+  trying to do a car of a string Keith Waclena
+  <address@hidden> for sending me the fix.
+
+Fri Sep 17 09:23:08 1993  William M. Perry  (address@hidden)
+* w3-mosaic.el: fixed problem where deleting or adding hotlist entries
+  would not update the menubar.  Thanks to address@hidden for noticing the
+  problem.
+
+Mon Sep 13 06:40:35 1993  William M. Perry  (address@hidden)
+* Added the <REMOVED> and <ADDED> tags (both as containers and roles of
+  the <EM> tag.
+* w3-parse.el: took out the conversion of IMG tags to hyperlinks - was
+  messing up when links were nested - need to work on it.
+* w3-lists.el (w3-build-table): tables should now handle <DD> with no
+  matching <DT> a little better.  Don't know why people bother writing
+  HTML this bad, but oh well.
+* w3-mime.el (w3-parse-mime-headers): Had a problem parsing out the mime
+  headers if there wasn't a crlf at each endline, which broke parsing
+  NCSA's new 1.0 server.  Fixed now.
+
+Fri Sep 10 05:52:06 1993  William M. Perry  (address@hidden)
+* w3-emacs19.el: took out blank definition of w3-submit-form that
+  would screw up submitting forms.  (Emacs19.el got loaded after
+  w3-forms.el so would have a blank definition)
+
+Thu Sep  9 07:57:58 1993  William M. Perry  (address@hidden)
+* w3-parse.el: Added support for <SP> (nonbreaking spaces), and <BR>
+  (force line breaks), and <EM> tags - the EM tags don't allow multiple
+  tags right now (ala <EM B I> </EM>, but nesting of <EM> tags works.)
+
+Wed Sep  8 11:58:21 1993  William M. Perry  (address@hidden)
+* w3-url.el (w3-build-continuation): the fetching of grouop annotations
+  has been removed, as the experiment at NCSA has ended.
+* w3-forms.el (w3-revert-form): finished this function - now works
+  correctly. 
+* Added code to all emacs-specific files to call w3-do-form-entry if
+  w3-follow-link is called on a zone that is tagged with 'w3form.
+* I have serious doubts whether the form support will work in emacs18 - I
+  need to write a delete-zone function for it, but that might be a bear.
+  Will toy with it later.
+
+Tue Sep  7 07:13:36 1993  William M. Perry  (address@hidden)
+* w3-forms.el: added a (delete-overlay zone) if running FSF19 so that not
+  all edits are sent when you submit a form.
+* w3-forms.el: now, if a checkbox's VALUE/DEFAULT field is empty, it is
+  sent as name=PRIMED, ala xmosaic.
+* w3-forms.el: fixed bug where the maxlength would be set to 20 instead of
+  unlimited if it was not specified.  (Actually, its set to 10,000 but I
+  think that should be enough for a while. :)
+
+Mon Sep  6 08:59:43 1993  William M. Perry  (address@hidden)
+* w3-forms.el: Eureka!  They actually work now.  Successfully submits to
+  the NCSA server/demo pages.  Still a little kludgey, but cleaning it up
+  should be too difficult.
+* w3-forms.el: forms now keyed by number so it will be easier to submit
+  them back to the server.  Also changed the submit and reset buttons to
+  take their button labels from the VALUE tag as xmosaic does.
+
+Sun Sep  5 09:17:42 1993  William M. Perry  (address@hidden)
+* w3-forms.el: more work on forms support - can now click on check boxes
+  and enter text in the entry areas.
+* w3-forms.el: added support for the parsing of forms
+
+Sat Sep  4 11:06:12 1993  William M. Perry  (address@hidden)
+* w3-mime.el: Fixed a problem where mime viewers would not work correctly
+  - tried to do a car() on a string.
+* w3-mosaic.el (w3-add-document-to-hotlist): fixed a bug in the creation
+  of gopher hotlist entries.  Thanks to Erik Ostrom
+  (address@hidden) for noticing and patching it.
+* w3-gopher.el: more work on trying to get searching to work - almost
+  there. 
+
+Wed Sep  1 09:17:00 1993  William M. Perry  (address@hidden)
+* w3-gopher.el: Did quite a bit of work on the gopher support.  Lots of
+  ideas, some code from the original gopher.el, but this keeps it in
+  hypertext - can print, get the document source, add to hotlist, etc.
+  Searching still does not work.
+
+Tue Aug 31 10:03:04 1993  William M. Perry  (address@hidden)
+* w3-misc.el: Changed the viewer handling so that it creates unique
+  filenames - if you viewed several things at once, it would write over
+  the old file, and kill the old viewers.  Also fixed problem where it
+  wouldn't delete the w3-tmp file when it was done viewing.
+
+Mon Aug 30 10:19:07 1993  William M. Perry  (address@hidden)
+* w3-url.el (w3-gopher): added variable w3-use-hypertext-gopher.  If 't'
+  use the gopher interface I just wrote, or use Scott Snyder's gopher
+  mode.  (The gopher mode is a slightly more complete, but mine preserves
+  the hypertext feel)
+* w3-gopher.el: added this file - rolled my own gopher interface this
+  afternoon.  Needs more work, but seems functional.
+* w3-misc.el: changed the viewer handling so that it handles the viewers
+  asynchronously again.
+
+Fri Aug 27 07:06:39 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-handle-address): address handling handles newlines
+  before and after ADDRESS tags better - so multiple ADDRESS tags
+  following each other don't have more than one newline, etc.
+
+Thu Aug 26 14:49:28 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-fix-paragraphs-in-region): fixed problem where the
+  fleading spaces/tabs of a line in a PRE or XMP segment would get
+  nuked.  Thanks to Bob Olson (address@hidden) for noticing it.
+
+Tue Aug 24 22:49:38 1993  William M. Perry  (address@hidden)
+* w3-epoch.el: fixed a typo - left out a " in a defvar which caused the
+  compiles to fail.  Thanks to Andrew Violette (address@hidden) for
+  noticing it. 
+
+Mon Aug 23 07:12:05 1993  William M. Perry  (address@hidden)
+* w3-misc.el (w3-lookup-style): Fixed stupid mistake where emacs19
+  wouldn't return any styles from this function
+* w3-parse.el: Fixed a problem where it would not fill paragraphs
+  correctly after the last PRE segment of the text.
+* w3-parse.el: Made the parser a lot less destructive (not as many
+  delete-regions) - this should make it handle overlapping formatting
+  better in most cases.  And maybe a little faster, since it doesn't have
+  to create as many strings and do as many re-insertions.
+
+Sun Aug 22 09:25:14 1993  William M. Perry  (address@hidden)
+* w3-emacs19.el: rewrote w3-view-this-url and w3-follow-link so that they
+  won't sometimes choke on links at the end of bold/italic/whatever zones.
+* w3-url.el (w3-http): now prints outi ts reading status (Reading.....)
+* w3-lucid.el: Took out the copying of a non-existent 'underline face. 
+
+Wed Aug 18 06:27:12 1993  William M. Perry  (address@hidden)
+* w3-mosaic.el (w3-write-global-history): fixed this so it actually works
+  again - forgot to change it when I changed the format of w3-history-list
+  to be an assoc list.
+
+Tue Aug 17 18:01:00 1993  William M. Perry  (address@hidden)
+* w3-mosaic.el (w3-fetch-annotations): Fixe problem where the annotation
+  fetch would die if the server couldn't be contacted.
+
+Mon Aug 16 17:04:23 1993  William M. Perry  (address@hidden)
+* w3-emacs19.el: took out the xresource reading - will depend on
+  emacs*w3-XXX-style.AttributeFont like the lucid emacs stuff.
+* w3-lucid.el, w3-emacs19.el: changed these so that if the newly created
+  faces aren't set up in the xdefaults, it will copy the appropriate face
+  (header-style copies 'bold-italic, etc).  Thanks Michael J. Lamoureux
+  (address@hidden)
+
+Sun Aug 15 09:22:52 1993  William M. Perry  (address@hidden)
+* w3-url.el: Added #linkname finding for local files and ftp html files.
+* w3.latex: added a section on going through firewalls/telnet, and using
+  the new tcp.c and tcp.el package.
+* w3.el: Changed the w3-help function to make sure a function is defined
+  before checking for documentation strings, etc.  Also changed it so that
+  it puts it in a hypertext buffer.  This opens up the idea of putting
+  links in the documentation strings. :)
+* Made tcp.c and tcp.el part of the 'extras' distribution.
+* w3-mosaic.el: Fixed problem where it would try to send the annotation
+  request to a string if w3-open-stream failed.
+* w3-misc.el: changed the telnet handling so that it will return 'nil' if
+  telnet could not connect to the remote host.
+* w3-vars.el (w3-color-display): this will now be set correctly in emacs19
+  - had spelled a function name wrong.
+* w3-url.el: Change w3-open-local and w3-file to respect new variable
+  w3-directory-format, which tells it whether to have a hypertext
+  directory listing, or just pass off to dired.
+
+Fri Aug 13 07:50:50 1993  William M. Perry  (address@hidden)
+* w3-mosaic.el: Fixed problem with not killing the "Process *anno*
+  finished" in http bufffers.
+* w3-lists.el: Fixed bug where w3-sublists-exist would bomb in epoch.
+  Epoch's re-search-forward returns t or nil, not the point of the
+  match like lucid/emac18/emacs19.  Several people pointed it out.
+
+Thu Aug 12 17:51:09 1993  William M. Perry  (address@hidden)
+* w3-misc.el (w3-pass-to-viewer): Fixed problem where this would not
+  display a picture if you were in Xwindows - flaw in a logical statement.
+  Thanks to Phil Kime (address@hidden) for noticing it.
+* w3-parse.el (w3-build-links-list): Added a few patches from Erik Ostrom
+  (fiicmds04.tu-graz.ac.at) - fixes bug with only recognizing NAMEd hrefs
+  when the NAMEs are quoted, and botching of relative #links.
+* w3-url.el: changed w3-http and w3-gopher to check the port # - if it is
+  in w3-bad-port-list, ask for confirmation before opening the connection.
+
+Tue Aug 10 13:07:04 1993  William M. Perry  (address@hidden)
+* New variable w3-bad-server-list, that is a list of HTTP/0.9 servers that
+  can barf on HTTP/1.0 requests.  Generally just servers that have a
+  decent amount of lag from your site (or that completely barf on
+  HTTP/1.0, like the TeXinfo gateway at ohio-state).
+* w3-mime.el: changed w3-create-mime-request to check w3-bad-server-list
+  for the current server and the value of w3-use-http2.  If both are
+  false, then generate an HTTP/1.0 request, otherwise HTTP/0.9
+* w3-url.el: changed w3-http to always use w3-create-mime-request.
+
+Mon Aug  9 08:52:10 1993  William M. Perry  (address@hidden)
+* w3.el: Added w3-documents-menu, an assoc list of titls and urls to turn
+  into a menu if you are in lemacs or emacs19.  Add support for running it
+  on dumb terminals via completing-read later.
+* w3.el: Ripped out all the variable definitions into w3-vars.el
+* w3-mime.el: fixed quite a few problems with w3-create-mime-request
+* w3-misc.el: think I finally got the truncated pages problem fixed.
+  (yeah, right :)
+* w3.el: Added code from Erik Ostrom (address@hidden) to
+  patch gopher-mode to throw you back into w3 when encountering a WWW link
+  in gopher.  Hopefully these will make it back into the main gopher.el.
+* w3-emacs19.el (w3-back-link): Added fix from Erik Ostrom
+  (address@hidden) so it won't give you an error in files
+  with only 1 link when you try to move backward.
+* w3-epoch.el: fixed a typo where you wouldn't be able to retrieve
+  images over http.
+
+Sun Aug  8 13:56:11 1993  William M. Perry  (address@hidden)
+* w3-url.el: added support for file://localhost urls.  Thanks to
+  address@hidden for pointing out that they didn't work
+* w3-emacs.el: took out the searching forward for '[' in the
+  goto-start-of-zone routine.  Would fail if w3-delimit-links was nil.
+  Thanks to address@hidden for pointing it out.
+* Revamped w3-url.el, w3-mosaic.el, and w3-misc.el to get the telnet
+  support working better.  No more mucking around with filters, etc.
+* w3-parse.el (w3-build-links-list): Changed the link routine so that it
+  will default to putting the end of a link at the end of the current line
+  if none is found normally.
+* w3-url.el: Local directories are now put into a hypertext buffer, and
+  parsed by w3.  Not sure if I should leave it this way or not.
+
+Sat Aug  7 03:28:58 1993  William M. Perry  (address@hidden)
+* w3-lists.el (w3-build-table): Changed it so you don't need to have a
+  DT in a DL list.
+* w3-mime.el (w3-mime-viewer): fixed this function to actually work! :)
+  (Was returning a list of the viewer, had to add a (car).)
+* Applied several patches from Jin S Choi (address@hidden), fixing
+  several stupid mistakes I had made. :)  Including, too many ')' in
+  emacs19, bad font setting in emacs19, noticed truncated pages via http2,
+  underlining of headings is off by default now.
+* w3-url.el: no longer print out "Reading..." when receiving documents -
+  would sometimes scramble the document.
+* w3-misc.el: w3-open-stream no longer errors when it can't connect to a
+  server - this would cause w3 to bomb if the annotation server were down.
+  Thanks to Jin S Choi (address@hidden) for noticing it.
+* w3-misc.el: w3-send-string should be a little better about not sending
+  mulitple lines to the server now, especially in emacs19 & epoch(?) where
+  accept-process-output accepts a timeout.
+
+Fri Aug  6 14:45:20 1993  William M. Perry  (address@hidden)
+* w3-url.el: changed the gopher handling to pass off everything to gopher
+  mode, so it can now handle gifs, images, etc.
+* w3-lists.el: Made DL be compact by default until I get the code to
+  change it based on DL COMPACT working right.
+* w3.el: removed the w3-useful-documents function - not really worth
+  having.
+* w3-lists.el: Totally rewrote the main loop so its not recursive, and
+  doesn't use save-restriction.  Much faster now.  Also truly fixed
+  problem with not nesting correctly.
+* w3-html+.el: a few tweaks, not ready for prime time yet though. 
+
+Thu Aug  5 08:22:16 1993  William M. Perry  (address@hidden)
+* w3-parse.el: Fixed bug in w3-fix-paragraphs that would cause it to loop
+  indefinitely if there were more than 2 PRE sections in a document.
+* w3-misc.el: Will now print out "Reading....." when receiving input.
+* w3-misc.el: w3-open-stream will now try to open the stream
+  w3-connection-retries times until it receives a valid connection.
+
+Wed Aug  4 08:49:44 1993  William M. Perry  (address@hidden)
+* w3-html+.el: can now include links as data table elements.  Don't wrap
+  stuff onto next lines yet though.
+
+Tue Aug  3 00:39:50 1993  William M. Perry  (address@hidden)
+* w3-lists.el: nested lists don't indent too far now.  Normal lists are
+  only indented 1 tab.
+* w3-html+.el: started work on this file to contain experimental HTML+
+  parsing routines.  Will probably eventually rewrite most of the parser.
+  Mostly support for tables in right now.  Will release soon.
+
+Mon Aug  2 09:21:23 1993  William M. Perry  (address@hidden)
+* w3-parse.el: Added support for arbitrary tags (!ENTITY ...), and
+  support for endash and emdash entities.
+* w3-parse.el: Fixed problem where links with no HREF field would bomb out
+  the parser (trying to string-match on nil).
+
+Thu Jul 29 10:35:06 1993  William M. Perry  (address@hidden)
+* w3-lists.el: found major bug with nesting multiple ULs inside of an
+  OL  Seems to be fixed now though.
+
+Wed Jul 28 08:29:31 1993  William M. Perry  (address@hidden)
+* w3.latex: revamped this so I can now use the latex2html perl script by N
+  F Drakos (address@hidden).  This will (almost) guarantee that the
+  online documentation is as up-to-date as the latex files.
+* w3-parse.el: Will now be able to find titles that don't have TITLE and
+  /TITLE on the same line.
+* w3-parse.el: Now stores the full url in each link's data zone - this
+  will allow print-url-under-point to work, and will make it easier to
+  write something that prints out a string of html documents.
+* w3-lists.el: Added this file.  Contains new functions to do better
+  nesting of lists.  Shouldn't hang emacs, but if it does, let me know
+  right away and I'll try to fix it.  Works great on the NCSA demo
+  document - and it has DLs inside ULs inside DLs inside ULs, so I figured
+  it was a good torture test for it. :)
+* w3-mosaic.el: changed the hotlist parsing code to remove empty lines so
+  you won't get a document type of ^Jhttp: if there are spurious blank
+  lines in the hotlist file.
+
+Mon Jul 26 09:45:34 1993  William M. Perry  (address@hidden)
+* w3-emacs19.el: Fixed forward and backward link movement.
+* w3-parse.el: Now transforms IMG ... tags into HREFs.
+
+Sun Jul 25 15:00:43 1993  William M. Perry  (address@hidden)
+* w3-misc.el: added function w3-find-this-file, which will do a find file
+  on the current w3 documents source (if in FTP or local file mode).  Will
+  be able to do it over HTTP when HTTP/1.0 becomes supported.  Thanks to
+  Heiko Muenkel (address@hidden) for suggesting it.
+* w3-misc.el (w3-send-string): Added a sit-for statement so it will wait
+  for process output - if the process is closed, then don't send any more
+  lines of the request.  This seems to have stopped the truncation of
+  pages.
+
+Fri Jul 23 07:23:05 1993  William M. Perry  (address@hidden)
+* w3.el: Added patches by address@hidden  Fixed a problem with a
+  non-existent gopher directory in w3-interesting-docs, and a typo.
+* w3-url.el (w3-unhex): Added patches by address@hidden  This
+  should give the correct values now.  Was off by 6.
+
+Thu Jul 22 12:05:17 1993  William M. Perry  (address@hidden) 
+* w3.el: Added new variable w3-use-http2.  If 't', w3 will use the
+  HTTP/1.0 support that for some reason truncates pages.  Default is t
+* Makefile: fixed stupid mistake where I left out a ${LISPDIR} so it
+  always tried to install in the root directory (/)
+
+Tue Jul 20 11:52:33 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-fix-paragraphs): This function now respects PRE and XMP
+  segments and won't fill paragraphs in them.
+
+Mon Jul 19 09:22:17 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-build-links-list): Fixed a problem where the text from
+  the last link would be used if there was a newline before the closing
+  /A in a link.  Also fixed several places where a link listing would
+  inherit items from the last link if they weren't defined (METHOD, URN,
+  etc)
+
+Sat Jul 17 11:36:31 1993  William M. Perry  (address@hidden)
+* Started work on adding NeXT mouse support in w3-emacs.el
+* Disabled the HTTP/1.0 support - was truncating pages for some reason.
+* w3-mosaic.el (w3-grok-annotation-format): Won't bomb if one of the
+  PAN-###.html files doesn't exist.
+
+Fri Jul 16 07:32:54 1993  William M. Perry  (address@hidden)
+* w3-mosaic.el (w3-do-personal-annotation): this will now correctly create
+  the LOG file in the personal annotation directory if it doesn't exist.
+* w3-parse.el (w3-prepare-buffer): Wrapped all the parsing stuff in a 
+  (let ((case-fold-search t)) ,,,) so that lowercase tags will be
+  recognized correctly.  Thanks to address@hidden for noticing it
+  still messed up on lowercase tags.
+
+Thu Jul 15 11:11:34 1993  William M. Perry  (address@hidden)
+* w3-docomp.el (compile-w3): Added w3-mime.el to the list of files to
+  compile. 
+* w3.el: Added lines to make w3-current-mime-* buffer local 
+* w3-parse.el (w3-prepare-buffer): Added variable w3-right-border to
+  control indentation on the right hand side of the buffer.  (Thanks to
+  Nathan Torkington (address@hidden) for suggesting it.
+* w3-misc.el (w3-basepath): This will no longer bomb if you are in a
+  scratch buffer (Thanks to Nathan Torkington
+  (address@hidden) for reporting it.
+* Release Version .9b
+* w3.el (w3-viewer-alist): The command to execute should now include a
+  '%s' wherever you want a filename to appear.  
+* Should now send all the right headers to a server, and act correctly.
+  (Won't bomb if server doesn't send make a MIME-ified document)
+* w3-mime.el: Can now create a valid HTRQ, parse a document's response
+  headers, and figure out if a document is a MIME-ified response.
+* w3-mime.el: First crack at making w3 mime compliant.
+
+Wed Jul 14 03:42:08 1993  William M. Perry  (address@hidden)
+* w3.el (w3-useful-documents): Added an 'interesting-docs' assoc list.
+  Similar to Xmosaics 'Documents' menu - just interesting interfaces that
+  are in the web.
+* w3-parse.el (w3-prepare-buffer): Took the file viewing code out of this
+  function - should never be evaluated.
+* w3.el (w3-viewer-assoc-list): No longer automatically append
+  auto-mode-alist to this - will mess up finding of hypertext files if you
+  have html-mode in your list.
+* w3-url.el: several changes to this file to actually make the external
+  viewers actually work again.
+
+Tue Jul 13 12:36:34 1993  William M. Perry  (address@hidden)
+* w3-url.el (w3-telnet): Changed this to use terminal-emulator instead of
+  transparent-window, since it won't work in emacs19 or lucid.
+* w3-url.el (w3-file): Will now correctly remember the name of the last
+  buffer when retrieving files via ftp.  Thanks to Dong-Ping Deng
+  (address@hidden) for noticing it didn't.
+* w3-mosaic.el (w3-parse-personal-annotations): no longer bombs if the
+  annotation directory doesn't exist.  Thanks to Heiko Muenkel
+  (address@hidden) for noticing.
+* w3-parse.el (w3-build-table): Building of definitions list is forgiving
+  if there is no DD.
+
+Mon Jul 12 07:08:38 1993  William M. Perry  (address@hidden)
+* w3.el: changed add-hook to use w3-member.  Thanks to Larry Masinter
+  (address@hidden) for suggesting it.
+* w3-parse.el & w3.el: fixed the run-hooks calls so they will actually
+  work.  Thanks to Larry Masinter (address@hidden) for pointing
+  out my mistake.
+* Makefile: fixed a few problems - thanks to address@hidden
+  for pointing them out. (Things like not compiling hyperbole, can now
+  configure what file to update the autloads and stuff in.)
+* w3-parse.el (w3-balance-XXX): fixed stupid mistake where I didn't remove
+  calls to string-to-int after redefining another function.
+* w3-misc.el (w3-count-occurences): added this function so "XX matches"
+  does not flash in the minibuffer when balancing PRE and XMP segments.
+  Directly from the emacs19 how-many function, but with no message at the
+  end.
+* w3-url.el (w3-mailto): changed syntax of mailto support to be
+  mailto:any-address-compliant-with-rfc822.  It just pops up a mail buffer
+  and sticks the rest of the url after mailto: in the To: line.  mailto
+  also now honors the variable w3-mutable-windows.
+* w3-parse.el (w3-balance-xmp): added this function to balance XMP
+  segments just like PRE segments.
+
+Sun Jul 11 08:08:44 1993  William M. Perry  (address@hidden)
+* w3-print.el (w3-convert-latex-to-html): added this function to convert
+  LaTeX documents to HTML.  Not sure why - was just bored. :)
+* w3-url.el (w3-mailto): added this function to support a new link type.
+  mailto://host/user will create a mail buffer and mail to address@hidden  The
+  syntax for this may change since it is not standard.
+* w3-parse.el (w3-build-table): fixed problem for when there was no
+  corresponding DD for a DT in a definition list.  A few documents at
+  CERN are like this.
+
+Sat Jul 10 08:55:35 1993  William M. Perry  (address@hidden)
+* w3.latex: did lots of work updating the documentation.
+* w3-emacs19.el (w3-emacs19-setup-faces): made function w3-try-make-XXX so
+  that w3 will still load and run, even if you use a font like '6x13' that
+  it can't make bold or italic.
+* w3-parse.el: PRE and ADDRESS tags now look a little better.
+* w3-mosaic.el: changed the annotation functions to set the
+  w3-current-annotation _AFTER_ calling html-mode, which will nuke all
+  buffer-local variables.
+* w3-mosaic.el (w3-add-personal-annotation): Now supports adding personal
+  annotations.
+* w3-mosaic.el (w3-add-group-annotation): now inserts /PRE as the first
+  line so that you can use all the formatting characteristics of HTML.
+  
+Fri Jul  9 07:31:20 1993  William M. Perry  (address@hidden)
+* w3-mosaic.el (w3-delete-personal-annotation): delete the current
+  annotation from your personal directory.
+* w3-mosaic.el (w3-fetch-personal-annotations): fixed dumb mistake in
+  formatting the url of each annotation.
+* w3-parse.el (w3-prepare-buffer): Will now check for any personal
+  annotations and put them at the end of the buffer (after group
+  annotations, if any).
+* w3-mosaic.el: added functions for reading the personal annotations from
+  w3-personal-annotation-directory.  No support for addition or deletion
+  of personal annotations yet.
+* w3.el (w3-mode.el): Delete group annotation option is only available in
+  lucid when user is in an annotation.
+* w3-[lucid|emacs19].el: changed menus to include deleting and adding
+  group|personal annotations
+* w3-mosaic.el: started working on adding personal annotation support.
+
+Thu Jul  8 15:32:45 1993  William M. Perry  (address@hidden)
+* w3-mosaic.el (w3-add-group-annotation): changed this so that it will
+  load up html-mode and have C-c C-c send the annotation.
+* w3-mosaic.el: Annotations are now fetched if w3-group-annotation-server
+  is defined.
+* w3-mosaic.el: Annotations can now be deleted - no key binding yet.
+* w3-mosaic.el: Annotations can now be added.  No key binding yet
+  
+Wed Jul  7 13:16:21 1993  William M. Perry  (address@hidden)
+* w3-emacs19.el (w3-back-link): Fixed w3-back-link so that the cursor will
+  be at the beginning of the link.
+* w3-emacs19.el: changed all the functions to use native emacs19 overlay
+  functions, instead of hacked up lucid-like syntax.  (Menus are still
+  done in lucid-style though)
+
+Tue Jul  6 12:41:03 1993  William M. Perry  (address@hidden)
+* w3-mosaic.el: Started work on w3-add-annotation and w3-fetch-annotations
+  to implement the NCSA group annotation facilities.  Don't work right now
+  - not sure why.  Need good docs (which don't exist) for the server. :)
+* w3.el (w3-view-url): Fixed problem where this function would put too
+  many '/' in the url.
+* w3-emacs19.el: Made a few changes to forward and backward movement among
+  links.  Still a few bugs, but can now find links in headers.
+
+Mon Jun 28 12:46:09 1993  William M. Perry  (address@hidden)
+* Added the variables w3-link-start-delimiter and
+  w3-link-end-delimiter so you don't have to edit the code to surround
+  links with something other than '[[' and ']]'.  Thanks to Andrew
+  Violett (address@hidden) for suggesting this.
+
+Sun Jun 27 14:54:50 1993  William M. Perry  (address@hidden)
+* w3-parse.el (w3-balance-pre): added this function to insert missing
+  /PRE tags.  Several documents on info.cern.ch leave these out and
+  cause the browser to crash (args out of range -5,1 or some such).
+* w3.el (w3-quit): Fixed bug if running in emacs19 without X, would cause
+  terminal to lock up indefinitely.
+* w3.el: w3-view-url now takes optional argument no-show.  If you pass it
+  an argument from a lisp function, it will return the current url without
+  message'ing it in the minibuffer.
+* w3-(lucid|emacs|emacs19|epoch).el: w3-view-this-url now acts the same as
+  w3-view url (doesn't flash the url in the minibuffer).
+* w3-(lucid|emacs19).el: Added some items to the menu, and a separator
+  between the links lists and the normal commands.
+
+Sat Jun 26 11:47:52 1993  William M. Perry  (address@hidden)
+* w3-emacs19.el: slight modifications.  Nothing really noticeable.
+* w3-print.el (w3-print-this-url): fixed this so ftp files will print
+  correctly.  Also had to change w3-file.
+
+Thu Jun 24 09:02:23 1993  William M. Perry  (address@hidden)
+* w3-url.el (w3-parse-buffer): Check to see if a url is already in the
+  history list before storing.  (Also check for bogus ones like
+  file:historylist.
+* w3-misc.el (w3-show-history-list): Added this function to show the
+  history list to the user in hypertext form.  I just use w3-history list
+  and make a hypertext buffer of it on the fly.  Thanks to Matthew Newhook
+  (address@hidden) for suggesting it.
+* w3-url.el: no longer store the URL in the history list here.  Do it in
+  w3-parse-buffer so I can store the TITLE of the document also.
+
+Tue Jun 22 10:18:54 1993  William M. Perry  (address@hidden)
+* w3.el (w3-document-source): Fixed stupid problem where I put http in
+  twice when building url of current document.  Thanks to Denys Duchier
+  (address@hidden) for noticing/fixing it.
+
+Mon Jun 21 12:38:23 1993  William M. Perry  (address@hidden)
+* w3-url.el (w3-telnet): Will actually work now.  Was bombing when the url
+  was not of the form address@hidden:port.  Would try to extract the
+  username, even though it wouldn't exist.  Thanks to Phil Molloy
+  (address@hidden) for noticing it.
+* w3-parse.el (w3-build-links-list): Fixed a problem where a newline right
+  after after the > in a url would cause the text of the link not to show
+  up.  Thanks to Dirk Husemann (address@hidden)
+  for the code to fix it (slightly modified).
+* w3.el (w3-doc-variables): Moved a paren in w3-doc-variables so that
+  w3-xterm will be documented.  Thanks to Denys Duchier
+  (address@hidden) for noticing.
+* w3-misc.el (w3-uncompress): Changed this so it actually works.  Was
+  passing a list instead of the cdr to the shell-command.  Thanks to
+  Phil Molloy (address@hidden) for noticing.
+
+Sun Jun 20 08:14:28 1993  William M. Perry  (address@hidden)
+* w3.el: Added function to store the current URL in the kill ring.  Thanks
+  to Mark Eichin (address@hidden) for the idea/code.
+* w3.el: Changed w3-help so that it will work under emacs 19.
+* w3-emacs19.el: only require lmenu & lucid when in X, otherwise emacs
+  compiled without X will die.  Thanks to Erik Ostrom
+  (address@hidden) for noticing it.
+* w3.el: only call w3-build-menu if in emacs19 & in x . . .
+* w3.el: Changed searching code so that it replaces all spaces with '+'.
+  Was causing some servers to time out if it didn't.  Thanks to Jin S Choi
+  (address@hidden) for pointing this out.
+* w3-parse.el: added a check in w3-fix-paragraphs and
+  w3-build-ordered-lists to see if emacs19 is running.  If so, add an
+  extra newline, since v19 seems to fill paragraphs differently than the
+  other flavors.
+* w3-emacs.el: added (defvar w3-default-style nil), so the code that hides
+  HREF's with no links won't barf.
+* w3-emacs19.el: changed 1 line defuns to defsubst, since function calls
+  are expensive.
+* w3-emacs19.el: Finding of #linknum should work now . . . no map-extents
+  in the lucid emulation package - will probably write one later.
+* w3-emacs19.el: Wrapped all the font stuff in an (if (eq window-system 'x)
+  so it wouldn't barf if emacs19 was loaded while emacs was on a dumb
+  terminal.
+* w3.el: added variable w3-running-FSF19, and have it load w3-emacs19.el
+  if set to t.  (Determined by emacs-version > 19, and not running lucid)
+
+Sat Jun 19 16:09:28 1993  William M. Perry  (address@hidden)
+* w3-emacs19.el: Changed bindings on the mouse buttons to react to a
+  mouse-up event instead of the mouse-down event, because it would try to
+  paste into the buffer on the mouse-up.  Bleah. :)
+* w3-url.el: Modified the ftp: support so that it will parse out html
+  files, and will also be able to follow relative links within ftp'd html
+  docs.
+
+Sat Jun 19 10:01:45 1993  William M. Perry  (address@hidden)
+* Fix stupid bugs in Makefile from where I delete some things when
+  it was on my linux box
+* Support for some ISO chars by Ulrich Pfeifer 
+  (address@hidden).
+
+Fri Jun 18 13:03:12 1993  William M. Perry  (address@hidden)
+* Release v.5b
+
+Thu Jun 17 14:58:32 1993  William M. Perry  (address@hidden)
+* Better emacs 19 support from address@hidden
+* URLS that are just for reference (no HREF, but has a title) are no longer
+  highlighted, so people won't be tempted to click on them.  Thanks to
+  Erik Ostrom (address@hidden) for pointing this out.
+
+Fri Jun 11 12:14:47 1993  William M. Perry  (address@hidden)
+* Fixed problem with PRE handling - would fill paragraphs and replace
+  spaces.  Stupid misplacement of a 't'.
+* Added .gz extension for gzip to w3-uncompressor-alist
+* Trial run of emacs 19 support for fonts, etc from Jin S Choi
+  (address@hidden).  Not sure everything works yet.
+
+Mon Jun  7 12:42:48 1993  William M. Perry  (address@hidden)
+* Fixed printing from local files.
+* Added variables w3-telnet-prog and w3-telnet-header-length, for using
+  things like telnet+term from linux.
+
+Thu Jun  3 13:34:48 1993  William M. Perry  (address@hidden)
+* Fixed problems with gopher, and unhexing of escaped characters.  Thanks
+  to Larry Masinter (address@hidden) for the patches.
+* Beginning of emacs-19 support - not functional yet though.  Feel free to
+  fix it. :)
+* More stuff with w3-continuation, etc, etc.
+* Added (require 'nntp)
+
+Fri May 28 14:06:27 1993  William M. Perry  (address@hidden)
+* Fixed w3-print.
+
+Mon May 17 12:55:45 1993  William M. Perry  (address@hidden)
+* Can now specify uncompressors in an assoc list
+* Added better handling of stringing things along (ie: uncompress,
+  convert, then print, etc etc)
+
+Fri May  7 08:52:30 1993  William M. Perry  (address@hidden)
+* Release .31b
+* Fixed major problem with w3-fetch.  Would bomb with stringp = nil if
+  done interactively.
+
+Mon May  3 08:16:35 1993  William M. Perry  (address@hidden)
+* Can now print the url under point - no key binding yet.
+* Added the ability to store a gopher link into the hotlist - thanks
+  to scott snyder (address@hidden) for patching gopher-mode to
+  support this.  No key binding yet.
+* Added the 'links' menu back into lucid emacs.
+
+Fri Apr 30 11:56:57 1993  William M. Perry  (address@hidden)
+* Fixed a problem with viewing local files with w3-viewer-alist
+
+Thu Apr 29 11:43:13 1993  William M. Perry  (address@hidden)
+* w3-fetch now defaults to the url of the current document if the
+  document you invoke it from is in w3-mode.
+* Added ability to find links of just #link - doesn't need to reload
+  the whole document.
+* Applied several patches fro Alastair Burt (address@hidden)
+  * Better updating of menu bar in Lucid
+  * Updates the interal w3-hotlist when you delete a hotlist entry
+  * Problem with the w3-viewer-alist - it tried to play
+    Something.Thesaurus
+* Fixed problems with w3-graphics-converter-alist, and lots of
+  problems with the w3-hypertext-extns.
+* Fixed problem with finding files for dired-mode - would still try to
+  do the viewing, etc.
+
+Wed Apr 28 07:23:56 1993  William M. Perry  (address@hidden)
+* Fixed problem with dired-ing remote ftp files.  Removed lots of
+  useless if file-directory-p [...], and just did a find-file - let
+  ange-ftp and dired take care of it - they know how better.
+* Fixed problem where w3-epoch-frob-resources would not set the
+  defaults if no Xresources were specified - thanks to Luis Miguel
+  Silveira (address@hidden) for noticing it.
+* Changed the w3-delimit-links variable so that you can specify
+  'linkname as its value, and have the old style "Link text
+  here[link#here]" style of showing links.  Nil shows nothing,
+  non-nil, non-linkname shows [[ & ]] around link text.
+
+Tue Apr 27 15:37:18 1993  William M. Perry  (address@hidden)
+* Fixed problem in gopher handling - if no port was specified, it
+  would get completely confused.
+
+Mon Apr 26 17:06:33 1993  William M. Perry  (address@hidden)
+* v.2b
+* Fixed problem with putting remote dirs into dired-mode with a bad
+  default-filename.  Thanks to Larry Masinter
+  (address@hidden) for noticing, and for the fix.
+* Added newest nntp.el to the extras tar file
+* Fixed problem where w3-current-last-buffer was not set correctly
+  when reading news.
+* Added support for news: links - single articles as well as whole
+  groups are supported.
+
+Sun Apr 25 15:36:55 1993  William M. Perry  (address@hidden)
+* Fixed recursive make install bug - thanks to Larry Masinter
+  (address@hidden) for noticing it.
+* Fixed problem with no default gopher object type.  Thanks to Larry
+  Masinter (address@hidden) for noticing it.
+* Fixed problem with no default gopher port.
+* Fixed the auto-documenter so that it would insert "M-x funcname"
+  if no bindings were found in the keymap. Thanks to Larry Masinter
+  (address@hidden) for noticing it.
+* Fixed problem with w3-file not passing to a viewer correctly.
+
+Thu Apr 22 13:22:53 1993  William M. Perry  (address@hidden)
+* Fixed the handling of URL#link finding . . . depends on which
+  emacs you are using, due to the weirdness of zones, etc, in each.
+* Split the files up again.  Figure with >2000 lines, it should be
+  done. :)
+* No longer need w3-links-list - store all relevant information in the
+  data segment of a zone.  Changed every function to use this new
+  structure.
+
+Wed Apr 21 08:24:35 1993  William M. Perry  (address@hidden)
+* Added variables w3-use-html2latex, w3-html2latex-prog, and
+  w3-html2latex-args.  If w3-use-html2latex is non-nil, then
+  w3-html2latex-prog is called in a subprocess with the flags defined
+  by w3-html2latex-args, with the html source as standard input.
+  Default is to do my (bad) regular expression matching to convert.
+
+Tue Apr 20 08:51:19 1993  William M. Perry  (address@hidden)
+* Can now specify regular expressions as the car of
+  w3-viewer-assoc-list 
+* fixed problem where epoch would not defvar the styles - just moved
+  them out of w3-epoch-frob-resources, and it works.  Weird.
+* Fixed several bugs in the w3-convert-html-to-latex function - now
+  handles addresses and &amp; correctly.
+* Fixed yet another dumb bug in the insertion of PLAINTEXT in
+  non-hypertext documents.
+* Added w3-member, instead of builtin (or predefined) member, since
+  some definitions don't use equal for comparison like they are
+  supposed to.
+
+Mon Apr 19 07:48:56 1993  William M. Perry  (address@hidden)
+* v.1b
+* Added LaTeXing of w3 documents, and automatic printing.  Just an
+  edit of the sed script to be a lot of replace-regexps, then a shell
+  command to latex a temp file and print it out.
+* Added w3-goto-last-buffer, which will take you to the last buffer
+  you visited before (kind of like gopher-mode).  Changed w3-quit to
+  use this also.
+* Fixed a bug in w3-reload-document that would make it bomb on local
+  file reloads.
+* Better nesting of lists.
+
+Sun Apr 18 13:50:38 1993  William M. Perry  (address@hidden)
+* Added variable w3-mutable-windows - if t, w3 pops up buffers in
+  another window.
+* Added a default-style for w3 buffers
+
+Wed Apr 14 10:18:01 1993  William M. Perry  (address@hidden)
+* Fixed several problems with the epcoh Xresources reading code
+* Added global history, for compatability with xmosaic
+* Added deletion of hotlist entries
+* Changed w3-viewer-alist to automatically include the auto-mode-alist
+* Viewers can now include lisp calls (ie: ("txt" . view-mode)) to put
+  in files.
+* file:// links will now put directories in dired-mode.  Thanks to
+  address@hidden for the fixes.
+* Finally fixed relative-links - .. & . are removed correctly
+* Fixed relative links for graphics also.
+
+Tue Apr 13 08:30:58 1993  William M. Perry  (address@hidden)
+* Added support for reading Xdefaults within Epoch.
+* v.04b
+* Fixed graphic support to work over http links (Epoch Only)
+* Fixed graphic support so it will figure out if the conversion failed
+  or not - warning message if it did.
+  
+Mon Apr 12 07:35:40 1993  William M. Perry  (address@hidden)
+* v.03b
+* Fixed lemacs support so it doesn't nuke your xdefaults.  Also fixed
+  the passing of face-objects, since they are screen-specific, and
+  therefore a Bad Thing.  Thanks to Jamie Zawinski (address@hidden)
+* Changed menu code so that it put the link # in there also.  Helpful
+  for when the links are unnamed, or named 'here' or 'this'.  Thanks
+  to Jamie Zawinski (address@hidden) for saying the menus were hosed.
+
+Sun Apr 11 16:30:44 1993  William M. Perry  (address@hidden)
+* Fixed graphics support for epoch - would only do 1 image per page.
+* Fixed a few typos - thanks to address@hidden
+
+Fri Apr  9 00:18:47 1993  William M. Perry  (address@hidden)
+* Added graphics support for epoch (doesn't work over http, pretty
+  much hardwired for me right now - commented out in the release)
+* v.02b
+* Several bug fixes (link finding, name fixing, others) - thanks to
+  address@hidden for the fixes.
+* Added address@hidden's zone-imitation functions for normal emacs.
+  Also wrote corresponding forward&back link code.  I wrote the forward&
+  back code for epoch&lemacs.
+
+Thu Apr  8 13:23:27 1993  William M. Perry  (address@hidden)
+* Fixed being able to jump forward over non-links in []s. Thanks to
+  address@hidden
+* Fixed telnet handling - thanks to address@hidden for noticing
+  it and for a preliminary fix.  Refined his fix.  Problem was that
+  telnet wasn't getting enough time to start before I sent it a
+  command.
+* Fixed a few regular expressions - thanks to address@hidden
+* Fixed bug in w3-add-document-hotlist which caused an error if the
+  hotlist file didn't already exist.  Thanks to address@hidden
+  for noticing it.
+
+Wed Apr  7 00:08:53 1993  William M. Perry  (address@hidden)
+* Split the files into 4 different files for easier editing.
+* Modified Makefile to work with the new file structure.
+* Fixed a problem with the links code that cropped up with blank HREFS
+* HREFs of the form .....#link will now go to 'link' within the target
+  document.
+* v.01beta - fourth release
+* Can now type #### RETURN to go the the ###th link in the current buffer.
+* Fixed a bug in XMP handling
+* Fixed bugs in the logical/physical styles in definition lists
+* Improved indentation of all lists
+* Wrapped (require 'ange-ftp) in a (not noninteractive) so it wouldn't
+  screw up the compiles.
+* Fixed a few problems in the Makefile
+* Revamped the way it looks for links in dumb emacs mode.  (Actually,
+  all I did was add a .* to the beginning and a parenthesized part of
+  the regexp - real rough. :)
+* Added support for physical and logical styles.  Looks great in lucid,
+  not so hot in epoch (had to use colors, not actual styles).  Suggestions
+  welcome.
+
+Tue Apr  6 21:14:14 1993  William M. Perry  (address@hidden)
+* Supports nested definition lists (only 1 deep, and only in ordered lists)
+* Now supports nested lists (only 1 deep, and only inside ordered lists)
+
+Mon Apr  5 13:34:00 1993  William M. Perry  (address@hidden)
+* v.008beta - third release
+* Fixed ADDRESS support
+* Added auto-documentation features.
+* Added ordered list support - does not support nested lists at all yet.
+* Added automatic bug submission
+* Added popup-menu for lucid emacs
+* Added support for links nested in headers.
+* v.007beta - second release
+* Revamped local files - now use file:/ instead of nonstandard local:/
+* Added better handling of definition lists.  (No support for Compact
+  ones now though)
+
+Fri Apr  2 10:28:08 1993  William M. Perry  (address@hidden)
+* Definition lists now keep their zones/extents so they are highlighted
+  correctly. 
+* Fixed bug in PRE handling - left out a (goto-char (point-min))
+
+Wed Mar 31 08:51:04 1993  William M. Perry  (address@hidden)
+* Did work on resolving ./ & ../ links (only works for one level right
+  now.  Will work on getting it recursive later.
+* Changed data field in extents/zones to be (w3 . type) so I
+  wouldn't grab a wrong item.
+* Fixed a bug in title handling.  Left something out of an if
+  statement and it would try to delete a region that (probably) didn't
+  exist.
+* Fixed bug in w3-follow-link (added a ':' to end of regexp).  Would
+  cause it to screw up on a url like http.html.  Thanks to Erik Ostrom
+  (address@hidden)
+* Changed requires to autoloads where possible
+* Wrapped require of transparent.el so it won't get loaded if in X
+* Fixed bug in lemacs mouse links.
+* Applied numerous patches from address@hidden & address@hidden to fix
+  compilation problems with lemacs & epoch.
+
+Tue Mar 30 15:05:01 1993  William M. Perry  (address@hidden)
+* Added mouse support for following links in epoch & lucid emacs
+  Store the link # in the data segment of the zone.  If mouse is
+  clicked in a zone, extract the data, assoc it with w3-links-list and
+  call w3-follow-link with it.  Hacky but works. :)
+* Added (provide 'w3) for easier loading, etc.
+* Fixed problems with epoch highlihting
+* Fixed makefile problem (some files left out)
+
+Sun Mar 28 13:04:12 1993  William M. Perry  (address@hidden)
+* Added auto-viewing of ps/gif/jpg/etc files
+* Added uncompression and gunzipping auto-recognition
+
+Sat Mar 27 12:32:54 1993  William M. Perry  (address@hidden)
+* v.004beta - first release
+* Few changes to the parser
+* Fixed PRE Handling so it parses out urls inside.
+* Added handling of &#XXX to insert ascii value of XXX.
+
+Fri Mar 26 11:27:52 1993  William M. Perry  (address@hidden)
+* Completed document source command.
+* Changed it so it won't barf if you try to fetch the same document twice.
+* Added w3-reload-document to reload the current file.
+
+Wed Mar 24 16:37:22 1993  William M. Perry  (address@hidden)
+* v.003beta - put on ftp archive
+* Added support for the xmosaic style of hotlist.  Goto and add are
+  supported.
+* Changed searching a little
+* Fixed bug in XMP/PRE handling that reinserted everything in all caps.
+  Was very annoying.
+* Added lemacs menu of hotlist items.
+
+Tue Mar 23 08:46:12 1993  William M. Perry  (address@hidden)
+* v.002beta - put on ftp archive
+* Added menus to the lucid emacs code.  Looks a little weird when
+  links are named 'here', but not bad.
+* Added to the searching code
+* Fixed bug in renumbering system (forgot to increment bogus-num)
+* Completely rewrote the parser (yet again).  Finally got the HTML
+  specs, so it now handles every item possible (hopefully).
+* Added support for small things like DL COMPACT, PLAINTEXT, PRE.
+* Added code to delete outdated information (HEADER, BODY, etc)
+* Added w3-preview-this-buffer, which feeds the current buffer into
+  the w3-preprocessor and spits out a formatted buffer.  I use this
+  mainly to see if I can break anything, but might be useful when
+  writing real html documents.
+* Added code to delete useless (to us) HTML headers (NEXTID, etc)
+* Added support for index searching.  Mode line is changed to reflect
+  this.  Need to use something more noticeable though.
+  
+Mon Mar 22 07:43:10 1993  William M. Perry  (address@hidden)
+* Broke highlighting in definition lists.  Not sure how to get around
+  this and still have the DLs formatted correctly.
+* Little tweaks
+* Cleaned up ^Ms that appeared sometimes
+* Added a default port for http links (http://moose/info instead of
+  http://moose:80/info)
+
+Sun Mar 21 13:44:02 1993  William M. Perry  (address@hidden)
+* Forgot to include Menu and DL lists, added them.
+* Added support for embedded plain text (XMP directive)
+* Added 'cacheing' of old info - just made variables buffer-local, and
+  save them before kill-all-local-variables, then restore.  Need to figure
+  out some way to kill old buffers (only keep last 5, etc)  
+* Fine tuned local file support
+* Added ftp support - just a link to ange-ftp
+* Fixed unNAMEd links yet again - should work better
+* Added support for lucid emacs & epoch (highlight links, headers,etc)
+  Borrowed code from html-mode.el by address@hidden
+* "Fixed" unNAME'd links.  Big Kludge. Needs work.
+
+Sat Mar 20 14:10:12 1993  William M. Perry  (address@hidden)
+* v.001beta
+* Complete rewrite of the parsing code.  Still not pretty, but much
+  faster, better paragraph filling.
+* Defined w3-mode
+* Forward and backward searching for links - still needs lots of work
+
+Fri Mar 19 08:00:03 1993  William M. Perry  (address@hidden)
+* v.000alpha
+* Support for gopher, telnet, http, and local file access
+* First attempt
diff --git a/HOWTO b/HOWTO
new file mode 100644
index 0000000..1de9f1e
--- /dev/null
+++ b/HOWTO
@@ -0,0 +1,153 @@
+How to build GNU Emacs W3 mode
+------------------------------
+
+    Robert J. Chassell, address@hidden
+    12 Aug 1997
+
+This is brief description of how to build a beta test version of GNU
+Emacs W3 mode.  Eventually, this note will be replaced by proper
+documentation in the W3 Info file.
+
+Here is one way to build version 3.0.99; you can adapt this to however
+you want to build W3:
+
+Untar the beta test file, in a directory above the one in which you want to
+place the sources:
+
+   $ cd /usr/local/src
+   $ tar xvzf w3-3.0.99.tar.gz
+
+Then cd into the w3-3.0.99 directory.
+
+In that directory, at your prompt, type this:
+
+   $ ./configure --help
+
+This documents how `configure' works; `configure' creates Makefiles
+for you.
+
+Then type a command such as this:
+
+   $ ./configure --with-emacs --prefix=/usr/local/src/w3-3.0.99  
--exec-prefix=/usr/local/src/w3-3.0.99
+
+In this example, the byte compiled files will go into the same directories
+as their sources.  You can put them elsewhere, but this is a simple
+clean way to create a test version.
+
+There was a bug in the Makefiles for 3.0.99 (this is what beta test
+software is to find): the name for the Emacs executable was set to `t'
+rather than to `emacs'; I changed that by hand.
+
+Then build the byte compiled files:
+
+   $ make w3
+
+(Well, I do this in Emacs with the `M-x compile' command, and I invoke:
+    date; make w3; date
+with `date' commands sandwiching the meat.  This way I can see how
+long the compile takes.  Now up to 16 minutes.)
+
+You will note I did give the `make all' command.  That not only
+bytecompiles W3 mode, but creates the Info and DVI files; however,
+Wm. Perry thoughtfully includes the Info in the ...texi/ directory
+anyhow, so you don't need to create them again; and I don't bother to
+recreate DVI files to print out except occasionally.  If you do want
+all your documentation, type `make all' instead of `make w3'.
+
+Link the location of your .elc files to /usr/local/src/w3/ so you
+don't have to change old habits:
+
+  $ cd /usr/local/src
+  $ ln -s /usr/local/src/w3-3.0.99/lisp w3
+
+I am basing this suggestion on the presumption that sometime in your
+past, you set the load-path in your .emacs file to a w3 directory,
+using an expression like this:
+
+    ;; set load-path
+    (setq load-path (cons "/usr/local/src/w3" load-path))
+
+By linking the directory with the byte-compiled files to this
+directory, you can always start W3 mode by typing `M-x w3'.
+
+Also, since the `configure' commands I suggested leave the existing
+(or place any new) Info files in the `/usr/local/src/w3-3.0.99/texi/'
+directory, you should also link the texi/ directory appropriately:
+
+  $ cd /usr/local/src
+  $ ln -s /usr/local/src/w3-3.0.99/texi w3-info
+
+Also, be sure to set the name of the menu appropriately in your
+/usr/info/dir file, like this:
+
+    * W3: (/usr/local/src/w3-info/w3.info).  Emacs W3 mode, a Web browser
+
+Now, type `M-x w3' inside of Emacs and W3 mode should start.
+
+                         -------------
+
+There is a bug in W3 version 3.0.99, in that it does not respond to
+the `w3-default-stylesheet' variable which the documentation says you
+can set in your .emacs file, with a command such as:
+
+;; Specify my own stylesheet
+(setq w3-default-stylesheet "~bob/.w3.sty")
+
+So, instead, put your own stylesheet where W3 can find it, such as in:
+
+    /usr/lib/emacs/w3/stylesheet
+
+Otherwise, you will see a warning like this:
+
+    (style/warning) No stylesheets found!  Check configuration! DANGER DANGER!
+    Emacs-W3 checked for its stylesheet in the following places
+    and did not find one.  ...
+
+You can create your won stylesheet by basing it on `default.css' which
+comes with the distribution.
+
+                         -------------
+
+Once you have started W3 mode, you can submit bugs by typing `w'
+(w3-submit-bug) in a W3 mode buffer.
+
+That is how I sent this file to William Perry .... I saw a lack in the
+documentation (I am continuously forgetting how to build a new version
+of W3 so I figured I ought to do something about it.)
+
+                         -------------
+
+Incidentally, rather than download a complete tar.gz file, you can of
+download diff files, patch a previous distribution, and byte-recompile
+the directory.  This is usually quicker than downloading the whole
+half-magabyte tar.gz file and byte compiling it.  
+
+Using ange-ftp, the diffs are in:
+
+    /address@hidden:/pub/elisp/w3/.betas/diffs
+
+Or you can do as I described here.
+
+-------------------
+The widgets are a set of files to which your `--with-emacs' option to
+`./configure' should point.  They are in the emacs-20/lisp/ directory,
+called `widget.el' and the like.  Also, `custom.el' is there.
+
+If you think that you are configuring correctly, but W3 still does not
+build, check to ensure you are removing your old `config.*' files
+before running your `./config' command.
+
+The files to be removed are:
+
+    config.cache
+    config.log
+    config.status
+
+Use `make distclean' to remove them.  (Incidentally, the `clean-cache'
+script is for cleaning your cache of old URLs, not for configuration.)
+
+The build sequence is:
+
+    make distclean
+    ./configure --with-emacs=/usr/local/src/emacs-20.2/src/emacs-20.2.1 
--prefix=/usr/local/src/w3-3.0.107 
+    make w3
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..aeb92ab
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,112 @@
+Emacs/W3 Installation Guide
+Copyright (c) 1997 Free Software Foundation, Inc.
+
+   Permission is granted to anyone to make or distribute verbatim copies
+   of this document as received, in any medium, provided that the
+   copyright notice and permission notice are preserved,
+   and that the distributor grants the recipient permission
+   for further redistribution as permitted by this notice.
+
+   Permission is granted to distribute modified versions
+   of this document, or of portions of it,
+   under the above conditions, provided also that they
+   carry prominent notices stating who last changed them,
+   and that any new or changed statements about the activities
+   of the Free Software Foundation are approved by the Foundation.
+
+
+ADDITIONAL DISTRIBUTION FILES
+
+* custom.tar.gz
+
+For older versions of Emacs (pre-20.x), you will need the latest and
+greatest versions of the custom and widget libraries.  This is
+distributed in a separate tar file to save users time in downloading,
+and to ease maintenance of the libraries.
+
+
+BUILDING AND INSTALLATION
+
+(This is for a Unix or Unix-like system.  For Windows NT or Windows
+95, see the file README.NT.  For VMS systems, see the file README.VMS)
+
+1) Make sure your system has enough memory to run Emacs, plus about 1
+megabyte to spare.
+
+Building Emacs/W3 requires about 2.8 Mb of disk space (including the
+sources).  Once installed, Emacs/W3 occupies about 2 Mb in the file
+system where it is installed.
+
+2) To build Emacs/W3, you must configure a few simple items.  Emacs/W3 
+uses the GNU 'autoconf' program for meta-configuration.  You should be 
+able to run the program `configure' as follows:
+
+   ./configure [--OPTION[=VALUE]] ...
+
+If you wish to build with a specific version of Emacs, specify
+`--with-emacs=VARIANT'.  If you wish to build with a specific version
+of XEmacs, specify `--with-xemacs=VARIANT'.  If you omit these
+options, `configure' will try to figure out what flavor of Emacs to
+use.  It will honor the `EMACS' environment variable if it is set,
+otherwise it will check for `xemacs' and `emacs' in your path.
+
+If you had to install the custom and widget libraries in a
+non-standard place, specify `--with-custom=DIR'.  If you omit this
+option, `configure' will try to figure out where an acceptable version 
+of custom and widget are installed.
+
+If you had to install Gnus in a non-standard place, specify
+`--with-gnus=DIR'.  If you omit this option, `configure' will try to
+figure out where an acceptable version of Gnus is installed.  The
+Content-ID (CID) URL handling relies on a recent version of Gnus, but
+the rest of Emacs/W3 can function with any version of Gnus later than
+5.0.
+
+If you prefer not to use the GNU `makeinfo' program if it is
+available, specify `--with-makeinfo=no'.  This will cause the info
+files to be built using Emacs.
+
+The `--prefix=PREFIXDIR' option specifies where the installation process
+should put Emacs/W3 and its data files.  This defaults to `/usr/local'.
+- Lisp files go in PREFIXDIR/share/emacs/site-lisp
+  (unless the `--with-lispdir' option says otherwise).
+- The architecture-independent files go in PREFIXDIR/share/emacs/w3
+  (unless the `--datadir' option says otherwise).
+
+`configure' doesn't do any compilation or installation itself.  It
+just creates the files that influence those things:
+`./Makefile', `texi/Makefile', and `lisp/Makefile'.
+
+When it is done, `configure' prints a description of what it did and
+creates a shell script `config.status' which, when run, recreates the
+same configuration.  If `configure' exits with an error after
+disturbing the status quo, it removes `config.status'.  `configure'
+also creates a file `config.cache' that saves the results of its tests
+to make reconfiguring faster, and a file `config.log' containing
+compiler output (useful mainly for debugging `configure').  You can
+give `configure' the option `--cache-file=FILE' to use the results of
+the tests in FILE instead of `config.cache'.  Set FILE to `/dev/null'
+to disable caching, for debugging `configure'.
+
+3) Run `make' in the top directory of the Emacs/W3 distribution to
+finish building Emacs/W3 in the standard way.  You can "install" the
+package with `make install'.  By default, Emacs/W3's files are
+installed in the following directories:
+
+`/usr/local/share/emacs/site-lisp' holds the Emacs/W3 lisp code.
+
+`/usr/local/share/emacs/w3' holds any data files for Emacs/W3,
+               including `stylesheet' which controls all default
+               formatting settings.
+
+`/usr/local/info' holds the on-line documentation for Emacs/W3, known
+               as "info files."
+
+4) Check the file `dir' in your site's info directory (usually
+/usr/local/info) to make sure that it has a menu entry for the
+Emacs/W3 info files.
+
+5) You are done!  You can remove object files from the build directory 
+by typing `make clean'.  To also remove the files that `configure'
+created (so you can compile Emacs/W3 for a different configuration),
+type `make distclean'.
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..23cdc90
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,104 @@
+# where the w3 lisp files should go
+srcdir  = @srcdir@
+prefix  = @prefix@
+datadir = @datadir@
+lispdir = @lispdir@
+infodir = @infodir@
+
address@hidden@
+SUBDIRS =lisp texi etc
+
+INSTALL   = @INSTALL@
+RM        = rm -f
+
+.PHONY: $(SUBDIRS) dotemacs
+
+all:   w3 info
+
+w3:
+       cd lisp && $(MAKE) $@
+
+fast: info
+       cd lisp && $(MAKE) $@
+
+html info dvi:
+       cd texi && $(MAKE) $@
+
+install: all
+       for x in $(SUBDIRS); do ( cd $$x && $(MAKE) $@ ); done
+
+distclean: clean
+       for x in $(SUBDIRS); do ( cd $$x && $(MAKE) $@ ); done
+       $(RM) config.* Makefile
+
+clean:
+       for x in $(SUBDIRS); do ( cd $$x && $(MAKE) $@ ); done
+
+dotemacs:
+       @if (grep ";;; Emacs/W3 Configuration" $(DOTEMACS) 2>&1) >/dev/null; 
then \
+               echo Emacs/W3 setup already exists in $(DOTEMACS);      \
+       else                                                            \
+               test -d `dirname $(DOTEMACS)` || mkdir -p `dirname 
$(DOTEMACS)`; \
+               (echo >> $(DOTEMACS)); \
+               (echo ";;; Emacs/W3 Configuration" >> $(DOTEMACS)); \
+               (echo "(setq load-path (cons \"$(lispdir)\" load-path))" >> 
$(DOTEMACS)); \
+               (echo "(require 'w3-auto \"w3-auto\")" >> $(DOTEMACS)); \
+               echo "Added Emacs/W3 setup to $(DOTEMACS)"; \
+       fi
+
+Makefile: $(srcdir)/Makefile.in ./config.status
+       ( cd . ; CONFIG_FILES=Makefile ./config.status )
+
+$(srcdir)/configure: $(srcdir)/configure.in $(srcdir)/aclocal.m4
+       cd $(srcdir) && autoreconf
+
+./config.status: $(srcdir)/configure
+       cd . && ./config.status --recheck
+
+###############################################################################
+# Distribution building, the joy of my life
+###############################################################################
+SUPPORTFILES =  HOWTO TODO README INSTALL README.NT README.VMS
+DISTFILES    =  configure.in aclocal.m4 Makefile.in install-sh \
+               configure descrip.mms ChangeLog build.bat       \
+               $(SUPPORTFILES)
+MAJOR = 4
+MINOR = 0pre
+VERSION = $(MAJOR).$(MINOR).$(shell cat .version)
+DIRNAME = w3-$(VERSION)
+
+newversion:
+       if [ ! -f .version ]; then \
+               echo 1 > .version; \
+       else \
+               expr 0`cat .version` + 1 > .version; \
+       fi
+       cvs commit -m "" .version
+
+version: newversion clean $(DISTFILES)
+       echo "Building version $(VERSION)"
+       ./build-dist --version=$(VERSION)
+
+realversion: $(DISTFILES)
+       mkdir /tmp/$(DIRNAME)
+       cp $(DISTFILES) /tmp/$(DIRNAME)
+       for x in $(SUBDIRS); do ( cd $$x && $(MAKE) version VERSION=$(VERSION) 
DIRNAME=/tmp/$(DIRNAME) ); done
+       tar cf - contrib | ( cd /tmp/$(DIRNAME) ; tar xf - )
+       ( cd /tmp ; tar cf - $(DIRNAME) | gzip -c -9 > /tmp/$(DIRNAME).tar.gz )
+       rm -fr /tmp/$(DIRNAME)
+
+###############################################################################
+# Package building, yet another joy
+###############################################################################
+AUTHOR_VERSION = $(VERSION)
+MAINTAINER = William Perry <address@hidden>
+PACKAGE = w3
+PKG_TYPE = regular
+REQUIRES = w3 mail-lib xemacs-base
+CATEGORY = comm
+
+_pkg.el: Makefile
+       @echo Creating _pkg.el
+       @echo ";;;###autoload" > _pkg.el
+       @echo "(package-provide '$(PACKAGE)" >> pkg.el
+       @echo "         :version $(VERSION)" >> pkg.el
diff --git a/README b/README
new file mode 100644
index 0000000..ec4ea74
--- /dev/null
+++ b/README
@@ -0,0 +1,35 @@
+This directory tree holds version $State: Exp $ of Emacs/W3, the fully
+customizable, largely undocumented web browser for Emacs.
+
+You may encounter bugs in this release.  If you do, please report
+them; your bug reports are valuable contributions to Emacs/W3, since
+they allow us to notice and fix problems on machines we don't have, or
+in code we don't use often.  See the file BUGS for more information on
+how to report bugs.
+
+The file INSTALL in this directory says how to bring up Emacs/W3 on
+Unix, once you have loaded the entire subtree of this directory.
+
+Note that the Emacs/W3 installation procedure has changed since
+version 2.x; you will probably want to read the file INSTALL even if
+you have installed Emacs/W3 before.  The new procedure is intended to
+simplify installation, and make it easier to upgrade in the future.
+
+Reports of bugs in Emacs/W3 should be sent to the mailing list
address@hidden  See the "Reporting Bugs" section of the
+Emacs/W3 manual for more information on how to report bugs.  See the
+"More Help" section of the Emacs/W3 manual for more information on
+mailing lists relating to Emacs/W3.
+
+The file `configure' is a shell script to acclimate Emacs to the
+oddities of your processor and operating system.  It creates the file
+`Makefile' (a script for the `make' program), which automates the
+process of building and installing Emacs.  See INSTALL for more
+detailed information.
+
+There are several subdirectories:
+
+`etc' holds miscellaneous architecture-independent data files
+`lisp' holds the lisp code for Emacs/W3
+`texi' holds the documentation tree for Emacs/W3
+`contrib' holds user-contributed utilities that are not officially supported
diff --git a/README.NT b/README.NT
new file mode 100644
index 0000000..d24ff82
--- /dev/null
+++ b/README.NT
@@ -0,0 +1,60 @@
+Emacs/W3 Installation Guide (Windows 95/NT Version)
+Copyright (c) 1998 Free Software Foundation, Inc.
+
+   Permission is granted to anyone to make or distribute verbatim copies
+   of this document as received, in any medium, provided that the
+   copyright notice and permission notice are preserved,
+   and that the distributor grants the recipient permission
+   for further redistribution as permitted by this notice.
+
+   Permission is granted to distribute modified versions
+   of this document, or of portions of it,
+   under the above conditions, provided also that they
+   carry prominent notices stating who last changed them,
+   and that any new or changed statements about the activities
+   of the Free Software Foundation are approved by the Foundation.
+
+
+ADDITIONAL DISTRIBUTION FILES
+
+* custom.tar.gz
+
+For older versions of Emacs (pre-20.x), you will need the latest and
+greatest versions of the custom and widget libraries.  This is
+distributed in a separate tar file to save users time in downloading,
+and to ease maintenance of the libraries.
+
+
+BUILDING AND INSTALLATION
+
+(This is for a Windows 95 or NT system.  For Unix or Unix-like
+systems, see the file INSTALL.  For VMS systems, see the file
+README.VMS)
+
+1) Make sure your system has enough memory to run Emacs, plus about 1
+megabyte to spare.
+
+Building Emacs/W3 requires about 2.8 Mb of disk space (including the
+sources).  Once installed, Emacs/W3 occupies about 2 Mb in the file
+system where it is installed.
+
+2) You must tell Emacs/W3 where to find the custom/widget packages
+that you have installed if you are running Emacs 19.
+
+This is done with the WIDGETDIR environment variable.  Set this to the
+directory where the lisp files are, ie:
+
+set WIDGETDIR=c:\users\blort\lisp\custom
+
+3) Run `build.bat' in the top directory of the Emacs/W3 distribution
+to finish building Emacs/W3 in the standard way.
+
+4) Add the Emacs/W3 lisp directory to your load-path.  Add the
+following line to your .emacs file.
+
+(setq load-path (cons "c:/path/to/w3-x.y.z/lisp" load-path))
+(require 'w3-auto)
+
+4) Check the file `dir' in your site's info directory (usually
+/usr/local/info) to make sure that it has a menu entry for the
+Emacs/W3 info files.
diff --git a/README.VMS b/README.VMS
new file mode 100644
index 0000000..0fd0c0c
--- /dev/null
+++ b/README.VMS
@@ -0,0 +1 @@
+Put VMS installation notes in here.
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..06d4887
--- /dev/null
+++ b/TODO
@@ -0,0 +1,106 @@
+BUGS (4.0):
+- need to support HTTP/0.9 (http://c2.com:8080) responses
+- When auto-loading the index.html file out of a directory, if the
+  directory does not have the trailing '/', relative URL references
+  are wrong.
+- Make sure that we pass all the relative URL expansion tests at
+  http://www.ics.uci.edu/%7Efielding/url/test1.html
+- /etc/mailcap cannot overide builtin mm-mime-data stuff?
+- try to protect people from using '~' in file URLs
+- keystrokes entered while in w3-pause self-insert under XEmacs - the
+  loop around dispatch-event needs to be smarter about what it
+  swallows.
+- border-color can have multiple color specifications, but we
+  currently choke with 'args out of range' when we see this.
+- widget appears to be stealing button3 to mean 'activate' - this is
+  bogus!  We lose all context-sensitive menus because of this.
+- We still seem to be growing the line size under Emacs 19.x/20.x
+- It would be really nice if w3 buffers were put into w3-mode as soon
+  as they were created. Then if the rendering craps out somehow then
+  the buffer could be browsed such as it was. Ideally, links and
+  widgets would be functional.
+- document how to translate Netscape foo.pac files to emacs lisp
+- Should we stop using reporter.el?
+
+BUGS (4.1):
+- background colors are not heeded on table rows (<tr>).  Same
+  properties on individual cells or the table as a whole work fine.
+- <br> in <dd> hosed - margins in general tend to be too big sometimes.
+- client side imagemaps have to be in the same buffer (actually in the
+  smae buffer, _BEFORE_ the usemap directive on an image) - fix to be
+  able to use imagemaps in different files, any position, etc, etc.
+
+FEATURES (4.1)
+- More tweaks to the hotindex stuff from Laurent Martelli <address@hidden>
+    + Ask  to delete unresolved  entries.  Right now, keywords are
+    associated to hotlist entries on the basis of entry names.  It
+    means  that if you  rename  an  entry with a  hotindex-unaware
+    W3/Emacs, hotindex will refuse  work. Same thing if you delete
+    an entry. Of course, it would really be better to use the href
+    instead of the entry name.
+
+    +  Keywords weighting :  it  would be  nice to give  different
+    weight to keywords  in  order to  precise the  relevance  of a
+    keyword for a document. Query results woudl  then be sorted by
+    relevance.
+
+    +  Hotindex file  sharing  :  wouldn't it  be   nice  to share
+    keywords files with your friends? Ideally,  one should be able
+    to specify a list of keywords file to search in. Entries found
+    in the first files would match  better than those found at the
+    end. 
+
+    + Automatically add  keywords found in  meta  tags and procide
+    additional methods to automatically index documents.
+
+    * Multi keyword search
+- cache a formatted version of documents, with enough info to recreate
+  the widgets in them.
+- w3-preview-region command
+- LDAP support (XEmacs)
+- New proxy type for sending requests via mail to a mail->web->mail gateway.
+- Emacspeak Interaction
+  - some way of specifying in a stylesheet whether certain text is
+    inaudible.  use the 'inaudible text property for this.
+  - Full Aural-CSS support
+- more sophisticated filling algorithm. I'm not sure exactly what
+  would be sufficient but breaking lines after punctuation  seems like
+  it would solve most of the problem.
+- When fetching images for viewing (not inlining), W3 should at least
+  have an option of displaying it inline, ala Netscape.
+- Widget library merging
+  - Write a font selection widget
+  - Write a voice selection widget
+  - Write a mailcap entry widget
+- Custom library merging
+  - Add custom support for MM
+- Hotlist handling
+  - Abstract out current support
+  - Do something similar to GNUS 'backends' to provide easy way to add new
+    bookmark formats, etc.
+- Write a new major mode for handling CSS style sheets
+
+FEATURES (5.0)
+- Emacspeak Integration
+  - Need option to turn off table rendering and print it out as a
+    table that is viewable with emacspeak-table-ui.el
+- Write a text/xml parser
+- Completely rewrite display code again
+  - Abstract everything out to follow parse->flow objects->render model
+  - Base all stylesheet stuff off of DSSSL
+  - CSS2
+  - New rendering backends
+    - Native postscript output
+    - LaTeX upgrade
+    - TeXinfo
+- Display code
+  - implement <spacer> from netscape 3.0b5
+  - reimplement w3-show-headers
+  - Handle math environment using the calc library
+  - Better integration with the parser
+
+MAINTENANCE CRAP (4.0)
+- Get in touch with "Rob" == Rob Partington <address@hidden> about
+  registering w3.browser.org
+- Legal Papers (status - emailed necessary paperwork)
+  - Stephen Peters <address@hidden> - LaTeX code (???)
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..748c3e9
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,219 @@
+dnl
+dnl Execute arbitrary emacs lisp
+dnl
+AC_DEFUN(AC_EMACS_LISP, [
+elisp="$2"
+if test -z "$3"; then
+       AC_MSG_CHECKING(for $1)
+fi
+AC_CACHE_VAL(EMACS_cv_SYS_$1,[
+       OUTPUT=./conftest-$$
+       ${EMACS} -batch -eval "(let ((x ${elisp})) (write-region (if (stringp 
x) (princ x) (prin1-to-string x)) nil \"${OUTPUT}\"))"  > /dev/null 2>&1 
+       retval=`cat ${OUTPUT}`
+       rm -f ${OUTPUT}
+       EMACS_cv_SYS_$1=$retval
+])
+$1=${EMACS_cv_SYS_$1}
+if test -z "$3"; then
+       AC_MSG_RESULT($$1)
+fi
+])
+
+AC_DEFUN(AC_XEMACS_P, [
+  AC_MSG_CHECKING([if $EMACS is really XEmacs])
+  AC_EMACS_LISP(xemacsp,(if (string-match \"XEmacs\" emacs-version) \"yes\" 
\"no\") ,"noecho")
+  XEMACS=${EMACS_cv_SYS_xemacsp}
+  EMACS_FLAVOR=emacs
+  if test "$XEMACS" = "yes"; then
+     EMACS_FLAVOR=xemacs
+  fi
+  AC_MSG_RESULT($XEMACS)
+  AC_SUBST(XEMACS)
+  AC_SUBST(EMACS_FLAVOR)
+])
+
+AC_DEFUN(AC_PATH_LISPDIR, [
+  AC_XEMACS_P
+  if test "$prefix" = "NONE"; then
+       AC_MSG_CHECKING([prefix for your Emacs])
+       AC_EMACS_LISP(prefix,(expand-file-name \"..\" 
invocation-directory),"noecho")
+       prefix=${EMACS_cv_SYS_prefix}
+       AC_MSG_RESULT($prefix)
+  fi
+  AC_ARG_WITH(lispdir,          --with-lispdir            Where to install 
lisp files, lispdir=${withval})
+  AC_MSG_CHECKING([where .elc files should go])
+  if test -z "$lispdir"; then
+    dnl Set default value
+    theprefix=$prefix
+    if test "x$theprefix" = "xNONE"; then
+       theprefix=$ac_default_prefix
+    fi
+    lispdir="\$(datadir)/${EMACS_FLAVOR}/site-lisp"
+    for thedir in share lib; do
+       potential=
+       if test -d ${theprefix}/${thedir}/${EMACS_FLAVOR}/site-lisp; then
+          lispdir="\$(prefix)/${thedir}/${EMACS_FLAVOR}/site-lisp"
+          break
+       fi
+    done
+  fi
+  AC_MSG_RESULT($lispdir)
+  AC_SUBST(lispdir)
+])
+
+dnl
+dnl Determine the emacs version we are running.
+dnl Automatically substitutes @EMACS_VERSION@ with this number.
+dnl
+AC_DEFUN(AC_EMACS_VERSION, [
+AC_MSG_CHECKING(for emacs version)
+AC_EMACS_LISP(version,(and (boundp 'emacs-major-version) (format \"%d.%d\" 
emacs-major-version emacs-minor-version)),"noecho")
+
+EMACS_VERSION=${EMACS_cv_SYS_version}
+AC_SUBST(EMACS_VERSION)
+AC_MSG_RESULT(${EMACS_VERSION})
+])
+
+dnl
+dnl Determine whether the specified version of Emacs supports packages
+dnl or not.  Currently, only XEmacs 20.3 does, but this is a general
+dnl check.
+dnl
+AC_DEFUN(AC_EMACS_PACKAGES, [
+AC_ARG_WITH(package-dir,      --with-package-dir        Configure as a XEmacs 
package in directory, [ EMACS_PACKAGE_DIR="${withval}"])
+if test -n "$EMACS_PACKAGE_DIR"; then
+  if test "$prefix" != "NONE"; then
+       AC_MSG_ERROR([--with-package-dir and --prefix are mutually exclusive])
+  fi
+  dnl Massage everything to use $(prefix) correctly.
+  prefix=$EMACS_PACKAGE_DIR
+  datadir='$(prefix)/etc/w3'
+  infodir='$(prefix)/info'
+  lispdir='$(prefix)/lisp/w3'
+fi
+AC_SUBST(EMACS_PACKAGE_DIR)
+])
+
+dnl
+dnl Check whether a function exists in a library
+dnl All '_' characters in the first argument are converted to '-'
+dnl
+AC_DEFUN(AC_EMACS_CHECK_LIB, [
+if test -z "$3"; then
+       AC_MSG_CHECKING(for $2 in $1)
+fi
+library=`echo $1 | tr _ -`
+AC_EMACS_LISP($1,(progn (fmakunbound '$2) (condition-case nil (progn (require 
'$library) (fboundp '$2)) (error nil))),"noecho")
+if test "${EMACS_cv_SYS_$1}" = "nil"; then
+       EMACS_cv_SYS_$1=no
+fi
+HAVE_$1=${EMACS_cv_SYS_$1}
+AC_SUBST(HAVE_$1)
+if test -z "$3"; then
+       AC_MSG_RESULT($HAVE_$1)
+fi
+])
+
+dnl
+dnl Check whether a variable exists in a library
+dnl All '_' characters in the first argument are converted to '-'
+dnl
+AC_DEFUN(AC_EMACS_CHECK_VAR, [
+AC_MSG_CHECKING(for $2 in $1)
+library=`echo $1 | tr _ -`
+AC_EMACS_LISP($1,(progn (makunbound '$2) (condition-case nil (progn (require 
'$library) (boundp '$2)) (error nil))),"noecho")
+if test "${EMACS_cv_SYS_$1}" = "nil"; then
+       EMACS_cv_SYS_$1=no
+fi
+HAVE_$1=${EMACS_cv_SYS_$1}
+AC_SUBST(HAVE_$1)
+AC_MSG_RESULT($HAVE_$1)
+])
+
+dnl
+dnl Perform sanity checking and try to locate the custom and widget packages
+dnl
+AC_DEFUN(AC_CHECK_CUSTOM, [
+AC_MSG_CHECKING(for acceptable custom library)
+AC_CACHE_VAL(EMACS_cv_ACCEPTABLE_CUSTOM,[
+AC_EMACS_CHECK_LIB(widget,widget-convert-text,"noecho")
+AC_EMACS_CHECK_LIB(wid_edit,widget-convert-text,"noecho")
+if test "${HAVE_widget}" = "yes"; then
+       EMACS_cv_ACCEPTABLE_CUSTOM=yes
+else
+       if test "${HAVE_wid_edit}" != "no"; then
+               EMACS_cv_ACCEPTABLE_CUSTOM=yes
+       else
+               EMACS_cv_ACCEPTABLE_CUSTOM=no
+       fi
+fi
+if test "${EMACS_cv_ACCEPTABLE_CUSTOM}" = "yes"; then
+       AC_EMACS_LISP(widget_dir,(file-name-directory (locate-library 
\"widget\")),"noecho")
+       EMACS_cv_ACCEPTABLE_CUSTOM=$EMACS_cv_SYS_widget_dir
+fi
+])
+   AC_ARG_WITH(custom,           --with-custom             Specify where to 
find the custom package, [ EMACS_cv_ACCEPTABLE_CUSTOM=`( cd $withval && pwd || 
echo "$withval" ) 2> /dev/null` ])
+   CUSTOM=${EMACS_cv_ACCEPTABLE_CUSTOM}
+   AC_SUBST(CUSTOM)
+   AC_MSG_RESULT("${CUSTOM}")
+])
+
+dnl
+dnl Perform sanity checking and try to locate the gnus package
+dnl
+AC_DEFUN(AC_CHECK_GNUS, [
+AC_MSG_CHECKING(for recent gnus version)
+AC_CACHE_VAL(EMACS_cv_ACCEPTABLE_GNUS,[
+AC_EMACS_CHECK_LIB(mm_decode, mm-get-content-id,"noecho")
+if test "${HAVE_mm_decode}" = "yes"; then
+       EMACS_cv_ACCEPTABLE_GNUS=yes
+else
+       EMACS_cv_ACCEPTABLE_GNUS=no
+fi
+
+if test "${EMACS_cv_ACCEPTABLE_GNUS}" = "yes"; then
+       AC_EMACS_LISP(gnus_dir,(file-name-directory (locate-library 
\"mm-decode\")),"noecho")
+       EMACS_cv_ACCEPTABLE_GNUS=$EMACS_cv_SYS_gnus_dir
+fi
+])
+   AC_ARG_WITH(gnus,           --with-gnus             Specify where to find 
the gnus package, [ EMACS_cv_ACCEPTABLE_GNUS=`( cd $withval && pwd || echo 
"$withval" ) 2> /dev/null` ])
+   GNUS=${EMACS_cv_ACCEPTABLE_GNUS}
+   AC_SUBST(GNUS)
+   AC_MSG_RESULT("${GNUS}")
+])
+
+dnl
+dnl Figure out how we can rebuild the auto-autoloads.el files
+dnl
+AC_DEFUN(AC_CHECK_AUTOLOADS, [
+AC_MSG_CHECKING(how to rebuild autoloads)
+AC_CACHE_VAL(EMACS_cv_REBUILD_AUTOLOADS,[
+AC_EMACS_CHECK_LIB(autoload,batch-update-directory,"noecho")
+EMACS_cv_REBUILD_AUTOLOADS=${HAVE_autoload}
+])
+if test "${EMACS_cv_REBUILD_AUTOLOADS}" != "no"; then
+   REBUILD_AUTOLOADS='$(EMACS) $(BATCHFLAGS) -eval "(setq 
autoload-package-name \"w3\")" -l autoload -f batch-update-directory .'
+else
+   REBUILD_AUTOLOADS='touch auto-autoloads.el'
+fi
+AC_MSG_RESULT("${REBUILD_AUTOLOADS}")
+AC_SUBST(REBUILD_AUTOLOADS)
+])
+
+dnl
+dnl Figure out how we can rebuild the auto-autoloads.el files
+dnl
+AC_DEFUN(AC_CHECK_CUSTOMLOADS, [
+AC_MSG_CHECKING(how to rebuild custom autoloads)
+AC_CACHE_VAL(EMACS_cv_REBUILD_CUSTOMLOADS,[
+AC_EMACS_CHECK_LIB(cus_dep,Custom-make-dependencies,"noecho")
+EMACS_cv_REBUILD_CUSTOMLOADS=${HAVE_cus_dep}
+])
+if test "${EMACS_cv_REBUILD_CUSTOMLOADS}" != "no"; then
+   REBUILD_CUSTOMLOADS='$(EMACS) $(BATCHFLAGS) -l cus-dep -f 
Custom-make-dependencies .'
+else
+   REBUILD_CUSTOMLOADS='touch custom-load.el'
+fi
+AC_MSG_RESULT("${REBUILD_CUSTOMLOADS}")
+AC_SUBST(REBUILD_CUSTOMLOADS)
+])
diff --git a/build-dist b/build-dist
new file mode 100755
index 0000000..b2d11a0
--- /dev/null
+++ b/build-dist
@@ -0,0 +1,45 @@
+#!/bin/sh
+
+while [ $# != 0 ]; do
+  switch="$1"
+  shift
+  case "$switch" in
+    --*=*)
+      opt=`echo '' ${switch} | sed -e 's:^ ::' -e 's:^-*\([^=]*\)=.*$:\1:'`
+      val=`echo '' ${switch} | sed -e 's:^ ::' -e 's:^-*[^=]*=\(.*\)$:\1:'`
+      ;;
+    --*)
+      opt=`echo '' ${switch} | sed -e 's:^ ::' -e 's:^-*\(.*\)$:\1:'`
+      val='yes'
+      ;;
+  esac
+  ARGS="${ARGS} --${opt}='${val}'"
+  case "${opt}" in
+    *) eval "${opt}='${val}'";;
+  esac
+done
+
+if [ -z "${version}" ]; then
+   exit
+fi
+
+CVSROOT=/usr/people/wmperry/.cvs/
+export CVSROOT
+
+( cd .    ; cvs admin -s"p${version}" README )
+( cd lisp ; cvs admin -s"p${version}" w3-vars.el )
+( cd lisp ; cvs admin -s"p${version}" url-vars.el )
+( cd texi ; cvs admin -s"v${version}" w3.txi )
+
+cd /usr/tmp/
+rm -fr w3
+cvs export -f -D now -kv w3
+cd w3
+autoconf
+rm -f lisp/auto-autoloads.el lisp/custom-load.el
+./configure --with-xemacs --with-custom=`pwd`/lisp
+make realversion
+cd
+rm -fr /usr/tmp/w3
+TAG=v`echo ${version} | tr . -`
+cvs rtag ${TAG} w3
diff --git a/build.bat b/build.bat
new file mode 100644
index 0000000..24f76c2
--- /dev/null
+++ b/build.bat
@@ -0,0 +1,5 @@
+set EMACS=emacs
+
+cd lisp
+copy w3-cfg.nt w3-cfg.el
+%EMACS% -batch -q -l ./docomp.el -f compile-it
diff --git a/configure.in b/configure.in
new file mode 100644
index 0000000..8ddaa81
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,105 @@
+AC_INIT(configure.in)
+AC_PREREQ(2.4)
+
+dnl Disable cache files:
+dnl This is controversial, but I am convinced this is the right way to go,
+dnl at least by default.  Otherwise there are too many surprises.
+define([AC_CACHE_LOAD], )dnl
+define([AC_CACHE_SAVE], )dnl
+define([AC_CACHE_VAL], [
+$2
+])dnl
+
+AC_PROG_INSTALL
+
+dnl
+dnl Apparently, if you run a shell window in Emacs, it sets the EMACS
+dnl environment variable to 't'.  Lets undo the damage.
+dnl
+if test "${EMACS}" = "t"; then
+   EMACS=""
+fi
+
+AC_ARG_WITH(xemacs,           --with-xemacs             Use XEmacs to build, [ 
if test "${withval}" = "yes"; then EMACS=xemacs; else EMACS=${withval}; fi ])
+AC_ARG_WITH(emacs,            --with-emacs              Use Emacs to build, [ 
if test "${withval}" = "yes"; then EMACS=emacs; else EMACS=${withval}; fi ])
+AC_ARG_WITH(makeinfo,         --with-makeinfo           Specify how to build 
info files, [ MAKEINFO="$withval" ])
+AC_ARG_ENABLE(site-install,   --enable-site-install     Perform a sitewide 
installation, [ DOTEMACS='$(prefix)/share/emacs/site-lisp/default.el' ], [ 
DOTEMACS=`( cd ; pwd)`/.emacs ])
+
+AC_CHECK_PROG(TEXI2HTML, texi2html, texi2html, echo Cannot create html version 
of)
+AC_CHECK_PROG(EMACS, xemacs, xemacs, emacs)
+AC_CHECK_PROG(MAKEINFO, makeinfo, makeinfo, \$(EMACS) -batch -q -l texinfmt -f 
batch-texinfo-format)
+AC_CHECK_PROG(INSTALLINFO, install-info, install-info, true)
+
+AC_EMACS_PACKAGES
+AC_PATH_LISPDIR
+
+AC_EMACS_VERSION
+AC_CHECK_CUSTOM
+AC_CHECK_GNUS
+AC_CHECK_AUTOLOADS
+AC_CHECK_CUSTOMLOADS
+
+if test "${MAKEINFO}" = "no"; then
+   MAKEINFO='$(EMACS) -batch -q -l texinfmt -f batch-texinfo-format'
+fi
+
+if test "${TEXI2HTML}" = "texi2html"; then
+   TEXI2HTML_FLAGS="-menu -glossary -number -split_node"
+fi
+
+AC_SUBST(EMACS_PACKAGE_DIR)
+AC_SUBST(MAKEINFO)
+AC_SUBST(EMACS)
+AC_SUBST(INSTALL)
+AC_SUBST(INSTALLINFO)
+AC_SUBST(DOTEMACS)
+AC_SUBST(TEXI2HTML)
+AC_SUBST(TEXI2HTML_FLAGS)
+
+if test "${GNUS}" = "no"; then
+AC_MSG_WARN(" ")
+AC_MSG_WARN(Emacs/W3 will be unable to deal with Content-ID (CID) URLs)
+AC_MSG_WARN(because the version of Gnus you are running does not support)
+AC_MSG_WARN(" ")
+AC_MSG_WARN(If you routinely receive multipart/related MIME messages,)
+AC_MSG_WARN(you may wish to upgrade to the latest version of Gnus that)
+AC_MSG_WARN(is natively MIME aware.  Please see http://www.gnus.org/ for)
+AC_MSG_WARN(information on Gnus and how to download it.)
+AC_MSG_WARN(" ")
+fi
+
+if test "${CUSTOM}" = "no"; then
+AC_MSG_WARN(" ")
+AC_MSG_WARN(No usable version of the widget/custom libraries have been)
+AC_MSG_WARN(detected on your system.  This version of Emacs/W3 requires)
+AC_MSG_WARN(features present in newer versions of the widget library.)
+AC_MSG_WARN(" ")
+AC_MSG_WARN(Please upgrade to the latest version of custom available.)
+AC_MSG_WARN(This package is included with Emacs 20.1 and XEmacs 20.3)
+AC_MSG_WARN(or from http://www.dina.kvl.dk/~abraham/custom/)
+AC_MSG_WARN(or /ftp.dina.kvl.dk:/pub/Staff/Per.Abrahamsen/custom/)
+AC_MSG_WARN(" ")
+AC_MSG_WARN([You may still continue, but you must modify lisp/Makefile])
+AC_MSG_WARN(to have the correct WIDGETDIR setting.)
+AC_MSG_WARN(" ")
+fi
+
+AC_OUTPUT(Makefile
+         etc/Makefile
+         texi/Makefile
+         lisp/Makefile
+         lisp/w3-cfg.el
+         )
+
+AC_MSG_RESULT(" ")
+AC_MSG_RESULT("Sucessfully configured Emacs/W3")
+if test -n "$EMACS_PACKAGE_DIR"; then
+   AC_MSG_RESULT("Using package root:                ${EMACS_PACKAGE_DIR}")
+fi
+AC_MSG_RESULT("Using custom package installed in: ${CUSTOM}")
+AC_MSG_RESULT("Emacs/W3 will be compiled with:    ${EMACS}")
+AC_MSG_RESULT(" ")
+AC_MSG_RESULT("To finish building Emacs/W3 type \'make\' now.")
+AC_MSG_RESULT("To install Emacs/W3 type \'make install\'.")
+AC_MSG_RESULT("To create autoloads in \'${DOTEMACS}\' type \'make dotemacs\'")
+
diff --git a/contrib/README b/contrib/README
new file mode 100644
index 0000000..ae49531
--- /dev/null
+++ b/contrib/README
@@ -0,0 +1,9 @@
+This is the user-contributed utilities section of Emacs/W3.
+-------------------------------------------------------------------------------
+The files in this directory are not officially part of Emacs/W3, but
+are generally useful.  A short synopsis:
+
+File                           Purpose
+-------------------------------------------------------------------------------
+w3-imenu.el                    Navigate an HTML buffer via the `imenu' package
+clean-cache                    Prune your cache to a certain size
diff --git a/contrib/clean-cache b/contrib/clean-cache
new file mode 100755
index 0000000..fa15a1a
--- /dev/null
+++ b/contrib/clean-cache
@@ -0,0 +1,62 @@
+#!/bin/sh
+#
+# Copyright © 1995-1997, William M. Perry <address@hidden>
+#
+# Author:      William M. Perry <address@hidden>
+# Maintainer:  William M. Perry <address@hidden>
+# Created:     95/04/18 10:44:15
+# Version:     $Revision: 1.1 $
+# Modified:     $Date: 1998/12/01 22:11:57 $
+# Keywords:    cache clean
+# 
+# This shell script will clean out your cache directory for Emacs/W3
+# It is designed to be run from a cron (see crontab(5)) or at(1) job.
+#
+# This should probably only be run occasionally: like once a month, or
+# when you determine that the cache size is too big.  Something like:
+#
+# CACHEMAXSIZE=5000
+# SIZE=`du -s $CACHE_ROOT | awk '{print $1}'
+# if [ $SIZE -gt $CACHEMAXSIZE ] ; then
+#   /run/the/real/clean-cache
+# fi
+
+if [ -z "$CACHE_ROOT" ] ; then
+  CACHE_ROOT=/tmp/$USER                        # The root directory of the 
cache
+fi
+
+if [ -z "$CONTROL_FILE" ] ; then
+  CONTROL_FILE="$CACHE_ROOT/.clean"
+fi
+
+if [ -z "$CLEAN_PROTOCOLS" ] ; then
+  CLEAN_PROTOCOLS="http gopher file ftp wais news"
+fi
+
+if [ -f "$CONTROL_FILE" ] ; then
+  echo "Starting to clean $CACHE_ROOT..." `date`
+
+  for x in $CLEAN_PROTOCOLS
+  do
+    if [ -d "${CACHE_ROOT}/${x}" ] ; then
+      echo "  Cleaning $x files"
+      find $CACHE_ROOT/$x -depth -type f \( ! -anewer "$CONTROL_FILE" \) \
+       -exec rm -f {} \;
+      find $CACHE_ROOT/$x -depth -type d -exec rmdir {} \;
+    fi
+  done
+  
+  touch "$CONTROL_FILE"
+  echo "Cache clean ended: "`date`
+else
+  echo "The cleaning control file ($CONTROL_FILE) could not be found."
+  echo "To create it (and make all your cache files 'current' do:"
+  echo ""
+  echo "touch $CONTROL_FILE"
+  echo "find $CACHE_ROOT -exec touch {} \;"
+  echo ""
+  echo "PLEASE NOTE: This can damage your cache, by changing the times it"
+  echo "sends to the remote server to see if the file was modified."
+  echo "I recommend just touching the file, then rerunning this script to"
+  echo "wipe the cache clean and start over."
+fi
diff --git a/contrib/w3-imenu.el b/contrib/w3-imenu.el
new file mode 100644
index 0000000..0040125
--- /dev/null
+++ b/contrib/w3-imenu.el
@@ -0,0 +1,86 @@
+;;;$Id: w3-imenu.el,v 1.1 1998/12/01 22:11:57 wmperry Exp $
+;;;Description: Build up navigation index for W3 documents:
+(require 'cl)
+(require 'imenu)
+;;{{{ Tags to index
+
+(defvar w3-imenu-index-html-elements
+  (list 'h1 'h2 'h3)
+  "*List of HTML tags whose buffer positions in the W3 presentation
+should appear in the index")
+
+(make-variable-buffer-local 'w3-imenu-index-html-elements)
+;;}}}
+;;{{{ helpers 
+
+(defsubst w3-html-stack () (get-text-property (point) 'html-stack))
+
+(defsubst w3-html-stack-top-element (stack)
+  (first (first stack )))
+
+;;}}}
+;;{{{  Move to an element position
+
+(defun w3-imenu-goto-next-element (element)
+  "Move forward in the W3 buffer to point where
+the next occurrence of element element starts.
+Return nil and leave point at end of buffer  if not found."
+  (let ((position nil)
+        (found nil)
+        (stack (w3-html-stack)))
+    (while  (and (not (eobp))
+                 (not found))
+      (setq found
+            (or (eq (w3-html-stack-top-element stack)  element)
+                (and (eq (w3-html-stack-top-element stack) 'a)
+                     (eq (first (second stack)) element))))
+      (setq position  (point))
+      (goto-char
+       (next-single-property-change  (point)  'html-stack
+                                     (current-buffer) (point-max)))
+      (setq stack (w3-html-stack)))
+    (if found position nil)))
+
+;;}}}
+;;{{{  create an index 
+
+(defun w3-imenu-create-index ()
+  "Returns an alist suitable for use by imenu"
+  (declare (special w3-imenu-index-html-elements))
+  (let ((index nil)
+        (position nil)
+        (marker nil))
+    (save-excursion
+      (loop for element in w3-imenu-index-html-elements
+            do 
+            (goto-char (point-min))
+            (while (setq position
+                         (w3-imenu-goto-next-element element))
+              (setq marker (make-marker))
+              (set-marker marker position)
+            (push
+             (cons
+              (buffer-substring-no-properties position (point))
+              marker)
+             index))))
+    index))
+
+;;}}}
+;;{{{ Tell W3 to start using it:
+(declaim (special imenu-create-index-function))
+(add-hook
+ 'w3-mode-hook
+ (function
+  (lambda ()
+    (setq imenu-create-index-function 'w3-imenu-create-index)
+    (define-key w3-mode-map "j" 'imenu))))
+
+;;}}}
+(provide 'w3-imenu)
+;;{{{ end of file 
+
+;;; local variables:
+;;; folded-file: t
+;;; end: 
+
+;;}}}
diff --git a/descrip.mms b/descrip.mms
new file mode 100644
index 0000000..8f5d53b
--- /dev/null
+++ b/descrip.mms
@@ -0,0 +1,71 @@
+# This file kindly written by Richard Levitte - GNU on VMS hacker
+#                                               <address@hidden>
+#
+# Hacked upon by Bill Perry <address@hidden>, whose VMS experiences
+# are a thing of the past.  Let me know if this works or not.
+
+# where the w3 lisp files should go
+prefix  = gnu_root
+lispdir = $(prefix):[emacs.site-lisp]
+confdir = $(prefix):[emacs.w3]
+
+DOTEMACS= $(prefix):[lib.emacs.site-lisp]default.el
+SUBDIRS =lisp texi etc
+
+RM        = delete
+MKDIR    = create/dir
+ECHO      = write sys$output
+
+.PHONY: $(SUBDIRS) dotemacs
+
+all:   w3 info
+
+w3 fast:
+       set def [.lisp]
+       mms $@
+       set def [-]
+
+html info dvi:
+       set def [.texi]
+       mms $@
+       set def [-]
+
+install: all dotemacs
+        set def [.lisp]
+        mms install
+        set def [-.texi]
+        mms install
+        set def [-.etc]
+        mms install
+        set def [-]
+
+distclean: clean
+        set def [.lisp]
+        mms distclean
+        set def [-.texi]
+        mms distclean
+        set def [-.etc]
+        mms distclean
+        set def [-]
+        $(RM) config.* Makefile
+
+clean:
+        set def [.lisp]
+        mms clean
+        set def [-.texi]
+        mms clean
+        set def [-.etc]
+        mms clean
+        set def [-]
+
+dotemacs:
+       @if (grep ";;; Emacs/W3 Configuration" $(DOTEMACS) 2>&1) >/dev/null; 
then \
+               echo Emacs/W3 setup already exists in $(DOTEMACS);      \
+       else                                                            \
+               test -d `dirname $(DOTEMACS)` || mkdir -p `dirname 
$(DOTEMACS)`; \
+               (echo >> $(DOTEMACS)); \
+               (echo ";;; Emacs/W3 Configuration" >> $(DOTEMACS)); \
+               (echo "(setq load-path (cons \"$(lispdir)\" load-path))" >> 
$(DOTEMACS)); \
+               (echo "(require 'w3-autoloads \"w3/auto-autoloads\")" >> 
$(DOTEMACS)); \
+               echo "Added Emacs/W3 setup to $(DOTEMACS)"; \
+       fi
diff --git a/etc/Makefile.in b/etc/Makefile.in
new file mode 100644
index 0000000..7e95cf9
--- /dev/null
+++ b/etc/Makefile.in
@@ -0,0 +1,42 @@
+srcdir  = @srcdir@
+prefix  = @prefix@
+datadir = @datadir@
+top_srcdir = @top_srcdir@
+
+EMACS     = @EMACS@
+INSTALL   = @INSTALL@
+RM        = rm -f
+
+TARGETS = default.css
+
+all:
+
+install:
+       ( if [ ! -d $(datadir) ]; then mkdir -p $(datadir); fi )
+       for x in $(TARGETS); do                                 \
+               if [ -f $$x ]; then                             \
+                       $(INSTALL) $$x $(datadir);              \
+               else                                            \
+                       $(INSTALL) $(srcdir)/$$x $(datadir);    \
+               fi                                              \
+       done
+
+distclean: clean
+       $(RM) Makefile
+
+clean:
+       $(RM) *.orig *.rej *~
+
+version: $(TARGETS) descrip.mms clean 
+       test -d $(DIRNAME)/etc || mkdir -p $(DIRNAME)/etc
+       for x in $(TARGETS) Makefile.in; do $(INSTALL) -m 644 $$x 
$(DIRNAME)/etc; done
+
+# Automatic makefile rebuilding, etc.
+Makefile: $(srcdir)/Makefile.in ../config.status
+       ( cd .. ; CONFIG_FILES=etc/Makefile ./config.status )
+
+$(top_srcdir)/configure: $(top_srcdir)/configure.in $(top_srcdir)/aclocal.m4
+       cd $(top_srcdir) && autoreconf
+
+../config.status: $(top_srcdir)/configure
+       cd .. && ./config.status --recheck
diff --git a/etc/default.css b/etc/default.css
new file mode 100644
index 0000000..d0f46a0
--- /dev/null
+++ b/etc/default.css
@@ -0,0 +1,297 @@
+/******************************************************************************
+**       File: default.css
+**    Purpose: Default Stylesheet for Emacs-W3
+**       Info: Copyright (c) 1995-1996 William M. Perry <address@hidden>
+**             Copyright (c) 1997 Free Software Foundation, Inc.
+**    Created: William M. Perry <address@hidden>, Aug-31-1995
+** Maintainer: William M. Perry <address@hidden>
+**
+**  This contains the top level fallback default styles for Emacs-w3
+**
+*******************************************************************************
+**
+** To specify device-dependent styles, you must mark a section with
+** @media devicetype { ... }
+** If you are not using 'devicetype', then anything within the { ... }
+** is ignored.
+**
+** These sections are currently defined by
+** http://www.w3.org/pub/WWW/Style/Group/WD-PRINT-961220
+** 
+**    print  - output for paged opaque material, and for documents viewed
+**             on screen in print preview mode
+**    screen - a continuous presentation of computer screens
+** projector - paged presentation for projected presentations
+**   braille - for braille tactile feedback devices
+**    speech - aural presentation
+**       all - the default value, applies to all output devices
+**
+** There are a few special Emacs-W3 sections
+**
+**  emacs - only include this chunk if you are using Emacs 19
+** xemacs - only include this chunk if you are using XEmacs
+**  light - only include this chunk if you are using a light background
+**   dark - only include this chunk if you are using a dark background
+**    tty - only include this chunk if you are using a TTY
+** ansi-tty - "  include this chunk if you are using an ANSI-capable TTY 
+*******************************************************************************
+**
+** There are some things this stylesheet cannot really specify, that we 
+** must rely on the browser to explicitly handle correctly:
+**
+** o table formatting
+** o actually creating a hyperlink from an <a> tag and its attributes
+** o specifying which tags open lists
+** o inlined images
+** o frames (perhaps with positioning)
+** o applet/script/embed/object
+** o horizontal rules
+******************************************************************************/
+
+/* Headers */
+
+h1,h2,h3,
+h4,h5,h6  {
+           display: block;
+            font-family : serif;
+            font-weight : bold;
+          }
+
address@hidden xemacs {
+      h1  { font-size : +12pt }
+      h2  { font-size : +6pt  }
+      h3  { font-size : +4pt  }
+      h5  { font-size : -2pt  }
+      h6  { font-size : -4pt  }
+}
+
+/* This causes problems with Emacs 19 */
address@hidden xemacs {
+   pre,xmp,
+  plaintext { font-family: monospace }
+key,code,tt { font-family: monospace }
+}
+
+/*
+** Best we can do under Emacs-19 is use the default font and try to make
+** the headers stand out somehow.
+*/
+
address@hidden emacs {
+h1,h2,h3,
+h4,h5,h6  { text-decoration: underline; }
+       h1 { color: rgb(0,255,255); }   // cyan
+       h2 { color: rgb(70,130,180); }  // steelblue
+       h3 { color: rgb(106,90,205); }  // slateblue
+       h4 { color: rgb(135,206,235); } // skyblue
+       h5 { color: rgb(0,0,128); }     // navy
+       h6 { color: rgb(173,216,230); } // lightblue
+
+strong,em { color: red         }
+      dfn { font-style: italic }
+ s,strike { color: green       }
+
+} // @media emacs
+
+       p  { display: block }
+ pre,xmp  { display: block; white-space: pre; }
+blockquote{ display: block; margin-left: 5em; margin-right: 5em; }
+
+/*
+** How to draw form elements.
+** This is an extension in Emacs-W3 (and perhaps soon E-Scape)
+** Since there are so many different types of input fields, you should be
+** able to control formatting based on that.  Enter pseudo-classes.
+**
+** This functionality will be removed as soon as the W3C comes up with
+** the standard way to do this, perhaps in CSS level 2.
+*/
+input:text,
+input:int,
+input:float,
+input:url,
+input:password,
+input:text    { text-decoration: underline; }
+input:submit  { color: green;  text-decoration: none; }
+input:reset   { color: red;    text-decoration: none; }
+input:button  { color: yellow; text-decoration: none; }
+input:image   { text-decoration: none; }
+
+/*
+** List formatting instructions
+*/
+
+       ul { display: block;     }
+       ol { display: block;     }
+       dl { display: block;     }
+      dir { display: block;     }
+     menu { display: block;     }
+       dt { font-weight: bold; display: line }
+       dd { display: line; margin-left: 5em; }
+       li { display: list-item; margin-left: 5em; }
+       ol { list-style: decimal; }
+       ul { list-style: circle; }
+
+/* These are to make nested list items look better */
+ul ul,ol ul,ol ol,ul ol { display: line; }
+
+/*
+** All logical emphasis tags, the way god intended
+*/
+
+        div { display: line;                }
+  strong,em { font-weight: bold             }
+        dfn { font-style: italic            }
+   s,strike { text-decoration: line-through }
+        sub { text-position: sub            }
+        sup { text-position: sup            }
+     secret { text-transform: rot13         }
+
+/*
+** Physical emphasis - spawn of evil
+*/
+          b { font-weight: bold }
+         i { font-style: italic }
+          u { text-decoration: underline }
+      blink { text-decoration: blink }
+     center { display: line; text-align: center; }
+/*
+** Various and sundry
+*/
+         br { display: line }
+         hr { display: line; text-align: center; }
+
+
+/*
+** Hypertext link coloring
+*/
+
+a:link    { color: #FF0000 }
+a:visited { color: #B22222 }
+a:active  { color: #FF0000 }
+
+/*
+** Table formatting
+*/
+table     { display: block;    }
+   th     { display: block; font-weight: bold; text-align: center; }
+   td     { display: block; text-align: left; }
+caption   { display: block; text-align: center; }
+
+/*
+** Various other character-level formatting issues
+*/
+
+ address { text-align: right; display: line; }
+abstract { font-style: bold & italic ; text-align : indent }
+   quote { font-style: italic ; text-align : indent }
+
+/*
+** Now for monochrome defaults
+*/
address@hidden mono {
+   a:link { color: black; text-decoration: underline }
+a:visited { color: black; text-decoration: underline }
+ a:active { color: white }
+} // @media mono
+/*
+** All the TTY specific formatting
+*/
+
address@hidden tty {
+/*
+** First, handle some stuff for generic TTYs to emulate our old
+** behaviour with w3-delimit-links and a subset of w3-delimit-emphasis
+*/
+
+h1,h2,h3,
+h4,h5,h6 {
+           insert-before: *;
+           insert-after: *
+         }
+
+a:visited{
+           insert-before: "{{";
+           insert-after: "}}"
+         }
+
+a:link   {
+           insert-before: "[[";
+           insert-after: "]]"
+         }
+
+input:text,
+input:int,
+input:float,
+input:url,
+input:file,
+input:password,
+input:text    { insert-before: "[{"; insert-after: "}]"; }
+select { insert-before: "[{"; insert-after: "}]"; }
+
+} // @media tty
+
+
address@hidden ansi-tty {
+/*
+** Now comes the cool TTY stuff.  You will need to be using XEmacs 19.14
+** or later (or Emacs 19.30 under DOS) in order to get any benefit from
+** these whatsoever.  But if you are using one of these, wow, cool, eh?
+**
+** ANSI specifies these colors, and most (all?) TTYs that support color
+** will generally have 2 versions.  One normal and one bright or 'standout'
+** version.
+**
+**  Color     R     G     B
+** --------------------------
+**   white - 1.0 , 1.0 , 1.0
+**    cyan - 0.0 , 1.0 , 1.0
+** magenta - 1.0 , 0.0 , 1.0
+**    blue - 0.0 , 0.0 , 1.0
+**  yellow - 1.0 , 1.0 , 0.0
+**   green - 0.0 , 1.0 , 0.0
+**     red - 1.0 , 0.0 , 0.0
+**   black - 0.0 , 0.0 , 0.0
+*/
+
+h1,h2,h3,
+h4,h5,h6  { color : cyan     }
+a:visited { color : magenta  }
+   a:link { color : red      }
+ a:active { color : yellow   }
+} // @media ansi-tty
+
+/*
+** Secial styles for the Emacspeak subsystem of emacs - an incredibly cool
+** speech synthesizer.  This was contributed by T.V. Raman (address@hidden)
+*/
address@hidden speech {
+h1,h2,h3,
+h4,h5,h6 { voice-family: paul; stress: 2; richness: 9; }
+      h1 { pitch: 1; pitch-range: 9; }
+      h2 { pitch: 2; pitch-range: 8; }
+      h3 { pitch: 3; pitch-range: 7; }
+      h4 { pitch: 4; pitch-range: 6; }
+      h5 { pitch: 5; pitch-range: 5; }
+      h6 { pitch: 6; pitch-range: 4; }
+
+li,dt,dd { pitch: 6; richness: 6; }
+      dt { stress: 8; }
+
+pre,xmp,plaintext,key,code,tt { pitch: 5; 
+                               pitch-range: 0;
+                               stress: 0;
+                               richness: 8;
+                             }
+      em { pitch: 6; pitch-range: 6; stress: 6; richness: 5; }
+  strong { pitch: 6; pitch-range: 6; stress: 9; richness: 9; }
+     dfn { pitch: 7; pitch-range: 6; stress: 6; }
+s,strike { richness: 0; }
+       i { pitch: 6; pitch-range: 6; stress: 6; richness: 5 }
+       b { pitch: 6; pitch-range: 6; stress: 9; richness: 9; }
+       u { richness: 0; }
+   a:link { voice-family: harry; }
+a:visited { voice-family: betty;}
+ a:active { voice-family: betty; pitch-range: 8; pitch: 8 }
+
+} // @media speech
diff --git a/etc/descrip.mms b/etc/descrip.mms
new file mode 100644
index 0000000..980c39d
--- /dev/null
+++ b/etc/descrip.mms
@@ -0,0 +1,25 @@
+# where the w3 lisp files should go
+prefix  = gnu_root
+datadir = $(prefix):[lib]
+confdir = $(prefix):[lib.emacs.w3]
+
+ECHO       = write sys$output
+RM         = delete
+MKDIR      = create/dir
+
+############## no user servicable parts beyond this point ###################
+TARGETS = default.css
+
+all: $(TARGETS)
+
+install:
+       if f$parse("$(confir)") .eqs. "" then $(MKDIR) $(confdir)
+       copy/log *.info* $(confdir)
+       - purge/log $(confdir)
+
+distclean: clean
+       $(RM) Makefile
+
+clean:
+       $(RM) *.dvi *.info* *.html
+
diff --git a/etc/w3/pixmaps/archive.xbm b/etc/w3/pixmaps/archive.xbm
new file mode 100644
index 0000000..e5d42c6
--- /dev/null
+++ b/etc/w3/pixmaps/archive.xbm
@@ -0,0 +1,9 @@
+#define tar_width 20
+#define tar_height 23
+static char tar_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x01, 0x60, 0x00,
+   0x01, 0xa0, 0x00, 0x01, 0x20, 0x01, 0x01, 0x20, 0x02, 0x01, 0xe0, 0x07,
+   0x01, 0xc0, 0x0f, 0x01, 0x00, 0x0c, 0xbd, 0xf3, 0x0c, 0xbd, 0xf3, 0x0d,
+   0xd9, 0xb6, 0x0d, 0xd9, 0xb6, 0x0d, 0xd9, 0xf7, 0x0c, 0xd9, 0xf7, 0x0d,
+   0xd9, 0xb6, 0x0d, 0xd9, 0xb6, 0x0d, 0x01, 0x00, 0x0c, 0xff, 0xff, 0x0f,
+   0xfe, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/audio.xbm b/etc/w3/pixmaps/audio.xbm
new file mode 100644
index 0000000..972400e
--- /dev/null
+++ b/etc/w3/pixmaps/audio.xbm
@@ -0,0 +1,8 @@
+#define audio_width 20
+#define audio_height 23
+static char audio_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x07,0x01,0x00,0x0c,0x01,0x40,0x0c,
+ 0x01,0x91,0x0c,0x81,0x21,0x0d,0x41,0x49,0x0d,0x3d,0x51,0x0d,0x05,0x55,0x0d,
+ 0x05,0x55,0x0d,0x05,0x55,0x0d,0x3d,0x55,0x0d,0x7d,0x51,0x0d,0xc1,0x49,0x0d,
+ 0x81,0x21,0x0d,0x01,0x91,0x0c,0x01,0x40,0x0c,0x01,0x00,0x0c,0xff,0xff,0x0f,
+ 0xfe,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/back-cap-dn.xbm b/etc/w3/pixmaps/back-cap-dn.xbm
new file mode 100644
index 0000000..6ac4dc0
--- /dev/null
+++ b/etc/w3/pixmaps/back-cap-dn.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,
+ 0xff,0xff,0xe7,0xff,0xff,0xff,0xeb,0xff,0xff,0xff,0x0d,0x8c,0xff,0xff,0xfe,
+ 0x75,0xff,0x7f,0xff,0x75,0xff,0xff,0xfe,0x75,0xff,0xff,0x0d,0x8c,0xff,0xff,
+ 0xeb,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x3f,0xfc,0xbf,0xff,0xbf,0xfb,0xbf,0xff,0xbf,0x9b,
+ 0xb3,0xfd,0x3f,0x6c,0xad,0xfe,0xbf,0x1b,0x3d,0xff,0xbf,0x6b,0xad,0xfe,0x3f,
+ 0x9c,0xb2,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
diff --git a/etc/w3/pixmaps/back-cap-dn.xpm b/etc/w3/pixmaps/back-cap-dn.xpm
new file mode 100644
index 0000000..27389da
--- /dev/null
+++ b/etc/w3/pixmaps/back-cap-dn.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *back-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30        8            1",
+/* colors */
+". c #000000",
+"# c #330099",
+"a c #888888",
+"b c #aaaaaa",
+"c c #b2b2b2 s backgroundToolBarColor",
+"d c #cccccc",
+"e c #eeeeee",
+"f c #ffffff",
+/* pixels */
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccc#ccccccccccccccccccc",
+"ccccccccccc##ccccccccccccccccccc",
+"cccccccccc#f#ccccccccccccccccccc",
+"ccccccccc#fe######cb###bcccccccc",
+"cccccccc#fedeeeee#c#aea#abcccccc",
+"ccccccc#feddddddd#b#eed#abcccccc",
+"cccccccc#eddddddd#a#ada#abcccccc",
+"cccccccba#ed######ab###abbcccccc",
+"ccccccccba#e#aaaaaacaaabbbcccccc",
+"cccccccccba##acccccccccccccccccc",
+"ccccccccccba#acccccccccccccccccc",
+"cccccccccccbaacccccccccccccccccc",
+"ccccccccccccbacccccccccccccccccc",
+"cccccccccccccbcccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccc....cccccccccccc.ccccccccc",
+"cccccc.ccc.ccccccccccc.ccccccccc",
+"cccccc.ccc.cc..ccc..cc.cc.cccccc",
+"cccccc....cc.cc.c.cc.c.c.ccccccc",
+"cccccc.ccc.cc...c.cccc..cccccccc",
+"cccccc.ccc.c.cc.c.cc.c.c.ccccccc",
+"cccccc....ccc..c.c..cc.cc.cccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc"
+};
diff --git a/etc/w3/pixmaps/back-cap-no.xbm b/etc/w3/pixmaps/back-cap-no.xbm
new file mode 100644
index 0000000..31f279a
--- /dev/null
+++ b/etc/w3/pixmaps/back-cap-no.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+ 0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x40,0x00,0x00,0x00,
+ 0x00,0x00,0xc0,0x93,0x52,0x01,0x00,0x00,0x00,0x00,0x40,0x94,0x52,0x01,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/back-cap-no.xpm b/etc/w3/pixmaps/back-cap-no.xpm
new file mode 100644
index 0000000..27389da
--- /dev/null
+++ b/etc/w3/pixmaps/back-cap-no.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *back-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30        8            1",
+/* colors */
+". c #000000",
+"# c #330099",
+"a c #888888",
+"b c #aaaaaa",
+"c c #b2b2b2 s backgroundToolBarColor",
+"d c #cccccc",
+"e c #eeeeee",
+"f c #ffffff",
+/* pixels */
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccc#ccccccccccccccccccc",
+"ccccccccccc##ccccccccccccccccccc",
+"cccccccccc#f#ccccccccccccccccccc",
+"ccccccccc#fe######cb###bcccccccc",
+"cccccccc#fedeeeee#c#aea#abcccccc",
+"ccccccc#feddddddd#b#eed#abcccccc",
+"cccccccc#eddddddd#a#ada#abcccccc",
+"cccccccba#ed######ab###abbcccccc",
+"ccccccccba#e#aaaaaacaaabbbcccccc",
+"cccccccccba##acccccccccccccccccc",
+"ccccccccccba#acccccccccccccccccc",
+"cccccccccccbaacccccccccccccccccc",
+"ccccccccccccbacccccccccccccccccc",
+"cccccccccccccbcccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccc....cccccccccccc.ccccccccc",
+"cccccc.ccc.ccccccccccc.ccccccccc",
+"cccccc.ccc.cc..ccc..cc.cc.cccccc",
+"cccccc....cc.cc.c.cc.c.c.ccccccc",
+"cccccc.ccc.cc...c.cccc..cccccccc",
+"cccccc.ccc.c.cc.c.cc.c.c.ccccccc",
+"cccccc....ccc..c.c..cc.cc.cccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc"
+};
diff --git a/etc/w3/pixmaps/back-cap-up.xbm b/etc/w3/pixmaps/back-cap-up.xbm
new file mode 100644
index 0000000..f1f2e10
--- /dev/null
+++ b/etc/w3/pixmaps/back-cap-up.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
+ 0x00,0x00,0x18,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0xf2,0x73,0x00,0x00,0x01,
+ 0x8a,0x00,0x80,0x00,0x8a,0x00,0x00,0x01,0x8a,0x00,0x00,0xf2,0x73,0x00,0x00,
+ 0x14,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x40,0x00,0x40,0x04,0x40,0x00,0x40,0x64,
+ 0x4c,0x02,0xc0,0x93,0x52,0x01,0x40,0xe4,0xc2,0x00,0x40,0x94,0x52,0x01,0xc0,
+ 0x63,0x4d,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/back-cap-up.xpm b/etc/w3/pixmaps/back-cap-up.xpm
new file mode 100644
index 0000000..27389da
--- /dev/null
+++ b/etc/w3/pixmaps/back-cap-up.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *back-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30        8            1",
+/* colors */
+". c #000000",
+"# c #330099",
+"a c #888888",
+"b c #aaaaaa",
+"c c #b2b2b2 s backgroundToolBarColor",
+"d c #cccccc",
+"e c #eeeeee",
+"f c #ffffff",
+/* pixels */
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccc#ccccccccccccccccccc",
+"ccccccccccc##ccccccccccccccccccc",
+"cccccccccc#f#ccccccccccccccccccc",
+"ccccccccc#fe######cb###bcccccccc",
+"cccccccc#fedeeeee#c#aea#abcccccc",
+"ccccccc#feddddddd#b#eed#abcccccc",
+"cccccccc#eddddddd#a#ada#abcccccc",
+"cccccccba#ed######ab###abbcccccc",
+"ccccccccba#e#aaaaaacaaabbbcccccc",
+"cccccccccba##acccccccccccccccccc",
+"ccccccccccba#acccccccccccccccccc",
+"cccccccccccbaacccccccccccccccccc",
+"ccccccccccccbacccccccccccccccccc",
+"cccccccccccccbcccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccc....cccccccccccc.ccccccccc",
+"cccccc.ccc.ccccccccccc.ccccccccc",
+"cccccc.ccc.cc..ccc..cc.cc.cccccc",
+"cccccc....cc.cc.c.cc.c.c.ccccccc",
+"cccccc.ccc.cc...c.cccc..cccccccc",
+"cccccc.ccc.c.cc.c.cc.c.c.ccccccc",
+"cccccc....ccc..c.c..cc.cc.cccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc"
+};
diff --git a/etc/w3/pixmaps/back-dn.xbm b/etc/w3/pixmaps/back-dn.xbm
new file mode 100644
index 0000000..e16556b
--- /dev/null
+++ b/etc/w3/pixmaps/back-dn.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,
+ 0xff,0xff,0xe7,0xff,0xff,0xff,0xeb,0xff,0xff,0xff,0x0d,0x8c,0xff,0xff,0xfe,
+ 0x75,0xff,0x7f,0xff,0x75,0xff,0xff,0xfe,0x75,0xff,0xff,0x0d,0x8c,0xff,0xff,
+ 0xeb,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
diff --git a/etc/w3/pixmaps/back-dn.xpm b/etc/w3/pixmaps/back-dn.xpm
new file mode 100644
index 0000000..e014381
--- /dev/null
+++ b/etc/w3/pixmaps/back-dn.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *back-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30        8            1",
+/* colors */
+". c #000000",
+"# c #330099",
+"a c #888888",
+"b c #aaaaaa",
+"c c #b2b2b2 s backgroundToolBarColor",
+"d c #cccccc",
+"e c #eeeeee",
+"f c #ffffff",
+/* pixels */
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccc#ccccccccccccccccccc",
+"ccccccccccc##ccccccccccccccccccc",
+"cccccccccc#f#ccccccccccccccccccc",
+"ccccccccc#fe######cb###bcccccccc",
+"cccccccc#fedeeeee#c#aea#abcccccc",
+"ccccccc#feddddddd#b#eed#abcccccc",
+"cccccccc#eddddddd#a#ada#abcccccc",
+"cccccccba#ed######ab###abbcccccc",
+"ccccccccba#e#aaaaaacaaabbbcccccc",
+"cccccccccba##acccccccccccccccccc",
+"ccccccccccba#acccccccccccccccccc",
+"cccccccccccbaacccccccccccccccccc",
+"ccccccccccccbacccccccccccccccccc",
+"cccccccccccccbcccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc"
+};
diff --git a/etc/w3/pixmaps/back-no.xbm b/etc/w3/pixmaps/back-no.xbm
new file mode 100644
index 0000000..8009583
--- /dev/null
+++ b/etc/w3/pixmaps/back-no.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+ 0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/back-no.xpm b/etc/w3/pixmaps/back-no.xpm
new file mode 100644
index 0000000..e014381
--- /dev/null
+++ b/etc/w3/pixmaps/back-no.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *back-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30        8            1",
+/* colors */
+". c #000000",
+"# c #330099",
+"a c #888888",
+"b c #aaaaaa",
+"c c #b2b2b2 s backgroundToolBarColor",
+"d c #cccccc",
+"e c #eeeeee",
+"f c #ffffff",
+/* pixels */
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccc#ccccccccccccccccccc",
+"ccccccccccc##ccccccccccccccccccc",
+"cccccccccc#f#ccccccccccccccccccc",
+"ccccccccc#fe######cb###bcccccccc",
+"cccccccc#fedeeeee#c#aea#abcccccc",
+"ccccccc#feddddddd#b#eed#abcccccc",
+"cccccccc#eddddddd#a#ada#abcccccc",
+"cccccccba#ed######ab###abbcccccc",
+"ccccccccba#e#aaaaaacaaabbbcccccc",
+"cccccccccba##acccccccccccccccccc",
+"ccccccccccba#acccccccccccccccccc",
+"cccccccccccbaacccccccccccccccccc",
+"ccccccccccccbacccccccccccccccccc",
+"cccccccccccccbcccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc"
+};
diff --git a/etc/w3/pixmaps/back-up.xbm b/etc/w3/pixmaps/back-up.xbm
new file mode 100644
index 0000000..2364036
--- /dev/null
+++ b/etc/w3/pixmaps/back-up.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
+ 0x00,0x00,0x18,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0xf2,0x73,0x00,0x00,0x01,
+ 0x8a,0x00,0x80,0x00,0x8a,0x00,0x00,0x01,0x8a,0x00,0x00,0xf2,0x73,0x00,0x00,
+ 0x14,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/back-up.xpm b/etc/w3/pixmaps/back-up.xpm
new file mode 100644
index 0000000..e014381
--- /dev/null
+++ b/etc/w3/pixmaps/back-up.xpm
@@ -0,0 +1,45 @@
+/* XPM */
+static char *back-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30        8            1",
+/* colors */
+". c #000000",
+"# c #330099",
+"a c #888888",
+"b c #aaaaaa",
+"c c #b2b2b2 s backgroundToolBarColor",
+"d c #cccccc",
+"e c #eeeeee",
+"f c #ffffff",
+/* pixels */
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccc#ccccccccccccccccccc",
+"ccccccccccc##ccccccccccccccccccc",
+"cccccccccc#f#ccccccccccccccccccc",
+"ccccccccc#fe######cb###bcccccccc",
+"cccccccc#fedeeeee#c#aea#abcccccc",
+"ccccccc#feddddddd#b#eed#abcccccc",
+"cccccccc#eddddddd#a#ada#abcccccc",
+"cccccccba#ed######ab###abbcccccc",
+"ccccccccba#e#aaaaaacaaabbbcccccc",
+"cccccccccba##acccccccccccccccccc",
+"ccccccccccba#acccccccccccccccccc",
+"cccccccccccbaacccccccccccccccccc",
+"ccccccccccccbacccccccccccccccccc",
+"cccccccccccccbcccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc",
+"cccccccccccccccccccccccccccccccc"
+};
diff --git a/etc/w3/pixmaps/binary.document.xbm 
b/etc/w3/pixmaps/binary.document.xbm
new file mode 100644
index 0000000..7025bbe
--- /dev/null
+++ b/etc/w3/pixmaps/binary.document.xbm
@@ -0,0 +1,8 @@
+#define binary_width 20
+#define binary_height 23
+static char binary_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x3f,0x00,0x01,0x60,0x00,0x01,0xa0,0x00,
+ 0x71,0x26,0x01,0xd9,0x26,0x02,0xd9,0xe6,0x07,0xd9,0xc6,0x0f,0xd9,0x06,0x0c,
+ 0x71,0x06,0x0c,0x01,0x00,0x0c,0x99,0x03,0x0c,0xd9,0x06,0x0c,0xd9,0x06,0x0c,
+ 0xd9,0x06,0x0c,0xd9,0x06,0x0c,0x99,0x03,0x0c,0x01,0x00,0x0c,0xff,0xff,0x0f,
+ 0xfe,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/binhex.document.xbm 
b/etc/w3/pixmaps/binhex.document.xbm
new file mode 100644
index 0000000..6f34868
--- /dev/null
+++ b/etc/w3/pixmaps/binhex.document.xbm
@@ -0,0 +1,8 @@
+#define binhex_width 20
+#define binhex_height 23
+static char binhex_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x3f,0x00,0x01,0x60,0x00,0x01,0xa0,0x00,
+ 0x01,0x20,0x01,0x01,0x20,0x02,0x01,0xe0,0x07,0x01,0xc0,0x0f,0x01,0x00,0x0c,
+ 0x6d,0xb7,0x0d,0x6d,0xb7,0x0d,0x6d,0xb3,0x0d,0x7d,0xf7,0x0d,0x7d,0xe7,0x0c,
+ 0x6d,0xb3,0x0d,0x6d,0xb7,0x0d,0x6d,0xb7,0x0d,0x01,0x00,0x0c,0xff,0xff,0x0f,
+ 0xfe,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/caution.xbm b/etc/w3/pixmaps/caution.xbm
new file mode 100644
index 0000000..87fcdbe
--- /dev/null
+++ b/etc/w3/pixmaps/caution.xbm
@@ -0,0 +1,12 @@
+#define caution_width 32
+#define caution_height 32
+static char caution_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x10,0x01,
+ 0x00,0x00,0x08,0x07,0x00,0x00,0x08,0x0e,0x00,0x00,0x04,0x0e,0x00,0x00,0x04,
+ 0x1c,0x00,0x00,0x02,0x1c,0x00,0x00,0xe2,0x38,0x00,0x00,0xf1,0x39,0x00,0x00,
+ 0xf1,0x71,0x00,0x80,0xf0,0x71,0x00,0x80,0xf0,0xe1,0x00,0x40,0xf0,0xe1,0x00,
+ 0x40,0xf0,0xc1,0x01,0x20,0xf0,0xc1,0x01,0x20,0xf0,0x81,0x03,0x10,0xe0,0x80,
+ 0x03,0x10,0xe0,0x00,0x07,0x08,0xe0,0x00,0x07,0x08,0xe0,0x00,0x0e,0x04,0x00,
+ 0x00,0x0e,0x04,0xe0,0x00,0x1c,0x02,0xf0,0x01,0x1c,0x02,0xf0,0x01,0x38,0x01,
+ 0xe0,0x00,0x38,0x01,0x00,0x00,0x70,0x01,0x00,0x00,0x70,0xff,0xff,0xff,0x7f,
+ 0xf8,0xff,0xff,0x3f,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/clock.xbm b/etc/w3/pixmaps/clock.xbm
new file mode 100644
index 0000000..0b6612f
--- /dev/null
+++ b/etc/w3/pixmaps/clock.xbm
@@ -0,0 +1,14 @@
+#define clock.bm_width 32
+#define clock.bm_height 32
+static char clock.bm_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00,
+   0x00, 0x0c, 0x30, 0x00, 0x00, 0x83, 0xc1, 0x00, 0x80, 0x80, 0x01, 0x01,
+   0x40, 0x80, 0x01, 0x02, 0x20, 0x80, 0x01, 0x04, 0x10, 0x80, 0x01, 0x08,
+   0x10, 0x80, 0x01, 0x08, 0x08, 0x80, 0x01, 0x10, 0x08, 0x80, 0x01, 0x10,
+   0x04, 0x80, 0x01, 0x20, 0x04, 0x80, 0x01, 0x20, 0x04, 0xc0, 0x03, 0x20,
+   0x84, 0xff, 0x03, 0x20, 0x84, 0xff, 0x03, 0x20, 0x04, 0xc0, 0x03, 0x20,
+   0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x10,
+   0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08,
+   0x20, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x01,
+   0x00, 0x03, 0xc0, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0xf0, 0x0f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/compressed.document.xbm 
b/etc/w3/pixmaps/compressed.document.xbm
new file mode 100644
index 0000000..1406e6c
--- /dev/null
+++ b/etc/w3/pixmaps/compressed.document.xbm
@@ -0,0 +1,8 @@
+#define compressed_width 20
+#define compressed_height 23
+static char compressed_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x07,0x00,0x20,0x0c,0x00,0x20,0x14,0x00,
+ 0x20,0x24,0x00,0x20,0x7c,0x00,0x20,0x78,0x00,0x20,0x60,0x00,0x21,0x60,0x08,
+ 0x23,0x60,0x0c,0x27,0x60,0x0e,0x2f,0x60,0x0f,0x27,0x60,0x0e,0x23,0x60,0x0c,
+ 0x21,0x60,0x08,0x20,0x60,0x00,0x20,0x60,0x00,0x20,0x60,0x00,0xe0,0x7f,0x00,
+ 0xc0,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/disk.drive.xbm b/etc/w3/pixmaps/disk.drive.xbm
new file mode 100644
index 0000000..1f433a2
--- /dev/null
+++ b/etc/w3/pixmaps/disk.drive.xbm
@@ -0,0 +1,12 @@
+#define disk_width 32
+#define disk_height 32
+static char disk_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x3f,0x04,0x00,0x00,0x20,0x04,
+ 0x00,0x00,0x20,0xe4,0x00,0x00,0x20,0x04,0x00,0x00,0x20,0x04,0x00,0x00,0x20,
+ 0x04,0xf0,0x0f,0x20,0xe4,0xff,0xff,0x27,0x04,0xf0,0x0f,0x20,0x04,0x00,0x00,
+ 0x20,0x04,0x00,0x00,0x20,0x04,0x00,0x00,0x20,0x04,0x00,0x00,0x20,0xfc,0xff,
+ 0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/diskette.xbm b/etc/w3/pixmaps/diskette.xbm
new file mode 100644
index 0000000..a241d0a
--- /dev/null
+++ b/etc/w3/pixmaps/diskette.xbm
@@ -0,0 +1,14 @@
+#define diskette.bm_width 32
+#define diskette.bm_height 32
+static char diskette.bm_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x01, 0x10, 0x02, 0x20, 0x02,
+   0x10, 0x02, 0x27, 0x04, 0x10, 0x02, 0x27, 0x04, 0x10, 0x02, 0x27, 0x04,
+   0x10, 0x02, 0x27, 0x04, 0x10, 0x02, 0x27, 0x04, 0x10, 0x02, 0x20, 0x04,
+   0x10, 0xfe, 0x3f, 0x04, 0x10, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x04,
+   0x10, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x04,
+   0x10, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x04,
+   0x10, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x04,
+   0x10, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x04, 0xf0, 0xff, 0xff, 0x07,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/display.xbm b/etc/w3/pixmaps/display.xbm
new file mode 100644
index 0000000..b768a63
--- /dev/null
+++ b/etc/w3/pixmaps/display.xbm
@@ -0,0 +1,14 @@
+#define display.bm_width 32
+#define display.bm_height 32
+static char display.bm_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xf0, 0xff, 0xff, 0x0f, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08,
+   0x10, 0xf8, 0x1f, 0x08, 0x10, 0x06, 0x60, 0x08, 0x10, 0x01, 0x80, 0x08,
+   0x10, 0x01, 0x80, 0x08, 0x90, 0x00, 0x00, 0x09, 0x90, 0x00, 0x00, 0x09,
+   0x90, 0x00, 0x00, 0x09, 0x90, 0x00, 0x00, 0x09, 0x90, 0x00, 0x00, 0x09,
+   0x90, 0x00, 0x00, 0x09, 0x10, 0x01, 0x80, 0x08, 0x10, 0x01, 0x80, 0x08,
+   0x10, 0x06, 0x60, 0x08, 0x10, 0xf8, 0x1f, 0x08, 0x10, 0x00, 0x00, 0x08,
+   0x10, 0x00, 0x00, 0x08, 0xf0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/fax.xbm b/etc/w3/pixmaps/fax.xbm
new file mode 100644
index 0000000..75c5208
--- /dev/null
+++ b/etc/w3/pixmaps/fax.xbm
@@ -0,0 +1,14 @@
+#define facsimile.bm_width 32
+#define facsimile.bm_height 32
+static char facsimile.bm_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0xff, 0x03, 0x00, 0x80, 0x00, 0x06, 0x00, 0x80, 0x00, 0x0a, 0x00,
+   0x80, 0x00, 0x12, 0x00, 0x80, 0x00, 0x22, 0x00, 0x80, 0x00, 0x42, 0x00,
+   0x80, 0x00, 0x82, 0x00, 0x80, 0x00, 0xfe, 0x01, 0x80, 0x00, 0x00, 0x01,
+   0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01,
+   0xfc, 0x00, 0x00, 0x3f, 0x84, 0x00, 0x00, 0x21, 0x84, 0x00, 0x00, 0x21,
+   0x84, 0x00, 0x00, 0x21, 0xe4, 0xff, 0xff, 0x27, 0x04, 0x00, 0x00, 0x20,
+   0x04, 0xf8, 0x1f, 0x20, 0x04, 0x06, 0x60, 0x20, 0x04, 0x01, 0x80, 0x20,
+   0x84, 0xf8, 0x1f, 0x21, 0x84, 0x10, 0x08, 0x21, 0x84, 0x1f, 0xf8, 0x21,
+   0x04, 0x00, 0x00, 0x20, 0xfc, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/file_server.xbm b/etc/w3/pixmaps/file_server.xbm
new file mode 100644
index 0000000..a5368ba
--- /dev/null
+++ b/etc/w3/pixmaps/file_server.xbm
@@ -0,0 +1,12 @@
+#define file_server_width 32
+#define file_server_height 32
+static char file_server_bits[] = {
+ 0x00,0x80,0x00,0x00,0x00,0x40,0xf9,0x07,0x00,0x20,0x0a,0x0c,0x00,0x10,0x0c,
+ 0x14,0x00,0x08,0x08,0x3c,0xe0,0x05,0x10,0x20,0x18,0xfe,0x21,0x20,0x08,0x00,
+ 0x41,0x20,0x08,0x00,0x81,0x20,0x08,0x00,0x41,0x20,0x08,0x00,0x21,0x20,0x08,
+ 0x00,0x11,0x20,0x08,0x00,0x09,0x20,0x08,0x00,0x0d,0x20,0x08,0x00,0x0b,0x20,
+ 0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x40,0xfc,0xff,0xff,0x3f,0x80,0x54,0xa0,
+ 0x00,0x00,0x55,0xa0,0x00,0x00,0xd5,0xa0,0x00,0x00,0xa6,0xbb,0x00,0x00,0x44,
+ 0xec,0x00,0x00,0x98,0x90,0x00,0x00,0x30,0xa0,0x00,0x00,0xc0,0xc0,0x00,0x00,
+ 0x00,0x83,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0xfe,0x01,
+ 0x00,0x00,0xfe,0x01,0x00,0x00,0xfe,0x01};
diff --git a/etc/w3/pixmaps/filing.cabinet.xbm 
b/etc/w3/pixmaps/filing.cabinet.xbm
new file mode 100644
index 0000000..9b2a8e3
--- /dev/null
+++ b/etc/w3/pixmaps/filing.cabinet.xbm
@@ -0,0 +1,14 @@
+#define filing_cabinet.bm_width 32
+#define filing_cabinet.bm_height 32
+static char filing_cabinet.bm_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x01,
+   0x80, 0x00, 0x00, 0x01, 0x80, 0xfe, 0x7f, 0x01, 0x80, 0x02, 0x40, 0x01,
+   0x80, 0x02, 0x40, 0x01, 0x80, 0x02, 0x40, 0x01, 0x80, 0x22, 0x44, 0x01,
+   0x80, 0x22, 0x44, 0x01, 0x80, 0xe2, 0x47, 0x01, 0x80, 0x02, 0x40, 0x01,
+   0x80, 0x02, 0x40, 0x01, 0x80, 0x02, 0x40, 0x01, 0x80, 0xfe, 0x7f, 0x01,
+   0x80, 0x00, 0x00, 0x01, 0x80, 0xfe, 0x7f, 0x01, 0x80, 0x02, 0x40, 0x01,
+   0x80, 0x02, 0x40, 0x01, 0x80, 0x02, 0x40, 0x01, 0x80, 0x22, 0x44, 0x01,
+   0x80, 0x22, 0x44, 0x01, 0x80, 0xe2, 0x47, 0x01, 0x80, 0x02, 0x40, 0x01,
+   0x80, 0x02, 0x40, 0x01, 0x80, 0x02, 0x40, 0x01, 0x80, 0x02, 0x40, 0x01,
+   0x80, 0xfe, 0x7f, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x01,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/film.xbm b/etc/w3/pixmaps/film.xbm
new file mode 100644
index 0000000..6f0afba
--- /dev/null
+++ b/etc/w3/pixmaps/film.xbm
@@ -0,0 +1,9 @@
+#define movie_width 20
+#define movie_height 23
+static char movie_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x07, 0xf9, 0xff, 0x0c,
+   0x19, 0xe0, 0x0c, 0x1f, 0xc0, 0x0f, 0x19, 0xe0, 0x0c, 0x19, 0xc0, 0x0c,
+   0x1f, 0xe0, 0x0f, 0x59, 0xd5, 0x0c, 0xf9, 0xff, 0x0c, 0xff, 0xff, 0x0f,
+   0x19, 0xe0, 0x0c, 0x19, 0xc0, 0x0c, 0x1f, 0xe0, 0x0f, 0x19, 0xc0, 0x0c,
+   0x19, 0xe0, 0x0c, 0x5f, 0xd5, 0x0f, 0xf9, 0xff, 0x0c, 0xff, 0xff, 0x0f,
+   0xfe, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/find-cap-dn.xbm b/etc/w3/pixmaps/find-cap-dn.xbm
new file mode 100644
index 0000000..094a684
--- /dev/null
+++ b/etc/w3/pixmaps/find-cap-dn.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcf,0xf3,0xff,0xff,0xcf,0xf3,
+ 0xff,0xff,0xc7,0xf1,0xff,0xff,0x7f,0xfe,0xff,0xff,0x01,0xc0,0xff,0xff,0x5e,
+ 0xbc,0xff,0xff,0xde,0xbc,0xff,0xff,0x1e,0xbc,0xff,0xff,0xc6,0xb0,0xff,0xff,
+ 0x6e,0xba,0xff,0xff,0xee,0xbb,0xff,0xff,0xee,0xbb,0xff,0xff,0xe0,0x83,0xff,
+ 0xff,0xe6,0x9b,0xff,0xff,0xe0,0x83,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xe8,0xbf,0xff,0x7f,0xff,
+ 0xbf,0xff,0x7f,0xaf,0x8e,0xff,0x7f,0x28,0xb5,0xff,0x7f,0xaf,0xb5,0xff,0x7f,
+ 0xaf,0xb5,0xff,0x7f,0xaf,0x8d,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
diff --git a/etc/w3/pixmaps/find-cap-dn.xpm b/etc/w3/pixmaps/find-cap-dn.xpm
new file mode 100644
index 0000000..a0ce290
--- /dev/null
+++ b/etc/w3/pixmaps/find-cap-dn.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *srch-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2  s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkicakkkicakkkkkkkkkkkk",
+"kkkkkkkkkkkod.gjkod.gjkkkkkkkkkk",
+"kkkkkkkkkkkdaagjkdaagjkkkkkkkkkk",
+"kkkkkkkkkkkkjomdammgggjkkkkkkkkk",
+"kkkkkkkkkdaaaadadaaaadgjkkkkkkkk",
+"kkkkkkkkdmoomdmfadmpojdgjkkkkkkk",
+"kkkkkkkkapommdpladmpmmagjkkkkkkk",
+"kkkkkkkkapopmdaa.dmpmmagjkkkkkkk",
+"kkkkkkkkamgaaapldaaagjagjkkkkkkk",
+"kkkkkkkkapjgagjaamagmjagjkkkkkkk",
+"kkkkkkkkapmjagjgggaomjagjkkkkkkk",
+"kkkkkkkkapmjagjjjjapmjagjkkkkkkk",
+"kkkkkkkkaaaaagjkkkaaaaagjkkkkkkk",
+"kkkkkkkkapidagjkkkapidagjkkkkkkk",
+"kkkkkkkkaaaaagjkkkaaaaagjkkkkkkk",
+"kkkkkkkkkgggggjkkkkgggggjkkkkkkk",
+"kkkkkkkkkjjjjjjkkkkjjjjjjkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkk....k.kkkkkkkkk.kkkkkkkkk",
+"kkkkkkk.kkkkkkkkkkkkkk.kkkkkkkkk",
+"kkkkkkk.kkkk.k.k.kkk...kkkkkkkkk",
+"kkkkkkk....k.k..k.k.kk.kkkkkkkkk",
+"kkkkkkk.kkkk.k.kk.k.kk.kkkkkkkkk",
+"kkkkkkk.kkkk.k.kk.k.kk.kkkkkkkkk",
+"kkkkkkk.kkkk.k.kk.kk...kkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/find-cap-no.xbm b/etc/w3/pixmaps/find-cap-no.xbm
new file mode 100644
index 0000000..0bf0d78
--- /dev/null
+++ b/etc/w3/pixmaps/find-cap-no.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x0c,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,
+ 0x43,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x43,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x91,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x44,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x19,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x17,0x40,0x00,0x00,0x00,
+ 0x00,0x00,0x80,0x50,0x71,0x00,0x00,0x00,0x00,0x00,0x80,0x50,0x4a,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0x50,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/find-cap-no.xpm b/etc/w3/pixmaps/find-cap-no.xpm
new file mode 100644
index 0000000..a0ce290
--- /dev/null
+++ b/etc/w3/pixmaps/find-cap-no.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *srch-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2  s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkicakkkicakkkkkkkkkkkk",
+"kkkkkkkkkkkod.gjkod.gjkkkkkkkkkk",
+"kkkkkkkkkkkdaagjkdaagjkkkkkkkkkk",
+"kkkkkkkkkkkkjomdammgggjkkkkkkkkk",
+"kkkkkkkkkdaaaadadaaaadgjkkkkkkkk",
+"kkkkkkkkdmoomdmfadmpojdgjkkkkkkk",
+"kkkkkkkkapommdpladmpmmagjkkkkkkk",
+"kkkkkkkkapopmdaa.dmpmmagjkkkkkkk",
+"kkkkkkkkamgaaapldaaagjagjkkkkkkk",
+"kkkkkkkkapjgagjaamagmjagjkkkkkkk",
+"kkkkkkkkapmjagjgggaomjagjkkkkkkk",
+"kkkkkkkkapmjagjjjjapmjagjkkkkkkk",
+"kkkkkkkkaaaaagjkkkaaaaagjkkkkkkk",
+"kkkkkkkkapidagjkkkapidagjkkkkkkk",
+"kkkkkkkkaaaaagjkkkaaaaagjkkkkkkk",
+"kkkkkkkkkgggggjkkkkgggggjkkkkkkk",
+"kkkkkkkkkjjjjjjkkkkjjjjjjkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkk....k.kkkkkkkkk.kkkkkkkkk",
+"kkkkkkk.kkkkkkkkkkkkkk.kkkkkkkkk",
+"kkkkkkk.kkkk.k.k.kkk...kkkkkkkkk",
+"kkkkkkk....k.k..k.k.kk.kkkkkkkkk",
+"kkkkkkk.kkkk.k.kk.k.kk.kkkkkkkkk",
+"kkkkkkk.kkkk.k.kk.k.kk.kkkkkkkkk",
+"kkkkkkk.kkkk.k.kk.kk...kkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/find-cap-up.xbm b/etc/w3/pixmaps/find-cap-up.xbm
new file mode 100644
index 0000000..c39e0e0
--- /dev/null
+++ b/etc/w3/pixmaps/find-cap-up.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x0c,0x00,0x00,0x30,0x0c,
+ 0x00,0x00,0x38,0x0e,0x00,0x00,0x80,0x01,0x00,0x00,0xfe,0x3f,0x00,0x00,0xa1,
+ 0x43,0x00,0x00,0x21,0x43,0x00,0x00,0xe1,0x43,0x00,0x00,0x39,0x4f,0x00,0x00,
+ 0x91,0x45,0x00,0x00,0x11,0x44,0x00,0x00,0x11,0x44,0x00,0x00,0x1f,0x7c,0x00,
+ 0x00,0x19,0x64,0x00,0x00,0x1f,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x17,0x40,0x00,0x80,0x00,
+ 0x40,0x00,0x80,0x50,0x71,0x00,0x80,0xd7,0x4a,0x00,0x80,0x50,0x4a,0x00,0x80,
+ 0x50,0x4a,0x00,0x80,0x50,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/find-cap-up.xpm b/etc/w3/pixmaps/find-cap-up.xpm
new file mode 100644
index 0000000..a0ce290
--- /dev/null
+++ b/etc/w3/pixmaps/find-cap-up.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *srch-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2  s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkicakkkicakkkkkkkkkkkk",
+"kkkkkkkkkkkod.gjkod.gjkkkkkkkkkk",
+"kkkkkkkkkkkdaagjkdaagjkkkkkkkkkk",
+"kkkkkkkkkkkkjomdammgggjkkkkkkkkk",
+"kkkkkkkkkdaaaadadaaaadgjkkkkkkkk",
+"kkkkkkkkdmoomdmfadmpojdgjkkkkkkk",
+"kkkkkkkkapommdpladmpmmagjkkkkkkk",
+"kkkkkkkkapopmdaa.dmpmmagjkkkkkkk",
+"kkkkkkkkamgaaapldaaagjagjkkkkkkk",
+"kkkkkkkkapjgagjaamagmjagjkkkkkkk",
+"kkkkkkkkapmjagjgggaomjagjkkkkkkk",
+"kkkkkkkkapmjagjjjjapmjagjkkkkkkk",
+"kkkkkkkkaaaaagjkkkaaaaagjkkkkkkk",
+"kkkkkkkkapidagjkkkapidagjkkkkkkk",
+"kkkkkkkkaaaaagjkkkaaaaagjkkkkkkk",
+"kkkkkkkkkgggggjkkkkgggggjkkkkkkk",
+"kkkkkkkkkjjjjjjkkkkjjjjjjkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkk....k.kkkkkkkkk.kkkkkkkkk",
+"kkkkkkk.kkkkkkkkkkkkkk.kkkkkkkkk",
+"kkkkkkk.kkkk.k.k.kkk...kkkkkkkkk",
+"kkkkkkk....k.k..k.k.kk.kkkkkkkkk",
+"kkkkkkk.kkkk.k.kk.k.kk.kkkkkkkkk",
+"kkkkkkk.kkkk.k.kk.k.kk.kkkkkkkkk",
+"kkkkkkk.kkkk.k.kk.kk...kkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/find-dn.xbm b/etc/w3/pixmaps/find-dn.xbm
new file mode 100644
index 0000000..e5ebc30
--- /dev/null
+++ b/etc/w3/pixmaps/find-dn.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcf,0xf3,0xff,0xff,0xcf,0xf3,
+ 0xff,0xff,0xc7,0xf1,0xff,0xff,0x7f,0xfe,0xff,0xff,0x01,0xc0,0xff,0xff,0x5e,
+ 0xbc,0xff,0xff,0xde,0xbc,0xff,0xff,0x1e,0xbc,0xff,0xff,0xc6,0xb0,0xff,0xff,
+ 0x6e,0xba,0xff,0xff,0xee,0xbb,0xff,0xff,0xee,0xbb,0xff,0xff,0xe0,0x83,0xff,
+ 0xff,0xe6,0x9b,0xff,0xff,0xe0,0x83,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
diff --git a/etc/w3/pixmaps/find-dn.xpm b/etc/w3/pixmaps/find-dn.xpm
new file mode 100644
index 0000000..f17b70e
--- /dev/null
+++ b/etc/w3/pixmaps/find-dn.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *srch-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2  s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkicakkkicakkkkkkkkkkkk",
+"kkkkkkkkkkkod.gjkod.gjkkkkkkkkkk",
+"kkkkkkkkkkkdaagjkdaagjkkkkkkkkkk",
+"kkkkkkkkkkkkjomdammgggjkkkkkkkkk",
+"kkkkkkkkkdaaaadadaaaadgjkkkkkkkk",
+"kkkkkkkkdmoomdmfadmpojdgjkkkkkkk",
+"kkkkkkkkapommdpladmpmmagjkkkkkkk",
+"kkkkkkkkapopmdaa.dmpmmagjkkkkkkk",
+"kkkkkkkkamgaaapldaaagjagjkkkkkkk",
+"kkkkkkkkapjgagjaamagmjagjkkkkkkk",
+"kkkkkkkkapmjagjgggaomjagjkkkkkkk",
+"kkkkkkkkapmjagjjjjapmjagjkkkkkkk",
+"kkkkkkkkaaaaagjkkkaaaaagjkkkkkkk",
+"kkkkkkkkapidagjkkkapidagjkkkkkkk",
+"kkkkkkkkaaaaagjkkkaaaaagjkkkkkkk",
+"kkkkkkkkkgggggjkkkkgggggjkkkkkkk",
+"kkkkkkkkkjjjjjjkkkkjjjjjjkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/find-no.xbm b/etc/w3/pixmaps/find-no.xbm
new file mode 100644
index 0000000..28ea3ba
--- /dev/null
+++ b/etc/w3/pixmaps/find-no.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x0c,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xa1,
+ 0x43,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x43,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x91,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x44,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x19,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/find-no.xpm b/etc/w3/pixmaps/find-no.xpm
new file mode 100644
index 0000000..f17b70e
--- /dev/null
+++ b/etc/w3/pixmaps/find-no.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *srch-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2  s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkicakkkicakkkkkkkkkkkk",
+"kkkkkkkkkkkod.gjkod.gjkkkkkkkkkk",
+"kkkkkkkkkkkdaagjkdaagjkkkkkkkkkk",
+"kkkkkkkkkkkkjomdammgggjkkkkkkkkk",
+"kkkkkkkkkdaaaadadaaaadgjkkkkkkkk",
+"kkkkkkkkdmoomdmfadmpojdgjkkkkkkk",
+"kkkkkkkkapommdpladmpmmagjkkkkkkk",
+"kkkkkkkkapopmdaa.dmpmmagjkkkkkkk",
+"kkkkkkkkamgaaapldaaagjagjkkkkkkk",
+"kkkkkkkkapjgagjaamagmjagjkkkkkkk",
+"kkkkkkkkapmjagjgggaomjagjkkkkkkk",
+"kkkkkkkkapmjagjjjjapmjagjkkkkkkk",
+"kkkkkkkkaaaaagjkkkaaaaagjkkkkkkk",
+"kkkkkkkkapidagjkkkapidagjkkkkkkk",
+"kkkkkkkkaaaaagjkkkaaaaagjkkkkkkk",
+"kkkkkkkkkgggggjkkkkgggggjkkkkkkk",
+"kkkkkkkkkjjjjjjkkkkjjjjjjkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/find-up.xbm b/etc/w3/pixmaps/find-up.xbm
new file mode 100644
index 0000000..c7492c2
--- /dev/null
+++ b/etc/w3/pixmaps/find-up.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x0c,0x00,0x00,0x30,0x0c,
+ 0x00,0x00,0x38,0x0e,0x00,0x00,0x80,0x01,0x00,0x00,0xfe,0x3f,0x00,0x00,0xa1,
+ 0x43,0x00,0x00,0x21,0x43,0x00,0x00,0xe1,0x43,0x00,0x00,0x39,0x4f,0x00,0x00,
+ 0x91,0x45,0x00,0x00,0x11,0x44,0x00,0x00,0x11,0x44,0x00,0x00,0x1f,0x7c,0x00,
+ 0x00,0x19,0x64,0x00,0x00,0x1f,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/find-up.xpm b/etc/w3/pixmaps/find-up.xpm
new file mode 100644
index 0000000..f17b70e
--- /dev/null
+++ b/etc/w3/pixmaps/find-up.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *srch-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2  s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkicakkkicakkkkkkkkkkkk",
+"kkkkkkkkkkkod.gjkod.gjkkkkkkkkkk",
+"kkkkkkkkkkkdaagjkdaagjkkkkkkkkkk",
+"kkkkkkkkkkkkjomdammgggjkkkkkkkkk",
+"kkkkkkkkkdaaaadadaaaadgjkkkkkkkk",
+"kkkkkkkkdmoomdmfadmpojdgjkkkkkkk",
+"kkkkkkkkapommdpladmpmmagjkkkkkkk",
+"kkkkkkkkapopmdaa.dmpmmagjkkkkkkk",
+"kkkkkkkkamgaaapldaaagjagjkkkkkkk",
+"kkkkkkkkapjgagjaamagmjagjkkkkkkk",
+"kkkkkkkkapmjagjgggaomjagjkkkkkkk",
+"kkkkkkkkapmjagjjjjapmjagjkkkkkkk",
+"kkkkkkkkaaaaagjkkkaaaaagjkkkkkkk",
+"kkkkkkkkapidagjkkkapidagjkkkkkkk",
+"kkkkkkkkaaaaagjkkkaaaaagjkkkkkkk",
+"kkkkkkkkkgggggjkkkkgggggjkkkkkkk",
+"kkkkkkkkkjjjjjjkkkkjjjjjjkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/fixed.disk.xbm b/etc/w3/pixmaps/fixed.disk.xbm
new file mode 100644
index 0000000..e099c24
--- /dev/null
+++ b/etc/w3/pixmaps/fixed.disk.xbm
@@ -0,0 +1,14 @@
+#define fixed_storage_device.bm_width 32
+#define fixed_storage_device.bm_height 32
+static char fixed_storage_device.bm_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x3f,
+   0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0xe4, 0xfc, 0xff, 0x27,
+   0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, 0xfc, 0xff, 0x27,
+   0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, 0xfc, 0xff, 0x27,
+   0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, 0xfc, 0xff, 0x27,
+   0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0xfc, 0xff, 0xff, 0x3f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/folder.xbm b/etc/w3/pixmaps/folder.xbm
new file mode 100644
index 0000000..b3ec62c
--- /dev/null
+++ b/etc/w3/pixmaps/folder.xbm
@@ -0,0 +1,8 @@
+#define folder_width 20
+#define folder_height 23
+static char folder_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x01,0x00,0x04,0x02,0x00,0x02,0x04,0x00,
+ 0x01,0xf8,0x01,0x01,0x00,0x02,0x01,0x00,0x04,0x01,0x00,0x0e,0x01,0x00,0x0d,
+ 0x01,0x00,0x0e,0x01,0x00,0x0d,0x01,0x00,0x0e,0x01,0x00,0x0d,0x01,0x00,0x0e,
+ 0x01,0x00,0x0d,0x01,0x00,0x0e,0x55,0x55,0x0d,0xaa,0xaa,0x0e,0xfc,0xff,0x07,
+ 0xf8,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/form.xbm b/etc/w3/pixmaps/form.xbm
new file mode 100644
index 0000000..bc9caeb
--- /dev/null
+++ b/etc/w3/pixmaps/form.xbm
@@ -0,0 +1,12 @@
+#define form_width 32
+#define form_height 32
+static char form_bits[] = {
+ 0xff,0xff,0x3f,0xe0,0x01,0x00,0x20,0xf0,0xfd,0x01,0x20,0x78,0x05,0x01,0x20,
+ 0xbc,0x05,0x01,0x20,0xde,0x05,0x01,0x20,0xef,0x05,0x01,0xa0,0xf7,0x05,0x79,
+ 0xe0,0x7b,0xfd,0x3d,0xe0,0xbd,0x01,0x1e,0xf0,0xde,0x01,0x0e,0x78,0xef,0xfd,
+ 0x07,0xbc,0x77,0x1d,0x03,0xde,0x3b,0x9d,0x03,0xec,0x1d,0xfd,0x01,0xf2,0x0e,
+ 0xf5,0x01,0x75,0x07,0x75,0x01,0xaa,0x03,0xfd,0x01,0xd5,0x01,0x21,0x80,0xaa,
+ 0x00,0x01,0x80,0x55,0x00,0xfd,0xc1,0x2b,0x00,0x05,0xc1,0x27,0x00,0x05,0xc1,
+ 0x21,0x00,0x05,0x01,0x20,0x00,0x05,0x01,0x20,0x00,0x05,0x01,0x20,0x00,0xfd,
+ 0x01,0x20,0x00,0x01,0x00,0x20,0x00,0x01,0x00,0x20,0x00,0xff,0xff,0x3f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/forw-cap-dn.xbm b/etc/w3/pixmaps/forw-cap-dn.xbm
new file mode 100644
index 0000000..9fe77bf
--- /dev/null
+++ b/etc/w3/pixmaps/forw-cap-dn.xbm
@@ -0,0 +1,13 @@
+#define noname_width 34
+#define noname_height 30
+static char noname_bits[] = {
+ 0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03,
+ 0xff,0xff,0xef,0xff,0x03,0xff,0xff,0xcf,0xff,0x03,0xff,0xff,0xaf,0xff,0x03,
+ 0xff,0x63,0x60,0xff,0x03,0xff,0x5d,0xff,0xfe,0x03,0xff,0x5d,0xff,0xfd,0x03,
+ 0xff,0x5d,0xff,0xfe,0x03,0xff,0x63,0x60,0xff,0x03,0xff,0xff,0xaf,0xff,0x03,
+ 0xff,0xff,0xcf,0xff,0x03,0xff,0xff,0xef,0xff,0x03,0xff,0xff,0xff,0xff,0x03,
+ 0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03,
+ 0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03,0xe1,0xff,0xff,0x7f,0x03,
+ 0xfd,0xff,0xff,0x7f,0x03,0x7d,0x96,0x9a,0x15,0x03,0xa1,0xa5,0x6a,0x69,0x03,
+ 0xbd,0xb5,0x1a,0x6d,0x03,0xbd,0x75,0x6d,0x6d,0x03,0x7d,0x76,0x9d,0x1c,0x03,
+ 0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03};
diff --git a/etc/w3/pixmaps/forw-cap-dn.xpm b/etc/w3/pixmaps/forw-cap-dn.xpm
new file mode 100644
index 0000000..c729e27
--- /dev/null
+++ b/etc/w3/pixmaps/forw-cap-dn.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *forw-up[] = {
+/* width height num_colors chars_per_pixel */
+"    34    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkakkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkaakkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkaoakkkkkkkkkkk",
+"kkkkkkkkkjaaajkaaaaaaooakkkkkkkkkk",
+"kkkkkkkkkagogakaooooomooakkkkkkkkk",
+"kkkkkkkkkaoomagaommmmmmooakkkkkkkk",
+"kkkkkkkkkagmgagaommmmmmoagjkkkkkkk",
+"kkkkkkkkkjaaagjaaaaaamoagjkkkkkkkk",
+"kkkkkkkkkkjggjjkggggaoagjkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkaagjkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkagjkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkjkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"k....kkkkkkkkkkkkkkkkkkkkkkkkkk.kk",
+"k.kkkkkkkkkkkkkkkkkkkkkkkkkkkkk.kk",
+"k.kkkkk..kk.k..k.k.kk..kk.k.k...kk",
+"k....k.kk.k..k.k.k.k.kk.k..k.kk.kk",
+"k.kkkk.kk.k.kk.k.k.kk...k.kk.kk.kk",
+"k.kkkk.kk.k.kkk.k.kk.kk.k.kk.kk.kk",
+"k.kkkkk..kk.kkk.k.kkk..k..kkk...kk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/forw-cap-no.xbm b/etc/w3/pixmaps/forw-cap-no.xbm
new file mode 100644
index 0000000..767ea2b
--- /dev/null
+++ b/etc/w3/pixmaps/forw-cap-no.xbm
@@ -0,0 +1,13 @@
+#define noname_width 34
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xa2,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x5e,0x5a,0x95,0x96,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x42,0x8a,0x92,0x92,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/forw-cap-no.xpm b/etc/w3/pixmaps/forw-cap-no.xpm
new file mode 100644
index 0000000..c729e27
--- /dev/null
+++ b/etc/w3/pixmaps/forw-cap-no.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *forw-up[] = {
+/* width height num_colors chars_per_pixel */
+"    34    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkakkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkaakkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkaoakkkkkkkkkkk",
+"kkkkkkkkkjaaajkaaaaaaooakkkkkkkkkk",
+"kkkkkkkkkagogakaooooomooakkkkkkkkk",
+"kkkkkkkkkaoomagaommmmmmooakkkkkkkk",
+"kkkkkkkkkagmgagaommmmmmoagjkkkkkkk",
+"kkkkkkkkkjaaagjaaaaaamoagjkkkkkkkk",
+"kkkkkkkkkkjggjjkggggaoagjkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkaagjkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkagjkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkjkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"k....kkkkkkkkkkkkkkkkkkkkkkkkkk.kk",
+"k.kkkkkkkkkkkkkkkkkkkkkkkkkkkkk.kk",
+"k.kkkkk..kk.k..k.k.kk..kk.k.k...kk",
+"k....k.kk.k..k.k.k.k.kk.k..k.kk.kk",
+"k.kkkk.kk.k.kk.k.k.kk...k.kk.kk.kk",
+"k.kkkk.kk.k.kkk.k.kk.kk.k.kk.kk.kk",
+"k.kkkkk..kk.kkk.k.kkk..k..kkk...kk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/forw-cap-up.xbm b/etc/w3/pixmaps/forw-cap-up.xbm
new file mode 100644
index 0000000..60a6ca8
--- /dev/null
+++ b/etc/w3/pixmaps/forw-cap-up.xbm
@@ -0,0 +1,13 @@
+#define noname_width 34
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x50,0x00,0x00,
+ 0x00,0x9c,0x9f,0x00,0x00,0x00,0xa2,0x00,0x01,0x00,0x00,0xa2,0x00,0x02,0x00,
+ 0x00,0xa2,0x00,0x01,0x00,0x00,0x9c,0x9f,0x00,0x00,0x00,0x00,0x50,0x00,0x00,
+ 0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x80,0x00,
+ 0x02,0x00,0x00,0x80,0x00,0x82,0x69,0x65,0xea,0x00,0x5e,0x5a,0x95,0x96,0x00,
+ 0x42,0x4a,0xe5,0x92,0x00,0x42,0x8a,0x92,0x92,0x00,0x82,0x89,0x62,0xe3,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/forw-cap-up.xpm b/etc/w3/pixmaps/forw-cap-up.xpm
new file mode 100644
index 0000000..c729e27
--- /dev/null
+++ b/etc/w3/pixmaps/forw-cap-up.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *forw-up[] = {
+/* width height num_colors chars_per_pixel */
+"    34    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkakkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkaakkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkaoakkkkkkkkkkk",
+"kkkkkkkkkjaaajkaaaaaaooakkkkkkkkkk",
+"kkkkkkkkkagogakaooooomooakkkkkkkkk",
+"kkkkkkkkkaoomagaommmmmmooakkkkkkkk",
+"kkkkkkkkkagmgagaommmmmmoagjkkkkkkk",
+"kkkkkkkkkjaaagjaaaaaamoagjkkkkkkkk",
+"kkkkkkkkkkjggjjkggggaoagjkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkaagjkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkagjkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkjkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"k....kkkkkkkkkkkkkkkkkkkkkkkkkk.kk",
+"k.kkkkkkkkkkkkkkkkkkkkkkkkkkkkk.kk",
+"k.kkkkk..kk.k..k.k.kk..kk.k.k...kk",
+"k....k.kk.k..k.k.k.k.kk.k..k.kk.kk",
+"k.kkkk.kk.k.kk.k.k.kk...k.kk.kk.kk",
+"k.kkkk.kk.k.kkk.k.kk.kk.k.kk.kk.kk",
+"k.kkkkk..kk.kkk.k.kkk..k..kkk...kk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/forw-dn.xbm b/etc/w3/pixmaps/forw-dn.xbm
new file mode 100644
index 0000000..2efe24b
--- /dev/null
+++ b/etc/w3/pixmaps/forw-dn.xbm
@@ -0,0 +1,13 @@
+#define noname_width 34
+#define noname_height 30
+static char noname_bits[] = {
+ 0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03,
+ 0xff,0xff,0xef,0xff,0x03,0xff,0xff,0xcf,0xff,0x03,0xff,0xff,0xaf,0xff,0x03,
+ 0xff,0x63,0x60,0xff,0x03,0xff,0x5d,0xff,0xfe,0x03,0xff,0x5d,0xff,0xfd,0x03,
+ 0xff,0x5d,0xff,0xfe,0x03,0xff,0x63,0x60,0xff,0x03,0xff,0xff,0xaf,0xff,0x03,
+ 0xff,0xff,0xcf,0xff,0x03,0xff,0xff,0xef,0xff,0x03,0xff,0xff,0xff,0xff,0x03,
+ 0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03,
+ 0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03,
+ 0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03,
+ 0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03,
+ 0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0x03};
diff --git a/etc/w3/pixmaps/forw-dn.xpm b/etc/w3/pixmaps/forw-dn.xpm
new file mode 100644
index 0000000..fa7b414
--- /dev/null
+++ b/etc/w3/pixmaps/forw-dn.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *forw-up[] = {
+/* width height num_colors chars_per_pixel */
+"    34    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkakkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkaakkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkaoakkkkkkkkkkk",
+"kkkkkkkkkjaaajkaaaaaaooakkkkkkkkkk",
+"kkkkkkkkkagogakaooooomooakkkkkkkkk",
+"kkkkkkkkkaoomagaommmmmmooakkkkkkkk",
+"kkkkkkkkkagmgagaommmmmmoagjkkkkkkk",
+"kkkkkkkkkjaaagjaaaaaamoagjkkkkkkkk",
+"kkkkkkkkkkjggjjkggggaoagjkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkaagjkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkagjkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkjkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/forw-no.xbm b/etc/w3/pixmaps/forw-no.xbm
new file mode 100644
index 0000000..77a6b0f
--- /dev/null
+++ b/etc/w3/pixmaps/forw-no.xbm
@@ -0,0 +1,13 @@
+#define noname_width 34
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xa2,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/forw-no.xpm b/etc/w3/pixmaps/forw-no.xpm
new file mode 100644
index 0000000..fa7b414
--- /dev/null
+++ b/etc/w3/pixmaps/forw-no.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *forw-up[] = {
+/* width height num_colors chars_per_pixel */
+"    34    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkakkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkaakkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkaoakkkkkkkkkkk",
+"kkkkkkkkkjaaajkaaaaaaooakkkkkkkkkk",
+"kkkkkkkkkagogakaooooomooakkkkkkkkk",
+"kkkkkkkkkaoomagaommmmmmooakkkkkkkk",
+"kkkkkkkkkagmgagaommmmmmoagjkkkkkkk",
+"kkkkkkkkkjaaagjaaaaaamoagjkkkkkkkk",
+"kkkkkkkkkkjggjjkggggaoagjkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkaagjkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkagjkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkjkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/forw-up.xbm b/etc/w3/pixmaps/forw-up.xbm
new file mode 100644
index 0000000..a18d94b
--- /dev/null
+++ b/etc/w3/pixmaps/forw-up.xbm
@@ -0,0 +1,13 @@
+#define noname_width 34
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x50,0x00,0x00,
+ 0x00,0x9c,0x9f,0x00,0x00,0x00,0xa2,0x00,0x01,0x00,0x00,0xa2,0x00,0x02,0x00,
+ 0x00,0xa2,0x00,0x01,0x00,0x00,0x9c,0x9f,0x00,0x00,0x00,0x00,0x50,0x00,0x00,
+ 0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/forw-up.xpm b/etc/w3/pixmaps/forw-up.xpm
new file mode 100644
index 0000000..fa7b414
--- /dev/null
+++ b/etc/w3/pixmaps/forw-up.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *forw-up[] = {
+/* width height num_colors chars_per_pixel */
+"    34    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkakkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkaakkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkaoakkkkkkkkkkk",
+"kkkkkkkkkjaaajkaaaaaaooakkkkkkkkkk",
+"kkkkkkkkkagogakaooooomooakkkkkkkkk",
+"kkkkkkkkkaoomagaommmmmmooakkkkkkkk",
+"kkkkkkkkkagmgagaommmmmmoagjkkkkkkk",
+"kkkkkkkkkjaaagjaaaaaamoagjkkkkkkkk",
+"kkkkkkkkkkjggjjkggggaoagjkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkaagjkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkagjkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkjkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/ftp.xbm b/etc/w3/pixmaps/ftp.xbm
new file mode 100644
index 0000000..dc7926e
--- /dev/null
+++ b/etc/w3/pixmaps/ftp.xbm
@@ -0,0 +1,9 @@
+#define ftp_width 20
+#define ftp_height 23
+static char ftp_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x07, 0x02, 0x00, 0x0c,
+   0x7a, 0xef, 0x0d, 0x7a, 0xef, 0x0f, 0x1a, 0x66, 0x0f, 0x7a, 0x66, 0x0f,
+   0x7a, 0xe6, 0x0f, 0x1a, 0xe6, 0x0d, 0x1a, 0x66, 0x0c, 0x1a, 0x66, 0x0c,
+   0x02, 0x00, 0x0c, 0xfe, 0xff, 0x0f, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0x00,
+   0x04, 0x00, 0x02, 0xfe, 0xff, 0x07, 0xff, 0xff, 0x0f, 0xfe, 0xff, 0x07,
+   0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/glossary.xbm b/etc/w3/pixmaps/glossary.xbm
new file mode 100644
index 0000000..b168827
--- /dev/null
+++ b/etc/w3/pixmaps/glossary.xbm
@@ -0,0 +1,12 @@
+#define glossary_width 32
+#define glossary_height 32
+static char glossary_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x00,0x40,0x00,0x80,
+ 0x03,0x40,0x00,0x80,0x02,0xf0,0x01,0x80,0x02,0x40,0x00,0x80,0x07,0x40,0x00,
+ 0x80,0x08,0x40,0x00,0x80,0x08,0xf0,0x01,0x80,0x08,0x40,0x00,0x80,0x08,0x40,
+ 0x00,0x80,0x04,0x40,0x00,0x80,0x07,0xf0,0x01,0x80,0x04,0x40,0x00,0x80,0x08,
+ 0x40,0x00,0x80,0x08,0x40,0x00,0x80,0x08,0xf0,0x01,0x80,0x08,0x40,0x00,0x80,
+ 0x04,0x40,0x00,0x80,0x07,0x40,0x00,0x80,0x04,0xf0,0x01,0x80,0x08,0x40,0x00,
+ 0x80,0x08,0x40,0x00,0x80,0x08,0x40,0x00,0x80,0x08,0xf0,0x01,0x80,0x07,0x40,
+ 0x00,0x80,0x02,0xc0,0xff,0xff,0x02,0x00,0x01,0x00,0x02,0x00,0xff,0xff,0x03,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/help-cap-dn.xbm b/etc/w3/pixmaps/help-cap-dn.xbm
new file mode 100644
index 0000000..91da37d
--- /dev/null
+++ b/etc/w3/pixmaps/help-cap-dn.xbm
@@ -0,0 +1,11 @@
+#define noname_width 28
+#define noname_height 28
+static char noname_bits[] = {
+ 0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,
+ 0x0f,0xff,0x00,0xfc,0x0f,0x7f,0xaa,0xfa,0x0f,0x3f,0x55,0xf5,0x0f,0x9f,0x02,
+ 0xea,0x0f,0x5f,0x01,0xd4,0x0f,0x9f,0x00,0xe8,0x0f,0x5f,0x51,0xd4,0x0f,0x9f,
+ 0x20,0xa8,0x0f,0x5f,0x51,0x54,0x0f,0x9f,0x2a,0xa8,0x0e,0x5f,0x15,0x14,0x0e,
+ 0x9f,0x0a,0xea,0x0f,0x3f,0x05,0xd5,0x0f,0x7f,0x8a,0xea,0x0f,0xff,0x04,0xf5,
+ 0x0f,0xff,0xa9,0xea,0x0f,0xff,0x55,0xf5,0x0f,0xff,0x89,0xfe,0x0f,0xff,0x05,
+ 0xfd,0x0f,0xff,0x89,0xfe,0x0f,0xff,0x54,0xfd,0x0f,0xff,0xaa,0xfa,0x0f,0xff,
+ 0xff,0xff,0x0f,0xff,0xff,0xff,0x0f};
diff --git a/etc/w3/pixmaps/help-cap-dn.xpm b/etc/w3/pixmaps/help-cap-dn.xpm
new file mode 100644
index 0000000..ac5ff25
--- /dev/null
+++ b/etc/w3/pixmaps/help-cap-dn.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *help-up[] = {
+/* width height num_colors chars_per_pixel */
+"    28    28        2            1",
+/* colors */
+". c #b2b2b2 s backgroundToolBarColor",
+"# c #000000",
+/* pixels */
+"............................",
+"............................",
+"............................",
+"............................",
+"........##########..........",
+".......##.#.#.#.#.#.........",
+"......##.#.#.#.#.#.#........",
+".....##.#.#######.#.#.......",
+".....#.#.#########.#.#......",
+".....##.###########.#.......",
+".....#.#.###.#.###.#.#......",
+".....##.#####.#####.#.#.....",
+".....#.#.###.#.###.#.#.#....",
+".....##.#.#.#.#####.#.#.#...",
+".....#.#.#.#.#####.#.####...",
+".....##.#.#.#####.#.#.......",
+"......##.#.#####.#.#.#......",
+".......##.#.###.#.#.#.......",
+"........##.#####.#.#........",
+".........##.#.#.#.#.#.......",
+".........#.#.#.#.#.#........",
+".........##.###.#...........",
+".........#.#####.#..........",
+".........##.###.#...........",
+"........##.#.#.#.#..........",
+"........#.#.#.#.#.#.........",
+"............................",
+"............................"
+};
diff --git a/etc/w3/pixmaps/help-cap-no.xbm b/etc/w3/pixmaps/help-cap-no.xbm
new file mode 100644
index 0000000..fea53de
--- /dev/null
+++ b/etc/w3/pixmaps/help-cap-no.xbm
@@ -0,0 +1,11 @@
+#define noname_width 28
+#define noname_height 28
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x80,0x55,0x05,0x00,0x00,0x00,0x00,0x00,0x60,0xfd,
+ 0x15,0x00,0x00,0x00,0x00,0x00,0x60,0xff,0x17,0x00,0x00,0x00,0x00,0x00,0x60,
+ 0xdf,0x57,0x00,0x00,0x00,0x00,0x00,0x60,0xd5,0x57,0x01,0x00,0x00,0x00,0x00,
+ 0x60,0xf5,0x15,0x00,0x00,0x00,0x00,0x00,0x80,0x75,0x15,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x56,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x05,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/help-cap-no.xpm b/etc/w3/pixmaps/help-cap-no.xpm
new file mode 100644
index 0000000..ac5ff25
--- /dev/null
+++ b/etc/w3/pixmaps/help-cap-no.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *help-up[] = {
+/* width height num_colors chars_per_pixel */
+"    28    28        2            1",
+/* colors */
+". c #b2b2b2 s backgroundToolBarColor",
+"# c #000000",
+/* pixels */
+"............................",
+"............................",
+"............................",
+"............................",
+"........##########..........",
+".......##.#.#.#.#.#.........",
+"......##.#.#.#.#.#.#........",
+".....##.#.#######.#.#.......",
+".....#.#.#########.#.#......",
+".....##.###########.#.......",
+".....#.#.###.#.###.#.#......",
+".....##.#####.#####.#.#.....",
+".....#.#.###.#.###.#.#.#....",
+".....##.#.#.#.#####.#.#.#...",
+".....#.#.#.#.#####.#.####...",
+".....##.#.#.#####.#.#.......",
+"......##.#.#####.#.#.#......",
+".......##.#.###.#.#.#.......",
+"........##.#####.#.#........",
+".........##.#.#.#.#.#.......",
+".........#.#.#.#.#.#........",
+".........##.###.#...........",
+".........#.#####.#..........",
+".........##.###.#...........",
+"........##.#.#.#.#..........",
+"........#.#.#.#.#.#.........",
+"............................",
+"............................"
+};
diff --git a/etc/w3/pixmaps/help-cap-up.xbm b/etc/w3/pixmaps/help-cap-up.xbm
new file mode 100644
index 0000000..3c5e0d7
--- /dev/null
+++ b/etc/w3/pixmaps/help-cap-up.xbm
@@ -0,0 +1,11 @@
+#define noname_width 28
+#define noname_height 28
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xff,0x03,0x00,0x80,0x55,0x05,0x00,0xc0,0xaa,0x0a,0x00,0x60,0xfd,
+ 0x15,0x00,0xa0,0xfe,0x2b,0x00,0x60,0xff,0x17,0x00,0xa0,0xae,0x2b,0x00,0x60,
+ 0xdf,0x57,0x00,0xa0,0xae,0xab,0x00,0x60,0xd5,0x57,0x01,0xa0,0xea,0xeb,0x01,
+ 0x60,0xf5,0x15,0x00,0xc0,0xfa,0x2a,0x00,0x80,0x75,0x15,0x00,0x00,0xfb,0x0a,
+ 0x00,0x00,0x56,0x15,0x00,0x00,0xaa,0x0a,0x00,0x00,0x76,0x01,0x00,0x00,0xfa,
+ 0x02,0x00,0x00,0x76,0x01,0x00,0x00,0xab,0x02,0x00,0x00,0x55,0x05,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/help-cap-up.xpm b/etc/w3/pixmaps/help-cap-up.xpm
new file mode 100644
index 0000000..ac5ff25
--- /dev/null
+++ b/etc/w3/pixmaps/help-cap-up.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *help-up[] = {
+/* width height num_colors chars_per_pixel */
+"    28    28        2            1",
+/* colors */
+". c #b2b2b2 s backgroundToolBarColor",
+"# c #000000",
+/* pixels */
+"............................",
+"............................",
+"............................",
+"............................",
+"........##########..........",
+".......##.#.#.#.#.#.........",
+"......##.#.#.#.#.#.#........",
+".....##.#.#######.#.#.......",
+".....#.#.#########.#.#......",
+".....##.###########.#.......",
+".....#.#.###.#.###.#.#......",
+".....##.#####.#####.#.#.....",
+".....#.#.###.#.###.#.#.#....",
+".....##.#.#.#.#####.#.#.#...",
+".....#.#.#.#.#####.#.####...",
+".....##.#.#.#####.#.#.......",
+"......##.#.#####.#.#.#......",
+".......##.#.###.#.#.#.......",
+"........##.#####.#.#........",
+".........##.#.#.#.#.#.......",
+".........#.#.#.#.#.#........",
+".........##.###.#...........",
+".........#.#####.#..........",
+".........##.###.#...........",
+"........##.#.#.#.#..........",
+"........#.#.#.#.#.#.........",
+"............................",
+"............................"
+};
diff --git a/etc/w3/pixmaps/help-dn.xbm b/etc/w3/pixmaps/help-dn.xbm
new file mode 100644
index 0000000..91da37d
--- /dev/null
+++ b/etc/w3/pixmaps/help-dn.xbm
@@ -0,0 +1,11 @@
+#define noname_width 28
+#define noname_height 28
+static char noname_bits[] = {
+ 0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,
+ 0x0f,0xff,0x00,0xfc,0x0f,0x7f,0xaa,0xfa,0x0f,0x3f,0x55,0xf5,0x0f,0x9f,0x02,
+ 0xea,0x0f,0x5f,0x01,0xd4,0x0f,0x9f,0x00,0xe8,0x0f,0x5f,0x51,0xd4,0x0f,0x9f,
+ 0x20,0xa8,0x0f,0x5f,0x51,0x54,0x0f,0x9f,0x2a,0xa8,0x0e,0x5f,0x15,0x14,0x0e,
+ 0x9f,0x0a,0xea,0x0f,0x3f,0x05,0xd5,0x0f,0x7f,0x8a,0xea,0x0f,0xff,0x04,0xf5,
+ 0x0f,0xff,0xa9,0xea,0x0f,0xff,0x55,0xf5,0x0f,0xff,0x89,0xfe,0x0f,0xff,0x05,
+ 0xfd,0x0f,0xff,0x89,0xfe,0x0f,0xff,0x54,0xfd,0x0f,0xff,0xaa,0xfa,0x0f,0xff,
+ 0xff,0xff,0x0f,0xff,0xff,0xff,0x0f};
diff --git a/etc/w3/pixmaps/help-dn.xpm b/etc/w3/pixmaps/help-dn.xpm
new file mode 100644
index 0000000..ac5ff25
--- /dev/null
+++ b/etc/w3/pixmaps/help-dn.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *help-up[] = {
+/* width height num_colors chars_per_pixel */
+"    28    28        2            1",
+/* colors */
+". c #b2b2b2 s backgroundToolBarColor",
+"# c #000000",
+/* pixels */
+"............................",
+"............................",
+"............................",
+"............................",
+"........##########..........",
+".......##.#.#.#.#.#.........",
+"......##.#.#.#.#.#.#........",
+".....##.#.#######.#.#.......",
+".....#.#.#########.#.#......",
+".....##.###########.#.......",
+".....#.#.###.#.###.#.#......",
+".....##.#####.#####.#.#.....",
+".....#.#.###.#.###.#.#.#....",
+".....##.#.#.#.#####.#.#.#...",
+".....#.#.#.#.#####.#.####...",
+".....##.#.#.#####.#.#.......",
+"......##.#.#####.#.#.#......",
+".......##.#.###.#.#.#.......",
+"........##.#####.#.#........",
+".........##.#.#.#.#.#.......",
+".........#.#.#.#.#.#........",
+".........##.###.#...........",
+".........#.#####.#..........",
+".........##.###.#...........",
+"........##.#.#.#.#..........",
+"........#.#.#.#.#.#.........",
+"............................",
+"............................"
+};
diff --git a/etc/w3/pixmaps/help-icon.xbm b/etc/w3/pixmaps/help-icon.xbm
new file mode 100644
index 0000000..4710e78
--- /dev/null
+++ b/etc/w3/pixmaps/help-icon.xbm
@@ -0,0 +1,14 @@
+#define help-icon_width 32
+#define help-icon_height 32
+static char help-icon_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfe, 0x07, 0x00, 0x00, 0xab, 0x0a, 0x00, 0x80, 0x55, 0x15, 0x00,
+   0xc0, 0xfa, 0x2b, 0x00, 0x40, 0xfd, 0x57, 0x00, 0xc0, 0xfe, 0x2f, 0x00,
+   0x40, 0x5d, 0x57, 0x00, 0xc0, 0xbe, 0xaf, 0x00, 0x40, 0x5d, 0x57, 0x01,
+   0xc0, 0xaa, 0xaf, 0x02, 0x40, 0xd5, 0xd7, 0x03, 0xc0, 0xea, 0x2b, 0x00,
+   0x80, 0xf5, 0x55, 0x00, 0x00, 0xeb, 0x2a, 0x00, 0x00, 0xf6, 0x15, 0x00,
+   0x00, 0xac, 0x2a, 0x00, 0x00, 0x54, 0x15, 0x00, 0x00, 0xec, 0x02, 0x00,
+   0x00, 0xf4, 0x05, 0x00, 0x00, 0xec, 0x02, 0x00, 0x00, 0x56, 0x05, 0x00,
+   0x00, 0xaa, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/help-no.xbm b/etc/w3/pixmaps/help-no.xbm
new file mode 100644
index 0000000..fea53de
--- /dev/null
+++ b/etc/w3/pixmaps/help-no.xbm
@@ -0,0 +1,11 @@
+#define noname_width 28
+#define noname_height 28
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x80,0x55,0x05,0x00,0x00,0x00,0x00,0x00,0x60,0xfd,
+ 0x15,0x00,0x00,0x00,0x00,0x00,0x60,0xff,0x17,0x00,0x00,0x00,0x00,0x00,0x60,
+ 0xdf,0x57,0x00,0x00,0x00,0x00,0x00,0x60,0xd5,0x57,0x01,0x00,0x00,0x00,0x00,
+ 0x60,0xf5,0x15,0x00,0x00,0x00,0x00,0x00,0x80,0x75,0x15,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x56,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x76,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x05,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/help-no.xpm b/etc/w3/pixmaps/help-no.xpm
new file mode 100644
index 0000000..ac5ff25
--- /dev/null
+++ b/etc/w3/pixmaps/help-no.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *help-up[] = {
+/* width height num_colors chars_per_pixel */
+"    28    28        2            1",
+/* colors */
+". c #b2b2b2 s backgroundToolBarColor",
+"# c #000000",
+/* pixels */
+"............................",
+"............................",
+"............................",
+"............................",
+"........##########..........",
+".......##.#.#.#.#.#.........",
+"......##.#.#.#.#.#.#........",
+".....##.#.#######.#.#.......",
+".....#.#.#########.#.#......",
+".....##.###########.#.......",
+".....#.#.###.#.###.#.#......",
+".....##.#####.#####.#.#.....",
+".....#.#.###.#.###.#.#.#....",
+".....##.#.#.#.#####.#.#.#...",
+".....#.#.#.#.#####.#.####...",
+".....##.#.#.#####.#.#.......",
+"......##.#.#####.#.#.#......",
+".......##.#.###.#.#.#.......",
+"........##.#####.#.#........",
+".........##.#.#.#.#.#.......",
+".........#.#.#.#.#.#........",
+".........##.###.#...........",
+".........#.#####.#..........",
+".........##.###.#...........",
+"........##.#.#.#.#..........",
+"........#.#.#.#.#.#.........",
+"............................",
+"............................"
+};
diff --git a/etc/w3/pixmaps/help-up.xbm b/etc/w3/pixmaps/help-up.xbm
new file mode 100644
index 0000000..3c5e0d7
--- /dev/null
+++ b/etc/w3/pixmaps/help-up.xbm
@@ -0,0 +1,11 @@
+#define noname_width 28
+#define noname_height 28
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xff,0x03,0x00,0x80,0x55,0x05,0x00,0xc0,0xaa,0x0a,0x00,0x60,0xfd,
+ 0x15,0x00,0xa0,0xfe,0x2b,0x00,0x60,0xff,0x17,0x00,0xa0,0xae,0x2b,0x00,0x60,
+ 0xdf,0x57,0x00,0xa0,0xae,0xab,0x00,0x60,0xd5,0x57,0x01,0xa0,0xea,0xeb,0x01,
+ 0x60,0xf5,0x15,0x00,0xc0,0xfa,0x2a,0x00,0x80,0x75,0x15,0x00,0x00,0xfb,0x0a,
+ 0x00,0x00,0x56,0x15,0x00,0x00,0xaa,0x0a,0x00,0x00,0x76,0x01,0x00,0x00,0xfa,
+ 0x02,0x00,0x00,0x76,0x01,0x00,0x00,0xab,0x02,0x00,0x00,0x55,0x05,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/help-up.xpm b/etc/w3/pixmaps/help-up.xpm
new file mode 100644
index 0000000..ac5ff25
--- /dev/null
+++ b/etc/w3/pixmaps/help-up.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static char *help-up[] = {
+/* width height num_colors chars_per_pixel */
+"    28    28        2            1",
+/* colors */
+". c #b2b2b2 s backgroundToolBarColor",
+"# c #000000",
+/* pixels */
+"............................",
+"............................",
+"............................",
+"............................",
+"........##########..........",
+".......##.#.#.#.#.#.........",
+"......##.#.#.#.#.#.#........",
+".....##.#.#######.#.#.......",
+".....#.#.#########.#.#......",
+".....##.###########.#.......",
+".....#.#.###.#.###.#.#......",
+".....##.#####.#####.#.#.....",
+".....#.#.###.#.###.#.#.#....",
+".....##.#.#.#.#####.#.#.#...",
+".....#.#.#.#.#####.#.####...",
+".....##.#.#.#####.#.#.......",
+"......##.#.#####.#.#.#......",
+".......##.#.###.#.#.#.......",
+"........##.#####.#.#........",
+".........##.#.#.#.#.#.......",
+".........#.#.#.#.#.#........",
+".........##.###.#...........",
+".........#.#####.#..........",
+".........##.###.#...........",
+"........##.#.#.#.#..........",
+"........#.#.#.#.#.#.........",
+"............................",
+"............................"
+};
diff --git a/etc/w3/pixmaps/help.xbm b/etc/w3/pixmaps/help.xbm
new file mode 100644
index 0000000..a3242af
--- /dev/null
+++ b/etc/w3/pixmaps/help.xbm
@@ -0,0 +1,12 @@
+#define help_width 32
+#define help_height 32
+static char help_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0xbe,0x79,0x00,0x00,0xc3,0xc7,0x03,0xc0,0xf1,0x1f,
+ 0x0e,0x60,0x8c,0x35,0x18,0x30,0x83,0xc3,0x30,0x98,0xa0,0x81,0x61,0x4c,0xd4,
+ 0xa3,0x43,0x26,0xfa,0x07,0x47,0x22,0xbd,0x9d,0x86,0x92,0x0e,0x30,0x8d,0x12,
+ 0xc7,0x23,0xca,0x8a,0x62,0x47,0x5c,0x4e,0x63,0x46,0x3a,0x8c,0x01,0x86,0x3c,
+ 0xfe,0x03,0xc7,0x7f,0xfe,0x83,0xc3,0x7f,0x50,0x81,0x81,0x3d,0xac,0x02,0x40,
+ 0x3a,0x0e,0x84,0x21,0x7c,0x12,0x84,0x21,0x4e,0x12,0x08,0x18,0x4d,0xa2,0xb0,
+ 0x85,0x66,0x66,0xc1,0x43,0x27,0xcc,0x8a,0xa3,0x23,0x98,0xd5,0xd5,0x31,0x30,
+ 0xab,0xeb,0x18,0x60,0xdc,0x37,0x0e,0xc0,0xf9,0x8f,0x03,0x00,0xe3,0xef,0x00,
+ 0x00,0xbe,0x39,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/home-cap-dn.xbm b/etc/w3/pixmaps/home-cap-dn.xbm
new file mode 100644
index 0000000..5be5d1f
--- /dev/null
+++ b/etc/w3/pixmaps/home-cap-dn.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x63,0xff,0xff,0xff,0xab,0xfe,
+ 0xff,0xff,0xcb,0xfd,0xff,0xff,0x6b,0xfb,0xff,0xff,0xbb,0xf6,0xff,0xff,0xdb,
+ 0xed,0xff,0xff,0xed,0xdb,0xff,0xff,0xf6,0xb7,0xff,0x7f,0xf8,0x4f,0xff,0xff,
+ 0x3d,0xde,0xff,0xff,0xbd,0xdf,0xff,0xff,0xbd,0xdf,0xff,0xff,0xbd,0xdf,0xff,
+ 0xff,0xbd,0xdf,0xff,0xff,0x81,0xc1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xfd,0xff,0xff,0xdf,0xfd,
+ 0xff,0xff,0xdf,0xcd,0xe4,0xfc,0x1f,0xb4,0x5a,0xfb,0xdf,0xb5,0x5a,0xf8,0xdf,
+ 0xb5,0x5a,0xff,0xdf,0xcd,0xda,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
diff --git a/etc/w3/pixmaps/home-cap-dn.xpm b/etc/w3/pixmaps/home-cap-dn.xpm
new file mode 100644
index 0000000..c0006df
--- /dev/null
+++ b/etc/w3/pixmaps/home-cap-dn.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *home-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkaaakkakkkkkkkkkkkkkkkk",
+"kkkkkkkkkkapakapakkkkkkkkkkkkkkk",
+"kkkkkkkkkkapaapmmakkkkkkkkkkkkkk",
+"kkkkkkkkkkapapmammakkkkkkkkkkkkk",
+"kkkkkkkkkkapmmamammakkkkkkkkkkkk",
+"kkkkkkkkkkapmammmammakkkkkkkkkkk",
+"kkkkkkkkkapmammmmmammakkkkkkkkkk",
+"kkkkkkkkapmammmmmmmammakkkkkkkkk",
+"kkkkkkkaaaammmmmmmmmaagakkkkkkkk",
+"kkkkkkkkkapmmmaaapmmmaggkkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjgkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjkkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjkkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjkkkkkkkk",
+"kkkkkkkkkaaaaaagjaaaaagjkkkkkkkk",
+"kkkkkkkkkkkgggggjkkjgggjkkkkkkkk",
+"kkkkkkkkkkkjjjjjjkkjjjjjkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkk.kkk.kkkkkkkkkkkkkkkkkkkkkk",
+"kkkkk.kkk.kkkkkkkkkkkkkkkkkkkkkk",
+"kkkkk.kkk.kk..kk..k..kkk..kkkkkk",
+"kkkkk.....k.kk.k.k.kk.k.kk.kkkkk",
+"kkkkk.kkk.k.kk.k.k.kk.k....kkkkk",
+"kkkkk.kkk.k.kk.k.k.kk.k.kkkkkkkk",
+"kkkkk.kkk.kk..kk.k.kk.kk...kkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/home-cap-no.xbm b/etc/w3/pixmaps/home-cap-no.xbm
new file mode 100644
index 0000000..e347a84
--- /dev/null
+++ b/etc/w3/pixmaps/home-cap-no.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x01,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x24,
+ 0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x48,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xc2,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x20,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x42,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x20,0x32,0x1b,0x03,0x00,0x00,0x00,0x00,0x20,0x4a,0xa5,0x07,0x00,
+ 0x00,0x00,0x00,0x20,0x32,0x25,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/home-cap-no.xpm b/etc/w3/pixmaps/home-cap-no.xpm
new file mode 100644
index 0000000..c0006df
--- /dev/null
+++ b/etc/w3/pixmaps/home-cap-no.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *home-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkaaakkakkkkkkkkkkkkkkkk",
+"kkkkkkkkkkapakapakkkkkkkkkkkkkkk",
+"kkkkkkkkkkapaapmmakkkkkkkkkkkkkk",
+"kkkkkkkkkkapapmammakkkkkkkkkkkkk",
+"kkkkkkkkkkapmmamammakkkkkkkkkkkk",
+"kkkkkkkkkkapmammmammakkkkkkkkkkk",
+"kkkkkkkkkapmammmmmammakkkkkkkkkk",
+"kkkkkkkkapmammmmmmmammakkkkkkkkk",
+"kkkkkkkaaaammmmmmmmmaagakkkkkkkk",
+"kkkkkkkkkapmmmaaapmmmaggkkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjgkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjkkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjkkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjkkkkkkkk",
+"kkkkkkkkkaaaaaagjaaaaagjkkkkkkkk",
+"kkkkkkkkkkkgggggjkkjgggjkkkkkkkk",
+"kkkkkkkkkkkjjjjjjkkjjjjjkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkk.kkk.kkkkkkkkkkkkkkkkkkkkkk",
+"kkkkk.kkk.kkkkkkkkkkkkkkkkkkkkkk",
+"kkkkk.kkk.kk..kk..k..kkk..kkkkkk",
+"kkkkk.....k.kk.k.k.kk.k.kk.kkkkk",
+"kkkkk.kkk.k.kk.k.k.kk.k....kkkkk",
+"kkkkk.kkk.k.kk.k.k.kk.k.kkkkkkkk",
+"kkkkk.kkk.kk..kk.k.kk.kk...kkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/home-cap-up.xbm b/etc/w3/pixmaps/home-cap-up.xbm
new file mode 100644
index 0000000..7d69157
--- /dev/null
+++ b/etc/w3/pixmaps/home-cap-up.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x54,0x01,
+ 0x00,0x00,0x34,0x02,0x00,0x00,0x94,0x04,0x00,0x00,0x44,0x09,0x00,0x00,0x24,
+ 0x12,0x00,0x00,0x12,0x24,0x00,0x00,0x09,0x48,0x00,0x80,0x07,0xb0,0x00,0x00,
+ 0xc2,0x21,0x00,0x00,0x42,0x20,0x00,0x00,0x42,0x20,0x00,0x00,0x42,0x20,0x00,
+ 0x00,0x42,0x20,0x00,0x00,0x7e,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x20,0x02,
+ 0x00,0x00,0x20,0x32,0x1b,0x03,0xe0,0x4b,0xa5,0x04,0x20,0x4a,0xa5,0x07,0x20,
+ 0x4a,0xa5,0x00,0x20,0x32,0x25,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/home-cap-up.xpm b/etc/w3/pixmaps/home-cap-up.xpm
new file mode 100644
index 0000000..c0006df
--- /dev/null
+++ b/etc/w3/pixmaps/home-cap-up.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *home-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkaaakkakkkkkkkkkkkkkkkk",
+"kkkkkkkkkkapakapakkkkkkkkkkkkkkk",
+"kkkkkkkkkkapaapmmakkkkkkkkkkkkkk",
+"kkkkkkkkkkapapmammakkkkkkkkkkkkk",
+"kkkkkkkkkkapmmamammakkkkkkkkkkkk",
+"kkkkkkkkkkapmammmammakkkkkkkkkkk",
+"kkkkkkkkkapmammmmmammakkkkkkkkkk",
+"kkkkkkkkapmammmmmmmammakkkkkkkkk",
+"kkkkkkkaaaammmmmmmmmaagakkkkkkkk",
+"kkkkkkkkkapmmmaaapmmmaggkkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjgkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjkkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjkkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjkkkkkkkk",
+"kkkkkkkkkaaaaaagjaaaaagjkkkkkkkk",
+"kkkkkkkkkkkgggggjkkjgggjkkkkkkkk",
+"kkkkkkkkkkkjjjjjjkkjjjjjkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkk.kkk.kkkkkkkkkkkkkkkkkkkkkk",
+"kkkkk.kkk.kkkkkkkkkkkkkkkkkkkkkk",
+"kkkkk.kkk.kk..kk..k..kkk..kkkkkk",
+"kkkkk.....k.kk.k.k.kk.k.kk.kkkkk",
+"kkkkk.kkk.k.kk.k.k.kk.k....kkkkk",
+"kkkkk.kkk.k.kk.k.k.kk.k.kkkkkkkk",
+"kkkkk.kkk.kk..kk.k.kk.kk...kkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/home-dn.xbm b/etc/w3/pixmaps/home-dn.xbm
new file mode 100644
index 0000000..6e3ff93
--- /dev/null
+++ b/etc/w3/pixmaps/home-dn.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x63,0xff,0xff,0xff,0xab,0xfe,
+ 0xff,0xff,0xcb,0xfd,0xff,0xff,0x6b,0xfb,0xff,0xff,0xbb,0xf6,0xff,0xff,0xdb,
+ 0xed,0xff,0xff,0xed,0xdb,0xff,0xff,0xf6,0xb7,0xff,0x7f,0xf8,0x4f,0xff,0xff,
+ 0x3d,0xde,0xff,0xff,0xbd,0xdf,0xff,0xff,0xbd,0xdf,0xff,0xff,0xbd,0xdf,0xff,
+ 0xff,0xbd,0xdf,0xff,0xff,0x81,0xc1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
diff --git a/etc/w3/pixmaps/home-dn.xpm b/etc/w3/pixmaps/home-dn.xpm
new file mode 100644
index 0000000..1b9ffc5
--- /dev/null
+++ b/etc/w3/pixmaps/home-dn.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *home-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkaaakkakkkkkkkkkkkkkkkk",
+"kkkkkkkkkkapakapakkkkkkkkkkkkkkk",
+"kkkkkkkkkkapaapmmakkkkkkkkkkkkkk",
+"kkkkkkkkkkapapmammakkkkkkkkkkkkk",
+"kkkkkkkkkkapmmamammakkkkkkkkkkkk",
+"kkkkkkkkkkapmammmammakkkkkkkkkkk",
+"kkkkkkkkkapmammmmmammakkkkkkkkkk",
+"kkkkkkkkapmammmmmmmammakkkkkkkkk",
+"kkkkkkkaaaammmmmmmmmaagakkkkkkkk",
+"kkkkkkkkkapmmmaaapmmmaggkkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjgkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjkkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjkkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjkkkkkkkk",
+"kkkkkkkkkaaaaaagjaaaaagjkkkkkkkk",
+"kkkkkkkkkkkgggggjkkjgggjkkkkkkkk",
+"kkkkkkkkkkkjjjjjjkkjjjjjkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/home-no.xbm b/etc/w3/pixmaps/home-no.xbm
new file mode 100644
index 0000000..dd5819d
--- /dev/null
+++ b/etc/w3/pixmaps/home-no.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x01,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x24,
+ 0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x48,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xc2,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x20,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x42,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/home-no.xpm b/etc/w3/pixmaps/home-no.xpm
new file mode 100644
index 0000000..1b9ffc5
--- /dev/null
+++ b/etc/w3/pixmaps/home-no.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *home-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkaaakkakkkkkkkkkkkkkkkk",
+"kkkkkkkkkkapakapakkkkkkkkkkkkkkk",
+"kkkkkkkkkkapaapmmakkkkkkkkkkkkkk",
+"kkkkkkkkkkapapmammakkkkkkkkkkkkk",
+"kkkkkkkkkkapmmamammakkkkkkkkkkkk",
+"kkkkkkkkkkapmammmammakkkkkkkkkkk",
+"kkkkkkkkkapmammmmmammakkkkkkkkkk",
+"kkkkkkkkapmammmmmmmammakkkkkkkkk",
+"kkkkkkkaaaammmmmmmmmaagakkkkkkkk",
+"kkkkkkkkkapmmmaaapmmmaggkkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjgkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjkkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjkkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjkkkkkkkk",
+"kkkkkkkkkaaaaaagjaaaaagjkkkkkkkk",
+"kkkkkkkkkkkgggggjkkjgggjkkkkkkkk",
+"kkkkkkkkkkkjjjjjjkkjjjjjkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/home-up.xbm b/etc/w3/pixmaps/home-up.xbm
new file mode 100644
index 0000000..efe35a0
--- /dev/null
+++ b/etc/w3/pixmaps/home-up.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x54,0x01,
+ 0x00,0x00,0x34,0x02,0x00,0x00,0x94,0x04,0x00,0x00,0x44,0x09,0x00,0x00,0x24,
+ 0x12,0x00,0x00,0x12,0x24,0x00,0x00,0x09,0x48,0x00,0x80,0x07,0xb0,0x00,0x00,
+ 0xc2,0x21,0x00,0x00,0x42,0x20,0x00,0x00,0x42,0x20,0x00,0x00,0x42,0x20,0x00,
+ 0x00,0x42,0x20,0x00,0x00,0x7e,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/home-up.xpm b/etc/w3/pixmaps/home-up.xpm
new file mode 100644
index 0000000..1b9ffc5
--- /dev/null
+++ b/etc/w3/pixmaps/home-up.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *home-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkaaakkakkkkkkkkkkkkkkkk",
+"kkkkkkkkkkapakapakkkkkkkkkkkkkkk",
+"kkkkkkkkkkapaapmmakkkkkkkkkkkkkk",
+"kkkkkkkkkkapapmammakkkkkkkkkkkkk",
+"kkkkkkkkkkapmmamammakkkkkkkkkkkk",
+"kkkkkkkkkkapmammmammakkkkkkkkkkk",
+"kkkkkkkkkapmammmmmammakkkkkkkkkk",
+"kkkkkkkkapmammmmmmmammakkkkkkkkk",
+"kkkkkkkaaaammmmmmmmmaagakkkkkkkk",
+"kkkkkkkkkapmmmaaapmmmaggkkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjgkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjkkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjkkkkkkkk",
+"kkkkkkkkkapmmmagjpmmmagjkkkkkkkk",
+"kkkkkkkkkaaaaaagjaaaaagjkkkkkkkk",
+"kkkkkkkkkkkgggggjkkjgggjkkkkkkkk",
+"kkkkkkkkkkkjjjjjjkkjjjjjkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/home.xbm b/etc/w3/pixmaps/home.xbm
new file mode 100644
index 0000000..0ff2943
--- /dev/null
+++ b/etc/w3/pixmaps/home.xbm
@@ -0,0 +1,8 @@
+#define home_width 26
+#define home_height 18
+static char home_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0xc0,0xf3,0x0f,0x00,0xe0,0xf3,0x1f,
+ 0x00,0x50,0xff,0x3f,0x00,0x28,0xfe,0x7f,0x00,0x14,0xfc,0xff,0x00,0x0a,0xf8,
+ 0xff,0x01,0x06,0x10,0x80,0x00,0x34,0xd3,0xb6,0x00,0x34,0xd3,0xb6,0x00,0x04,
+ 0x10,0x80,0x00,0x04,0x10,0x80,0x00,0x34,0xd3,0xb6,0x00,0x34,0xd3,0xb6,0x00,
+ 0x04,0x10,0x86,0x00,0xfc,0xff,0xff,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/hotl-cap-dn.xbm b/etc/w3/pixmaps/hotl-cap-dn.xbm
new file mode 100644
index 0000000..3f1d908
--- /dev/null
+++ b/etc/w3/pixmaps/hotl-cap-dn.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0xff,0xff,0xff,0xff,0xff,0xef,0xf7,0xff,0xff,0x44,0x22,0xff,0x7f,0x00,0x00,
+ 0xfe,0xbf,0x01,0x00,0xfc,0x5f,0x01,0x00,0xf8,0xef,0x88,0x44,0xf2,0xe7,0x9d,
+ 0x4c,0xe6,0x07,0xbe,0xdd,0xee,0x0f,0xdf,0x6e,0xf7,0x9f,0xef,0xf7,0xfb,0x3f,
+ 0x77,0xbb,0xfd,0x7f,0x32,0x99,0xfe,0xff,0x44,0x22,0xff,0xff,0xef,0xf7,0xff,
+ 0xff,0xff,0x01,0xc0,0x0f,0x00,0x00,0xe0,0xff,0x57,0xdf,0xff,0xff,0x55,0xdf,
+ 0xff,0xff,0xd5,0xdf,0xff,0xff,0xb3,0xc5,0xff,0xff,0x77,0x13,0xff,0xff,0x9f,
+ 0x5f,0xff,0xff,0x7f,0x3f,0xff,0xff,0xff,0x7c,0xff,0xff,0xff,0xfb,0xff,0xff,
+ 0xff,0xfb,0xff,0xff,0xff,0x01,0xff,0xff,0xff,0x01,0xff,0xff,0xff,0xff,0xff};
diff --git a/etc/w3/pixmaps/hotl-cap-dn.xpm b/etc/w3/pixmaps/hotl-cap-dn.xpm
new file mode 100644
index 0000000..4dea31d
--- /dev/null
+++ b/etc/w3/pixmaps/hotl-cap-dn.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *hotl-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #b2b2b2 s backgroundToolBarColor",
+"# c #0000ef",
+"a c #000044",
+"b c #444444",
+"c c #0000ab",
+"d c #aaaaaa",
+"e c #ffffff",
+"f c #bbbbbb",
+"g c #888888",
+"h c #000000",
+"i c #dddddd",
+"j c #555555",
+"k c #222222",
+"l c #111111",
+"m c #9a6633",
+"n c #cc9966",
+"o c #ffcc66",
+"p c #663300",
+/* pixels */
+"................................",
+"............#......#............",
+"........#a.##a.#a.##a.#a........",
+".......b##ac##ac#ac##ac#a.......",
+"......bdd##ac##a##ac##a##a......",
+".....bdcd###ac##c##ac##c##a.....",
+"....bdddc##e#acfacf#acfacf#a....",
+"...##dddd#eee#ag#agf#ag#agf#a...",
+"...a#####eeeeeagfagffagfagffa...",
+"....a###eeeeeagfagffagfagffa....",
+".....a#eeeeeagffgffagffgffa.....",
+"......a#eeeagffaffagffaffa......",
+".......a#eacffacfacffacfa.......",
+"........aa.h#a.ha.h#a.ha........",
+"............a......a............",
+"...giiifffddddgggjjjjjbbkkkllh..",
+"....hhhhhhhhhhhhhhhhhhhhhhhhh...",
+".........nomomom.....mo.........",
+".........momomom.....mo.........",
+".........pnmomoo.....mo.........",
+"..........mmoomoom.mmmo.........",
+"...........pnoomoommommm........",
+".............pmnooooopnm........",
+"...............pnnoooomm........",
+"................pmnoooom........",
+"..................mnooo.........",
+"..................pnooo.........",
+".................bkllhhh........",
+".................bkllhhh........",
+"................................"
+};
diff --git a/etc/w3/pixmaps/hotl-cap-no.xbm b/etc/w3/pixmaps/hotl-cap-no.xbm
new file mode 100644
index 0000000..e87571a
--- /dev/null
+++ b/etc/w3/pixmaps/hotl-cap-no.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,
+ 0x01,0x00,0x00,0x00,0x00,0xa0,0xfe,0xff,0x07,0x00,0x00,0x00,0x00,0x18,0x62,
+ 0xb3,0x19,0x00,0x00,0x00,0x00,0xf0,0x20,0x91,0x08,0x00,0x00,0x00,0x00,0xc0,
+ 0x88,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0xbb,0xdd,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xfe,0x3f,0x00,0x00,0x00,0x00,0x00,0xa8,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x2a,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0xec,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/hotl-cap-no.xpm b/etc/w3/pixmaps/hotl-cap-no.xpm
new file mode 100644
index 0000000..4dea31d
--- /dev/null
+++ b/etc/w3/pixmaps/hotl-cap-no.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *hotl-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #b2b2b2 s backgroundToolBarColor",
+"# c #0000ef",
+"a c #000044",
+"b c #444444",
+"c c #0000ab",
+"d c #aaaaaa",
+"e c #ffffff",
+"f c #bbbbbb",
+"g c #888888",
+"h c #000000",
+"i c #dddddd",
+"j c #555555",
+"k c #222222",
+"l c #111111",
+"m c #9a6633",
+"n c #cc9966",
+"o c #ffcc66",
+"p c #663300",
+/* pixels */
+"................................",
+"............#......#............",
+"........#a.##a.#a.##a.#a........",
+".......b##ac##ac#ac##ac#a.......",
+"......bdd##ac##a##ac##a##a......",
+".....bdcd###ac##c##ac##c##a.....",
+"....bdddc##e#acfacf#acfacf#a....",
+"...##dddd#eee#ag#agf#ag#agf#a...",
+"...a#####eeeeeagfagffagfagffa...",
+"....a###eeeeeagfagffagfagffa....",
+".....a#eeeeeagffgffagffgffa.....",
+"......a#eeeagffaffagffaffa......",
+".......a#eacffacfacffacfa.......",
+"........aa.h#a.ha.h#a.ha........",
+"............a......a............",
+"...giiifffddddgggjjjjjbbkkkllh..",
+"....hhhhhhhhhhhhhhhhhhhhhhhhh...",
+".........nomomom.....mo.........",
+".........momomom.....mo.........",
+".........pnmomoo.....mo.........",
+"..........mmoomoom.mmmo.........",
+"...........pnoomoommommm........",
+".............pmnooooopnm........",
+"...............pnnoooomm........",
+"................pmnoooom........",
+"..................mnooo.........",
+"..................pnooo.........",
+".................bkllhhh........",
+".................bkllhhh........",
+"................................"
+};
diff --git a/etc/w3/pixmaps/hotl-cap-up.xbm b/etc/w3/pixmaps/hotl-cap-up.xbm
new file mode 100644
index 0000000..9819367
--- /dev/null
+++ b/etc/w3/pixmaps/hotl-cap-up.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x00,0x00,0xbb,0xdd,0x00,0x80,0xff,0xff,
+ 0x01,0x40,0xfe,0xff,0x03,0xa0,0xfe,0xff,0x07,0x10,0x77,0xbb,0x0d,0x18,0x62,
+ 0xb3,0x19,0xf8,0x41,0x22,0x11,0xf0,0x20,0x91,0x08,0x60,0x10,0x08,0x04,0xc0,
+ 0x88,0x44,0x02,0x80,0xcd,0x66,0x01,0x00,0xbb,0xdd,0x00,0x00,0x10,0x08,0x00,
+ 0x00,0x00,0xfe,0x3f,0xf0,0xff,0xff,0x1f,0x00,0xa8,0x20,0x00,0x00,0xaa,0x20,
+ 0x00,0x00,0x2a,0x20,0x00,0x00,0x4c,0x3a,0x00,0x00,0x88,0xec,0x00,0x00,0x60,
+ 0xa0,0x00,0x00,0x80,0xc0,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x04,0x00,0x00,
+ 0x00,0x04,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/hotl-cap-up.xpm b/etc/w3/pixmaps/hotl-cap-up.xpm
new file mode 100644
index 0000000..4dea31d
--- /dev/null
+++ b/etc/w3/pixmaps/hotl-cap-up.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *hotl-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #b2b2b2 s backgroundToolBarColor",
+"# c #0000ef",
+"a c #000044",
+"b c #444444",
+"c c #0000ab",
+"d c #aaaaaa",
+"e c #ffffff",
+"f c #bbbbbb",
+"g c #888888",
+"h c #000000",
+"i c #dddddd",
+"j c #555555",
+"k c #222222",
+"l c #111111",
+"m c #9a6633",
+"n c #cc9966",
+"o c #ffcc66",
+"p c #663300",
+/* pixels */
+"................................",
+"............#......#............",
+"........#a.##a.#a.##a.#a........",
+".......b##ac##ac#ac##ac#a.......",
+"......bdd##ac##a##ac##a##a......",
+".....bdcd###ac##c##ac##c##a.....",
+"....bdddc##e#acfacf#acfacf#a....",
+"...##dddd#eee#ag#agf#ag#agf#a...",
+"...a#####eeeeeagfagffagfagffa...",
+"....a###eeeeeagfagffagfagffa....",
+".....a#eeeeeagffgffagffgffa.....",
+"......a#eeeagffaffagffaffa......",
+".......a#eacffacfacffacfa.......",
+"........aa.h#a.ha.h#a.ha........",
+"............a......a............",
+"...giiifffddddgggjjjjjbbkkkllh..",
+"....hhhhhhhhhhhhhhhhhhhhhhhhh...",
+".........nomomom.....mo.........",
+".........momomom.....mo.........",
+".........pnmomoo.....mo.........",
+"..........mmoomoom.mmmo.........",
+"...........pnoomoommommm........",
+".............pmnooooopnm........",
+"...............pnnoooomm........",
+"................pmnoooom........",
+"..................mnooo.........",
+"..................pnooo.........",
+".................bkllhhh........",
+".................bkllhhh........",
+"................................"
+};
diff --git a/etc/w3/pixmaps/hotl-dn.xbm b/etc/w3/pixmaps/hotl-dn.xbm
new file mode 100644
index 0000000..3f1d908
--- /dev/null
+++ b/etc/w3/pixmaps/hotl-dn.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0xff,0xff,0xff,0xff,0xff,0xef,0xf7,0xff,0xff,0x44,0x22,0xff,0x7f,0x00,0x00,
+ 0xfe,0xbf,0x01,0x00,0xfc,0x5f,0x01,0x00,0xf8,0xef,0x88,0x44,0xf2,0xe7,0x9d,
+ 0x4c,0xe6,0x07,0xbe,0xdd,0xee,0x0f,0xdf,0x6e,0xf7,0x9f,0xef,0xf7,0xfb,0x3f,
+ 0x77,0xbb,0xfd,0x7f,0x32,0x99,0xfe,0xff,0x44,0x22,0xff,0xff,0xef,0xf7,0xff,
+ 0xff,0xff,0x01,0xc0,0x0f,0x00,0x00,0xe0,0xff,0x57,0xdf,0xff,0xff,0x55,0xdf,
+ 0xff,0xff,0xd5,0xdf,0xff,0xff,0xb3,0xc5,0xff,0xff,0x77,0x13,0xff,0xff,0x9f,
+ 0x5f,0xff,0xff,0x7f,0x3f,0xff,0xff,0xff,0x7c,0xff,0xff,0xff,0xfb,0xff,0xff,
+ 0xff,0xfb,0xff,0xff,0xff,0x01,0xff,0xff,0xff,0x01,0xff,0xff,0xff,0xff,0xff};
diff --git a/etc/w3/pixmaps/hotl-dn.xpm b/etc/w3/pixmaps/hotl-dn.xpm
new file mode 100644
index 0000000..4dea31d
--- /dev/null
+++ b/etc/w3/pixmaps/hotl-dn.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *hotl-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #b2b2b2 s backgroundToolBarColor",
+"# c #0000ef",
+"a c #000044",
+"b c #444444",
+"c c #0000ab",
+"d c #aaaaaa",
+"e c #ffffff",
+"f c #bbbbbb",
+"g c #888888",
+"h c #000000",
+"i c #dddddd",
+"j c #555555",
+"k c #222222",
+"l c #111111",
+"m c #9a6633",
+"n c #cc9966",
+"o c #ffcc66",
+"p c #663300",
+/* pixels */
+"................................",
+"............#......#............",
+"........#a.##a.#a.##a.#a........",
+".......b##ac##ac#ac##ac#a.......",
+"......bdd##ac##a##ac##a##a......",
+".....bdcd###ac##c##ac##c##a.....",
+"....bdddc##e#acfacf#acfacf#a....",
+"...##dddd#eee#ag#agf#ag#agf#a...",
+"...a#####eeeeeagfagffagfagffa...",
+"....a###eeeeeagfagffagfagffa....",
+".....a#eeeeeagffgffagffgffa.....",
+"......a#eeeagffaffagffaffa......",
+".......a#eacffacfacffacfa.......",
+"........aa.h#a.ha.h#a.ha........",
+"............a......a............",
+"...giiifffddddgggjjjjjbbkkkllh..",
+"....hhhhhhhhhhhhhhhhhhhhhhhhh...",
+".........nomomom.....mo.........",
+".........momomom.....mo.........",
+".........pnmomoo.....mo.........",
+"..........mmoomoom.mmmo.........",
+"...........pnoomoommommm........",
+".............pmnooooopnm........",
+"...............pnnoooomm........",
+"................pmnoooom........",
+"..................mnooo.........",
+"..................pnooo.........",
+".................bkllhhh........",
+".................bkllhhh........",
+"................................"
+};
diff --git a/etc/w3/pixmaps/hotl-no.xbm b/etc/w3/pixmaps/hotl-no.xbm
new file mode 100644
index 0000000..e87571a
--- /dev/null
+++ b/etc/w3/pixmaps/hotl-no.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,
+ 0x01,0x00,0x00,0x00,0x00,0xa0,0xfe,0xff,0x07,0x00,0x00,0x00,0x00,0x18,0x62,
+ 0xb3,0x19,0x00,0x00,0x00,0x00,0xf0,0x20,0x91,0x08,0x00,0x00,0x00,0x00,0xc0,
+ 0x88,0x44,0x02,0x00,0x00,0x00,0x00,0x00,0xbb,0xdd,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xfe,0x3f,0x00,0x00,0x00,0x00,0x00,0xa8,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x2a,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0xec,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/hotl-no.xpm b/etc/w3/pixmaps/hotl-no.xpm
new file mode 100644
index 0000000..4dea31d
--- /dev/null
+++ b/etc/w3/pixmaps/hotl-no.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *hotl-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #b2b2b2 s backgroundToolBarColor",
+"# c #0000ef",
+"a c #000044",
+"b c #444444",
+"c c #0000ab",
+"d c #aaaaaa",
+"e c #ffffff",
+"f c #bbbbbb",
+"g c #888888",
+"h c #000000",
+"i c #dddddd",
+"j c #555555",
+"k c #222222",
+"l c #111111",
+"m c #9a6633",
+"n c #cc9966",
+"o c #ffcc66",
+"p c #663300",
+/* pixels */
+"................................",
+"............#......#............",
+"........#a.##a.#a.##a.#a........",
+".......b##ac##ac#ac##ac#a.......",
+"......bdd##ac##a##ac##a##a......",
+".....bdcd###ac##c##ac##c##a.....",
+"....bdddc##e#acfacf#acfacf#a....",
+"...##dddd#eee#ag#agf#ag#agf#a...",
+"...a#####eeeeeagfagffagfagffa...",
+"....a###eeeeeagfagffagfagffa....",
+".....a#eeeeeagffgffagffgffa.....",
+"......a#eeeagffaffagffaffa......",
+".......a#eacffacfacffacfa.......",
+"........aa.h#a.ha.h#a.ha........",
+"............a......a............",
+"...giiifffddddgggjjjjjbbkkkllh..",
+"....hhhhhhhhhhhhhhhhhhhhhhhhh...",
+".........nomomom.....mo.........",
+".........momomom.....mo.........",
+".........pnmomoo.....mo.........",
+"..........mmoomoom.mmmo.........",
+"...........pnoomoommommm........",
+".............pmnooooopnm........",
+"...............pnnoooomm........",
+"................pmnoooom........",
+"..................mnooo.........",
+"..................pnooo.........",
+".................bkllhhh........",
+".................bkllhhh........",
+"................................"
+};
diff --git a/etc/w3/pixmaps/hotl-up.xbm b/etc/w3/pixmaps/hotl-up.xbm
new file mode 100644
index 0000000..9819367
--- /dev/null
+++ b/etc/w3/pixmaps/hotl-up.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x08,0x00,0x00,0xbb,0xdd,0x00,0x80,0xff,0xff,
+ 0x01,0x40,0xfe,0xff,0x03,0xa0,0xfe,0xff,0x07,0x10,0x77,0xbb,0x0d,0x18,0x62,
+ 0xb3,0x19,0xf8,0x41,0x22,0x11,0xf0,0x20,0x91,0x08,0x60,0x10,0x08,0x04,0xc0,
+ 0x88,0x44,0x02,0x80,0xcd,0x66,0x01,0x00,0xbb,0xdd,0x00,0x00,0x10,0x08,0x00,
+ 0x00,0x00,0xfe,0x3f,0xf0,0xff,0xff,0x1f,0x00,0xa8,0x20,0x00,0x00,0xaa,0x20,
+ 0x00,0x00,0x2a,0x20,0x00,0x00,0x4c,0x3a,0x00,0x00,0x88,0xec,0x00,0x00,0x60,
+ 0xa0,0x00,0x00,0x80,0xc0,0x00,0x00,0x00,0x83,0x00,0x00,0x00,0x04,0x00,0x00,
+ 0x00,0x04,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/hotl-up.xpm b/etc/w3/pixmaps/hotl-up.xpm
new file mode 100644
index 0000000..4dea31d
--- /dev/null
+++ b/etc/w3/pixmaps/hotl-up.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *hotl-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #b2b2b2 s backgroundToolBarColor",
+"# c #0000ef",
+"a c #000044",
+"b c #444444",
+"c c #0000ab",
+"d c #aaaaaa",
+"e c #ffffff",
+"f c #bbbbbb",
+"g c #888888",
+"h c #000000",
+"i c #dddddd",
+"j c #555555",
+"k c #222222",
+"l c #111111",
+"m c #9a6633",
+"n c #cc9966",
+"o c #ffcc66",
+"p c #663300",
+/* pixels */
+"................................",
+"............#......#............",
+"........#a.##a.#a.##a.#a........",
+".......b##ac##ac#ac##ac#a.......",
+"......bdd##ac##a##ac##a##a......",
+".....bdcd###ac##c##ac##c##a.....",
+"....bdddc##e#acfacf#acfacf#a....",
+"...##dddd#eee#ag#agf#ag#agf#a...",
+"...a#####eeeeeagfagffagfagffa...",
+"....a###eeeeeagfagffagfagffa....",
+".....a#eeeeeagffgffagffgffa.....",
+"......a#eeeagffaffagffaffa......",
+".......a#eacffacfacffacfa.......",
+"........aa.h#a.ha.h#a.ha........",
+"............a......a............",
+"...giiifffddddgggjjjjjbbkkkllh..",
+"....hhhhhhhhhhhhhhhhhhhhhhhhh...",
+".........nomomom.....mo.........",
+".........momomom.....mo.........",
+".........pnmomoo.....mo.........",
+"..........mmoomoom.mmmo.........",
+"...........pnoomoommommm........",
+".............pmnooooopnm........",
+"...............pnnoooomm........",
+"................pmnoooom........",
+"..................mnooo.........",
+"..................pnooo.........",
+".................bkllhhh........",
+".................bkllhhh........",
+"................................"
+};
diff --git a/etc/w3/pixmaps/imag-cap-dn.xbm b/etc/w3/pixmaps/imag-cap-dn.xbm
new file mode 100644
index 0000000..f4108c0
--- /dev/null
+++ b/etc/w3/pixmaps/imag-cap-dn.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0xff,0xfd,0xff,0xff,0xff,0xfa,0xff,0xff,0x7f,0x77,0xff,0xff,0xbf,0x2f,0xe1,
+ 0xff,0x7f,0x5f,0xdf,0xff,0xff,0x7e,0xbf,0xff,0xff,0x7d,0x73,0xff,0xff,0x7b,
+ 0x03,0xff,0xff,0x7d,0x63,0xff,0xff,0x00,0x7f,0xff,0xff,0xfb,0x7f,0xff,0xff,
+ 0xbb,0x63,0xff,0xff,0xbb,0x63,0xff,0xff,0x1b,0x63,0xff,0xff,0xfb,0x7f,0xff,
+ 0xff,0xfb,0x7f,0xff,0xff,0x03,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0x4b,0xce,
+ 0x31,0xc7,0xab,0xb5,0xd6,0xfa,0xab,0x8d,0x16,0xe6,0xab,0xb5,0xd6,0xdf,0xab,
+ 0x4d,0x31,0xe2,0xff,0xff,0xf6,0xff,0xff,0xff,0xf9,0xff,0xff,0xff,0xff,0xff};
diff --git a/etc/w3/pixmaps/imag-cap-dn.xpm b/etc/w3/pixmaps/imag-cap-dn.xpm
new file mode 100644
index 0000000..2fea99e
--- /dev/null
+++ b/etc/w3/pixmaps/imag-cap-dn.xpm
@@ -0,0 +1,52 @@
+/* XPM */
+static char *imag-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       15            1",
+/* colors */
+". c #000000",
+"# c #0000dd",
+"a c #00bb00",
+"b c #330099",
+"c c #336666",
+"d c #555555",
+"e c #6666cc",
+"f c #888888",
+"g c #990066",
+"h c #aaaaaa",
+"i c #b2b2b2 s backgroundToolBarColor",
+"j c #cccccc",
+"k c #eeeeee",
+"l c #ff66cc",
+"m c #ffffff",
+/* pixels */
+"iiiiiiiiibiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiibmbiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiibmkjbiiibiiiiiiiiiiiiiiii",
+"iiiiiibmkjjjbibbibbbbhiiiiiiiiii",
+"iiiiiiibmkjjjbmbimjhmbhiiiiiiiii",
+"iiiiiiifbmkjjjjbhjmjmmbhiiiiiiii",
+"iiiiiiihfbmkjjjbhmaammmbiiiiiiii",
+"iiiiiiiihfbmkjjbhjaacbdbhiiiiiii",
+"iiiiiiiiibmkjjjbhmaaaffbhiiiiiii",
+"iiiiiiiibbbbbbbbhjmjmjmbhiiiiiii",
+"iiiiiiiiii.hhhfhhmjmjmjbhiiiiiii",
+"iiiiiiiiifbjmjgjmj#e#jmbhiiiiiii",
+"iiiiiiiihhbmjfgfjme#emjbhiiiiiii",
+"iiiiiiiiiibjlggglj#e#jmbhiiiiiii",
+"iiiiiiiiiibmjmjmjmjmjmjbhiiiiiii",
+"iiiiiiiiiibjmjmjmjmjmjmbhiiiiiii",
+"iiiiiiiiiibbbbbbbbbbbbbbhiiiiiii",
+"iiiiiiiiiiiiihhhhhhhhhhhhiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"ii.iiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"ii.iiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"ii.i..i..iii..iii...ii..iii...ii",
+"ii.i.i.ii.i.ii.i.ii.i.ii.i.iiiii",
+"ii.i.i.ii.ii...i.ii.i....ii..iii",
+"ii.i.i.ii.i.ii.i.ii.i.iiiiiii.ii",
+"ii.i.i.ii.ii..i.i...ii...i...iii",
+"iiiiiiiiiiiiiiii.ii.iiiiiiiiiiii",
+"iiiiiiiiiiiiiiiii..iiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"
+};
diff --git a/etc/w3/pixmaps/imag-cap-no.xbm b/etc/w3/pixmaps/imag-cap-no.xbm
new file mode 100644
index 0000000..787fbe4
--- /dev/null
+++ b/etc/w3/pixmaps/imag-cap-no.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/imag-cap-no.xpm b/etc/w3/pixmaps/imag-cap-no.xpm
new file mode 100644
index 0000000..a71967e
--- /dev/null
+++ b/etc/w3/pixmaps/imag-cap-no.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *imag-no[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkgkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkgmgkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkgmpmgkkkgkkkkkkkkkkkkkkkkk",
+"kkkkkgmpmmmgkggpggggkkkkkkkkkkkk",
+"kkkkkkgmmmmmgmgpmpppgkkkkkkkkkkk",
+"kkkkkkggmmmmmpggmmmmmgkkkkkkkkkk",
+"kkkkkkkggmmmmmggpggmmmgkkkkkkkkk",
+"kkkkkkkkggmmmmggpggggggpkkkkkkkk",
+"kkkkkkkkgppmmmggpggggggpkkkkkkkk",
+"kkkkkkkgggggggggpmppppgpkkkkkkkk",
+"kkkkkkkkggggggggpmmmmmgpkkkkkkkk",
+"kkkkkkkkggpppgpppgggmmgpkkkkkkkk",
+"kkkkkkkkkgpmgggmmgggpmgpkkkkkkkk",
+"kkkkkkkkkgpmgggpmgggpmgpkkkkkkkk",
+"kkkkkkkkkgpmmpppmmpppmgpkkkkkkkk",
+"kkkkkkkkkgpmmmmmmmmmmmgpkkkkkkkk",
+"kkkkkkkkkggggggggggggggpkkkkkkkk",
+"kkkkkkkkkkppppppppppppppkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kgkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kgpkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kgpggkggkkkggkkkgggkkggkkkgggkkk",
+"kgpgpgmpgkgmpgkgmpgpgmpgkgmpppkk",
+"kgpgpgpkgpmgggpgpmgpggggpmggkkkk",
+"kgpgpgpkgpgmpgpgpmgpgppppmmpgkkk",
+"kgpgpgpkgpkggmgmgggpkgggmgggmpkk",
+"kkpkpkpkkpkkppkgmpgpkkpppkpppkkk",
+"kkkkkkkkkkkkkkkkggmpkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkppkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/imag-cap-up.xbm b/etc/w3/pixmaps/imag-cap-up.xbm
new file mode 100644
index 0000000..168e526
--- /dev/null
+++ b/etc/w3/pixmaps/imag-cap-up.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x80,0x88,0x00,0x00,0x40,0xd0,0x1e,
+ 0x00,0x80,0xa0,0x20,0x00,0x00,0x81,0x40,0x00,0x00,0x82,0x8c,0x00,0x00,0x84,
+ 0xfc,0x00,0x00,0x82,0x9c,0x00,0x00,0xff,0x80,0x00,0x00,0x04,0x80,0x00,0x00,
+ 0x44,0x9c,0x00,0x00,0x44,0x9c,0x00,0x00,0xe4,0x9c,0x00,0x00,0x04,0x80,0x00,
+ 0x00,0x04,0x80,0x00,0x00,0xfc,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xb4,0x31,
+ 0xce,0x38,0x54,0x4a,0x29,0x05,0x54,0x72,0xe9,0x19,0x54,0x4a,0x29,0x20,0x54,
+ 0xb2,0xce,0x1d,0x00,0x00,0x09,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/imag-cap-up.xpm b/etc/w3/pixmaps/imag-cap-up.xpm
new file mode 100644
index 0000000..2fea99e
--- /dev/null
+++ b/etc/w3/pixmaps/imag-cap-up.xpm
@@ -0,0 +1,52 @@
+/* XPM */
+static char *imag-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       15            1",
+/* colors */
+". c #000000",
+"# c #0000dd",
+"a c #00bb00",
+"b c #330099",
+"c c #336666",
+"d c #555555",
+"e c #6666cc",
+"f c #888888",
+"g c #990066",
+"h c #aaaaaa",
+"i c #b2b2b2 s backgroundToolBarColor",
+"j c #cccccc",
+"k c #eeeeee",
+"l c #ff66cc",
+"m c #ffffff",
+/* pixels */
+"iiiiiiiiibiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiibmbiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiibmkjbiiibiiiiiiiiiiiiiiii",
+"iiiiiibmkjjjbibbibbbbhiiiiiiiiii",
+"iiiiiiibmkjjjbmbimjhmbhiiiiiiiii",
+"iiiiiiifbmkjjjjbhjmjmmbhiiiiiiii",
+"iiiiiiihfbmkjjjbhmaammmbiiiiiiii",
+"iiiiiiiihfbmkjjbhjaacbdbhiiiiiii",
+"iiiiiiiiibmkjjjbhmaaaffbhiiiiiii",
+"iiiiiiiibbbbbbbbhjmjmjmbhiiiiiii",
+"iiiiiiiiii.hhhfhhmjmjmjbhiiiiiii",
+"iiiiiiiiifbjmjgjmj#e#jmbhiiiiiii",
+"iiiiiiiihhbmjfgfjme#emjbhiiiiiii",
+"iiiiiiiiiibjlggglj#e#jmbhiiiiiii",
+"iiiiiiiiiibmjmjmjmjmjmjbhiiiiiii",
+"iiiiiiiiiibjmjmjmjmjmjmbhiiiiiii",
+"iiiiiiiiiibbbbbbbbbbbbbbhiiiiiii",
+"iiiiiiiiiiiiihhhhhhhhhhhhiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"ii.iiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"ii.iiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"ii.i..i..iii..iii...ii..iii...ii",
+"ii.i.i.ii.i.ii.i.ii.i.ii.i.iiiii",
+"ii.i.i.ii.ii...i.ii.i....ii..iii",
+"ii.i.i.ii.i.ii.i.ii.i.iiiiiii.ii",
+"ii.i.i.ii.ii..i.i...ii...i...iii",
+"iiiiiiiiiiiiiiii.ii.iiiiiiiiiiii",
+"iiiiiiiiiiiiiiiii..iiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"
+};
diff --git a/etc/w3/pixmaps/imag-dn.xbm b/etc/w3/pixmaps/imag-dn.xbm
new file mode 100644
index 0000000..8bd7727
--- /dev/null
+++ b/etc/w3/pixmaps/imag-dn.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0xff,0xfd,0xff,0xff,0xff,0xfa,0xff,0xff,0x7f,0x77,0xff,0xff,0xbf,0x2f,0xe1,
+ 0xff,0x7f,0x5f,0xdf,0xff,0xff,0x7e,0xbf,0xff,0xff,0x7d,0x73,0xff,0xff,0x7b,
+ 0x03,0xff,0xff,0x7d,0x63,0xff,0xff,0x00,0x7f,0xff,0xff,0xfb,0x7f,0xff,0xff,
+ 0xbb,0x63,0xff,0xff,0xbb,0x63,0xff,0xff,0x1b,0x63,0xff,0xff,0xfb,0x7f,0xff,
+ 0xff,0xfb,0x7f,0xff,0xff,0x03,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
diff --git a/etc/w3/pixmaps/imag-dn.xpm b/etc/w3/pixmaps/imag-dn.xpm
new file mode 100644
index 0000000..2639f7d
--- /dev/null
+++ b/etc/w3/pixmaps/imag-dn.xpm
@@ -0,0 +1,52 @@
+/* XPM */
+static char *imag-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       15            1",
+/* colors */
+". c #000000",
+"# c #0000dd",
+"a c #00bb00",
+"b c #330099",
+"c c #336666",
+"d c #555555",
+"e c #6666cc",
+"f c #888888",
+"g c #990066",
+"h c #aaaaaa",
+"i c #b2b2b2 s backgroundToolBarColor",
+"j c #cccccc",
+"k c #eeeeee",
+"l c #ff66cc",
+"m c #ffffff",
+/* pixels */
+"iiiiiiiiibiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiibmbiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiibmkjbiiibiiiiiiiiiiiiiiii",
+"iiiiiibmkjjjbibbibbbbhiiiiiiiiii",
+"iiiiiiibmkjjjbmbimjhmbhiiiiiiiii",
+"iiiiiiifbmkjjjjbhjmjmmbhiiiiiiii",
+"iiiiiiihfbmkjjjbhmaammmbiiiiiiii",
+"iiiiiiiihfbmkjjbhjaacbdbhiiiiiii",
+"iiiiiiiiibmkjjjbhmaaaffbhiiiiiii",
+"iiiiiiiibbbbbbbbhjmjmjmbhiiiiiii",
+"iiiiiiiiii.hhhfhhmjmjmjbhiiiiiii",
+"iiiiiiiiifbjmjgjmj#e#jmbhiiiiiii",
+"iiiiiiiihhbmjfgfjme#emjbhiiiiiii",
+"iiiiiiiiiibjlggglj#e#jmbhiiiiiii",
+"iiiiiiiiiibmjmjmjmjmjmjbhiiiiiii",
+"iiiiiiiiiibjmjmjmjmjmjmbhiiiiiii",
+"iiiiiiiiiibbbbbbbbbbbbbbhiiiiiii",
+"iiiiiiiiiiiiihhhhhhhhhhhhiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"
+};
diff --git a/etc/w3/pixmaps/imag-no.xbm b/etc/w3/pixmaps/imag-no.xbm
new file mode 100644
index 0000000..787fbe4
--- /dev/null
+++ b/etc/w3/pixmaps/imag-no.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/imag-no.xpm b/etc/w3/pixmaps/imag-no.xpm
new file mode 100644
index 0000000..374dba9
--- /dev/null
+++ b/etc/w3/pixmaps/imag-no.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *imag-no[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkgkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkgmgkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkgmpmgkkkgkkkkkkkkkkkkkkkkk",
+"kkkkkgmpmmmgkggpggggkkkkkkkkkkkk",
+"kkkkkkgmmmmmgmgpmpppgkkkkkkkkkkk",
+"kkkkkkggmmmmmpggmmmmmgkkkkkkkkkk",
+"kkkkkkkggmmmmmggpggmmmgkkkkkkkkk",
+"kkkkkkkkggmmmmggpggggggpkkkkkkkk",
+"kkkkkkkkgppmmmggpggggggpkkkkkkkk",
+"kkkkkkkgggggggggpmppppgpkkkkkkkk",
+"kkkkkkkkggggggggpmmmmmgpkkkkkkkk",
+"kkkkkkkkggpppgpppgggmmgpkkkkkkkk",
+"kkkkkkkkkgpmgggmmgggpmgpkkkkkkkk",
+"kkkkkkkkkgpmgggpmgggpmgpkkkkkkkk",
+"kkkkkkkkkgpmmpppmmpppmgpkkkkkkkk",
+"kkkkkkkkkgpmmmmmmmmmmmgpkkkkkkkk",
+"kkkkkkkkkggggggggggggggpkkkkkkkk",
+"kkkkkkkkkkppppppppppppppkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/imag-up.xbm b/etc/w3/pixmaps/imag-up.xbm
new file mode 100644
index 0000000..ce6ed5a
--- /dev/null
+++ b/etc/w3/pixmaps/imag-up.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x80,0x88,0x00,0x00,0x40,0xd0,0x1e,
+ 0x00,0x80,0xa0,0x20,0x00,0x00,0x81,0x40,0x00,0x00,0x82,0x8c,0x00,0x00,0x84,
+ 0xfc,0x00,0x00,0x82,0x9c,0x00,0x00,0xff,0x80,0x00,0x00,0x04,0x80,0x00,0x00,
+ 0x44,0x9c,0x00,0x00,0x44,0x9c,0x00,0x00,0xe4,0x9c,0x00,0x00,0x04,0x80,0x00,
+ 0x00,0x04,0x80,0x00,0x00,0xfc,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/imag-up.xpm b/etc/w3/pixmaps/imag-up.xpm
new file mode 100644
index 0000000..2639f7d
--- /dev/null
+++ b/etc/w3/pixmaps/imag-up.xpm
@@ -0,0 +1,52 @@
+/* XPM */
+static char *imag-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       15            1",
+/* colors */
+". c #000000",
+"# c #0000dd",
+"a c #00bb00",
+"b c #330099",
+"c c #336666",
+"d c #555555",
+"e c #6666cc",
+"f c #888888",
+"g c #990066",
+"h c #aaaaaa",
+"i c #b2b2b2 s backgroundToolBarColor",
+"j c #cccccc",
+"k c #eeeeee",
+"l c #ff66cc",
+"m c #ffffff",
+/* pixels */
+"iiiiiiiiibiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiibmbiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiibmkjbiiibiiiiiiiiiiiiiiii",
+"iiiiiibmkjjjbibbibbbbhiiiiiiiiii",
+"iiiiiiibmkjjjbmbimjhmbhiiiiiiiii",
+"iiiiiiifbmkjjjjbhjmjmmbhiiiiiiii",
+"iiiiiiihfbmkjjjbhmaammmbiiiiiiii",
+"iiiiiiiihfbmkjjbhjaacbdbhiiiiiii",
+"iiiiiiiiibmkjjjbhmaaaffbhiiiiiii",
+"iiiiiiiibbbbbbbbhjmjmjmbhiiiiiii",
+"iiiiiiiiii.hhhfhhmjmjmjbhiiiiiii",
+"iiiiiiiiifbjmjgjmj#e#jmbhiiiiiii",
+"iiiiiiiihhbmjfgfjme#emjbhiiiiiii",
+"iiiiiiiiiibjlggglj#e#jmbhiiiiiii",
+"iiiiiiiiiibmjmjmjmjmjmjbhiiiiiii",
+"iiiiiiiiiibjmjmjmjmjmjmbhiiiiiii",
+"iiiiiiiiiibbbbbbbbbbbbbbhiiiiiii",
+"iiiiiiiiiiiiihhhhhhhhhhhhiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii",
+"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"
+};
diff --git a/etc/w3/pixmaps/image.xbm b/etc/w3/pixmaps/image.xbm
new file mode 100644
index 0000000..47b98ea
--- /dev/null
+++ b/etc/w3/pixmaps/image.xbm
@@ -0,0 +1,8 @@
+#define image_width 20
+#define image_height 23
+static char image_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x07,0x01,0x00,0x0c,0x01,0x1c,0x0c,
+ 0x01,0x22,0x0c,0x01,0x26,0x0c,0x01,0x29,0x0c,0x01,0x19,0x0c,0x81,0x10,0x0c,
+ 0x81,0x0c,0x0c,0x41,0x08,0x0c,0x41,0x06,0x0c,0xc1,0x04,0x0c,0xc1,0x03,0x0c,
+ 0xc1,0x01,0x0c,0xc1,0x00,0x0c,0x41,0x00,0x0c,0x01,0x00,0x0c,0xff,0xff,0x0f,
+ 0xfe,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/index.xbm b/etc/w3/pixmaps/index.xbm
new file mode 100644
index 0000000..acd11e1
--- /dev/null
+++ b/etc/w3/pixmaps/index.xbm
@@ -0,0 +1,8 @@
+#define index_width 20
+#define index_height 23
+static char index_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x07,0x01,0x00,0x0c,0x81,0x0f,0x0c,
+ 0x41,0x18,0x0c,0x21,0x33,0x0c,0xa1,0x25,0x0c,0xc1,0x24,0x0c,0x01,0x32,0x0c,
+ 0x01,0x19,0x0c,0x81,0x0c,0x0c,0x81,0x06,0x0c,0x01,0x07,0x0c,0x01,0x07,0x0c,
+ 0x81,0x0c,0x0c,0x81,0x0e,0x0c,0x01,0x07,0x0c,0x01,0x00,0x0c,0xff,0xff,0x0f,
+ 0xfe,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/info.xbm b/etc/w3/pixmaps/info.xbm
new file mode 100644
index 0000000..d5fe0ce
--- /dev/null
+++ b/etc/w3/pixmaps/info.xbm
@@ -0,0 +1,14 @@
+#define info_width 32
+#define info_height 32
+static char info_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xe0, 0x07, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x7c, 0x3e, 0x00,
+   0x00, 0x3e, 0x7c, 0x00, 0x00, 0x3f, 0xfc, 0x00, 0x00, 0x7f, 0xfe, 0x00,
+   0x80, 0xff, 0xff, 0x01, 0x80, 0x1f, 0xfc, 0x01, 0x80, 0x3f, 0xfc, 0x01,
+   0x80, 0x3f, 0xfc, 0x01, 0x80, 0x3f, 0xfc, 0x01, 0x80, 0x3f, 0xfc, 0x01,
+   0x00, 0x3f, 0xfc, 0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00, 0xfe, 0x7f, 0x00,
+   0x00, 0xfc, 0x3f, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0xe0, 0x07, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/keyboard.xbm b/etc/w3/pixmaps/keyboard.xbm
new file mode 100644
index 0000000..7a492ea
--- /dev/null
+++ b/etc/w3/pixmaps/keyboard.xbm
@@ -0,0 +1,12 @@
+#define keyboard_width 32
+#define keyboard_height 32
+static char keyboard_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x10,0xa0,0xaa,
+ 0xaa,0x12,0x50,0x55,0x55,0x0d,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0xfe,
+ 0xff,0xff,0x3f,0x01,0x00,0x00,0x40,0xfd,0xf7,0xdf,0x5f,0x55,0x55,0x55,0x55,
+ 0xfd,0xf7,0xdf,0x5f,0x01,0x00,0x00,0x40,0xfd,0xff,0x7f,0x5f,0x55,0x55,0x45,
+ 0x55,0xfd,0xff,0x7f,0x5f,0xa5,0xaa,0x4a,0x55,0xfd,0xff,0x7f,0x5f,0x55,0x55,
+ 0x55,0x55,0xfd,0xff,0x7f,0x5f,0x45,0x00,0x44,0x51,0xfd,0xff,0x7f,0x5f,0x01,
+ 0x00,0x00,0x40,0xfe,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/mail.in.xbm b/etc/w3/pixmaps/mail.in.xbm
new file mode 100644
index 0000000..1f970f2
--- /dev/null
+++ b/etc/w3/pixmaps/mail.in.xbm
@@ -0,0 +1,14 @@
+#define mail_in_tray.bm_width 32
+#define mail_in_tray.bm_height 32
+static char mail_in_tray.bm_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00,
+   0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00,
+   0x00, 0x80, 0x01, 0x00, 0x00, 0x82, 0x41, 0x00, 0x00, 0x86, 0x61, 0x00,
+   0x00, 0x8e, 0x71, 0x00, 0x00, 0x9c, 0x39, 0x00, 0x00, 0xb8, 0x1d, 0x00,
+   0x00, 0xf0, 0x0f, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xc0, 0x03, 0x00,
+   0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x3e,
+   0x84, 0x00, 0x00, 0x21, 0x04, 0xff, 0xff, 0x20, 0x04, 0x00, 0x00, 0x20,
+   0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20,
+   0xfc, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/mail.out.xbm b/etc/w3/pixmaps/mail.out.xbm
new file mode 100644
index 0000000..3717d72
--- /dev/null
+++ b/etc/w3/pixmaps/mail.out.xbm
@@ -0,0 +1,14 @@
+#define mail_out_tray.bm_width 32
+#define mail_out_tray.bm_height 32
+static char mail_out_tray.bm_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0xc0, 0x03, 0x00,
+   0x00, 0xe0, 0x07, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0xb8, 0x1d, 0x00,
+   0x00, 0x9c, 0x39, 0x00, 0x00, 0x8e, 0x71, 0x00, 0x00, 0x86, 0x61, 0x00,
+   0x00, 0x82, 0x41, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00,
+   0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00,
+   0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x3e,
+   0x84, 0x00, 0x00, 0x21, 0x04, 0xff, 0xff, 0x20, 0x04, 0x00, 0x00, 0x20,
+   0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20,
+   0xfc, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/mail.xbm b/etc/w3/pixmaps/mail.xbm
new file mode 100644
index 0000000..cf77ee9
--- /dev/null
+++ b/etc/w3/pixmaps/mail.xbm
@@ -0,0 +1,14 @@
+#define mail.bm_width 32
+#define mail.bm_height 32
+static char mail.bm_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x0f, 0x30, 0x00, 0x00, 0x0c,
+   0x50, 0x00, 0x00, 0x0a, 0x90, 0x00, 0x00, 0x09, 0x10, 0x01, 0x80, 0x08,
+   0x10, 0x02, 0x40, 0x08, 0x10, 0x04, 0x20, 0x08, 0x10, 0x08, 0x10, 0x08,
+   0x10, 0x10, 0x08, 0x08, 0x10, 0x20, 0x04, 0x08, 0x10, 0x40, 0x02, 0x08,
+   0x10, 0x80, 0x01, 0x08, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08,
+   0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08,
+   0xf0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/map.xbm b/etc/w3/pixmaps/map.xbm
new file mode 100644
index 0000000..cd73e6f
--- /dev/null
+++ b/etc/w3/pixmaps/map.xbm
@@ -0,0 +1,12 @@
+#define map_width 32
+#define map_height 32
+static char map_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x00,0xf0,0x3a,0xb8,0xff,0x0d,
+ 0x42,0x88,0x00,0x02,0x20,0x48,0x00,0x00,0x11,0x08,0xfc,0x80,0x61,0x08,0x02,
+ 0x41,0x41,0x10,0x39,0x82,0x41,0x90,0x46,0x02,0x43,0x48,0x91,0x04,0x41,0x48,
+ 0x59,0x04,0x41,0x48,0x41,0xc2,0x47,0x58,0x3a,0x01,0x41,0x98,0x04,0x01,0x21,
+ 0x28,0x81,0x00,0x40,0x48,0x7e,0x00,0x40,0x88,0x00,0x10,0x40,0x10,0x01,0x40,
+ 0x41,0x08,0x02,0x04,0x2c,0x08,0x06,0xe2,0x23,0x08,0x9a,0x01,0x20,0x08,0x62,
+ 0x80,0x22,0x10,0x04,0x18,0x20,0x08,0x04,0x3c,0x2e,0x08,0x08,0x16,0x1e,0x04,
+ 0x00,0x0a,0x3e,0x04,0x01,0x00,0x1f,0x04,0x01,0x80,0x0f,0x84,0xfe,0xc7,0x07,
+ 0xf6,0x02,0xf8,0x03,0x1e,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/mouse.xbm b/etc/w3/pixmaps/mouse.xbm
new file mode 100644
index 0000000..d778e70
--- /dev/null
+++ b/etc/w3/pixmaps/mouse.xbm
@@ -0,0 +1,14 @@
+#define mouse.bm_width 32
+#define mouse.bm_height 32
+static char mouse.bm_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0xff, 0xff, 0x01, 0x80, 0x00, 0x01, 0x01, 0x80, 0x00, 0x01, 0x01,
+   0x80, 0x00, 0x01, 0x01, 0x80, 0x00, 0x01, 0x01, 0x80, 0x00, 0x01, 0x01,
+   0x80, 0x00, 0x01, 0x01, 0x80, 0xff, 0xff, 0x01, 0x80, 0x00, 0x00, 0x01,
+   0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01,
+   0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01,
+   0x80, 0x00, 0x00, 0x01, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00,
+   0x00, 0x06, 0x60, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/network.xbm b/etc/w3/pixmaps/network.xbm
new file mode 100644
index 0000000..36cd1f1
--- /dev/null
+++ b/etc/w3/pixmaps/network.xbm
@@ -0,0 +1,14 @@
+#define network.bm_width 32
+#define network.bm_height 32
+static char network.bm_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0x08, 0x08, 0x00,
+   0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00,
+   0x00, 0x08, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0xf8, 0x0f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0x00, 0x00, 0x04, 0x10, 0x00,
+   0x00, 0xfc, 0x1f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0x7f, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00,
+   0xf0, 0x1f, 0xf8, 0x0f, 0x10, 0x10, 0x08, 0x08, 0x10, 0x10, 0x08, 0x08,
+   0x10, 0x10, 0x08, 0x08, 0x10, 0x10, 0x08, 0x08, 0x10, 0x10, 0x08, 0x08,
+   0x10, 0x10, 0x08, 0x08, 0xf0, 0x1f, 0xf8, 0x0f, 0x00, 0x00, 0x00, 0x00,
+   0xf8, 0x3f, 0xfc, 0x1f, 0x08, 0x20, 0x04, 0x10, 0xf8, 0x3f, 0xfc, 0x1f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/next.xbm b/etc/w3/pixmaps/next.xbm
new file mode 100644
index 0000000..8fea90b
--- /dev/null
+++ b/etc/w3/pixmaps/next.xbm
@@ -0,0 +1,13 @@
+#define next_width 48
+#define next_height 24
+static char next_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
+ 0x00,0x00,0x00,0xff,0x1f,0x0e,0xff,0xff,0x01,0x3f,0x10,0x01,0x04,0x00,0x02,
+ 0x3f,0xd0,0x00,0x04,0x00,0x04,0x3f,0x72,0x00,0x08,0x00,0x02,0x3f,0x30,0x80,
+ 0xd8,0xff,0x01,0x3f,0x12,0xc0,0xf1,0x03,0x00,0x3f,0x11,0xe0,0x23,0x04,0x00,
+ 0x3f,0x12,0xf0,0x23,0x08,0x00,0x3f,0x11,0xf8,0x23,0x04,0x00,0xbf,0x12,0xdc,
+ 0xff,0x03,0x00,0x3f,0x15,0x8c,0x00,0x02,0x00,0xbf,0x12,0x80,0x01,0x01,0x00,
+ 0xbf,0x37,0x80,0xff,0x00,0x00,0xbf,0x74,0x80,0x00,0x01,0x00,0xbf,0x5c,0xc0,
+ 0x81,0x00,0x00,0xbf,0x9f,0x01,0x67,0x00,0x00,0x3f,0x17,0xfe,0x1d,0x00,0x00,
+ 0x3f,0x10,0x00,0x00,0x00,0x00,0xff,0x1f,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/notebook.xbm b/etc/w3/pixmaps/notebook.xbm
new file mode 100644
index 0000000..2421418
--- /dev/null
+++ b/etc/w3/pixmaps/notebook.xbm
@@ -0,0 +1,14 @@
+#define notebook.xbm_width 32
+#define notebook.xbm_height 32
+static char notebook.xbm_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x49, 0x02, 0x00, 0x00, 0x49, 0x02, 0x00, 0xc0, 0xff, 0x07, 0x00,
+   0x40, 0x49, 0x06, 0x00, 0x40, 0x49, 0x06, 0x00, 0x40, 0x00, 0x1c, 0x00,
+   0x40, 0x00, 0x14, 0x00, 0x40, 0x00, 0x14, 0x00, 0x40, 0x00, 0x14, 0x00,
+   0x40, 0x00, 0x14, 0x00, 0x40, 0x00, 0x14, 0x00, 0x40, 0x00, 0x14, 0x00,
+   0x40, 0x00, 0x14, 0x00, 0x40, 0x00, 0x14, 0x00, 0x40, 0x00, 0x14, 0x00,
+   0x40, 0x00, 0x14, 0x00, 0x40, 0x00, 0x14, 0x00, 0x40, 0x00, 0x14, 0x00,
+   0x40, 0x00, 0x14, 0x00, 0x40, 0x00, 0x14, 0x00, 0x40, 0x00, 0x14, 0x00,
+   0x40, 0x00, 0x14, 0x00, 0xc0, 0xff, 0x17, 0x00, 0x80, 0x00, 0x10, 0x00,
+   0x80, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/open-cap-up.xbm b/etc/w3/pixmaps/open-cap-up.xbm
new file mode 100644
index 0000000..97268a9
--- /dev/null
+++ b/etc/w3/pixmaps/open-cap-up.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xbf,0x30,
+ 0x00,0x00,0x01,0x49,0x00,0x00,0x01,0x49,0x00,0x00,0xbf,0x30,0x00,0x00,0x60,
+ 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+ 0x6d,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0xb6,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0x6d,0xdb,0x00,0x00,0x00,0x00,0x00,0x80,0xfb,0xef,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x40,0x02,
+ 0x00,0x00,0x20,0x74,0x4c,0x01,0x20,0x94,0xd2,0x02,0x20,0x94,0x5e,0x02,0x40,
+ 0x92,0x42,0x02,0x80,0x71,0x5c,0x02,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00};
diff --git a/etc/w3/pixmaps/open-cap-up.xpm b/etc/w3/pixmaps/open-cap-up.xpm
new file mode 100644
index 0000000..dafd227
--- /dev/null
+++ b/etc/w3/pixmaps/open-cap-up.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *open-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkakkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkaakkkkkkkkkkkkkkkkk",
+"kkkkkkkkaaaaaapakkkjaajkkkkkkkkk",
+"kkkkkkkkaooooompakkaooajkkkkkkkk",
+"kkkkkkkkammmmmmmagkaojajkkkkkkkk",
+"kkkkkkkkaaaaaamagjkjaajjkkkkkkkk",
+"kkkkkkkkkggggaagjkkkjjjkkkkkkkkk",
+"kkkkkkkkkjjjjagjkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkgjkkkkkkkkkkkkkkkkk",
+"kkkkkkkpgkpgkpgkpgkpgkpgkkkkkkkk",
+"kkkkkkkaakaakaakaakaakaakkkkkkkk",
+"kkkkkkkkpgmpgmpgmpgmpgmpkkkkkkkk",
+"kkkkkkkkaamaamaamaamaamakkkkkkkk",
+"kkkkkkkpgmpgmpgmpgmpgmpgkkkkkkkk",
+"kkkkkkkaamaamaamaamaamaakkkkkkkk",
+"kkkkkkkoogkoooooooogkoogkkkkkkkk",
+"kkkkkkkaaakaaaaaaaaakaaakkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkk..kkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkk.kk.kkkkkkkkkkkkkkkkkkkkkk",
+"kkkkk.kkkk.k...kkk..kk.k.kkkkkkk",
+"kkkkk.kkkk.k.kk.k.kk.k..k.kkkkkk",
+"kkkkk.kkkk.k.kk.k....k.kk.kkkkkk",
+"kkkkkk.kk.kk.kk.k.kkkk.kk.kkkkkk",
+"kkkkkkk..kkk...kkk...k.kk.kkkkkk",
+"kkkkkkkkkkkk.kkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkk.kkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/open-up.xbm b/etc/w3/pixmaps/open-up.xbm
new file mode 100644
index 0000000..be0ff2b
--- /dev/null
+++ b/etc/w3/pixmaps/open-up.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xbf,0x30,
+ 0x00,0x00,0x01,0x49,0x00,0x00,0x01,0x49,0x00,0x00,0xbf,0x30,0x00,0x00,0x60,
+ 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+ 0x6d,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0xdb,0xb6,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0x6d,0xdb,0x00,0x00,0x00,0x00,0x00,0x80,0xfb,0xef,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/open-up.xpm b/etc/w3/pixmaps/open-up.xpm
new file mode 100644
index 0000000..e743093
--- /dev/null
+++ b/etc/w3/pixmaps/open-up.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *open-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkakkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkaakkkkkkkkkkkkkkkkk",
+"kkkkkkkkaaaaaapakkkjaajkkkkkkkkk",
+"kkkkkkkkaooooompakkaooajkkkkkkkk",
+"kkkkkkkkammmmmmmagkaojajkkkkkkkk",
+"kkkkkkkkaaaaaamagjkjaajjkkkkkkkk",
+"kkkkkkkkkggggaagjkkkjjjkkkkkkkkk",
+"kkkkkkkkkjjjjagjkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkgjkkkkkkkkkkkkkkkkk",
+"kkkkkkkpgkpgkpgkpgkpgkpgkkkkkkkk",
+"kkkkkkkaakaakaakaakaakaakkkkkkkk",
+"kkkkkkkkpgmpgmpgmpgmpgmpkkkkkkkk",
+"kkkkkkkkaamaamaamaamaamakkkkkkkk",
+"kkkkkkkpgmpgmpgmpgmpgmpgkkkkkkkk",
+"kkkkkkkaamaamaamaamaamaakkkkkkkk",
+"kkkkkkkoogkoooooooogkoogkkkkkkkk",
+"kkkkkkkaaakaaaaaaaaakaaakkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/postscript.xbm b/etc/w3/pixmaps/postscript.xbm
new file mode 100644
index 0000000..44ec242
--- /dev/null
+++ b/etc/w3/pixmaps/postscript.xbm
@@ -0,0 +1,12 @@
+#define postscript_width 32
+#define postscript_height 32
+static char postscript_bits[] = {
+ 0xf0,0xff,0x3f,0x00,0x10,0x00,0x60,0x00,0x10,0x04,0xa0,0x00,0x10,0x04,0x20,
+ 0x01,0x10,0x00,0x20,0x02,0x10,0x04,0x20,0x04,0xd0,0xea,0x27,0x08,0x10,0x04,
+ 0xe0,0x1f,0x10,0x00,0x00,0x18,0x10,0x04,0x00,0x18,0x10,0x04,0x00,0x18,0x10,
+ 0x00,0x00,0x18,0x10,0xfe,0x7c,0x18,0x10,0xcc,0xe7,0x18,0x10,0x8c,0xc3,0x18,
+ 0x10,0x8c,0x03,0x18,0x10,0xcc,0x07,0x18,0x10,0x7c,0x7e,0x18,0x10,0x0c,0xe0,
+ 0x18,0x10,0x0c,0xc0,0x18,0x10,0x0c,0xc3,0x18,0x10,0x0c,0xe7,0x18,0x10,0x1e,
+ 0x3e,0x18,0x10,0x00,0x00,0x18,0xd0,0xff,0xff,0x1b,0x10,0x00,0x00,0x18,0x10,
+ 0x04,0x00,0x18,0x10,0x04,0x00,0x18,0x10,0x04,0x00,0x18,0x10,0x00,0x00,0x18,
+ 0xf0,0xff,0xff,0x1f,0xe0,0xff,0xff,0x1f};
diff --git a/etc/w3/pixmaps/print-cap-up.xbm b/etc/w3/pixmaps/print-cap-up.xbm
new file mode 100644
index 0000000..3b06cc2
--- /dev/null
+++ b/etc/w3/pixmaps/print-cap-up.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0f,0x00,0x00,0x08,0x08,
+ 0x00,0x00,0xa8,0x08,0x00,0x00,0x08,0x08,0x00,0x00,0xa8,0x0a,0x00,0x00,0x08,
+ 0x08,0x00,0x00,0xe8,0x0a,0x00,0x00,0x08,0x08,0x00,0x00,0xff,0x7f,0x00,0x00,
+ 0x01,0x40,0x00,0x00,0x01,0x40,0x00,0x00,0x01,0x40,0x00,0x00,0x01,0x40,0x00,
+ 0x00,0xff,0x7f,0x00,0x00,0x02,0x20,0x00,0x00,0xfe,0x3f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x83,0x00,0x00,0x80,0x04,
+ 0x40,0x00,0x80,0xd4,0xca,0x00,0x80,0xb3,0x56,0x00,0x80,0x90,0x52,0x00,0x80,
+ 0x90,0x52,0x00,0x80,0x90,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/print-cap-up.xpm b/etc/w3/pixmaps/print-cap-up.xpm
new file mode 100644
index 0000000..1871e64
--- /dev/null
+++ b/etc/w3/pixmaps/print-cap-up.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *print-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkaaaaaaaaakkkkkkkkkkkk",
+"kkkkkkkkkkkapppppppakkkkkkkkkkkk",
+"kkkkkkkkkkkapfmfoooakkkkkkkkkkkk",
+"kkkkkkkkkkkapooooooakkkkkkkkkkkk",
+"kkkkkkkkkkkapfmfmfoakkkkkkkkkkkk",
+"kkkkkkkkkkkapooooooakkkkkkkkkkkk",
+"kkkkkkkkkkkapfffmfoakkkkkkkkkkkk",
+"kkkkkkkkkkkapooooooakkkkkkkkkkkk",
+"kkkkkkkkaaaaaaaaaaaaaaakkkkkkkkk",
+"kkkkkkkkapppppppppppppajkkkkkkkk",
+"kkkkkkkkapkkmmmmmmmmmmagjkkkkkkk",
+"kkkkkkkkapmmmmmmmmmmmmagjkkkkkkk",
+"kkkkkkkkapmmmmmmmmmmmmagjkkkkkkk",
+"kkkkkkkkaaaaaaaaaaaaaaagjkkkkkkk",
+"kkkkkkkkkamgmgmgmgmgmaggjkkkkkkk",
+"kkkkkkkkkaaaaaaaaaaaaagjjkkkkkkk",
+"kkkkkkkkkkjggggggggggggjkkkkkkkk",
+"kkkkkkkkkkkjjjjjjjjjjjjjkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkk...kkkkk.kkkkkkkkkkkkkkkk",
+"kkkkkkk.kk.kkkkkkkkkkk.kkkkkkkkk",
+"kkkkkkk.kk.k.k..k.k.kk..kkkkkkkk",
+"kkkkkkk...kk..k.k..k.k.kkkkkkkkk",
+"kkkkkkk.kkkk.kk.k.kk.k.kkkkkkkkk",
+"kkkkkkk.kkkk.kk.k.kk.k.kkkkkkkkk",
+"kkkkkkk.kkkk.kk.k.kk.kk.kkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/print-up.xbm b/etc/w3/pixmaps/print-up.xbm
new file mode 100644
index 0000000..ab7a5c5
--- /dev/null
+++ b/etc/w3/pixmaps/print-up.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0f,0x00,0x00,0x08,0x08,
+ 0x00,0x00,0xa8,0x08,0x00,0x00,0x08,0x08,0x00,0x00,0xa8,0x0a,0x00,0x00,0x08,
+ 0x08,0x00,0x00,0xe8,0x0a,0x00,0x00,0x08,0x08,0x00,0x00,0xff,0x7f,0x00,0x00,
+ 0x01,0x40,0x00,0x00,0x01,0x40,0x00,0x00,0x01,0x40,0x00,0x00,0x01,0x40,0x00,
+ 0x00,0xff,0x7f,0x00,0x00,0x02,0x20,0x00,0x00,0xfe,0x3f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/print-up.xpm b/etc/w3/pixmaps/print-up.xpm
new file mode 100644
index 0000000..c958aee
--- /dev/null
+++ b/etc/w3/pixmaps/print-up.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *print-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkaaaaaaaaakkkkkkkkkkkk",
+"kkkkkkkkkkkapppppppakkkkkkkkkkkk",
+"kkkkkkkkkkkapfmfoooakkkkkkkkkkkk",
+"kkkkkkkkkkkapooooooakkkkkkkkkkkk",
+"kkkkkkkkkkkapfmfmfoakkkkkkkkkkkk",
+"kkkkkkkkkkkapooooooakkkkkkkkkkkk",
+"kkkkkkkkkkkapfffmfoakkkkkkkkkkkk",
+"kkkkkkkkkkkapooooooakkkkkkkkkkkk",
+"kkkkkkkkaaaaaaaaaaaaaaakkkkkkkkk",
+"kkkkkkkkapppppppppppppajkkkkkkkk",
+"kkkkkkkkapkkmmmmmmmmmmagjkkkkkkk",
+"kkkkkkkkapmmmmmmmmmmmmagjkkkkkkk",
+"kkkkkkkkapmmmmmmmmmmmmagjkkkkkkk",
+"kkkkkkkkaaaaaaaaaaaaaaagjkkkkkkk",
+"kkkkkkkkkamgmgmgmgmgmaggjkkkkkkk",
+"kkkkkkkkkaaaaaaaaaaaaagjjkkkkkkk",
+"kkkkkkkkkkjggggggggggggjkkkkkkkk",
+"kkkkkkkkkkkjjjjjjjjjjjjjkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/printer.xbm b/etc/w3/pixmaps/printer.xbm
new file mode 100644
index 0000000..e3338fe
--- /dev/null
+++ b/etc/w3/pixmaps/printer.xbm
@@ -0,0 +1,14 @@
+#define printer.bm_width 32
+#define printer.bm_height 32
+static char printer.bm_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0xff, 0x03, 0x00, 0x80, 0x00, 0x06, 0x00, 0x80, 0x00, 0x0a, 0x00,
+   0x80, 0x00, 0x12, 0x00, 0x80, 0x00, 0x22, 0x00, 0x80, 0x00, 0x42, 0x00,
+   0x80, 0x00, 0x82, 0x00, 0x80, 0x00, 0xfe, 0x01, 0x80, 0x00, 0x00, 0x01,
+   0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01,
+   0xfc, 0x00, 0x00, 0x3f, 0x84, 0x00, 0x00, 0x21, 0x84, 0x00, 0x00, 0x21,
+   0x84, 0x00, 0x00, 0x21, 0xe4, 0xff, 0xff, 0x27, 0x04, 0x00, 0x00, 0x20,
+   0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20,
+   0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20,
+   0x04, 0x00, 0x00, 0x20, 0xfc, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/radio_dn.xpm b/etc/w3/pixmaps/radio_dn.xpm
new file mode 100644
index 0000000..fe784c4
--- /dev/null
+++ b/etc/w3/pixmaps/radio_dn.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *radio_dn_xpm[] = {
+/* width height num_colors chars_per_pixel */
+"    16    16        4            1",
+/* colors */
+". c Black",
+"# c #555555",
+"a s None c None",
+"b c White",
+/* pixels */
+"aaaaaaaaaaaaaaaa",
+"aaaaaa####aaaaaa",
+"aaaa##....##aaaa",
+"aaa#..aaaa#a#aaa",
+"aa#.#aabbbaaaaaa",
+"aa#.abbbbbbbaaaa",
+"a#.aabbbbbbbaaba",
+"a#.abbbbbbbbbaba",
+"a#.abbbbbbbbbaba",
+"a#.abbbbbbbbbaba",
+"a#.abbbbbbbbbaba",
+"aa##abbbbbbbabaa",
+"aa#aabbbbbbbabaa",
+"aaa#aaabbbaabaaa",
+"aaaaabaaaabbaaaa",
+"aaaaaabbbbaaaaaa",
+"aaaaaaaaaaaaaaaa",
+};
diff --git a/etc/w3/pixmaps/radio_up.xpm b/etc/w3/pixmaps/radio_up.xpm
new file mode 100644
index 0000000..13c19a2
--- /dev/null
+++ b/etc/w3/pixmaps/radio_up.xpm
@@ -0,0 +1,28 @@
+/* XPM */
+static char *radio_up_xpm[] = {
+/* width height num_colors chars_per_pixel */
+"    16    16        4            1",
+/* colors */
+". c Black",
+"# c #555555",
+"a s None c None",
+"b c White",
+/* pixels */
+"aaaaaaaaaaaaaaaa",
+"aaaaaa####aaaaaa",
+"aaaa##....##aaaa",
+"aaa#..aaaaaa#aaa",
+"aa#.#aaaaaaaaaaa",
+"aa#.aaaaaaaaaaaa",
+"a#.aaaaaaaaaaaba",
+"a#.aaaaaaaaaaaba",
+"a#.aaaaaaaaaaaba",
+"a#.aaaaaaaaaaaba",
+"a#.aaaaaaaaaaaba",
+"aa##aaaaaaaaabaa",
+"aa#aaaaaaaaaabaa",
+"aaa#aaaaaaaabaaa",
+"aaaaabaaaabbaaaa",
+"aaaaaabbbbaaaaaa",
+"aaaaaaaaaaaaaaaa",
+};
diff --git a/etc/w3/pixmaps/reld-cap-dn.xbm b/etc/w3/pixmaps/reld-cap-dn.xbm
new file mode 100644
index 0000000..1a7d73b
--- /dev/null
+++ b/etc/w3/pixmaps/reld-cap-dn.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0xff,0xff,0xff,0xff,0xff,0x1f,0xfc,0xff,0xff,0x8f,0xf8,0xff,0xff,0xf3,0xe7,
+ 0xff,0xff,0x1b,0xec,0xff,0xff,0xcd,0xd9,0xff,0xff,0xe4,0x93,0xff,0xff,0xe4,
+ 0x7c,0xfe,0xff,0xf6,0x39,0xff,0xff,0xe6,0x93,0xff,0xff,0xe4,0xc7,0xff,0xff,
+ 0xcc,0xef,0xff,0xff,0x1d,0xc7,0xff,0xff,0x7b,0xba,0xff,0xff,0x73,0xba,0xff,
+ 0xff,0x0f,0xbb,0xff,0xff,0x9f,0xc7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,0xdf,0xff,0xef,0xbb,0xdf,
+ 0xff,0xef,0xbb,0xd9,0x9c,0xe3,0xc3,0x56,0x6b,0xed,0xbb,0x50,0x1b,0xed,0xbb,
+ 0x5e,0x6b,0xed,0xbb,0xd1,0x9c,0xe2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
diff --git a/etc/w3/pixmaps/reld-cap-dn.xpm b/etc/w3/pixmaps/reld-cap-dn.xpm
new file mode 100644
index 0000000..70978c6
--- /dev/null
+++ b/etc/w3/pixmaps/reld-cap-dn.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *reld-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkjfdadfjkkkkkkkkkkkkk",
+"kkkkkkkkkkkgadfjfdagkkkkkkkkkkkk",
+"kkkkkkkkkkdajoommmjadkkkkkkkkkkk",
+"kkkkkkkkkgapofdadfmmagkkkkkkkkkk",
+"kkkkkkkkjajofajjjadmjajkkkkkkkkk",
+"kkkkkkkkfdpfajjjjjafmafkkkkkkkkk",
+"kkkkkkkkdfpafjkkadjommgdakkkkkkk",
+"kkkkkkkkajpajkkkkadmmmdajjkkkkkk",
+"kkkkkkkkajpafkkkkkadmdajjkkkkkkk",
+"kkkkkkkkdfpdfjkkkkkadajjkkkkkkkk",
+"kkkkkkkkfdmmafjkkkkkdjjkkkkkkkkk",
+"kkkkkkkkjajmmaffkkjaaajkkkkkkkkk",
+"kkkkkkkkjgammmjdakamogakkkkkkkkk",
+"kkkkkkkkkjdajmmadkaoomajkkkkkkkk",
+"kkkkkkkkkkjgadfajkagmgagkkkkkkkk",
+"kkkkkkkkkkkjjfdjjkjaaaggkkkkkkkk",
+"kkkkkkkkkkkkjjjjkkkjgggjkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kk....kkkkkkk.kkkkkkkkkkkkkk.kkk",
+"kk.kkk.kkkkkk.kkkkkkkkkkkkkk.kkk",
+"kk.kkk.kk..kk.kk..kkk..kkk...kkk",
+"kk....kk.kk.k.k.kk.k.kk.k.kk.kkk",
+"kk.kkk.k....k.k.kk.kk...k.kk.kkk",
+"kk.kkk.k.kkkk.k.kk.k.kk.k.kk.kkk",
+"kk.kkk.kk...k.kk..kkk..k.k...kkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/reld-cap-no.xbm b/etc/w3/pixmaps/reld-cap-no.xbm
new file mode 100644
index 0000000..99cb0f0
--- /dev/null
+++ b/etc/w3/pixmaps/reld-cap-no.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x18,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,
+ 0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x19,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x33,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x45,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xf0,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x20,0x00,0x10,0x00,0x00,
+ 0x00,0x00,0x44,0x26,0x63,0x1c,0x00,0x00,0x00,0x00,0x44,0xaf,0xe4,0x12,0x00,
+ 0x00,0x00,0x00,0x44,0x2e,0x63,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/reld-cap-no.xpm b/etc/w3/pixmaps/reld-cap-no.xpm
new file mode 100644
index 0000000..70978c6
--- /dev/null
+++ b/etc/w3/pixmaps/reld-cap-no.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *reld-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkjfdadfjkkkkkkkkkkkkk",
+"kkkkkkkkkkkgadfjfdagkkkkkkkkkkkk",
+"kkkkkkkkkkdajoommmjadkkkkkkkkkkk",
+"kkkkkkkkkgapofdadfmmagkkkkkkkkkk",
+"kkkkkkkkjajofajjjadmjajkkkkkkkkk",
+"kkkkkkkkfdpfajjjjjafmafkkkkkkkkk",
+"kkkkkkkkdfpafjkkadjommgdakkkkkkk",
+"kkkkkkkkajpajkkkkadmmmdajjkkkkkk",
+"kkkkkkkkajpafkkkkkadmdajjkkkkkkk",
+"kkkkkkkkdfpdfjkkkkkadajjkkkkkkkk",
+"kkkkkkkkfdmmafjkkkkkdjjkkkkkkkkk",
+"kkkkkkkkjajmmaffkkjaaajkkkkkkkkk",
+"kkkkkkkkjgammmjdakamogakkkkkkkkk",
+"kkkkkkkkkjdajmmadkaoomajkkkkkkkk",
+"kkkkkkkkkkjgadfajkagmgagkkkkkkkk",
+"kkkkkkkkkkkjjfdjjkjaaaggkkkkkkkk",
+"kkkkkkkkkkkkjjjjkkkjgggjkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kk....kkkkkkk.kkkkkkkkkkkkkk.kkk",
+"kk.kkk.kkkkkk.kkkkkkkkkkkkkk.kkk",
+"kk.kkk.kk..kk.kk..kkk..kkk...kkk",
+"kk....kk.kk.k.k.kk.k.kk.k.kk.kkk",
+"kk.kkk.k....k.k.kk.kk...k.kk.kkk",
+"kk.kkk.k.kkkk.k.kk.k.kk.k.kk.kkk",
+"kk.kkk.kk...k.kk..kkk..k.k...kkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/reld-cap-up.xbm b/etc/w3/pixmaps/reld-cap-up.xbm
new file mode 100644
index 0000000..cd9b01d
--- /dev/null
+++ b/etc/w3/pixmaps/reld-cap-up.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x70,0x07,0x00,0x00,0x0c,0x18,
+ 0x00,0x00,0xe4,0x13,0x00,0x00,0x32,0x26,0x00,0x00,0x1b,0x6c,0x00,0x00,0x1b,
+ 0x83,0x01,0x00,0x09,0xc6,0x00,0x00,0x19,0x6c,0x00,0x00,0x1b,0x38,0x00,0x00,
+ 0x33,0x10,0x00,0x00,0xe2,0x38,0x00,0x00,0x84,0x45,0x00,0x00,0x8c,0x45,0x00,
+ 0x00,0xf0,0x44,0x00,0x00,0x60,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x20,0x00,0x10,0x44,0x20,
+ 0x00,0x10,0x44,0x26,0x63,0x1c,0x3c,0xa9,0x94,0x12,0x44,0xaf,0xe4,0x12,0x44,
+ 0xa1,0x94,0x12,0x44,0x2e,0x63,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/reld-cap-up.xpm b/etc/w3/pixmaps/reld-cap-up.xpm
new file mode 100644
index 0000000..70978c6
--- /dev/null
+++ b/etc/w3/pixmaps/reld-cap-up.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *reld-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkjfdadfjkkkkkkkkkkkkk",
+"kkkkkkkkkkkgadfjfdagkkkkkkkkkkkk",
+"kkkkkkkkkkdajoommmjadkkkkkkkkkkk",
+"kkkkkkkkkgapofdadfmmagkkkkkkkkkk",
+"kkkkkkkkjajofajjjadmjajkkkkkkkkk",
+"kkkkkkkkfdpfajjjjjafmafkkkkkkkkk",
+"kkkkkkkkdfpafjkkadjommgdakkkkkkk",
+"kkkkkkkkajpajkkkkadmmmdajjkkkkkk",
+"kkkkkkkkajpafkkkkkadmdajjkkkkkkk",
+"kkkkkkkkdfpdfjkkkkkadajjkkkkkkkk",
+"kkkkkkkkfdmmafjkkkkkdjjkkkkkkkkk",
+"kkkkkkkkjajmmaffkkjaaajkkkkkkkkk",
+"kkkkkkkkjgammmjdakamogakkkkkkkkk",
+"kkkkkkkkkjdajmmadkaoomajkkkkkkkk",
+"kkkkkkkkkkjgadfajkagmgagkkkkkkkk",
+"kkkkkkkkkkkjjfdjjkjaaaggkkkkkkkk",
+"kkkkkkkkkkkkjjjjkkkjgggjkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kk....kkkkkkk.kkkkkkkkkkkkkk.kkk",
+"kk.kkk.kkkkkk.kkkkkkkkkkkkkk.kkk",
+"kk.kkk.kk..kk.kk..kkk..kkk...kkk",
+"kk....kk.kk.k.k.kk.k.kk.k.kk.kkk",
+"kk.kkk.k....k.k.kk.kk...k.kk.kkk",
+"kk.kkk.k.kkkk.k.kk.k.kk.k.kk.kkk",
+"kk.kkk.kk...k.kk..kkk..k.k...kkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/reld-dn.xbm b/etc/w3/pixmaps/reld-dn.xbm
new file mode 100644
index 0000000..56c4c26
--- /dev/null
+++ b/etc/w3/pixmaps/reld-dn.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0xff,0xff,0xff,0xff,0xff,0x1f,0xfc,0xff,0xff,0x8f,0xf8,0xff,0xff,0xf3,0xe7,
+ 0xff,0xff,0x1b,0xec,0xff,0xff,0xcd,0xd9,0xff,0xff,0xe4,0x93,0xff,0xff,0xe4,
+ 0x7c,0xfe,0xff,0xf6,0x39,0xff,0xff,0xe6,0x93,0xff,0xff,0xe4,0xc7,0xff,0xff,
+ 0xcc,0xef,0xff,0xff,0x1d,0xc7,0xff,0xff,0x7b,0xba,0xff,0xff,0x73,0xba,0xff,
+ 0xff,0x0f,0xbb,0xff,0xff,0x9f,0xc7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
diff --git a/etc/w3/pixmaps/reld-dn.xpm b/etc/w3/pixmaps/reld-dn.xpm
new file mode 100644
index 0000000..e5064cc
--- /dev/null
+++ b/etc/w3/pixmaps/reld-dn.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *reld-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkjfdadfjkkkkkkkkkkkkk",
+"kkkkkkkkkkkgadfjfdagkkkkkkkkkkkk",
+"kkkkkkkkkkdajoommmjadkkkkkkkkkkk",
+"kkkkkkkkkgapofdadfmmagkkkkkkkkkk",
+"kkkkkkkkjajofajjjadmjajkkkkkkkkk",
+"kkkkkkkkfdpfajjjjjafmafkkkkkkkkk",
+"kkkkkkkkdfpafjkkadjommgdakkkkkkk",
+"kkkkkkkkajpajkkkkadmmmdajjkkkkkk",
+"kkkkkkkkajpafkkkkkadmdajjkkkkkkk",
+"kkkkkkkkdfpdfjkkkkkadajjkkkkkkkk",
+"kkkkkkkkfdmmafjkkkkkdjjkkkkkkkkk",
+"kkkkkkkkjajmmaffkkjaaajkkkkkkkkk",
+"kkkkkkkkjgammmjdakamogakkkkkkkkk",
+"kkkkkkkkkjdajmmadkaoomajkkkkkkkk",
+"kkkkkkkkkkjgadfajkagmgagkkkkkkkk",
+"kkkkkkkkkkkjjfdjjkjaaaggkkkkkkkk",
+"kkkkkkkkkkkkjjjjkkkjgggjkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/reld-no.xbm b/etc/w3/pixmaps/reld-no.xbm
new file mode 100644
index 0000000..9e45576
--- /dev/null
+++ b/etc/w3/pixmaps/reld-no.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x18,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,
+ 0x83,0x01,0x00,0x00,0x00,0x00,0x00,0x19,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x33,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x45,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xf0,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/reld-no.xpm b/etc/w3/pixmaps/reld-no.xpm
new file mode 100644
index 0000000..e5064cc
--- /dev/null
+++ b/etc/w3/pixmaps/reld-no.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *reld-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkjfdadfjkkkkkkkkkkkkk",
+"kkkkkkkkkkkgadfjfdagkkkkkkkkkkkk",
+"kkkkkkkkkkdajoommmjadkkkkkkkkkkk",
+"kkkkkkkkkgapofdadfmmagkkkkkkkkkk",
+"kkkkkkkkjajofajjjadmjajkkkkkkkkk",
+"kkkkkkkkfdpfajjjjjafmafkkkkkkkkk",
+"kkkkkkkkdfpafjkkadjommgdakkkkkkk",
+"kkkkkkkkajpajkkkkadmmmdajjkkkkkk",
+"kkkkkkkkajpafkkkkkadmdajjkkkkkkk",
+"kkkkkkkkdfpdfjkkkkkadajjkkkkkkkk",
+"kkkkkkkkfdmmafjkkkkkdjjkkkkkkkkk",
+"kkkkkkkkjajmmaffkkjaaajkkkkkkkkk",
+"kkkkkkkkjgammmjdakamogakkkkkkkkk",
+"kkkkkkkkkjdajmmadkaoomajkkkkkkkk",
+"kkkkkkkkkkjgadfajkagmgagkkkkkkkk",
+"kkkkkkkkkkkjjfdjjkjaaaggkkkkkkkk",
+"kkkkkkkkkkkkjjjjkkkjgggjkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/reld-up.xbm b/etc/w3/pixmaps/reld-up.xbm
new file mode 100644
index 0000000..fc9f8bc
--- /dev/null
+++ b/etc/w3/pixmaps/reld-up.xbm
@@ -0,0 +1,11 @@
+#define noname_width 32
+#define noname_height 30
+static char noname_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x70,0x07,0x00,0x00,0x0c,0x18,
+ 0x00,0x00,0xe4,0x13,0x00,0x00,0x32,0x26,0x00,0x00,0x1b,0x6c,0x00,0x00,0x1b,
+ 0x83,0x01,0x00,0x09,0xc6,0x00,0x00,0x19,0x6c,0x00,0x00,0x1b,0x38,0x00,0x00,
+ 0x33,0x10,0x00,0x00,0xe2,0x38,0x00,0x00,0x84,0x45,0x00,0x00,0x8c,0x45,0x00,
+ 0x00,0xf0,0x44,0x00,0x00,0x60,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/reld-up.xpm b/etc/w3/pixmaps/reld-up.xpm
new file mode 100644
index 0000000..e5064cc
--- /dev/null
+++ b/etc/w3/pixmaps/reld-up.xpm
@@ -0,0 +1,55 @@
+/* XPM */
+static char *reld-up[] = {
+/* width height num_colors chars_per_pixel */
+"    32    30       18            1",
+/* colors */
+". c #000000",
+"# c #252525",
+"a c #330099",
+"b c #4c4c4c",
+"c c #555555",
+"d c #6666cc",
+"e c #737373",
+"f c #777777",
+"g c #888888",
+"h c #999999",
+"i c #9999ff",
+"j c #aaaaaa",
+"k c #b2b2b2 s backgroundToolBarColor",
+"l c #bbbbbb",
+"m c #cccccc",
+"n c #e1e1e1",
+"o c #eeeeee",
+"p c #ffffff",
+/* pixels */
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkjfdadfjkkkkkkkkkkkkk",
+"kkkkkkkkkkkgadfjfdagkkkkkkkkkkkk",
+"kkkkkkkkkkdajoommmjadkkkkkkkkkkk",
+"kkkkkkkkkgapofdadfmmagkkkkkkkkkk",
+"kkkkkkkkjajofajjjadmjajkkkkkkkkk",
+"kkkkkkkkfdpfajjjjjafmafkkkkkkkkk",
+"kkkkkkkkdfpafjkkadjommgdakkkkkkk",
+"kkkkkkkkajpajkkkkadmmmdajjkkkkkk",
+"kkkkkkkkajpafkkkkkadmdajjkkkkkkk",
+"kkkkkkkkdfpdfjkkkkkadajjkkkkkkkk",
+"kkkkkkkkfdmmafjkkkkkdjjkkkkkkkkk",
+"kkkkkkkkjajmmaffkkjaaajkkkkkkkkk",
+"kkkkkkkkjgammmjdakamogakkkkkkkkk",
+"kkkkkkkkkjdajmmadkaoomajkkkkkkkk",
+"kkkkkkkkkkjgadfajkagmgagkkkkkkkk",
+"kkkkkkkkkkkjjfdjjkjaaaggkkkkkkkk",
+"kkkkkkkkkkkkjjjjkkkjgggjkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk",
+"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk"
+};
diff --git a/etc/w3/pixmaps/scheduler.xbm b/etc/w3/pixmaps/scheduler.xbm
new file mode 100644
index 0000000..1e489a7
--- /dev/null
+++ b/etc/w3/pixmaps/scheduler.xbm
@@ -0,0 +1,14 @@
+#define scheduler.bm_width 32
+#define scheduler.bm_height 32
+static char scheduler.bm_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x24, 0x00,
+   0x00, 0x92, 0x24, 0x00, 0xc0, 0xff, 0xff, 0x03, 0x40, 0x92, 0x24, 0x02,
+   0x40, 0x92, 0x24, 0x02, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02,
+   0x40, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0x40, 0xf0, 0x0f, 0x02,
+   0x40, 0xf0, 0x0f, 0x02, 0x40, 0xf0, 0x0f, 0x02, 0x40, 0x00, 0x00, 0x02,
+   0x40, 0x00, 0x00, 0x02, 0x40, 0x80, 0x6d, 0x02, 0x40, 0x80, 0x6d, 0x02,
+   0x40, 0x00, 0x00, 0x02, 0x40, 0xb6, 0x6d, 0x02, 0x40, 0xb6, 0x6d, 0x02,
+   0x40, 0x00, 0x00, 0x02, 0x40, 0xb6, 0x6d, 0x02, 0x40, 0xb6, 0x6d, 0x02,
+   0x40, 0x00, 0x00, 0x02, 0x40, 0xb6, 0x01, 0x02, 0x40, 0xb6, 0x01, 0x02,
+   0x40, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0xc0, 0xff, 0xff, 0x03,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/symlink.xbm b/etc/w3/pixmaps/symlink.xbm
new file mode 100644
index 0000000..71ad58a
--- /dev/null
+++ b/etc/w3/pixmaps/symlink.xbm
@@ -0,0 +1,9 @@
+#define symlink_width 20
+#define symlink_height 23
+static char symlink_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xff, 0xff, 0x07, 0x01, 0x00, 0x0c, 0x01, 0x00, 0x0c, 0x01, 0x00, 0x0c,
+   0x01, 0x00, 0x0c, 0x01, 0x00, 0x0c, 0x0f, 0x3f, 0x0e, 0x91, 0x40, 0x0e,
+   0x67, 0x9e, 0x0d, 0xfd, 0x63, 0x0e, 0x03, 0x14, 0x0d, 0x03, 0x14, 0x0d,
+   0xfd, 0x63, 0x0e, 0x67, 0x9e, 0x0f, 0x91, 0x40, 0x0e, 0x0f, 0x3f, 0x0c,
+   0x01, 0x00, 0x0c, 0xff, 0xff, 0x0f, 0xfe, 0xff, 0x0f};
diff --git a/etc/w3/pixmaps/telephone.xbm b/etc/w3/pixmaps/telephone.xbm
new file mode 100644
index 0000000..badba14
--- /dev/null
+++ b/etc/w3/pixmaps/telephone.xbm
@@ -0,0 +1,14 @@
+#define telephone.bm_width 32
+#define telephone.bm_height 32
+static char telephone.bm_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00,
+   0x40, 0x02, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00,
+   0x10, 0x04, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+   0x08, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x10, 0x0e, 0x00, 0x00,
+   0x10, 0x01, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00,
+   0x40, 0x08, 0x00, 0x00, 0x40, 0x10, 0x00, 0x00, 0x80, 0x20, 0x00, 0x00,
+   0x00, 0x41, 0x00, 0x00, 0x00, 0x82, 0x60, 0x00, 0x00, 0x04, 0x91, 0x01,
+   0x00, 0x08, 0x12, 0x06, 0x00, 0x10, 0x14, 0x18, 0x00, 0x20, 0x08, 0x20,
+   0x00, 0x40, 0x00, 0x20, 0x00, 0x80, 0x01, 0x10, 0x00, 0x00, 0x06, 0x0c,
+   0x00, 0x00, 0x18, 0x03, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/telnet.xbm b/etc/w3/pixmaps/telnet.xbm
new file mode 100644
index 0000000..46a29a3
--- /dev/null
+++ b/etc/w3/pixmaps/telnet.xbm
@@ -0,0 +1,8 @@
+#define telnet_width 20
+#define telnet_height 23
+static char telnet_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0x07,0x02,0x00,0x0c,0x7a,0x37,0x0c,
+ 0x7a,0x37,0x0c,0x32,0x33,0x0c,0x32,0x37,0x0c,0x32,0x37,0x0c,0x32,0x33,0x0c,
+ 0x32,0xf7,0x0c,0x32,0xf7,0x0c,0x02,0x00,0x0c,0xfe,0xff,0x0f,0xfc,0xff,0x0f,
+ 0x00,0x00,0x00,0x04,0x00,0x02,0xfe,0xff,0x07,0xff,0xff,0x0f,0xfe,0xff,0x07,
+ 0x04,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/text.document.xbm b/etc/w3/pixmaps/text.document.xbm
new file mode 100644
index 0000000..946df05
--- /dev/null
+++ b/etc/w3/pixmaps/text.document.xbm
@@ -0,0 +1,8 @@
+#define text_width 20
+#define text_height 23
+static char text_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x3f,0x00,0x01,0x60,0x00,0x01,0xa0,0x00,
+ 0xf9,0x27,0x01,0x01,0x20,0x02,0xf1,0xe7,0x07,0x01,0xc0,0x0f,0xf9,0x07,0x0c,
+ 0x01,0x00,0x0c,0xe1,0x07,0x0c,0x01,0x00,0x0c,0xf9,0x07,0x0c,0x01,0x00,0x0c,
+ 0xe1,0x07,0x0c,0x01,0x00,0x0c,0xf9,0x07,0x0c,0x01,0x00,0x0c,0xff,0xff,0x0f,
+ 0xfe,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/tn3270.xbm b/etc/w3/pixmaps/tn3270.xbm
new file mode 100644
index 0000000..9bfe62a
--- /dev/null
+++ b/etc/w3/pixmaps/tn3270.xbm
@@ -0,0 +1,9 @@
+#define tn3270_width 20
+#define tn3270_height 23
+static char tn3270_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x07, 0x02, 0x00, 0x0c,
+   0xfa, 0x86, 0x0d, 0xfa, 0x8e, 0x0d, 0x22, 0x9e, 0x0d, 0x22, 0xb6, 0x0d,
+   0x22, 0xe6, 0x0d, 0x22, 0xc6, 0x0d, 0x22, 0x86, 0x0d, 0x22, 0x86, 0x0d,
+   0x02, 0x00, 0x0c, 0xfe, 0xff, 0x0f, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0x00,
+   0x04, 0x00, 0x02, 0xfe, 0xff, 0x07, 0xff, 0xff, 0x0f, 0xfe, 0xff, 0x07,
+   0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/toggle_dn.xpm b/etc/w3/pixmaps/toggle_dn.xpm
new file mode 100644
index 0000000..767b768
--- /dev/null
+++ b/etc/w3/pixmaps/toggle_dn.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char * toggle_dn_xpm[] = {
+"16 16 3 1",
+"     c white",
+".    c black",
+"X    s None  c None",
+"               .",
+" XXXXXXXXXXXXXX.",
+" XXXXXXXXXXXXXX.",
+" XXXXXXXXX .XXX.",
+" XXXXXXXX XX.XX.",
+" XXXXXXX XX.XXX.",
+" XX .XX XX.XXXX.",
+" XX X. XX.XXXXX.",
+" XX XXXX.XXXXXX.",
+" XX XXX.XXXXXXX.",
+" XX XX.XXXXXXXX.",
+" XX X.XXXXXXXXX.",
+" XXX.XXXXXXXXXX.",
+" XXXXXXXXXXXXXX.",
+" XXXXXXXXXXXXXX.",
+"................",
+};
diff --git a/etc/w3/pixmaps/toggle_up.xpm b/etc/w3/pixmaps/toggle_up.xpm
new file mode 100644
index 0000000..7270452
--- /dev/null
+++ b/etc/w3/pixmaps/toggle_up.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char * toggle_up_xpm[] = {
+"16 16 3 1",
+"     c white",
+".    c black",
+"X    s None  c None",
+"               .",
+" XXXXXXXXXXXXXX.",
+" XXXXXXXXXXXXXX.",
+" XXXXXXXXXXXXXX.",
+" XXXXXXXXXXXXXX.",
+" XXXXXXXXXXXXXX.",
+" XXXXXXXXXXXXXX.",
+" XXXXXXXXXXXXXX.",
+" XXXXXXXXXXXXXX.",
+" XXXXXXXXXXXXXX.",
+" XXXXXXXXXXXXXX.",
+" XXXXXXXXXXXXXX.",
+" XXXXXXXXXXXXXX.",
+" XXXXXXXXXXXXXX.",
+" XXXXXXXXXXXXXX.",
+"................",
+};
diff --git a/etc/w3/pixmaps/trash.xbm b/etc/w3/pixmaps/trash.xbm
new file mode 100644
index 0000000..0370f11
--- /dev/null
+++ b/etc/w3/pixmaps/trash.xbm
@@ -0,0 +1,6 @@
+#define trash_width 16
+#define trash_height 16
+static char trash_bits[] = {
+   0x00, 0x01, 0xe0, 0x0f, 0x10, 0x10, 0xf8, 0x3f, 0x10, 0x10, 0x50, 0x15,
+   0x50, 0x15, 0x50, 0x15, 0x50, 0x15, 0x50, 0x15, 0x50, 0x15, 0x50, 0x15,
+   0x50, 0x15, 0x10, 0x10, 0xe0, 0x0f, 0x00, 0x00};
diff --git a/etc/w3/pixmaps/unknown.document.xbm 
b/etc/w3/pixmaps/unknown.document.xbm
new file mode 100644
index 0000000..12459d8
--- /dev/null
+++ b/etc/w3/pixmaps/unknown.document.xbm
@@ -0,0 +1,8 @@
+#define unknown_width 20
+#define unknown_height 23
+static char unknown_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x3f,0x00,0x01,0x60,0x00,0x01,0xa0,0x00,
+ 0x01,0x20,0x01,0x01,0x20,0x02,0x01,0xe0,0x07,0x01,0xc0,0x0f,0x01,0x00,0x0c,
+ 0x01,0x00,0x0c,0x01,0x00,0x0c,0x01,0x00,0x0c,0x01,0x00,0x0c,0x01,0x00,0x0c,
+ 0x01,0x00,0x0c,0x01,0x00,0x0c,0x01,0x00,0x0c,0x01,0x00,0x0c,0xff,0xff,0x0f,
+ 0xfe,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/uuencoded.document.xbm 
b/etc/w3/pixmaps/uuencoded.document.xbm
new file mode 100644
index 0000000..3533e87
--- /dev/null
+++ b/etc/w3/pixmaps/uuencoded.document.xbm
@@ -0,0 +1,8 @@
+#define uuencoded_width 20
+#define uuencoded_height 23
+static char uuencoded_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x3f,0x00,0x01,0x60,0x00,0x01,0xa0,0x00,
+ 0x01,0x20,0x01,0x01,0x20,0x02,0x01,0xe0,0x07,0x01,0xc0,0x0f,0x01,0x00,0x0c,
+ 0xb1,0x6d,0x0c,0xb1,0x6d,0x0c,0xb1,0x6d,0x0c,0xb1,0x6d,0x0c,0xb1,0x6d,0x0c,
+ 0xb1,0x6d,0x0c,0xf1,0x7d,0x0c,0xe1,0x38,0x0c,0x01,0x00,0x0c,0xff,0xff,0x0f,
+ 0xfe,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/etc/w3/pixmaps/workstation.xbm b/etc/w3/pixmaps/workstation.xbm
new file mode 100644
index 0000000..9a47911
--- /dev/null
+++ b/etc/w3/pixmaps/workstation.xbm
@@ -0,0 +1,14 @@
+#define workstation.bm_width 32
+#define workstation.bm_height 32
+static char workstation.bm_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x07,
+   0x20, 0x00, 0x00, 0x04, 0x20, 0xf0, 0x0f, 0x04, 0x20, 0x0c, 0x30, 0x04,
+   0x20, 0x02, 0x40, 0x04, 0x20, 0x02, 0x40, 0x04, 0x20, 0x01, 0x80, 0x04,
+   0x20, 0x01, 0x80, 0x04, 0x20, 0x01, 0x80, 0x04, 0x20, 0x01, 0x80, 0x04,
+   0x20, 0x01, 0x80, 0x04, 0x20, 0x01, 0x80, 0x04, 0x20, 0x02, 0x40, 0x04,
+   0x20, 0x02, 0x40, 0x04, 0x20, 0x0c, 0x30, 0x04, 0x20, 0xf0, 0x0f, 0x04,
+   0x20, 0x00, 0x00, 0x04, 0xe0, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,
+   0xfc, 0xff, 0xff, 0x3f, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20,
+   0xe4, 0x00, 0x70, 0x20, 0x04, 0x00, 0xff, 0x27, 0x04, 0x00, 0x70, 0x20,
+   0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x20, 0xfc, 0xff, 0xff, 0x3f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..ab74c88
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,238 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+#
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+tranformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+       -c) instcmd="$cpprog"
+           shift
+           continue;;
+
+       -d) dir_arg=true
+           shift
+           continue;;
+
+       -m) chmodcmd="$chmodprog $2"
+           shift
+           shift
+           continue;;
+
+       -o) chowncmd="$chownprog $2"
+           shift
+           shift
+           continue;;
+
+       -g) chgrpcmd="$chgrpprog $2"
+           shift
+           shift
+           continue;;
+
+       -s) stripcmd="$stripprog"
+           shift
+           continue;;
+
+       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+           shift
+           continue;;
+
+       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+           shift
+           continue;;
+
+       *)  if [ x"$src" = x ]
+           then
+               src=$1
+           else
+               # this colon is to work around a 386BSD /bin/sh bug
+               :
+               dst=$1
+           fi
+           shift
+           continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+       echo "install:  no input file specified"
+       exit 1
+else
+       true
+fi
+
+if [ x"$dir_arg" != x ]; then
+       dst=$src
+       src=""
+       
+       if [ -d $dst ]; then
+               instcmd=:
+       else
+               instcmd=mkdir
+       fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+       if [ -f $src -o -d $src ]
+       then
+               true
+       else
+               echo "install:  $src does not exist"
+               exit 1
+       fi
+       
+       if [ x"$dst" = x ]
+       then
+               echo "install:  no destination specified"
+               exit 1
+       else
+               true
+       fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+       if [ -d $dst ]
+       then
+               dst="$dst"/`basename $src`
+       else
+               true
+       fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='   
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@address@hidden' -e 'address@hidden@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+       pathcomp="${pathcomp}${1}"
+       shift
+
+       if [ ! -d "${pathcomp}" ] ;
+        then
+               $mkdirprog "${pathcomp}"
+       else
+               true
+       fi
+
+       pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+       $doit $instcmd $dst &&
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+       if [ x"$transformarg" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               dstfile=`basename $dst $transformbasename | 
+                       sed $transformarg`$transformbasename
+       fi
+
+# don't allow the sed command to completely eliminate the filename
+
+       if [ x"$dstfile" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               true
+       fi
+
+# Make a temp file name in the proper directory.
+
+       dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+       $doit $instcmd $src $dsttmp &&
+
+       trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+       $doit $rmcmd -f $dstdir/$dstfile &&
+       $doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
new file mode 100644
index 0000000..24382f5
--- /dev/null
+++ b/lisp/Makefile.in
@@ -0,0 +1,129 @@
+# where the w3 lisp files should go
+srcdir  = @srcdir@
+prefix  = @prefix@
+datadir = @datadir@
+lispdir = @lispdir@
+top_srcdir = @top_srcdir@
+confdir = $(datadir)/emacs/w3
+
+VPATH=$(srcdir)
+
+############## no user servicable parts beyond this point ###################
+# Have to preload a few things to get a nice clean compile
+
+EMACS     = @EMACS@
+WIDGETDIR = @CUSTOM@
+GNUSDIR   = @GNUS@
+INSTALL   = @INSTALL@
+RM        = rm -f
+
+DEPS = -l $(srcdir)/docomp.el -l $(srcdir)/url-vars.el -l $(srcdir)/w3-vars.el
+
+# compile with noninteractive and relatively clean environment
+BATCHFLAGS = -batch -q -no-site-file
+
+URLSOURCES = \
+       url-nfs.el url-file.el url-cookie.el url-parse.el url-irc.el    \
+       url-gopher.el url-http.el url-mail.el url-misc.el url-news.el   \
+       url-vars.el url-auth.el mm.el md5.el url-gw.el ssl.el base64.el \
+       url.el socks.el url-cache.el url-ns.el
+
+URLOBJECTS    = $(URLSOURCES:.el=.elc)
+
+SOURCES =                                                              \
+       mule-sysdp.el w3-widget.el devices.el w3-imap.el css.el         \
+       dsssl.el dsssl-flow.el font.el images.el w3-vars.el w3-cus.el   \
+       w3-style.el w3-keyword.el w3-forms.el w3-emulate.el             \
+       w3-props.el w3-menu.el w3-mouse.el w3-toolbar.el                \
+       w3-speak.el w3-latex.el w3-parse.el w3-display.el w3-print.el   \
+       w3-about.el w3-hotindex.el w3-hot.el w3-e19.el w3-xemac.el      \
+       w3.el w3-script.el w3-jscript.el w3-elisp.el w3-e20.el          \
+       w3-speak-table.el       
+
+OBJECTS = $(SOURCES:.el=.elc)
+
+AUTOSOURCES = auto-autoloads.el custom-load.el w3-auto.el w3-cfg.el
+AUTOOBJECTS = $(AUTOSOURCES:.el=.elc)
+
+# Some makes appear to choke if I try to do a substitution on a really
+# large macro like SOURCES when it included all of these, so lets combine
+# everything now that it has been appropriately munged in smaller chunks.
+ALLSOURCES = $(SOURCES) $(URLSOURCES) $(AUTOSOURCES)
+ALLOBJECTS = $(OBJECTS) $(URLOBJECTS) $(AUTOOBJECTS)
+
+# Warning!  Currently, the following file can _NOT_ be bytecompiled.
+EXTRAS = w3-sysdp.el docomp.el
+
+.SUFFIXES: .elc .el
+
+.el,v.el:
+       co -q $<
+
+.el.elc:
+       GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) $(EMACS) $(BATCHFLAGS) 
$(DEPS) -f batch-byte-compile $<
+
+all:   $(AUTOSOURCES) w3
+
+w3-auto.el: auto-autoloads.el
+       $(RM) $@
+       cat $(srcdir)/auto-autoloads.el | sed 's/w3-autoloads/w3-auto/g' > $@
+
+auto-autoloads.el: $(SOURCES) $(URLSOURCES)
+       ( cd $(srcdir) ; GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) 
@REBUILD_AUTOLOADS@ )
+
+custom-load.el: $(SOURCES) $(URLSOURCES)
+       ( cd $(srcdir) ; GNUSDIR=$(GNUSDIR) WIDGETDIR=$(WIDGETDIR) 
@REBUILD_CUSTOMLOADS@ )
+
+w3-cfg.el: $(srcdir)/w3-cfg.el.in ../config.status
+       ( cd ../ ; CONFIG_FILES=lisp/w3-cfg.el CONFIG_HEADERS= ./config.status)
+
+w3:    $(ALLSOURCES) $(ALLOBJECTS)
+       @echo Build of w3 complete...
+
+xemacs-w3: $(ALLSOURCES) $(ALLOBJECTS)
+       @echo Build of w3 complete...
+
+fast:  $(ALLSOURCES) $(EXTRAS)
+       $(EMACS) $(BATCHFLAGS) $(DEPS) -f batch-byte-compile $^
+       @echo Build of w3 complete...
+
+autoloads:
+       $(EMACS) $(BATCHFLAGS) -eval '(setq autoload-package-name "w3")' -l 
autoload -f batch-update-directory .
+
+install: all
+       @echo Installing in $(lispdir)
+       ( if [ ! -d $(lispdir) ]; then mkdir -p $(lispdir); fi )
+       for x in $(ALLSOURCES) $(EXTRAS) $(ALLOBJECTS); do              \
+               if [ -f $$x ]; then                                     \
+                       $(INSTALL) -m 644 $$x $(lispdir);               \
+               else                                                    \
+                       $(INSTALL) -m 644 $(srcdir)/$$x $(lispdir);     \
+               fi                                                      \
+       done;
+
+distclean: clean
+       $(RM) config.* Makefile w3-cfg.el
+
+clean:
+       $(RM) $(ALLOBJECTS)
+
+w3-vars.elc: w3-cus.elc w3-vars.el
+w3-display.elc: w3-display.el css.elc font.elc w3-imap.elc
+css.elc: css.el font.elc
+w3.elc: css.elc w3-vars.elc w3.el
+dsssl.elc: dsssl.el dsssl-flow.elc
+
+# Automatic makefile rebuilding
+Makefile: $(srcdir)/Makefile.in ../config.status
+       ( cd .. ; CONFIG_FILES=lisp/Makefile ./config.status )
+
+$(top_srcdir)/configure: $(top_srcdir)/configure.in $(top_srcdir)/aclocal.m4
+       cd $(top_srcdir) && autoreconf
+
+../config.status: $(top_srcdir)/configure
+       cd .. && ./config.status --recheck
+
+# Distribution building
+version: $(ALLSOURCES) $(EXTRAS) descrip.mms
+       test -d $(DIRNAME)/lisp || mkdir -p $(DIRNAME)/lisp
+       for x in descrip.mms $(ALLSOURCES) $(EXTRAS) w3-cfg.el.in w3-cfg.nt 
Makefile.in; do $(INSTALL) -m 644 $$x $(DIRNAME)/lisp; done
diff --git a/lisp/base64.el b/lisp/base64.el
new file mode 100644
index 0000000..0f1f931
--- /dev/null
+++ b/lisp/base64.el
@@ -0,0 +1,274 @@
+;;; base64.el,v --- Base64 encoding functions
+;; Author: Kyle E. Jones
+;; Created: $Date: 1998/12/01 22:12:07 $
+;; Version: $Revision: 1.1 $
+;; Keywords: extensions
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (C) 1997 Kyle E. Jones
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; For non-MULE
+(if (not (fboundp 'char-int))
+    (fset 'char-int 'identity))
+
+(defvar base64-alphabet
+  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")
+
+(defvar base64-decoder-program nil
+  "*Non-nil value should be a string that names a MIME base64 decoder.
+The program should expect to read base64 data on its standard
+input and write the converted data to its standard output.")
+
+(defvar base64-decoder-switches nil
+  "*List of command line flags passed to the command named by
+base64-decoder-program.")
+
+(defvar base64-encoder-program nil
+  "*Non-nil value should be a string that names a MIME base64 encoder.
+The program should expect arbitrary data on its standard
+input and write base64 data to its standard output.")
+
+(defvar base64-encoder-switches nil
+  "*List of command line flags passed to the command named by
+base64-encoder-program.")
+
+(defconst base64-alphabet-decoding-alist
+  '(
+    ( ?A . 00) ( ?B . 01) ( ?C . 02) ( ?D . 03) ( ?E . 04) ( ?F . 05)
+    ( ?G . 06) ( ?H . 07) ( ?I . 08) ( ?J . 09) ( ?K . 10) ( ?L . 11)
+    ( ?M . 12) ( ?N . 13) ( ?O . 14) ( ?P . 15) ( ?Q . 16) ( ?R . 17)
+    ( ?S . 18) ( ?T . 19) ( ?U . 20) ( ?V . 21) ( ?W . 22) ( ?X . 23)
+    ( ?Y . 24) ( ?Z . 25) ( ?a . 26) ( ?b . 27) ( ?c . 28) ( ?d . 29)
+    ( ?e . 30) ( ?f . 31) ( ?g . 32) ( ?h . 33) ( ?i . 34) ( ?j . 35)
+    ( ?k . 36) ( ?l . 37) ( ?m . 38) ( ?n . 39) ( ?o . 40) ( ?p . 41)
+    ( ?q . 42) ( ?r . 43) ( ?s . 44) ( ?t . 45) ( ?u . 46) ( ?v . 47)
+    ( ?w . 48) ( ?x . 49) ( ?y . 50) ( ?z . 51) ( ?0 . 52) ( ?1 . 53)
+    ( ?2 . 54) ( ?3 . 55) ( ?4 . 56) ( ?5 . 57) ( ?6 . 58) ( ?7 . 59)
+    ( ?8 . 60) ( ?9 . 61) ( ?+ . 62) ( ?/ . 63)
+   ))
+
+(defvar base64-alphabet-decoding-vector
+  (let ((v (make-vector 123 nil))
+       (p base64-alphabet-decoding-alist))
+    (while p
+      (aset v (car (car p)) (cdr (car p)))
+      (setq p (cdr p)))
+    v))
+
+(defun base64-run-command-on-region (start end output-buffer command
+                                          &rest arg-list)
+  (let ((tempfile nil) status errstring)
+    (unwind-protect
+       (progn
+         (setq tempfile (make-temp-name "base64"))
+         (setq status
+               (apply 'call-process-region
+                      start end command nil
+                      (list output-buffer tempfile)
+                      nil arg-list))
+         (cond ((equal status 0) t)
+               ((zerop (save-excursion
+                         (set-buffer (find-file-noselect tempfile))
+                         (buffer-size)))
+                t)
+               (t (save-excursion
+                    (set-buffer (find-file-noselect tempfile))
+                    (setq errstring (buffer-string))
+                    (kill-buffer nil)
+                    (cons status errstring)))))
+      (condition-case ()
+         (delete-file tempfile)
+       (error nil)))))
+
+(defun base64-insert-char (char &optional count ignored buffer)
+  (condition-case nil
+      (progn
+       (insert-char char count ignored buffer)
+       (fset 'base64-insert-char 'insert-char))
+    (wrong-number-of-arguments
+     (fset 'base64-insert-char 'base64-xemacs-insert-char)
+     (base64-insert-char char count ignored buffer))))
+
+(defun base64-xemacs-insert-char (char &optional count ignored buffer)
+  (if (and buffer (eq buffer (current-buffer)))
+      (insert-char char count)
+    (save-excursion
+      (set-buffer buffer)
+      (insert-char char count))))
+
+(defun base64-decode-region (start end)
+  (interactive "r")
+  (message "Decoding base64...")
+  (let ((work-buffer nil)
+       (done nil)
+       (counter 0)
+       (bits 0)
+       (lim 0) inputpos
+       (non-data-chars (concat "^=" base64-alphabet)))
+    (unwind-protect
+       (save-excursion
+         (setq work-buffer (generate-new-buffer " *base64-work*"))
+         (buffer-disable-undo work-buffer)
+         (if base64-decoder-program
+             (let* ((binary-process-output t) ; any text already has CRLFs
+                    (status (apply 'base64-run-command-on-region
+                                  start end work-buffer
+                                  base64-decoder-program
+                                  base64-decoder-switches)))
+               (if (not (eq status t))
+                   (error "%s" (cdr status))))
+           (goto-char start)
+           (skip-chars-forward non-data-chars end)
+           (while (not done)
+             (setq inputpos (point))
+             (cond
+              ((> (skip-chars-forward base64-alphabet end) 0)
+               (setq lim (point))
+               (while (< inputpos lim)
+                 (setq bits (+ bits 
+                               (aref base64-alphabet-decoding-vector
+                                     (char-int (char-after inputpos)))))
+                 (setq counter (1+ counter)
+                       inputpos (1+ inputpos))
+                 (cond ((= counter 4)
+                        (base64-insert-char (lsh bits -16) 1 nil work-buffer)
+                        (base64-insert-char (logand (lsh bits -8) 255) 1 nil
+                                        work-buffer)
+                        (base64-insert-char (logand bits 255) 1 nil
+                                            work-buffer)
+                        (setq bits 0 counter 0))
+                       (t (setq bits (lsh bits 6)))))))
+             (cond
+              ((= (point) end)
+               (if (not (zerop counter))
+                   (error "at least %d bits missing at end of base64 encoding"
+                          (* (- 4 counter) 6)))
+               (setq done t))
+              ((= (char-after (point)) ?=)
+               (setq done t)
+               (cond ((= counter 1)
+                      (error "at least 2 bits missing at end of base64 
encoding"))
+                     ((= counter 2)
+                      (base64-insert-char (lsh bits -10) 1 nil work-buffer))
+                     ((= counter 3)
+                      (base64-insert-char (lsh bits -16) 1 nil work-buffer)
+                      (base64-insert-char (logand (lsh bits -8) 255)
+                                          1 nil work-buffer))
+                     ((= counter 0) t)))
+              (t (skip-chars-forward non-data-chars end)))))
+         (or (markerp end) (setq end (set-marker (make-marker) end)))
+         (goto-char start)
+         (insert-buffer-substring work-buffer)
+         (delete-region (point) end))
+      (and work-buffer (kill-buffer work-buffer))))
+  (message "Decoding base64... done"))
+
+(defun base64-encode-region (start end)
+  (interactive "r")
+  (message "Encoding base64...")
+  (let ((work-buffer nil)
+       (counter 0)
+       (cols 0)
+       (bits 0)
+       (alphabet base64-alphabet)
+       inputpos)
+    (unwind-protect
+       (save-excursion
+         (setq work-buffer (generate-new-buffer " *base64-work*"))
+         (buffer-disable-undo work-buffer)
+         (if base64-encoder-program
+             (let ((status (apply 'base64-run-command-on-region
+                                  start end work-buffer
+                                  base64-encoder-program
+                                  base64-encoder-switches)))
+               (if (not (eq status t))
+                   (error "%s" (cdr status))))
+           (setq inputpos start)
+           (while (< inputpos end)
+             (setq bits (+ bits (char-int (char-after inputpos))))
+             (setq counter (1+ counter))
+             (cond ((= counter 3)
+                    (base64-insert-char (aref alphabet (lsh bits -18)) 1 nil
+                                        work-buffer)
+                    (base64-insert-char
+                     (aref alphabet (logand (lsh bits -12) 63))
+                     1 nil work-buffer)
+                    (base64-insert-char
+                     (aref alphabet (logand (lsh bits -6) 63))
+                     1 nil work-buffer)
+                    (base64-insert-char
+                     (aref alphabet (logand bits 63))
+                     1 nil work-buffer)
+                    (setq cols (+ cols 4))
+                    (cond ((= cols 72)
+                           (base64-insert-char ?\n 1 nil work-buffer)
+                           (setq cols 0)))
+                    (setq bits 0 counter 0))
+                   (t (setq bits (lsh bits 8))))
+             (setq inputpos (1+ inputpos)))
+           ;; write out any remaining bits with appropriate padding
+           (if (= counter 0)
+               nil
+             (setq bits (lsh bits (- 16 (* 8 counter))))
+             (base64-insert-char (aref alphabet (lsh bits -18)) 1 nil
+                                 work-buffer)
+             (base64-insert-char (aref alphabet (logand (lsh bits -12) 63))
+                                 1 nil work-buffer)
+             (if (= counter 1)
+                 (base64-insert-char ?= 2 nil work-buffer)
+               (base64-insert-char (aref alphabet (logand (lsh bits -6) 63))
+                                   1 nil work-buffer)
+               (base64-insert-char ?= 1 nil work-buffer)))
+           (if (> cols 0)
+               (base64-insert-char ?\n 1 nil work-buffer)))
+         (or (markerp end) (setq end (set-marker (make-marker) end)))
+         (goto-char start)
+         (insert-buffer-substring work-buffer)
+         (delete-region (point) end))
+      (and work-buffer (kill-buffer work-buffer))))
+  (message "Encoding base64... done"))
+
+(defun base64-encode (string)
+  (save-excursion
+    (set-buffer (get-buffer-create " *base64-encode*"))
+    (erase-buffer)
+    (insert string)
+    (base64-encode-region (point-min) (point-max))
+    (skip-chars-backward " \t\r\n")
+    (delete-region (point-max) (point))
+    (prog1
+       (buffer-string)
+      (kill-buffer (current-buffer)))))
+
+(defun base64-decode (string)
+  (save-excursion
+    (set-buffer (get-buffer-create " *base64-decode*"))
+    (erase-buffer)
+    (insert string)
+    (base64-decode-region (point-min) (point-max))
+    (goto-char (point-max))
+    (skip-chars-backward " \t\r\n")
+    (delete-region (point-max) (point))
+    (prog1
+       (buffer-string)
+      (kill-buffer (current-buffer)))))  
+
+(provide 'base64)
diff --git a/lisp/css.el b/lisp/css.el
new file mode 100644
index 0000000..8d1e5ac
--- /dev/null
+++ b/lisp/css.el
@@ -0,0 +1,1069 @@
+;;; css.el -- Cascading Style Sheet parser
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:07 $
+;; Version: $Revision: 1.1 $
+;; Keywords: 
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(eval-and-compile
+  (require 'cl)
+  (require 'font)
+  )
+
+(if (not (fboundp 'frame-char-height))
+    (defun frame-char-height (&optional frame)
+      "Height in pixels of a line in the font in frame FRAME.
+If FRAME is omitted, the selected frame is used.
+For a terminal frame, the value is always 1."
+      (font-height (face-font 'default frame))))
+
+(if (not (fboundp 'frame-char-width))
+    (defun frame-char-width (&optional frame)
+      "Width in pixels of characters in the font in frame FRAME.
+If FRAME is omitted, the selected frame is used.
+For a terminal screen, the value is always 1."
+      (font-width (face-font 'default frame))))
+
+;; CBI = Cant Be Implemented - due to limitations in emacs/xemacs
+;; NYI = Not Yet Implemented - due to limitations of space/time
+;; NYPI = Not Yet Partially Implemented - possible partial support, eventually
+
+(defconst css-properties
+  '(;; Property name    Inheritable?   Type of data
+    ;; Base CSS level 1 properties: http://www.w3.org/pub/WWW/TR/REC-CSS1
+    ;; Font properties, Section 5.2
+    [font-family      t              string-list]
+    [font-style       t              symbol]
+    [font-variant     t              symbol]
+    [font-weight      t              weight]
+    [font-size        t              height]
+    [font             nil            font]
+
+    ;; Color and background properties, Section 5.3
+    [color            t              color]
+    [background       nil            color-shorthand]
+    [background-color nil            color]
+    [background-image nil            url]    ; NYI
+    [background-repeat nil           symbol] ; CBI
+    [background-attachment nil       symbol] ; CBI
+    [background-position nil         symbol] ; CBI
+
+    ;; Text properties, Section 5.4
+    [word-spacing     t              length] ; CBI
+    [letter-spacing   t              length] ; CBI
+    [text-decoration  t              symbol-list]
+    [vertical-align   nil            symbol]
+    [text-transform   t              symbol]
+    [text-align       t              symbol]
+    [text-indent      t              length] ; NYI
+    [line-height      t              length] ; CBI
+
+    ;; Box properties, Section 5.5
+    [margin           nil            boundary-shorthand]
+    [margin-left      nil            length]
+    [margin-right     nil            length]
+    [margin-top       nil            length]
+    [margin-bottom    nil            length]
+    [padding          nil            boundary-shorthand]
+    [padding-left     nil            length]
+    [padding-right    nil            length]
+    [padding-top      nil            length]
+    [padding-bottom   nil            length]
+    [border           nil            border-shorthand]
+    [border-left      nil            border]
+    [border-right     nil            border]
+    [border-top       nil            border]
+    [border-bottom    nil            border]
+    [border-top-width nil            nil]
+    [border-right-width nil          nil]
+    [border-bottom-width nil         nil]
+    [border-left-width nil           nil]
+    [border-width     nil            boundary-shorthand]
+    [border-color     nil            color]
+    [border-style     nil            symbol]
+    [width            nil            length] ; NYPI
+    [height           nil            length] ; NYPI
+    [float            nil            symbol]
+    [clear            nil            symbol]
+
+    ;; Classification properties, Section 5.6
+    [display          nil            symbol]
+    [list-style-type  t              symbol]
+    [list-style-image t              url]
+    [list-style-position t           symbol]
+    [list-style       nil            list-style]
+    [white-space      t              symbol]
+
+    ;; These are for specifying speech properties (ACSS-style)
+    ;; http://www.w3.org/pub/WWW/Style/CSS/Speech/NOTE-ACSS
+
+    ;; General audio properties, Section 3
+    [volume           t              string] ; Needs its own type?
+    [pause-before     nil            time]
+    [pause-after      nil            time]
+    [pause            nil            pause]
+    [cue-before       nil            string]
+    [cue-after        nil            string]
+    [cue-during       nil            string]
+    [cue              nil            string] ; Needs its own type?
+
+    ;; Spatial properties, Section 4
+    [azimuth          t              angle]
+    [elevation        t              elevation]
+
+    ;; Speech properties, Section 5
+    [speed            t              string]
+    [voice-family     t              string-list]
+    [pitch            t              string]
+    [pitch-range      t              percentage]
+    [stress           t              percentage]
+    [richness         t              percentage]
+    [speak-punctuation t             symbol]
+    [speak-date       t              symbol]
+    [speak-numeral    t              symbol]
+    [speak-time       t              symbol]
+
+    ;; Proposed printing extensions
+    ;; http://www.w3.org/pub/WWW/Style/Group/WD-PRINT-961220
+    ;; These apply only to pages (@page directive)
+    [size             nil            symbol]
+    [orientation      nil            symbol]
+    [margin-inside    nil            length]
+    ;; These apply to the document
+    [page-break-before nil           symbol]
+    [page-break-after  nil           symbol]
+    
+    ;; These are for specifying speech properties (Raman-style)
+    [voice-family     t              string]
+    [gain             t              symbol]
+    [left-volume      t              integer]
+    [right-volume     t              integer]
+    [pitch            t              integer]
+    [pitch-range      t              integer]
+    [stress           t              integer]
+    [richness         t              integer]
+    )
+  "A description of the various CSS properties and how to interpret them.")
+
+(put 'font 'css-shorthand t)
+(put 'background 'css-shorthand t)
+(put 'margin 'css-shorthand t)
+(put 'padding 'css-shorthand t)
+(put 'border 'css-shorthand t)
+(put 'list-style 'css-shorthand t)
+
+(mapcar
+ (lambda (entry)
+   (put (aref entry 0) 'css-inherit (aref entry 1))
+   (put (aref entry 0) 'css-type    (aref entry 2)))
+ css-properties)
+
+(defconst css-weights
+  '(nil                                        ;never used
+    :extra-light
+    :light
+    :demi-light
+    :medium
+    :normal
+    :demi-bold
+    :bold
+    :extra-bold
+    )
+  "List of CSS font weights.")
+
+(defvar css-syntax-table
+  (copy-syntax-table emacs-lisp-mode-syntax-table)
+  "The syntax table for parsing stylesheets")
+
+(modify-syntax-entry ?' "\"" css-syntax-table)
+(modify-syntax-entry ?` "\"" css-syntax-table)
+(modify-syntax-entry ?{ "(" css-syntax-table)
+(modify-syntax-entry ?} ")" css-syntax-table)
+
+(eval-when-compile
+  (defvar css-scratch-val nil)
+  (defvar css-scratch-id nil)
+  (defvar css-scratch-class nil)
+  (defvar css-scratch-possibles nil)
+  (defvar css-scratch-current nil)
+  (defvar css-scratch-classes nil)
+  (defvar css-scratch-class-match nil)
+  (defvar css-scratch-current-rule nil)
+  (defvar css-scratch-current-value nil)
+  )
+
+(defconst css-running-xemacs
+  (string-match "XEmacs" (emacs-version))
+  "Whether we are running in XEmacs or not.")
+
+(defsubst css-replace-regexp (regexp to-string)
+  (goto-char (point-min))
+  (while (re-search-forward regexp nil t)
+    (replace-match to-string t nil)))
+
+(defun css-contextual-match (rule stack)
+  (let ((ancestor)
+       (p-args)
+       (p-class)
+       (p-tag)
+       (matched t))
+    (while rule
+      (setq p-tag (caar rule)
+           ancestor (assq p-tag stack))
+      (case p-tag
+       (*document                      ; Class matching only
+        (setq matched nil)
+        (while (setq ancestor (car stack))
+          (setq stack (cdr stack)
+                p-args (cdr ancestor)
+                p-class (or (cdr-safe (assq 'class p-args)) t))
+          (if (equal p-class (cdar rule))
+              (setq matched t
+                    rule nil
+                    stack nil))))
+       (otherwise
+        (if (not ancestor)
+            (setq rule nil
+                  matched nil)
+          (setq p-args (cdr ancestor)
+                p-class (or (cdr-safe (assq 'class p-args)) t))
+          (if (not (equal p-class (cdar rule)))
+              (setq matched nil
+                    rule nil)))))
+      (setq rule (cdr rule)))
+    matched))
+
+(defsubst css-get-internal (tag args)
+  (declare (special tag sheet element-stack default))
+  (setq css-scratch-id (or (cdr-safe (assq 'id args))
+                          (cdr-safe (assq 'name args)))
+       css-scratch-class (or (cdr-safe (assq 'class args)) t)  
+       css-scratch-possibles (cl-gethash tag sheet))
+  (while css-scratch-possibles
+    (setq css-scratch-current (car css-scratch-possibles)
+         css-scratch-current-rule (car css-scratch-current)
+         css-scratch-current-value (cdr css-scratch-current)
+         css-scratch-classes (if (listp (car css-scratch-current-rule))
+                                 (cdar css-scratch-current-rule)
+                               (cdr css-scratch-current-rule))
+         css-scratch-class-match t
+         css-scratch-possibles (cdr css-scratch-possibles))
+    (if (eq t css-scratch-classes)
+       (setq css-scratch-classes nil))
+    (if (eq t css-scratch-class)
+       (setq css-scratch-class nil))
+    (while css-scratch-classes
+      (if (not (member (pop css-scratch-classes) css-scratch-class))
+         (setq css-scratch-class-match nil
+               css-scratch-classes nil)))
+    (cond
+     ((and (listp (car css-scratch-current-rule)) css-scratch-class-match)
+      ;; Contextual!
+      (setq css-scratch-current-rule (cdr css-scratch-current-rule))
+      (if (css-contextual-match css-scratch-current-rule element-stack)
+         (setq css-scratch-val
+               (append css-scratch-val css-scratch-current-value)))
+      )
+     (css-scratch-class-match
+      (setq css-scratch-val (append css-scratch-val css-scratch-current-value))
+      )
+     (t
+      nil))
+    )
+  )
+
+(defsubst css-get (tag args &optional sheet element-stack)
+  (setq css-scratch-val nil
+       css-scratch-class (or (cdr-safe (assq 'class args)) t))
+
+  ;; check for things without the class
+  (if (listp css-scratch-class)
+      (css-get-internal tag nil))
+
+  ;; check for global class values
+  (css-get-internal '*document args)
+
+  ;; Now check for things with the class - they will be stuck on the front
+  ;; of the list, which will mean we do the right thing
+  (css-get-internal tag args)
+
+  ;; Defaults are up to the calling application to provide
+  css-scratch-val)
+
+(defun css-ancestor-get (info ancestors sheet)
+  ;; Inheritable property, check ancestors
+  (let (cur)
+    (while ancestors
+      (setq cur (car ancestors)
+           css-scratch-val (css-get info (car cur) (cdr cur) sheet)
+           ancestors (if css-scratch-val nil (cdr ancestors)))))
+  css-scratch-val)  
+
+(defun css-split-selector (tag)
+  ;; Return a list 
+  (cond
+   ((string-match " " tag)             ; contextual
+    (let ((tags (split-string tag "[ \t]+"))
+         (result nil))
+      (while tags
+       (setq result (cons (css-split-selector (car tags)) result)
+             tags (cdr tags)))
+      result))
+   ((string-match "[:\\.]" tag)
+    (let ((tag (if (= (match-beginning 0) 0)
+                  '*document
+                (intern (downcase (substring tag 0 (match-beginning 0))))))
+         (rest (substring tag (match-beginning 0) nil))
+         (classes nil))
+      (while (string-match "^[:\\.][^:\\.]+" rest)
+       (if (= ?. (aref rest 0))
+           (setq classes (cons (substring rest 1 (match-end 0)) classes))
+         (setq classes (cons (substring rest 0 (match-end 0)) classes)))
+       (setq rest (substring rest (match-end 0) nil)))
+      (setq classes (sort classes 'string-lessp))
+      (cons tag classes)))
+   ((string-match "^#" tag)            ; id selector
+    (cons '*document (list tag)))
+   (t
+    (cons (intern (downcase tag)) t)
+    )
+   )
+  )
+
+(defun css-applies-to (st nd)
+  (let ((results nil)
+       (save-pos nil))
+    (narrow-to-region st nd)
+    (goto-char st)
+    (skip-chars-forward " \t\r\n")
+    (while (not (eobp))
+      (setq save-pos (point))
+      (skip-chars-forward "^,")
+      (skip-chars-backward " \r\t\n")
+      (setq results (cons (css-split-selector
+                          (buffer-substring save-pos (point))) results))
+      (skip-chars-forward ", \t\r\n"))
+    (widen)
+    results))
+
+(defun css-split-font-shorthand (font)
+  ;; [<font-weight> || <font-style>]? <font-size> [ / <line-height> ]? 
<font-family>
+  (let (weight size height family retval)
+    (if (not (string-match " *\\([0-9.]+[^ /]+\\)" font))
+       (progn
+         (message "Malformed font shorthand: %s" font)
+         nil)
+      (setq weight (if (/= 0 (match-beginning 0))
+                      (substring font 0 (match-beginning 0)))
+           size (match-string 1 font)
+           font (substring font (match-end 0) nil))
+      (if (string-match " */ *\\([^ ]+\\) *" font)
+         ;; they specified a line-height as well
+         (setq height (match-string 1 font)
+               family (substring font (match-end 0) nil))
+       (if (string-match "^[ \t]+" font)
+           (setq family (substring font (match-end 0) nil))
+         (setq family font)))
+      (if weight
+         (push (cons 'font-weight (css-expand-value 'weight weight)) retval))
+      (if size
+         (push (cons 'font-size (css-expand-length size)) retval))
+      (if height
+         (push (cons 'line-height (css-expand-length height t)) retval))
+      (if family
+         (push (cons 'font-family (css-expand-value 'string-list family)) 
retval))
+      retval)))
+
+(if (not (fboundp 'frame-char-height))
+    (defun frame-char-height (&optional frame)
+      "Height in pixels of a line in the font in frame FRAME.
+If FRAME is omitted, the selected frame is used.
+For a terminal frame, the value is always 1."
+      (font-height (face-font 'default frame))))
+
+(defun css-expand-length (spec &optional height)
+  (cond
+   ((not (stringp spec)) spec)
+   ((string-equal spec "auto") nil)
+   ((and (string-match "\\([+-]?\\([0-9]+\\|[0-9]*\\.[0-9]+\\)\\)%" spec)
+        (fboundp 'frame-char-height))
+    ;; A percentage
+    (setq spec (/ (string-to-int (match-string 1 spec)) 100.0))
+    (if height
+       (round (* (frame-char-height) spec))
+      (max 0 (round (* (frame-char-width) spec)))))
+   ((string-match "\\([+-]?\\([0-9]+\\|[0-9]*\\.[0-9]+\\)\\)%" spec)
+    ;; No frame-char-width/height
+    (setq spec (/ (string-to-int (match-string 1 spec)) 100.0))
+    (if height
+       (max 0 (round (* (/ (frame-pixel-height) (frame-height)) spec)))
+      (max 0 (round (* (/ (frame-pixel-width) (frame-width)) spec)))))
+   ((string-match "\\([+-]?\\([0-9]+\\|[0-9]*\\.[0-9]+\\)\\)e[mx]" spec)
+    ;; Character based
+    (max 0 (round (string-to-number (match-string 1 spec)))))
+   (t
+    (truncate (font-spatial-to-canonical spec)))
+   )
+  )
+
+(defsubst css-unhex-char (x)
+  (if (> x ?9)
+      (if (>= x ?a)
+         (+ 10 (- x ?a))
+       (+ 10 (- x ?A)))
+    (- x ?0)))
+
+(defsubst css-pow (x n)
+  (apply '* (make-list n x)))
+
+(defun css-unhex (x)
+  (let ((ord (length x))
+       (rval 0))
+    (while (> ord 0)
+      (setq rval (+ rval
+                   (* (css-pow 16 (- (length x) ord))
+                      (css-unhex-char (aref x (1- ord)))))
+           ord (1- ord)))
+    rval))
+
+(defmacro css-symbol-list-as-regexp (&rest keys)
+  (` (eval-when-compile
+       (concat "^\\("
+              (mapconcat 'symbol-name
+                         (quote (, keys))
+                         "\\|") "\\)$"))))
+
+(defun css-expand-color (color)
+  (cond
+   ((string-match "^\\(transparent\\|none\\)$" color)
+    (setq color nil))
+   ((string-match "^#" color)
+    (let (r g b)
+      (cond
+       ((string-match "^#...$" color)
+       ;; 3-char rgb spec, expand out to six chars by replicating
+       ;; digits, not adding zeros.
+       (setq r (css-unhex (make-string 2 (aref color 1)))
+             g (css-unhex (make-string 2 (aref color 2)))
+             b (css-unhex (make-string 2 (aref color 3)))))
+       ((string-match "^#\\(..\\)\\(..\\)\\(..\\)$" color)
+       (setq r (css-unhex (match-string 1 color))
+             g (css-unhex (match-string 2 color))
+             b (css-unhex (match-string 3 color))))
+       (t
+       (setq color (substring color 1))
+       (let* ((n (/ (length color) 3))
+              (max (float (css-pow 16 n))))
+         (setq r (css-unhex (substring color 0 n))
+               g (css-unhex (substring color n (* n 2)))
+               b (css-unhex (substring color (* n 2) (* n 3)))
+               r (round (* (/ r max) 255))
+               g (round (* (/ g max) 255))
+               b (round (* (/ b max) 255))))))
+      (setq color (vector 'rgb r g b))))
+   ((string-match "^rgb *( *\\([0-9]+\\)[, ]+\\([0-9]+\\)[, ]+\\([0-9]+\\) *) 
*$" color)
+    ;; rgb(r,g,b) 0 - 255, cutting off at 255
+    (setq color (vector
+                'rgb
+                (min (string-to-int (match-string 1 color)) 255)
+                (min (string-to-int (match-string 2 color)) 255)
+                (min (string-to-int (match-string 3 color)) 255))))
+   ((string-match "^rgb *( *\\([0-9]+\\) *%[, ]+\\([0-9]+\\) *%[, 
]+\\([0-9]+\\) *% *) *$" color)
+    ;; rgb(r%,g%,b%) 0 - 100%, cutting off at 100%
+    (let ((r (min (string-to-number (match-string 1 color)) 100.0))
+         (g (min (string-to-number (match-string 2 color)) 100.0))
+         (b (min (string-to-number (match-string 3 color)) 100.0)))
+      (setq r (round (* r 2.55))
+           g (round (* g 2.55))
+           b (round (* b 2.55))
+           color (vector 'rgb r g b))))
+    (t
+     ;; Hmmm... pass it through unmangled and hope the underlying
+     ;; windowing system can handle it.
+     )
+    )
+  color
+  )
+
+(defun css-expand-value (type value)
+  (if value
+      (case type
+       (length                         ; CSS, Section 6.1
+        (setq value (css-expand-length value)))
+       (height
+        (setq value (css-expand-length value t)))
+       (percentage                     ; CSS, Section 6.2
+        (setq value (/ (string-to-number value)
+                       (if (fboundp 'float) (float 100) 1))))
+       (color                          ; CSS, Section 6.3
+        (setq value (css-expand-color value)))
+       (url                            ; CSS, Section 6.4
+        (declare (special url purl))
+        (if (string-match "url *(\\([^ )]+\\) *)" value)
+            (setq value (match-string 1 value)))
+        (if (string-match " *\\([^ ]+\\) *" value)
+            (setq value (match-string 1 value)))
+        (setq value (url-expand-file-name value (or url purl))))
+       (angle                          ; ACSS, Section 2.2.1
+        )
+       (time                           ; ACSS, Section 2.2.2
+        (let ((val (string-to-number value))
+              (units 'ms))
+          (if (string-match "^[0-9]+ *\\([a-zA-Z.]+\\)" value)
+              (setq units (intern (downcase (match-string 1 value)))))
+          (setq value (case units
+                        ((s second seconds)
+                         val)
+                        ((min minute minutes)
+                         (* val 60))
+                        ((hr hour hours)
+                         (* val 60 60))
+                        ((day days)
+                         (* val 24 60 60))
+                        (otherwise
+                         (/ val (float 1000)))))))
+       (elevation                      ; ACSS, Section 4.2
+        (if (string-match
+             (css-symbol-list-as-regexp below level above higher lower) value)
+            (setq value (intern (downcase (match-string value 1)))
+                  value (case value
+                          (below -90)
+                          (above 90)
+                          (level 0)
+                          (higher 45)
+                          (lower -45)
+                          ))
+          (setq value (css-expand-value 'angle value))))
+       (color-shorthand                ; CSS, Section 5.3.7
+        ;; color|image|repeat|attach|position
+        (let ((keys (split-string value " +"))
+              cur color image repeat attach position)
+          (while (setq cur (pop keys))
+            (cond
+             ((string-match "url" cur) ; Only image can have a URL
+              (setq image (css-expand-value 'url cur)))
+             ((string-match "%" cur)   ; Only position can have a perc.
+              (setq position (css-expand-value 'percentage cur)))
+             ((string-match "repeat" cur) ; Only repeat
+              (setq repeat (intern (downcase cur))))
+             ((string-match "scroll\\|fixed" cur)
+              (setq attach (intern (downcase (substring cur
+                                                        (match-beginning 0)
+                                                        (match-end 0))))))
+             ((string-match (css-symbol-list-as-regexp
+                             top center bottom left right) cur)
+              )
+             (t
+              (setq color (css-expand-value 'color cur)))))
+          (setq value (list (cons 'background-color color)
+                            (cons 'background-image image)
+                            (cons 'background-repeat repeat)
+                            (cons 'background-attachment attach)
+                            (cons 'background-position position)))))
+       (font                           ; CSS, Section 5.2.7
+        ;; [style | variant | weight]? size[/line-height]? family
+        (setq value (css-split-font-shorthand value)))
+       (border                         ; width | style | color
+        ;; FIXME
+        )
+       (border-shorthand               ; width | style | color
+        ;; FIXME
+        )
+       (list-style                     ; CSS, Section 5.6.6
+        ;; keyword | position | url
+        (setq value (split-string value "[ ,]+"))
+        (if (= (length value) 1)
+            (setq value (list (cons 'list-style-type
+                                    (intern (downcase (car value))))))
+          (setq value (list (cons 'list-style-type
+                                  (css-expand-value 'symbol (nth 0 value)))
+                            (cons 'list-style-position
+                                  (css-expand-value 'symbol (nth 1 value)))
+                            (cons 'list-style-image
+                                  (css-expand-value 'url (nth 2 value)))))))
+       (boundary-shorthand             ; CSS, Section 5.5.x
+        ;; length|percentage|auto {1,4}
+        (setq value (split-string value "[ ,]+"))
+        (let* ((top (intern (format "%s-top" type)))
+               (bottom (intern (format "%s-bottom" type)))
+               (left (intern (format "%s-left" type)))
+               (right (intern (format "%s-right" type))))
+          (setq top (cons top (css-expand-value (get top 'css-type)
+                                                (nth 0 value)))
+                right (cons right (css-expand-value (get right 'css-type)
+                                                    (nth 1 value)))
+                bottom (cons bottom (css-expand-value (get bottom 'css-type)
+                                                      (nth 2 value)))
+                left (cons left (css-expand-value (get left 'css-type)
+                                                  (nth 3 value)))
+                value (list top right bottom left))))
+       (weight                         ; CSS, Section 5.2.5
+        ;; normal|bold|bolder|lighter|[1-9]00
+        (cond
+         ((string-match "^[0-9]+" value)
+          (setq value (/ (string-to-number value) 100)
+                value (or (nth value css-weights) :bold)))
+         ((string-match (css-symbol-list-as-regexp normal bold bolder lighter)
+                        value)
+          (setq value (intern (downcase (concat ":" value)))))
+         (t (setq value (intern ":normal")))))
+       ;; The rest of these deal with how we handle things internally
+       ((symbol integer)               ; Read it in
+        (setq value (read (downcase value))))
+       (symbol-list                    ; A space/comma delimited symlist
+        (setq value (downcase value)
+              value (split-string value "[ ,]+")
+              value (mapcar 'intern value)))
+       (string-list                    ; A space/comma delimited list
+        (setq value (split-string value " *, *")))
+       (otherwise                      ; Leave it as is
+        t)
+       )
+    )
+  value
+  )
+
+(defun css-parse-args (st &optional nd)
+  ;; Return an assoc list of attribute/value pairs from a CSS style entry
+  (let (
+       name                            ; From name=
+       value                           ; its value
+       results                         ; Assoc list of results
+       name-pos                        ; Start of XXXX= position
+       val-pos                         ; Start of value position
+       (case-fold-search t)
+       )
+    (save-excursion
+      (if (stringp st)
+         (progn
+           (set-buffer (get-buffer-create " *css-style-temp*"))
+           (set-syntax-table css-syntax-table)
+           (erase-buffer)
+           (insert st)
+           (setq st (point-min)
+                 nd (point-max)))
+       (set-syntax-table css-syntax-table))
+      (save-restriction
+       (narrow-to-region st nd)
+       (goto-char (point-min))
+       (while (not (eobp))
+         (skip-chars-forward ";, \n\t")
+         (setq name-pos (point))
+         (skip-chars-forward "^ \n\t:,;")
+         (downcase-region name-pos (point))
+         (setq name (intern (buffer-substring name-pos (point))))
+         (skip-chars-forward " \t\n")
+         (if (not (eq (char-after (point)) ?:)) ; There is no value
+             (setq value nil)
+           (skip-chars-forward " \t\n:")
+           (setq val-pos (point)
+                 value
+                 (cond
+                  ((or (= (or (char-after val-pos) 0) ?\")
+                       (= (or (char-after val-pos) 0) ?'))
+                   (buffer-substring (1+ val-pos)
+                                     (condition-case ()
+                                         (prog2
+                                             (forward-sexp 1)
+                                             (1- (point))
+                                           (skip-chars-forward "\""))
+                                       (error
+                                        (skip-chars-forward "^ \t\n")
+                                        (point)))))
+                  (t
+                   (buffer-substring val-pos
+                                     (progn
+                                       (skip-chars-forward "^;")
+                                       (skip-chars-backward " \t")
+                                       (point)))))))
+         (setq value (css-expand-value (get name 'css-type) value))
+         (if (get name 'css-shorthand)
+             (setq results (append value results))
+           (setq results (cons (cons name value) results)))
+         (skip-chars-forward ";, \n\t"))
+       results))))
+
+(defun css-handle-media-directive (data active)
+  (let (type)
+    (if (string-match "\\([^ \t\r\n{]+\\)" data)
+       (setq type (intern (downcase (substring data (match-beginning 1)
+                                               (match-end 1))))
+             data (substring data (match-end 1)))
+      (setq type 'unknown))
+    (if (string-match "^[ \t\r\n]*{" data)
+       (setq data (substring data (match-end 0))))
+    (if (memq type active)
+       (save-excursion
+         (insert data)))))
+
+(defun css-handle-import (data)
+  (let (url)
+    (setq url (css-expand-value 'url data))
+    (and url
+        (let ((url-working-buffer (generate-new-buffer-name " *styleimport*"))
+              (url-mime-accept-string
+               "text/css ; level=2")
+              (sheet nil))
+          (save-excursion
+            (set-buffer (get-buffer-create url-working-buffer))
+            (setq url-be-asynchronous nil)
+            (url-retrieve url)
+            (css-clean-buffer)
+            (setq sheet (buffer-string))
+            (set-buffer-modified-p nil)
+            (kill-buffer (current-buffer)))
+          (insert sheet)))))
+
+(defun css-clean-buffer ()
+  ;; Nuke comments, etc.
+  (goto-char (point-min))
+  (let ((save-pos nil))
+    (while (search-forward "/*" nil t)
+      (setq save-pos (- (point) 2))
+      (delete-region save-pos
+                    (if (search-forward "*/" nil t)
+                        (point)
+                      (end-of-line)
+                      (point)))))
+  (goto-char (point-min))
+  (delete-matching-lines "^[ \t\r]*$") ; Nuke blank lines
+  (css-replace-regexp "^[ \t\r]+" "")  ; Nuke whitespace at beg. of line
+  (css-replace-regexp "[ \t\r]+$" "")  ; Nuke whitespace at end of line
+  (goto-char (point-min)))
+
+(if css-running-xemacs
+    (defun css-color-light-p (color-or-face)
+      (let (face color)
+       (cond
+        ((or (facep color-or-face)
+             (and (symbolp color-or-face)
+                  (find-face color-or-face)))
+         (setq color (specifier-instance (face-background color-or-face))))
+        ((color-instance-p color-or-face)
+         (setq color color-or-face))
+        ((color-specifier-p color-or-face)
+         (setq color (specifier-instance color-or-face)))
+        ((stringp color-or-face)
+         (setq color (make-color-instance color-or-face)))
+        (t (signal 'wrong-type-argument 'color-or-face-p)))
+       (if color
+           (not (< (apply '+ (color-instance-rgb-components color))
+                   (/ (apply '+ (color-instance-rgb-components
+                                 (make-color-instance "white"))) 3)))
+         t)))
+  (defun css-color-values (color)
+    (cond
+     ((eq window-system 'x)
+      (x-color-values color))
+     ((eq window-system 'pm)
+      (pm-color-values color))
+     ((eq window-system 'ns)
+      (ns-color-values color))
+     (t nil)))
+  (defun css-color-light-p (color-or-face)
+    (let (colors)
+      (cond
+       ((null window-system)
+       nil)
+       ((facep color-or-face)
+       (setq color-or-face (face-background color-or-face))
+       (if (null color-or-face)
+           (setq color-or-face (cdr-safe
+                                (assq 'background-color (frame-parameters)))))
+       (setq colors (css-color-values color-or-face)))
+       ((stringp color-or-face)
+       (setq colors (css-color-values color-or-face)))
+       ((font-rgb-color-p color-or-face)
+       (setq colors (list (font-rgb-color-red color-or-face)
+                          (font-rgb-color-green color-or-face)
+                          (font-rgb-color-blue color-or-face))))
+       (t
+       (signal 'wrong-type-argument 'color-or-face-p)))
+      (not (< (apply '+ colors)
+             (/ (apply '+ (css-color-values "white")) 3)))))
+  )
+
+(defun css-active-device-types (&optional device)
+  (let ((types (list 'all
+                    (if css-running-xemacs 'xemacs 'emacs)
+                    (if (css-color-light-p 'default) 'light 'dark)))
+       (type (device-type device)))
+    ;; For reasons I don't really want to get into, emacspeak and TTY
+    ;; are mutually exclusive for most of our purposes (insert-before,
+    ;; xetc)
+    (if (featurep 'emacspeak)
+       (setq types (cons 'speech types))
+      (if (eq type 'tty)
+         (setq types (cons 'tty types))))
+    (cond
+     ((eq 'color (device-class))
+      (if (not (device-bitplanes))
+         (setq types (cons 'color types))
+       (setq types
+             (append
+              (list (intern (format "%dbit-color"
+                                    (device-bitplanes)))
+                    (intern (format "%dbit"
+                                    (device-bitplanes)))
+                    'color) types))
+       (if (= 24 (device-bitplanes))
+           (setq types (cons 'truecolor types)))))
+     ((eq 'grayscale (device-class))
+      (setq types (append (list (intern (format "%dbit-grayscale"
+                                               (device-bitplanes)))
+                               'grayscale)
+                         types)))
+     ((eq 'mono (device-class))
+      (setq types (append (list 'mono 'monochrome) types)))
+     (t
+      (setq types (cons 'unknown types))))
+    ;; FIXME: Remove me when the real 3.0 comes out
+    (if (and (memq 'tty types) (memq 'color types))
+       (setq types (cons 'ansi-tty types)))
+    types))
+
+(defmacro css-rule-specificity-internal (rule)
+  (`
+   (progn
+     (setq tmp (cdr (, rule)))
+     (if (listp tmp)
+        (while tmp
+          (if (= ?# (aref (car tmp) 0))
+              (incf a)
+            (incf b))
+          (setq tmp (cdr tmp)))))))
+
+(defsubst css-specificity (rule)
+  ;; To find specificity, according to the september 1996 CSS draft
+  ;; a = # of ID attributes in the selector
+  ;; b = # of class attributes in the selector
+  ;; c = # of tag names in the selector
+  (let ((a 0) (b 0) (c 0) cur tmp)
+    (if (not (listp (car rule)))
+       (css-rule-specificity-internal rule)
+      (setq c (length rule))
+      (while rule
+       (css-rule-specificity-internal (pop rule))))
+    (+ (* 100 a) (* 10 b) c)
+    )
+  )
+
+(defun css-copy-stylesheet (sheet)
+  (let ((new (make-hash-table :size (hash-table-count sheet))))
+    (cl-maphash
+     (function
+      (lambda (k v)
+       (cl-puthash k (copy-tree v) new))) sheet)
+    new))
+
+(defsubst css-store-rule (attrs applies-to)
+  (declare (special sheet))
+  (let (rules cur tag node)
+    (while applies-to
+      (setq cur (pop applies-to)
+           tag (car cur))
+      (if (listp tag)
+         (setq tag (car tag)))
+      (setq rules (cl-gethash tag sheet))
+      (cond
+       ((null rules)
+       ;; First rule for this tag.  Create new ruleset
+       (cl-puthash tag (list (cons cur attrs)) sheet))
+       ((setq node (assoc cur rules))
+       ;; Similar rule already exists, splice in our information
+       (setcdr node (append attrs (cdr node))))
+       (t
+       ;; First rule for this particular combination of tag/ancestors/class.
+       ;; Slap it onto the existing set of rules and push back into sheet.
+       (setq rules (cons (cons cur attrs) rules))
+       (cl-puthash tag rules sheet))
+       )
+      )
+    )
+  )
+
+(defun css-parse (url &optional string inherit)
+  (let (
+       (url-mime-accept-string
+        "text/css ; level=2")
+       (save-pos nil)
+       (applies-to nil)                ; List of tags to apply style to
+       (attrs nil)                     ; List of name/value pairs
+       (att nil)
+       (cur nil)
+       (val nil)
+       (device-type nil)
+       (purl (url-view-url t))
+       (active-device-types (css-active-device-types (selected-device)))
+       (sheet inherit))
+    (if (not sheet)
+       (setq sheet (make-hash-table :size 13 :test 'eq)))
+    (save-excursion
+      (set-buffer (get-buffer-create
+                  (generate-new-buffer-name " *style*")))
+      (set-syntax-table css-syntax-table)
+      (erase-buffer)
+      (if url (url-insert-file-contents url))
+      (goto-char (point-max))
+      (if string (insert string))
+      (css-clean-buffer)
+      (goto-char (point-min))
+      (while (not (eobp))
+       (setq save-pos (point))
+       (cond
+        ;; *sigh* SGML comments are being used to 'hide' data inlined
+        ;; with the <style> tag from older browsers.
+        ((or (looking-at "<!--+")      ; begin
+             (looking-at "--+>"))      ; end
+         (goto-char (match-end 0)))
+        ;; C++ style comments
+        ((looking-at "[ \t]*//")
+         (end-of-line))
+        ;; Pre-Processor directives
+        ((looking-at "[ address@hidden([^ \t\r\n]\\)")
+         (let (data directive)
+           (skip-chars-forward " @\t\r") ; Past any leading whitespace
+           (setq save-pos (point))
+           (skip-chars-forward "^ \t\r\n") ; Past the @ directive
+           (downcase-region save-pos (point))
+           (setq directive (intern (buffer-substring save-pos (point))))
+           (skip-chars-forward " \t\r")
+           (setq save-pos (point))
+           (cond
+            ((looking-at "[^{]*\\({\\)")
+             (goto-char (match-beginning 1))
+             (forward-sexp 1)
+             (setq data (buffer-substring save-pos (1- (point)))))
+            ((looking-at "[\"']+")
+             (setq save-pos (1+ save-pos))
+             (forward-sexp 1)
+             (setq data (buffer-substring save-pos (1- (point)))))
+            (t
+             (skip-chars-forward "^;")))
+           (if (not data)
+               (setq data (buffer-substring save-pos (point))))
+           (setq save-pos (point))
+           (case directive
+            (import (css-handle-import data))
+            (media (css-handle-media-directive data active-device-types))
+            (t (message "Unknown directive in stylesheet: @%s" directive)))))
+        ;; Giving us some output device information, old way
+        ((looking-at "[ \t\r]*:\\([^: \n]+\\):")
+         (downcase-region (match-beginning 1) (match-end 1))
+         (setq device-type (intern (buffer-substring (match-beginning 1)
+                                                     (match-end 1))))
+         (goto-char (match-end 0))
+         (if (not (memq device-type active-device-types))
+             ;; Not applicable to us... skip the info
+             (progn
+               (if (re-search-forward ":[^:{ ]*:" nil t)
+                   (goto-char (match-beginning 0))
+                 (goto-char (point-max))))))
+        ;; Default is to treat it like a stylesheet declaration
+        (t
+         (skip-chars-forward "^{")
+         ;;(downcase-region save-pos (point))
+         (setq applies-to (css-applies-to save-pos (point)))
+         (skip-chars-forward "^{")
+         (setq save-pos (point))
+         (condition-case ()
+             (forward-sexp 1)
+           (error (goto-char (point-max))))
+         (skip-chars-backward "\r}")
+         (subst-char-in-region save-pos (point) ?\n ? )
+         (subst-char-in-region save-pos (point) ?\r ? )
+         ;; This is for not choking on garbage at the end of the buffer.
+         ;; I get bit by this every once in a while when going through my
+         ;; socks gateway.
+         (if (eobp)
+             nil
+           (setq attrs (css-parse-args (1+ save-pos) (point)))
+           (skip-chars-forward "}\r\n")
+           (css-store-rule attrs applies-to))
+         )
+        )
+       (skip-chars-forward " \t\r\n"))
+      (set-buffer-modified-p nil)
+      (kill-buffer (current-buffer)))
+    sheet)
+  )
+
+;; Tools for pretty-printing an existing stylesheet.
+(defun css-rule-name (rule)
+  (cond
+   ((listp (car rule))                 ; Contextual
+    (mapconcat 'css-rule-name 
+              (reverse rule) " "))
+   ((listp (cdr rule))                 ; More than one class
+    (let ((classes (cdr rule))
+         (rval (symbol-name (car rule))))
+      (while classes
+       (setq rval (concat rval
+                          (if (= (aref (car classes) 0) ?:)
+                              (pop classes)
+                            (concat "." (pop classes))))))
+      rval))
+   (t
+    (symbol-name (car rule)))))
+
+(defun css-display (sheet)
+  (with-output-to-temp-buffer "CSS Stylesheet"
+    (set-buffer standard-output)
+    (indented-text-mode)
+    (insert "# Stylesheet auto-regenerated by css.el\n#\n"
+           "# This is a mixture of the default stylesheet and any\n"
+           "# styles specified by the document.  The rules are in no\n"
+           "# particular order.\n\n")
+    (let (tmp cur goal-col)
+      (cl-maphash
+       (function
+       (lambda (k v)
+         (while v
+           (setq cur (pop v))
+           (insert (css-rule-name (car cur)))
+           (insert " { ")
+           (setq goal-col (point))
+           (insert "\n")
+           ;; Display the rules
+           (setq tmp (cdr cur))
+           (let (prop val)
+             (while tmp
+               (setq prop (caar tmp)
+                     val (cdar tmp)
+                     tmp (cdr tmp))
+               (case (get prop 'css-type)
+                 (symbol-list
+                  (setq val (mapconcat 'symbol-name val ",")))
+                 (weight
+                  (setq val (substring (symbol-name val) 1 nil)))
+                 (otherwise
+                  nil)
+                 )
+               (insert (format "  %s: %s;\n" prop val))))
+           (insert "}\n\n");
+           )))
+       sheet))))
+
+(provide 'css)
diff --git a/lisp/descrip.mms b/lisp/descrip.mms
new file mode 100644
index 0000000..474927f
--- /dev/null
+++ b/lisp/descrip.mms
@@ -0,0 +1,80 @@
+# where the w3 lisp files should go
+prefix  = gnu_root
+datadir = $(prefix):[lib]
+lispdir = $(prefix):[lib.emacs.site-lisp]
+confdir = $(prefix):[lib.emacs.w3]
+
+EMACS = emacs
+ECHO  = write sys$output
+MKDIR = create/dir
+
+############## no user servicable parts beyond this point ###################
+# Have to preload a few things to get a nice clean compile
+
+EMACS     = emacs
+WIDGETDIR = 
+
+DEPS = -l sys$disk:[]vmsloadup.el
+
+# compile with noninteractive and relatively clean environment
+BATCHFLAGS = -batch -q -no-site-file
+
+URLSOURCES = \
+       url-nfs.el url-file.el url-cookie.el url-parse.el url-irc.el    \
+       url-gopher.el url-http.el url-mail.el url-misc.el url-news.el   \
+       url-vars.el url-auth.el mm.el md5.el url-gw.el ssl.el base64.el \
+       url.el socks.el url-cache.el url-ns.el
+
+URLOBJECTS    = $(URLSOURCES:.el=.elc)
+
+SOURCES = \
+       mule-sysdp.el w3-widget.el devices.el w3-imap.el                \
+       css.el dsssl.el dsssl-flow.el font.el images.el w3-vars.el      \
+       w3-cus.el w3-style.el w3-keyword.el w3-forms.el w3-emulate.el   \
+       w3-props.el w3-auto.el w3-menu.el w3-mouse.el w3-toolbar.el     \
+       w3-speak.el w3-latex.el w3-parse.el w3-display.el               \
+       w3-print.el w3-about.el w3-hot.el w3-e19.el w3-xemac.el w3.el   \
+       w3-script.el w3-jscript.el w3-elisp.el w3-e20.el                \
+       auto-autoloads.el custom-load.el w3-speak-table.el
+
+OBJECTS = $(SOURCES:.el=.elc)
+
+AUTOSOURCES = auto-autoloads.el custom-load.el w3-auto.el
+AUTOOBJECTS = $(AUTOSOURCES:.el=.elc)
+
+ALLSOURCES = $(SOURCES) $(URLSOURCES) $(AUTOSOURCES)
+ALLOBJECTS = $(OBJECTS) $(URLOBJECTS) $(AUTOOBJECTS)
+
+# Warning!  Currently, the following file can _NOT_ be bytecompiled.
+EXTRAS = w3-sysdp.el docomp.el
+
+.SUFFIXES: .elc .el
+
+.el.elc:
+       $(EMACS) $(BATCHFLAGS) $(DEPS) -f batch-byte-compile $(MMS$SOURCE)
+
+all:   w3
+
+w3:    $(SOURCES) $(EXTRAS) $(OBJECTS)
+       @echo Build of w3 complete...
+
+fast:  $(SOURCES) $(EXTRAS)
+       $(EMACS) $(BATCHFLAGS) $(DEPS) -f batch-byte-compile $(SOURCES)
+
+install: all
+       @$(ECHO) Installing in $(lispdir)
+       if f$parse("$(lispdir)") .eqs. "" then $(MKDIR) $(lispdir)
+       copy/log $(SOURCES),$(OBJECTS),$(EXTRAS) $(lispdir)
+       - purge/log $(lispdir)
+
+distclean: clean
+       $(RM) config.* Makefile
+
+clean:
+       $(RM) $(OBJECTS)
+
+w3-vars.elc: w3-cus.elc w3-vars.el
+w3-display.elc: w3-display.el css.elc font.elc w3-imap.elc
+css.elc: css.el font.elc
+w3.elc: css.elc w3-vars.elc w3.el
+dsssl.elc: dsssl.el dsssl-flow.elc
diff --git a/lisp/devices.el b/lisp/devices.el
new file mode 100644
index 0000000..bc28c07
--- /dev/null
+++ b/lisp/devices.el
@@ -0,0 +1,342 @@
+;;; devices.el -- XEmacs device API emulation
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:07 $
+;; Version: $Revision: 1.1 $
+;; Keywords: 
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; This is a complete implementation of all the device-* functions found in
+;; XEmacs 19.14.  A 'device' for Emacs 19 is just a frame, from which we can
+;; determine the connection to an X display, etc.
+
+(require 'cl)
+(eval-when-compile
+  (if (string-match "XEmacs" (emacs-version))
+      (set 'byte-optimize nil)))
+    
+(if (string-match "XEmacs" (emacs-version))
+    nil
+'()
+(defalias 'selected-device 'ignore)
+(defalias 'device-or-frame-p 'framep)
+(defalias 'device-console 'ignore)
+(defalias 'device-sound-enabled-p 'ignore)
+(defalias 'device-live-p 'frame-live-p)
+(defalias 'devicep 'framep)
+(defalias 'frame-device 'identity)
+(defalias 'redisplay-device 'redraw-frame)
+(defalias 'redraw-device 'redraw-frame)
+(defalias 'select-device 'select-frame)
+(defalias 'set-device-class 'ignore)
+
+(defun make-device (type connection &optional props)
+  "Create a new device of type TYPE, attached to connection CONNECTION.
+
+The valid values for CONNECTION are device-specific; however,
+CONNECTION is generally a string. (Specifically, for X devices,
+CONNECTION should be a display specification such as \"foo:0\", and
+for TTY devices, CONNECTION should be the filename of a TTY device
+file, such as \"/dev/ttyp4\", or nil to refer to XEmacs' standard
+input/output.)
+
+PROPS, if specified, should be a plist of properties controlling
+device creation.
+
+If CONNECTION specifies an already-existing device connection, that
+device is simply returned; no new device is created, and PROPS
+have no effect."
+  (cond
+   ((and (eq type 'x) connection)
+    (make-frame-on-display connection props))
+   ((eq type 'x)
+    (make-frame props))
+   ((eq type 'tty)
+    nil)
+   (t
+    (error "Unsupported device-type: %s" type))))
+
+(defun make-frame-on-device (type connection &optional props)
+  "Create a frame of type TYPE on CONNECTION.
+TYPE should be a symbol naming the device type, i.e. one of
+
+x      An X display.  CONNECTION should be a standard display string
+       such as \"unix:0\", or nil for the display specified on the
+       command line or in the DISPLAY environment variable.  Only if
+       support for X was compiled into XEmacs.
+tty    A standard TTY connection or terminal.  CONNECTION should be
+       a TTY device name such as \"/dev/ttyp2\" (as determined by
+       the Unix command `tty') or nil for XEmacs' standard input
+       and output (usually the TTY in which XEmacs started).  Only
+       if support for TTY's was compiled into XEmacs.
+ns     A connection to a machine running the NeXTstep windowing
+       system.  Not currently implemented.
+win32  A connection to a machine running Microsoft Windows NT or
+       Windows 95.  Not currently implemented.
+pc     A direct-write MS-DOS frame.  Not currently implemented.
+
+PROPS should be an plist of properties, as in the call to `make-frame'.
+
+If a connection to CONNECTION already exists, it is reused; otherwise,
+a new connection is opened."
+  (make-device type connection props))
+
+(defun make-tty-device (&optional tty terminal-type)
+  "Create a new device on TTY.
+  TTY should be the name of a tty device file (e.g. \"/dev/ttyp3\" under
+SunOS et al.), as returned by the `tty' command.  A value of nil means
+use the stdin and stdout as passed to XEmacs from the shell.
+  If TERMINAL-TYPE is non-nil, it should be a string specifying the
+type of the terminal attached to the specified tty.  If it is nil,
+the terminal type will be inferred from the TERM environment variable."
+  (make-device 'tty tty (list 'terminal-type terminal-type)))
+
+(defun make-x-device (&optional display)
+  (make-device 'x display))
+
+(defun set-device-selected-frame (device frame)
+  "Set the selected frame of device object DEVICE to FRAME.
+If DEVICE is nil, the selected device is used.
+If DEVICE is the selected device, this makes FRAME the selected frame."
+  (select-frame frame))
+
+(defun set-device-baud-rate (device rate)
+  "Set the output baud rate of DEVICE to RATE.
+On most systems, changing this value will affect the amount of padding
+and other strategic decisions made during redisplay."
+  (setq baud-rate rate))
+
+(defun dfw-device (obj)
+  "Given a device, frame, or window, return the associated device.
+Return nil otherwise."
+  (cond
+   ((windowp obj)
+    (window-frame obj))
+   ((framep obj)
+    obj)
+   (t
+    nil)))
+
+(defun event-device (event)
+  "Return the device that EVENT occurred on.
+This will be nil for some types of events (e.g. keyboard and eval events)."
+  (dfw-device (posn-window (event-start event))))
+
+(defun device-connection (&optional device)
+  "Return the connection of the specified device.
+DEVICE defaults to the selected device if omitted"
+  (or (cdr-safe (assq 'display (frame-parameters device))) "stdio"))
+
+(defun find-device (connection &optional type)
+  "Look for an existing device attached to connection CONNECTION.
+Return the device if found; otherwise, return nil.
+
+If TYPE is specified, only return devices of that type; otherwise,
+return devices of any type. (It is possible, although unlikely,
+that two devices of different types could have the same connection
+name; in such a case, the first device found is returned.)"
+  (let ((devices (device-list))
+       (retval nil))
+    (while (and devices (not nil))
+      (if (equal connection (device-connection (car devices)))
+         (setq retval (car devices)))
+      (setq devices (cdr devices)))
+    retval))
+
+(defalias 'get-device 'find-device)
+
+(defmacro device-baud-rate (&optional device)
+  "Return the output baud rate of DEVICE."
+  'baud-rate)
+
+(defun device-on-window-system-p (&optional device)
+  "Return non-nil if DEVICE is on a window system.
+This generally means that there is support for the mouse, the menubar,
+the toolbar, glyphs, etc."
+  (and (cdr-safe (assq 'display (frame-parameters device))) t))
+
+(defun device-name (&optional device)
+  "Return the name of the specified device."
+  (or (cdr-safe (assq 'display (frame-parameters device))) "stdio"))
+
+(defun device-frame-list (&optional device)
+  "Return a list of all frames on DEVICE.
+If DEVICE is nil, the selected device will be used."
+  (let ((desired (device-connection device)))
+    (filtered-frame-list (function (lambda (x) (equal (device-connection x)
+                                                     desired))))))
+(defun device-list ()
+  "Return a list of all devices"
+  (let ((seen nil)
+       (cur nil)
+       (conn nil)
+       (retval nil)
+       (not-heard (frame-list)))
+    (while not-heard
+      (setq cur (car not-heard)
+           conn (device-connection cur)
+           not-heard (cdr not-heard))
+      (if (member conn seen)
+         nil                           ; Already got it
+       (setq seen (cons conn seen)     ; Whoo hoo, a new one!
+             retval (cons cur retval))))
+    retval))
+
+(defvar delete-device-hook nil
+  "Function or functions to call when a device is deleted.
+One argument, the to-be-deleted device.")
+
+(defun delete-device (device &optional force)
+  "Delete DEVICE, permanently eliminating it from use.
+Normally, you cannot delete the last non-minibuffer-only frame (you must
+use `save-buffers-kill-emacs' or `kill-emacs').  However, if optional
+second argument FORCE is non-nil, you can delete the last frame. (This
+will automatically call `save-buffers-kill-emacs'.)"
+  (let ((frames (device-frame-list device)))
+    (run-hook-with-args 'delete-device-hook device)
+    (while frames
+      (delete-frame (car frames) force)
+      (setq frames (cdr frames)))))
+
+(defun device-color-cells (&optional device)
+  (case window-system
+    ((x win32 w32 pm) (x-display-color-cells device))
+    (ns (ns-display-color-cells device))
+    (otherwise 1)))
+
+(defun device-pixel-width (&optional device)
+  (case window-system
+    ((x win32 w32 pm) (x-display-pixel-width device))
+    (ns (ns-display-pixel-width device))
+    (otherwise (frame-width device))))
+
+(defun device-pixel-height (&optional device)
+  (case window-system
+    ((x win32 w32 pm) (x-display-pixel-height device))
+    (ns (ns-display-pixel-height device))
+    (otherwise (frame-height device))))
+
+(defun device-mm-width (&optional device)
+  (case window-system
+    ((x win32 w32 pm) (x-display-mm-width device))
+    (ns (ns-display-mm-width device))
+    (otherwise nil)))
+
+(defun device-mm-height (&optional device)
+  (case window-system
+    ((x win32 w32 pm) (x-display-mm-height device))
+    (ns (ns-display-mm-height device))
+    (otherwise nil)))
+
+(defun device-bitplanes (&optional device)
+  (case window-system
+    ((x win32 w32 pm) (x-display-planes device))
+    (ns (ns-display-planes device))
+    (otherwise 2)))
+
+(defun device-class (&optional device)
+  (case window-system
+    (x                                 ; X11
+     (cond
+      ((fboundp 'x-display-visual-class)
+       (let ((val (symbol-name (x-display-visual-class device))))
+        (cond
+         ((string-match "color" val) 'color)
+         ((string-match "gray-scale" val) 'grayscale)
+         (t 'mono))))
+      ((fboundp 'x-display-color-p)
+       (if (x-display-color-p device)
+          'color
+        'mono))
+      (t 'color)))
+    (pm                                        ; OS/2 Presentation Manager
+     (cond
+      ((fboundp 'pm-display-visual-class)
+       (let ((val (symbol-name (pm-display-visual-class device))))
+        (cond
+         ((string-match "color" val) 'color)
+         ((string-match "gray-scale" val) 'grayscale)
+         (t 'mono))))
+      ((fboundp 'pm-display-color-p)
+       (if (pm-display-color-p device)
+          'color
+        'mono))
+      (t 'color)))
+    (ns
+     (cond
+      ((fboundp 'ns-display-visual-class)
+       (let ((val (symbol-name (ns-display-visual-class device))))
+        (cond
+         ((string-match "color" val) 'color)
+         ((string-match "gray-scale" val) 'grayscale)
+         (t 'mono))))
+      ((fboundp 'ns-display-color-p)
+       (if (ns-display-color-p device)
+          'color
+        'mono))
+      (t 'mono)))
+    (otherwise 'color)))
+
+(defun device-class-list ()
+  "Returns a list of valid device classes."
+  (list 'color 'grayscale 'mono))
+
+(defun valid-device-class-p (class)
+  "Given a CLASS, return t if it is valid.
+Valid classes are 'color, 'grayscale, and 'mono."
+  (memq class (device-class-list)))
+
+(defun device-or-frame-type (device-or-frame)
+  "Return the type (e.g. `x' or `tty') of DEVICE-OR-FRAME.
+DEVICE-OR-FRAME should be a device or a frame object.  See `device-type'
+for a description of the possible types."
+  (or window-system 'tty))
+
+(defun device-type (&optional device)
+  "Return the type of the specified device (e.g. `x' or `tty').
+Value is `tty' for a tty device (a character-only terminal),
+`x' for a device which is a connection to an X server,
+'ns' for a device which is a connection to a NeXTStep dps server,
+'win32' or 'w32' for a Windows-NT window,
+'pm' for an OS/2 Presentation Manager window,
+'intuition' for an Amiga screen"
+  (device-or-frame-type device))
+
+(defun device-type-list ()
+  "Return a list of valid console types."
+  (if window-system
+      (list window-system 'tty)
+    (list 'tty)))
+
+(defun valid-device-type-p (type)
+  "Given a TYPE, return t if it is valid."
+  (memq type (device-type-list)))
+
+) ; This closes the conditional on whether we are in XEmacs or not
+
+(provide 'devices)
+
+(eval-when-compile
+  (if (string-match "XEmacs" (emacs-version))
+      (set 'byte-optimize t)))
diff --git a/lisp/docomp.el b/lisp/docomp.el
new file mode 100644
index 0000000..235c6b3
--- /dev/null
+++ b/lisp/docomp.el
@@ -0,0 +1,119 @@
+(setq load-path (append (list (expand-file-name "./")
+                             (or (getenv "WIDGETDIR")
+                                 (expand-file-name "../widget"))
+                             (or (getenv "GNUSDIR")
+                                 (expand-file-name "../gnus"))
+                             )
+                       load-path))
+
+(setq max-specpdl-size (* 10 max-specpdl-size)
+      max-lisp-eval-depth (* 10 max-lisp-eval-depth))
+
+(defun w3-declare-variables (&rest args)
+  (while args
+    (eval (list 'defvar (car args) nil ""))
+    (setq args (cdr args))))
+
+;; For Emacs 19
+(w3-declare-variables 'track-mouse 'menu-bar-help-menu 'menu-bar-mode
+                     'global-face-data)
+
+;; For XEmacs/Lucid
+(w3-declare-variables 'current-menubar 'default-menubar 'extent
+                     'mode-motion-hook 'mode-popup-menu 'sound-alist
+                     'menubar-visible-p
+                     'inhibit-help-echo 'default-toolbar
+                     'bottom-toolbar-height 'top-toolbar-height
+                     'toolbar-buttons-captioned-p
+                     'right-toolbar-width 'left-toolbar-width
+                     'top-toolbar 'bottom-toolbar 'right-toolbar
+                     'left-toolbar 'device-fonts-cache
+                     'has-modeline-p 'baud-rate)
+
+;; For MULE
+(w3-declare-variables '*noconv* '*autoconv* '*euc-japan* '*internal*
+                     'w3-mime-list-for-code-conversion 'lc-ltn1
+                     'mule-version 'enable-multibyte-characters
+                     'mc-flag 'charset-latin-iso8859-1
+                     'default-enable-multibyte-characters
+                     'buffer-file-coding-system
+                     'file-coding-system-for-read 'file-coding-system)
+
+;; For TM
+(w3-declare-variables 'mime/editor-mode-flag 'mime-tag-format)
+                         
+;; For NNTP
+(w3-declare-variables 'nntp-server-buffer 'nntp-server-process 'nntp/connection
+                     'gnus-nntp-server 'nntp-server-name 'nntp-version
+                     'gnus-default-nntp-server)
+
+;; For xpm-button
+(w3-declare-variables 'x-library-search-path)
+
+;; For emacspeak
+(w3-declare-variables 'dtk-voice-table 'dtk-punctuation-mode)
+
+;; For a few internal things
+(w3-declare-variables 'tag 'w3-working-buffer 'proxy-info 'args
+                     'w3-image-widgets-waiting 'w3-form-info
+                     'w3-last-parse-tree 'command-line-args-left
+                     'standard-display-table 'w3-html-bookmarks
+                     'browse-url-browser-function 'widget-keymap)
+
+;; GNUS
+(w3-declare-variables 'gnus-group-buffer 'gnus-version)                      
+
+;; If we are building w3 in a different directory than the source
+;; directory, we must read *.el from source directory and write *.elc
+;; into the building directory.  For that, we define this function
+;; before loading bytecomp.  Bytecomp doesn't overwrite this function.
+(defun byte-compile-dest-file (filename)
+  "Convert an Emacs Lisp source file name to a compiled file name.
+ In addition, remove directory name part from FILENAME."
+  (setq filename (byte-compiler-base-file-name filename))
+  (setq filename (file-name-sans-versions filename))
+  (setq filename (file-name-nondirectory filename))
+  (cond ((eq system-type 'vax-vms)
+        (concat (substring filename 0 (string-match ";" filename)) "c"))
+       ((string-match emacs-lisp-file-regexp filename)
+        (concat (substring filename 0 (match-beginning 0)) ".elc"))
+       (t (concat filename ".elc"))))
+
+(require 'bytecomp)
+
+;; Emacs 19 byte compiler complains about too much stuff by default.
+;; Turn off most of the warnings here.
+(setq byte-compile-warnings '(free-vars)
+      byte-optimize t)
+
+;; This is part of bytecomp.el in 19.35: Without it, any defvar'd
+;; variables show up as 'free variables' to the byte compiler, which
+;; is bogus.
+(if (not (get 'custom-declare-variable 'byte-hunk-handler))
+    (progn
+      (put 'custom-declare-variable 'byte-hunk-handler
+          'byte-compile-file-form-custom-declare-variable)
+      (defun byte-compile-file-form-custom-declare-variable (form)
+       (if (memq 'free-vars byte-compile-warnings)
+           (setq byte-compile-bound-variables
+                 (cons (nth 1 (nth 1 form)) byte-compile-bound-variables)))
+       form)))
+
+(defun compile-it ()
+  (let ((files (directory-files "." t ".*.el$" nil)))
+    (while files
+      (if (and (not (file-directory-p (car files)))
+              (not (string-match "w3-sysdp.el$" (car files))))
+         (byte-compile-file (car files)))
+      (setq files (cdr files)))))
+
+(autoload 'w3-load-flavors "w3")
+
+(w3-load-flavors)
+(w3-setup-version-specifics)
+
+(require 'cl)
+(require 'w3-sysdp)
+(require 'w3-vars)
+(require 'url)
+(require 'mm)
diff --git a/lisp/dsssl-flow.el b/lisp/dsssl-flow.el
new file mode 100644
index 0000000..33614a8
--- /dev/null
+++ b/lisp/dsssl-flow.el
@@ -0,0 +1,124 @@
+;;; dsssl-flow.el --- DSSSL flow objects
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:07 $
+;; Version: $Revision: 1.1 $
+;; Keywords: 
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996, 1997 by William M. Perry <address@hidden>
+;;; Copyright (c) 1997 - 1998 by Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defstruct flow-object
+  (type 'unknown :read-only t)         ; Name of this flow object
+  (properties nil)
+  (children nil)
+  (parent nil)
+  )
+
+(defstruct dsssl-flow-processor
+  (name 'unknown :read-only t)         ; Name of this processing backend
+  (init nil)                           ; initialize the backend
+  (handler nil)                                ; handle a single flow object
+  (sizeof nil)                         ; get size of a single flow object
+  (clean nil)                          ; cleanup instance of backend
+  )
+
+(defvar dsssl-flow-active-faces nil)
+(defvar dsssl-flow-active-voices nil)
+(make-variable-buffer-local 'dsssl-flow-active-faces)
+(make-variable-buffer-local 'dsssl-flow-active-voices)
+
+(defun dsssl-flow-display (flows processor)
+  (let ((handler (dsssl-flow-processor-handler processor))
+       (flow-stack (list flows))
+       (content nil)
+       (node nil)
+       (last-object nil)
+       )
+    (while flow-stack
+      (setq content (pop flow-stack))
+      (dsssl-flow-progress-meter)
+      ;; Handle the element's content
+      (while content
+       (dsssl-flow-progress-meter)
+       (if (stringp (car content))
+           (dsssl-flow-handle-string-content (pop content))
+         (setq node (pop content))
+         ;; todo: collect all information about this flow object for faster
+         ;; lookup later.
+         (push (dsssl-flow-face-for-element node) dsssl-flow-active-faces)
+         (push (dsssl-flow-voice-for-element node) dsssl-flow-active-voices))
+         (case (flow-object-type node)
+           ;; Core DSSL components  basic flow object classes
+           (sequence                   ; 12.6.1
+            )
+           (display-group              ; 12.6.2
+            )
+           (paragraph                  ; 12.6.6
+            )
+           (paragraph-break            ; 12.6.7
+            )
+           (external-graphic           ; 12.6.15
+            )
+           ;; DSSSL options required in DSSSL online
+           ;; Simple page flow object class
+           (simple-page-sequence       ; 12.6.3
+            )
+           ;; Table flow object classes
+           (table                      ; 12.6.27.1
+            )
+           (table-part                 ; 12.6.27.2
+            )
+           (table-column               ; 12.6.27.3
+            )
+           (table-row                  ; 12.6.27.5
+            )
+           (table-border               ; 12.6.27.7
+            )
+           (table-cell                 ; 12.6.27.6
+            ;; Do we need to handle table-cell at this level, or is that
+            ;; something that the display backend needs to handle, and we
+            ;; just query that in the `table-row' processor?
+            )
+           ;; Online display flow object classes
+           (vertical-scroll            ; 12.6.28.1
+            )
+           (multi-mode                 ; 12.6.28.2
+            )
+           (marginalia                 ; 12.6.28.4
+            )
+           ;; Emacs/W3 specific flow objects
+           (applet                     ; Wow, Java
+            )
+           (script                     ; Scripts
+            )
+           (form-element               ; Any form element
+            )
+           ;; pinhead, flame, and cookie can now all be handled by
+           ;; a stud-muffing DSSSL stylesheet - hooray!
+
+           ;; Generic formatting - all things that can be fully specified
+           ;; by a CSS stylesheet.
+           (otherwise
+            ;; handle the content
+            (dsssl-flow-handle-content node)))))))
+
+(provide 'dsssl-flow)
diff --git a/lisp/dsssl.el b/lisp/dsssl.el
new file mode 100644
index 0000000..54708f1
--- /dev/null
+++ b/lisp/dsssl.el
@@ -0,0 +1,492 @@
+;;; dsssl.el --- DSSSL parser
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:07 $
+;; Version: $Revision: 1.1 $
+;; Keywords: 
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996, 1997 by William M. Perry <address@hidden>
+;;; Copyright (c) 1997 - 1998 by Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'cl)
+(require 'dsssl-flow)
+
+(if (not (fboundp 'cl-copy-hashtable))
+    (defun cl-copy-hashtable (h)
+      (let ((new (make-hash-table)))
+       (cl-maphash (function (lambda (k v) (cl-puthash k v new))) h)
+       new)))
+
+(defconst dsssl-builtin-functions
+  '(not boolean\?  case equal\?  null\?  list\?  list length append
+       reverse list-tail list-ref member symbol\?  keyword\?  quantity\?
+       number\?  real\?  integer\?  = < > <= >= + * - / max min abs quotient
+       modulo remainder floor ceiling truncate round number->string
+       string->number char\?  char=\?  char-property string\?  string
+       string-length string-ref string=\?  substring string-append
+       procedure\?  apply external-procedure make time time->string quote
+       char-downcase identity error let)
+  "A list of all the builtin DSSSL functions that we support.")
+
+(defsubst dsssl-check-args (args expected)
+  ;; Signal an error if we don't have the expected # of arguments
+  (or (= (length args) expected)
+      (error "Wrong # arguments (expected %d): %d" expected (length args))))
+
+(defsubst dsssl-min-args (args min)
+  (or (>= (length args) min)
+      (error "Wrong # arguments (expected at least %d): %d" min
+            (length args))))
+
+(defun dsssl-call-function (func args)
+  (declare (special defines units))
+  (let ((old-defines nil)
+       (old-units nil)
+       (func-args (nth 1 func))
+       (real-func (nth 2 func))
+       (retval nil))
+    ;; Make sure we got the right # of arguments
+    (dsssl-check-args args (length func-args))
+
+    ;; make sure we evaluate all the arguments in the old environment
+    (setq args (mapcar 'dsssl-eval args))
+
+    ;; Save the old environment
+    (setq old-defines (cl-copy-hashtable defines)
+         old-units (cl-copy-hashtable units))
+    
+    ;; Create the function's environment
+    (while func-args
+      (cl-puthash (car func-args) (car args) defines)
+      (setq func-args (cdr func-args)
+           args (cdr args)))
+
+    ;; Now evaluate the function body, returning the value of the last one
+    (while real-func
+      (setq retval (dsssl-eval (car real-func))
+           real-func (cdr real-func)))
+
+    ;; Restore the previous environment
+    (setq defines old-defines
+         units old-units)
+
+    ;; And we are out of here baby!
+    retval))
+
+(defun dsssl-eval (form)
+  ;; We expect to have a 'defines' and 'units' hashtable floating around
+  ;; from higher up the call stack.
+  (declare (special defines units))
+  (cond
+   ((consp form)                       ; A function call
+    (let ((func (car form))
+         (args (cdr form)))
+      (case func
+       (cons
+        (dsssl-check-args args 2)
+        (cons (dsssl-eval (pop args)) (dsssl-eval (pop args))))
+       (cdr
+        (dsssl-check-args args 1)
+        (cdr (dsssl-eval (pop args))))
+       (car
+        (dsssl-check-args args 1)
+        (car (dsssl-eval (pop args))))
+       (not
+        (dsssl-check-args args 1)
+        (not (dsssl-eval (car args))))
+       (boolean\?
+        (dsssl-check-args args 1)
+        (and (symbolp (car args))
+             (memq (car args) '(\#f \#t))))
+       (if
+        (dsssl-min-args args 2)
+        (let ((val (dsssl-eval (pop args))))
+          (if val
+              (dsssl-eval (nth 0 args))
+            (if (nth 1 args)
+                (dsssl-eval (nth 1 args))))))
+       (let                            ; FIXME
+        )
+       (case
+        (dsssl-min-args args 2)
+        (let* ((val (dsssl-eval (pop args)))
+               (conditions args)
+               (done nil)
+               (possibles nil)
+               (cur nil))
+          (while (and conditions (not done))
+            (setq cur (pop conditions)
+                  possibles (nth 0 cur))
+            (if (or (and (listp possibles)
+                         (member val possibles))
+                    (equal val possibles)
+                    (memq possibles '(default otherwise)))
+                (setq done (dsssl-eval (nth 1 cur)))))
+          done))
+       (equal\?
+        (dsssl-check-args args 2)
+        (equal (dsssl-eval (car args)) (dsssl-eval (cadr args))))
+       (null\?
+        (dsssl-check-args args 1)
+        (null (dsssl-eval (car args))))
+       (list\?
+        (dsssl-check-args args 1)
+        (listp (dsssl-eval (car args))))
+       (list
+        (mapcar 'dsssl-eval args))
+       (length
+        (dsssl-check-args args 1)
+        (length (dsssl-eval (car args))))
+       (append
+        (apply 'append (mapcar 'dsssl-eval args)))
+       (reverse
+        (dsssl-check-args args 1)
+        (reverse (dsssl-eval (car args))))
+       (list-tail
+        (dsssl-check-args args 2)
+        (nthcdr (dsssl-eval (car args)) (dsssl-eval (cadr args))))
+       (list-ref
+        (dsssl-check-args args 2)
+        (nth (dsssl-eval (car args)) (dsssl-eval (cadr args))))
+       (member
+        (dsssl-check-args args 2)
+        (member (dsssl-eval (car args)) (dsssl-eval (cadr args))))
+       (symbol\?
+        (dsssl-check-args args 1)
+        (symbolp (dsssl-eval (car args))))
+       (keyword\?
+        (dsssl-check-args args 1)
+        (keywordp (dsssl-eval (car args))))
+       (quantity\?
+        (dsssl-check-args args 1)
+        (error "%s not implemented yet." func))
+       (number\?
+        (dsssl-check-args args 1)
+        (numberp (dsssl-eval (car args))))
+       (real\?
+        (dsssl-check-args args 1)
+        (let ((rval (dsssl-eval (car args))))
+          (and (numberp rval)
+               (/= (truncate rval) rval))))
+       (integer\?
+        (dsssl-check-args args 1)
+        (let ((rval (dsssl-eval (car args))))
+          (and (numberp rval)
+               (= (truncate rval) rval))))
+       ((= < > <= >=)
+        (dsssl-min-args args 2)
+        (let ((not-done t)
+              (initial (dsssl-eval (car args)))
+              (next nil))
+          (setq args (cdr args))
+          (while (and args not-done)
+            (setq next (dsssl-eval (car args))
+                  args (cdr args)
+                  not-done (funcall func initial next)
+                  initial next))
+          not-done))
+       ((+ *)
+        (dsssl-min-args args 2)
+        (let ((acc (dsssl-eval (car args))))
+          (setq args (cdr args))
+          (while args
+            (setq acc (funcall func acc (dsssl-eval (car args)))
+                  args (cdr args)))
+          acc))
+       (-
+        (dsssl-min-args args 1)
+        (apply func (mapcar 'dsssl-eval args)))
+       (/
+        (dsssl-min-args args 1)
+        (if (= (length args) 1)
+            (/ 1 (dsssl-eval (car args)))
+          (apply func (mapcar 'dsssl-eval args))))
+       ((max min)
+        (apply func (mapcar 'dsssl-eval args)))
+       (abs
+        (dsssl-check-args args 1)
+        (abs (dsssl-eval (car args))))
+       (quotient                       ; FIXME
+        (error "`%s' not implemented yet!" func))
+       (modulo
+        (dsssl-check-args args 2)
+        (mod (dsssl-eval (car args)) (dsssl-eval (cadr args))))
+       (remainder
+        (dsssl-check-args args 2)
+        (% (dsssl-eval (car args)) (dsssl-eval (cadr args))))
+       ((floor ceiling truncate round)
+        (dsssl-check-args args 1)
+        (funcall func (dsssl-eval (car args))))
+       (number->string
+        (dsssl-min-args args 1)
+        (if (= (length args) 1)
+            (number-to-string (dsssl-eval (car args)))
+          (if (= (length args) 2)      ; They gave us a radix
+              (error "Radix arg not supported yet.")
+            (dsssl-check-args args 1))))
+       (string->number
+        (dsssl-min-args args 1)
+        (if (= (length args) 1)
+            (string-to-number (dsssl-eval (car args)))
+          (if (= (length args) 2)      ; They gave us a radix
+              (error "Radix arg not supported yet.")
+            (dsssl-check-args args 1))))
+       (char\?
+        (dsssl-check-args args 1)
+        (characterp (dsssl-eval (car args))))
+       (char=\?
+        (dsssl-check-args args 2)
+        (char-equal (dsssl-eval (car args)) (dsssl-eval (cadr args))))
+       (char-downcase
+        (dsssl-check-args args 1)
+        (downcase (dsssl-eval (car args))))
+       (char-property                  ; FIXME
+        (error "`%s' not implemented yet!" func))
+       (string\?
+        (dsssl-check-args args 1)
+        (stringp (dsssl-eval (car args))))
+       (string
+        (dsssl-min-args args 1)
+        (mapconcat 'char-to-string (mapcar 'dsssl-eval args) ""))
+       (string-length
+        (dsssl-check-args args 1)
+        (length (dsssl-eval (car args))))
+       (string-ref
+        (dsssl-check-args args 2)
+        (aref (dsssl-eval (car args)) (dsssl-eval (cadr args))))
+       (string=\?
+        (dsssl-check-args args 2)
+        (string= (dsssl-eval (car args)) (dsssl-eval (cadr args))))
+       (substring
+        (substring (dsssl-eval (pop args))
+                   (dsssl-eval (pop args))
+                   (dsssl-eval (pop args))))
+       (string-append
+        (let ((rval ""))
+          (while args
+            (setq rval (concat rval (dsssl-eval (pop args)))))
+          rval))
+       (procedure\?
+        (dsssl-check-args args 1)
+        (let* ((sym (dsssl-eval (car args)))
+               (def (cl-gethash sym defines)))
+          (or (memq sym dsssl-builtin-functions)
+              (and def (listp def) (eq (car def) 'lambda)))))
+       (apply                          ; FIXME
+        )
+       (external-procedure             ; FIXME
+        )
+       (make
+        (let* ((type (dsssl-eval (pop args)))
+               (symname nil)
+               (props nil)
+               (tail nil)
+               (children nil)
+               (temp nil)
+               )
+          ;; Massage :children into the last slot
+          (setq props (mapcar 'dsssl-eval args)
+                tail (last props)
+                children (car tail))
+          (if (consp tail) 
+              (setcar tail nil))
+          (if (not (car props))
+              (setq props nil))
+          (setq temp (- (length props) 1))
+          ;; Not sure if we should really bother with this or not, but
+          ;; it does at least make it look more common-lispy keywordish
+          ;; and such.  DSSSL keywords look like font-weight:, this makes
+          ;; it :font-weight
+          (while (>= temp 0)
+            (setq symname (symbol-name (nth temp props)))
+            (if (string-match "^\\(.*\\):$" symname)
+                (setf (nth temp props) 
+                      (intern (concat ":" (match-string 1 symname)))))
+            (setq temp (- temp 2)))
+
+          ;; Create the actual flow object
+          (make-flow-object :type type
+                            :children children
+                            :properties props)
+          )
+        )
+       (time
+        (mapconcat 'int-to-string (current-time) ":"))
+       (time->string
+        (dsssl-check-args args 1)
+        (current-time-string
+         (mapcar 'string-to-int
+                 (split-string (dsssl-eval (car args)) ":"))))
+       (quote
+        (dsssl-check-args args 1)
+        (car args))
+       (identity
+        (dsssl-check-args args 1)
+        (dsssl-eval (car args)))
+       (error
+        (apply 'error (mapcar 'dsssl-eval args)))
+       (otherwise
+        ;; A non-built-in function - look it up
+        (let ((def (cl-gethash func defines)))
+          (if (and def (listp def) (eq (car def) 'lambda))
+              (dsssl-call-function def args)
+            (error "Symbol's function definition is void: %s" func))))
+       )
+      )
+    )
+   ((symbolp form)                     ; A variable
+    ;; A DSSSL keyword!
+    (if (string-match ":$" (symbol-name form))
+       form
+      (let ((val (cl-gethash form defines 'ThIS-Is_A_BOgUs-VariuhhBBLE)))
+       (if (not (eq val 'ThIS-Is_A_BOgUs-VariuhhBBLE))
+           val
+         ;; Ok, we got a bogus variable, but maybe it is really a UNIT
+         ;; dereference.  Check.
+         (let ((name (symbol-name form))
+               (the-units nil)
+               (number nil)
+               (conversion nil))
+           (if (not (string-match "^\\([0-9.]+\\)\\([a-zA-Z]+\\)$" name))
+               (error "Symbol's value as variable is void: %s" form)
+             (setq number (string-to-int (match-string 1 name))
+                   the-units  (intern (downcase (match-string 2 name)))
+                   conversion (cl-gethash the-units units))
+             (if (or (not conversion) (not (numberp conversion)))
+                 (error "Symbol's value as variable is void: %s" form)
+               (* number conversion))))))))
+   (t
+    form)
+   )
+  )
+
+(defsubst dsssl-predeclared ()
+  (declare (special defines units))
+  (cl-puthash '\#f nil defines)
+  (cl-puthash 'nil nil defines)
+  (cl-puthash '\#t t defines)
+  ;; NOTE: All units are stored internally as points.
+  (cl-puthash 'in (float 72) units)
+  (cl-puthash 'mm (float (* 72 25.4)) units)
+  (cl-puthash 'cm (float (* 72 2.54)) units)
+  )
+
+(defun dsssl-parse (buf)
+  ;; Return the full representation of the DSSSL stylesheet as a series
+  ;; of LISP objects.
+  (let ((defines (make-hash-table :size 13))
+       (units   (make-hash-table :size 13))
+       (buf-contents nil))
+    (dsssl-predeclared)
+    (save-excursion
+      (setq buf-contents (if (or (bufferp buf) (get-buffer buf))
+                            (progn
+                              (set-buffer buf)
+                              (buffer-string))
+                          buf))
+      (set-buffer (generate-new-buffer " *dsssl-style*"))
+      (insert buf-contents)
+      (goto-char (point-min))
+      (skip-chars-forward " \t\n\r")
+      (if (looking-at "<!")            ; DOCTYPE present
+         (progn
+           ;; This should _DEFINITELY_ be smarter
+           (search-forward ">" nil t)
+           ))
+      (let ((result nil)
+           (temp nil)
+           (save-pos nil))
+       (while (not (eobp))
+         (condition-case ()
+             (setq save-pos (point)
+                   temp (read (current-buffer)))
+           (invalid-read-syntax
+            ;; This disgusting hack is in here so that we can basically
+            ;; extend the lisp reader to gracefully deal with converting
+            ;; DSSSL #\A to Emacs-Lisp ?A notation.  If you know of a
+            ;; better way, please feel free to send me some email.
+            (setq temp nil)
+            (backward-char 1)
+            (if (looking-at "#\\\\")
+                (replace-match "?")
+              (insert "\\"))
+            (goto-char save-pos))
+           (error nil))
+         (cond
+          ((null temp)
+           nil)
+          ((listp temp)
+           (case (car temp)
+                 (define-unit
+                   (cl-puthash (cadr temp) (dsssl-eval (caddr temp))
+                               units))
+                 (define
+                   (if (listp (cadr temp))
+                       ;; A function
+                       (cl-puthash (caadr temp)
+                                    (list 'lambda
+                                          (cdadr temp)
+                                          (cddr temp)) defines)
+                     ;; A normal define
+                     (cl-puthash (cadr temp)
+                                  (dsssl-eval (caddr temp)) defines)))
+                 (otherwise
+                  (setq result (cons temp result)))))
+          (t
+           (setq result (cons temp result))))
+         (skip-chars-forward " \t\n\r"))
+       (kill-buffer (current-buffer))
+       (list defines units (nreverse result))))))
+
+(defun dsssl-test (x)
+  (let* ((result (dsssl-parse x))
+        (defines (nth 0 result))
+        (units   (nth 1 result))
+        (forms   (nth 2 result)))
+    (mapcar 'dsssl-eval forms)))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The flow object classes.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defmacro flow-object-property (obj prop &optional default)
+  "Return property PROP of the DSSSL flow object OBJ.
+OBJ can be any flow object class, as long as it was properly derived
+from the base `flow-object' class."
+  (` (plist-get (flow-object-properties (, obj)) (, prop) (, default))))
+
+;; Now for specific types of flow objects
+;; Still to do:
+;;; display-group
+;;; paragraph
+;;; sequence
+;;; line-field
+;;; paragraph-break
+;;; simple-page-sequence
+;;; score
+;;; table
+;;; table-row
+;;; table-cell
+;;; rule
+;;; external-graphic
+
+
+(provide 'dsssl)
diff --git a/lisp/font.el b/lisp/font.el
new file mode 100644
index 0000000..04bdb7a
--- /dev/null
+++ b/lisp/font.el
@@ -0,0 +1,1380 @@
+;;; font.el --- New font model
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:07 $
+;; Version: $Revision: 1.1 $
+;; Keywords: faces
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1995, 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The emacsen compatibility package - load it up before anything else
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'cl)
+(require 'devices)
+
+;; Needed for XEmacs 19.13, noop on all others, since it is always loaded.
+(require 'disp-table)
+
+(eval-and-compile
+  (condition-case ()
+      (require 'custom)
+    (error nil))
+  (if (and (featurep 'custom) (fboundp 'custom-declare-variable))
+      nil ;; We've got what we needed
+    ;; We have the old custom-library, hack around it!
+    (defmacro defgroup (&rest args)
+      nil)
+    (defmacro defcustom (var value doc &rest args) 
+      (` (defvar (, var) (, value) (, doc))))))
+
+(if (not (fboundp 'try-font-name))
+    (defun try-font-name (fontname &rest args)
+      (case window-system
+       ((x win32 w32 pm) (car-safe (x-list-fonts fontname)))
+       (ns (car-safe (ns-list-fonts fontname)))
+       (otherwise nil))))
+
+(if (not (fboundp 'facep))
+    (defun facep (face)
+      "Return t if X is a face name or an internal face vector."
+      (if (not window-system)
+         nil                           ; FIXME if FSF ever does TTY faces
+       (and (or (internal-facep face)
+                (and (symbolp face) (assq face global-face-data)))
+            t))))
+
+(if (not (fboundp 'set-face-property))
+    (defun set-face-property (face property value &optional locale
+                                  tag-set how-to-add)
+      "Change a property of FACE."
+      (and (symbolp face)
+          (put face property value))))
+
+(if (not (fboundp 'face-property))
+    (defun face-property (face property &optional locale tag-set exact-p)
+      "Return FACE's value of the given PROPERTY."
+      (and (symbolp face) (get face property))))
+
+(require 'disp-table)
+
+(if (not (fboundp '<<))   (fset '<< 'lsh))
+(if (not (fboundp '&))    (fset '& 'logand))
+(if (not (fboundp '|))    (fset '| 'logior))
+(if (not (fboundp '~))    (fset '~ 'lognot))
+(if (not (fboundp '>>))   (defun >> (value count) (<< value (- count))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Lots of variables / keywords for use later in the program
+;;; Not much should need to be modified
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defconst font-running-xemacs (string-match "XEmacs" (emacs-version))
+  "Whether we are running in XEmacs or not.")
+
+(defmacro define-font-keywords (&rest keys)
+  (`
+   (eval-and-compile
+     (let ((keywords (quote (, keys))))
+       (while keywords
+        (or (boundp (car keywords))
+            (set (car keywords) (car keywords)))
+        (setq keywords (cdr keywords)))))))  
+
+(defconst font-window-system-mappings
+  '((x        . (x-font-create-name x-font-create-object))
+    (ns       . (ns-font-create-name ns-font-create-object))
+    (mswindows . (mswindows-font-create-name mswindows-font-create-object))
+    (win32    . (x-font-create-name x-font-create-object))
+    (w32      . (x-font-create-name x-font-create-object))
+    (pm       . (x-font-create-name x-font-create-object)) ; Change? FIXME
+    (tty      . (tty-font-create-plist tty-font-create-object)))
+  "An assoc list mapping device types to the function used to create
+a font name from a font structure.")
+
+(defconst ns-font-weight-mappings
+  '((:extra-light . "extralight")
+    (:light       . "light")
+    (:demi-light  . "demilight")
+    (:medium      . "medium")
+    (:normal      . "medium")
+    (:demi-bold   . "demibold")
+    (:bold        . "bold")
+    (:extra-bold  . "extrabold"))
+  "An assoc list mapping keywords to actual NeXTstep specific
+information to use")
+
+(defconst x-font-weight-mappings
+  '((:extra-light . "extralight")
+    (:light       . "light")
+    (:demi-light  . "demilight")
+    (:demi        . "demi")
+    (:book        . "book")
+    (:medium      . "medium")
+    (:normal      . "medium")
+    (:demi-bold   . "demibold")
+    (:bold        . "bold")
+    (:extra-bold  . "extrabold"))
+  "An assoc list mapping keywords to actual Xwindow specific strings
+for use in the 'weight' field of an X font string.")
+
+
+
+(defconst font-possible-weights
+  (mapcar 'car x-font-weight-mappings))
+
+(defvar font-rgb-file nil
+  "Where the RGB file was found.")
+
+(defvar font-maximum-slippage "1pt"
+  "How much a font is allowed to vary from the desired size.")
+
+(defvar font-family-mappings
+  '(
+    ("serif"        . ("new century schoolbook"
+                      "utopia"
+                      "charter"
+                      "times"
+                      "lucidabright"
+                      "garamond"
+                      "palatino"
+                      "times new roman"
+                      "baskerville"
+                      "bookman"
+                      "bodoni"
+                      "computer modern"
+                      "rockwell"
+                      ))
+    ("sans-serif"   . ("lucida"
+                      "helvetica"
+                      "gills-sans"
+                      "avant-garde"
+                      "univers"
+                      "optima"))
+    ("elfin"        . ("tymes"))
+    ("monospace"    . ("courier"
+                      "courier new"
+                      "fixed"
+                      "lucidatypewriter"
+                      "clean"
+                      "terminal"))
+    ("cursive"      . ("sirene"
+                      "zapf chancery"))
+    )
+  "A list of font family mappings.")
+
+(define-font-keywords :family :style :size :registry :encoding)
+
+(define-font-keywords
+  :weight :extra-light :light :demi-light :medium :normal :regular
+  :demi-bold :bold :extra-bold)
+
+(defvar font-style-keywords nil)
+
+(defsubst set-font-family (fontobj family)
+  (aset fontobj 1 family))
+
+(defsubst set-font-weight (fontobj weight)
+  (aset fontobj 3 weight))
+
+(defsubst set-font-style (fontobj style)
+  (aset fontobj 5 style))
+
+(defsubst set-font-size (fontobj size)
+  (aset fontobj 7 size))
+
+(defsubst set-font-registry (fontobj reg)
+  (aset fontobj 9 reg))
+
+(defsubst set-font-encoding (fontobj enc)
+  (aset fontobj 11 enc))
+
+(defsubst font-family (fontobj)
+  (aref fontobj 1))
+
+(defsubst font-weight (fontobj)
+  (aref fontobj 3))
+
+(defsubst font-style (fontobj)
+  (aref fontobj 5))
+
+(defsubst font-size (fontobj)
+  (aref fontobj 7))
+
+(defsubst font-registry (fontobj)
+  (aref fontobj 9))
+
+(defsubst font-encoding (fontobj)
+  (aref fontobj 11))
+
+(eval-when-compile
+  (defmacro define-new-mask (attr mask)
+    (`
+     (progn
+       (setq font-style-keywords
+            (cons (cons (quote (, attr))
+                        (cons
+                         (quote (, (intern (format "set-font-%s-p" attr))))
+                         (quote (, (intern (format "font-%s-p" attr))))))
+                  font-style-keywords))
+       (defconst (, (intern (format "font-%s-mask" attr))) (<< 1 (, mask))
+        (, (format
+            "Bitmask for whether a font is to be rendered in %s or not."
+            attr)))
+       (defun (, (intern (format "font-%s-p" attr))) (fontobj)
+        (, (format "Whether FONTOBJ will be renderd in `%s' or not." attr))
+        (if (/= 0 (& (font-style fontobj)
+                     (, (intern (format "font-%s-mask" attr)))))
+            t
+          nil))
+       (defun (, (intern (format "set-font-%s-p" attr))) (fontobj val)
+        (, (format "Set whether FONTOBJ will be renderd in `%s' or not."
+                   attr))
+        (cond
+         (val
+          (set-font-style fontobj (| (font-style fontobj)
+                                     (, (intern
+                                         (format "font-%s-mask" attr))))))
+         (((, (intern (format "font-%s-p" attr))) fontobj)
+          (set-font-style fontobj (- (font-style fontobj)
+                                     (, (intern
+                                         (format "font-%s-mask" attr))))))))
+       ))))
+
+(let ((mask 0))
+  (define-new-mask bold        (setq mask (1+ mask)))
+  (define-new-mask italic      (setq mask (1+ mask)))
+  (define-new-mask oblique     (setq mask (1+ mask)))
+  (define-new-mask dim         (setq mask (1+ mask)))
+  (define-new-mask underline   (setq mask (1+ mask)))
+  (define-new-mask overline    (setq mask (1+ mask)))
+  (define-new-mask linethrough (setq mask (1+ mask)))
+  (define-new-mask strikethru  (setq mask (1+ mask)))
+  (define-new-mask reverse     (setq mask (1+ mask)))
+  (define-new-mask blink       (setq mask (1+ mask)))
+  (define-new-mask smallcaps   (setq mask (1+ mask)))
+  (define-new-mask bigcaps     (setq mask (1+ mask)))
+  (define-new-mask dropcaps    (setq mask (1+ mask))))
+
+(defvar font-caps-display-table
+  (let ((table (make-display-table))
+       (i 0))
+    ;; Standard ASCII characters
+    (while (< i 26)
+      (aset table (+ i ?a) (+ i ?A))
+      (setq i (1+ i)))
+    ;; Now ISO translations
+    (setq i 224)
+    (while (< i 247)                   ;; Agrave - Ouml
+      (aset table i (- i 32))
+      (setq i (1+ i)))
+    (setq i 248)
+    (while (< i 255)                   ;; Oslash - Thorn
+      (aset table i (- i 32))
+      (setq i (1+ i)))
+    table))    
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Utility functions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defsubst set-font-style-by-keywords (fontobj styles)
+  (make-local-variable 'font-func)
+  (declare (special font-func))
+  (if (listp styles)
+      (while styles
+       (setq font-func (car-safe (cdr-safe (assq (car styles) 
font-style-keywords)))
+             styles (cdr styles))
+       (and (fboundp font-func) (funcall font-func fontobj t)))
+    (setq font-func (car-safe (cdr-safe (assq styles font-style-keywords))))
+    (and (fboundp font-func) (funcall font-func fontobj t))))
+
+(defsubst font-properties-from-style (fontobj)
+  (let ((style (font-style fontobj))
+       (todo font-style-keywords)
+       type func retval)
+    (while todo
+      (setq func (cdr (cdr (car todo)))
+           type (car (pop todo)))
+      (if (funcall func fontobj)
+         (setq retval (cons type retval))))
+    retval))
+
+(defun font-unique (list)
+  (let ((retval)
+       (cur))
+    (while list
+      (setq cur (car list)
+           list (cdr list))
+      (if (member cur retval)
+         nil
+       (setq retval (cons cur retval))))
+    (nreverse retval)))
+
+(defun font-higher-weight (w1 w2)
+  (let ((index1 (length (memq w1 font-possible-weights)))
+       (index2 (length (memq w2 font-possible-weights))))
+    (cond
+     ((<= index1 index2)
+      (or w1 w2))
+     ((not w2)
+      w1)
+     (t
+      w2))))
+
+(defun font-spatial-to-canonical (spec &optional device)
+  "Convert SPEC (in inches, millimeters, points, or picas) into points"
+  ;; 1 in = 6 pa = 25.4 mm = 72 pt
+  (cond
+   ((numberp spec)
+    spec)
+   ((null spec)
+    nil)
+   (t
+    (let ((num nil)
+         (type nil)
+         ;; If for any reason we get null for any of this, default
+         ;; to 1024x768 resolution on a 17" screen
+         (pix-width (float (or (device-pixel-width device) 1024)))
+         (mm-width (float (or (device-mm-width device) 293)))
+         (retval nil))
+      (cond
+       ((string-match "^ *\\([-+*/]\\) *" spec) ; math!  whee!
+       (let ((math-func (intern (match-string 1 spec)))
+             (other (font-spatial-to-canonical
+                     (substring spec (match-end 0) nil)))
+             (default (font-spatial-to-canonical
+                       (font-default-size-for-device device))))
+         (if (fboundp math-func)
+             (setq type "px"
+                   spec (int-to-string (funcall math-func default other)))
+           (setq type "px"
+                 spec (int-to-string other)))))
+       ((string-match "[^0-9.]+$" spec)
+       (setq type (substring spec (match-beginning 0))
+             spec (substring spec 0 (match-beginning 0))))
+       (t
+       (setq type "px"
+             spec spec)))
+      (setq num (string-to-number spec))
+      (cond
+       ((member type '("pixel" "px" "pix"))
+       (setq retval (* num (/ pix-width mm-width) (/ 25.4 72.0))))
+       ((member type '("point" "pt"))
+       (setq retval num))
+       ((member type '("pica" "pa"))
+       (setq retval (* num 12.0)))
+       ((member type '("inch" "in"))
+       (setq retval (* num 72.0)))
+       ((string= type "mm")
+       (setq retval (* num (/ 72.0 25.4))))
+       ((string= type "cm")
+       (setq retval (* num 10 (/ 72.0 25.4))))
+       (t
+       (setq retval num))
+       )
+      retval))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The main interface routines - constructors and accessor functions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun make-font (&rest args)
+  (vector :family
+         (if (stringp (plist-get args :family))
+             (list (plist-get args :family))
+           (plist-get args :family))
+         :weight
+         (plist-get args :weight)
+         :style
+         (if (numberp (plist-get args :style))
+             (plist-get args :style)
+           0)
+         :size
+         (plist-get args :size)
+         :registry
+         (plist-get args :registry)
+         :encoding
+         (plist-get args :encoding)))
+
+(defun font-create-name (fontobj &optional device)
+  (let* ((type (device-type device))
+        (func (car (cdr-safe (assq type font-window-system-mappings)))))
+    (and func (fboundp func) (funcall func fontobj device))))
+
+;;;###autoload
+(defun font-create-object (fontname &optional device)
+  (let* ((type (device-type device))
+        (func (car (cdr (cdr-safe (assq type font-window-system-mappings))))))
+    (and func (fboundp func) (funcall func fontname device))))
+
+(defun font-combine-fonts-internal (fontobj-1 fontobj-2)
+  (let ((retval (make-font))
+       (size-1 (and (font-size fontobj-1)
+                    (font-spatial-to-canonical (font-size fontobj-1))))
+       (size-2 (and (font-size fontobj-2)
+                    (font-spatial-to-canonical (font-size fontobj-2)))))
+    (set-font-weight retval (font-higher-weight (font-weight fontobj-1)
+                                               (font-weight fontobj-2)))
+    (set-font-family retval (font-unique (append (font-family fontobj-1)
+                                                (font-family fontobj-2))))
+    (set-font-style retval (| (font-style fontobj-1) (font-style fontobj-2)))
+    (set-font-registry retval (or (font-registry fontobj-1)
+                                 (font-registry fontobj-2)))
+    (set-font-encoding retval (or (font-encoding fontobj-1)
+                                 (font-encoding fontobj-2)))
+    (set-font-size retval (cond
+                          ((and size-1 size-2 (>= size-2 size-1))
+                           (font-size fontobj-2))
+                          ((and size-1 size-2)
+                           (font-size fontobj-1))
+                          (size-1
+                           (font-size fontobj-1))
+                          (size-2
+                           (font-size fontobj-2))
+                          (t nil)))
+
+    retval))
+
+(defun font-combine-fonts (&rest args)
+  (cond
+   ((null args)
+    (error "Wrong number of arguments to font-combine-fonts"))
+   ((= (length args) 1)
+    (car args))
+   (t
+    (let ((retval (font-combine-fonts-internal (nth 0 args) (nth 1 args))))
+      (setq args (cdr (cdr args)))
+      (while args
+       (setq retval (font-combine-fonts-internal retval (car args))
+             args (cdr args)))
+      retval))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The window-system dependent code (mswindows-style)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; mswindows fonts look like:
+;;;    fontname[:[weight][ style][:pointsize[:effects[:charset]]]]
+;;; A minimal mswindows font spec looks like:
+;;;    Courier New
+;;; A maximal mswindows font spec looks like:
+;;;    Courier New:Bold Italic:10:underline strikeout:ansi
+;;; Missing parts of the font spec should be filled in with these values:
+;;;    Courier New:Normal:10::ansi
+;;  "^[a-zA-Z ]+:[a-zA-Z ]*:[0-9]+:[a-zA-Z ]*:[a-zA-Z 0-9]*$"
+(defvar font-mswindows-font-regexp
+  (eval-when-compile
+    (let ((-           ":")
+         (fontname     "\\([a-zA-Z ]+\\)")
+         (weight       "\\([a-zA-Z]*\\)")
+         (style        "\\( [a-zA-Z]*\\)?")
+         (pointsize    "\\([0-9]+\\)")
+         (effects      "\\([a-zA-Z ]*\\)")q
+         (charset      "\\([a-zA-Z 0-9]*\\)"))
+      (concat "^"
+             fontname - weight style - pointsize - effects - charset "$"))))
+
+(defconst mswindows-font-weight-mappings
+  '((:extra-light . "Extralight")
+    (:light       . "Light")
+    (:demi-light  . "Demilight")
+    (:demi        . "Demi")
+    (:book        . "Book")
+    (:medium      . "Medium")
+    (:normal      . "Normal")
+    (:demi-bold   . "Demibold")
+    (:bold        . "Bold")
+    (:regular    . "Regular")
+    (:extra-bold  . "Extrabold"))
+  "An assoc list mapping keywords to actual mswindows specific strings
+for use in the 'weight' field of an mswindows font string.")
+
+(defun mswindows-font-create-object (fontname &optional device)
+  (let ((case-fold-search t)
+       (font (mswindows-font-canicolize-name fontname)))
+    (if (or (not (stringp font))
+           (not (string-match font-mswindows-font-regexp font)))
+       (make-font)
+      (let ((family    (match-string 1 font))
+           (weight     (match-string 2 font))
+           (style      (match-string 3 font))
+           (pointsize  (match-string 4 font))
+           (effects    (match-string 5 font))
+           (charset    (match-string 6 font))
+           (retval nil)
+           (size nil)
+           (case-fold-search t)
+           )
+       (if pointsize (setq size (concat pointsize "pt")))
+       (if weight (setq weight (intern-soft (concat ":" (downcase weight)))))
+       (setq retval (make-font :family family
+                               :weight weight
+                               :size size
+                               :encoding charset))
+       (set-font-bold-p retval (eq :bold weight))
+       (cond
+        ((null style) nil)
+        ((string-match "^ *[iI]talic" style)
+         (set-font-italic-p retval t)))
+       retval))))
+
+(defun mswindows-font-create-name (fontobj &optional device)
+  (if (and (not (or (font-family fontobj)
+                   (font-weight fontobj)
+                   (font-size fontobj)
+                   (font-registry fontobj)
+                   (font-encoding fontobj)))
+          (= (font-style fontobj) 0))
+      (face-font 'default)
+    (or device (setq device (selected-device)))
+    (let* ((default (font-default-object-for-device device))
+          (family (or (font-family fontobj)
+                      (font-family default)))
+          (weight (or (font-weight fontobj) :regular))
+          (style (font-style fontobj))
+          (size (or (if font-running-xemacs
+                        (font-size fontobj))
+                    (font-size default)))
+          (registry (or (font-registry fontobj)
+                        (font-registry default)))
+          (encoding (or (font-encoding fontobj)
+                        (font-encoding default))))
+      (if (stringp family)
+         (setq family (list family)))
+      (setq weight (font-higher-weight weight
+                                      (and (font-bold-p fontobj) :bold)))
+      (if (stringp size)
+         (setq size (truncate (font-spatial-to-canonical size device))))
+      (setq weight (or (cdr-safe 
+                       (assq weight mswindows-font-weight-mappings)) ""))
+      (let ((done nil)                 ; Did we find a good font yet?
+           (font-name nil)             ; font name we are currently checking
+           (cur-family nil))           ; current family we are checking
+       (while (and family (not done))
+         (setq cur-family (car family)
+               family (cdr family))
+         (if (assoc cur-family font-family-mappings)
+             ;; If the family name is an alias as defined by
+             ;; font-family-mappings, then append those families
+             ;; to the front of 'family' and continue in the loop.
+             (setq family (append
+                           (cdr-safe (assoc cur-family
+                                            font-family-mappings))
+                           family))
+           ;; We treat oblique and italic as equivalent.  Don't ask.
+           ;; Courier New:Bold Italic:10:underline strikeout:ansi
+           (setq font-name (format "%s:%s%s:%s:%s:%s"
+                                   cur-family weight
+                                   (if (font-italic-p fontobj)
+                                       " Italic" "")
+                                   (if size
+                                       (int-to-string size) "10")
+                                   ""
+                                   encoding)
+                 done (try-font-name font-name device))))
+       (if done font-name)))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The window-system dependent code (TTY-style)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun tty-font-create-object (fontname &optional device)
+  (make-font :size "12pt"))
+
+(defun tty-font-create-plist (fontobj &optional device)
+  (let ((styles (font-style fontobj))
+       (weight (font-weight fontobj)))
+    (list
+     (cons 'underline (font-underline-p fontobj))
+     (cons 'highlight (if (or (font-bold-p fontobj)
+                             (memq weight '(:bold :demi-bold))) t))
+     (cons 'dim       (font-dim-p fontobj))
+     (cons 'blinking  (font-blink-p fontobj))
+     (cons 'reverse   (font-reverse-p fontobj)))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The window-system dependent code (X-style)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar font-x-font-regexp (or (and font-running-xemacs
+                                   (boundp 'x-font-regexp)
+                                   x-font-regexp)
+ (let
+     ((-               "[-?]")
+      (foundry         "[^-]*")
+      (family          "[^-]*")
+      (weight          "\\(bold\\|demibold\\|medium\\|black\\)")
+      (weight\?                "\\([^-]*\\)")
+      (slant           "\\([ior]\\)")
+      (slant\?         "\\([^-]?\\)")
+      (swidth          "\\([^-]*\\)")
+      (adstyle         "\\([^-]*\\)")
+      (pixelsize       "\\(\\*\\|[0-9]+\\)")
+      (pointsize       "\\(\\*\\|0\\|[0-9][0-9]+\\)")
+      (resx            "\\([*0]\\|[0-9][0-9]+\\)")
+      (resy            "\\([*0]\\|[0-9][0-9]+\\)")
+      (spacing         "[cmp?*]")
+      (avgwidth                "\\(\\*\\|[0-9]+\\)")
+      (registry                "[^-]*")
+      (encoding        "[^-]+")
+      )
+   (concat "\\`\\*?[-?*]"
+          foundry - family - weight\? - slant\? - swidth - adstyle -
+          pixelsize - pointsize - resx - resy - spacing - avgwidth -
+          registry - encoding "\\'"
+          ))))
+
+(defvar font-x-registry-and-encoding-regexp
+  (or (and font-running-xemacs
+          (boundp 'x-font-regexp-registry-and-encoding)
+          (symbol-value 'x-font-regexp-registry-and-encoding))
+      (let ((- "[-?]")
+           (registry "[^-]*")
+           (encoding "[^-]+"))
+       (concat - "\\(" registry "\\)" - "\\(" encoding "\\)\\'"))))
+
+(defun x-font-create-object (fontname &optional device)
+  (let ((case-fold-search t))
+    (if (or (not (stringp fontname))
+           (not (string-match font-x-font-regexp fontname)))
+       (make-font)
+      (let ((family nil)
+           (style nil)
+           (size nil)
+           (weight  (match-string 1 fontname))
+           (slant   (match-string 2 fontname))
+           (swidth  (match-string 3 fontname))
+           (adstyle (match-string 4 fontname))
+           (pxsize  (match-string 5 fontname))
+           (ptsize  (match-string 6 fontname))
+           (retval nil)
+           (case-fold-search t)
+           )
+       (if (not (string-match x-font-regexp-foundry-and-family fontname))
+           nil
+         (setq family (list (downcase (match-string 1 fontname)))))
+       (if (string= "*" weight)  (setq weight  nil))
+       (if (string= "*" slant)   (setq slant   nil))
+       (if (string= "*" swidth)  (setq swidth  nil))
+       (if (string= "*" adstyle) (setq adstyle nil))
+       (if (string= "*" pxsize)  (setq pxsize  nil))
+       (if (string= "*" ptsize)  (setq ptsize  nil))
+       (if ptsize (setq size (/ (string-to-int ptsize) 10)))
+       (if (and (not size) pxsize) (setq size (concat pxsize "px")))
+       (if weight (setq weight (intern-soft (concat ":" (downcase weight)))))
+       (if (and adstyle (not (equal adstyle "")))
+           (setq family (append family (list (downcase adstyle)))))
+       (setq retval (make-font :family family
+                               :weight weight
+                               :size size))
+       (set-font-bold-p retval (eq :bold weight))
+       (cond
+        ((null slant) nil)
+        ((member slant '("i" "I"))
+         (set-font-italic-p retval t))
+        ((member slant '("o" "O"))
+         (set-font-oblique-p retval t)))
+       (if (string-match font-x-registry-and-encoding-regexp fontname)
+           (progn
+             (set-font-registry retval (match-string 1 fontname))
+             (set-font-encoding retval (match-string 2 fontname))))
+       retval))))
+
+(defun x-font-families-for-device (&optional device no-resetp)
+  (condition-case ()
+      (require 'x-font-menu)
+    (error nil))
+  (or device (setq device (selected-device)))
+  (if (boundp 'device-fonts-cache)
+      (let ((menu (or (cdr-safe (assq device device-fonts-cache)))))
+       (if (and (not menu) (not no-resetp))
+           (progn
+             (reset-device-font-menus device)
+             (x-font-families-for-device device t))
+         (let ((scaled (mapcar (function (lambda (x) (if x (aref x 0))))
+                               (aref menu 0)))
+               (normal (mapcar (function (lambda (x) (if x (aref x 0))))
+                               (aref menu 1))))
+           (sort (font-unique (nconc scaled normal)) 'string-lessp))))
+    (cons "monospace" (mapcar 'car font-family-mappings))))
+
+(defvar font-default-cache nil)
+
+;;;###autoload
+(defun font-default-font-for-device (&optional device)
+  (or device (setq device (selected-device)))
+  (if font-running-xemacs
+      (font-truename
+       (make-font-specifier
+       (face-font-name 'default device)))
+    (let ((font (cdr-safe (assq 'font (frame-parameters device)))))
+      (if (and (fboundp 'fontsetp) (fontsetp font))
+         (aref (get-font-info (aref (cdr (get-fontset-info font)) 0)) 2)
+       font))))
+         
+;;;###autoload
+(defun font-default-object-for-device (&optional device)
+  (let ((font (font-default-font-for-device device)))
+    (or (cdr-safe 
+        (assoc font font-default-cache))
+       (progn
+         (setq font-default-cache (cons (cons font
+                                              (font-create-object font))
+                                        font-default-cache))
+         (cdr-safe (assoc font font-default-cache))))))
+
+;;;###autoload
+(defun font-default-family-for-device (&optional device)
+  (or device (setq device (selected-device)))
+  (font-family (font-default-object-for-device device)))
+
+;;;###autoload
+(defun font-default-registry-for-device (&optional device)
+  (or device (setq device (selected-device)))
+  (font-registry (font-default-object-for-device device)))
+
+;;;###autoload
+(defun font-default-encoding-for-device (&optional device)
+  (or device (setq device (selected-device)))
+  (font-encoding (font-default-object-for-device device)))
+
+;;;###autoload
+(defun font-default-size-for-device (&optional device)
+  (or device (setq device (selected-device)))
+  ;; face-height isn't the right thing (always 1 pixel too high?)
+  ;; (if font-running-xemacs
+  ;;    (format "%dpx" (face-height 'default device))
+  (font-size (font-default-object-for-device device)))
+
+(defun x-font-create-name (fontobj &optional device)
+  (if (and (not (or (font-family fontobj)
+                   (font-weight fontobj)
+                   (font-size fontobj)
+                   (font-registry fontobj)
+                   (font-encoding fontobj)))
+          (= (font-style fontobj) 0))
+      (face-font 'default)
+    (or device (setq device (selected-device)))
+    (let* ((default (font-default-object-for-device device))
+          (family (or (font-family fontobj)
+                      (font-family default)
+                      (x-font-families-for-device device)))
+          (weight (or (font-weight fontobj) :medium))
+          (style (font-style fontobj))
+          (size (or (if font-running-xemacs
+                        (font-size fontobj))
+                    (font-size default)))
+          (registry (or (font-registry fontobj)
+                        (font-registry default)
+                        "*"))
+          (encoding (or (font-encoding fontobj)
+                        (font-encoding default)
+                        "*")))
+      (if (stringp family)
+         (setq family (list family)))
+      (setq weight (font-higher-weight weight
+                                      (and (font-bold-p fontobj) :bold)))
+      (if (stringp size)
+         (setq size (truncate (font-spatial-to-canonical size device))))
+      (setq weight (or (cdr-safe (assq weight x-font-weight-mappings)) "*"))
+      (let ((done nil)                 ; Did we find a good font yet?
+           (font-name nil)             ; font name we are currently checking
+           (cur-family nil)            ; current family we are checking
+           )
+       (while (and family (not done))
+         (setq cur-family (car family)
+               family (cdr family))
+         (if (assoc cur-family font-family-mappings)
+             ;; If the family name is an alias as defined by
+             ;; font-family-mappings, then append those families
+             ;; to the front of 'family' and continue in the loop.
+             (setq family (append
+                           (cdr-safe (assoc cur-family
+                                            font-family-mappings))
+                           family))
+           ;; Not an alias for a list of fonts, so we just check it.
+           ;; First, convert all '-' to spaces so that we don't screw up
+           ;; the oh-so wonderful X font model.  Wheee.
+           (let ((x (length cur-family)))
+             (while (> x 0)
+               (if (= ?- (aref cur-family (1- x)))
+                   (aset cur-family (1- x) ? ))
+               (setq x (1- x))))
+           ;; We treat oblique and italic as equivalent.  Don't ask.
+           (let ((slants '("o" "i")))
+             (while (and slants (not done))
+               (setq font-name (format "-*-%s-%s-%s-*-*-*-%s-*-*-*-*-%s-%s"
+                                       cur-family weight
+                                       (if (or (font-italic-p fontobj)
+                                               (font-oblique-p fontobj))
+                                           (car slants)
+                                         "r")
+                                       (if size
+                                           (int-to-string (* 10 size)) "*")
+                                       registry
+                                       encoding
+                                       )
+                     slants (cdr slants)
+                     done (try-font-name font-name device))))))
+       (if done font-name)))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The window-system dependent code (NS-style)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun ns-font-families-for-device (&optional device no-resetp)
+  ;; For right now, assume we are going to have the same storage for
+  ;; device fonts for NS as we do for X.  Is this a valid assumption?
+  (or device (setq device (selected-device)))
+  (if (boundp 'device-fonts-cache)
+      (let ((menu (or (cdr-safe (assq device device-fonts-cache)))))
+       (if (and (not menu) (not no-resetp))
+           (progn
+             (reset-device-font-menus device)
+             (ns-font-families-for-device device t))
+         (let ((scaled (mapcar (function (lambda (x) (if x (aref x 0))))
+                               (aref menu 0)))
+               (normal (mapcar (function (lambda (x) (if x (aref x 0))))
+                               (aref menu 1))))
+           (sort (font-unique (nconc scaled normal)) 'string-lessp))))))
+
+(defun ns-font-create-name (fontobj &optional device)
+  (let ((family (or (font-family fontobj)
+                   (ns-font-families-for-device device)))
+       (weight (or (font-weight fontobj) :medium))
+       (style (or (font-style fontobj) (list :normal)))
+       (size (font-size fontobj))
+       (registry (or (font-registry fontobj) "*"))
+       (encoding (or (font-encoding fontobj) "*")))
+    ;; Create a font, wow!
+    (if (stringp family)
+       (setq family (list family)))
+    (if (or (symbolp style) (numberp style))
+       (setq style (list style)))
+    (setq weight (font-higher-weight weight (car-safe (memq :bold style))))
+    (if (stringp size)
+       (setq size (font-spatial-to-canonical size device)))
+    (setq weight (or (cdr-safe (assq weight ns-font-weight-mappings))
+                    "medium"))
+    (let ((done nil)                   ; Did we find a good font yet?
+         (font-name nil)               ; font name we are currently checking
+         (cur-family nil)              ; current family we are checking
+         )
+      (while (and family (not done))
+       (setq cur-family (car family)
+             family (cdr family))
+       (if (assoc cur-family font-family-mappings)
+           ;; If the family name is an alias as defined by
+           ;; font-family-mappings, then append those families
+           ;; to the front of 'family' and continue in the loop.
+           (setq family (append
+                         (cdr-safe (assoc cur-family
+                                          font-family-mappings))
+                         family))
+         ;; CARL: Need help here - I am not familiar with the NS font
+         ;; model
+         (setq font-name "UNKNOWN FORMULA GOES HERE"
+               done (try-font-name font-name device))))
+      (if done font-name))))
+
+
+;;; Cache building code
+;;;###autoload
+(defun x-font-build-cache (&optional device)
+  (let ((hashtable (make-hash-table :test 'equal :size 15))
+       (fonts (mapcar 'x-font-create-object
+                      (list-fonts "-*-*-*-*-*-*-*-*-*-*-*-*-*-*")))
+       (plist nil)
+       (cur nil))
+    (while fonts
+      (setq cur (car fonts)
+           fonts (cdr fonts)
+           plist (cl-gethash (car (font-family cur)) hashtable))
+      (if (not (memq (font-weight cur) (plist-get plist 'weights)))
+         (setq plist (plist-put plist 'weights (cons (font-weight cur)
+                                                     (plist-get plist 
'weights)))))
+      (if (not (member (font-size cur) (plist-get plist 'sizes)))
+         (setq plist (plist-put plist 'sizes (cons (font-size cur)
+                                                   (plist-get plist 'sizes)))))
+      (if (and (font-oblique-p cur)
+              (not (memq 'oblique (plist-get plist 'styles))))
+         (setq plist (plist-put plist 'styles (cons 'oblique (plist-get plist 
'styles)))))
+      (if (and (font-italic-p cur)
+              (not (memq 'italic (plist-get plist 'styles))))
+         (setq plist (plist-put plist 'styles (cons 'italic (plist-get plist 
'styles)))))
+      (cl-puthash (car (font-family cur)) plist hashtable))
+    hashtable))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Now overwrite the original copy of set-face-font with our own copy that
+;;; can deal with either syntax.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;###autoload
+(defun font-set-face-font (&optional face font &rest args)
+  (cond
+   ((and (vectorp font) (= (length font) 12))
+    (let ((font-name (font-create-name font)))
+      (set-face-property face 'font-specification font)
+      (cond
+       ((null font-name)               ; No matching font!
+       nil)
+       ((listp font-name)              ; For TTYs
+       (let (cur)
+         (while font-name
+           (setq cur (car font-name)
+                 font-name (cdr font-name))
+           (apply 'set-face-property face (car cur) (cdr cur) args))))
+       (font-running-xemacs
+       (apply 'set-face-font face font-name args)
+       (apply 'set-face-underline-p face (font-underline-p font) args)
+       (if (and (or (font-smallcaps-p font) (font-bigcaps-p font))
+                (fboundp 'set-face-display-table))
+           (apply 'set-face-display-table
+                  face font-caps-display-table args))
+       (apply 'set-face-property face 'strikethru (or
+                                                   (font-linethrough-p font)
+                                                   (font-strikethru-p font))
+              args))
+       (t
+       (condition-case nil
+           (apply 'set-face-font face font-name args)
+         (error
+          (let ((args (car-safe args)))
+            (and (or (font-bold-p font)
+                     (memq (font-weight font) '(:bold :demi-bold)))
+                 (make-face-bold face args t))
+            (and (font-italic-p font) (make-face-italic face args t)))))
+       (apply 'set-face-underline-p face (font-underline-p font) args)))))
+   (t
+    ;; Let the original set-face-font signal any errors
+    (set-face-property face 'font-specification nil)
+    (apply 'set-face-font face font args))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Now for emacsen specific stuff
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun font-update-device-fonts (device)
+  ;; Update all faces that were created with the 'font' package
+  ;; to appear correctly on the new device.  This should be in the
+  ;; create-device-hook.  This is XEmacs 19.12+ specific
+  (let ((faces (face-list 2))
+       (cur nil)
+       (font nil)
+       (font-spec nil))
+    (while faces
+      (setq cur (car faces)
+           faces (cdr faces)
+           font-spec (face-property cur 'font-specification))
+      (if font-spec
+         (set-face-font cur font-spec device)))))
+
+(defun font-update-one-face (face &optional device-list)
+  ;; Update FACE on all devices in DEVICE-LIST
+  ;; DEVICE_LIST defaults to a list of all active devices
+  (setq device-list (or device-list (device-list)))
+  (if (devicep device-list)
+      (setq device-list (list device-list)))
+  (let* ((cur-device nil)
+        (font-spec (face-property face 'font-specification))
+        (font nil))
+    (if (not font-spec)
+       ;; Hey!  Don't mess with fonts we didn't create in the
+       ;; first place.
+       nil
+      (while device-list
+       (setq cur-device (car device-list)
+             device-list (cdr device-list))
+       (if (not (device-live-p cur-device))
+           ;; Whoah!
+           nil
+         (if font-spec
+             (set-face-font face font-spec cur-device)))))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Various color related things
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(cond
+ ((fboundp 'display-warning)
+  (fset 'font-warn 'display-warning))
+ ((fboundp 'w3-warn)
+  (fset 'font-warn 'w3-warn))
+ ((fboundp 'url-warn)
+  (fset 'font-warn 'url-warn))
+ ((fboundp 'warn)
+  (defun font-warn (class message &optional level)
+    (warn "(%s/%s) %s" class (or level 'warning) message)))
+ (t
+  (defun font-warn (class message &optional level)
+    (save-excursion
+      (set-buffer (get-buffer-create "*W3-WARNINGS*"))
+      (goto-char (point-max))
+      (save-excursion
+       (insert (format "(%s/%s) %s\n" class (or level 'warning) message)))
+      (display-buffer (current-buffer))))))
+
+(defun font-lookup-rgb-components (color)
+  "Lookup COLOR (a color name) in rgb.txt and return a list of RGB values.
+The list (R G B) is returned, or an error is signaled if the lookup fails."
+  (let ((lib-list (if (boundp 'x-library-search-path)
+                     x-library-search-path
+                   ;; This default is from XEmacs 19.13 - hope it covers
+                   ;; everyone.
+                   (list "/usr/X11R6/lib/X11/"
+                         "/usr/X11R5/lib/X11/"
+                         "/usr/lib/X11R6/X11/"
+                         "/usr/lib/X11R5/X11/"
+                         "/usr/local/X11R6/lib/X11/"
+                         "/usr/local/X11R5/lib/X11/"
+                         "/usr/local/lib/X11R6/X11/"
+                         "/usr/local/lib/X11R5/X11/"
+                         "/usr/X11/lib/X11/"
+                         "/usr/lib/X11/"
+                         "/usr/local/lib/X11/"
+                         "/usr/X386/lib/X11/"
+                         "/usr/x386/lib/X11/"
+                         "/usr/XFree86/lib/X11/"
+                         "/usr/unsupported/lib/X11/"
+                         "/usr/athena/lib/X11/"
+                         "/usr/local/x11r5/lib/X11/"
+                         "/usr/lpp/Xamples/lib/X11/"
+                         "/usr/openwin/lib/X11/"
+                         "/usr/openwin/share/lib/X11/")))
+       (file font-rgb-file)
+       r g b)
+    (if (not file)
+       (while lib-list
+         (setq file (expand-file-name "rgb.txt" (car lib-list)))
+         (if (file-readable-p file)
+             (setq lib-list nil
+                   font-rgb-file file)
+           (setq lib-list (cdr lib-list)
+                 file nil))))
+    (if (null file)
+       (list 0 0 0)
+      (save-excursion
+       (set-buffer (find-file-noselect file))
+       (if (not (= (aref (buffer-name) 0) ? ))
+           (rename-buffer (generate-new-buffer-name " *rgb-tmp-buffer*")))
+       (save-excursion
+         (save-restriction
+           (widen)
+           (goto-char (point-min))
+           (if (re-search-forward (format "\t%s$" (regexp-quote color)) nil t)
+               (progn
+                 (beginning-of-line)
+                 (setq r (* (read (current-buffer)) 256)
+                       g (* (read (current-buffer)) 256)
+                       b (* (read (current-buffer)) 256)))
+             (font-warn 'color (format "No such color: %s" color))
+             (setq r 0
+                   g 0
+                   b 0))
+           (list r g b) ))))))
+
+(defun font-hex-string-to-number (string)
+  "Convert STRING to an integer by parsing it as a hexadecimal number."
+  (let ((conv-list '((?0 . 0) (?a . 10) (?A . 10)
+                    (?1 . 1) (?b . 11) (?B . 11)
+                    (?2 . 2) (?c . 12) (?C . 12)
+                    (?3 . 3) (?d . 13) (?D . 13)
+                    (?4 . 4) (?e . 14) (?E . 14)
+                    (?5 . 5) (?f . 15) (?F . 15)
+                    (?6 . 6) 
+                    (?7 . 7)
+                    (?8 . 8)
+                    (?9 . 9)))
+       (n 0)
+       (i 0)
+       (lim (length string)))
+    (while (< i lim)
+      (setq n (+ (* n 16) (or (cdr (assq (aref string i) conv-list)) 0))
+           i (1+ i)))
+    n ))
+
+(defun font-parse-rgb-components (color)
+  "Parse RGB color specification and return a list of integers (R G B).
+#FEFEFE and rgb:fe/fe/fe style specifications are parsed."
+  (let ((case-fold-search t)
+       r g b str)
+  (cond ((string-match "^#[0-9a-f]+$" color)
+        (cond
+         ((= (length color) 4)
+          (setq r (font-hex-string-to-number (substring color 1 2))
+                g (font-hex-string-to-number (substring color 2 3))
+                b (font-hex-string-to-number (substring color 3 4))
+                r (* r 4096)
+                g (* g 4096)
+                b (* b 4096)))
+         ((= (length color) 7)
+          (setq r (font-hex-string-to-number (substring color 1 3))
+                g (font-hex-string-to-number (substring color 3 5))
+                b (font-hex-string-to-number (substring color 5 7))
+                r (* r 256)
+                g (* g 256)
+                b (* b 256)))
+         ((= (length color) 10)
+          (setq r (font-hex-string-to-number (substring color 1 4))
+                g (font-hex-string-to-number (substring color 4 7))
+                b (font-hex-string-to-number (substring color 7 10))
+                r (* r 16)
+                g (* g 16)
+                b (* b 16)))
+         ((= (length color) 13)
+          (setq r (font-hex-string-to-number (substring color 1 5))
+                g (font-hex-string-to-number (substring color 5 9))
+                b (font-hex-string-to-number (substring color 9 13))))
+         (t
+          (font-warn 'color (format "Invalid RGB color specification: %s"
+                                    color))
+          (setq r 0
+                g 0
+                b 0))))
+       ((string-match "rgb:\\([0-9a-f]+\\)/\\([0-9a-f]+\\)/\\([0-9a-f]+\\)"
+                      color)
+        (if (or (> (- (match-end 1) (match-beginning 1)) 4)
+                (> (- (match-end 2) (match-beginning 2)) 4)
+                (> (- (match-end 3) (match-beginning 3)) 4))
+            (error "Invalid RGB color specification: %s" color)
+          (setq str (match-string 1 color)
+                r (* (font-hex-string-to-number str)
+                     (expt 16 (- 4 (length str))))
+                str (match-string 2 color)
+                g (* (font-hex-string-to-number str)
+                     (expt 16 (- 4 (length str))))
+                str (match-string 3 color)
+                b (* (font-hex-string-to-number str)
+                     (expt 16 (- 4 (length str)))))))
+       (t
+        (font-warn 'html (format "Invalid RGB color specification: %s"
+                               color))
+        (setq r 0
+              g 0
+              b 0)))
+  (list r g b) ))
+
+(defsubst font-rgb-color-p (obj)
+  (or (and (vectorp obj)
+          (= (length obj) 4)
+          (eq (aref obj 0) 'rgb))))
+
+(defsubst font-rgb-color-red (obj) (aref obj 1))
+(defsubst font-rgb-color-green (obj) (aref obj 2))
+(defsubst font-rgb-color-blue (obj) (aref obj 3))
+
+(defun font-color-rgb-components (color)
+  "Return the RGB components of COLOR as a list of integers (R G B).
+16-bit values are always returned.
+#FEFEFE and rgb:fe/fe/fe style color specifications are parsed directly
+into their components.
+RGB values for color names are looked up in the rgb.txt file.
+The variable x-library-search-path is use to locate the rgb.txt file."
+  (let ((case-fold-search t))
+    (cond
+     ((and (font-rgb-color-p color) (floatp (aref color 1)))
+      (list (* 65535 (aref color 0))
+           (* 65535 (aref color 1))
+           (* 65535 (aref color 2))))
+     ((font-rgb-color-p color)
+      (list (font-rgb-color-red color)
+           (font-rgb-color-green color)
+           (font-rgb-color-blue color)))
+     ((and (vectorp color) (= 3 (length color)))
+      (list (aref color 0) (aref color 1) (aref color 2)))
+     ((and (listp color) (= 3 (length color)) (floatp (car color)))
+      (mapcar (function (lambda (x) (* x 65535))) color))
+     ((and (listp color) (= 3 (length color)))
+      color)
+     ((or (string-match "^#" color)
+         (string-match "^rgb:" color))
+      (font-parse-rgb-components color))
+     ((string-match "\\([0-9.]+\\)[ \t]\\([0-9.]+\\)[ \t]\\([0-9.]+\\)"
+                   color)
+      (let ((r (string-to-number (match-string 1 color)))
+           (g (string-to-number (match-string 2 color)))
+           (b (string-to-number (match-string 3 color))))
+       (if (floatp r)
+           (setq r (round (* 255 r))
+                 g (round (* 255 g))
+                 b (round (* 255 b))))
+       (font-parse-rgb-components (format "#%02x%02x%02x" r g b))))
+     (t
+      (font-lookup-rgb-components color)))))
+
+(defsubst font-tty-compute-color-delta (col1 col2)
+  (+ 
+   (* (- (aref col1 0) (aref col2 0))
+      (- (aref col1 0) (aref col2 0)))
+   (* (- (aref col1 1) (aref col2 1))
+      (- (aref col1 1) (aref col2 1)))
+   (* (- (aref col1 2) (aref col2 2))
+      (- (aref col1 2) (aref col2 2)))))
+
+(defun font-tty-find-closest-color (r g b)
+  ;; This is basically just a lisp copy of allocate_nearest_color
+  ;; from objects-x.c from Emacs 19
+  ;; We really should just check tty-color-list, but unfortunately
+  ;; that does not include any RGB information at all.
+  ;; So for now we just hardwire in the default list and call it
+  ;; good for now.
+  (setq r (/ r 65535.0)
+       g (/ g 65535.0)
+       b (/ b 65535.0))
+  (let* ((color_def (vector r g b))
+        (colors [([1.0 1.0 1.0] . "white")
+                 ([0.0 1.0 1.0] . "cyan")
+                 ([1.0 0.0 1.0] . "magenta")
+                 ([0.0 0.0 1.0] . "blue")
+                 ([1.0 1.0 0.0] . "yellow")
+                 ([0.0 1.0 0.0] . "green")
+                 ([1.0 0.0 0.0] . "red")
+                 ([0.0 0.0 0.0] . "black")])
+        (no_cells (length colors))
+        (x 1)
+        (nearest 0)
+        (nearest_delta 0)
+        (trial_delta 0))
+    (setq nearest_delta (font-tty-compute-color-delta (car (aref colors 0))
+                                                     color_def))
+    (while (/= no_cells x)
+      (setq trial_delta (font-tty-compute-color-delta (car (aref colors x))
+                                                     color_def))
+      (if (< trial_delta nearest_delta)
+         (setq nearest x
+               nearest_delta trial_delta))
+      (setq x (1+ x)))
+    (cdr-safe (aref colors nearest))))
+
+(defun font-normalize-color (color &optional device)
+  "Return an RGB tuple, given any form of input.  If an error occurs, black
+is returned."
+  (case (device-type device)
+   ((x pm)
+    (apply 'format "#%02x%02x%02x" (font-color-rgb-components color)))
+   (win32
+    (let* ((rgb (font-color-rgb-components color))
+          (color (apply 'format "#%02x%02x%02x" rgb)))
+      (win32-define-rgb-color (nth 0 rgb) (nth 1 rgb) (nth 2 rgb) color)
+      color))
+   (w32
+    (let* ((rgb (font-color-rgb-components color))
+          (color (apply 'format "#%02x%02x%02x" rgb)))
+      (w32-define-rgb-color (nth 0 rgb) (nth 1 rgb) (nth 2 rgb) color)
+      color))
+   (tty
+    (apply 'font-tty-find-closest-color (font-color-rgb-components color)))
+   (ns
+    (let ((vals (mapcar (function (lambda (x) (>> x 8)))
+                       (font-color-rgb-components color))))
+      (apply 'format "RGB%02x%02x%02xff" vals)))
+   (otherwise
+    color)))
+
+(defun font-set-face-background (&optional face color &rest args)
+  (interactive)
+  (condition-case nil
+      (cond
+       ((or (font-rgb-color-p color)
+           (string-match "^#[0-9a-fA-F]+$" color))
+       (apply 'set-face-background face
+              (font-normalize-color color) args))
+       (t
+       (apply 'set-face-background face color args)))
+    (error nil)))
+
+(defun font-set-face-foreground (&optional face color &rest args)
+  (interactive)
+  (condition-case nil
+      (cond
+       ((or (font-rgb-color-p color)
+           (string-match "^#[0-9a-fA-F]+$" color))
+       (apply 'set-face-foreground face (font-normalize-color color) args))
+       (t
+       (apply 'set-face-foreground face color args)))
+    (error nil)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Support for 'blinking' fonts
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun font-map-windows (func &optional arg frame)
+  (let* ((start (selected-window))
+        (cur start)
+        (result nil))
+    (push (funcall func start arg) result)
+    (while (not (eq start (setq cur (next-window cur))))
+      (push (funcall func cur arg) result))
+    result))
+
+(defun font-face-visible-in-window-p (window face)
+  (let ((st (window-start window))
+       (nd (window-end window))
+       (found nil)
+       (face-at nil))
+    (setq face-at (get-text-property st 'face (window-buffer window)))
+    (if (or (eq face face-at) (and (listp face-at) (memq face face-at)))
+       (setq found t))
+    (while (and (not found)
+               (/= nd
+                   (setq st (next-single-property-change
+                             st 'face
+                             (window-buffer window) nd))))
+      (setq face-at (get-text-property st 'face (window-buffer window)))
+      (if (or (eq face face-at) (and (listp face-at) (memq face face-at)))
+         (setq found t)))
+    found))
+  
+(defun font-blink-callback ()
+  ;; Optimized to never invert the face unless one of the visible windows
+  ;; is showing it.
+  (let ((faces (if font-running-xemacs (face-list t) (face-list)))
+       (obj nil))
+    (while faces
+      (if (and (setq obj (face-property (car faces) 'font-specification))
+              (font-blink-p obj)
+              (memq t
+                    (font-map-windows 'font-face-visible-in-window-p (car 
faces))))
+         (invert-face (car faces)))
+      (pop faces))))
+
+(defcustom font-blink-interval 0.5
+  "How often to blink faces"
+  :type 'number
+  :group 'faces)
+  
+(defun font-blink-initialize ()
+  (cond
+   ((featurep 'itimer)
+    (if (get-itimer "font-blinker")
+       (delete-itimer (get-itimer "font-blinker")))
+    (start-itimer "font-blinker" 'font-blink-callback
+                 font-blink-interval
+                 font-blink-interval))
+   ((fboundp 'run-at-time)
+    (cancel-function-timers 'font-blink-callback)    
+    (run-at-time font-blink-interval
+                font-blink-interval
+                'font-blink-callback))
+   (t nil)))
+  
+(provide 'font)
diff --git a/lisp/images.el b/lisp/images.el
new file mode 100644
index 0000000..be7892c
--- /dev/null
+++ b/lisp/images.el
@@ -0,0 +1,209 @@
+;;; images.el --- Automatic image converters
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:07 $
+;; Version: $Revision: 1.1 $
+;; Keywords: images
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1995 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The emacsen compatibility package - load it up before anything else
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'mule-sysdp)
+
+(eval-and-compile
+  (if (not (and (string-match "XEmacs" emacs-version)
+               (or (> emacs-major-version 19)
+                   (>= emacs-minor-version 14))))
+      (require 'w3-sysdp)))
+
+(defvar image-temp-stack nil "Do no touch - internal storage.")
+(defvar image-converters nil "Storage for the image converters.")
+(defvar image-native-formats
+  (delq nil (cons (if (featurep 'x) 'xbm)
+                 (mapcar (function (lambda (x) (if (featurep x) x)))
+                         '(xpm gif jpeg tiff png imagick))))
+  "A list of image formats that this version of emacs supports natively.")
+
+(defun image-register-converter (from to converter)
+  "Register the image converter for FROM to TO.  CONVERTER is the actual
+command used to convert the image.  If this is a string, it will be executed
+in a subprocess.  If a symbol, it is assumed to be a function.  It will be
+called with two arguments, the start and end of the data to be converted.
+The function should replace that data with the new image data.  The return
+value is not significant."
+  (let* ((node (assq from image-converters))
+        (replace (assq to (cdr-safe node))))
+    (cond
+     (replace                          ; Replace existing converter
+      (setcdr replace converter)
+      (display-warning 'image (format "Replacing image converter %s->%s"
+                                     from to)))
+     (node                             ; Add to existing node
+      (setcdr node (cons (cons to converter) (cdr node))))
+     (t                                        ; New toplevel converter
+      (setq image-converters (cons (cons from (list (cons to converter)))
+                                  image-converters))))))
+
+(defun image-unregister-converter (from to)
+  "Unregister the image converter for FROM to TO"
+  (let* ((node (assq from image-converters))
+        (tos (cdr-safe node))
+        (new nil))
+    (while tos
+      (if (eq to (car (car tos)))
+         nil
+       (setq new (cons (car tos) new)))
+      (setq tos (cdr tos)))
+    (setcdr node new)))
+
+(defun image-converter-registered-p (from to)
+  (cdr-safe (assq to (cdr-safe (assq from image-converters)))))
+
+(defun image-converter-chain (from to)
+  "Return the shortest converter chain for image format FROM to TO"
+  (setq image-temp-stack (cons from image-temp-stack))
+  (let ((converters (cdr-safe (assq from image-converters)))
+       (thisone nil)
+       (possibles nil)
+       (done nil))
+    (while (and (not done) converters)
+      (setq thisone  (car converters))
+      (cond
+       ((eq (car thisone) to)
+       (setq done t))
+       ((memq (car thisone) image-temp-stack)
+       nil)
+       (t
+       (setq possibles (cons (image-converter-chain (car thisone) to)
+                             possibles))))
+      (setq converters (cdr converters)))
+    (setq image-temp-stack (cdr image-temp-stack)
+         possibles (sort (delq nil possibles)
+                         (function
+                          (lambda (x y)
+                            (< (length (delete 'ignore x))
+                               (length (delete 'ignore y)))))))
+    (if (not done)
+       (setq done (car possibles)))
+    (cond
+     ((eq done t) (list (cdr thisone)))
+     (done (setq done (cons (cdr thisone) done)))
+     (t nil))))
+
+(defun image-normalize (format data)
+  "Return an image specification for XEmacs 19.13 and later.  FORMAT specifies
+the image format, DATA is the image data as a string.  Any conversions to get
+to a suitable internal image format will be carried out."
+  (setq image-temp-stack nil)
+  (if (stringp format) (setq format (intern format)))
+  (if (not (memq format image-native-formats))
+      (let* ((winner (car-safe
+                     (sort (mapcar
+                            (function
+                             (lambda (x)
+                               (cons x
+                                     (delete 'ignore
+                                             (image-converter-chain format
+                                                                    x)))))
+                                   image-native-formats)
+                           (function
+                            (lambda (x y)
+                              (cond
+                               ((null (cdr x)) nil)
+                               ((= (length (cdr x))
+                                   (length (cdr y)))
+                                (< (length (memq (car x)
+                                                 image-native-formats))
+                                   (length (memq (car y)
+                                                 image-native-formats))))
+                               (t
+                                (< (length (cdr x))
+                                   (length (cdr y))))))))))
+            (type (car-safe winner))
+            (chain (cdr-safe winner))
+            )
+       (if chain
+           (save-excursion
+             (set-buffer (generate-new-buffer " *image-conversion*"))
+             (erase-buffer)
+             (insert data)
+             (while chain
+               (cond
+                ((stringp (car chain))
+                 (let ((file-coding-system mule-no-coding-system))
+                   (call-process-region
+                    (point-min) (point-max)
+                    shell-file-name t
+                    (list (current-buffer) nil)
+                    shell-command-switch
+                    (car chain))))
+                ((and (symbolp (car chain)) (fboundp (car chain)))
+                 (funcall (car chain) (point-min) (point-max))))
+               (setq chain (cdr chain)))
+             (setq data (buffer-string))
+             (kill-buffer (current-buffer)))
+         (setq type format))
+       (vector type ':data data))
+    (vector format ':data data)))
+
+(defun image-register-netpbm-utilities ()
+  "Register all the netpbm utility packages converters."
+  (interactive)
+  (if (image-converter-registered-p 'pgm 'pbm)
+      nil
+    (image-register-converter 'pgm 'pbm "pgmtopbm")
+    (image-register-converter 'ppm 'pgm "ppmtopgm")
+    (image-register-converter 'pnm 'xpm "ppmtoxpm")
+    (image-register-converter 'ppm 'xpm "ppmtoxpm)")
+    (image-register-converter 'xpm 'ppm "xpmtoppm")
+    (image-register-converter 'gif 'ppm "giftopnm")
+    (image-register-converter 'pnm 'gif "(ppmquant 256 | ppmtogif)")
+    (image-register-converter 'ppm 'gif "(ppmquant 256 | ppmtogif)")
+    (image-register-converter 'bmp 'ppm "bmptoppm")
+    (image-register-converter 'ppm 'bmp "ppmtobmp")
+    (image-register-converter 'ppm 'ps "pnmtops")
+    (image-register-converter 'pnm 'ps "pnmtops")
+    (image-register-converter 'ps 'pnm "pstopnm")
+    (image-register-converter 'g3  'pbm "g3topbm")
+    (image-register-converter 'macpt 'pbm "macptopbm")
+    (image-register-converter 'pbm 'macpt "pbmtomacp")
+    (image-register-converter 'pcx 'ppm "pcxtoppm")
+    (image-register-converter 'ppm 'pcx "ppmtopcx")
+    (image-register-converter 'pict 'ppm "picttoppm")
+    (image-register-converter 'ppm 'pict "ppmtopict")
+    (image-register-converter 'pnm 'sgi "pnmtosgi")
+    (image-register-converter 'tga 'ppm "tgatoppm")
+    (image-register-converter 'ppm 'tga "ppmtotga")
+    (image-register-converter 'sgi 'pnm "sgitopnm")
+    (image-register-converter 'tiff 'pnm "tifftopnm")
+    (image-register-converter 'pnm 'tiff "pnmtotiff")
+    (image-register-converter 'xbm 'pbm "xbmtopbm")
+    (image-register-converter 'pbm 'xbm "pbmtoxbm")
+    (image-register-converter 'png 'pnm "pngtopnm")
+    (image-register-converter 'pnm 'png "pnmtopng")
+    (image-register-converter 'pnm 'jbg "pbmtojbg")
+    (image-register-converter 'jbg 'pnm "jbgtopbm")
+    (image-register-converter 'jpeg 'ppm "djpeg")))
+   
+(provide 'images)
diff --git a/lisp/md5.el b/lisp/md5.el
new file mode 100644
index 0000000..b4a64e9
--- /dev/null
+++ b/lisp/md5.el
@@ -0,0 +1,406 @@
+;;; md5.el -- MD5 Message Digest Algorithm
+;;; Gareth Rees <address@hidden>
+
+;; LCD Archive Entry:
+;; md5|Gareth Rees|address@hidden|
+;; MD5 cryptographic message digest algorithm|
+;; 13-Nov-95|1.0|~/misc/md5.el.Z|
+
+;;; Details: ------------------------------------------------------------------
+
+;; This is a direct translation into Emacs LISP of the reference C
+;; implementation of the MD5 Message-Digest Algorithm written by RSA
+;; Data Security, Inc.
+;; 
+;; The algorithm takes a message (that is, a string of bytes) and
+;; computes a 16-byte checksum or "digest" for the message.  This digest
+;; is supposed to be cryptographically strong in the sense that if you
+;; are given a 16-byte digest D, then there is no easier way to
+;; construct a message whose digest is D than to exhaustively search the
+;; space of messages.  However, the robustness of the algorithm has not
+;; been proven, and a similar algorithm (MD4) was shown to be unsound,
+;; so treat with caution!
+;; 
+;; The C algorithm uses 32-bit integers; because GNU Emacs
+;; implementations provide 28-bit integers (with 24-bit integers on
+;; versions prior to 19.29), the code represents a 32-bit integer as the
+;; cons of two 16-bit integers.  The most significant word is stored in
+;; the car and the least significant in the cdr.  The algorithm requires
+;; at least 17 bits of integer representation in order to represent the
+;; carry from a 16-bit addition.
+
+;;; Usage: --------------------------------------------------------------------
+
+;; To compute the MD5 Message Digest for a message M (represented as a
+;; string or as a vector of bytes), call
+;; 
+;;   (md5-encode M)
+;; 
+;; which returns the message digest as a vector of 16 bytes.  If you
+;; need to supply the message in pieces M1, M2, ... Mn, then call
+;; 
+;;   (md5-init)
+;;   (md5-update M1)
+;;   (md5-update M2)
+;;   ...
+;;   (md5-update Mn)
+;;   (md5-final)
+
+;;; Copyright and licence: ----------------------------------------------------
+
+;; Copyright (C) 1995, 1996, 1997 by Gareth Rees
+;; Derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm
+;; 
+;; md5.el is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by the
+;; Free Software Foundation; either version 2, or (at your option) any
+;; later version.
+;; 
+;; md5.el is distributed in the hope that it will be useful, but WITHOUT
+;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+;; FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+;; for more details.
+;; 
+;; The original copyright notice is given below, as required by the
+;; licence for the original code.  This code is distributed under *both*
+;; RSA's original licence and the GNU General Public Licence.  (There
+;; should be no problems, as the former is more liberal than the
+;; latter).
+
+;;; Original copyright notice: ------------------------------------------------
+
+;; Copyright (C) 1990, RSA Data Security, Inc. All rights reserved.
+;;
+;; License to copy and use this software is granted provided that it is
+;; identified as the "RSA Data Security, Inc. MD5 Message- Digest
+;; Algorithm" in all material mentioning or referencing this software or
+;; this function.
+;;
+;; License is also granted to make and use derivative works provided
+;; that such works are identified as "derived from the RSA Data
+;; Security, Inc. MD5 Message-Digest Algorithm" in all material
+;; mentioning or referencing the derived work.
+;;
+;; RSA Data Security, Inc. makes no representations concerning either
+;; the merchantability of this software or the suitability of this
+;; software for any particular purpose.  It is provided "as is" without
+;; express or implied warranty of any kind.
+;;
+;; These notices must be retained in any copies of any part of this
+;; documentation and/or software.
+
+;;; Code: ---------------------------------------------------------------------
+
+(defvar md5-program "md5"
+  "*Program that reads a message on its standard input and writes an
+MD5 digest on its output.")
+
+(defvar md5-maximum-internal-length 4096
+  "*The maximum size of a piece of data that should use the MD5 routines
+written in lisp.  If a message exceeds this, it will be run through an
+external filter for processing.  Also see the `md5-program' variable.
+This variable has no effect if you call the md5-init|update|final
+functions - only used by the `md5' function's simpler interface.")
+
+(defvar md5-bits (make-vector 4 0)
+  "Number of bits handled, modulo 2^64.
+Represented as four 16-bit numbers, least significant first.")
+(defvar md5-buffer (make-vector 4 '(0 . 0))
+  "Scratch buffer (four 32-bit integers).")
+(defvar md5-input (make-vector 64 0)
+  "Input buffer (64 bytes).")
+
+(defun md5-unhex (x)
+  (if (> x ?9)
+      (if (>= x ?a)
+         (+ 10 (- x ?a))
+       (+ 10 (- x ?A)))
+    (- x ?0)))
+
+(defun md5-encode (message)
+  "Encodes MESSAGE using the MD5 message digest algorithm.
+MESSAGE must be a string or an array of bytes.
+Returns a vector of 16 bytes containing the message digest."
+  (if (<= (length message) md5-maximum-internal-length)
+      (progn
+       (md5-init)
+       (md5-update message)
+       (md5-final))
+    (save-excursion
+      (set-buffer (get-buffer-create " *md5-work*"))
+      (erase-buffer)
+      (insert message)
+      (call-process-region (point-min) (point-max)
+                          md5-program
+                          t (current-buffer))
+      ;; MD5 digest is 32 chars long
+      ;; mddriver adds a newline to make neaten output for tty
+      ;; viewing, make sure we leave it behind.
+      (let ((data (buffer-substring (point-min) (+ (point-min) 32)))
+           (vec (make-vector 16 0))
+           (ctr 0))
+       (while (< ctr 16)
+         (aset vec ctr (+ (* 16 (md5-unhex (aref data (* ctr 2))))
+                          (md5-unhex (aref data (1+ (* ctr 2))))))
+         (setq ctr (1+ ctr)))))))
+
+(defsubst md5-add (x y)
+  "Return 32-bit sum of 32-bit integers X and Y."
+  (let ((m (+ (car x) (car y)))
+        (l (+ (cdr x) (cdr y))))
+    (cons (logand 65535 (+ m (lsh l -16))) (logand l 65535))))
+
+;; FF, GG, HH and II are basic MD5 functions, providing transformations
+;; for rounds 1, 2, 3 and 4 respectively.  Each function follows this
+;; pattern of computation (where ROTATE(x,y) means rotate 32-bit value x
+;; by y bits to the left):
+;; 
+;;   FF(a,b,c,d,x,s,ac) = ROTATE(a + F(b,c,d) + x + ac,s) + b
+;; 
+;; so we use the macro `md5-make-step' to construct each one.  The
+;; helper functions F, G, H and I operate on 16-bit numbers; the full
+;; operation splits its inputs, operates on the halves separately and
+;; then puts the results together.
+
+(defsubst md5-F (x y z) (logior (logand x y) (logand (lognot x) z)))
+(defsubst md5-G (x y z) (logior (logand x z) (logand y (lognot z))))
+(defsubst md5-H (x y z) (logxor x y z))
+(defsubst md5-I (x y z) (logxor y (logior x (logand 65535 (lognot z)))))
+
+(defmacro md5-make-step (name func)
+  (`
+   (defun (, name) (a b c d x s ac)
+     (let*
+         ((m1 (+ (car a) ((, func) (car b) (car c) (car d)) (car x) (car ac)))
+          (l1 (+ (cdr a) ((, func) (cdr b) (cdr c) (cdr d)) (cdr x) (cdr ac)))
+          (m2 (logand 65535 (+ m1 (lsh l1 -16))))
+          (l2 (logand 65535 l1))
+          (m3 (logand 65535 (if (> s 15)
+                                (+ (lsh m2 (- s 32)) (lsh l2 (- s 16)))
+                              (+ (lsh m2 s) (lsh l2 (- s 16))))))
+          (l3 (logand 65535 (if (> s 15)
+                                (+ (lsh l2 (- s 32)) (lsh m2 (- s 16)))
+                              (+ (lsh l2 s) (lsh m2 (- s 16)))))))
+       (md5-add (cons m3 l3) b)))))
+
+(md5-make-step md5-FF md5-F)
+(md5-make-step md5-GG md5-G)
+(md5-make-step md5-HH md5-H)
+(md5-make-step md5-II md5-I)
+
+(defun md5-init ()
+  "Initialise the state of the message-digest routines."
+  (aset md5-bits 0 0)
+  (aset md5-bits 1 0)
+  (aset md5-bits 2 0)
+  (aset md5-bits 3 0)
+  (aset md5-buffer 0 '(26437 .  8961))
+  (aset md5-buffer 1 '(61389 . 43913))
+  (aset md5-buffer 2 '(39098 . 56574))
+  (aset md5-buffer 3 '( 4146 . 21622)))
+
+(defun md5-update (string)
+  "Update the current MD5 state with STRING (an array of bytes)."
+  (let ((len (length string))
+        (i 0)
+        (j 0))
+    (while (< i len)
+      ;; Compute number of bytes modulo 64
+      (setq j (% (/ (aref md5-bits 0) 8) 64))
+
+      ;; Store this byte (truncating to 8 bits to be sure)
+      (aset md5-input j (logand 255 (aref string i)))
+
+      ;; Update number of bits by 8 (modulo 2^64)
+      (let ((c 8) (k 0))
+        (while (and (> c 0) (< k 4))
+          (let ((b (aref md5-bits k)))
+            (aset md5-bits k (logand 65535 (+ b c)))
+            (setq c (if (> b (- 65535 c)) 1 0)
+                  k (1+ k)))))
+
+      ;; Increment number of bytes processed
+      (setq i (1+ i))
+
+      ;; When 64 bytes accumulated, pack them into sixteen 32-bit
+      ;; integers in the array `in' and then tranform them.
+      (if (= j 63)
+          (let ((in (make-vector 16 (cons 0 0)))
+                (k 0)
+                (kk 0))
+            (while (< k 16)
+              (aset in k (md5-pack md5-input kk))
+              (setq k (+ k 1) kk (+ kk 4)))
+            (md5-transform in))))))
+
+(defun md5-pack (array i)
+  "Pack the four bytes at ARRAY reference I to I+3 into a 32-bit integer."
+  (cons (+ (lsh (aref array (+ i 3)) 8) (aref array (+ i 2)))
+        (+ (lsh (aref array (+ i 1)) 8) (aref array (+ i 0)))))
+
+(defun md5-byte (array n b)
+  "Unpack byte B (0 to 3) from Nth member of ARRAY of 32-bit integers."
+  (let ((e (aref array n)))
+    (cond ((eq b 0) (logand 255 (cdr e)))
+          ((eq b 1) (lsh (cdr e) -8))
+          ((eq b 2) (logand 255 (car e)))
+          ((eq b 3) (lsh (car e) -8)))))
+
+(defun md5-final ()
+  (let ((in (make-vector 16 (cons 0 0)))
+        (j 0)
+        (digest (make-vector 16 0))
+        (padding))
+
+    ;; Save the number of bits in the message
+    (aset in 14 (cons (aref md5-bits 1) (aref md5-bits 0)))
+    (aset in 15 (cons (aref md5-bits 3) (aref md5-bits 2)))
+
+    ;; Compute number of bytes modulo 64
+    (setq j (% (/ (aref md5-bits 0) 8) 64))
+
+    ;; Pad out computation to 56 bytes modulo 64
+    (setq padding (make-vector (if (< j 56) (- 56 j) (- 120 j)) 0))
+    (aset padding 0 128)
+    (md5-update padding)
+
+    ;; Append length in bits and transform
+    (let ((k 0) (kk 0))
+      (while (< k 14)
+        (aset in k (md5-pack md5-input kk))
+        (setq k (+ k 1) kk (+ kk 4))))
+    (md5-transform in)
+
+    ;; Store the results in the digest
+    (let ((k 0) (kk 0))
+      (while (< k 4)
+        (aset digest (+ kk 0) (md5-byte md5-buffer k 0))
+        (aset digest (+ kk 1) (md5-byte md5-buffer k 1))
+        (aset digest (+ kk 2) (md5-byte md5-buffer k 2))
+        (aset digest (+ kk 3) (md5-byte md5-buffer k 3))
+        (setq k (+ k 1) kk (+ kk 4))))
+
+    ;; Return digest
+    digest))
+
+;; It says in the RSA source, "Note that if the Mysterious Constants are
+;; arranged backwards in little-endian order and decrypted with the DES
+;; they produce OCCULT MESSAGES!"  Security through obscurity?
+
+(defun md5-transform (in)
+  "Basic MD5 step. Transform md5-buffer based on array IN."
+  (let ((a (aref md5-buffer 0))
+        (b (aref md5-buffer 1))
+        (c (aref md5-buffer 2))
+        (d (aref md5-buffer 3)))
+    (setq
+     a (md5-FF a b c d (aref in  0)  7 '(55146 . 42104))
+     d (md5-FF d a b c (aref in  1) 12 '(59591 . 46934))
+     c (md5-FF c d a b (aref in  2) 17 '( 9248 . 28891))
+     b (md5-FF b c d a (aref in  3) 22 '(49597 . 52974))
+     a (md5-FF a b c d (aref in  4)  7 '(62844 .  4015))
+     d (md5-FF d a b c (aref in  5) 12 '(18311 . 50730))
+     c (md5-FF c d a b (aref in  6) 17 '(43056 . 17939))
+     b (md5-FF b c d a (aref in  7) 22 '(64838 . 38145))
+     a (md5-FF a b c d (aref in  8)  7 '(27008 . 39128))
+     d (md5-FF d a b c (aref in  9) 12 '(35652 . 63407))
+     c (md5-FF c d a b (aref in 10) 17 '(65535 . 23473))
+     b (md5-FF b c d a (aref in 11) 22 '(35164 . 55230))
+     a (md5-FF a b c d (aref in 12)  7 '(27536 .  4386))
+     d (md5-FF d a b c (aref in 13) 12 '(64920 . 29075))
+     c (md5-FF c d a b (aref in 14) 17 '(42617 . 17294))
+     b (md5-FF b c d a (aref in 15) 22 '(18868 .  2081))
+     a (md5-GG a b c d (aref in  1)  5 '(63006 .  9570))
+     d (md5-GG d a b c (aref in  6)  9 '(49216 . 45888))
+     c (md5-GG c d a b (aref in 11) 14 '( 9822 . 23121))
+     b (md5-GG b c d a (aref in  0) 20 '(59830 . 51114))
+     a (md5-GG a b c d (aref in  5)  5 '(54831 .  4189))
+     d (md5-GG d a b c (aref in 10)  9 '(  580 .  5203))
+     c (md5-GG c d a b (aref in 15) 14 '(55457 . 59009))
+     b (md5-GG b c d a (aref in  4) 20 '(59347 . 64456))
+     a (md5-GG a b c d (aref in  9)  5 '( 8673 . 52710))
+     d (md5-GG d a b c (aref in 14)  9 '(49975 .  2006))
+     c (md5-GG c d a b (aref in  3) 14 '(62677 .  3463))
+     b (md5-GG b c d a (aref in  8) 20 '(17754 .  5357))
+     a (md5-GG a b c d (aref in 13)  5 '(43491 . 59653))
+     d (md5-GG d a b c (aref in  2)  9 '(64751 . 41976))
+     c (md5-GG c d a b (aref in  7) 14 '(26479 .   729))
+     b (md5-GG b c d a (aref in 12) 20 '(36138 . 19594))
+     a (md5-HH a b c d (aref in  5)  4 '(65530 . 14658))
+     d (md5-HH d a b c (aref in  8) 11 '(34673 . 63105))
+     c (md5-HH c d a b (aref in 11) 16 '(28061 . 24866))
+     b (md5-HH b c d a (aref in 14) 23 '(64997 . 14348))
+     a (md5-HH a b c d (aref in  1)  4 '(42174 . 59972))
+     d (md5-HH d a b c (aref in  4) 11 '(19422 . 53161))
+     c (md5-HH c d a b (aref in  7) 16 '(63163 . 19296))
+     b (md5-HH b c d a (aref in 10) 23 '(48831 . 48240))
+     a (md5-HH a b c d (aref in 13)  4 '(10395 . 32454))
+     d (md5-HH d a b c (aref in  0) 11 '(60065 . 10234))
+     c (md5-HH c d a b (aref in  3) 16 '(54511 . 12421))
+     b (md5-HH b c d a (aref in  6) 23 '( 1160 .  7429))
+     a (md5-HH a b c d (aref in  9)  4 '(55764 . 53305))
+     d (md5-HH d a b c (aref in 12) 11 '(59099 . 39397))
+     c (md5-HH c d a b (aref in 15) 16 '( 8098 . 31992))
+     b (md5-HH b c d a (aref in  2) 23 '(50348 . 22117))
+     a (md5-II a b c d (aref in  0)  6 '(62505 .  8772))
+     d (md5-II d a b c (aref in  7) 10 '(17194 . 65431))
+     c (md5-II c d a b (aref in 14) 15 '(43924 .  9127))
+     b (md5-II b c d a (aref in  5) 21 '(64659 . 41017))
+     a (md5-II a b c d (aref in 12)  6 '(25947 . 22979))
+     d (md5-II d a b c (aref in  3) 10 '(36620 . 52370))
+     c (md5-II c d a b (aref in 10) 15 '(65519 . 62589))
+     b (md5-II b c d a (aref in  1) 21 '(34180 . 24017))
+     a (md5-II a b c d (aref in  8)  6 '(28584 . 32335))
+     d (md5-II d a b c (aref in 15) 10 '(65068 . 59104))
+     c (md5-II c d a b (aref in  6) 15 '(41729 . 17172))
+     b (md5-II b c d a (aref in 13) 21 '(19976 .  4513))
+     a (md5-II a b c d (aref in  4)  6 '(63315 . 32386))
+     d (md5-II d a b c (aref in 11) 10 '(48442 . 62005))
+     c (md5-II c d a b (aref in  2) 15 '(10967 . 53947))
+     b (md5-II b c d a (aref in  9) 21 '(60294 . 54161)))
+
+     (aset md5-buffer 0 (md5-add (aref md5-buffer 0) a))
+     (aset md5-buffer 1 (md5-add (aref md5-buffer 1) b))
+     (aset md5-buffer 2 (md5-add (aref md5-buffer 2) c))
+     (aset md5-buffer 3 (md5-add (aref md5-buffer 3) d))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Here begins the merger with the XEmacs API and the md5.el from the URL
+;;; package.  Courtesy address@hidden
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun md5 (object &optional start end)
+  "Return the MD5 (a secure message digest algorithm) of an object.
+OBJECT is either a string or a buffer.
+Optional arguments START and END denote buffer positions for computing the
+hash of a portion of OBJECT."
+ (let ((buffer nil))
+    (unwind-protect
+       (save-excursion
+         (setq buffer (generate-new-buffer " *md5-work*"))
+         (set-buffer buffer)
+         (cond
+          ((bufferp object)
+           (insert-buffer-substring object start end))
+          ((stringp object)
+           (insert (if (or start end)
+                       (substring object start end)
+                     object)))
+          (t nil))
+         (prog1
+             (if (<= (point-max) md5-maximum-internal-length)
+                 (mapconcat
+                  (function (lambda (node) (format "%02x" node)))
+                  (md5-encode (buffer-string))
+                  "")
+               (call-process-region (point-min) (point-max)
+                                    shell-file-name
+                                    t buffer nil
+                                    shell-command-switch md5-program)
+               ;; MD5 digest is 32 chars long
+               ;; mddriver adds a newline to make neaten output for tty
+               ;; viewing, make sure we leave it behind.
+               (buffer-substring (point-min) (+ (point-min) 32)))
+           (kill-buffer buffer)))
+      (and buffer (buffer-name buffer) (kill-buffer buffer) nil))))
+
+(provide 'md5)
diff --git a/lisp/mm.el b/lisp/mm.el
new file mode 100644
index 0000000..0021241
--- /dev/null
+++ b/lisp/mm.el
@@ -0,0 +1,1279 @@
+;;; mm.el,v --- Mailcap parsing routines, and MIME handling
+;; Author: wmperry
+;; Created: 1996/05/28 02:46:51
+;; Version: 1.96
+;; Keywords: mail, news, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1994, 1995, 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Generalized mailcap parsing and access routines
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; Data structures
+;;; ---------------
+;;; The mailcap structure is an assoc list of assoc lists.
+;;; 1st assoc list is keyed on the major content-type
+;;; 2nd assoc list is keyed on the minor content-type (which can be a regexp)
+;;;
+;;; Which looks like:
+;;; -----------------
+;;; (
+;;;  ("application"
+;;;   ("postscript" . <info>)
+;;;  )
+;;;  ("text"
+;;;   ("plain" . <info>)
+;;;  )
+;;; )
+;;;
+;;; Where <info> is another assoc list of the various information
+;;; related to the mailcap RFC.  This is keyed on the lowercase
+;;; attribute name (viewer, test, etc).  This looks like:
+;;; (("viewer" . viewerinfo)
+;;;  ("test"   . testinfo)
+;;;  ("xxxx"   . "string")
+;;; )
+;;;
+;;; Where viewerinfo specifies how the content-type is viewed.  Can be
+;;; a string, in which case it is run through a shell, with
+;;; appropriate parameters, or a symbol, in which case the symbol is
+;;; funcall'd, with the buffer as an argument.
+;;;
+;;; testinfo is a list of strings, or nil.  If nil, it means the
+;;; viewer specified is always valid.  If it is a list of strings,
+;;; these are used to determine whether a viewer passes the 'test' or
+;;; not.
+;;;
+;;; The main interface to this code is:
+;;;
+;;; To set everything up:
+;;;
+;;;  (mm-parse-mailcaps [path])
+;;;
+;;;  Where PATH is a unix-style path specification (: separated list
+;;;  of strings).  If PATH is nil, the environment variable MAILCAPS
+;;;  will be consulted.  If there is no environment variable, then a
+;;;  default list of paths is used.
+;;;
+;;; To retrieve the information:
+;;;  (mm-mime-info st [nd] [request])
+;;;
+;;;  Where st and nd are positions in a buffer that contain the
+;;;  content-type header information of a mail/news/whatever message.
+;;;  st can optionally be a string that contains the content-type
+;;;  information.
+;;;
+;;;  Third argument REQUEST specifies what information to return.  If
+;;;  it is nil or the empty string, the viewer (second field of the
+;;;  mailcap entry) will be returned.  If it is a string, then the
+;;;  mailcap field corresponding to that string will be returned
+;;;  (print, description, whatever).  If a number, then all the
+;;;  information for this specific viewer is returned.
+;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Variables, etc
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(eval-and-compile
+  (require 'cl)
+  (require 'devices))
+
+(defconst mm-version (let ((x "1.96"))
+                      (if (string-match "Revision: \\([^ \t\n]+\\)" x)
+                          (substring x (match-beginning 1) (match-end 1))
+                        x))
+  "Version # of MM package")
+
+(defvar mm-parse-args-syntax-table
+  (copy-syntax-table emacs-lisp-mode-syntax-table)
+  "A syntax table for parsing sgml attributes.")
+
+(modify-syntax-entry ?' "\"" mm-parse-args-syntax-table)
+(modify-syntax-entry ?` "\"" mm-parse-args-syntax-table)
+(modify-syntax-entry ?{ "(" mm-parse-args-syntax-table)
+(modify-syntax-entry ?} ")" mm-parse-args-syntax-table)
+
+(defvar mm-mime-data
+  '(
+    ("multipart"   . (
+                     ("alternative". (("viewer" . mm-multipart-viewer)
+                                      ("type"   . "multipart/alternative")))
+                     ("mixed"      . (("viewer" . mm-multipart-viewer)
+                                      ("type"   . "multipart/mixed")))
+                     (".*"         . (("viewer" . mm-save-binary-file)
+                                      ("type"   . "multipart/*")))
+                     )
+     )
+    ("application" . (
+                     ("x-x509-ca-cert" . (("viewer" . ssl-view-site-cert)
+                                          ("test" . (fboundp 
'ssl-view-site-cert))
+                                          ("type" . 
"application/x-x509-ca-cert")))
+                     ("x-x509-user-cert" . (("viewer" . ssl-view-user-cert)
+                                            ("test" . (fboundp 
'ssl-view-user-cert))
+                                            ("type" . 
"application/x-x509-user-cert")))
+                     ("octet-stream" . (("viewer" . mm-save-binary-file)
+                                        ("type" ."application/octet-stream")))
+                     ("dvi"        . (("viewer" . "open %s")
+                                      ("type"   . "application/dvi")
+                                      ("test"   . (eq (device-type) 'ns))))
+                     ("dvi"        . (("viewer" . "xdvi %s")
+                                      ("test"   . (eq (device-type) 'x))
+                                      ("needsx11")
+                                      ("type"   . "application/dvi")))
+                     ("dvi"        . (("viewer" . "dvitty %s")
+                                      ("test"   . (not (getenv "DISPLAY")))
+                                      ("type"   . "application/dvi")))
+                     ("emacs-lisp" . (("viewer" . mm-maybe-eval)
+                                      ("type"   . "application/emacs-lisp")))
+;                    ("x-tar"      . (("viewer" . tar-mode)
+;                                     ("test"   . (fboundp 'tar-mode))
+;                                     ("type"   . "application/x-tar")))
+                     ("x-tar"      . (("viewer" . mm-save-binary-file)
+                                      ("type"   . "application/x-tar")))
+                     ("x-latex"    . (("viewer" . tex-mode)
+                                      ("test"   . (fboundp 'tex-mode))
+                                      ("type"   . "application/x-latex")))
+                     ("x-tex"      . (("viewer" . tex-mode)
+                                      ("test"   . (fboundp 'tex-mode))
+                                      ("type"   . "application/x-tex")))
+                     ("latex"      . (("viewer" . tex-mode)
+                                      ("test"   . (fboundp 'tex-mode))
+                                      ("type"   . "application/latex")))
+                     ("tex"        . (("viewer" . tex-mode)
+                                      ("test"   . (fboundp 'tex-mode))
+                                      ("type"   . "application/tex")))
+                     ("texinfo"    . (("viewer" . texinfo-mode)
+                                      ("test"   . (fboundp 'texinfo-mode))
+                                      ("type"   . "application/tex")))
+                     ("zip"        . (("viewer" . mm-save-binary-file)
+                                      ("type"   . "application/zip")
+                                      ("copiousoutput")))
+                     ("pdf"        . (("viewer" . "acroread %s")
+                                      ("type"   . "application/pdf")))
+                     ("postscript" . (("viewer" . "open %s")
+                                      ("type"   . "application/postscript")
+                                      ("test"   . (eq (device-type) 'ns))))
+                     ("postscript" . (("viewer" . "ghostview %s")
+                                      ("type" . "application/postscript")
+                                      ("test"   . (eq (device-type) 'x))
+                                      ("needsx11")))
+                     ("postscript" . (("viewer" . "ps2ascii %s")
+                                      ("type" . "application/postscript")
+                                      ("test" . (not (getenv "DISPLAY")))
+                                      ("copiousoutput")))
+                     ))
+    ("audio"       . (
+                     ("x-mpeg" . (("viewer" . "maplay %s")
+                                  ("type"   . "audio/x-mpeg")))
+                     (".*" . (("viewer" . mm-play-sound-file)
+                              ("test"   . (or (featurep 'nas-sound)
+                                              (featurep 'native-sound)))
+                              ("type"   . "audio/*")))
+                     (".*" . (("viewer" . "showaudio")
+                              ("type"   . "audio/*")))
+                     ))
+    ("message"     . (
+                     ("rfc-*822" . (("viewer" . vm-mode)
+                                    ("test"   . (fboundp 'vm-mode))
+                                    ("type"   . "message/rfc-822")))
+                     ("rfc-*822" . (("viewer" . w3-mode)
+                                    ("test"   . (fboundp 'w3-mode))
+                                    ("type"   . "message/rfc-822")))
+                     ("rfc-*822" . (("viewer" . view-mode)
+                                    ("test"   . (fboundp 'view-mode))
+                                    ("type"   . "message/rfc-822")))
+                     ("rfc-*822" . (("viewer" . fundamental-mode)
+                                    ("type"   . "message/rfc-822")))
+                     ))
+    ("image"       . (
+                     ("x-xwd" . (("viewer"  . "xwud -in %s")
+                                 ("type"    . "image/x-xwd")
+                                 ("compose" . "xwd -frame > %s")
+                                 ("test"    . (eq (device-type) 'x))
+                                 ("needsx11")))
+                     ("x11-dump" . (("viewer" . "xwud -in %s")
+                                    ("type" . "image/x-xwd")
+                                    ("compose" . "xwd -frame > %s")
+                                    ("test"   . (eq (device-type) 'x))
+                                    ("needsx11")))
+                     ("windowdump" . (("viewer" . "xwud -in %s")
+                                      ("type" . "image/x-xwd")
+                                      ("compose" . "xwd -frame > %s")
+                                      ("test"   . (eq (device-type) 'x))
+                                      ("needsx11")))
+                     (".*" . (("viewer" . "open %s")
+                              ("type"   . "image/*")
+                              ("test"   . (eq (device-type) 'ns))))
+                     (".*" . (("viewer" . "xv -perfect %s")
+                              ("type" . "image/*")
+                              ("test"   . (eq (device-type) 'x))
+                              ("needsx11")))
+                     ))
+    ("text"        . (
+                     ("plain" . (("viewer"  . w3-mode)
+                                 ("test"    . (fboundp 'w3-mode))
+                                 ("type"    . "text/plain")))
+                     ("plain" . (("viewer"  . view-mode)
+                                 ("test"    . (fboundp 'view-mode))
+                                 ("type"    . "text/plain")))
+                     ("plain" . (("viewer"  . fundamental-mode)
+                                 ("type"    . "text/plain")))
+                     ("enriched" . (("viewer" . enriched-decode-region)
+                                    ("test"   . (fboundp
+                                                 'enriched-decode-region))
+                                    ("type"   . "text/enriched")))
+                     ("html"  . (("viewer" . w3-prepare-buffer)
+                                 ("test"   . (fboundp 'w3-prepare-buffer))
+                                 ("type"   . "text/html")))
+                     ))
+    ("video"       . (
+                     ("mpeg" . (("viewer" . "mpeg_play %s")
+                                ("type"   . "video/mpeg")
+                                ("test"   . (eq (device-type) 'x))
+                                ("needsx11")))
+                     ))
+    ("x-world"     . (
+                     ("x-vrml" . (("viewer"  . "webspace -remote %s -URL %u")
+                                  ("type"    . "x-world/x-vrml")
+                                  ("description"
+                                   "VRML document")))))
+    ("archive"     . (
+                     ("tar"  . (("viewer" . tar-mode)
+                                ("type" . "archive/tar")
+                                ("test" . (fboundp 'tar-mode))))
+                     ))
+    )
+  "*The mailcap structure is an assoc list of assoc lists.
+1st assoc list is keyed on the major content-type
+2nd assoc list is keyed on the minor content-type (which can be a regexp)
+
+Which looks like:
+-----------------
+(
+ (\"application\"
+  (\"postscript\" . <info>)
+ )
+ (\"text\"
+  (\"plain\" . <info>)
+ )
+)
+
+Where <info> is another assoc list of the various information
+related to the mailcap RFC.  This is keyed on the lowercase
+attribute name (viewer, test, etc).  This looks like:
+((\"viewer\" . viewerinfo)
+ (\"test\"   . testinfo)
+ (\"xxxx\"   . \"string\")
+)
+
+Where viewerinfo specifies how the content-type is viewed.  Can be
+a string, in which case it is run through a shell, with
+appropriate parameters, or a symbol, in which case the symbol is
+funcall'd, with the buffer as an argument.
+
+testinfo is a list of strings, or nil.  If nil, it means the
+viewer specified is always valid.  If it is a list of strings,
+these are used to determine whether a viewer passes the 'test' or
+not.")
+
+(defvar mm-content-transfer-encodings
+  '(("base64"     . base64-decode-region)
+    ("7bit"       . ignore)
+    ("8bit"       . ignore)
+    ("binary"     . ignore)
+    ("x-compress" . ("uncompress" "-c"))
+    ("x-gzip"     . ("gzip" "-dc"))
+    ("compress"   . ("uncompress" "-c"))
+    ("gzip"       . ("gzip" "-dc"))
+    ("x-hqx"      . ("mcvert" "-P" "-s" "-S"))
+    ("quoted-printable" . mm-decode-quoted-printable)
+    )
+  "*An assoc list of content-transfer-encodings and how to decode them.")
+
+(defvar mm-download-directory nil
+  "*Where downloaded files should go by default.")
+
+(defvar mm-temporary-directory (or (getenv "TMPDIR") "/tmp")
+  "*Where temporary files go.")
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; A few things from w3 and url, just in case this is used without them
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun mm-generate-unique-filename (&optional fmt)
+  "Generate a unique filename in mm-temporary-directory"
+  (if (not fmt)
+      (let ((base (format "mm-tmp.%d" (user-real-uid)))
+           (fname "")
+           (x 0))
+       (setq fname (format "%s%d" base x))
+       (while (file-exists-p
+               (expand-file-name fname mm-temporary-directory))
+         (setq x (1+ x)
+               fname (concat base (int-to-string x))))
+       (expand-file-name fname mm-temporary-directory))
+    (let ((base (concat "mm" (int-to-string (user-real-uid))))
+         (fname "")
+         (x 0))
+      (setq fname (format fmt (concat base (int-to-string x))))
+      (while (file-exists-p
+             (expand-file-name fname mm-temporary-directory))
+       (setq x (1+ x)
+             fname (format fmt (concat base (int-to-string x)))))
+      (expand-file-name fname mm-temporary-directory))))
+
+(if (and (fboundp 'copy-tree)
+        (subrp (symbol-function 'copy-tree)))
+    (fset 'mm-copy-tree 'copy-tree)
+  (defun mm-copy-tree (tree)
+    (if (consp tree)
+       (cons (mm-copy-tree (car tree))
+             (mm-copy-tree (cdr tree)))
+      (if (vectorp tree)
+         (let* ((new (copy-sequence tree))
+                (i (1- (length new))))
+           (while (>= i 0)
+             (aset new i (mm-copy-tree (aref new i)))
+             (setq i (1- i)))
+           new)
+       tree))))
+
+(require 'mule-sysdp)
+
+(if (not (fboundp 'w3-save-binary-file))
+    (defun mm-save-binary-file ()
+      ;; Ok, this is truly fucked.  In XEmacs, if you use the mouse to select
+      ;; a URL that gets saved via this function, read-file-name will pop up a
+      ;; dialog box for file selection.  For some reason which buffer we are in
+      ;; gets royally screwed (even with save-excursions and the whole nine
+      ;; yards).  SO, we just keep the old buffer name around and away we go.
+      (let ((old-buff (current-buffer))
+           (file (read-file-name "Filename to save as: "
+                                 (or mm-download-directory "~/")
+                                 (file-name-nondirectory (url-view-url t))
+                                 nil
+                                 (file-name-nondirectory (url-view-url t))))
+           (require-final-newline nil))
+       (set-buffer old-buff)
+       (mule-write-region-no-coding-system (point-min) (point-max) file)
+       (kill-buffer (current-buffer))))
+  (fset 'mm-save-binary-file 'w3-save-binary-file))
+
+(defun mm-maybe-eval ()
+  "Maybe evaluate a buffer of emacs lisp code"
+  (if (yes-or-no-p "This is emacs-lisp code, evaluate it? ")
+      (eval-buffer (current-buffer))
+    (emacs-lisp-mode)))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The mailcap parser
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun mm-viewer-unescape (format &optional filename url)
+  (save-excursion
+    (set-buffer (get-buffer-create " *mm-parse*"))
+    (erase-buffer)
+    (insert format)
+    (goto-char (point-min))
+    (while (re-search-forward "%\\(.\\)" nil t)
+       (let ((escape (aref (match-string 1) 0)))
+        (replace-match "" t t)
+        (case escape
+          (?% (insert "%"))
+          (?s (insert (or filename "\"\"")))
+          (?u (insert (or url "\"\""))))))
+    (buffer-string)))
+
+(defun mm-in-assoc (elt list)
+  ;; Check to see if ELT matches any of the regexps in the car elements of LIST
+  (let (rslt)
+    (while (and list (not rslt))
+      (and (car (car list))
+          (string-match (car (car list)) elt)
+          (setq rslt (car list)))
+      (setq list (cdr list)))
+    rslt))
+
+(defun mm-replace-regexp (regexp to-string)
+  ;; Quiet replace-regexp.
+  (goto-char (point-min))
+  (while (re-search-forward regexp nil t)
+    (replace-match to-string t nil)))
+
+(defun mm-parse-mailcaps (&optional path)
+  ;; Parse out all the mailcaps specified in a unix-style path string PATH
+  (cond
+   (path nil)
+   ((getenv "MAILCAPS") (setq path (getenv "MAILCAPS")))
+   ((memq system-type '(ms-dos ms-windows windows-nt))
+    (setq path (mapconcat 'expand-file-name '("~/mail.cap" "~/etc/mail.cap")
+                         ";")))
+   (t (setq path (mapconcat 'expand-file-name
+                           '("~/.mailcap"
+                             "/etc/mailcap:/usr/etc/mailcap"
+                             "/usr/local/etc/mailcap") ":"))))
+  (let ((fnames (reverse
+                (mm-string-to-tokens path
+                                     (if (memq system-type
+                                               '(ms-dos ms-windows windows-nt))
+                                         ?;
+                                       ?:))))
+       fname)
+    (while fnames
+      (setq fname (car fnames))
+      (if (and (file-exists-p fname) (file-readable-p fname))
+         (mm-parse-mailcap (car fnames)))
+      (setq fnames (cdr fnames)))))
+
+(defun mm-parse-mailcap (fname)
+  ;; Parse out the mailcap file specified by FNAME
+  (let (major                          ; The major mime type (image/audio/etc)
+       minor                           ; The minor mime type (gif, basic, etc)
+       save-pos                        ; Misc saved positions used in parsing
+       viewer                          ; How to view this mime type
+       info                            ; Misc info about this mime type
+       )
+    (save-excursion
+      (set-buffer (get-buffer-create " *mailcap*"))
+      (erase-buffer)
+      (insert-file-contents fname)
+      (set-syntax-table mm-parse-args-syntax-table)
+      (mm-replace-regexp "#.*" "")              ; Remove all comments
+      (mm-replace-regexp "\n+" "\n")         ; And blank lines
+      (mm-replace-regexp "\\\\[ \t\n]+" " ") ; And collapse spaces
+      (mm-replace-regexp (concat (regexp-quote "\\") "[ \t]*\n") "")
+      (goto-char (point-max))
+      (skip-chars-backward " \t\n")
+      (delete-region (point) (point-max))
+      (goto-char (point-min))
+      (while (not (eobp))
+       (skip-chars-forward " \t\n")
+       (setq save-pos (point)
+             info nil)
+       (skip-chars-forward "^/;")
+       (downcase-region save-pos (point))
+       (setq major (buffer-substring save-pos (point)))
+       (skip-chars-forward "/ \t\n")
+       (setq save-pos (point))
+       (skip-chars-forward "^;")
+       (downcase-region save-pos (point))
+       (setq minor
+             (cond
+              ((= ?* (or (char-after save-pos) 0)) ".*")
+              ((= (point) save-pos) ".*")
+              (t (buffer-substring save-pos (point)))))
+       (skip-chars-forward "; \t\n")
+       ;;; Got the major/minor chunks, now for the viewers/etc
+       ;;; The first item _must_ be a viewer, according to the
+       ;;; RFC for mailcap files (#1343)
+       (skip-chars-forward "; \t\n")
+       (setq save-pos (point))
+       (skip-chars-forward "^;\n")
+       (if (= (or (char-after save-pos) 0) ?')
+           (setq viewer (progn
+                          (narrow-to-region (1+ save-pos) (point))
+                          (goto-char (point-min))
+                          (prog1
+                              (read (current-buffer))
+                            (goto-char (point-max))
+                            (widen))))
+         (setq viewer (buffer-substring save-pos (point))))
+       (setq save-pos (point))
+       (end-of-line)
+       (setq info (nconc (list (cons "viewer" viewer)
+                               (cons "type" (concat major "/"
+                                                    (if (string= minor ".*")
+                                                        "*" minor))))
+                         (mm-parse-mailcap-extras save-pos (point))))
+       (mm-mailcap-entry-passes-test info)
+       (mm-add-mailcap-entry major minor info)))))
+
+(defun mm-parse-mailcap-extras (st nd)
+  ;; Grab all the extra stuff from a mailcap entry
+  (let (
+       name                            ; From name=
+       value                           ; its value
+       results                         ; Assoc list of results
+       name-pos                        ; Start of XXXX= position
+       val-pos                         ; Start of value position
+       done                            ; Found end of \'d ;s?
+       )
+    (save-restriction
+      (narrow-to-region st nd)
+      (goto-char (point-min))
+      (skip-chars-forward " \n\t;")
+      (while (not (eobp))
+       (setq done nil)
+       (skip-chars-forward " \";\n\t")
+       (setq name-pos (point))
+       (skip-chars-forward "^ \n\t=")
+       (downcase-region name-pos (point))
+       (setq name (buffer-substring name-pos (point)))
+       (skip-chars-forward " \t\n")
+       (if (/= (or (char-after (point)) 0)  ?=) ; There is no value
+           (setq value nil)
+         (skip-chars-forward " \t\n=")
+         (setq val-pos (point))
+         (if (memq (char-after val-pos) '(?\" ?'))
+             (progn
+               (setq val-pos (1+ val-pos))
+               (condition-case nil
+                   (progn
+                     (forward-sexp 1)
+                     (backward-char 1))
+                 (error (goto-char (point-max)))))
+           (while (not done)
+             (skip-chars-forward "^;")
+             (if (= (or (char-after (1- (point))) 0) ?\\ )
+                 (progn
+                   (subst-char-in-region (1- (point)) (point) ?\\ ? )
+                   (skip-chars-forward ";"))
+               (setq done t))))
+         (setq value (buffer-substring val-pos (point))))
+       (setq results (cons (cons name value) results)))
+      results)))  
+
+(defun mm-string-to-tokens (str &optional delim)
+  "Return a list of words from the string STR"
+  (setq delim (or delim ? ))
+  (let (results y)
+    (mapcar
+     (function
+      (lambda (x)
+       (cond
+        ((and (= x delim) y) (setq results (cons y results) y nil))
+        ((/= x delim) (setq y (concat y (char-to-string x))))
+        (t nil)))) str)
+    (nreverse (cons y results))))
+
+(defun mm-mailcap-entry-passes-test (info)
+  ;; Return t iff a mailcap entry passes its test clause or no test
+  ;; clause is present.
+  (let (status                         ; Call-process-regions return value
+       (test (assoc "test" info)); The test clause
+       )
+    (setq status (and test (mm-string-to-tokens (cdr test))))
+    (if (and (assoc "needsx11" info) (not (getenv "DISPLAY")))
+       (setq status nil)
+      (cond
+       ((and (equal (nth 0 status) "test")
+            (equal (nth 1 status) "-n")
+            (or (equal (nth 2 status) "$DISPLAY")
+                (equal (nth 2 status) "\"$DISPLAY\"")))
+       (setq status (if (getenv "DISPLAY") t nil)))
+       ((and (equal (nth 0 status) "test")
+            (equal (nth 1 status) "-z")
+            (or (equal (nth 2 status) "$DISPLAY")
+                (equal (nth 2 status) "\"$DISPLAY\"")))
+       (setq status (if (getenv "DISPLAY") nil t)))
+       (test nil)
+       (t nil)))
+    (and test (listp test) (setcdr test status))))
+
+(defun mm-parse-args (st &optional nd nodowncase)
+  ;; Return an assoc list of attribute/value pairs from an RFC822-type string
+  (let (
+       name                            ; From name=
+       value                           ; its value
+       results                         ; Assoc list of results
+       name-pos                        ; Start of XXXX= position
+       val-pos                         ; Start of value position
+       )
+    (save-excursion
+      (if (stringp st)
+         (progn
+           (set-buffer (get-buffer-create " *mm-temp*"))
+           (set-syntax-table mm-parse-args-syntax-table)
+           (erase-buffer)
+           (insert st)
+           (setq st (point-min)
+                 nd (point-max)))
+       (set-syntax-table mm-parse-args-syntax-table))
+      (save-restriction
+       (narrow-to-region st nd)
+       (goto-char (point-min))
+       (while (not (eobp))
+         (skip-chars-forward "; \n\t")
+         (setq name-pos (point))
+         (skip-chars-forward "^ \n\t=;")
+         (if (not nodowncase)
+             (downcase-region name-pos (point)))
+         (setq name (buffer-substring name-pos (point)))
+         (skip-chars-forward " \t\n")
+         (if (/= (or (char-after (point)) 0)  ?=) ; There is no value
+             (setq value nil)
+           (skip-chars-forward " \t\n=")
+           (setq val-pos (point)
+                 value
+                 (cond
+                  ((or (= (or (char-after val-pos) 0) ?\")
+                       (= (or (char-after val-pos) 0) ?'))
+                   (buffer-substring (1+ val-pos)
+                                     (condition-case ()
+                                         (prog2
+                                             (forward-sexp 1)
+                                             (1- (point))
+                                           (skip-chars-forward "\""))
+                                       (error
+                                        (skip-chars-forward "^ \t\n")
+                                        (point)))))
+                  (t
+                   (buffer-substring val-pos
+                                     (progn
+                                       (skip-chars-forward "^;")
+                                       (skip-chars-backward " \t")
+                                       (point)))))))
+         (setq results (cons (cons name value) results))
+         (skip-chars-forward "; \n\t"))
+       results))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The action routines.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun mm-possible-viewers (major minor)
+  ;; Return a list of possible viewers from MAJOR for minor type MINOR
+  (let ((exact '())
+       (wildcard '()))
+    (while major
+      (cond
+       ((equal (car (car major)) minor)
+       (setq exact (cons (cdr (car major)) exact)))
+       ((string-match (car (car major)) minor)
+       (setq wildcard (cons (cdr (car major)) wildcard))))
+      (setq major (cdr major)))
+    (nconc (nreverse exact) (nreverse wildcard))))
+
+(defun mm-unescape-mime-test (test type-info)
+  (let ((buff (get-buffer-create " *unescape*"))
+       save-pos save-chr subst)
+    (cond
+     ((symbolp test) test)
+     ((and (listp test) (symbolp (car test))) test)
+     ((or (stringp test)
+         (and (listp test) (stringp (car test))
+              (setq test (mapconcat 'identity test " "))))
+      (save-excursion
+       (set-buffer buff)
+       (erase-buffer)
+       (insert test)
+       (goto-char (point-min))
+       (while (not (eobp))
+         (skip-chars-forward "^%")
+         (if (/= (- (point)
+                    (progn (skip-chars-backward "\\\\")
+                           (point)))
+                 0) ; It is an escaped %
+             (progn
+               (delete-char 1)
+               (skip-chars-forward "%."))
+           (setq save-pos (point))
+           (skip-chars-forward "%")
+           (setq save-chr (char-after (point)))
+           (cond
+            ((null save-chr) nil)
+            ((= save-chr ?t)
+             (delete-region save-pos (progn (forward-char 1) (point)))
+             (insert (or (cdr (assoc "type" type-info)) "\"\"")))
+            ((= save-chr ?M)
+             (delete-region save-pos (progn (forward-char 1) (point)))
+             (insert "\"\""))
+            ((= save-chr ?n)
+             (delete-region save-pos (progn (forward-char 1) (point)))
+             (insert "\"\""))
+            ((= save-chr ?F)
+             (delete-region save-pos (progn (forward-char 1) (point)))
+             (insert "\"\""))
+            ((= save-chr ?{)
+             (forward-char 1)
+             (skip-chars-forward "^}")
+             (downcase-region (+ 2 save-pos) (point))
+             (setq subst (buffer-substring (+ 2 save-pos) (point)))
+             (delete-region save-pos (1+ (point)))
+             (insert (or (cdr (assoc subst type-info)) "\"\"")))
+            (t nil))))
+       (buffer-string)))
+     (t (error "Bad value to mm-unescape-mime-test. %s" test)))))
+
+(defun mm-viewer-passes-test (viewer-info type-info)
+  ;; Return non-nil iff the viewer specified by VIEWER-INFO passes its
+  ;; test clause (if any).
+  (let* ((test-info   (assoc "test"   viewer-info))
+        (test (cdr test-info))
+        (viewer (cdr (assoc "viewer" viewer-info)))
+        (default-directory (expand-file-name "~/"))
+        status
+        parsed-test
+       )
+    (cond
+     ((not test-info) t)               ; No test clause
+     ((not test) nil)                  ; Already failed test
+     ((eq test t) t)                   ; Already passed test
+     ((and (symbolp test)              ; Lisp function as test
+          (fboundp test))
+      (funcall test type-info))
+     ((and (symbolp test)              ; Lisp variable as test
+          (boundp test))
+      (symbol-value test))
+     ((and (listp test)                        ; List to be eval'd
+          (symbolp (car test)))
+      (eval test))
+     (t
+      (setq test (mm-unescape-mime-test test type-info)
+           test (list shell-file-name nil nil nil shell-command-switch test)
+           status (apply 'call-process test))
+      (= 0 status)))))
+
+(defun mm-add-mailcap-entry (major minor info)
+  (let ((old-major (assoc major mm-mime-data)))
+    (if (null old-major)               ; New major area
+       (setq mm-mime-data
+             (cons (cons major (list (cons minor info)))
+                   mm-mime-data))
+      (let ((cur-minor (assoc minor old-major)))
+       (cond
+        ((or (null cur-minor)          ; New minor area, or
+             (assoc "test" info))      ; Has a test, insert at beginning
+         (setcdr old-major (cons (cons minor info) (cdr old-major))))
+        ((and (not (assoc "test" info)); No test info, replace completely
+              (not (assoc "test" cur-minor)))
+         (setcdr cur-minor info))
+        (t
+         (setcdr old-major (cons (cons minor info) (cdr old-major)))))))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The main whabbo
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun mm-viewer-lessp (x y)
+  ;; Return t iff viewer X is more desirable than viewer Y
+  (let ((x-wild (string-match "[*?]" (or (cdr-safe (assoc "type" x)) "")))
+       (y-wild (string-match "[*?]" (or (cdr-safe (assoc "type" y)) "")))
+       (x-lisp (not (stringp (or (cdr-safe (assoc "viewer" x)) ""))))
+       (y-lisp (not (stringp (or (cdr-safe (assoc "viewer" y)) "")))))
+    (cond
+     ((and x-lisp (not y-lisp))
+      t)
+     ((and (not y-lisp) x-wild (not y-wild))
+      t)
+     ((and (not x-wild) y-wild)
+      t)
+     (t nil))))
+
+(defun mm-mime-info (st &optional nd request)
+  "Get the mime viewer command for HEADERLINE, return nil if none found.
+Expects a complete content-type header line as its argument.  This can
+be simple like text/html, or complex like text/plain; charset=blah; foo=bar
+
+Third argument REQUEST specifies what information to return.  If it is
+nil or the empty string, the viewer (second field of the mailcap
+entry) will be returned.  If it is a string, then the mailcap field
+corresponding to that string will be returned (print, description,
+whatever).  If a number, then all the information for this specific
+viewer is returned."
+  (let (
+       major                           ; Major encoding (text, etc)
+       minor                           ; Minor encoding (html, etc)
+       info                            ; Other info
+       save-pos                        ; Misc. position during parse
+       major-info                      ; (assoc major mm-mime-data)
+       minor-info                      ; (assoc minor major-info)
+       test                            ; current test proc.
+       viewers                         ; Possible viewers
+       passed                          ; Viewers that passed the test
+       viewer                          ; The one and only viewer
+       )
+    (save-excursion
+      (cond
+       ((null st)
+       (set-buffer (get-buffer-create " *mimeparse*"))
+       (erase-buffer)
+       (insert "text/plain")
+       (setq st (point-min)))
+       ((stringp st)
+       (set-buffer (get-buffer-create " *mimeparse*"))
+       (erase-buffer)
+       (insert st)
+       (setq st (point-min)))
+       ((null nd)
+       (narrow-to-region st (progn (goto-char st) (end-of-line) (point))))
+       (t (narrow-to-region st nd)))
+      (goto-char st)
+      (skip-chars-forward ": \t\n")
+      (buffer-enable-undo)
+      (setq viewer
+           (catch 'mm-exit
+             (setq save-pos (point))
+             (skip-chars-forward "^/")
+             (downcase-region save-pos (point))
+             (setq major (buffer-substring save-pos (point)))
+             (if (not (setq major-info (cdr (assoc major mm-mime-data))))
+                 (throw 'mm-exit nil))
+             (skip-chars-forward "/ \t\n")
+             (setq save-pos (point))
+             (skip-chars-forward "^ \t\n;")
+             (downcase-region save-pos (point))
+             (setq minor (buffer-substring save-pos (point)))
+             (if (not
+                  (setq viewers (mm-possible-viewers major-info minor)))
+                 (throw 'mm-exit nil))
+             (skip-chars-forward "; \t")
+             (if (eolp)
+                 nil                           ; No qualifiers
+               (setq save-pos (point))
+               (end-of-line)
+               (setq info (mm-parse-args save-pos (point)))
+               )
+             (while viewers
+               (if (mm-viewer-passes-test (car viewers) info)
+                   (setq passed (cons (car viewers) passed)))
+               (setq viewers (cdr viewers)))
+             (setq passed (sort (nreverse passed) 'mm-viewer-lessp))
+             (car passed)))
+      (if (and (stringp (cdr (assoc "viewer" viewer)))
+              passed)
+         (setq viewer (car passed)))
+      (widen)
+      (cond
+       ((and (null viewer) (not (equal major "default")))
+       (mm-mime-info "default" nil request))
+       ((or (null request) (equal request ""))
+       (mm-unescape-mime-test (cdr (assoc "viewer" viewer)) info))
+       ((stringp request)
+       (if (or (string= request "test") (string= request "viewer"))
+           (mm-unescape-mime-test (cdr-safe (assoc request viewer)) info)))
+       (t
+       ;; MUST make a copy *sigh*, else we modify mm-mime-data
+       (setq viewer (mm-copy-tree viewer))
+       (let ((view (assoc "viewer" viewer))
+             (test (assoc "test" viewer)))
+         (if view (setcdr view (mm-unescape-mime-test (cdr view) info)))
+         (if test (setcdr test (mm-unescape-mime-test (cdr test) info))))
+       viewer)))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Experimental MIME-types parsing
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar mm-mime-extensions
+  '(
+    (""          . "text/plain")
+    (".abs"      . "audio/x-mpeg")
+    (".aif"      . "audio/aiff")
+    (".aifc"     . "audio/aiff")
+    (".aiff"     . "audio/aiff")
+    (".ano"      . "application/x-annotator")
+    (".au"       . "audio/ulaw")
+    (".avi"      . "video/x-msvideo")
+    (".bcpio"    . "application/x-bcpio")
+    (".bin"      . "application/octet-stream")
+    (".cdf"      . "application/x-netcdr")
+    (".cpio"     . "application/x-cpio")
+    (".csh"      . "application/x-csh")
+    (".dvi"      . "application/x-dvi")
+    (".el"       . "application/emacs-lisp")
+    (".eps"      . "application/postscript")
+    (".etx"      . "text/x-setext")
+    (".exe"      . "application/octet-stream")
+    (".fax"      . "image/x-fax")
+    (".gif"      . "image/gif")
+    (".hdf"      . "application/x-hdf")
+    (".hqx"      . "application/mac-binhex40")
+    (".htm"      . "text/html")
+    (".html"     . "text/html")
+    (".icon"     . "image/x-icon")
+    (".ief"      . "image/ief")
+    (".jpg"      . "image/jpeg")
+    (".macp"     . "image/x-macpaint")
+    (".man"      . "application/x-troff-man")
+    (".me"       . "application/x-troff-me")
+    (".mif"      . "application/mif")
+    (".mov"      . "video/quicktime")
+    (".movie"    . "video/x-sgi-movie")
+    (".mp2"      . "audio/x-mpeg")
+    (".mp2a"     . "audio/x-mpeg2")
+    (".mpa"      . "audio/x-mpeg")
+    (".mpa2"     . "audio/x-mpeg2")
+    (".mpe"      . "video/mpeg")
+    (".mpeg"     . "video/mpeg")
+    (".mpega"    . "audio/x-mpeg")
+    (".mpegv"    . "video/mpeg")
+    (".mpg"      . "video/mpeg")
+    (".mpv"      . "video/mpeg")
+    (".ms"       . "application/x-troff-ms")
+    (".nc"       . "application/x-netcdf")
+    (".nc"       . "application/x-netcdf")
+    (".oda"      . "application/oda")
+    (".pbm"      . "image/x-portable-bitmap")
+    (".pdf"      . "application/pdf")
+    (".pgm"      . "image/portable-graymap")
+    (".pict"     . "image/pict")
+    (".png"      . "image/png")
+    (".pnm"      . "image/x-portable-anymap")
+    (".ppm"      . "image/portable-pixmap")
+    (".ps"       . "application/postscript")
+    (".qt"       . "video/quicktime")
+    (".ras"      . "image/x-raster")
+    (".rgb"      . "image/x-rgb")
+    (".rtf"      . "application/rtf")
+    (".rtx"      . "text/richtext")
+    (".sh"       . "application/x-sh")
+    (".sit"      . "application/x-stuffit")
+    (".snd"      . "audio/basic")
+    (".src"      . "application/x-wais-source")
+    (".tar"      . "archive/tar")
+    (".tcl"      . "application/x-tcl")
+    (".tcl"      . "application/x-tcl")
+    (".tex"      . "application/x-tex")
+    (".texi"     . "application/texinfo")
+    (".tga"      . "image/x-targa")
+    (".tif"      . "image/tiff")
+    (".tiff"     . "image/tiff")
+    (".tr"       . "application/x-troff")
+    (".troff"    . "application/x-troff")
+    (".tsv"      . "text/tab-separated-values")
+    (".txt"      . "text/plain")
+    (".vbs"      . "video/mpeg")
+    (".vox"      . "audio/basic")
+    (".vrml"     . "x-world/x-vrml")
+    (".wav"      . "audio/x-wav")
+    (".wrl"      . "x-world/x-vrml")
+    (".xbm"      . "image/xbm")
+    (".xpm"      . "image/x-pixmap")
+    (".xwd"      . "image/windowdump")
+    (".zip"      . "application/zip")
+    (".ai"       . "application/postscript")
+    (".jpe"      . "image/jpeg")
+    (".jpeg"     . "image/jpeg")
+    )
+  "*An assoc list of file extensions and the MIME content-types they
+correspond to.")
+
+(defun mm-parse-mimetypes (&optional path)
+  ;; Parse out all the mimetypes specified in a unix-style path string PATH
+  (cond
+   (path nil)
+   ((getenv "MIMETYPES") (setq path (getenv "MIMETYPES")))
+   ((memq system-type '(ms-dos ms-windows windows-nt))
+    (setq path (mapconcat 'expand-file-name
+                         '("~/mime.typ" "~/etc/mime.typ") ";")))
+   (t (setq path (mapconcat 'expand-file-name
+                           '("~/.mime-types"
+                             "/etc/mime-types:/usr/etc/mime-types"
+                             "/usr/local/etc/mime-types"
+                             "/usr/local/www/conf/mime-types") ":"))))
+  (let ((fnames (reverse
+                (mm-string-to-tokens path
+                                     (if (memq system-type
+                                               '(ms-dos ms-windows windows-nt))
+                                         ?;
+                                       ?:))))
+       fname)
+    (while fnames
+      (setq fname (car fnames))
+      (if (and (file-exists-p fname) (file-readable-p fname))
+         (mm-parse-mimetype-file (car fnames)))
+      (setq fnames (cdr fnames)))))
+
+(defun mm-parse-mimetype-file (fname)
+  ;; Parse out a mime-types file
+  (let (type                           ; The MIME type for this line
+       extns                           ; The extensions for this line
+       save-pos                        ; Misc. saved buffer positions
+       )
+    (save-excursion
+      (set-buffer (get-buffer-create " *mime-types*"))
+      (erase-buffer)
+      (insert-file-contents fname)
+      (mm-replace-regexp "#.*" "")
+      (mm-replace-regexp "\n+" "\n")
+      (mm-replace-regexp "[ \t]+$" "")
+      (goto-char (point-max))
+      (skip-chars-backward " \t\n")
+      (delete-region (point) (point-max))
+      (goto-char (point-min))
+      (while (not (eobp))
+       (skip-chars-forward " \t\n")
+       (setq save-pos (point))
+       (skip-chars-forward "^ \t")
+       (downcase-region save-pos (point))
+       (setq type (buffer-substring save-pos (point)))
+       (while (not (eolp))
+         (skip-chars-forward " \t")
+         (setq save-pos (point))
+         (skip-chars-forward "^ \t\n")
+         (setq extns (cons (buffer-substring save-pos (point)) extns)))
+       (while extns
+         (setq mm-mime-extensions
+               (cons
+                (cons (if (= (string-to-char (car extns)) ?.)
+                          (car extns)
+                        (concat "." (car extns))) type) mm-mime-extensions)
+               extns (cdr extns)))))))
+
+(defun mm-extension-to-mime (extn)
+  "Return the MIME content type of the file extensions EXTN"
+  (if (and (stringp extn)
+          (not (eq (string-to-char extn) ?.)))
+      (setq extn (concat "." extn)))
+  (cdr (assoc (downcase extn) mm-mime-extensions)))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Editing/Composition of body parts
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun mm-compose-type (type)
+  ;; Compose a body section of MIME-type TYPE.
+  (let* ((info (mm-mime-info type nil 5))
+        (fnam (mm-generate-unique-filename))
+        (comp (or (cdr (assoc "compose" info))))
+        (ctyp (cdr (assoc "composetyped" info)))
+        (buff (get-buffer-create " *mimecompose*"))
+        (typeit (not ctyp))
+        (retval "")
+        (usef nil))
+    (setq comp (mm-unescape-mime-test (or comp ctyp) info))
+    (while (string-match "\\([^\\\\]\\)%s" comp)
+      (setq comp (concat (substring comp 0 (match-end 1)) fnam
+                        (substring comp (match-end 0) nil))
+           usef t))
+    (call-process shell-file-name nil
+                 (if usef nil buff)
+                 nil shell-command-switch comp)
+    (setq retval
+         (concat
+          (if typeit (concat "Content-type: " type "\r\n\r\n") "")
+          (if usef
+              (save-excursion
+                (set-buffer buff)
+                (erase-buffer)
+                (insert-file-contents fnam)
+                (buffer-string))
+            (save-excursion
+              (set-buffer buff)
+              (buffer-string)))
+          "\r\n"))
+    retval))   
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Misc.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun mm-type-to-file (type)
+  "Return the file extension for content-type TYPE"
+  (rassoc type mm-mime-extensions))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Miscellaneous MIME viewers written in elisp
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun mm-play-sound-file (&optional buff)
+  "Play a sound file in buffer BUFF (defaults to current buffer)"
+  (setq buff (or buff (current-buffer)))
+  (let ((fname (mm-generate-unique-filename "%s.au"))
+       (synchronous-sounds t))         ; Play synchronously
+    (mule-write-region-no-coding-system (point-min) (point-max) fname)
+    (kill-buffer (current-buffer))
+    (play-sound-file fname)
+    (condition-case ()
+       (delete-file fname)
+      (error nil))))
+    
+(defun mm-parse-mime-headers (&optional no-delete)
+  "Return a list of the MIME headers at the top of this buffer.  If
+optional argument NO-DELETE is non-nil, don't delete the headers."
+  (let* ((st (point-min))
+        (nd (progn
+              (goto-char (point-min))
+              (skip-chars-forward " \t\n")
+              (if (re-search-forward "^\r*$" nil t)
+                  (1+ (point))
+                (point-max))))
+        save-pos
+        status
+        hname
+        hvalu
+        result
+        search
+        )
+    (narrow-to-region st (min nd (point-max)))
+    (goto-char (point-min))
+    (while (not (eobp))
+      (skip-chars-forward " \t\n\r")
+      (setq save-pos (point))
+      (skip-chars-forward "^:\n\r")
+      (downcase-region save-pos (point))
+      (setq hname (buffer-substring save-pos (point)))
+      (skip-chars-forward ": \t ")
+      (setq save-pos (point))
+      (skip-chars-forward "^\n\r")
+      (setq search t)
+      (while search
+       (skip-chars-forward "^\n\r")
+       (save-excursion
+         (skip-chars-forward "\n\r")
+         
+         (setq search
+               (string-match "[ \t]"
+                             (char-to-string
+                              (or (char-after (point)) ?a)))))
+       (if search
+           (skip-chars-forward "\n\r")))
+      (setq hvalu (buffer-substring save-pos (point))
+           result (cons (cons hname hvalu) result)))
+    (or no-delete (delete-region st nd))
+    result))
+
+(defun mm-find-available-multiparts (separator &optional buf)
+  "Return a list of mime-headers for the various body parts of a 
+multipart message in buffer BUF with separator SEPARATOR.
+The different multipart specs are put in `mm-temporary-directory'."
+  (let ((sep (concat "^--" separator "\r*$"))
+       headers
+       fname
+       results)
+    (save-excursion
+      (and buf (set-buffer buf))
+      (goto-char (point-min))
+      (while (re-search-forward sep nil t)
+       (let ((st (set-marker (make-marker)
+                             (progn
+                               (forward-line 1)
+                               (beginning-of-line)
+                               (point))))
+             (nd (set-marker (make-marker)
+                             (if (re-search-forward sep nil t)
+                                 (1- (match-beginning 0))
+                               (point-max)))))
+         (narrow-to-region st nd)
+         (goto-char st)
+         (if (looking-at "^\r*$")
+             (insert "Content-type: text/plain\n"
+                     "Content-length: " (int-to-string (- nd st)) "\n"))
+         (setq headers (mm-parse-mime-headers)
+               fname (mm-generate-unique-filename))
+         (let ((x (or (cdr (assoc "content-type" headers)) "text/plain")))
+           (if (string-match "name=\"*\\([^ \"]+\\)\"*" x)
+               (setq fname (expand-file-name
+                            (substring x (match-beginning 1)
+                                       (match-end 1))
+                            mm-temporary-directory))))
+         (widen)
+         (if (assoc "content-transfer-encoding" headers)
+             (let ((coding (cdr
+                            (assoc "content-transfer-encoding" headers)))
+                   (cmd nil))
+               (setq coding (and coding (downcase coding))
+                     cmd (or (cdr (assoc coding
+                                         mm-content-transfer-encodings))
+                             (read-string
+                              (concat "How shall I decode " coding "? ")
+                              "cat")))
+               (if (string= cmd "") (setq cmd "cat"))
+               (if (stringp cmd)
+                   (shell-command-on-region st nd cmd t)
+                 (funcall cmd st nd))
+               (or (eq cmd 'ignore) (set-marker nd (point)))))
+         (mule-write-region-no-coding-system st nd fname nil 5)
+         (delete-region st nd)
+         (setq results (cons
+                        (cons
+                         (cons "mm-filename" fname) headers) results)))))
+    results))
+
+(defun mm-format-multipart-as-html (&optional buf type)
+  (if buf (set-buffer buf))
+  (let* ((boundary (if (string-match
+                       "boundary[ \t]*=[ \t\"]*\\([^ \"\t\n]+\\)"
+                       type)
+                      (regexp-quote
+                       (substring type (match-beginning 1) (match-end 1)))))
+        (parts    (mm-find-available-multiparts boundary)))
+    (erase-buffer)
+    (insert "<html>\n"
+           " <head>\n"
+           "  <title>Multipart Message</title>\n"
+           " </head>\n"
+           " <body>\n"
+           "   <h1> Multipart message encountered </h1>\n"
+           "   <p> I have encountered a multipart MIME message.\n"
+           "       The following parts have been detected.  Please\n"
+           "       select which one you want to view.\n"
+           "   </p>\n"
+           "   <ul>\n"
+           (mapconcat 
+            (function (lambda (x)
+                        (concat "    <li> <a href=\"file:"
+                                (cdr (assoc "mm-filename" x))
+                                "\">"
+                                (or (cdr (assoc "content-description" x)) "")
+                                "--"
+                                (or (cdr (assoc "content-type" x))
+                                    "unknown type")
+                                "</a> </li>")))
+            parts "\n")
+           "   </ul>\n"
+           " </body>\n"
+           "</html>\n"
+           "<!-- Automatically generated by MM v" mm-version "-->\n")))
+
+(defun mm-multipart-viewer ()
+  (mm-format-multipart-as-html
+   (current-buffer)
+   (cdr (assoc "content-type" url-current-mime-headers)))
+  (let ((w3-working-buffer (current-buffer)))
+    (w3-prepare-buffer)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Transfer encodings we can decrypt automatically
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun mm-decode-quoted-printable (&optional st nd)
+  (interactive)
+  (setq st (or st (point-min))
+       nd (or nd (point-max)))
+  (save-restriction
+    (narrow-to-region st nd)
+    (save-excursion
+      (let ((buffer-read-only nil))
+       (goto-char (point-min))
+       (while (re-search-forward "=[0-9A-F][0-9A-F]" nil t)
+         (replace-match 
+          (char-to-string 
+           (+
+            (* 16 (mm-hex-char-to-integer 
+                   (char-after (1+ (match-beginning 0)))))
+            (mm-hex-char-to-integer
+             (char-after (1- (match-end 0))))))))))
+    (goto-char (point-max))))
+
+;; Taken from hexl.el.
+(defun mm-hex-char-to-integer (character)
+  "Take a char and return its value as if it was a hex digit."
+  (if (and (>= character ?0) (<= character ?9))
+      (- character ?0)
+    (let ((ch (logior character 32)))
+      (if (and (>= ch ?a) (<= ch ?f))
+         (- ch (- ?a 10))
+       (error (format "Invalid hex digit `%c'." ch))))))
+
+
+(require 'base64)
+(provide 'mm)
diff --git a/lisp/mule-sysdp.el b/lisp/mule-sysdp.el
new file mode 100644
index 0000000..fb530a4
--- /dev/null
+++ b/lisp/mule-sysdp.el
@@ -0,0 +1,344 @@
+;;; mule-sysdp.el --- consolidate MULE-version dependencies in one file.
+
+;; Copyright (c) 1996 - 1998 William Perry
+
+;; Author: William Perry <address@hidden>
+;; Keywords: lisp, tools
+
+;; The purpose of this file is to eliminate the cruftiness that
+;; would otherwise be required of packages that want to run on multiple
+;; versions of Emacs with and without Mule support.
+
+(require 'cl)
+
+(defconst mule-sysdep-version (if (featurep 'mule)
+                                 (cond
+                                  ((string-match "XEmacs" emacs-version)
+                                   'xemacs)
+                                  ((and
+                                    (boundp 'mule-version)
+                                    (string-match "[0-9]+\\.[0-9]+"
+                                                  mule-version))
+                                   (if (or (fboundp 'kinsoku)
+                                           (boundp 'kinsoku-ascii))
+                                       (string-to-number (substring
+                                                          mule-version
+                                                          (match-beginning 0)
+                                                          (match-end 0)))
+                                     0))
+                                  (t 2.3))
+                               0)
+  "What version of mule we are running under.")
+
+;; MULE variants
+;; XEmacs 20.x  - 'xemacs
+;; MULE 2.3/2.4 - 2.3 -or- 2.4 (2.4 exists only in beta versions)
+;; Emacs 20.x   - 3.0
+;; Emacs 20.3+  - 4.0 (with character encapsulation)
+
+;; Return the first valid coding system in the list ARGS.
+(defun mule-coding-system-version (&rest args)
+  (if (featurep 'mule)
+      (progn
+       (while (and args (not (coding-system-p (car args))))
+         (setq args (cdr args)))
+       (car args))))
+
+(defconst w3-mime-charset-coding-alist
+  `(("big5" . ,(mule-coding-system-version 'cn-big5 '*big5*))
+    ("euc-jp" . ,(mule-coding-system-version 'euc-jp '*euc-jp*))
+    ("euc-kr" . ,(mule-coding-system-version 'euc-kr '*euc-korea*))
+    ("gb" . ,(mule-coding-system-version 'cn-gb-2312 '*euc-china*))
+    ("iso-2022-jp" . ,(mule-coding-system-version 'iso-2022-jp '*iso-2022-jp*))
+    ("iso-2022-kr" . ,(mule-coding-system-version 'iso-2022-kr '*iso-2022-kr*))
+    ("iso-8859-1" . ,(mule-coding-system-version 'iso-8859-1 '*ctext*))
+    ("koi-8" . ,(mule-coding-system-version 'koi8))
+    ("koi8-r" . ,(mule-coding-system-version 'koi8))
+    ("x-ctext" . ,(mule-coding-system-version 'ctext '*ctext*))
+    ("x-sjis" . ,(mule-coding-system-version 'shift_jis '*sjis*))
+    ("x-shiftjis" . ,(mule-coding-system-version 'shift_jis '*sjis*))
+    )
+  "Alist of MIME-charset parameter regexps vs the corresponding coding 
systems.")
+
+(defconst w3-url-domain-language-environment-alist
+  '(("\\.jp$" . "Japanese")
+    ("\\.cn$" . "Chinese-GB")
+    ("\\.tw$" . "Chinese-BIG5")
+    ("\\.hk$" . "Chinese-BIG5")
+    ("\\.sg$" . "Chinese-GB")
+    ("\\.kr$" . "Korean")
+    ("\\.ru$" . "Cyrillic-KOI8")
+    ("\\.su$" . "Cyrillic-KOI8")
+    )
+  "Alist of regexps of URL vs the corresponding language environemnt.
+While detecting a coding system of a document whose URL matches some of
+the regular expressions, the coding system priorities defined in
+the corresponding language environment is used.
+
+This facility can be used only in Emacs 20.3 or later.")
+
+(defconst w3-url-domain-coding-alist
+  `(("\\.th$" . ,(mule-coding-system-version 'th-tis620 '*tis620*))
+    ("\\.kr$" . ,(mule-coding-system-version 'euc-kr '*euc-korea*))
+    ("\\.cn$" . ,(mule-coding-system-version 'cn-gb-2312 '*euc-china*))
+    ("\\.sg$" . ,(mule-coding-system-version 'cn-gb-2312 '*euc-china*))
+    ("\\.tw$" . ,(mule-coding-system-version 'cn-big5 '*big5*))
+    ("\\.hk$" . ,(mule-coding-system-version 'cn-big5 '*big5*))
+    ("\\.su$" . ,(mule-coding-system-version 'koi8))
+    ("\\.il$" . ,(mule-coding-system-version 'iso-8859-8 '*iso-8859-8*))
+    ("\\.fr$" . ,(mule-coding-system-version 'iso-8859-1 '*ctext*)))
+  "Alist of regexps of URL vs the corresponding coding systems.
+While decoding a document whose URL matches some of
+the regeular expressions, the corresponding coding system is used.")
+
+(defconst mule-retrieval-coding-system
+  (mule-coding-system-version 'euc-japan '*euc-japan* 'coding-system-euc-japan)
+  "Default retrieval coding system for packages that use this package.")
+
+(defconst mule-no-coding-system
+  (mule-coding-system-version 'no-conversion '*noconv*)
+  "Coding system that means no coding system should be used.")
+
+;; With Mule of version 2.3, insert-file-contents-literally is defined
+;; but performs code conversion.  Thus, we re-define it here to avoid
+;; the code conversion.
+(if (and (numberp mule-sysdep-version) (= mule-sysdep-version 2.3))
+    (defun insert-file-contents-literally
+      (file &optional visit beg end replace)
+      "Like `insert-file-contents', q.v., but only reads in the file.
+A buffer may be modified in several ways after reading into the buffer due
+to advanced Emacs features, such as file-name-handlers, format decoding,
+find-file-hooks, etc.
+  This function ensures that none of these modifications will take place."
+      (let ((file-name-handler-alist nil)
+           (find-file-hooks nil)
+           (input-coding-system mule-no-coding-system))
+       (insert-file-contents file visit beg end replace))))
+
+(defun mule-detect-coding-version (host st nd)
+  "Return a coding system of the current data."
+  (let ((coding-system nil))
+    ;; The facility of detecting a coding system by language
+    ;; environment is provided only in Emacs 20.3 (Mule 4.0) or later.
+    (if (and host
+            (>= mule-sysdep-version 4.0))
+       (let ((l w3-url-domain-language-environment-alist))
+         (while l
+           (if (string-match (car (car l)) host)
+               (setq coding-system
+                     (funcall 'detect-coding-with-language-environment
+                              st nd (cdr (car l)))
+                     l nil)
+             (setq l (cdr l))))))
+    ;; Next, check if the data is from some domain which prefer a
+    ;; specific coding system.
+    (if (and (not coding-system)
+            host)
+       (let ((l w3-url-domain-coding-alist))
+         (while l
+           (if (string-match (car (car l)) host)
+               (setq coding-system (if (coding-system-p (cdr (car l)))
+                                       (cdr (car l)))
+                     l nil)
+             (setq l (cdr l))))))
+    ;; At last, try to detect a coding system from the data itself.
+    (if (not coding-system)
+       (setq coding-system
+             (case mule-sysdep-version
+               (2.3 (code-detect-region st nd))
+               ((2.4 xemacs)
+                (detect-coding-region st nd))
+               (3.0
+                ;; Emacs 20.2 returns bogus information from
+                ;; detect-coding-region sometimes.  This is fixed in
+                ;; 20.3 (aka Mule 4.x)
+                (let ((possible (detect-coding-region st nd)))
+                  (if (not (symbolp (car-safe possible)))
+                      '(undecided-unix)
+                    possible)))
+               (4.0
+                ;; We can use HIGHEST arg t for faster detection.
+                (detect-coding-region st nd t))
+               (otherwise nil))))
+    coding-system))
+
+(defun mule-code-convert-region (code)
+  (if (and (listp code) (car code))
+      (setq code (car code)))
+  (case mule-sysdep-version
+    (2.3
+     (set 'mc-flag t)
+     (code-convert-region (point-min) (point-max) code *internal*)
+     (set-file-coding-system code))
+    (2.4
+     (set (make-local-variable 'enable-multibyte-characters) t)
+     (if (memq code '(autodetect coding-system-automatic))
+        nil
+       (decode-coding-region (point-min) (point-max) code)
+       (set-buffer-file-coding-system code)))
+    (3.0
+     (when default-enable-multibyte-characters
+       (set (make-local-variable 'enable-multibyte-characters) t)
+       (if (memq code '(autodetect automatic-conversion))
+          nil
+        (or code (setq code 'automatic-conversion))
+        (decode-coding-region (point-min) (point-max) code)
+        (set-buffer-file-coding-system code))))
+    (4.0
+     (when default-enable-multibyte-characters
+       (set-buffer-multibyte t)
+       (if (memq code '(autodetect automatic-conversion))
+          nil
+        (or code (setq code 'automatic-conversion))
+        (decode-coding-region (point-min) (point-max) code)
+        (set-buffer-file-coding-system (symbol-value 
'last-coding-system-used)))))
+    (xemacs
+     (if (and (listp code) (not (car code)))
+        (progn
+          (setq code 'autodetect)
+          (condition-case ()
+              (get-coding-system 'autodetect)
+            (error (setq code 'automatic-conversion)))))
+     (decode-coding-region (point-min) (point-max) code)
+     (set-file-coding-system code))
+    (otherwise
+     nil)))
+
+(defun mule-inhibit-code-conversion (proc)
+  (if (process-buffer proc)
+      (save-excursion
+       (set-buffer (process-buffer proc))
+       (set 'mc-flag nil)
+       (if (fboundp 'set-buffer-multibyte)
+           (set-buffer-multibyte nil)
+         (set 'enable-multibyte-characters nil))))
+  (case mule-sysdep-version
+    ((3.0 4.0 2.4 2.3)
+     (set-process-coding-system proc mule-no-coding-system
+                               mule-no-coding-system))
+    (xemacs
+     (set-process-input-coding-system proc mule-no-coding-system)
+     (set-process-input-coding-system proc mule-no-coding-system))))
+
+(defun mule-write-region-no-coding-system (st nd file &optional append visit 
lockname)
+  (let ((coding-system-for-write mule-no-coding-system)
+       (file-coding-system mule-no-coding-system)
+       (buffer-file-coding-system mule-no-coding-system)
+       (mc-flag t)
+       (require-final-newline nil)
+       ;;(file-name-handler-alist nil)
+       (crypt-encoding-alist nil)
+       (jka-compr-compression-info-list nil)
+       (jam-zcat-filename-list nil)
+       (write-file-hooks nil)
+       (write-contents-hooks nil)
+       (file-coding-system-alist nil))
+    (case mule-sysdep-version
+      (2.3
+       (write-region st nd file append visit *noconv*))
+      (3.0
+       (let ((enable-multibyte-characters t))
+        (write-region st nd file append visit lockname)))
+      (4.0
+       (write-region st nd file append visit lockname))
+      (otherwise
+       (write-region st nd file append visit lockname)))))
+
+(defun mule-encode-string (str)
+  (case mule-sysdep-version
+    (2.3
+     (code-convert-string str *internal* mule-retrieval-coding-system))
+    ((2.4 3.0 xemacs)
+     (encode-coding-string str mule-retrieval-coding-system))
+    (4.0
+     (if default-enable-multibyte-characters
+        (encode-coding-string str mule-retrieval-coding-system)
+       str))
+    (otherwise
+     str)))
+
+(defun mule-decode-string (str)
+  (and str
+       (case mule-sysdep-version
+        ((2.4 3.0 xemacs)
+         (decode-coding-string str mule-retrieval-coding-system))
+        (2.3
+         (code-convert-string str *internal* mule-retrieval-coding-system))
+        (4.0
+         (if default-enable-multibyte-characters
+             (decode-coding-string str mule-retrieval-coding-system)
+           str))
+        (otherwise
+         str))))
+
+(defun mule-truncate-string (str len &optional pad)
+  "Truncate string STR so that string-width of STR is not greater than LEN.
+ If width of the truncated string is less than LEN, and if a character PAD is
+ defined, add padding end of it."
+  (case mule-sysdep-version
+    ((3.0 4.0)
+     (truncate-string-to-width str len 0 pad))
+    (2.4
+     (let ((cl (string-to-vector str)) (n 0) (sw 0))
+       (if (<= (string-width str) len) str
+        (while (<= (setq sw (+ (char-width (aref cl n)) sw)) len)
+          (setq n (1+ n)))
+        (string-match (make-string n ?.) str)
+        (setq str (substring str 0 (match-end 0))))
+       (if pad (concat str (make-string (- len (string-width str)) pad)) str)))
+    (2.3
+     (let ((cl (string-to-char-list str)) (n 0) (sw 0))
+       (if (<= (string-width str) len) str
+        (while (<= (setq sw (+ (char-width (nth n cl)) sw)) len)
+          (setq n (1+ n)))
+        (string-match (make-string n ?.) str)
+        (setq str (substring str 0 (match-end 0))))
+       (if pad (concat str (make-string (- len (string-width str)) pad)) str)))
+    (otherwise
+     (concat (if (> (length str) len) (substring str 0 len) str)
+            (if (or (null pad) (> (length str) len))
+                ""
+              (make-string (- len (length str)) pad))))))
+
+(defun mule-find-charset-region (beg end &optional table)
+  (case mule-sysdep-version
+    (2.3 (code-detect-region beg end))
+    ((2.4 3.0 4.0) (find-charset-region beg end table))
+    (xemacs (charsets-in-region beg end))
+    (otherwise '(no-conversion))))
+
+(defun mule-coding-system-name (codesys)
+  (case mule-sysdep-version
+    ((3.0 4.0) nil)
+    (xemacs (coding-system-name codesys))))
+
+(defun mule-find-coding-system (sys)
+  (case mule-sysdep-version
+    ((2.3 2.4) nil)
+    ((3.0 4.0) (if (get sys 'coding-system) sys nil))
+    (xemacs (find-coding-system sys))
+    (otherwise nil)))
+     
+(defun mule-make-iso-character (char)
+  (if (<= char 127)
+      char
+    (case mule-sysdep-version
+      (2.3 (make-character lc-ltn1 char))
+      (2.4 (make-char charset-latin-iso8859-1 char))
+      (3.0 (make-char 'latin-iso8859-1 char))
+      (4.0 (if default-enable-multibyte-characters
+              (make-char 'latin-iso8859-1 char)
+            char))
+      (xemacs char)
+      (otherwise char))))
+
+(case mule-sysdep-version
+  ((2.3 2.4 3.0 4.0 xemacs) nil)
+  (otherwise (fset 'string-width 'length)))
+
+(and
+ (boundp 'MULE)
+ (not (featurep 'mule))
+ (provide 'mule))
+
+(provide 'mule-sysdp)
diff --git a/lisp/socks.el b/lisp/socks.el
new file mode 100644
index 0000000..d488189
--- /dev/null
+++ b/lisp/socks.el
@@ -0,0 +1,626 @@
+;;; socks.el --- A Socks v5 Client for Emacs
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:08 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, firewalls
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 - 1998 by William M. Perry <address@hidden>
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to
+;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; This is an implementation of the SOCKS v5 protocol as defined in
+;;; RFC 1928.
+;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'cl)
+(require 'custom)
+
+;; For non-MULE
+(if (not (fboundp 'char-int))
+    (fset 'char-int 'identity))
+
+(if (not (fboundp 'split-string))
+    (defun split-string (string &optional pattern)
+      "Return a list of substrings of STRING which are separated by PATTERN.
+If PATTERN is omitted, it defaults to \"[ \\f\\t\\n\\r\\v]+\"."
+      (or pattern
+         (setq pattern "[ \f\t\n\r\v]+"))
+      (let (parts (start 0))
+       (while (string-match pattern string start)
+         (setq parts (cons (substring string start (match-beginning 0)) parts)
+               start (match-end 0)))
+       (nreverse (cons (substring string start) parts)))))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Custom widgets
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(define-widget 'dynamic-choice 'menu-choice
+  "A pretty simple dynamic dropdown list"
+  :format "%[%t%]: %v"
+  :tag "Network"
+  :case-fold t
+  :void '(item :format "invalid (%t)\n")
+  :value-create 's5-widget-value-create
+  :value-delete 'widget-children-value-delete
+  :value-get 'widget-choice-value-get
+  :value-inline 'widget-choice-value-inline
+  :mouse-down-action 'widget-choice-mouse-down-action
+  :action 'widget-choice-action
+  :error "Make a choice"
+  :validate 'widget-choice-validate
+  :match 's5-dynamic-choice-match
+  :match-inline 's5-dynamic-choice-match-inline)
+
+(defun s5-dynamic-choice-match (widget value)
+  (let ((choices (funcall (widget-get widget :choice-function)))
+       current found)
+    (while (and choices (not found))
+      (setq current (car choices)
+           choices (cdr choices)
+           found (widget-apply current :match value)))
+    found))
+
+(defun s5-dynamic-choice-match-inline (widget value)
+  (let ((choices (funcall (widget-get widget :choice-function)))
+       current found)
+    (while (and choices (not found))
+      (setq current (car choices)
+           choices (cdr choices)
+           found (widget-match-inline current value)))
+    found))
+
+(defun s5-widget-value-create (widget)
+  (let ((choices (funcall (widget-get widget :choice-function)))
+       (value (widget-get widget :value)))
+    (if (not value)
+       (widget-put widget :value (widget-value (car choices))))
+    (widget-put widget :args choices)
+    (widget-choice-value-create widget)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Customization support
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defgroup socks nil
+  "SOCKS Support"
+  :prefix "socks-"
+  :group 'processes)
+
+'(defcustom socks-server-aliases nil
+  "A list of server aliases for use in access control and filtering rules."
+  :group 'socks
+  :type '(repeat (list :format "%v"
+                      :value ("" "" 1080 5)
+                      (string :tag "Alias")
+                      (string :tag "Hostname/IP Address")
+                      (integer :tag "Port #")
+                      (choice :tag "SOCKS Version"
+                              (integer :tag "SOCKS v4" :value 4)
+                              (integer :tag "SOCKS v5" :value 5)))))
+
+'(defcustom socks-network-aliases
+  '(("Anywhere" (netmask "0.0.0.0" "0.0.0.0")))
+  "A list of network aliases for use in subsequent rules."
+  :group 'socks
+  :type '(repeat (list :format "%v"
+                      :value (netmask "" "255.255.255.0")
+                      (string :tag "Alias")
+                      (radio-button-choice
+                       :format "%v"
+                       (list :tag  "IP address range"
+                             (const :format "" :value range)
+                             (string :tag "From")
+                             (string :tag "To"))
+                       (list :tag  "IP address/netmask"
+                             (const :format "" :value netmask)
+                             (string :tag "IP Address")
+                             (string :tag "Netmask"))
+                       (list :tag  "Domain Name"
+                             (const :format "" :value domain)
+                             (string :tag "Domain name"))
+                       (list :tag  "Unique hostname/IP address"
+                             (const :format "" :value exact)
+                             (string :tag "Hostname/IP Address"))))))
+
+'(defun s5-servers-filter ()
+  (if socks-server-aliases
+      (mapcar (lambda (x) (list 'const :tag (car x) :value (car x))) 
s5-server-aliases)
+    '((const :tag "No aliases defined" :value nil))))
+
+'(defun s5-network-aliases-filter ()
+  (mapcar (lambda (x) (list 'const :tag (car x) :value (car x)))
+         socks-network-aliases))
+
+'(defcustom socks-redirection-rules
+   nil
+   "A list of redirection rules."
+   :group 'socks
+   :type '(repeat (list :format "%v"
+                       :value ("Anywhere" nil)
+                       (dynamic-choice :choice-function 
s5-network-aliases-filter
+                                       :tag "Destination network")
+                       (radio-button-choice
+                        :tag "Connection type"
+                        (const :tag "Direct connection" :value nil)
+                        (dynamic-choice :format "%t: %[%v%]"
+                                        :choice-function s5-servers-filter
+                                        :tag "Proxy chain via")))))
+
+(defcustom socks-server
+  (list "Default server" "socks" 1080 5)
+  ""
+  :group 'socks
+  :type '(list
+         (string :format "" :value "Default server")
+         (string :tag "Server")
+         (integer :tag "Port")
+         (radio-button-choice :tag "SOCKS Version"
+                              :format "%t: %v"
+                              (const :tag "SOCKS v4  " :format "%t" :value 4)
+                              (const :tag "SOCKS v5"   :format "%t" :value 
5))))
+  
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Get down to the nitty gritty
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defconst socks-version 5)
+(defvar socks-debug nil)
+
+;; Common socks v5 commands
+(defconst socks-connect-command 1)
+(defconst socks-bind-command 2)
+(defconst socks-udp-associate-command 3)
+
+;; Miscellaneous other socks constants
+(defconst socks-authentication-null 0)
+(defconst socks-authentication-failure 255)
+
+;; Response codes
+(defconst socks-response-success               0)
+(defconst socks-response-general-failure       1)
+(defconst socks-response-access-denied         2)
+(defconst socks-response-network-unreachable   3)
+(defconst socks-response-host-unreachable      4)
+(defconst socks-response-connection-refused    5)
+(defconst socks-response-ttl-expired           6)
+(defconst socks-response-cmd-not-supported     7)
+(defconst socks-response-address-not-supported 8)
+
+(defvar socks-errors
+  '("Succeeded"
+    "General SOCKS server failure"
+    "Connection not allowed by ruleset"
+    "Network unreachable"
+    "Host unreachable"
+    "Connection refused"
+    "Time-to-live expired"
+    "Command not supported"
+    "Address type not supported"))
+
+;; The socks v5 address types
+(defconst socks-address-type-v4   1)
+(defconst socks-address-type-name 3)
+(defconst socks-address-type-v6   4)
+
+;; Base variables
+(defvar socks-timeout 5)
+(defvar socks-connections (make-hash-table :size 13))
+
+;; Miscellaneous stuff for authentication
+(defvar socks-authentication-methods nil)
+(defvar socks-username (user-login-name))
+(defvar socks-password nil)
+
+(defun socks-register-authentication-method (id desc callback)
+  (let ((old (assq id socks-authentication-methods)))
+    (if old
+       (setcdr old (cons desc callback))
+      (setq socks-authentication-methods
+           (cons (cons id (cons desc callback))
+                 socks-authentication-methods)))))
+
+(defun socks-unregister-authentication-method (id)
+  (let ((old (assq id socks-authentication-methods)))
+    (if old
+       (setq socks-authentication-methods
+             (delq old socks-authentication-methods)))))
+
+(socks-register-authentication-method 0 "No authentication" 'identity)
+
+(defun socks-build-auth-list ()
+  (let ((num 0)
+       (retval ""))
+    (mapcar
+     (function
+      (lambda (x)
+       (if (fboundp (cdr (cdr x)))
+           (setq retval (format "%s%c" retval (car x))
+                 num (1+ num)))))
+     (reverse socks-authentication-methods))
+    (format "%c%s" num retval)))
+
+(defconst socks-state-waiting-for-auth 0)
+(defconst socks-state-submethod-negotiation 1)
+(defconst socks-state-authenticated 2)
+(defconst socks-state-waiting 3)
+(defconst socks-state-connected 4)
+
+(defmacro socks-wait-for-state-change (proc htable cur-state)
+  (`
+   (while (and (= (cl-gethash 'state (, htable)) (, cur-state))
+              (memq (process-status (, proc)) '(run open)))
+     (accept-process-output (, proc) socks-timeout))))
+
+(defun socks-filter (proc string)
+  (let ((info (cl-gethash proc socks-connections))
+       state desired-len)
+    (or info (error "socks-filter called on non-SOCKS connection %S" proc))
+    (setq state (cl-gethash 'state info))
+    (cond
+     ((= state socks-state-waiting-for-auth)
+      (cl-puthash 'scratch (concat string (cl-gethash 'scratch info)) info)
+      (setq string (cl-gethash 'scratch info))
+      (if (< (length string) 2)
+         nil                           ; We need to spin some more
+       (cl-puthash 'authtype (char-int (aref string 1)) info)
+       (cl-puthash 'scratch (substring string 2 nil) info)
+       (cl-puthash 'state socks-state-submethod-negotiation info)))
+     ((= state socks-state-submethod-negotiation)
+      )
+     ((= state socks-state-authenticated)
+      )
+     ((= state socks-state-waiting)
+      (cl-puthash 'scratch (concat string (cl-gethash 'scratch info)) info)
+      (setq string (cl-gethash 'scratch info))
+      (case (cl-gethash 'server-protocol info)
+       (4
+        (if (< (length string) 2)
+            nil                        ; Can't know how much to read yet
+          (setq desired-len
+                (+ 4 ; address length
+                   2 ; port
+                   2 ; initial data
+                   ))
+          (if (< (length string) desired-len)
+              nil                      ; need to spin some more
+            (let ((response (char-int (aref string 1))))
+              (if (= response 90)
+                  (setq response 0))
+              (cl-puthash 'state socks-state-connected info)
+              (cl-puthash 'reply response info)
+              (cl-puthash 'response string info)))))
+       (5
+        (if (< (length string) 4)
+            nil
+          (setq desired-len
+                (+ 6                   ; Standard socks header
+                   (cond
+                    ((= (char-int (aref string 3)) socks-address-type-v4) 4)
+                    ((= (char-int (aref string 3)) socks-address-type-v6) 16)
+                    ((= (char-int (aref string 3)) socks-address-type-name)
+                     (if (< (length string) 5)
+                         255
+                       (+ 1 (char-int (aref string 4))))))))
+          (if (< (length string) desired-len)
+              nil                      ; Need to spin some more
+            (cl-puthash 'state socks-state-connected info)
+            (cl-puthash 'reply (char-int (aref string 1)) info)
+            (cl-puthash 'response string info))))))
+     ((= state socks-state-connected)
+      )
+     )
+    )
+  )
+
+(defun socks-open-connection (server-info)
+  (interactive)
+  (save-excursion
+    (let ((proc (socks-original-open-network-stream "socks"
+                                                   nil
+                                                   (nth 1 server-info)
+                                                   (nth 2 server-info)))
+         (info (make-hash-table :size 13))
+         (authtype nil))
+      
+      ;; Initialize process and info about the process
+      (set-process-filter proc 'socks-filter)
+      (process-kill-without-query proc)
+      (cl-puthash proc info socks-connections)
+      (cl-puthash 'state socks-state-waiting-for-auth info)
+      (cl-puthash 'authtype socks-authentication-failure info)
+      (cl-puthash 'server-protocol (nth 3 server-info) info)
+      (cl-puthash 'server-name (nth 1 server-info) info)
+      (case (nth 3 server-info)
+       (4
+        ;; Don't really have to do any connection setup under v4
+        nil)
+       (5
+        ;; Need to handle all the authentication crap under v5
+        ;; Send what we think we can handle for authentication types
+        (process-send-string proc (format "%c%s" socks-version
+                                          (socks-build-auth-list)))
+
+        ;; Basically just do a select() until we change states.
+        (socks-wait-for-state-change proc info socks-state-waiting-for-auth)
+        (setq authtype (cl-gethash 'authtype info))
+        (cond
+         ((= authtype socks-authentication-null)
+          (and socks-debug (message "No authentication necessary")))
+         ((= authtype socks-authentication-failure)
+          (error "No acceptable authentication methods found."))
+         (t
+          (let* ((auth-type (cl-gethash 'authtype info))
+                 (auth-handler (assoc auth-type socks-authentication-methods))
+                 (auth-func (and auth-handler (cdr (cdr auth-handler))))
+                 (auth-desc (and auth-handler (car (cdr auth-handler)))))
+            (set-process-filter proc nil)
+            (if (and auth-func (fboundp auth-func)
+                     (funcall auth-func proc))
+                nil                    ; We succeeded!
+              (delete-process proc)
+              (error "Failed to use auth method: %s (%d)"
+                     (or auth-desc "Unknown") auth-type))
+            )
+          )
+         )
+        (cl-puthash 'state socks-state-authenticated info)
+        (set-process-filter proc 'socks-filter)))
+      proc)))
+
+(defun socks-send-command (proc command atype address port)
+  (let ((addr (cond
+              ((or (= atype socks-address-type-v4)
+                   (= atype socks-address-type-v6))
+               address)
+              ((= atype socks-address-type-name)
+               (format "%c%s" (length address) address))
+              (t
+               (error "Unkown address type: %d" atype))))
+       (info (cl-gethash proc socks-connections))
+       request version)
+    (or info (error "socks-send-command called on non-SOCKS connection %S"
+                   proc))
+    (cl-puthash 'state socks-state-waiting info)
+    (setq version (cl-gethash 'server-protocol info))
+    (case version
+      (4
+       (setq request (format
+                     "%c%c%c%c%s%s%c"
+                     version           ; version
+                     command           ; command
+                     (lsh port -8)     ; port, high byte
+                     (- port (lsh (lsh port -8) 8)) ; port, low byte
+                     addr              ; address
+                     (user-full-name)  ; username
+                     0                 ; terminate username
+                     )))
+      (5
+       (setq request (format 
+                     "%c%c%c%c%s%c%c"
+                     version           ; version 
+                     command           ; command
+                     0                 ; reserved
+                     atype             ; address type
+                     addr              ; address
+                     (lsh port -8)     ; port, high byte
+                     (- port (lsh (lsh port -8) 8)) ; port, low byte
+                     )))
+      (otherwise
+       (error "Unknown protocol version: %d" version)))
+    (process-send-string proc request)
+    (socks-wait-for-state-change proc info socks-state-waiting)
+    (process-status proc)
+    (if (= (or (cl-gethash 'reply info) 1) socks-response-success)
+       nil                             ; Sweet sweet success!
+      (delete-process proc)
+      (error "SOCKS: %s" (nth (or (cl-gethash 'reply info) 1) socks-errors)))
+    proc))
+
+
+;; Replacement functions for open-network-stream, etc.
+(defvar socks-noproxy nil
+  "*List of regexps matching hosts that we should not socksify connections to")
+
+(defun socks-find-route (host service)
+  (let ((route socks-server)
+       (noproxy socks-noproxy))
+    (while noproxy
+      (if (eq ?! (aref (car noproxy) 0))
+         (if (string-match (substring (car noproxy) 1) host)
+             (setq route nil
+                   noproxy nil))
+       (if (string-match (car noproxy) host)
+           (setq route nil
+                 noproxy nil)))
+      (setq noproxy (cdr noproxy)))
+    route))
+
+(defvar socks-override-functions nil
+  "*Whether to overwrite the open-network-stream function with the SOCKSified
+version.")
+
+(if (fboundp 'socks-original-open-network-stream)
+    nil                                        ; Do nothing, we've been here 
already
+  (fset 'socks-original-open-network-stream
+       (symbol-function 'open-network-stream))
+  (if socks-override-functions
+      (fset 'open-network-stream 'socks-open-network-stream)))
+
+(defvar socks-services-file "/etc/services")
+(defvar socks-tcp-services (make-hash-table :size 13 :test 'equal))
+(defvar socks-udp-services (make-hash-table :size 13 :test 'equal))
+
+(defun socks-parse-services ()
+  (if (not (and (file-exists-p socks-services-file)
+               (file-readable-p socks-services-file)))
+      (error "Could not find services file: %s" socks-services-file))
+  (save-excursion
+    (clrhash socks-tcp-services)
+    (clrhash socks-udp-services)
+    (set-buffer (get-buffer-create " *socks-tmp*"))
+    (erase-buffer)
+    (insert-file-contents socks-services-file)
+    ;; Nuke comments
+    (goto-char (point-min))
+    (while (re-search-forward "#.*" nil t)
+      (replace-match ""))
+    ;; Nuke empty lines
+    (goto-char (point-min))
+    (while (re-search-forward "^[ \t\n]+" nil t)
+      (replace-match ""))
+    ;; Now find all the lines
+    (goto-char (point-min))
+    (let (name port type)
+      (while (re-search-forward "^\\([^ \t]+\\)[ \t]+\\([0-9]+\\)/\\([a-z]+\\)"
+                               nil t)
+       (setq name (downcase (match-string 1))
+             port (string-to-int (match-string 2))
+             type (downcase (match-string 3)))
+       (cl-puthash name port (if (equal type "udp")
+                              socks-udp-services
+                            socks-tcp-services))))))
+
+(defun socks-find-services-entry (service &optional udp)
+  "Return the port # associated with SERVICE"
+  (if (= (hash-table-count socks-tcp-services) 0)
+      (socks-parse-services))
+  (cl-gethash (downcase service)
+             (if udp socks-udp-services socks-tcp-services)))
+
+(defun socks-open-network-stream (name buffer host service)
+  (let* ((route (socks-find-route host service))
+        proc info version atype)
+    (if (not route)
+       (socks-original-open-network-stream name buffer host service)
+      (setq proc (socks-open-connection route)
+           info (cl-gethash proc socks-connections)
+           version (cl-gethash 'server-protocol info))
+      (case version
+       (4
+        (setq host (socks-nslookup-host host))
+        (if (not (listp host))
+            (error "Could not get IP address for: %s" host))
+        (setq host (apply 'format "%c%c%c%c" host))
+        (setq atype socks-address-type-v4))
+       (otherwise
+        (setq atype socks-address-type-name)))
+      (socks-send-command proc
+                         socks-connect-command
+                         atype
+                         host
+                         (if (stringp service)
+                             (socks-find-services-entry service)
+                           service))
+      (cl-puthash 'buffer buffer info)
+      (cl-puthash 'host host info)
+      (cl-puthash 'service host info)
+      (set-process-filter proc nil)
+      (set-process-buffer proc (if buffer (get-buffer-create buffer)))
+      proc)))
+
+;; Authentication modules go here
+
+;; Basic username/password authentication, ala RFC 1929
+(socks-register-authentication-method 2 "Username/Password"
+                                     'socks-username/password-auth)
+
+(defconst socks-username/password-auth-version 1)
+
+(if (not (fboundp 'char-int))
+    (fset 'char-int 'identity))
+
+(defun socks-username/password-auth-filter (proc str)
+  (let ((info (cl-gethash proc socks-connections))
+       state desired-len)
+    (or info (error "socks-filter called on non-SOCKS connection %S" proc))
+    (setq state (cl-gethash 'state info))
+    (cl-puthash 'scratch (concat (cl-gethash 'scratch info) str) info)
+    (if (< (length (cl-gethash 'scratch info)) 2)
+       nil
+      (cl-puthash 'password-auth-status (char-int
+                                        (aref (cl-gethash 'scratch info) 1))
+                 info)
+      (cl-puthash 'state socks-state-authenticated info))))
+
+(defun socks-username/password-auth (proc)
+  (let* ((info (cl-gethash proc socks-connections))
+        (state (cl-gethash 'state info)))
+    (if (not socks-password)
+       (setq socks-password (read-passwd
+                             (format "Password for address@hidden: "
+                                     socks-username
+                                     (cl-gethash 'server-name info)))))
+    (cl-puthash 'scratch "" info)
+    (set-process-filter proc 'socks-username/password-auth-filter)
+    (process-send-string proc
+                        (format "%c%c%s%c%s"
+                                socks-username/password-auth-version
+                                (length socks-username)
+                                socks-username
+                                (length socks-password)
+                                socks-password))
+    (socks-wait-for-state-change proc info state)
+    (= (cl-gethash 'password-auth-status info) 0)))
+
+
+;; More advanced GSS/API stuff, not yet implemented - volunteers?
+;; (socks-register-authentication-method 1 "GSS/API" 'socks-gssapi-auth)
+
+(defun socks-gssapi-auth (proc)
+  nil)
+
+
+;; CHAP stuff
+;; (socks-register-authentication-method 3 "CHAP" 'socks-chap-auth)
+(defun socks-chap-auth (proc)
+  nil)
+
+
+;; CRAM stuff
+;; (socks-register-authentication-method 5 "CRAM" 'socks-cram-auth)
+(defun socks-cram-auth (proc)
+  nil)
+
+
+(defcustom socks-nslookup-program "nslookup"
+  "*If non-NIL then a string naming the nslookup program."
+  :type '(choice (const :tag "None" :value nil) string)
+  :group 'socks)
+
+(defun socks-nslookup-host (host)
+  "Attempt to resolve the given HOSTNAME using nslookup if possible."
+  (interactive "sHost:  ")
+  (if socks-nslookup-program
+      (let ((proc (start-process " *nslookup*" " *nslookup*"
+                                socks-nslookup-program host))
+           (res host))
+       (process-kill-without-query proc)
+       (save-excursion
+         (set-buffer (process-buffer proc))
+         (while (memq (process-status proc) '(run open))
+           (accept-process-output proc))
+         (goto-char (point-min))
+         (if (re-search-forward "Name:.*\nAddress: *\\(.*\\)$" nil t)
+             (progn
+               (setq res (buffer-substring (match-beginning 1)
+                                           (match-end 1))
+                     res (mapcar 'string-to-int (split-string res "\\.")))))
+         (kill-buffer (current-buffer)))
+       res)
+    host))
+
+(provide 'socks)
diff --git a/lisp/ssl.el b/lisp/ssl.el
new file mode 100644
index 0000000..8968a84
--- /dev/null
+++ b/lisp/ssl.el
@@ -0,0 +1,169 @@
+;;; ssl.el,v --- ssl functions for emacsen without them builtin
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:08 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1995, 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'cl)
+(require 'base64)
+
+(eval-and-compile
+  (condition-case ()
+      (require 'custom)
+    (error nil))
+  (if (and (featurep 'custom) (fboundp 'custom-declare-variable))
+      nil ;; We've got what we needed
+    ;; We have the old custom-library, hack around it!
+    (defmacro defgroup (&rest args)
+      nil)
+    (defmacro defcustom (var value doc &rest args) 
+      (` (defvar (, var) (, value) (, doc))))))
+
+(defgroup ssl nil
+  "Support for `Secure Sockets Layer' encryption."
+  :group 'comm)
+  
+(defcustom ssl-certificate-directory "~/.w3/certs/"
+  "*Directory to store CA certificates in"
+  :group 'ssl
+  :type 'directory)
+
+(defcustom ssl-rehash-program-name "c_rehash"
+  "*Program to run after adding a cert to a directory .
+Run with one argument, the directory name."
+  :group 'ssl
+  :type 'string)
+
+(defcustom ssl-view-certificate-program-name "x509"
+  "*The program to run to provide a human-readable view of a certificate."
+  :group 'ssl
+  :type 'string)
+
+(defcustom ssl-view-certificate-program-arguments '("-text" "-inform" "DER")
+  "*Arguments that should be passed to the certificate viewing program.
+The certificate is piped to it.
+Maybe a way of passing a file should be implemented"
+  :group 'ssl
+  :type 'list)
+
+(defcustom ssl-certificate-directory-style 'ssleay
+  "*Style of cert database to use, the only valid value right now is `ssleay'.
+This means a directory of pem encoded certificates with hash symlinks."
+  :group 'ssl
+  :type '(choice (const :tag "SSLeay" :value ssleay)))  
+
+(defcustom ssl-certificate-verification-policy 0
+  "*How far up the certificate chain we should verify."
+  :group 'ssl
+  :type '(choice (const :tag "No verification" :value 0)
+                (const :tag "Verification required" :value 1)
+                (const :tag "Reject connection if verification fails" :value 3)
+                (const :tag "SSL_VERIFY_CLIENT_ONCE" :value 5)))
+
+(defcustom ssl-program-name "s_client"
+  "*The program to run in a subprocess to open an SSL connection."
+  :group 'ssl
+  :type 'string)
+
+(defcustom ssl-program-arguments
+  '(;;"-quiet"
+    "-host" host
+    "-port" service
+    "-verify" (int-to-string ssl-certificate-verification-policy)
+    "-CApath" ssl-certificate-directory
+    )
+  "*Arguments that should be passed to the program `ssl-program-name'.
+This should be used if your SSL program needs command line switches to
+specify any behaviour (certificate file locations, etc).
+The special symbols 'host and 'port may be used in the list of arguments
+and will be replaced with the hostname and service/port that will be connected
+to."
+  :group 'ssl
+  :type 'list)
+
+(defun ssl-accept-ca-certificate ()
+  "Ask if the user is willing to accept a new CA certificate. The buffer-name
+should be the intended name of the certificate, and the buffer should probably
+be in DER encoding"
+  ;; TODO, check if it is really new or if we already know it
+  (let* ((process-connection-type nil)
+        (tmpbuf (generate-new-buffer "X509 CA Certificate Information"))
+        (response (save-excursion
+                    (and (eq 0 
+                             (apply 'call-process-region
+                                    (point-min) (point-max) 
+                                    ssl-view-certificate-program-name 
+                                    nil tmpbuf t
+                                    ssl-view-certificate-program-arguments))
+                         (switch-to-buffer tmpbuf)
+                         (goto-char (point-min))
+                         (or (recenter) t)
+                         (yes-or-no-p
+                          "Accept this CA to vouch for secure server 
identities? ")
+                         (kill-buffer tmpbuf)))))
+    (if (not response)
+       nil
+      (if (not (file-directory-p ssl-certificate-directory))
+         (make-directory ssl-certificate-directory))
+      (case ssl-certificate-directory-style
+       (ssleay
+        (base64-encode-region (point-min) (point-max))
+        (goto-char (point-min))
+        (insert "-----BEGIN CERTIFICATE-----\n")
+        (goto-char (point-max))
+        (insert "-----END CERTIFICATE-----\n")
+        (let ((f (expand-file-name
+                  (concat (file-name-sans-extension (buffer-name)) ".pem")
+                  ssl-certificate-directory)))
+          (write-file f)
+          (call-process ssl-rehash-program-name
+                        nil nil nil
+                        (expand-file-name ssl-certificate-directory))))))))
+
+(defun open-ssl-stream (name buffer host service)
+  "Open a SSL connection for a service to a host.
+Returns a subprocess-object to represent the connection.
+Input and output work as for subprocesses; `delete-process' closes it.
+Args are NAME BUFFER HOST SERVICE.
+NAME is name for process.  It is modified if necessary to make it unique.
+BUFFER is the buffer (or buffer-name) to associate with the process.
+ Process output goes at end of that buffer, unless you specify
+ an output stream or filter function to handle the output.
+ BUFFER may be also nil, meaning that this process is not associated
+ with any buffer
+Third arg is name of the host to connect to, or its IP address.
+Fourth arg SERVICE is name of the service desired, or an integer
+specifying a port number to connect to."
+  (if (integerp service) (setq service (int-to-string service)))
+  (let* ((process-connection-type nil)
+        (port service)
+        (proc (eval
+               (`
+                (start-process name buffer ssl-program-name
+                               (,@ ssl-program-arguments))))))
+    (process-kill-without-query proc)
+    proc))
+
+(provide 'ssl)
diff --git a/lisp/url-auth.el b/lisp/url-auth.el
new file mode 100644
index 0000000..e922a20
--- /dev/null
+++ b/lisp/url-auth.el
@@ -0,0 +1,318 @@
+;;; url-auth.el --- Uniform Resource Locator authorization modules
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:08 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'url-vars)
+(require 'url-parse)
+
+(defsubst url-auth-user-prompt (url realm)
+  "String to usefully prompt for a username."
+  (concat "Username [for "
+         (or realm (url-truncate-url-for-viewing
+                    (url-recreate-url url)
+                    (- (window-width) 10 20)))
+         "]: "))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Basic authorization code
+;;; ------------------------
+;;; This implements the BASIC authorization type.  See the online
+;;; documentation at
+;;; http://www.w3.org/hypertext/WWW/AccessAuthorization/Basic.html
+;;; for the complete documentation on this type.
+;;;
+;;; This is very insecure, but it works as a proof-of-concept
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar url-basic-auth-storage nil
+  "Where usernames and passwords are stored.  Its value is an assoc list of
+assoc lists.  The first assoc list is keyed by the server name.  The cdr of
+this is an assoc list based on the 'directory' specified by the url we are
+looking up.")
+
+(defun url-basic-auth (url &optional prompt overwrite realm args)
+  "Get the username/password for the specified URL.
+If optional argument PROMPT is non-nil, ask for the username/password
+to use for the url and its descendants.  If optional third argument
+OVERWRITE is non-nil, overwrite the old username/password pair if it
+is found in the assoc list.  If REALM is specified, use that as the realm
+instead of the pathname inheritance method."
+  (let* ((href (if (stringp url)
+                  (url-generic-parse-url url)
+                url))
+        (server (url-host href))
+        (port (or (url-port href) "80"))
+        (path (url-filename href))
+        user pass byserv retval data)
+    (setq server (concat server ":" port)
+         path (cond
+               (realm realm)
+               ((string-match "/$" path) path)
+               (t (url-basepath path)))
+         byserv (cdr-safe (assoc server url-basic-auth-storage)))
+    (cond
+     ((and prompt (not byserv))
+      (setq user (read-string (url-auth-user-prompt url realm)
+                             (user-real-login-name))
+           pass (funcall url-passwd-entry-func "Password: ")
+           url-basic-auth-storage
+           (cons (list server
+                       (cons path
+                             (setq retval
+                                   (base64-encode
+                                    (format "%s:%s" user pass)))))
+                 url-basic-auth-storage)))
+     (byserv
+      (setq retval (cdr-safe (assoc path byserv)))
+      (if (and (not retval)
+              (string-match "/" path))
+         (while (and byserv (not retval))
+           (setq data (car (car byserv)))
+           (if (or (not (string-match "/" data)) ; Its a realm - take it!
+                   (and
+                    (>= (length path) (length data))
+                    (string= data (substring path 0 (length data)))))
+               (setq retval (cdr (car byserv))))
+           (setq byserv (cdr byserv))))
+      (if (or (and (not retval) prompt) overwrite)
+         (progn
+           (setq user (read-string (url-auth-user-prompt url realm)
+                                   (user-real-login-name))
+                 pass (funcall url-passwd-entry-func "Password: ")
+                 retval (base64-encode (format "%s:%s" user pass))
+                 byserv (assoc server url-basic-auth-storage))
+           (setcdr byserv
+                   (cons (cons path retval) (cdr byserv))))))
+     (t (setq retval nil)))
+    (if retval (setq retval (concat "Basic " retval)))
+    retval))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Digest authorization code
+;;; ------------------------
+;;; This implements the DIGEST authorization type.  See the internet draft
+;;; ftp://ds.internic.net/internet-drafts/draft-ietf-http-digest-aa-01.txt
+;;; for the complete documentation on this type.
+;;;
+;;; This is very secure
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar url-digest-auth-storage nil
+  "Where usernames and passwords are stored.  Its value is an assoc list of
+assoc lists.  The first assoc list is keyed by the server name.  The cdr of
+this is an assoc list based on the 'directory' specified by the url we are
+looking up.")
+
+(defun url-digest-auth-create-key (username password realm method uri)
+  "Create a key for digest authentication method"
+  (let* ((info (if (stringp uri)
+                  (url-generic-parse-url uri)
+                uri))
+        (a1 (md5 (concat username ":" realm ":" password)))
+        (a2 (md5 (concat method ":" (url-filename info)))))
+    (list a1 a2)))
+
+(defun url-digest-auth (url &optional prompt overwrite realm args)
+  "Get the username/password for the specified URL.
+If optional argument PROMPT is non-nil, ask for the username/password
+to use for the url and its descendants.  If optional third argument
+OVERWRITE is non-nil, overwrite the old username/password pair if it
+is found in the assoc list.  If REALM is specified, use that as the realm
+instead of hostname:portnum."
+  (if args
+      (let* ((href (if (stringp url)
+                      (url-generic-parse-url url)
+                    url))
+            (server (url-host href))
+            (port (or (url-port href) "80"))
+            (path (url-filename href))
+            user pass byserv retval data)
+       (setq path (cond
+                   (realm realm)
+                   ((string-match "/$" path) path)
+                   (t (url-basepath path)))
+             server (concat server ":" port)
+             byserv (cdr-safe (assoc server url-digest-auth-storage)))
+       (cond
+        ((and prompt (not byserv))
+         (setq user (read-string (url-auth-user-prompt url realm)
+                                 (user-real-login-name))
+               pass (funcall url-passwd-entry-func "Password: ")
+               url-digest-auth-storage
+               (cons (list server
+                           (cons path
+                                 (setq retval
+                                       (cons user
+                                             (url-digest-auth-create-key
+                                              user pass realm
+                                              (or url-request-method "GET")
+                                              url)))))
+                     url-digest-auth-storage)))
+        (byserv
+         (setq retval (cdr-safe (assoc path byserv)))
+         (if (and (not retval)         ; no exact match, check directories
+                  (string-match "/" path)) ; not looking for a realm
+             (while (and byserv (not retval))
+               (setq data (car (car byserv)))
+               (if (or (not (string-match "/" data))
+                       (and
+                        (>= (length path) (length data))
+                        (string= data (substring path 0 (length data)))))
+                   (setq retval (cdr (car byserv))))
+               (setq byserv (cdr byserv))))
+         (if (or (and (not retval) prompt) overwrite)
+             (progn
+               (setq user (read-string (url-auth-user-prompt url realm)
+                                       (user-real-login-name))
+                     pass (funcall url-passwd-entry-func "Password: ")
+                     retval (setq retval
+                                  (cons user
+                                        (url-digest-auth-create-key
+                                         user pass realm
+                                         (or url-request-method "GET")
+                                         url)))
+                     byserv (assoc server url-digest-auth-storage))
+               (setcdr byserv
+                       (cons (cons path retval) (cdr byserv))))))
+        (t (setq retval nil)))
+       (if retval
+           (let ((nonce (or (cdr-safe (assoc "nonce" args)) "nonegiven"))
+                 (opaque (or (cdr-safe (assoc "opaque" args)) "nonegiven")))
+             (format
+              (concat "Digest username=\"%s\", realm=\"%s\","
+                      "nonce=\"%s\", uri=\"%s\","
+                      "response=\"%s\", opaque=\"%s\"")
+              (nth 0 retval) realm nonce (url-filename href)
+              (md5 (concat (nth 1 retval) ":" nonce ":"
+                           (nth 2 retval))) opaque))))))
+
+(defvar url-registered-auth-schemes nil
+  "A list of the registered authorization schemes and various and sundry
+information associated with them.")
+
+;;;###autoload
+(defun url-get-authentication (url realm type prompt &optional args)
+  "Return an authorization string suitable for use in the WWW-Authenticate
+header in an HTTP/1.0 request.
+
+URL    is the url you are requesting authorization to.  This can be either a
+       string representing the URL, or the parsed representation returned by
+       `url-generic-parse-url'
+REALM  is the realm at a specific site we are looking for.  This should be a
+       string specifying the exact realm, or nil or the symbol 'any' to
+       specify that the filename portion of the URL should be used as the
+       realm
+TYPE   is the type of authentication to be returned.  This is either a string
+       representing the type (basic, digest, etc), or nil or the symbol 'any'
+       to specify that any authentication is acceptable.  If requesting 'any'
+       the strongest matching authentication will be returned.  If this is
+       wrong, its no big deal, the error from the server will specify exactly
+       what type of auth to use
+PROMPT is boolean - specifies whether to ask the user for a username/password
+       if one cannot be found in the cache"
+  (if (not realm)
+      (setq realm (cdr-safe (assoc "realm" args))))
+  (if (stringp url)
+      (setq url (url-generic-parse-url url)))
+  (if (or (null type) (eq type 'any))
+      ;; Whooo doogies!
+      ;; Go through and get _all_ the authorization strings that could apply
+      ;; to this URL, store them along with the 'rating' we have in the list
+      ;; of schemes, then sort them so that the 'best' is at the front of the
+      ;; list, then get the car, then get the cdr.
+      ;; Zooom zooom zoooooom
+      (cdr-safe
+       (car-safe
+       (sort
+        (mapcar
+         (function
+          (lambda (scheme)
+            (if (fboundp (car (cdr scheme)))
+                (cons (cdr (cdr scheme))
+                      (funcall (car (cdr scheme)) url nil nil realm))
+              (cons 0 nil))))
+         url-registered-auth-schemes)
+        (function
+         (lambda (x y)
+           (cond
+            ((null (cdr x)) nil)
+            ((and (cdr x) (null (cdr y))) t)
+            ((and (cdr x) (cdr y))
+             (>= (car x) (car y)))
+            (t nil)))))))
+    (if (symbolp type) (setq type (symbol-name type)))
+    (let* ((scheme (car-safe
+                   (cdr-safe (assoc (downcase type)
+                                    url-registered-auth-schemes)))))
+      (if (and scheme (fboundp scheme))
+         (funcall scheme url prompt
+                  (and prompt
+                       (funcall scheme url nil nil realm args))
+                  realm args)))))
+
+;;;###autoload
+(defun url-register-auth-scheme (type &optional function rating)
+  "Register an HTTP authentication method.
+
+TYPE     is a string or symbol specifying the name of the method.   This
+         should be the same thing you expect to get returned in an Authenticate
+         header in HTTP/1.0 - it will be downcased.
+FUNCTION is the function to call to get the authorization information.  This
+         defaults to `url-?-auth', where ? is TYPE
+RATING   a rating between 1 and 10 of the strength of the authentication.
+         This is used when asking for the best authentication for a specific
+         URL.  The item with the highest rating is returned."
+  (let* ((type (cond
+               ((stringp type) (downcase type))
+               ((symbolp type) (downcase (symbol-name type)))
+               (t (error "Bad call to `url-register-auth-scheme'"))))
+        (function (or function (intern (concat "url-" type "-auth"))))
+        (rating (cond
+                 ((null rating) 2)
+                 ((stringp rating) (string-to-int rating))
+                 (t rating)))
+        (node (assoc type url-registered-auth-schemes)))
+    (if (not (fboundp function))
+       (url-warn 'security
+                 (format (eval-when-compile
+                           "Tried to register `%s' as an auth scheme"
+                           ", but it is not a function!") function)))
+
+    (if node
+       (progn
+         (setcdr node (cons function rating))
+         (url-warn 'security
+                   (format
+                    "Replacing authorization method `%s' - this could be bad."
+                    type)))
+      (setq url-registered-auth-schemes
+           (cons (cons type (cons function rating))
+                 url-registered-auth-schemes)))))
+
+(defun url-auth-registered (scheme)
+  ;; Return non-nil iff SCHEME is registered as an auth type
+  (assoc scheme url-registered-auth-schemes))
+
+(provide 'urlauth)
diff --git a/lisp/url-cache.el b/lisp/url-cache.el
new file mode 100644
index 0000000..7863568
--- /dev/null
+++ b/lisp/url-cache.el
@@ -0,0 +1,271 @@
+;;; url-cache.el --- Uniform Resource Locator retrieval tool
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:08 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'md5)
+(require 'mule-sysdp)
+
+(defcustom url-cache-directory
+  (expand-file-name "cache" w3-configuration-directory)
+  "*The directory where cache files should be stored."
+  :type 'directory
+  :group 'url-file)
+
+;; Cache manager
+(defun url-cache-file-writable-p (file)
+  "Follows the documentation of file-writable-p, unlike file-writable-p."
+  (and (file-writable-p file)
+       (if (file-exists-p file)
+           (not (file-directory-p file))
+         (file-directory-p (file-name-directory file)))))
+                
+(defun url-cache-prepare (file)
+  "Makes it possible to cache data in FILE.
+Creates any necessary parent directories, deleting any non-directory files
+that would stop this.  Returns nil if parent directories can not be
+created.  If FILE already exists as a non-directory, it changes
+permissions of FILE or deletes FILE to make it possible to write a new
+version of FILE.  Returns nil if this can not be done.  Returns nil if
+FILE already exists as a directory.  Otherwise, returns t, indicating that
+FILE can be created or overwritten."
+  (cond
+   ((url-cache-file-writable-p file)
+    t)
+   ((file-directory-p file)
+    nil)
+   (t
+    (condition-case ()
+       (or (make-directory (file-name-directory file) t) t)
+      (error nil)))))
+
+(defcustom url-cache-ignored-protocols
+  '("www" "about" "https" "mailto")
+  "*A list of protocols that we should never cache."
+  :type '(repeat (string :tag "Protocol"))
+  :group 'url-cache)
+
+(defun url-cache-cachable-p (obj)
+  ;; return t iff the current buffer is cachable
+  (cond
+   ((not url-automatic-caching)                ; User doesn't want to cache
+    nil)
+   ((null obj)                         ; Something horribly confused
+    nil)
+   ((member (url-type obj) url-cache-ignored-protocols)
+    ;; We have been told to ignore this type of object
+    nil)
+   ((and (member (url-type obj) '("file" "ftp")) (not (url-host obj)))
+    ;; We never want to cache local files... what's the point?
+    nil)
+   ((member (url-type obj) '("http" "https"))
+    (let* ((status (cdr-safe (assoc "status" url-current-mime-headers)))
+          (class (if status (/ status 100) 0)))
+      (cond
+       ((string-match (eval-when-compile (regexp-quote "?"))
+                     (url-filename obj))
+       nil)
+       ((= class 2)
+       (memq status '(200)))
+       (t nil))))
+   (t
+    nil)))
+
+;;;###autoload
+(defun url-store-in-cache (&optional buff)
+  "Store buffer BUFF in the cache"
+  (if (not (and buff (get-buffer buff)))
+      nil
+    (save-excursion
+      (and buff (set-buffer buff))
+      (if (not (url-cache-cachable-p url-current-object))
+         nil
+       (let* ((fname (url-cache-create-filename (url-view-url t)))
+              (fname-hdr (concat fname ".hdr"))
+              (info (mapcar (function (lambda (var)
+                                        (cons (symbol-name var)
+                                              (symbol-value var))))
+                            '( url-current-content-length
+                               url-current-object
+                               url-current-isindex
+                               url-current-mime-encoding
+                               url-current-mime-headers
+                               url-current-mime-type
+                               url-current-mime-charset
+                               ))))
+         (cond ((and (url-cache-prepare fname)
+                     (url-cache-prepare fname-hdr))
+                (mule-write-region-no-coding-system (point-min) (point-max) 
fname nil 5)
+                (set-buffer (get-buffer-create " *cache-tmp*"))
+                (erase-buffer)
+                (insert "(setq ")
+                (mapcar
+                 (function
+                  (lambda (x)
+                    (insert (car x) " "
+                            (cond ((null (setq x (cdr x))) "nil")
+                                  ((stringp x) (prin1-to-string x))
+                                  ((listp x) (concat "'" (prin1-to-string x)))
+                                  ((vectorp x) (prin1-to-string x))
+                                  ((numberp x) (int-to-string x))
+                                  (t "'???")) "\n")))
+                 info)
+                (insert ")\n")
+                (mule-write-region-no-coding-system (point-min) (point-max) 
fname-hdr nil 5))))))))
+       
+            
+;;;###autoload
+(defun url-is-cached (url)
+  "Return non-nil if the URL is cached."
+  (let* ((fname (url-cache-create-filename url))
+        (attribs (file-attributes fname)))
+    (and fname                         ; got a filename
+        (file-exists-p fname)          ; file exists
+        (not (eq (nth 0 attribs) t))   ; Its not a directory
+        (nth 5 attribs))))             ; Can get last mod-time
+
+(defun url-cache-create-filename-human-readable (url)
+  "Return a filename in the local cache for URL"
+  (if url
+      (let* ((url (if (vectorp url) (url-recreate-url url) url))
+            (urlobj (url-generic-parse-url url))
+            (protocol (url-type urlobj))
+            (hostname (url-host urlobj))
+            (host-components
+             (cons
+              (user-real-login-name)
+              (cons (or protocol "file")
+                    (reverse (split-string (or hostname "localhost")
+                                           (eval-when-compile
+                                             (regexp-quote ".")))))))
+            (fname    (url-filename urlobj)))
+       (if (and fname (/= (length fname) 0) (= (aref fname 0) ?/))
+           (setq fname (substring fname 1 nil)))
+       (if fname
+           (let ((slash nil))
+             (setq fname
+                   (mapconcat
+                    (function
+                     (lambda (x)
+                       (cond
+                        ((and (= ?/ x) slash)
+                         (setq slash nil)
+                         "%2F")
+                        ((= ?/ x)
+                         (setq slash t)
+                         "/")
+                        (t
+                         (setq slash nil)
+                         (char-to-string x))))) fname ""))))
+
+       (setq fname (and fname
+                        (mapconcat
+                         (function (lambda (x)
+                                     (if (= x ?~) "" (char-to-string x))))
+                         fname ""))
+             fname (cond
+                    ((null fname) nil)
+                    ((or (string= "" fname) (string= "/" fname))
+                     url-directory-index-file)
+                    ((= (string-to-char fname) ?/)
+                     (if (string= (substring fname -1 nil) "/")
+                         (concat fname url-directory-index-file)
+                       (substring fname 1 nil)))
+                    (t
+                     (if (string= (substring fname -1 nil) "/")
+                         (concat fname url-directory-index-file)
+                       fname))))
+       (and fname
+            (expand-file-name fname
+                              (expand-file-name
+                               (mapconcat 'identity host-components "/")
+                               url-cache-directory))))))
+
+(defun url-cache-create-filename-using-md5 (url)
+  "Create a cached filename using MD5.
+ Very fast if you are in XEmacs, suitably fast otherwise."
+  (if url
+      (let* ((checksum (md5 url))
+            (url (if (vectorp url) (url-recreate-url url) url))
+            (urlobj (url-generic-parse-url url))
+            (protocol (url-type urlobj))
+            (hostname (url-host urlobj))
+            (host-components
+             (cons
+              (user-real-login-name)
+              (cons (or protocol "file")
+                    (nreverse
+                     (delq nil
+                           (split-string (or hostname "localhost")
+                                         (eval-when-compile
+                                           (regexp-quote "."))))))))
+            (fname    (url-filename urlobj)))
+       (and fname
+            (expand-file-name checksum
+                              (expand-file-name
+                               (mapconcat 'identity host-components "/")
+                               url-cache-directory))))))
+
+(defcustom url-cache-creation-function 'url-cache-create-filename-using-md5
+  "*What function to use to create a cached filename."
+  :type '(choice (const :tag "MD5 of filename (low collision rate)"
+                       :value url-cache-create-filename-using-md5)
+                (const :tag "Human readable filenames (higher collision rate)"
+                       :value url-cache-create-filename-human-readable)
+                (function :tag "Other"))
+  :group 'url-cache)
+
+(defun url-cache-create-filename (url)
+  (funcall url-cache-creation-function url))
+
+;;;###autoload
+(defun url-cache-extract (fnam)
+  "Extract FNAM from the local disk cache"
+  (set-buffer (get-buffer-create url-working-buffer))
+  (erase-buffer)
+  (setq url-current-mime-viewer nil)
+  (insert-file-contents-literally fnam)
+  (load (concat (if (memq system-type '(ms-windows ms-dos emx os2))
+                   (url-file-extension fnam t)
+                 fnam) ".hdr") t t)) 
+
+;;;###autoload
+(defun url-cache-expired (url mod)
+  "Return t iff a cached file has expired."
+  (let* ((urlobj (if (vectorp url) url (url-generic-parse-url url)))
+        (type (url-type urlobj)))
+    (cond
+     (url-standalone-mode
+      (not (file-exists-p (url-cache-create-filename url))))
+     ((string= type "http")
+      t)
+     ((member type '("file" "ftp"))
+      (if (or (equal mod '(0 0)) (not mod))
+         (return t)
+       (or (> (nth 0 mod) (nth 0 (current-time)))
+           (> (nth 1 mod) (nth 1 (current-time))))))
+     (t nil))))
+
+(provide 'url-cache)
diff --git a/lisp/url-cookie.el b/lisp/url-cookie.el
new file mode 100644
index 0000000..59bf442
--- /dev/null
+++ b/lisp/url-cookie.el
@@ -0,0 +1,389 @@
+;;; url-cookie.el --- Netscape Cookie support
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:08 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'timezone)
+(require 'cl)
+
+(eval-and-compile
+  (let ((keywords 
+        '(:name :value :expires :path :domain :test :secure)))
+    (while keywords
+      (or (boundp (car keywords))
+         (set (car keywords) (car keywords)))
+      (setq keywords (cdr keywords)))))
+
+;; See http://home.netscape.com/newsref/std/cookie_spec.html for the
+;; 'open standard' defining this crap.
+;;
+;; A cookie is stored internally as a vector of 7 slots
+;; [ 'cookie name value expires path domain secure ]
+
+(defsubst url-cookie-name    (cookie) (aref cookie 1))
+(defsubst url-cookie-value   (cookie) (aref cookie 2))
+(defsubst url-cookie-expires (cookie) (aref cookie 3))
+(defsubst url-cookie-path    (cookie) (aref cookie 4))
+(defsubst url-cookie-domain  (cookie) (aref cookie 5))
+(defsubst url-cookie-secure  (cookie) (aref cookie 6))
+
+(defsubst url-cookie-set-name    (cookie val) (aset cookie 1 val))
+(defsubst url-cookie-set-value   (cookie val) (aset cookie 2 val))
+(defsubst url-cookie-set-expires (cookie val) (aset cookie 3 val))
+(defsubst url-cookie-set-path    (cookie val) (aset cookie 4 val))
+(defsubst url-cookie-set-domain  (cookie val) (aset cookie 5 val))
+(defsubst url-cookie-set-secure  (cookie val) (aset cookie 6 val))
+(defsubst url-cookie-retrieve-arg (key args) (nth 1 (memq key args)))
+
+(defsubst url-cookie-create (&rest args)
+  (let ((retval (make-vector 7 nil)))
+    (aset retval 0 'cookie)
+    (url-cookie-set-name retval (url-cookie-retrieve-arg :name args))
+    (url-cookie-set-value retval (url-cookie-retrieve-arg :value args))
+    (url-cookie-set-expires retval (url-cookie-retrieve-arg :expires args))
+    (url-cookie-set-path retval (url-cookie-retrieve-arg :path args))
+    (url-cookie-set-domain retval (url-cookie-retrieve-arg :domain args))
+    (url-cookie-set-secure retval (url-cookie-retrieve-arg :secure args))
+    retval))
+
+(defun url-cookie-p (obj)
+  (and (vectorp obj) (= (length obj) 7) (eq (aref obj 0) 'cookie)))
+
+;;;###autoload
+(defun url-cookie-parse-file (&optional fname)
+  (setq fname (or fname url-cookie-file))
+  (condition-case ()
+      (load fname nil t)
+    (error (message "Could not load cookie file %s" fname))))
+
+(defun url-cookie-clean-up (&optional secure)
+  (let* (
+        (var (if secure 'url-cookie-secure-storage 'url-cookie-storage))
+        (val (symbol-value var))
+        (cur nil)
+        (new nil)
+        (cookies nil)
+        (cur-cookie nil)
+        (new-cookies nil)
+        )
+    (while val
+      (setq cur (car val)
+           val (cdr val)
+           new-cookies nil
+           cookies (cdr cur))
+      (while cookies
+       (setq cur-cookie (car cookies)
+             cookies (cdr cookies))
+       (if (or (not (url-cookie-p cur-cookie))
+               (url-cookie-expired-p cur-cookie)
+               (null (url-cookie-expires cur-cookie)))
+           nil
+         (setq new-cookies (cons cur-cookie new-cookies))))
+      (if (not new-cookies)
+         nil
+       (setcdr cur new-cookies)
+       (setq new (cons cur new))))
+    (set var new)))
+
+;;;###autoload
+(defun url-cookie-write-file (&optional fname)
+  (setq fname (or fname url-cookie-file))
+  (url-cookie-clean-up)
+  (url-cookie-clean-up t)
+  (save-excursion
+    (set-buffer (get-buffer-create " *cookies*"))
+    (erase-buffer)
+    (fundamental-mode)
+    (insert ";; Emacs-W3 HTTP cookies file\n"
+           ";; Automatically generated file!!! DO NOT EDIT!!!\n\n"
+           "(setq url-cookie-storage\n '")
+    (pp url-cookie-storage (current-buffer))
+    (insert ")\n(setq url-cookie-secure-storage\n '")
+    (pp url-cookie-secure-storage (current-buffer))
+    (insert ")\n")
+    (write-file fname)
+    (kill-buffer (current-buffer))))
+
+(defun url-cookie-store (name value &optional expires domain path secure)
+  "Stores a netscape-style cookie"
+  (let* ((storage (if secure url-cookie-secure-storage url-cookie-storage))
+        (tmp storage)
+        (cur nil)
+        (found-domain nil))
+
+    ;; First, look for a matching domain
+    (setq found-domain (assoc domain storage))
+
+    (if found-domain
+       ;; Need to either stick the new cookie in existing domain storage
+       ;; or possibly replace an existing cookie if the names match.
+       (progn
+         (setq storage (cdr found-domain)
+               tmp nil)
+         (while storage
+           (setq cur (car storage)
+                 storage (cdr storage))
+           (if (and (equal path (url-cookie-path cur))
+                    (equal name (url-cookie-name cur)))
+               (progn
+                 (url-cookie-set-expires cur expires)
+                 (url-cookie-set-value cur value)
+                 (setq tmp t))))
+         (if (not tmp)
+             ;; New cookie
+             (setcdr found-domain (cons
+                                   (url-cookie-create :name name
+                                                      :value value
+                                                      :expires expires
+                                                      :domain domain
+                                                      :path path
+                                                      :secure secure)
+                                   (cdr found-domain)))))
+      ;; Need to add a new top-level domain
+      (setq tmp (url-cookie-create :name name
+                                  :value value
+                                  :expires expires
+                                  :domain domain
+                                  :path path
+                                  :secure secure))
+      (cond
+       (storage
+       (setcdr storage (cons (list domain tmp) (cdr storage))))
+       (secure
+       (setq url-cookie-secure-storage (list (list domain tmp))))
+       (t
+       (setq url-cookie-storage (list (list domain tmp))))))))
+
+(defun url-cookie-expired-p (cookie)
+  (let* (
+        (exp (url-cookie-expires cookie))
+        (cur-date (and exp (timezone-parse-date (current-time-string))))
+        (exp-date (and exp (timezone-parse-date exp)))
+        (cur-greg (and cur-date (timezone-absolute-from-gregorian
+                                 (string-to-int (aref cur-date 1))
+                                 (string-to-int (aref cur-date 2))
+                                 (string-to-int (aref cur-date 0)))))
+        (exp-greg (and exp (timezone-absolute-from-gregorian
+                            (string-to-int (aref exp-date 1))
+                            (string-to-int (aref exp-date 2))
+                            (string-to-int (aref exp-date 0)))))
+        (diff-in-days (and exp (- cur-greg exp-greg)))
+        )
+    (cond
+     ((not exp)        nil)                    ; No expiry == expires at 
browser quit
+     ((< diff-in-days 0) nil)          ; Expires sometime after today
+     ((> diff-in-days 0) t)            ; Expired before today
+     (t                                        ; Expires sometime today, check 
times
+      (let* ((cur-time (timezone-parse-time (aref cur-date 3)))
+            (exp-time (timezone-parse-time (aref exp-date 3)))
+            (cur-norm (+ (* 360 (string-to-int (aref cur-time 2)))
+                         (*  60 (string-to-int (aref cur-time 1)))
+                         (*   1 (string-to-int (aref cur-time 0)))))
+            (exp-norm (+ (* 360 (string-to-int (aref exp-time 2)))
+                         (*  60 (string-to-int (aref exp-time 1)))
+                         (*   1 (string-to-int (aref exp-time 0))))))
+       (> (- cur-norm exp-norm) 1))))))
+
+;;;###autoload
+(defun url-cookie-retrieve (host path &optional secure)
+  "Retrieves all the netscape-style cookies for a specified HOST and PATH"
+  (let ((storage (if secure
+                    (append url-cookie-secure-storage url-cookie-storage)
+                  url-cookie-storage))
+       (case-fold-search t)
+       (cookies nil)
+       (cur nil)
+       (retval nil)
+       (path-regexp nil))
+    (while storage
+      (setq cur (car storage)
+           storage (cdr storage)
+           cookies (cdr cur))
+      (if (and (car cur)
+              (string-match (concat "^.*" (regexp-quote (car cur)) "$") host))
+         ;; The domains match - a possible hit!
+         (while cookies
+           (setq cur (car cookies)
+                 cookies (cdr cookies)
+                 path-regexp (concat "^" (regexp-quote
+                                          (url-cookie-path cur))))
+           (if (and (string-match path-regexp path)
+                    (not (url-cookie-expired-p cur)))
+               (setq retval (cons cur retval))))))
+    retval))
+
+;;;###autolaod
+(defun url-cookie-generate-header-lines (host path secure)
+  (let* ((cookies (url-cookie-retrieve host path secure))
+       (retval nil)
+       (cur nil)
+       (chunk nil))
+    ;; Have to sort this for sending most specific cookies first
+    (setq cookies (and cookies
+                      (sort cookies
+                            (function
+                             (lambda (x y)
+                               (> (length (url-cookie-path x))
+                                  (length (url-cookie-path y))))))))
+    (while cookies
+      (setq cur (car cookies)
+           cookies (cdr cookies)
+           chunk (format "%s=%s" (url-cookie-name cur) (url-cookie-value cur))
+           retval (if (< 80 (+ (length retval) (length chunk) 4))
+                      (concat retval "\r\nCookie: " chunk)
+                    (if retval
+                        (concat retval "; " chunk)
+                      (concat "Cookie: " chunk)))))
+    (if retval
+       (concat retval "\r\n")
+      "")))
+
+(defvar url-cookie-two-dot-domains
+  (concat "\\.\\("
+   (mapconcat 'identity (list "com" "edu" "net" "org" "gov" "mil" "int")
+             "\\|")
+   "\\)$")
+  "A regular expression of top-level domains that only require two matching
+'.'s in the domain name in order to set a cookie.")
+
+(defcustom url-cookie-trusted-urls nil
+  "*A list of regular expressions matching URLs to always accept cookies from."
+  :type '(repeat regexp)
+  :group 'url-cookie)
+
+(defcustom url-cookie-untrusted-urls nil
+  "*A list of regular expressions matching URLs to never accept cookies from."
+  :type '(repeat regexp)
+  :group 'url-cookie)
+
+(defun url-cookie-host-can-set-p (host domain)
+  (let ((numdots 0)
+       (tmp domain)
+       (last nil)
+       (case-fold-search t)
+       (mindots 3))
+    (while (setq last (string-match "\\." host last))
+      (setq numdots (1+ numdots)
+           last (1+ last)))
+    (if (string-match url-cookie-two-dot-domains domain)
+       (setq mindots 2))
+    (cond
+     ((string= host domain)            ; Apparently netscape lets you do this
+      t)
+     ((< numdots mindots)              ; Not enough dots in domain name!
+      nil)
+     (t
+      (string-match (concat (regexp-quote domain) "$") host)))))
+
+(defun url-header-comparison (x y)
+  (string= (downcase x) (downcase y)))
+
+;;;###autoload
+(defun url-cookie-handle-set-cookie (str)
+  (let* ((args (mm-parse-args str nil t)) ; Don't downcase names
+        (case-fold-search t)
+        (secure (and (assoc* "secure" args :test 'url-header-comparison) t))
+        (domain (or (cdr-safe (assoc* "domain" args :test
+                                      'url-header-comparison))
+                    (url-host url-current-object)))
+        (current-url (url-view-url t))
+        (trusted url-cookie-trusted-urls)
+        (untrusted url-cookie-untrusted-urls)
+        (expires (cdr-safe (assoc* "expires" args :test
+                                   'url-header-comparison)))
+        (path (or (cdr-safe (assoc* "path" args :test
+                                    'url-header-comparison))
+                  (file-name-directory
+                   (url-filename url-current-object))))
+        (rest nil))
+    (while args
+      (if (not (member (downcase (car (car args)))
+                      '("secure" "domain" "expires" "path")))
+         (setq rest (cons (car args) rest)))
+      (setq args (cdr args)))
+
+    ;; Sometimes we get dates that the timezone package cannot handle very
+    ;; gracefully - take care of this here, instead of in url-cookie-expired-p
+    ;; to speed things up.
+    (if (and expires
+            (string-match
+             (concat "^[^,]+, +\\(..\\)-\\(...\\)-\\(..\\) +"
+                     "\\(..:..:..\\) +\\[*\\([^\]]+\\)\\]*$")
+             expires))
+       (setq expires (concat (url-match expires 1) " "
+                             (url-match expires 2) " "
+                             (url-match expires 3) " "
+                             (url-match expires 4) " ["
+                             (url-match expires 5) "]")))
+    (while (consp trusted)
+      (if (string-match (car trusted) current-url)
+         (setq trusted (- (match-end 0) (match-beginning 0)))
+       (pop trusted)))
+    (while (consp untrusted)
+      (if (string-match (car untrusted) current-url)
+         (setq untrusted (- (match-end 0) (match-beginning 0)))
+       (pop untrusted)))
+    (if (and trusted untrusted)
+       ;; Choose the more specific match
+       (if (> trusted untrusted)
+           (setq untrusted nil)
+         (setq trusted nil)))
+    (cond
+     (untrusted
+      ;; The site was explicity marked as untrusted by the user
+      nil)
+     ((or (eq url-privacy-level 'paranoid)
+         (and (listp url-privacy-level) (memq 'cookies url-privacy-level)))
+      ;; user never wants cookies
+      nil)
+     ((and url-cookie-confirmation
+          (not trusted)
+          (save-window-excursion
+            (with-output-to-temp-buffer "*Cookie Warning*"
+              (mapcar
+               (function
+                (lambda (x)
+                  (princ (format "%s - %s" (car x) (cdr x))))) rest))
+            (prog1
+                (not (funcall url-confirmation-func
+                              (format "Allow %s to set these cookies? "
+                                      (url-host url-current-object))))
+              (if (get-buffer "*Cookie Warning*")
+                  (kill-buffer "*Cookie Warning*")))))
+      ;; user wants to be asked, and declined.
+      nil)
+     ((url-cookie-host-can-set-p (url-host url-current-object) domain)
+      ;; Cookie is accepted by the user, and passes our security checks
+      (let ((cur nil))
+       (while rest
+         (setq cur (pop rest))
+         (url-cookie-store (car cur) (cdr cur)
+                           expires domain path secure))))
+     (t
+      (message "%s tried to set a cookie for domain %s - rejected."
+              (url-host url-current-object) domain)))))
+
+(provide 'url-cookie)
diff --git a/lisp/url-file.el b/lisp/url-file.el
new file mode 100644
index 0000000..e199e54
--- /dev/null
+++ b/lisp/url-file.el
@@ -0,0 +1,281 @@
+;;; url-file.el --- File retrieval code
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:08 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'url-vars)
+(require 'mule-sysdp)
+(require 'url-parse)
+
+(defun url-insert-possibly-compressed-file (fname &rest args)
+  ;; Insert a file into a buffer, checking for compressed versions.
+  (let ((compressed nil)
+       ;;
+       ;; F*** *U** **C* ***K!!!
+       ;; We cannot just use insert-file-contents-literally here, because
+       ;; then we would lose big time with ange-ftp.  *sigh*
+       (crypt-encoding-alist nil)
+       (jka-compr-compression-info-list nil)
+       (jam-zcat-filename-list nil)
+       (file-coding-system-for-read mule-no-coding-system)
+       (coding-system-for-read mule-no-coding-system))
+    (setq compressed 
+         (cond
+          ((file-exists-p fname)
+           (if (string-match "\\.\\(z\\|gz\\|Z\\)$" fname)
+               (case (intern (match-string 1 fname))
+                 ((z gz)
+                  (setq url-current-mime-headers (cons
+                                                  (cons
+                                                   "content-transfer-encoding"
+                                                   "gzip")
+                                                  url-current-mime-headers)))
+                 (Z
+                  (setq url-current-mime-headers (cons
+                                                  (cons
+                                                   "content-transfer-encoding"
+                                                   "compress")
+                                                  url-current-mime-headers))))
+             nil))
+          ((file-exists-p (concat fname ".Z"))
+           (setq fname (concat fname ".Z")
+                 url-current-mime-headers (cons (cons
+                                                 "content-transfer-encoding"
+                                                 "compress")
+                                                url-current-mime-headers)))
+          ((file-exists-p (concat fname ".gz"))
+           (setq fname (concat fname ".gz")
+                 url-current-mime-headers (cons (cons
+                                                 "content-transfer-encoding"
+                                                 "gzip")
+                                                url-current-mime-headers)))
+          ((file-exists-p (concat fname ".z"))
+           (setq fname (concat fname ".z")
+                 url-current-mime-headers (cons (cons
+                                                 "content-transfer-encoding"
+                                                 "gzip")
+                                                url-current-mime-headers)))
+          (t
+           (error "File not found %s" fname))))
+    (apply 'insert-file-contents fname args)
+    (set-buffer-modified-p nil)))
+
+(defvar url-dired-minor-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\C-m" 'url-dired-find-file)
+    (if url-running-xemacs
+       (define-key map [button2] 'url-dired-find-file-mouse)
+      (define-key map [mouse-2] 'url-dired-find-file-mouse))
+    map)
+  "Keymap used when browsing directories.")
+
+(defvar url-dired-minor-mode nil
+  "Whether we are in url-dired-minor-mode")
+
+(make-variable-buffer-local 'url-dired-minor-mode)
+
+(defun url-dired-find-file ()
+  "In dired, visit the file or directory named on this line, using Emacs-W3."
+  (interactive)
+  (w3-open-local (dired-get-filename)))
+
+(defun url-dired-find-file-mouse (event)
+  "In dired, visit the file or directory name you click on, using Emacs-W3."
+  (interactive "@e")
+    (if (event-point event)
+       (progn
+         (goto-char (event-point event))
+         (url-dired-find-file))))
+
+(defun url-dired-minor-mode (&optional arg)
+  "Minor mode for directory browsing with Emacs-W3."
+  (interactive "P")
+  (cond
+   ((null arg)
+    (setq url-dired-minor-mode (not url-dired-minor-mode)))
+   ((equal 0 arg)
+    (setq url-dired-minor-mode nil))
+   (t
+    (setq url-dired-minor-mode t))))
+
+(add-minor-mode 'url-dired-minor-mode " URL" url-dired-minor-mode-map)
+
+(defun url-format-directory (dir)
+  ;; Format the files in DIR into hypertext
+  (kill-buffer (current-buffer))
+  (find-file dir)
+  (url-dired-minor-mode t))
+
+(defun url-host-is-local-p (host)
+  "Return t iff HOST references our local machine."
+  (let ((case-fold-search t))
+    (or
+     (null host)
+     (string= "" host)
+     (equal (downcase host) (downcase (system-name)))
+     (and (string-match "^localhost$" host) t)
+     (and (not (string-match (regexp-quote ".") host))
+         (equal (downcase host) (if (string-match (regexp-quote ".")
+                                                  (system-name))
+                                    (substring (system-name) 0
+                                               (match-beginning 0))
+                                  (system-name)))))))
+
+(defun url-file-build-continuation (name)
+  (list 'url-file-asynch-callback
+       name (current-buffer)
+       url-current-callback-func url-current-callback-data))
+
+(defun url-file-asynch-callback (x y name buff func args &optional efs)
+  (if (featurep 'efs)
+      ;; EFS passes us an extra argument
+      (setq name buff
+           buff func
+           func args
+           args efs))
+  (cond
+   ((not name) nil)
+   ((not (file-exists-p name)) nil)
+   (t
+    (if (not buff)
+       (setq buff (generate-new-buffer " *url-asynch-file*")))
+    (set-buffer buff)
+    (insert-file-contents-literally name)
+    (condition-case ()
+       (delete-file name)
+      (error nil))))
+  (if func
+      (apply func args)
+    (url-sentinel (current-buffer) nil)))
+
+(defun url-cleanup-file (url)
+   "Clean up file URLs to remove questionable ftp stuff.
+Removes any leading slashes and 'localhost's from the file URL,
+and exchanges any | in the drive identifier with a :."
+   (if (null (string-match "file:\\(\\(/\\|localhost\\)+\\)+[a-zA-Z]\\([:|]\\)"
+                          url))
+       url
+     (let ((slash-start (match-beginning 1))
+          (slash-end (match-end 1))
+          (bar-start (match-beginning 3))
+          (bar-end (match-end 3)))
+       (concat (substring url 0 slash-start)
+              (substring url slash-end bar-start)
+              ":"
+              (substring url bar-end)))))
+
+(defun url-file (url)
+  ;; Find a file
+  (let* ((urlobj (url-generic-parse-url (url-cleanup-file url)))
+        (user (url-user urlobj))
+        (pass (url-password urlobj))
+        (site (url-host urlobj))
+        (file (url-unhex-string (url-filename urlobj)))
+        (dest (url-target urlobj))
+        (filename (if (or user (not (url-host-is-local-p site)))
+                      (concat "/" (or user "anonymous") "@" site ":" file)
+                    (if (and (memq system-type
+                                   '(emx ms-dos windows-nt ms-windows))
+                             (string-match "^/[a-zA-Z]:/" file))
+                        (substring file 1)
+                      file)))
+        (viewer (mm-mime-info
+                 (mm-extension-to-mime (url-file-extension file))))
+        (pos-index (if url-directory-index-file
+                       (expand-file-name url-directory-index-file filename))))
+    (url-clear-tmp-buffer)
+    (and user pass
+        (cond
+         ((featurep 'ange-ftp)
+          (ange-ftp-set-passwd site user pass))
+         ((or (featurep 'efs) (featurep 'efs-auto))
+          (efs-set-passwd site user pass))
+         (t
+          nil)))
+    (if (and pos-index
+            (file-exists-p pos-index)
+            (file-readable-p pos-index))
+       (setq filename pos-index))
+    (setq url-current-mime-type (mm-extension-to-mime
+                                (url-file-extension filename)))
+    (cond
+     ((file-directory-p filename)
+      (if (not (string-match "/$" filename))
+         (setq filename (concat filename "/")))
+      (if (not (string-match "/$" file))
+         (setq file (concat file "/")))
+      (url-set-filename urlobj file)
+      (url-format-directory filename))
+     (url-be-asynchronous
+      (cond
+       ((file-exists-p filename) nil)
+       ((file-exists-p (concat filename ".Z"))
+       (setq filename (concat filename ".Z")))
+       ((file-exists-p (concat filename ".gz"))
+       (setq filename (concat filename ".gz")))
+       ((file-exists-p (concat filename ".z"))
+       (setq filename (concat filename ".z")))
+       (t nil))
+      (let ((new (mm-generate-unique-filename)))
+       (cond
+        ((url-host-is-local-p site)
+         (if (and (file-exists-p filename)
+                  (file-readable-p filename))
+             (insert-file-contents-literally filename))
+         (if (featurep 'efs)
+             (url-file-asynch-callback nil nil nil nil nil
+                                       url-current-callback-func
+                                       url-current-callback-data)
+           (url-file-asynch-callback nil nil nil nil
+                                     url-current-callback-func
+                                     url-current-callback-data)))
+        ((featurep 'ange-ftp)
+         (ange-ftp-copy-file-internal filename (expand-file-name new) t
+                                      nil t
+                                      (url-file-build-continuation new)
+                                      t))
+        ((or (featurep 'efs) (featurep 'efs-auto))
+         (autoload 'efs-copy-file-internal "efs")
+         (efs-copy-file-internal filename (efs-ftp-path filename)
+                                 new (efs-ftp-path new)
+                                 t nil 0
+                                 (url-file-build-continuation new)
+                                 0 nil)))))
+     (t
+      (let ((errobj nil))
+       (if (or url-source              ; Need it in a buffer
+               (and (symbolp viewer)
+                    (not (eq viewer 'w3-default-local-file)))
+               (stringp viewer))
+           (condition-case errobj
+               (url-insert-possibly-compressed-file filename t)
+             (error
+              (url-save-error errobj)
+              (url-retrieve (concat "www://error/nofile/" file))))))))))
+
+(fset 'url-ftp 'url-file)
+
+(provide 'url-file)
diff --git a/lisp/url-gopher.el b/lisp/url-gopher.el
new file mode 100644
index 0000000..c554470
--- /dev/null
+++ b/lisp/url-gopher.el
@@ -0,0 +1,469 @@
+;;; url-gopher.el --- Gopher Uniform Resource Locator retrieval code
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:09 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'url-vars)
+(require 'url-parse)
+
+(defun url-grok-gopher-href (url)
+  "Return a list of attributes from a gopher url.  List is of the
+type: host port selector-string MIME-type extra-info"
+  (let (host                           ; host name
+       port                            ; Port #
+       selector                        ; String to send to gopher host
+       type                            ; MIME type
+       extra                           ; Extra information
+       x                               ; Temporary storage for host/port
+       y                               ; Temporary storage for selector
+       ylen
+       )
+    (or (string-match "gopher:/*\\([^/]+\\)\\(/*\\)" url)
+       (error "Can't understand url %s" url))
+    (setq x (url-match url 1)          ; The host (and possible port #)
+         ylen (- (length url) (match-end 2))
+         y (if (= ylen 0)              ; The selector (and possible type)
+               ""
+               (url-unhex-string (substring url (- ylen)))))
+
+    ;First take care of the host/port/gopher+ information from the url
+    ;A + after the port # (host:70+) specifies a gopher+ link
+    ;A ? after the port # (host:70?) specifies a gopher+ ask block
+    (if (string-match "^\\([^:]+\\):\\([0-9]+\\)\\([?+]*\\)" x)
+       (setq host (url-match x 1)
+             port (url-match x 2)
+             extra (url-match x 3))
+      (setq host x
+           port "70"
+           extra nil))
+    (cond
+     ((equal extra "")  (setq extra nil))
+     ((equal extra "?") (setq extra 'ask-block))
+     ((equal extra "+") (setq extra 'gopher+)))
+
+    ; Next, get the type/get rid of the Mosaic double-typing. Argh.
+    (setq x (string-to-char y)         ; Get gopher type
+         selector (if (or url-use-hypertext-gopher
+                          (< 3 (length y)))
+                      y                ; Get the selector string
+                    (substring y 1 nil))
+         type (cdr (assoc x url-gopher-to-mime)))
+    (list host port (or selector "") type extra)))
+
+
+(defun url-convert-ask-to-form (ask)
+  ;; Convert a Gopher+ ASK block into a form.  Returns a string to be
+  ;; inserted into a buffer to create the form."
+  (let ((form (concat "<form enctype=application/gopher-ask-block\n"
+                     "      method=\"GOPHER-ASK\">\n"
+                     " <ul plain>\n"))
+       (type "")
+       (x 0)
+       (parms ""))
+    (while (string-match "^\\([^:]+\\): +\\(.*\\)" ask)
+      (setq parms (url-match ask 2)
+           type (url-strip-leading-spaces (downcase (url-match ask 1)))
+           x (1+ x)
+           ask (substring ask (if (= (length ask) (match-end 0))
+                                  (match-end 0) (1+ (match-end 0))) nil))
+      (cond
+       ((string= "note" type) (setq form (concat form parms)))
+       ((or (string= "ask" type)
+           (string= "askf" type)
+           (string= "choosef" type))
+       (setq parms (url-string-to-tokens parms ?\t)
+             form (format "%s\n<li>%s<input name=\"%d\" value=\"%s\">"
+                          form (or (nth 0 parms) "Text:")
+                          x (or (nth 1 parms) ""))))
+       ((string= "askp" type)
+       (setq parms (mapcar 'car (nreverse (url-split parms "\t")))
+             form (format
+                   "%s\n<li>%s<input name=\"%d\" type=\"password\" 
value=\"%s\">"
+                   form                           ; Earlier string
+                   (or (nth 0 parms) "Password:") ; Prompt
+                   x                              ; Name
+                   (or (nth 1 parms) "")          ; Default value
+                   )))
+       ((string= "askl" type)
+       (setq parms (url-string-to-tokens parms ?\t)
+             form (format "%s\n<li>%s<textarea name=\"%d\">%s</textarea>"
+                          form                  ; Earlier string
+                          (or (nth 0 parms) "") ; Prompt string
+                          x                     ; Name
+                          (or (nth 1 parms) "") ; Default value
+                          )))
+       ((or (string= "select" type)
+           (string= "choose" type))
+       (setq parms (url-string-to-tokens parms ?\t)
+             form (format "%s\n<li>%s<select name=\"%d\">" form (car parms) x)
+             parms (cdr parms))
+       (if (null parms) (setq parms (list "Yes" "No")))
+       (while parms
+         (setq form (concat form "<option>" (car parms) "\n")
+               parms (cdr parms)))
+       (setq form (concat form "</select>")))))
+    (concat form "\n<li><input type=\"SUBMIT\""
+           " value=\"Submit Gopher+ Ask Block\"></ul></form>")))
+
+(defun url-grok-gopher-line ()
+  "Return a list of link attributes from a gopher string.  Order is:
+title, type, selector string, server, port, gopher-plus?"
+  (let (type selector server port gopher+ st nd)
+    (beginning-of-line)
+    (setq st (point))
+    (end-of-line)
+    (setq nd (point))
+    (save-excursion
+      (mapcar (function
+              (lambda (var)
+                (goto-char st)
+                (skip-chars-forward "^\t\n" nd)
+                (set-variable var (buffer-substring st (point)))
+                (setq st (min (point-max) (1+ (point))))))
+             '(type selector server port))
+      (setq gopher+ (and (/= (1- st) nd) (buffer-substring st nd)))
+      (list type (concat (substring type 0 1) selector) server port gopher+))))
+
+(defun url-format-gopher-link (gophobj)
+  ;; Insert a gopher link as an <A> tag
+  (let ((title (nth 0 gophobj))
+       (ref   (nth 1 gophobj))
+       (type  (if (> (length (nth 0 gophobj)) 0)
+                  (substring (nth 0 gophobj) 0 1) ""))
+       (serv  (nth 2 gophobj))
+       (port  (nth 3 gophobj))
+       (plus  (nth 4 gophobj))
+       (desc  nil))
+    (if (and (equal type "")
+            (> (length title) 0))
+       (setq type (substring title 0 1)))
+    (setq title (and title (substring title 1 nil))
+         title (mapconcat
+                (function
+                 (lambda (x)
+                   (cond
+                    ((= x ?&) "&amp;")
+                    ((= x ?<) "&lt;");
+                    ((= x ?>) "&gt;");
+                    (t (char-to-string x))))) title "")
+         desc (or (cdr (assoc type url-gopher-labels)) "(UNK)"))
+    (cond
+     ((null ref) "")
+     ((equal type "8")
+      (format "<LI> %s <A HREF=\"telnet://%s:%s/\">%s</A>\n"
+             desc serv port title))
+     ((equal type "T")
+      (format "<LI> %s <A HREF=\"tn3270://%s:%s/\">%s</A>\n"
+             desc serv port title))
+     (t (format "<LI> %s <A METHODS=%s HREF=\"gopher://%s:%s/%s\";>%s</A>\n"
+               desc type serv (concat port plus)
+               (url-hexify-string ref) title)))))
+
+(defun url-gopher-clean-text (&optional buffer)
+  "Decode text transmitted by gopher.
+0. Delete status line.
+1. Delete `^M' at end of line.
+2. Delete `.' at end of buffer (end of text mark).
+3. Delete `.' at beginning of line.   (does gopher want this?)"
+  (set-buffer (or buffer url-working-buffer))
+  ;; Insert newline at end of buffer.
+  (goto-char (point-max))
+  (if (not (bolp))
+      (insert "\n"))
+  ;; Delete `^M' at end of line.
+  (goto-char (point-min))
+  (while (re-search-forward "\r[^\n]*$" nil t)
+    (replace-match ""))
+;  (goto-char (point-min))
+;  (while (not (eobp))
+;    (end-of-line)
+;    (if (= (preceding-char) ?\r)
+;       (delete-char -1))
+;    (forward-line 1)
+;    )
+  ;; Delete `.' at end of buffer (end of text mark).
+  (goto-char (point-max))
+  (forward-line -1)                     ;(beginning-of-line)
+  (while (looking-at "^\\.$")
+    (delete-region (point) (progn (forward-line 1) (point)))
+    (forward-line -1))
+  ;; Replace `..' at beginning of line with `.'.
+  (goto-char (point-min))
+  ;; (replace-regexp "^\\.\\." ".")
+  (while (search-forward "\n.." nil t)
+    (delete-char -1))
+  )
+
+(defun url-parse-gopher (&optional buffer)
+  (save-excursion
+    (set-buffer (or buffer url-working-buffer))
+    (url-replace-regexp "^\r*$\n" "")
+    (url-replace-regexp "^\\.\r*$\n" "")
+    (url-gopher-clean-text (current-buffer))
+    (goto-char (point-max))
+    (skip-chars-backward "\n\r\t ")
+    (delete-region (point-max) (point))
+    (insert "\n")
+    (goto-char (point-min))
+    (skip-chars-forward " \t\n")
+    (delete-region (point-min) (point))
+    (let* ((len (count-lines (point-min) (point-max)))
+          (objs nil)
+          (i 0))
+      (while (not (eobp))
+       (setq objs (cons (url-grok-gopher-line) objs)
+             i (1+ i))
+       (url-lazy-message "Converting gopher listing... %d/%d (%d%%)"
+                         i len (url-percentage i len))
+                                               
+       (forward-line 1))
+      (setq objs (nreverse objs))
+      (erase-buffer)
+      (insert "<title>"
+             (cond
+              ((or (string= "" (url-filename url-current-object))
+                   (string= "1/" (url-filename url-current-object))
+                   (string= "1" (url-filename url-current-object)))
+               (concat "Gopher root at " (url-host url-current-object)))
+              ((string-match (format "^[%s]+/" url-gopher-types)
+                             (url-filename url-current-object))
+               (substring (url-filename url-current-object) 2 nil))
+              (t (url-filename url-current-object)))
+             "</title><ol>"
+             (mapconcat 'url-format-gopher-link objs "")
+             "</ol>"))))
+
+(defun url-gopher-retrieve (host port selector &optional wait-for)
+  ;; Fetch a gopher object and don't mess with it at all
+  (let ((proc (url-open-stream "*gopher*" url-working-buffer
+                             host (if (stringp port) (string-to-int port)
+                                    port)))
+       (len nil)
+       (parsed nil))
+    (url-clear-tmp-buffer)
+    (if (> (length selector) 0)
+       (setq selector (substring selector 1 nil)))
+    (if (not (processp proc))
+       nil
+      (save-excursion
+       (set-process-sentinel proc 'ignore)
+       (process-send-string proc (concat selector "\r\n"))
+       (while (and (or (not wait-for)
+                       (progn
+                         (goto-char (point-min))
+                         (not (re-search-forward wait-for nil t))))
+                   (memq (url-process-status proc) '(run open)))
+         (if (not parsed)
+             (cond
+              ((and (eq ?+ (char-after 1))
+                    (memq (char-after 2)
+                          (list ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9)))
+               (setq parsed (copy-marker 2)
+                     len (read parsed))
+               (delete-region (point-min) parsed))
+              ((and (eq ?+ (char-after 1))
+                    (eq ?- (char-after 2)))
+               (setq len nil
+                     parsed t)
+               (goto-char (point-min))
+               (delete-region (point-min) (progn
+                                            (end-of-line)
+                                            (point))))
+              ((and (eq ?- (char-after 1))
+                    (eq ?- (char-after 2)))
+               (setq parsed t
+                     len nil)
+               (goto-char (point-min))
+               (delete-region (point-min) (progn
+                                            (end-of-line)
+                                            (point))))))
+         (if len (url-lazy-message "Reading... %d of %d bytes (%d%%)"
+                                   (point-max)
+                                   len
+                                   (url-percentage (point-max) len))
+           (url-lazy-message "Read... %d bytes." (point-max)))
+         (url-accept-process-output proc))
+       (condition-case ()
+           (url-kill-process proc)
+         (error nil))
+       (while (looking-at "\r") (delete-char 1))))))
+
+(defun url-do-gopher-cso-search (descr)
+  ;; Do a gopher CSO search and return a plaintext document
+  (let ((host (nth 0 descr))
+       (port (nth 1 descr))
+       (file (nth 2 descr))
+       search-type search-term)
+    (string-match "search-by=\\([^&]+\\)" file)
+    (setq search-type (url-match file 1))
+    (string-match "search-term=\\([^&]+\\)" file)
+    (setq search-term (url-match file 1))
+    (url-gopher-retrieve host port (format "2query %s=%s"
+                                         search-type search-term) "^[2-9]")
+    (goto-char (point-min))
+    (url-replace-regexp "^-[0-9][0-9][0-9]:[0-9]*:" "")
+    (url-replace-regexp "^[^15][0-9][0-9]:.*" "")
+    (url-replace-regexp "^[15][0-9][0-9]:\\(.*\\)" "<H1>\\1</H1>&ensp;<PRE>")
+    (goto-char (point-min))
+    (insert "<title>Results of CSO search</title>\n"
+           "<h1>" search-type " = " search-term "</h1>\n")
+    (goto-char (point-max))
+    (insert "</pre>")))
+
+(defun url-do-gopher (descr)
+  ;; Fetch a gopher object
+  (let ((host (nth 0 descr))
+       (port (nth 1 descr))
+       (file (nth 2 descr))
+       (type (nth 3 descr))
+       (extr (nth 4 descr))
+       parse-gopher)
+    (cond
+     ((and                             ; Gopher CSO search
+       (equal type "www/gopher-cso-search")
+       (string-match "search-by=" file)) ; With a search term in it
+      (url-do-gopher-cso-search descr)
+      (setq type "text/html"))
+     ((equal type "www/gopher-cso-search") ; Blank CSO search
+      (url-clear-tmp-buffer)
+      (insert "<html>\n"
+             " <head>\n"
+             "  <title>CSO Search</title>\n"
+             " </head>\n"
+             " <body>\n"
+             "  <div>\n"
+             "   <h1>This is a CSO search</h1>\n"
+             "   <hr>\n"
+             "   <form>\n"
+             "    <ul>\n"
+             "     <li> Search by: <select name=\"search-by\">\n"
+             "                      <option>Name\n"
+             "                      <option>Phone\n"
+             "                      <option>Email\n"
+             "                      <option>Address\n"
+             "                     </select>\n"
+             "     <li> Search for: <input name=\"search-term\">\n"
+             "     <li> <input type=\"submit\" value=\"Submit query\">\n"
+             "    </ul>\n"
+             "   </form>\n"
+             "  </div>\n"
+             " </body>\n"
+             "</html>\n"
+             "<!-- Automatically generated by URL v" url-version " -->\n")
+      (setq type "text/html"
+           parse-gopher t))
+     ((and
+       (equal type "www/gopher-search")        ; Ack!  Mosaic-style search href
+       (string-match "\t" file))       ; and its got a search term in it!
+      (url-gopher-retrieve host port file)
+      (setq type "www/gopher"
+           parse-gopher t))
+     ((and
+       (equal type "www/gopher-search")        ; Ack!  Mosaic-style search href
+       (string-match "\\?" file))      ; and its got a search term in it!
+      (setq file (concat (substring file 0 (match-beginning 0)) "\t"
+                        (substring file (match-end 0) nil)))
+      (url-gopher-retrieve host port file)
+      (setq type "www/gopher"
+           parse-gopher t))
+     ((equal type "www/gopher-search") ; Ack!  Mosaic-style search href
+      (setq type "text/html"
+           parse-gopher t)
+      (url-clear-tmp-buffer)
+      (insert "<html>\n"
+             " <head>\n"
+             "  <title>Gopher Server</title>\n"
+             " </head>\n"
+             " <body>\n"
+             "  <div>\n"
+             "   <h1>Searchable Gopher Index</h1>\n"
+             "   <hr>\n"
+             "   <p>\n"
+             "    Enter the search keywords below\n"
+             "   </p>"
+             "   <form enctype=\"application/x-gopher-query\">\n"
+             "    <input name=\"internal-gopher\">\n"
+             "   </form>\n"
+             "   <hr>\n"
+             "  </div>\n"
+             " </body>\n"
+             "</html>\n"
+             "<!-- Automatically generated by URL v" url-version " -->\n"))
+     ((null extr)                      ; Normal Gopher link
+      (url-gopher-retrieve host port file)
+      (setq parse-gopher t))
+     ((eq extr 'gopher+)               ; A gopher+ link
+      (url-gopher-retrieve host port (concat file "\t+"))
+      (setq parse-gopher t))
+     ((eq extr 'ask-block)             ; A gopher+ interactive query
+      (url-gopher-retrieve host port (concat file "\t!")) ; Fetch the info
+      (goto-char (point-min))
+      (cond
+       ((re-search-forward "^\\+ASK:[ \t\r]*" nil t) ; There is an ASK
+       (let ((x (buffer-substring (1+ (point))
+                                  (or (re-search-forward "^\\+[^:]+:" nil t)
+                                      (point-max)))))
+         (erase-buffer)
+         (insert (url-convert-ask-to-form x))
+         (setq type "text/html" parse-gopher t)))
+       (t (setq parse-gopher t)))))
+    (if (or (equal type "www/gopher")
+           (equal type "text/plain")
+           (equal file "")
+           (equal type "text/html"))
+       (url-gopher-clean-text))
+    (if (and parse-gopher (or (equal type "www/gopher")
+                             (equal file "")))
+       (progn
+         (url-parse-gopher)
+         (setq type "text/html"
+               url-current-mime-viewer (mm-mime-info type nil 5))))
+    (setq url-current-mime-type (or type "text/plain")
+         url-current-mime-viewer (mm-mime-info type nil 5))))
+
+(defun url-gopher (url)
+  ;; Handle gopher URLs
+  (let ((descr (url-grok-gopher-href url)))
+    (cond
+     ((or (not (member (nth 1 descr) url-bad-port-list))
+         (funcall
+          url-confirmation-func
+          (format "Warning!  Trying to connect to port %s - continue? "
+                  (nth 1 descr))))
+      (if url-use-hypertext-gopher
+         (url-do-gopher descr)
+       (gopher-dispatch-object (vector (if (= 0 (length (nth 2 descr)))
+                                           ?1
+                                         (string-to-char (nth 2 descr)))
+                                       (nth 2 descr) (nth 2 descr)
+                                       (nth 0 descr)
+                                       (string-to-int (nth 1 descr)))
+                               (current-buffer))))
+     (t
+      (ding)
+      (url-warn 'security "Aborting connection to bad port...")))))
+
+(provide 'url-gopher)
diff --git a/lisp/url-gw.el b/lisp/url-gw.el
new file mode 100644
index 0000000..81a2aed
--- /dev/null
+++ b/lisp/url-gw.el
@@ -0,0 +1,259 @@
+;;; url-gw.el --- Gateway munging for URL loading
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:09 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1997, 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'cl)
+
+(defgroup url-gateway nil
+  "URL gateway variables"
+  :group 'url)
+
+(defcustom url-gateway-local-host-regexp nil
+  "*A regular expression specifying local hostnames/machines."
+  :type '(choice (const nil) regexp)
+  :group 'url-gateway)
+
+(defcustom url-gateway-prompt-pattern
+  "^[^#$%>;]*[#$%>;] *" ;; "bash\\|\$ *\r?$\\|> *\r?"
+  "*A regular expression matching a shell prompt."
+  :type 'regexp
+  :group 'url-gateway)
+
+(defcustom url-gateway-rlogin-host nil
+  "*What hostname to actually rlog into before doing a telnet."
+  :type '(choice (const nil) string)
+  :group 'url-gateway)
+
+(defcustom url-gateway-rlogin-user-name nil
+  "*Username to log into the remote machine with when using rlogin."
+  :type '(choice (const nil) string)
+  :group 'url-gateway)
+
+(defcustom url-gateway-rlogin-parameters '("telnet" "-8")
+  "*Parameters to `url-open-rlogin'.
+This list will be used as the parameter list given to rsh."
+  :type '(repeat string)
+  :group 'url-gateway)
+
+(defcustom url-gateway-telnet-host nil
+  "*What hostname to actually login to before doing a telnet."
+  :type '(choice (const nil) string)
+  :group 'url-gateway)
+
+(defcustom url-gateway-telnet-parameters '("exec" "telnet" "-8")
+  "*Parameters to `url-open-telnet'.
+This list will be executed as a command after logging in via telnet."
+  :type '(repeat string)
+  :group 'url-gateway)
+
+(defcustom url-gateway-telnet-login-prompt "^\r*.?login:"
+  "*Prompt that tells us we should send our username when loggin in w/telnet."
+  :type 'regexp
+  :group 'url-gateway)
+
+(defcustom url-gateway-telnet-password-prompt "^\r*.?password:"
+  "*Prompt that tells us we should send our password when loggin in w/telnet."
+  :type 'regexp
+  :group 'url-gateway)
+
+(defcustom url-gateway-telnet-user-name nil
+  "User name to log in via telnet with."
+  :type '(choice (const nil) string)
+  :group 'url-gateway)
+
+(defcustom url-gateway-telnet-password nil
+  "Password to use to log in via telnet with."
+  :type '(choice (const nil) string)
+  :group 'url-gateway)
+
+(defcustom url-gateway-broken-resolution nil
+  "*Whether to use nslookup to resolve hostnames.
+This should be used when your version of Emacs cannot correctly use DNS,
+but your machine can.  This usually happens if you are running a statically
+linked Emacs under SunOS 4.x"
+  :type 'boolean
+  :group 'url-gateway)
+
+(defcustom url-gateway-nslookup-program "nslookup"
+  "*If non-NIL then a string naming nslookup program."
+  :type '(choice (const :tag "None" :value nil) string)
+  :group 'url-gateway)
+
+;; Stolen from ange-ftp
+;;;###autoload
+(defun url-gateway-nslookup-host (host)
+  "Attempt to resolve the given HOSTNAME using nslookup if possible."
+  (interactive "sHost:  ")
+  (if url-gateway-nslookup-program
+      (let ((proc (start-process " *nslookup*" " *nslookup*"
+                                url-gateway-nslookup-program host))
+           (res host))
+       (process-kill-without-query proc)
+       (save-excursion
+         (set-buffer (process-buffer proc))
+         (while (memq (process-status proc) '(run open))
+           (accept-process-output proc))
+         (goto-char (point-min))
+         (if (re-search-forward "Name:.*\nAddress: *\\(.*\\)$" nil t)
+             (setq res (buffer-substring (match-beginning 1)
+                                         (match-end 1))))
+         (kill-buffer (current-buffer)))
+       res)
+    host))
+
+;; Stolen from red gnus nntp.el
+(defun url-wait-for-string (regexp proc)
+  "Wait until string arrives in the buffer."
+  (let ((buf (current-buffer)))
+    (goto-char (point-min))
+    (while (not (re-search-forward regexp nil t))
+      (accept-process-output proc)
+      (set-buffer buf)
+      (goto-char (point-min)))))
+
+;; Stolen from red gnus nntp.el
+(defun url-open-rlogin (name buffer host service)
+  "Open a connection using rsh."
+  (if (not (stringp service))
+      (setq service (int-to-string service)))
+  (let ((proc (if url-gateway-rlogin-user-name
+                 (start-process
+                  name buffer "rsh"
+                  url-gateway-rlogin-host "-l" url-gateway-rlogin-user-name
+                  (mapconcat 'identity
+                             (append url-gateway-rlogin-parameters
+                                     (list host service)) " "))
+               (start-process
+                name buffer "rsh" url-gateway-rlogin-host
+                (mapconcat 'identity
+                           (append url-gateway-rlogin-parameters
+                                   (list host service))
+                           " ")))))
+    (set-buffer buffer)
+    (url-wait-for-string "^\r*200" proc)
+    (beginning-of-line)
+    (delete-region (point-min) (point))
+    proc))
+
+;; Stolen from red gnus nntp.el
+(defun url-open-telnet (name buffer host service)
+  (if (not (stringp service))
+      (setq service (int-to-string service)))
+  (save-excursion
+    (set-buffer (get-buffer-create buffer))
+    (erase-buffer)
+    (let ((proc (start-process name buffer "telnet" "-8"))
+         (case-fold-search t))
+      (when (memq (process-status proc) '(open run))
+       (process-send-string proc "set escape \^X\n")
+       (process-send-string proc (concat
+                                  "open " url-gateway-telnet-host "\n"))
+       (url-wait-for-string url-gateway-telnet-login-prompt proc)
+       (process-send-string
+        proc (concat
+              (or url-gateway-telnet-user-name
+                  (setq url-gateway-telnet-user-name (read-string "login: ")))
+              "\n"))
+       (url-wait-for-string url-gateway-telnet-password-prompt proc)
+       (process-send-string
+        proc (concat
+              (or url-gateway-telnet-password
+                  (setq url-gateway-telnet-password
+                        (funcall url-passwd-entry-func "Password: ")))
+              "\n"))
+       (erase-buffer)
+       (url-wait-for-string url-gateway-prompt-pattern proc)
+       (process-send-string
+        proc (concat (mapconcat 'identity
+                                (append url-gateway-telnet-parameters
+                                        (list host service)) " ") "\n"))
+       (url-wait-for-string "^\r*Escape character.*\r*\n+" proc)
+       (delete-region (point-min) (match-end 0))
+       (process-send-string proc "\^]\n")
+       (url-wait-for-string "^telnet" proc)
+       (process-send-string proc "mode character\n")
+       (accept-process-output proc 1)
+       (sit-for 1)
+       (goto-char (point-min))
+       (forward-line 1)
+       (delete-region (point) (point-max)))
+      proc)))
+
+;;;###autoload
+(defun url-open-stream (name buffer host service)
+  "Open a stream to a host"
+  (let ((gw-method (if (and url-gateway-local-host-regexp
+                           (not (eq 'ssl url-gateway-method))
+                           (string-match
+                            url-gateway-local-host-regexp
+                            host))
+                      'native
+                    url-gateway-method))
+       ;; This hack is for OS/2 Emacs so that it will not do bogus CRLF
+       ;; conversions while trying to be 'helpful'
+       (tcp-binary-process-output-services (if (stringp service)
+                                               (list service)
+                                             (list service
+                                                   (int-to-string service))))
+
+       ;; An attempt to deal with denied connections, and attempt to reconnect
+       (cur-retries 0)
+       (retry t)
+       (errobj nil)
+       (conn nil))
+
+    ;; If the user told us to do DNS for them, do it.
+    (if url-gateway-broken-resolution
+       (setq host (url-gateway-nslookup-host host)))
+
+    (condition-case errobj
+       (setq conn (case gw-method
+                    (ssl
+                     (open-ssl-stream name buffer host service))
+                    ((tcp native)
+                     (and (eq 'tcp gw-method) (require 'tcp))
+                     (open-network-stream name buffer host service))
+                    (socks
+                     (socks-open-network-stream name buffer host service))
+                    (telnet
+                     (url-open-telnet name buffer host service))
+                    (rlogin
+                     (url-open-rlogin name buffer host service))
+                    (otherwise
+                     (error "Bad setting of url-gateway-method: %s"
+                            url-gateway-method))))
+      (error
+       (insert "Could not contact host: " host " / "
+              (if (stringp service) service (int-to-string service))
+              "\nAttempted using gateway method: "
+              (symbol-name gw-method)
+              "\n---- Error was: ----\n")
+       (setq url-current-mime-headers '(("content-type" . "text/plain")))
+       (display-error errobj (current-buffer))))
+    (if conn
+       (mule-inhibit-code-conversion conn))
+    conn))
+
+(provide 'url-gw)
diff --git a/lisp/url-hash.el b/lisp/url-hash.el
new file mode 100644
index 0000000..4e5142f
--- /dev/null
+++ b/lisp/url-hash.el
@@ -0,0 +1,123 @@
+;;; url-hash.el --- Hashtable functions
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:09 $
+;; Version: $Revision: 1.1 $
+;; Keywords: lisp
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1995,1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; Hash tables
+(eval-when-compile
+  (require 'cl)
+  (load-library "cl-extra"))
+
+(cond
+ ((and (fboundp 'maphash) (subrp (symbol-function 'maphash)))
+    ;; Builtins!
+  (defun url-puthash (key val table)
+    (let ((sym (if (stringp key) (intern key) key)))
+      (puthash sym val table)))
+
+  (defun url-gethash (key table &optional default)
+    (let ((sym (if (stringp key) (intern-soft key) key)))
+      (if (not sym)
+         default
+       (gethash sym table))))
+
+  (mapcar (function
+          (lambda (sym)
+            (let ((new-sym (intern (format "url-%s" sym))))
+              (defalias new-sym sym))))
+         '(make-hashtable 
+           make-key-weak-hashtable
+           make-value-weak-hashtable
+           make-weak-hashtable
+           hashtablep
+           clrhash
+           maphash
+           copy-hashtable)))
+ (t
+  (defconst url-hashtable-primes
+    '(13 29 37 47 59 71 89 107 131 163 197 239 293 353 431 521 631 761 919
+        1103 1327 1597 1931 2333 2801 3371 4049 4861 5839 7013 8419 10103
+        12143 14591 17519 21023 25229 30293 36353 43627 52361 62851 75431
+        90523 108631 130363 156437 187751 225307 270371 324449 389357 467237
+        560689 672827 807403 968897 1162687 1395263 1674319 2009191 2411033
+        2893249)
+    "A list of some good prime #s to use as  sizes for hashtables.")
+
+  (defun url-make-hashtable (size)
+    "Make a hashtable of initial size SIZE"
+    (if (not size) (setq size 37))
+    (if (not (memq size url-hashtable-primes))
+       ;; Find a suitable prime # to use as the hashtable size
+       (let ((primes url-hashtable-primes))
+         (while (<= (car primes) size)
+           (setq primes (cdr primes)))
+         (setq size (car primes))))
+    (make-vector (or size 2893249) 0))
+
+  (fset 'url-make-key-weak-hashtable 'url-make-hashtable)
+  (fset 'url-make-value-weak-hashtable 'url-make-hashtable)
+  (fset 'url-make-weak-hashtable 'url-make-hashtable)
+
+  (defun url-hashtablep (obj)
+    "Return t if OBJ is a hashtable, else nil."
+    (vectorp obj))
+
+  (defun url-puthash (key val table)
+    "Hash KEY to VAL in TABLE."
+    (let ((sym (intern (if (stringp key) key (prin1-to-string key)) table)))
+      (put sym 'val val)
+      (put sym 'key key)))
+
+  (defun url-gethash (key table &optional default)
+    "Find hash value for KEY in TABLE.
+If there is no corresponding value, return DEFAULT (defaults to nil)."
+    (let ((sym (intern-soft (if (stringp key)
+                               key
+                             (prin1-to-string key)) table)))
+      (or (and sym (get sym 'val))
+         default)))
+
+  (put 'url-gethash 'sysdep-defined-this t)
+
+  (defun url-clrhash (table)
+    "Flush TABLE"
+    (fillarray table 0))
+
+  (defun url-maphash (function table)
+    "Map FUNCTION over entries in TABLE, calling it with two args,
+each key and value in the table."
+    (mapatoms
+     (function
+      (lambda (sym)
+       (funcall function (get sym 'key) (get sym 'val)))) table))
+
+  (defun url-copy-hashtable (old-table)
+    "Make a new hashtable which contains the same keys and values
+as the given table.  The keys and values will not themselves be copied."
+    (copy-sequence old-table))
+  ))
+
+(provide 'url-hash)
diff --git a/lisp/url-http.el b/lisp/url-http.el
new file mode 100644
index 0000000..a630281
--- /dev/null
+++ b/lisp/url-http.el
@@ -0,0 +1,614 @@
+;;; url-http.el --- HTTP Uniform Resource Locator retrieval code
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:09 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'url-vars)
+(require 'url-parse)
+(require 'url-cookie)
+(require 'timezone)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Support for HTTP/1.0 MIME messages
+;;; ----------------------------------
+;;; These functions are the guts of the HTTP/0.9 and HTTP/1.0 transfer
+;;; protocol, handling access authorization, format negotiation, the
+;;; whole nine yards.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun url-parse-viewer-types ()
+  "Create a string usable for an Accept: header from mm-mime-data"
+  (let ((tmp mm-mime-data)
+       label mjr mnr cur-mnr (str ""))
+    (while tmp
+      (setq mnr (cdr (car tmp))
+           mjr (car (car tmp))
+           tmp (cdr tmp))
+      (while mnr
+       (setq cur-mnr (car mnr)
+             label (concat mjr "/" (if (string= ".*" (car cur-mnr))
+                                       "*"
+                                     (car cur-mnr))))
+       (cond
+        ((string-match (regexp-quote label) str) nil)
+        ((> (+ (% (length str) 60)
+               (length (concat ", " mjr "/" (car cur-mnr)))) 60)
+         (setq str (format "%s\r\nAccept: %s" str label)))
+        (t
+         (setq str (format "%s, %s" str label))))
+       (setq mnr (cdr mnr))))
+    (substring str 2 nil)))
+
+(defun url-create-multipart-request (file-list)
+  "Create a multi-part MIME request for all files in FILE-LIST"
+  (let ((separator (current-time-string))
+       (content "message/http-request")                   
+       (ref-url nil))
+    (setq separator
+         (concat "separator-"
+                 (mapconcat
+                  (function
+                   (lambda (char)
+                     (if (memq char url-mime-separator-chars)
+                         (char-to-string char) ""))) separator "")))
+    (cons separator
+         (concat
+          (mapconcat
+           (function
+            (lambda (file)
+              (concat "--" separator "\nContent-type: " content "\n\n"
+                      (url-create-mime-request file ref-url)))) file-list
+                      "\n")
+          "--" separator))))
+
+(defun url-create-message-id ()
+  "Generate a string suitable for the Message-ID field of a request"
+  (concat "<" (url-create-unique-id) "@" (system-name) ">"))
+
+(defun url-create-unique-id ()
+  ;; Generate unique ID from user name and current time.
+  (let* ((date (current-time-string))
+        (name (user-login-name))
+        (dateinfo (and date (timezone-parse-date date)))
+        (timeinfo (and date (timezone-parse-time (aref dateinfo 3)))))
+    (if (and dateinfo timeinfo)
+       (concat (upcase name) "."
+               (aref dateinfo 0)       ; Year
+               (aref dateinfo 1)       ; Month
+               (aref dateinfo 2)       ; Day
+               (aref timeinfo 0)       ; Hour
+               (aref timeinfo 1)       ; Minute 
+               (aref timeinfo 2)       ; Second
+               )
+      (error "Cannot understand current-time-string: %s." date))
+    ))
+
+(defun url-http-user-agent-string ()
+  (if (or (eq url-privacy-level 'paranoid)
+         (and (listp url-privacy-level)
+              (memq 'agent url-privacy-level)))
+      ""
+    (format "User-Agent: %s/%s URL/%s%s\r\n"
+           url-package-name url-package-version
+           url-version
+           (cond
+            ((and url-os-type url-system-type)
+             (concat " (" url-os-type "; " url-system-type ")"))
+            ((or url-os-type url-system-type)
+             (concat " (" (or url-system-type url-os-type) ")"))
+            (t "")))))
+
+(defun url-create-mime-request (fname ref-url)
+  "Create a MIME request for fname, referred to by REF-URL."
+  (let* ((extra-headers)
+        (request nil)
+        (url (url-view-url t))
+        (no-cache (cdr-safe (assoc "Pragma" url-request-extra-headers)))
+        (proxy-auth (if (or (cdr-safe (assoc "Proxy-Authorization"
+                                             url-request-extra-headers))
+                            (not (boundp 'proxy-info))
+                            (not url-using-proxy))
+                        nil
+                      (let ((url-basic-auth-storage
+                             url-proxy-basic-authentication))
+                        (url-get-authentication url-using-proxy nil 'any 
nil))))
+        (proxy-obj (if (and (boundp 'proxy-info) proxy-info)
+                       (url-generic-parse-url proxy-info)))
+        (real-fname (if proxy-obj (url-filename proxy-obj) fname))
+        (host (or (and proxy-obj (url-host proxy-obj))
+                  (url-host url-current-object)))
+        (auth (if (cdr-safe (assoc "Authorization" url-request-extra-headers))
+                  nil
+                (url-get-authentication (or
+                                         (and (boundp 'proxy-info)
+                                              proxy-info)
+                                         url) nil 'any nil))))
+    (setq no-cache (and no-cache (string-match "no-cache" no-cache)))
+    (if auth
+       (setq auth (concat "Authorization: " auth "\r\n")))
+    (if proxy-auth
+       (setq proxy-auth (concat "Proxy-Authorization: " proxy-auth "\r\n")))
+
+    (if (and ref-url (stringp ref-url) (or (string= ref-url "file:nil")
+                                          (string= ref-url "")))
+       (setq ref-url nil))
+
+    (if (or (memq url-privacy-level '(low high paranoid))
+           (and (listp url-privacy-level)
+                (memq 'lastloc url-privacy-level)))
+       (setq ref-url nil))
+
+    (setq extra-headers (mapconcat
+                        (function (lambda (x)
+                                    (concat (car x) ": " (cdr x))))
+                        url-request-extra-headers "\r\n"))
+    (if (not (equal extra-headers ""))
+       (setq extra-headers (concat extra-headers "\r\n")))
+    (setq request
+         (format
+          (concat
+           "%s %s HTTP/1.0\r\n"        ; The request
+           "MIME-Version: 1.0\r\n"     ; Version of MIME we speaketh
+           "Extension: %s\r\n"         ; HTTP extensions we support
+           "Host: %s\r\n"              ; Who we want to talk to
+           "%s"                        ; Who its from
+           "Accept-encoding: %s\r\n"   ; Encodings we understand
+           "%s"                        ; Languages we understand
+           "Accept: %s\r\n"            ; Types we understand
+           "%s"                        ; User agent
+           "%s"                        ; Authorization
+           "%s"                        ; Cookies
+           "%s"                        ; Proxy Authorization
+           "%s"                        ; If-modified-since
+           "%s"                        ; Where we came from
+           "%s"                        ; Any extra headers
+           "%s"                        ; Any data
+           "\r\n")                     ; End request
+          (or url-request-method "GET")
+          fname
+          (or url-extensions-header "none")
+          (or host "UNKNOWN.HOST.NAME")
+          (if url-personal-mail-address
+              (concat "From: " url-personal-mail-address "\r\n")
+            "")
+          url-mime-encoding-string
+          (if url-mime-language-string
+              (concat "Accept-language: " url-mime-language-string "\r\n")
+            "")
+          url-mime-accept-string
+          (url-http-user-agent-string)
+          (or auth "")
+          (url-cookie-generate-header-lines
+           host real-fname (equal "https" (url-type url-current-object)))
+          (or proxy-auth "")
+          (if (and (not no-cache)
+                   (member url-request-method '("GET" nil)))
+              (let ((tm (url-is-cached url)))
+                (if tm
+                    (concat "If-modified-since: "
+                            (url-get-normalized-date tm) "\r\n")
+                  ""))
+            "")
+          (if ref-url (concat "Referer: " ref-url "\r\n") "")
+          extra-headers
+          (if url-request-data
+              (format "Content-length: %d\r\n\r\n%s"
+                      (length url-request-data) url-request-data)
+            "")))
+    request))
+
+(defun url-setup-reload-timer (url must-be-viewing &optional time)
+  ;; Set up a timer to load URL at optional TIME.  If TIME is unspecified,
+  ;; default to 5 seconds.  Only loads document if MUST-BE-VIEWING is the
+  ;; current URL when the timer expires."
+  (if (or (not time)
+         (<= time 0))
+      (setq time 5))
+  (let ((func
+        (` (lambda ()
+             (if (equal (url-view-url t) (, must-be-viewing))
+                 (let ((w3-reuse-buffers 'no))
+                   (if (equal (, url) (url-view-url t))
+                       (kill-buffer (current-buffer)))
+                   (w3-fetch (, url))))))))
+    (cond
+     ((featurep 'itimer)
+      (start-itimer "reloader" func time))
+     ((fboundp 'run-at-time)
+      (run-at-time time nil func))
+     (t
+      (url-warn 'url "Cannot set up timer for automatic reload, sorry!")))))
+
+(defun url-handle-refresh-header (reload)
+  (if (and reload
+          url-honor-refresh-requests
+          (or (eq url-honor-refresh-requests t)
+              (funcall url-confirmation-func "Honor refresh request? ")))
+      (let ((uri (url-view-url t)))
+       (if (string-match ";" reload)
+           (progn
+             (setq uri (substring reload (match-end 0) nil)
+                   reload (substring reload 0 (match-beginning 0)))
+             (if (string-match
+                  "ur[li][ \t]*=[ \t]*\"*\\([^ \t\"]+\\)\"*"
+                  uri)
+                 (setq uri (url-match uri 1)))
+             (setq uri (url-expand-file-name uri (url-view-url t)))))
+       (url-setup-reload-timer uri (url-view-url t)
+                               (string-to-int (or reload "5"))))))
+
+(defun url-parse-mime-headers (&optional no-delete switch-buff)
+  ;; Parse mime headers and remove them from the html
+  (and switch-buff (set-buffer url-working-buffer))
+  (let* ((st (point-min))
+        (nd (progn
+              (goto-char (point-min))
+              (skip-chars-forward " \t\n")
+              (if (re-search-forward "^\r*$" nil t)
+                  (1+ (point))
+                (point-max))))
+        save-pos
+        status
+        class
+        hname
+        hvalu
+        result
+        )
+    (narrow-to-region st (min nd (point-max)))
+    (goto-char (point-min))
+    (skip-chars-forward " \t\n")       ; Get past any blank crap
+    (skip-chars-forward "^ \t")        ; Skip over the HTTP/xxx
+    (setq status (read (current-buffer)); Quicker than buffer-substring, etc.
+         result (cons (cons "status" status) result))
+    (end-of-line)
+    (while (not (eobp))
+      (skip-chars-forward " \t\n\r")
+      (setq save-pos (point))
+      (skip-chars-forward "^:\n\r")
+      (downcase-region save-pos (point))
+      (setq hname (buffer-substring save-pos (point)))
+      (skip-chars-forward ": \t ")
+      (setq save-pos (point))
+      (skip-chars-forward "^\n\r")
+      (setq hvalu (buffer-substring save-pos (point))
+           result (cons (cons hname hvalu) result))
+      (if (string= hname "set-cookie")
+         (url-cookie-handle-set-cookie hvalu)))
+    (or no-delete (delete-region st (min nd (point))))
+    (setq url-current-mime-type (cdr (assoc "content-type" result))
+         url-current-mime-charset nil
+         url-current-mime-encoding (cdr (assoc "content-encoding" result))
+         url-current-mime-viewer (mm-mime-info url-current-mime-type nil t)
+         url-current-mime-headers result
+         url-current-can-be-cached
+         (not (string-match "no-cache"
+                            (or (cdr-safe (assoc "pragma" result)) ""))))
+    (cond ((and url-current-mime-type
+               (string-match url-mime-content-type-charset-regexp 
url-current-mime-type))
+          (setq url-current-mime-charset
+                (substring url-current-mime-type (match-beginning 1) 
(match-end 1)))
+          (setq url-current-mime-type
+                (substring url-current-mime-type 0 (match-beginning 0)))))
+    (url-handle-refresh-header (cdr-safe (assoc "refresh" result)))
+    (if (and url-request-method
+            (not (string= url-request-method "GET")))
+       (setq url-current-can-be-cached nil))
+    (let ((expires (cdr-safe (assoc "expires" result))))
+      (if (and expires url-current-can-be-cached (featurep 'timezone))
+         (progn
+           (if (string-match
+                (concat "^[^,]+, +\\(..\\)-\\(...\\)-\\(..\\) +"
+                        "\\(..:..:..\\) +\\[*\\([^\]]+\\)\\]*$")
+                             expires)
+               (setq expires (concat (url-match expires 1) " "
+                                     (url-match expires 2) " "
+                                     (url-match expires 3) " "
+                                     (url-match expires 4) " ["
+                                     (url-match expires 5) "]")))
+           (setq expires
+                 (let ((d1 (mapcar
+                            (function
+                             (lambda (s) (and s (string-to-int s))))
+                            (timezone-parse-date
+                             (current-time-string))))
+                       (d2 (mapcar
+                            (function (lambda (s) (and s (string-to-int s))))
+                            (timezone-parse-date expires))))
+                   (- (timezone-absolute-from-gregorian 
+                       (nth 1 d1) (nth 2 d1) (car d1))
+                      (timezone-absolute-from-gregorian 
+                       (nth 1 d2) (nth 2 d2) (car d2))))
+                 url-current-can-be-cached (/= 0 expires)))))
+    (setq class (/ status 100))
+    (cond
+     ;; Classes of response codes
+     ;;
+     ;; 5xx = Server Error
+     ;; 4xx = Client Error
+     ;; 3xx = Redirection
+     ;; 2xx = Successful
+     ;; 1xx = Informational
+     ;;
+     ((= class 2)                      ; Successful in some form or another
+      (cond
+       ((or (= status 206)             ; Partial content
+           (= status 205))             ; Reset content
+       (setq url-current-can-be-cached nil))
+       ((= status 204)                 ; No response - leave old document
+       (kill-buffer url-working-buffer))
+       (t nil))                                ; All others indicate success
+      )
+     ((= class 3)                      ; Redirection of some type
+      (cond
+       ((or (= status 301)             ; Moved - retry with Location: header
+           (= status 302)              ; Found - retry with Location: header
+           (= status 303))             ; Method - retry with location/method
+       (let ((x (url-view-url t))
+             (redir (or (cdr (assoc "uri" result))
+                        (cdr (assoc "location" result))))
+             (redirmeth (upcase (or (cdr (assoc "method" result))
+                                    url-request-method
+                                    "get"))))
+         (if (and redir (string-match "\\([^ \t]+\\)[ \t]" redir))
+             (setq redir (url-match redir 1)))
+         (if (and redir (string-match "^<\\(.*\\)>$" redir))
+             (setq redir (url-match redir 1)))
+
+         ;; As per Roy Fielding, 303 maps _any_ method to a 'GET'
+         (if (= 303 status)
+             (setq redirmeth "GET"))
+
+         ;; As per Roy Fielding, 301, 302 use the same method as the
+         ;; original request, but if != GET, user interaction is
+         ;; required.
+         (if (and (not (string= "GET" redirmeth))
+                  (not (funcall
+                        url-confirmation-func
+                        (concat
+                         "Honor redirection with non-GET method "
+                         "(possible security risks)? "))))
+             (progn
+               (url-warn 'url
+                         (format
+                          "The URL %s tried to issue a redirect to %s using a 
method other than
+GET, which can open up various security holes.  Please see the
+HTTP/1.0 specification for more details." x redir) 'error)
+               (if (funcall url-confirmation-func
+                            "Continue (with method of GET)? ")
+                   (setq redirmeth "GET")
+                 (error "Transaction aborted."))))
+
+         (if (not (equal x redir))
+             (let ((url-request-method redirmeth))
+               (url-maybe-relative redir))
+           (progn
+             (goto-char (point-max))
+             (insert "<hr>Error!  This URL tried to redirect me to itself!<P>"
+                     "Please notify the server maintainer.")))))
+       ((= status 304)                 ; Cached document is newer
+       (message "Extracting from cache...")
+       (url-cache-extract (url-cache-create-filename (url-view-url t))))
+       ((= status 305)                 ; Use proxy in Location: header
+       nil)))
+     ((= class 4)                      ; Client error
+      (cond
+       ((and (= status 401)            ; Unauthorized access, retry w/auth.
+            (< url-current-passwd-count url-max-password-attempts))
+       (setq url-current-passwd-count (1+ url-current-passwd-count))
+       (let* ((y (or (cdr (assoc "www-authenticate" result)) "basic"))
+              (url (url-view-url t))
+              (type (downcase (if (string-match "[ \t]" y)
+                                  (substring y 0 (match-beginning 0))
+                                y))))
+         (cond
+          ((url-auth-registered type)
+           (let ((args y)
+                 (ctr (1- (length y)))
+                 auth
+                 (url-request-extra-headers url-request-extra-headers))
+             (while (/= 0 ctr)
+               (if (= ?, (aref args ctr))
+                   (aset args ctr ?\;))
+               (setq ctr (1- ctr)))
+             (setq args (mm-parse-args y)
+                   auth (url-get-authentication url
+                                                (cdr-safe
+                                                 (assoc "realm" args))
+                                                type t args))
+             (if auth
+                 (setq url-request-extra-headers
+                       (cons (cons "Authorization" auth)
+                             url-request-extra-headers)))
+             (url-retrieve url t)))
+          (t
+           (widen)
+           (goto-char (point-max))
+           (setq url-current-can-be-cached nil)
+           (insert "<hr>Sorry, but I do not know how to handle " y
+                   " authentication.  If you'd like to write it,"
+                   " send it to " url-bug-address ".<hr>")))))
+       ((= status 407)                 ; Proxy authentication required
+       (let* ((y (or (cdr (assoc "proxy-authenticate" result)) "basic"))
+              (url (url-view-url t))
+              (urlobj (url-generic-parse-url url))
+              (url-basic-auth-storage url-proxy-basic-authentication)
+              (url-using-proxy (url-find-proxy-for-url urlobj
+                                                       (url-host urlobj)))
+              (type (downcase (if (string-match "[ \t]" y)
+                                  (substring y 0 (match-beginning 0))
+                                y))))
+         (cond
+          ((url-auth-registered type)
+           (let ((args y)
+                 (ctr (1- (length y)))
+                 auth
+                 (url-request-extra-headers url-request-extra-headers))
+             (while (/= 0 ctr)
+               (if (= ?, (aref args ctr))
+                   (aset args ctr ?\;))
+               (setq ctr (1- ctr)))
+             (setq args (mm-parse-args y)
+                   auth (url-get-authentication (or url-using-proxy url)
+                                                (cdr-safe
+                                                 (assoc "realm" args))
+                                                type t args))
+             (if auth
+                 (setq url-request-extra-headers
+                       (cons (cons "Proxy-Authorization" auth)
+                             url-request-extra-headers)))
+             (setq url-proxy-basic-authentication url-basic-auth-storage)
+             (url-retrieve url t)))
+          (t
+           (widen)
+           (goto-char (point-max))
+           (setq url-current-can-be-cached nil)
+           (insert "<hr>Sorry, but I do not know how to handle " y
+                   " authentication.  If you'd like to write it,"
+                   " send it to " url-bug-address ".<hr>")))))
+       ;;((= status 400) nil)          ; Bad request - syntax
+       ;;((= status 401) nil)          ; Tried too many times
+       ;;((= status 402) nil)          ; Payment required, retry w/Chargeto:
+       ;;((= status 403) nil)          ; Access is forbidden
+       ;;((= status 404) nil)          ; Not found...
+       ;;((= status 405) nil)          ; Method not allowed
+       ;;((= status 406) nil)          ; None acceptable
+       ;;((= status 408) nil)          ; Request timeout
+       ;;((= status 409) nil)          ; Conflict
+       ;;((= status 410) nil)          ; Document is gone
+       ;;((= status 411) nil)          ; Length required
+       ;;((= status 412) nil)          ; Unless true
+       (t                              ; All others mena something hosed
+       (setq url-current-can-be-cached nil))))
+     ((= class 5)
+;;;      (= status 504)                        ; Gateway timeout
+;;;      (= status 503)                        ; Service unavailable
+;;;      (= status 502)                        ; Bad gateway
+;;;      (= status 501)                        ; Facility not supported
+;;;      (= status 500)                        ; Internal server error
+      (setq url-current-can-be-cached nil))
+     ((= class 1)
+      (cond
+       ((or (= status 100)             ; Continue
+           (= status 101))             ; Switching protocols
+       nil)))
+     (t
+      (setq url-current-can-be-cached nil)))
+    (widen)
+    status))
+
+(defun url-mime-response-p (&optional switch-buff)
+  ;; Determine if the current buffer is a MIME response
+  (and switch-buff (set-buffer url-working-buffer))
+  (goto-char (point-min))
+  (skip-chars-forward " \t\n")
+  (and (looking-at "^HTTP/.+")))
+
+(defsubst url-recreate-with-attributes (obj)
+  (if (url-attributes obj)
+      (concat (url-filename obj) ";"
+             (mapconcat
+              (function
+               (lambda (x)
+                 (if (cdr x)
+                     (concat (car x) "=" (cdr x))
+                   (car x)))) (url-attributes obj) ";"))
+    (url-filename obj)))
+
+(defun url-http (url &optional proxy-info)
+  ;; Retrieve URL via http.
+  (let* ((urlobj (url-generic-parse-url url))
+        (ref-url (or url-current-referer (url-view-url t))))
+    (url-clear-tmp-buffer)
+    (let* ((server (url-host urlobj))
+          (port   (url-port urlobj))
+          (file   (or proxy-info (url-recreate-with-attributes urlobj)))
+          (dest   (url-target urlobj))
+          request)
+      (if (equal port "") (setq port "80"))
+      (if (equal file "") (setq file "/"))
+      (if (not server)
+         (progn
+           (url-warn
+            'url
+            (eval-when-compile
+              (concat
+               "Malformed URL got passed into url-retrieve.\n"
+               "Either `url-expand-file-name' is broken in some\n"
+               "way, or an incorrect URL was manually entered (more likely)."
+               )))
+           (error "Malformed URL: `%s'" url)))
+      (if (or (not (member port url-bad-port-list))
+             (funcall url-confirmation-func
+                      (concat
+                       "Warning!  Trying to connect to port "
+                       port
+                       " - continue? ")))
+         (progn
+           (setq request (url-create-mime-request file ref-url))
+           (url-lazy-message "Contacting %s:%s" server port)
+           (let ((process
+                  (url-open-stream "WWW" url-working-buffer server
+                                  (string-to-int port))))
+             (if (not (processp process))
+                 (url-sentinel url-working-buffer nil)
+               (progn
+                 (url-process-put process 'url (or proxy-info url))
+                 (set-process-sentinel process 'ignore)
+                 (process-kill-without-query process)
+                 (process-send-string process request)
+                 (url-lazy-message "Request sent, waiting for response...")
+                 (setq url-current-content-length nil)
+                 (make-local-variable 'after-change-functions)
+                 (add-hook 'after-change-functions 'url-after-change-function)
+                 (if url-be-asynchronous
+                     (set-process-sentinel process 'url-sentinel)
+                   (unwind-protect
+                       (save-excursion
+                         (set-buffer url-working-buffer)
+                         (while (memq (url-process-status process)
+                                      '(run open))
+                           (url-accept-process-output process)))
+                     (condition-case ()
+                         (url-kill-process process)
+                       (error nil))))
+                 (if url-be-asynchronous
+                     nil
+                   (message "Retrieval complete.")
+                   (remove-hook 'after-change-functions
+                                'url-after-change-function))))))
+       (progn
+         (ding)
+         (url-warn 'security "Aborting connection to bad port..."))))))
+
+(defun url-https (url)
+  ;; Retrieve a URL via SSL
+  (condition-case ()
+      (require 'ssl)
+    (error (error "Not configured for SSL, please read the info pages.")))
+  (let ((url-this-is-ssl t)
+       (url-gateway-method 'ssl))
+    (url-http url)))
+
+(provide 'url-http)
diff --git a/lisp/url-irc.el b/lisp/url-irc.el
new file mode 100644
index 0000000..cae094b
--- /dev/null
+++ b/lisp/url-irc.el
@@ -0,0 +1,74 @@
+;;; url-irc.el --- IRC URL interface
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:09 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'url-vars)
+(require 'url-parse)
+
+(defcustom url-irc-function 'url-irc-zenirc
+  "*Function to actually open an IRC connection.
+Should be a function that takes several argument:
+    HOST - the hostname of the IRC server to contact
+    PORT - the port number of the IRC server to contact
+ CHANNEL - What channel on the server to visit right away (can be nil)
+    USER - What username to use
+PASSWORD - What password to use"
+  :type '(choice (const :tag "ZEN IRC" :value 'url-irc-zenirc)
+                (function :tag "Other"))
+  :group 'url)
+
+(defun url-irc-zenirc (host port channel user password)
+  (let ((zenirc-buffer-name (if (and user host port)
+                               (format "address@hidden:%d" user host port)
+                             (format "%s:%d" host port)))
+       (zenirc-server-alist
+        (list
+         (list host port password nil user))))
+    (zenirc)
+    (goto-char (point-max))
+    (if (not channel)
+       nil
+      (insert "/join " channel)
+      (zenirc-send-line))))
+
+(defun url-irc (url)
+  (let* ((urlobj (url-generic-parse-url url))
+        (host (url-host urlobj))
+        (port (string-to-int (url-port urlobj)))
+        (pass (url-password urlobj))
+        (user (url-user urlobj))
+        (chan (url-filename urlobj)))
+    (if (url-target urlobj)
+       (setq chan (concat chan "#" (url-target urlobj))))
+    (and (get-buffer url-working-buffer)
+        (kill-buffer url-working-buffer))
+    (if (string-match "^/" chan)
+       (setq chan (substring chan 1 nil)))
+    (if (= (length chan) 0)
+       (setq chan nil))
+    (funcall url-irc-function host port chan user pass)))
+    
diff --git a/lisp/url-mail.el b/lisp/url-mail.el
new file mode 100644
index 0000000..fddcad8
--- /dev/null
+++ b/lisp/url-mail.el
@@ -0,0 +1,204 @@
+;;; url-mail.el --- Mail Uniform Resource Locator retrieval code
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:09 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'url-vars)
+(require 'url-parse)
+
+(defmacro url-mailserver-skip-chunk ()
+  (` (while (and (not (looking-at "/"))
+                (not (eobp)))
+       (forward-sexp 1))))
+
+;;;###autoload
+(defun url-mail (&rest args)
+  (interactive "P")
+  (if (fboundp 'message-mail)
+      (apply 'message-mail args)
+    (or (apply 'mail args)
+       (error "Mail aborted"))))
+
+(defun url-mail-goto-field (field)
+  (if (not field)
+      (goto-char (point-max))
+    (let ((dest nil)
+         (lim nil)
+         (case-fold-search t))
+      (save-excursion
+       (goto-char (point-min))
+       (if (re-search-forward (regexp-quote mail-header-separator) nil t)
+           (setq lim (match-beginning 0)))
+       (goto-char (point-min))
+       (if (re-search-forward (concat "^" (regexp-quote field) ":") lim t)
+           (setq dest (match-beginning 0))))
+      (if dest
+         (progn
+           (goto-char dest)
+           (end-of-line))
+       (goto-char lim)
+       (insert (capitalize field) ": ")
+       (save-excursion
+         (insert "\n"))))))
+  
+(defun url-mailto (url)
+  ;; Send mail to someone
+  (if (string-match "mailto:/*\\(.*\\)" url)
+      (when (eql ?/ (1- (match-beginning 1)))
+       (w3-debug-html :style "mailto URL with slashes before mailbox."))
+    (error "Malformed mailto link: %s" url))
+  (setq url (substring url (match-beginning 1) nil))
+  (if (get-buffer url-working-buffer)
+      (kill-buffer url-working-buffer))
+  (let (to args source-url subject func headers-start)
+    (if (string-match (regexp-quote "?") url)
+       (setq headers-start (match-end 0)
+             to (url-unhex-string (substring url 0 (match-beginning 0)))
+             args (url-parse-query-string
+                   (substring url headers-start nil) t))
+      (setq to (url-unhex-string url)))
+    (setq source-url (url-view-url t))
+    (if (and url-request-data (not (assoc "subject" args)))
+       (setq args (cons (list "subject"
+                              (concat "Automatic submission from "
+                                      url-package-name "/"
+                                      url-package-version)) args)))
+    (if (and source-url (not (assoc "x-url-from" args)))
+       (setq args (cons (list "x-url-from" source-url) args)))
+    (setq args (cons (list "to" to) args)
+         subject (cdr-safe (assoc "subject" args)))
+    (if (fboundp url-mail-command) (funcall url-mail-command) (mail))
+    (while args
+      (if (string= (caar args) "body")
+         (progn
+           (goto-char (point-max))
+           (insert (mapconcat 'identity (cdar args) "\n")))
+       (url-mail-goto-field (caar args))
+       (setq func (intern-soft (concat "mail-" (caar args))))
+       (insert (mapconcat 'identity (cdar args) ", ")))
+      (setq args (cdr args)))
+    (url-mail-goto-field "X-Mailer")
+    (insert url-package-name "/" url-package-version)
+    (if (not url-request-data)
+       (if subject
+           (url-mail-goto-field nil)
+         (url-mail-goto-field "subject"))
+      (if url-request-extra-headers
+         (mapconcat
+          (function
+           (lambda (x)
+             (url-mail-goto-field (car x))
+             (insert (cdr x))))
+          url-request-extra-headers ""))
+      (goto-char (point-max))
+      (insert url-request-data)
+      (mail-send-and-exit nil))))
+
+(defun url-mailserver (url)
+  ;; Send mail to someone, much cooler/functional than mailto
+  (if (get-buffer url-working-buffer)
+      (kill-buffer url-working-buffer))
+  (set-buffer (get-buffer-create " *mailserver*"))
+  (erase-buffer)
+  (insert url)
+  (goto-char (point-min))
+  (set-syntax-table url-mailserver-syntax-table)
+  (skip-chars-forward "^:")            ; Get past mailserver
+  (skip-chars-forward ":")             ; Get past :
+  ;; Handle some ugly malformed URLs, but bitch about it.
+  (if (looking-at "/")
+      (progn
+       (url-warn 'url "Invalid mailserver URL... attempting to cope.")
+       (skip-chars-forward "/")))
+  
+  (let ((save-pos (point))
+       (url (url-view-url t))
+       (rfc822-addr nil)
+       (subject nil)
+       (body nil))
+    (url-mailserver-skip-chunk)
+    (setq rfc822-addr (buffer-substring save-pos (point)))
+    (forward-char 1)
+    (setq save-pos (point))
+    (url-mailserver-skip-chunk)
+    (setq subject (buffer-substring save-pos (point)))
+    (if (not (eobp))
+       (progn                          ; There is some text to use
+         (forward-char 1)              ; as the body of the message
+         (setq body (buffer-substring (point) (point-max)))))
+    (if (fboundp url-mail-command) (funcall url-mail-command) (mail))
+    (url-mail-goto-field "to")
+    (insert rfc822-addr)
+    (if (and url (not (string= url "")))
+       (progn
+         (url-mail-goto-field "X-URL-From")
+         (insert url)))
+    (url-mail-goto-field "X-Mailer")
+    (insert url-package-name "/" url-package-version)
+    (url-mail-goto-field "subject")
+    ;; Massage the subject from URLEncoded garbage
+    ;; Note that we do not allow any newlines in the subject,
+    ;; as recommended by the Internet Draft on the mailserver
+    ;; URL - this means the document author cannot spoof additional
+    ;; header lines, which is a 'Good Thing'
+    (if subject
+       (progn
+         (setq subject (url-unhex-string subject))
+         (let ((x (1- (length subject)))
+               (y 0))
+           (while (<= y x)
+             (if (memq (aref subject y) '(?\r ?\n))
+                 (aset subject y ? ))
+             (setq y (1+ y))))))
+    (insert subject)
+    (if url-request-extra-headers
+       (progn
+         (goto-char (point-min))
+         (insert
+          (mapconcat
+           (function
+            (lambda (x)
+              (url-mail-goto-field (car x))
+              (insert (cdr x))))
+           url-request-extra-headers ""))))
+    (goto-char (point-max))
+    ;; Massage the body from URLEncoded garbage
+    (if body
+       (let ((x (1- (length body)))
+             (y 0))
+         (while (<= y x)
+           (if (= (aref body y) ?/)
+               (aset body y ?\n))
+           (setq y (1+ y)))
+         (setq body (url-unhex-string body))))
+    (and body (insert body))
+    (and url-request-data (insert url-request-data))
+    (if (and (or body url-request-data)
+            (funcall url-confirmation-func
+                     (concat "Send message to " rfc822-addr "? ")))
+       (mail-send-and-exit nil))))    
+
+(provide 'url-mail)
diff --git a/lisp/url-misc.el b/lisp/url-misc.el
new file mode 100644
index 0000000..2d133e4
--- /dev/null
+++ b/lisp/url-misc.el
@@ -0,0 +1,201 @@
+;;; url-misc.el --- Misc Uniform Resource Locator retrieval code
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:09 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'url-vars)
+(require 'url-parse)
+(require 'widget)
+(autoload 'Info-goto-node "info" "" t)
+
+(defun url-netrek (url)
+  ;; Start a netrek client
+  (if (get-buffer url-working-buffer)
+      (kill-buffer url-working-buffer))
+  (let ((data (url-generic-parse-url url)))
+    (error
+     "I should launch netrek on: %s %s" (url-host data) (url-port data))))
+
+(defun url-info (url)
+  ;; Fetch an info node
+  (if (get-buffer url-working-buffer)
+      (kill-buffer url-working-buffer))
+  (let* ((data (url-generic-parse-url url))
+        (fname (url-filename data))
+        (node (url-unhex-string (or (url-target data) "Top"))))
+    (if (and fname node)
+       (Info-goto-node (concat "(" fname ")" node))
+      (error "Malformed url: %s" url))))
+
+(defun url-finger (url)
+  ;; Find a finger reference
+  (setq url-current-mime-headers '(("content-type" . "text/html"))
+       url-current-mime-type "text/html")
+  (set-buffer (get-buffer-create url-working-buffer))
+  (let* ((urlobj (if (vectorp url) url
+                  (url-generic-parse-url url)))
+        (host (or (url-host urlobj) "localhost"))
+        (port (or (url-port urlobj)
+                  (cdr-safe (assoc "finger" url-default-ports))))
+        (user (url-unhex-string (url-filename urlobj)))
+        (proc (url-open-stream "finger" url-working-buffer host
+                               (string-to-int port))))
+    (if (not (processp proc))
+       nil
+      (process-kill-without-query proc)
+      (set-process-sentinel proc 'ignore)
+      (if (= (string-to-char user) ?/)
+         (setq user (substring user 1 nil)))
+      (goto-char (point-min))
+      (insert "<html>\n"
+             " <head>\n"
+             "  <title>Finger information for " user "@" host "</title>\n"
+             " </head>\n"
+             " <body>\n"
+             "  <h1>Finger information for " user "@" host "</h1>\n"
+             "  <hr>\n"
+             "  <pre>\n")
+      (process-send-string proc (concat user "\r\n"))
+      (while (memq (url-process-status proc) '(run open))
+       (url-after-change-function)
+       (url-accept-process-output proc))
+      (goto-char (point-min))
+      (url-replace-regexp "^Process .* exited .*code .*$" "")
+      (goto-char (point-max))
+      (insert "  </pre>\n"
+             " </body>\n"
+             "</html>\n"))))
+
+(defun url-do-terminal-emulator (type server port user)
+  (terminal-emulator
+   (generate-new-buffer (format "%s%s" (if user (concat user "@") "") server))
+   (case type
+     (rlogin "rlogin")
+     (telnet "telnet")
+     (tn3270 "tn3270")
+     (otherwise
+      (error "Unknown terminal emulator required: %s" type)))
+   (case type
+     (rlogin
+      (if user
+         (list server "-l" user)
+       (list server)))
+     (telnet
+      (if user (message "Please log in as user: %s" user))
+      (if port
+         (list server port)
+       (list server)))
+     (tn3270
+      (if user (message "Please log in as user: %s" user))
+      (list server)))))
+
+(defun url-generic-emulator-loader (url)
+  (if (get-buffer url-working-buffer)
+      (kill-buffer url-working-buffer))
+  (or (string-match "^\\([^:]+\\):/*\\(address@hidden)*\\([^/]*\\)/*" url)
+      (error "Invalid URL: %s" url))
+  (let* ((type (intern (downcase (match-string 1 url))))
+        (server (match-string 3 url))
+        (name (if (match-beginning 2)
+                  (substring url (match-beginning 2) (1- (match-end 2)))))
+        (port (if (string-match ":" server)
+                  (prog1
+                      (substring server (match-end 0))
+                    (setq server (substring server 0 (match-beginning 0)))))))
+    (url-do-terminal-emulator type server port name)))
+
+(fset 'url-rlogin 'url-generic-emulator-loader)
+(fset 'url-telnet 'url-generic-emulator-loader)
+(fset 'url-tn3270 'url-generic-emulator-loader)
+
+(defun url-proxy (url)
+  ;; Retrieve URL from a proxy.
+  ;; Expects `url-using-proxy' to be bound to the specific proxy to use."
+  (let ((urlobj (url-generic-parse-url url)))
+    (url-set-target urlobj nil)
+    (url-http url-using-proxy (url-recreate-url urlobj))))
+
+;; ftp://ietf.org/internet-drafts/draft-masinter-url-data-02.txt
+(defun url-data (url)
+  (set-buffer (get-buffer-create url-working-buffer))
+  (let ((content-type nil)
+       (encoding nil)
+       (data nil))
+    (cond
+     ((string-match "^data:\\([^;,]*\\);*\\([^,]*\\)," url)
+      (setq content-type (match-string 1 url)
+           encoding (match-string 2 url)
+           data (url-unhex-string (substring url (match-end 0))))
+      (if (= 0 (length content-type)) (setq content-type "text/plain"))
+      (if (= 0 (length encoding)) (setq encoding "8bit")))
+     (t nil))
+    (setq url-current-content-length (length data)
+         url-current-mime-type content-type
+         url-current-mime-encoding encoding
+         url-current-mime-headers (list (cons "content-type" content-type)
+                                        (cons "content-encoding" encoding)))
+    (and data (insert data))))
+
+(eval-and-compile
+  (condition-case ()
+      (require 'mm-decode)
+    (error (message "No content-id handling"))))
+       
+(defun url-cid-gnus (cid)
+  (set-buffer (get-buffer-create url-working-buffer))
+  (let ((content-type nil)
+       (encoding nil)
+       (part nil)
+       (data nil))
+    (setq part (mm-get-content-id cid))
+    (if (not part)
+       (message "Unknown CID encounterred: %s" cid)
+      (setq data (buffer-string nil nil (mm-handle-buffer part))
+           content-type (mm-handle-type part)
+           encoding (symbol-name (mm-handle-encoding part)))
+      (if (= 0 (length content-type)) (setq content-type "text/plain"))
+      (if (= 0 (length encoding)) (setq encoding "8bit"))
+      (if (listp content-type)
+         (setq content-type (car content-type)))
+      (setq url-current-content-length (length data)
+           url-current-mime-type content-type
+           url-current-mime-encoding encoding
+           url-current-mime-headers (list (cons "content-type" content-type)
+                                          (cons "content-encoding" encoding)))
+      (and data (insert data)))))
+
+(defun url-cid (url)
+  (if (not (string-match "^cid:\\(.*\\)" url))
+      (message "Malformed CID URL: %s" url)
+    (setq url (url-unhex-string (match-string 1 url)))
+    (cond
+     ((fboundp 'mm-get-content-id)
+      ;; Using Pterodactyl Gnus or later
+      (url-cid-gnus url))
+     (t
+      (message "Unable to handle CID URL: %s" url)))))
+
+(provide 'url-misc)
diff --git a/lisp/url-news.el b/lisp/url-news.el
new file mode 100644
index 0000000..a4ec787
--- /dev/null
+++ b/lisp/url-news.el
@@ -0,0 +1,311 @@
+;;; url-news.el --- News Uniform Resource Locator retrieval code
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:10 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'url-vars)
+(require 'url-parse)
+
+(defgroup url-news nil
+  "News related options"
+  :group 'url)
+
+(defcustom url-news-use-article-mode nil
+  "*Whether to use Gnus' article mode for displaying news articles."
+  :type 'boolean
+  :group 'url-news)
+
+(defun url-format-news ()
+  (url-clear-tmp-buffer)
+  (insert "HTTP/1.0 200 Retrieval OK\r\n"
+         (save-excursion
+           (set-buffer nntp-server-buffer)
+           (buffer-string)))
+  (url-parse-mime-headers)
+  (let* ((from  (cdr (assoc "from" url-current-mime-headers)))
+        (qfrom (if from (url-insert-entities-in-string from) nil))
+        (subj  (cdr (assoc "subject" url-current-mime-headers)))
+        (qsubj (if subj (url-insert-entities-in-string subj) nil))
+        (org   (cdr (assoc "organization" url-current-mime-headers)))
+        (qorg  (if org (url-insert-entities-in-string org) nil))
+        (typ   (or (cdr (assoc "content-type" url-current-mime-headers))
+                   "text/plain"))
+        (inhibit-read-only t)
+        (qgrps (mapcar 'car
+                       (url-split
+                        (url-insert-entities-in-string
+                         (or (cdr (assoc "newsgroups" 
+                                         url-current-mime-headers))
+                             ""))
+                        "[ \t\n,]+")))
+        (qrefs (delete "" 
+                       (mapcar
+                        'url-insert-entities-in-string
+                        (mapcar 'car
+                                (url-split
+                                 (or (cdr (assoc "references" 
+                                                 url-current-mime-headers))
+                                     "")
+                                 "[ \t,\n<>]+")))))
+        (date  (cdr (assoc "date" url-current-mime-headers))))
+    (if (or (not (string-match "text/" typ))
+           (string-match "text/html" typ))
+       nil                             ; Let natural content-type take over
+      (if (and (fboundp 'gnus-article-mode)
+              url-news-use-article-mode)
+         (progn
+           (kill-buffer (current-buffer))
+           (set-buffer (get-buffer-create "Emacs/W3 News"))
+           (erase-buffer)
+           (insert
+            (save-excursion
+              (set-buffer nntp-server-buffer)
+              (save-restriction
+                (widen)
+                (buffer-string))))
+           (let ((gnus-article-buffer (current-buffer))
+                 (gnus-article-current (cons "url"
+                                             (car (cdr (current-time))))))
+             (gnus-article-mode)
+             (run-hooks 'gnus-article-display-hook))
+           (goto-char (point-min))
+           (display-buffer (current-buffer)))
+       (insert "<html>\n"
+               " <head>\n"
+               "  <title>" qsubj "</title>\n"
+               "  <link rev=\"made\" href=\"mailto:"; qfrom "\">\n"
+               " </head>\n"
+               " <body>\n"
+               "  <div>\n"
+               "   <h1 align=center>" qsubj "</h1>\n"
+               "   <p role=\"headers\">\n"
+               "    <b>From</b>: " qfrom "<br>\n"
+               "    <b>Newsgroups</b>: "
+               (mapconcat
+                (function
+                 (lambda (grp)
+                   (concat "<a href=\"" grp "\">" grp "</a>"))) qgrps ", ")
+               "<br>\n"
+               (if org
+                   (concat
+                    "    <b>Organization</b>: <i> " qorg "</i> <br>\n")
+                 "")
+               "    <b>Date</b>: <date> " date "</date> <br>\n"
+               "   </p> <hr>\n"
+               (if (null qrefs)
+                   ""
+                 (concat
+                  "   <p>References\n"
+                  "    <ol>\n"
+                  (mapconcat
+                   (function
+                    (lambda (ref)
+                      (concat "     <li> <a href=\"" ref "\"> " 
+                              ref "</a></li>\n")))
+                   qrefs "")
+                  "    </ol>\n"
+                  "   </p>\n"
+                  "   <hr>\n"))
+               "   <ul plain>\n"
+               "    <li><a href=\"newspost:disfunctional\"> "
+               "Post to this group </a></li>\n"
+               "    <li><a href=\"mailto:"; qfrom "\"> Reply to " qfrom
+               "</a></li>\n"
+               "   </ul>\n"
+               "   <hr>"
+               "   <pre>\n")
+       (let ((s (buffer-substring (point) (point-max))))
+         (delete-region (point) (point-max))
+         (insert (url-insert-entities-in-string s)))
+       (goto-char (point-max))
+       (setq url-current-mime-type "text/html"
+             url-current-mime-viewer (mm-mime-info url-current-mime-type nil 
5))
+       (let ((x (assoc "content-type" url-current-mime-headers)))
+         (if x
+             (setcdr x "text/html")
+           (setq url-current-mime-headers (cons (cons "content-type"
+                                                      "text/html")
+                                                url-current-mime-headers))))
+       (insert "\n"
+               "   </pre>\n"
+               "  </div>\n"
+               " </body>\n"
+               "</html>\n"
+               "<!-- Automatically generated by URL/" url-version
+               "-->")))))
+
+(defun url-check-gnus-version ()
+  (require 'nntp)
+  (condition-case ()
+      (require 'gnus)
+    (error (setq gnus-version "GNUS not found")))
+  (if (or (not (boundp 'gnus-version))
+         (string-match "v5.[.0-9]+$" gnus-version)
+         (string-match "Red" gnus-version)
+         (string-match "Quassia" gnus-version)
+         (string-match "Pterodactyl" gnus-version))
+      nil
+    (url-warn 'url (concat
+                   "The version of GNUS found on this system is too old and 
does\n"
+                   "not support the necessary functionality for the URL 
package.\n"
+                   "Please upgrade to version 5.x of GNUS.  This is bundled 
by\n"
+                   "default with Emacs 19.30 and XEmacs 19.14 and later.\n\n"
+                   "This version of GNUS is: " gnus-version "\n"))
+    (fset 'url-news 'url-news-version-too-old))
+  (fset 'url-check-gnus-version 'ignore))
+
+(defun url-news-version-too-old (article)
+  (set-buffer (get-buffer-create url-working-buffer))
+  (setq url-current-mime-headers '(("content-type" . "text/html"))
+       url-current-mime-type "text/html")
+  (insert "<html>\n"
+         " <head>\n"
+         "  <title>News Error</title>\n"
+         " </head>\n"
+         " <body>\n"
+         "  <h1>News Error - too old</h1>\n"
+         "  <p>\n"
+         "   The version of GNUS found on this system is too old and does\n"
+         "   not support the necessary functionality for the URL package.\n"
+         "   Please upgrade to version 5.x of GNUS.  This is bundled by\n"
+         "   default with Emacs 19.30 and XEmacs 19.14 and later.\n\n"
+         "   This version of GNUS is: " gnus-version "\n"
+         "  </p>\n"
+         " </body>\n"
+         "</html>\n"))
+
+(defun url-news-open-host (host port user pass)
+  (if (fboundp 'nnheader-init-server-buffer)
+      (nnheader-init-server-buffer))
+  (nntp-open-server host (list (string-to-int port)))
+  (if (and user pass)
+      (progn
+       (nntp-send-command "^.*\r?\n" "AUTHINFO USER" user)
+       (nntp-send-command "^.*\r?\n" "AUTHINFO PASS" pass)
+       (if (not (nntp-server-opened host))
+           (url-warn 'url (format "NNTP authentication to `%s' as `%s' failed"
+                                  host user))))))
+
+(defun url-news-fetch-article-number (newsgroup article)
+  (nntp-request-group newsgroup)
+  (nntp-request-article article))
+
+(defun url-news-fetch-message-id (host port message-id)
+  (if (eq ?> (aref message-id (1- (length message-id))))
+      nil
+    (setq message-id (concat "<" message-id ">")))
+  (if (nntp-request-article message-id)
+      (url-format-news)
+    (set-buffer (get-buffer-create url-working-buffer))
+    (setq url-current-can-be-cached nil)
+    (insert "<html>\n"
+           " <head>\n"
+           "  <title>Error</title>\n"
+           " </head>\n"
+           " <body>\n"
+           "  <div>\n"
+           "   <h1>Error requesting article...</h1>\n"
+           "   <p>\n"
+           "    The status message returned by the NNTP server was:"
+           "<br><hr>\n"
+           "    <xmp>\n"
+           (nntp-status-message)
+           "    </xmp>\n"
+           "   </p>\n"
+           "   <p>\n"
+           "    If you If you feel this is an error, <a href=\""
+           "mailto:"; url-bug-address "\">send me mail</a>\n"
+           "   </p>\n"
+           "  </div>\n"
+           " </body>\n"
+           "</html>\n"
+           "<!-- Automatically generated by URL v" url-version " -->\n"
+           )))
+
+(defun url-news-fetch-newsgroup (newsgroup host)
+  (if (string-match "^/+" newsgroup)
+      (setq newsgroup (substring newsgroup (match-end 0))))
+  (if (string-match "/+$" newsgroup)
+      (setq newsgroup (substring newsgroup 0 (match-beginning 0))))
+
+  ;; This saves a bogus 'Untitled' buffer by Emacs-W3
+  (kill-buffer url-working-buffer)
+  
+  ;; This saves us from checking new news if GNUS is already running
+  (if (or (not (get-buffer gnus-group-buffer))
+         (save-excursion
+           (set-buffer gnus-group-buffer)
+           (not (eq major-mode 'gnus-group-mode))))
+      (gnus))
+  (set-buffer gnus-group-buffer)
+  (goto-char (point-min))
+  (gnus-group-read-ephemeral-group newsgroup (list 'nntp host)
+                                  nil
+                                  (cons (current-buffer) 'browse)))
+  
+(defun url-news (article)
+  ;; Find a news reference
+  (url-check-gnus-version)
+  (let* ((urlobj (url-generic-parse-url article))
+        (host (or (url-host urlobj) url-news-server))
+        (port (or (url-port urlobj)
+                  (cdr-safe (assoc "news" url-default-ports))))
+        (article-brackets nil)
+        (article (url-filename urlobj)))
+    (url-news-open-host host port (url-user urlobj) (url-password urlobj))
+    (cond
+     ((string-match "@" article)       ; Its a specific article
+      (url-news-fetch-message-id host port article))
+     ((string= article "")             ; List all newsgroups
+      (gnus)
+      (kill-buffer url-working-buffer))
+     (t                                        ; Whole newsgroup
+      (url-news-fetch-newsgroup article host)))))
+
+(defun url-nntp (url)
+  ;; Find a news reference
+  (url-check-gnus-version)
+  (let* ((urlobj (url-generic-parse-url url))
+        (host (or (url-host urlobj) url-news-server))
+        (port (or (url-port urlobj)
+                  (cdr-safe (assoc "nntp" url-default-ports))))
+        (article-brackets nil)
+        (article (url-filename urlobj)))
+    (url-news-open-host host port (url-user urlobj) (url-password urlobj))
+    (cond
+     ((string-match "@" article)       ; Its a specific article
+      (url-news-fetch-message-id host port article))
+     ((string-match "/\\([0-9]+\\)$" article)
+      (url-news-fetch-article-number (substring article 0
+                                               (match-beginning 0))
+                                    (match-string 1 article)))
+                                               
+     ((string= article "")             ; List all newsgroups
+      (gnus)
+      (kill-buffer url-working-buffer))
+     (t                                        ; Whole newsgroup
+      (url-news-fetch-newsgroup article host)))))
+
+(provide 'url-news)
diff --git a/lisp/url-nfs.el b/lisp/url-nfs.el
new file mode 100644
index 0000000..66e5fbb
--- /dev/null
+++ b/lisp/url-nfs.el
@@ -0,0 +1,73 @@
+;;; url-nfs.el --- NFS URL interface
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:10 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'url-vars)
+(require 'url-parse)
+(require 'cl)
+
+(defvar url-nfs-automounter-directory-spec
+  "file:/net/%h%f"
+  "*How to invoke the NFS automounter.  Certain % sequences are recognized.
+
+%h -- the hostname of the NFS server
+%n -- the port # of the NFS server
+%u -- the username to use to authenticate
+%p -- the password to use to authenticate
+%f -- the filename on the remote server
+%% -- a literal %
+
+Each can be used any number of times.")
+
+(defun url-nfs-unescape (format host port user pass file)
+  (save-excursion
+    (set-buffer (get-buffer-create " *nfs-parse*"))
+    (erase-buffer)
+    (insert format)
+    (goto-char (point-min))
+    (while (re-search-forward "%\\(.\\)" nil t)
+       (let ((escape (aref (match-string 1) 0)))
+        (replace-match "" t t)
+        (case escape
+          (?% (insert "%"))
+          (?h (insert host))
+          (?n (insert (or port "")))
+          (?u (insert (or user "")))
+          (?p (insert (or pass "")))
+          (?f (insert (or file "/"))))))
+    (buffer-string)))
+
+(defun url-nfs (url)
+  (let* ((urlobj (url-generic-parse-url url))
+        (host (url-host urlobj))
+        (port (string-to-int (url-port urlobj)))
+        (pass (url-password urlobj))
+        (user (url-user urlobj))
+        (file (url-filename urlobj)))
+    (url-retrieve (url-nfs-unescape url-nfs-automounter-directory-spec
+                                   host port user pass file))))
+    
diff --git a/lisp/url-ns.el b/lisp/url-ns.el
new file mode 100644
index 0000000..f0731a9
--- /dev/null
+++ b/lisp/url-ns.el
@@ -0,0 +1,106 @@
+;;; url-ns.el --- Various netscape-ish functions for proxy definitions
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:12 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1997, 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'url-gw)
+
+;;;###autoload
+(defun isPlainHostName (host)
+  (not (string-match "\\." host)))
+
+;;;###autoload
+(defun dnsDomainIs (host dom)
+  (string-match (concat (regexp-quote dom) "$") host))
+
+;;;###autoload
+(defun dnsResolve (host)
+  (url-gateway-nslookup-host host))
+
+;;;###autoload
+(defun isResolvable (host)
+  (if (string-match "^[0-9.]+$" host)
+      t
+    (not (string= host (url-gateway-nslookup-host host)))))
+
+;;;###autoload
+(defun isInNet (ip net mask)
+  (let ((netc (split-string ip "\\."))
+       (ipc  (split-string net "\\."))
+       (maskc (split-string mask "\\.")))
+    (if (or (/= (length netc) (length ipc))
+           (/= (length ipc) (length maskc)))
+       nil
+      (setq netc (mapcar 'string-to-int netc)
+           ipc (mapcar 'string-to-int ipc)
+           maskc (mapcar 'string-to-int maskc))
+      (and
+       (= (logand (nth 0 netc) (nth 0 maskc))
+         (logand (nth 0 ipc)  (nth 0 maskc)))
+       (= (logand (nth 1 netc) (nth 1 maskc))
+         (logand (nth 1 ipc)  (nth 1 maskc)))
+       (= (logand (nth 2 netc) (nth 2 maskc))
+         (logand (nth 2 ipc)  (nth 2 maskc)))
+       (= (logand (nth 3 netc) (nth 3 maskc))
+         (logand (nth 3 ipc)  (nth 3 maskc)))))))
+
+;; Netscape configuration file parsing
+(defvar url-ns-user-prefs nil
+  "Internal, do not use.")
+
+;;;###autoload
+(defun url-ns-prefs (&optional file)
+  (if (not file)
+      (setq file (expand-file-name "~/.netscape/preferences.js")))
+  (if (not (and (file-exists-p file)
+               (file-readable-p file)))
+      (message "Could not open %s for reading" file)
+    (save-excursion
+      (let ((false nil)
+           (true t))
+       (setq url-ns-user-prefs (make-hash-table :size 13 :test 'equal))
+       (set-buffer (get-buffer-create " *ns-parse*"))
+       (erase-buffer)
+       (insert-file-contents file)
+       (goto-char (point-min))
+       (while (re-search-forward "^//" nil t)
+         (replace-match ";;"))
+       (goto-char (point-min))
+       (while (re-search-forward "^user_pref(" nil t)
+         (replace-match "(url-ns-set-user-pref "))
+       (goto-char (point-min))
+       (while (re-search-forward "\"," nil t)
+         (replace-match "\""))
+       (goto-char (point-min))
+       (eval-buffer)))))
+
+(defun url-ns-set-user-pref (key val)
+  (cl-puthash key val url-ns-user-prefs))
+
+;;;###autoload
+(defun url-ns-user-pref (key &optional default)
+  (cl-gethash key url-ns-user-prefs default))
+
+(provide 'url-ns)
diff --git a/lisp/url-parse.el b/lisp/url-parse.el
new file mode 100644
index 0000000..3af622f
--- /dev/null
+++ b/lisp/url-parse.el
@@ -0,0 +1,194 @@
+;;; url-parse.el --- Uniform Resource Locator parser
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:09 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defmacro url-type (urlobj)
+  (` (aref (, urlobj) 0)))
+
+(defmacro url-user (urlobj)
+  (` (aref (, urlobj) 1)))
+
+(defmacro url-password (urlobj)
+  (` (aref (, urlobj) 2)))
+
+(defmacro url-host (urlobj)
+  (` (aref (, urlobj) 3)))
+
+(defmacro url-port (urlobj)
+  (` (or (aref (, urlobj) 4)
+        (if (url-fullness (, urlobj))
+            (cdr-safe (assoc (url-type (, urlobj)) url-default-ports))))))
+
+(defmacro url-filename (urlobj)
+  (` (aref (, urlobj) 5)))
+
+(defmacro url-target (urlobj)
+  (` (aref (, urlobj) 6)))
+
+(defmacro url-attributes (urlobj)
+  (` (aref (, urlobj) 7)))
+
+(defmacro url-fullness (urlobj)
+  (` (aref (, urlobj) 8)))
+
+(defmacro url-set-type (urlobj type)
+  (` (aset (, urlobj) 0 (, type))))
+
+(defmacro url-set-user (urlobj user)
+  (` (aset (, urlobj) 1 (, user))))
+
+(defmacro url-set-password (urlobj pass)
+  (` (aset (, urlobj) 2 (, pass))))
+
+(defmacro url-set-host (urlobj host)
+  (` (aset (, urlobj) 3 (, host))))
+
+(defmacro url-set-port (urlobj port)
+  (` (aset (, urlobj) 4 (, port))))
+
+(defmacro url-set-filename (urlobj file)
+  (` (aset (, urlobj) 5 (, file))))
+
+(defmacro url-set-target (urlobj targ)
+  (` (aset (, urlobj) 6 (, targ))))
+
+(defmacro url-set-attributes (urlobj targ)
+  (` (aset (, urlobj) 7 (, targ))))
+
+(defmacro url-set-full (urlobj val)
+  (` (aset (, urlobj) 8 (, val))))
+  
+(defun url-recreate-url (urlobj)
+  (concat (url-type urlobj) ":" (if (url-host urlobj) "//" "")
+         (if (url-user urlobj)
+             (concat (url-user urlobj)
+                     (if (url-password urlobj)
+                         (concat ":" (url-password urlobj)))
+                     "@"))
+         (url-host urlobj)
+         (if (and (url-port urlobj)
+                  (not (equal (url-port urlobj)
+                              (cdr-safe (assoc (url-type urlobj)
+                                               url-default-ports)))))
+             (concat ":" (url-port urlobj)))
+         (or (url-filename urlobj) "/")
+         (if (url-target urlobj)
+             (concat "#" (url-target urlobj)))
+         (if (url-attributes urlobj)
+             (concat ";"
+                     (mapconcat
+                      (function
+                       (lambda (x)
+                         (if (cdr x)
+                             (concat (car x) "=" (cdr x))
+                           (car x)))) (url-attributes urlobj) ";")))))
+
+(defun url-generic-parse-url (url)
+  "Return a vector of the parts of URL.
+Format is:
+[proto username password hostname portnumber file reference attributes fullp]"
+  (cond
+   ((null url)
+    (make-vector 9 nil))
+   ((or (not (string-match url-nonrelative-link url))
+       (= ?/ (string-to-char url)))
+    (let ((retval (make-vector 9 nil)))
+      (url-set-filename retval url)
+      (url-set-full retval nil)
+      retval))
+   (t
+    (save-excursion
+      (set-buffer (get-buffer-create " *urlparse*"))
+      (set-syntax-table url-mailserver-syntax-table)
+      (let ((save-pos nil)
+           (prot nil)
+           (user nil)
+           (pass nil)
+           (host nil)
+           (port nil)
+           (file nil)
+           (refs nil)
+           (attr nil)
+           (full nil)
+           (inhibit-read-only t))
+       (erase-buffer)
+       (insert url)
+       (goto-char (point-min))
+       (setq save-pos (point))
+       (if (not (looking-at "//"))
+           (progn
+             (skip-chars-forward "a-zA-Z+.\\-")
+             (downcase-region save-pos (point))
+             (setq prot (buffer-substring save-pos (point)))
+             (skip-chars-forward ":")
+             (setq save-pos (point))))
+
+       ;; We are doing a fully specified URL, with hostname and all
+       (if (looking-at "//")
+           (progn
+             (setq full t)
+             (forward-char 2)
+             (setq save-pos (point))
+             (skip-chars-forward "^/")
+             (setq host (buffer-substring save-pos (point)))
+             (if (string-match "^\\(address@hidden)@" host)
+                 (setq user (url-match host 1)
+                       host (substring host (match-end 0) nil)))
+             (if (and user (string-match "\\([^:]+\\):\\(.*\\)" user))
+                 (setq pass (url-match user 2)
+                       user (url-match user 1)))
+             (if (string-match ":\\([0-9+]+\\)" host)
+                 (setq port (url-match host 1)
+                       host (substring host 0 (match-beginning 0))))
+             (if (string-match ":$" host)
+                 (setq host (substring host 0 (match-beginning 0))))
+             (setq host (downcase host)
+                   save-pos (point))))
+       ;; Now check for references
+       (setq save-pos (point))
+       (skip-chars-forward "^#")
+       (if (eobp)
+           nil
+          (delete-region
+           (point)
+           (progn
+             (skip-chars-forward "#")
+             (setq refs (buffer-substring (point) (point-max)))
+             (point-max))))
+       (goto-char save-pos)
+       (skip-chars-forward "^;")
+       (if (not (eobp))
+           (setq attr (mm-parse-args (point) (point-max))
+                 attr (nreverse attr)))
+       (setq file (buffer-substring save-pos (point)))
+       (and port (string= port (or (cdr-safe (assoc prot url-default-ports))
+                                   ""))
+            (setq port nil))
+       (if (and host (string-match "%[0-9][0-9]" host))
+           (setq host (url-unhex-string host)))
+       (vector prot user pass host port file refs attr full)))))) 
+
+(provide 'url-parse)
diff --git a/lisp/url-pgp.el b/lisp/url-pgp.el
new file mode 100644
index 0000000..970aa2c
--- /dev/null
+++ b/lisp/url-pgp.el
@@ -0,0 +1,175 @@
+;;; url-pgp.el --- PGP encapsulation of HTTP
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:09 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'url-vars)
+(require 'url-parse)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; UUencoding
+;;; ----------
+;;; These functions are needed for the (RI)PEM encoding.  PGP can
+;;; handle binary data, but (RI)PEM requires that it be uuencoded
+;;; first, or it will barf severely.  How rude.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun url-uuencode-buffer (&optional buff)
+  "UUencode buffer BUFF, with a default of the current buffer."
+  (setq buff (or buff (current-buffer)))
+  (save-excursion
+    (set-buffer buff)
+    (url-lazy-message "UUencoding...")
+    (call-process-region (point-min) (point-max)
+                        url-uuencode-program t t nil "url-temp-file")
+    (url-lazy-message "UUencoding... done.")))
+
+(defun url-uudecode-buffer (&optional buff)
+  "UUdecode buffer BUFF, with a default of the current buffer."
+  (setq buff (or buff (current-buffer)))
+  (let ((newname (url-generate-unique-filename)))
+    (save-excursion
+      (set-buffer buff)
+      (goto-char (point-min))
+      (re-search-forward "^begin [0-9][0-9][0-9] \\(.*\\)$" nil t)
+      (replace-match (concat "begin 600 " newname))
+      (url-lazy-message "UUdecoding...")
+      (call-process-region (point-min) (point-max) url-uudecode-program)
+      (url-lazy-message "UUdecoding...")
+      (erase-buffer)
+      (insert-file-contents-literally newname)
+      (url-lazy-message "UUdecoding... done.")
+      (condition-case ()
+         (delete-file newname)
+       (error nil)))))
+      
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Decoding PGP/PEM responses
+;;; --------------------------
+;;; A PGP/PEM encrypted/signed response contains all the real headers,
+;;; so this is just a quick decrypt-then-reparse hack.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun url-decode-pgp/pem (arg)
+  "Decode a pgp/pem response from an HTTP/1.0 server.
+This expects the decoded message to contain all the necessary HTTP/1.0 headers
+to correctly act on the decoded message (new content-type, etc)."
+  (mc-decrypt-message)
+  (url-parse-mime-headers))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; PGP/PEM Encryption
+;;; ------------------
+;;; This implements the highly secure PGP/PEM encrypted requests, as
+;;; specified by NCSA and CERN.
+;;;
+;;; The complete online spec of this scheme was done by Tony Sanders
+;;; <address@hidden>, and can be seen at
+;;; http://www.bsdi.com/HTTP:TNG/ripem-http.txt
+;;;
+;;; This section of code makes use of the EXCELLENT mailcrypt.el
+;;; package by Jin S Choi (address@hidden)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun url-public-key-exists (entity scheme)
+  "Return t iff a key for ENTITY exists using public key system SCHEME.
+ENTITY is the username/hostname combination we are checking for.
+SCHEME is a symbol representing what public key encryption program to use.
+       Currently only 'pgp (Pretty Good Privacy) and 'pem (RIPEM) are
+       recognized."
+  (let (retval)
+    (save-excursion
+      (cond
+       ((eq 'pgp scheme)                       ; PGP encryption
+       (set-buffer (get-buffer-create " *keytmp*"))
+       (erase-buffer)
+       (call-process mc-pgp-path nil t nil "+batchmode" "-kxaf" entity)
+       (goto-char (point-min))
+       (setq retval (search-forward mc-pgp-key-begin-line nil t)))
+       ((eq 'pem scheme)                       ; PEM encryption
+       (set-buffer (find-file-noselect mc-ripem-pubkeyfile))
+       (goto-char (point-min))
+       (setq retval (search-forward entity nil t)))
+       (t
+       (url-warn 'security
+                 (format
+                  "Bad value for SCHEME in url-public-key-exists %s"
+                  scheme))))
+      (kill-buffer (current-buffer)))
+    retval))
+
+(defun url-get-server-keys (entity &optional scheme)
+  "Make sure the key for ENTITY exists using SCHEME.
+ENTITY is the username/hostname combination to get the info for.  
+       This should be a string you could pass to 'finger'.
+SCHEME is a symbol representing what public key encryption program to use.
+       Currently only 'pgp (Pretty Good Privacy) and 'pem (RIPEM) are
+       recognized."
+  (or scheme (setq scheme mc-default-scheme))
+  (save-excursion
+    (cond
+     ((url-public-key-exists entity scheme) nil)
+     (t
+      (string-match "\\(address@hidden)@\\(.*\\)" entity)
+      (let ((url-working-buffer " *url-get-keys*"))
+       (url-retrieve (format "gopher://%s:79/0%s/w"; (url-match entity 1)
+                            (url-match entity 2)))
+       (mc-snarf-keys)
+       (kill-buffer url-working-buffer))))))
+   
+(defun url-fetch-with-pgp (url recipient type)
+  "Retrieve a document with public-key authentication.
+      URL is the url to request from the server.
+RECIPIENT is the server's entity name (usually address@hidden)
+     TYPE is a symbol representing what public key encryption program to use.
+          Currently only 'pgp (Pretty Good Privacy) and 'pem (RIPEM) are
+          recognized."
+  (or noninteractive (require 'mailcrypt))
+  (let ((request (url-create-mime-request url "PGP-Redirect"))
+       (url-request-data nil)
+       (url-request-extra-headers nil))
+    (save-excursion
+      (url-get-server-keys recipient type)
+      (set-buffer (get-buffer-create " *url-encryption*"))
+      (erase-buffer)
+      (insert "\n\n" mail-header-separator "\n" request)
+      (mc-encrypt-message recipient type)
+      (goto-char (point-min))
+      (if (re-search-forward (concat "\n" mail-header-separator "\n") nil t)
+         (delete-region (point-min) (point)))
+      (setq url-request-data (buffer-string)
+           url-request-extra-headers
+           (list (cons "Authorized" (format "%s entity=\"%s\""
+                                            (cond
+                                             ((eq type 'pgp) "PGP")
+                                             ((eq type 'pem) "PEM"))
+                                            url-pgp/pem-entity))
+                 (cons "Content-type" (format "application/x-www-%s-reply"
+                                              (cond
+                                               ((eq type 'pgp) "pgp")
+                                               ((eq type 'pem) "pem")))))))
+    (kill-buffer " *url-encryption*")
+    (url-retrieve (url-expand-file-name "/") t)))
+     
+(provide 'url-pgp)
diff --git a/lisp/url-vars.el b/lisp/url-vars.el
new file mode 100644
index 0000000..0803177
--- /dev/null
+++ b/lisp/url-vars.el
@@ -0,0 +1,606 @@
+;;; url-vars.el --- Variables for Uniform Resource Locator tool
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:12 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(eval-and-compile
+  (condition-case ()
+      (require 'custom)
+    (error nil))
+  (if (and (featurep 'custom) (fboundp 'custom-declare-variable))
+      nil ;; We've got what we needed
+    ;; We have the old custom-library, hack around it!
+    (defmacro defgroup (&rest args)
+      nil)
+    (defmacro defcustom (var value doc &rest args) 
+      (` (defvar (, var) (, value) (, doc))))))
+
+(defconst url-version (let ((x "$State: Exp $"))
+                       (if (string-match "State: \\([^ \t\n]+\\)" x)
+                           (substring x (match-beginning 1) (match-end 1))
+                         x))
+  "Version # of URL package.")
+
+(defgroup url nil
+  "Uniform Resource Locator tool"
+  :group 'hypermedia)
+
+(defgroup url-file nil
+  "URL storage"
+  :prefix "url-"
+  :group 'url)
+
+(defgroup url-cache nil
+  "URL cache"
+  :prefix "url-"
+  :prefix "url-cache-"
+  :group 'url)
+
+(defgroup url-history nil
+  "History variables in the URL package"
+  :prefix "url-"
+  :group 'url)
+
+(defgroup url-cookie nil
+  "URL cookies"
+  :prefix "url-"
+  :prefix "url-cookie-"
+  :group 'url)
+
+(defgroup url-mime nil
+  "MIME options of URL"
+  :prefix "url-"
+  :group 'url)
+
+(defgroup url-hairy nil
+  "Hairy options of URL"
+  :prefix "url-"
+  :group 'url)
+
+
+(defvar url-current-can-be-cached t
+  "*Whether the current URL can be cached.")
+
+(defvar url-current-object nil
+  "A parsed representation of the current url")
+
+(defvar url-current-callback-func nil
+  "*The callback function for the current buffer.")
+
+(defvar url-current-callback-data nil
+  "*The data to be passed to the callback function.  This should be a list,
+each item in the list will be an argument to the url-current-callback-func.")
+
+(mapcar 'make-variable-buffer-local '(
+                                     url-current-callback-data
+                                     url-current-callback-func
+                                     url-current-can-be-cached
+                                     url-current-content-length
+                                     url-current-isindex
+                                     url-current-mime-encoding
+                                     url-current-mime-headers
+                                     url-current-mime-type
+                                     url-current-mime-charset
+                                     url-current-mime-viewer
+                                     url-current-object
+                                     url-current-referer
+
+                                     ;; obsolete
+                                     ;; url-current-file
+                                     ;; url-current-port
+                                     ;; url-current-server
+                                     ;; url-current-type
+                                     ;; url-current-user
+                                     ))
+
+(defvar url-cookie-storage nil         "Where cookies are stored.")
+(defvar url-cookie-secure-storage nil  "Where secure cookies are stored.")
+(defcustom url-cookie-file nil            "*Where cookies are stored on disk."
+  :type '(choice (const :tag "Default" :value nil) file)
+  :group 'url-file
+  :group 'url-cookie)
+
+(defcustom url-default-retrieval-proc 'url-default-callback
+  "*The default action to take when an asynchronous retrieval completes."
+  :type 'function
+  :group 'url-hairy)
+
+(defcustom url-honor-refresh-requests t
+  "*Whether to do automatic page reloads at the request of the document
+author or the server via the `Refresh' header in an HTTP/1.0 response.
+If nil, no refresh requests will be honored.
+If t, all refresh requests will be honored.
+If non-nil and not t, the user will be asked for each refresh request."
+  :type '(choice (const :tag "off" nil)
+                (const :tag "on" t)
+                (const :tag "ask" 'ask))
+  :group 'url-hairy)
+
+(defcustom url-inhibit-mime-parsing nil
+  "Whether to parse out (and delete) the MIME headers from a message."
+  :type 'boolean
+  :group 'url-mime)
+
+(defcustom url-automatic-caching nil
+  "*If non-nil, all documents will be automatically cached to the local
+disk."
+  :type 'boolean
+  :group 'url-cache)
+
+(defcustom url-cache-expired
+  (function (lambda (t1 t2) (>= (- (car t2) (car t1)) 5)))
+  "*A function (`funcall'able) that takes two times as its arguments, and
+returns non-nil if the second time is 'too old' when compared to the first
+time."
+  :type 'function
+  :group 'url-cache)
+
+(defvar url-bug-address "address@hidden"
+  "Where to send bug reports.")
+
+(defcustom url-cookie-confirmation nil
+  "*If non-nil, confirmation by the user is required to accept HTTP cookies."
+  :type 'boolean
+  :group 'url-cookie)
+
+(defcustom url-personal-mail-address nil
+  "*Your full email address.
+This is what is sent to HTTP/1.0 servers as the FROM field in an HTTP/1.0
+request."
+  :type '(choice (const nil) string)
+  :group 'url)
+
+(defcustom url-directory-index-file "index.html"
+  "*The filename to look for when indexing a directory.
+If this file exists, and is readable, then it will be viewed instead of
+using `dired' to view the directory."
+  :type 'string
+  :group 'url-file)
+
+(defcustom url-privacy-level '(email)
+  "*How private you want your requests to be.
+HTTP/1.0 has header fields for various information about the user, including
+operating system information, email addresses, the last page you visited, etc.
+This variable controls how much of this information is sent.
+
+This should a symbol or a list.
+Valid values if a symbol are:
+none     -- Send all information
+low      -- Don't send the last location
+high     -- Don't send the email address or last location
+paranoid -- Don't send anything
+
+If a list, this should be a list of symbols of what NOT to send.
+Valid symbols are:
+email    -- the email address
+os       -- the operating system info
+lastloc  -- the last location
+agent    -- Do not send the User-Agent string
+cookie   -- never accept HTTP cookies
+
+Samples:
+
+ (setq url-privacy-level 'high)
+ (setq url-privacy-level '(email lastloc))    ;; equivalent to 'high
+ (setq url-privacy-level '(os))
+
+::NOTE::
+This variable controls several other variables and is _NOT_ automatically
+updated.  Call the function `url-setup-privacy-info' after modifying this
+variable."
+  :type '(radio (const :tag "None (you believe in the basic goodness of 
humanity)"
+                      :value none)
+               (const :tag "Low (do not reveal last location)"
+                      :value low)
+               (const :tag "High (no email address or last location)"
+                      :value high)
+               (const :tag "Paranoid (reveal nothing!)"
+                      :value paranoid)
+               (checklist :tag "Custom"
+                          (const :tag "Email address" :value email)
+                          (const :tag "Operating system" :value os)
+                          (const :tag "Last location" :value lastloc)
+                          (const :tag "Browser identification" :value agent)
+                          (const :tag "No cookies" :value cookie)))
+  :group 'url)
+
+(defvar url-history-list nil "List of urls visited this session.")
+
+(defvar url-inhibit-uncompression nil "Do not do decompression if non-nil.")
+
+(defcustom url-keep-history nil
+  "*Controls whether to keep a list of all the URLS being visited.
+If non-nil, url will keep track of all the URLS visited.
+If eq to `t', then the list is saved to disk at the end of each emacs
+session."
+  :type 'boolean
+  :group 'url-history)
+
+(defcustom url-uncompressor-alist '((".z"  . "x-gzip")
+                                   (".gz" . "x-gzip")
+                                   (".uue" . "x-uuencoded")
+                                   (".hqx" . "x-hqx")
+                                   (".Z"  . "x-compress"))
+  "*An assoc list of file extensions and the appropriate
+content-transfer-encodings for each."
+  :type '(repeat (cons :format "%v"
+                      (string :tag "Extension")
+                      (string :tag "Encoding")))
+  :group 'url-mime)
+
+(defcustom url-mail-command 'url-mail
+  "*This function will be called whenever url needs to send mail.
+It should enter a mail-mode-like buffer in the current window.
+The commands mail-to and mail-subject should still work in this
+buffer, and it should use mail-header-separator if possible."
+  :type 'function
+  :group 'url)
+
+(defcustom url-proxy-services nil
+  "*An assoc list of access types and servers that gateway them.
+Looks like ((\"http\" . \"hostname:portnumber\") ....)  This is set up
+from the ACCESS_proxy environment variables in url-do-setup."
+  :type '(repeat (cons :format "%v"
+                      (string :tag "Protocol")
+                      (string :tag "Proxy")))
+  :group 'url)
+
+(defcustom url-global-history-file nil
+  "*The global history file used by both Mosaic/X and the url package.
+This file contains a list of all the URLs you have visited.  This file
+is parsed at startup and used to provide URL completion."
+  :type '(choice (const :tag "Default" :value nil) file)
+  :group 'url-history)
+
+(defcustom url-global-history-save-interval 3600
+  "*The number of seconds between automatic saves of the history list.
+Default is 1 hour.  Note that if you change this variable outside of
+the `customize' interface after `url-do-setup' has been run, you need
+to run the `url-setup-save-timer' function manually."
+  :set (function (lambda (var val)
+                  (set-default var val)
+                  (and (featurep 'url)
+                       (fboundp 'url-setup-save-timer)
+                       (url-setup-save-timer))))
+  :type 'integer
+  :group 'url-history)
+
+(defvar url-global-history-timer nil)
+
+(defcustom url-passwd-entry-func nil
+  "*This is a symbol indicating which function to call to read in a
+password.  It will be set up depending on whether you are running EFS
+or ange-ftp at startup if it is nil.  This function should accept the
+prompt string as its first argument, and the default value as its
+second argument."
+  :type '(choice (const :tag "Guess" :value nil)
+                (const :tag "Use Ange-FTP" :value ange-ftp-read-passwd)
+                (const :tag "Use EFS"      :value efs-read-passwd)
+                (const :tag "Use Password Package" :value read-passwd)
+                (function :tag "Other"))
+  :group 'url-hairy)
+
+(defcustom url-gopher-labels
+  '(("0" . "(TXT)")
+    ("1" . "(DIR)")
+    ("2" . "(CSO)")
+    ("3" . "(ERR)")
+    ("4" . "(MAC)")
+    ("5" . "(PCB)")
+    ("6" . "(UUX)")
+    ("7" . "(???)")
+    ("8" . "(TEL)")
+    ("T" . "(TN3)")
+    ("9" . "(BIN)")
+    ("g" . "(GIF)")
+    ("I" . "(IMG)")
+    ("h" . "(WWW)")
+    ("s" . "(SND)"))
+  "*An assoc list of gopher types and how to describe them in the gopher
+menus.  These can be any string, but HTML/HTML+ entities should be
+used when necessary, or it could disrupt formatting of the document
+later on.  It is also a good idea to make sure all the strings are the
+same length after entity references are removed, on a strictly
+stylistic level."
+  :type '(repeat (cons (string :tag "Type")
+                      (string :tag "Description")))
+  :group 'url-hairy)
+
+(defcustom url-gopher-icons
+  '(
+    ("0" . "&text.document;")
+    ("1" . "&folder;")
+    ("2" . "&index;")
+    ("3" . "&stop;")
+    ("4" . "&binhex.document;")
+    ("5" . "&binhex.document;")
+    ("6" . "&uuencoded.document;")
+    ("7" . "&index;")
+    ("8" . "&telnet;")
+    ("T" . "&tn3270;")
+    ("9" . "&binary.document;")
+    ("g" . "&image;")
+    ("I" . "&image;")
+    ("s" . "&audio;"))
+  "*An assoc list of gopher types and the graphic entity references to
+show when possible."
+  :type '(repeat (cons (string :tag "Type")
+                      (string :tag "Icon")))
+  :group 'url-hairy)
+
+(defcustom url-standalone-mode nil "*Rely solely on the cache?"
+  :type 'boolean
+  :group 'url-cache)
+(defcustom url-multiple-p t
+  "*If non-nil, multiple queries are possible through ` *URL-<i>*' buffers"
+  :type 'boolean
+  :group 'url-hairy)
+(defvar url-default-working-buffer " *URL*" " The default buffer to do all of 
the processing in.")
+(defvar url-working-buffer url-default-working-buffer
+  "The buffer to do all of the processing in.
+It defaults to `url-default-working-buffer' and is bound to *URL-<i>*
+buffers when used for multiple requests, cf. `url-multiple-p'")
+(defvar url-current-referer nil "Referer of this page.")
+(defvar url-current-content-length nil "Current content length.")
+(defvar url-current-isindex nil "Is the current document a searchable index?")
+(defvar url-current-mime-encoding nil "MIME encoding of current document.")
+(defvar url-current-mime-headers nil "An alist of MIME headers.")
+(defvar url-current-mime-type nil "MIME type of current document.")
+(defvar url-current-mime-charset nil "MIME charset of current document.")
+(defvar url-current-mime-viewer nil "How to view the current MIME doc.")
+(defvar url-current-passwd-count 0 "How many times password has failed.")
+(defvar url-gopher-types "0123456789+gIThws:;<"
+  "A string containing character representations of all the gopher types.")
+(defvar url-mime-separator-chars (mapcar 'identity
+                                       (concat "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+                                               "abcdefghijklmnopqrstuvwxyz"
+                                               "0123456789'()+_,-./=?"))
+  "Characters allowable in a MIME multipart separator.")
+
+(defcustom url-bad-port-list
+  '("25" "119" "19")
+  "*List of ports to warn the user about connecting to.  Defaults to just
+the mail, chargen, and NNTP ports so you cannot be tricked into sending
+fake mail or forging messages by a malicious HTML document."
+  :type '(repeat (string :tag "Port"))
+  :group 'url-hairy)
+
+(defcustom url-be-anal-about-file-attributes nil
+  "*Whether to use HTTP/1.0 to figure out file attributes
+or just guess based on file extension, etc."
+  :type 'boolean
+  :group 'url-mime)
+
+(defcustom url-be-asynchronous nil
+  "*Controls whether document retrievals over HTTP should be done in
+the background.  This allows you to keep working in other windows
+while large downloads occur."
+  :type 'boolean
+  :group 'url)
+(make-variable-buffer-local 'url-be-asynchronous)
+
+(defvar url-mime-content-type-charset-regexp
+  ";[ \t]*charset=\"?\\([^\"]+\\)\"?"
+  "Regexp used in parsing `Content-Type' for a charset indication")
+
+(defvar url-request-data nil "Any data to send with the next request.")
+
+(defvar url-request-extra-headers nil
+  "A list of extra headers to send with the next request.  Should be
+an assoc list of headers/contents.")
+
+(defvar url-request-method nil "The method to use for the next request.")
+
+(defvar url-mime-encoding-string nil
+  "*String to send to the server in the Accept-encoding: field in HTTP/1.0
+requests.  This is created automatically from mm-content-transfer-encodings.")
+
+(defcustom url-mime-language-string nil
+  "*String to send to the server in the Accept-language: field in
+HTTP/1.0 requests."
+  :type '(radio
+         (const :tag "None (get default language version)" :value nil)
+         (const :tag "Any (get first available language version)" :value "*")
+         (string :tag "Other"))
+  :group 'url-mime
+  :group 'i18n)
+
+(defvar url-mime-accept-string nil
+  "String to send to the server in the Accept: field in HTTP/1.0 requests.
+This is created automatically from url-mime-viewers, after the mailcap file
+has been parsed.")
+
+(defvar url-history-changed-since-last-save nil
+  "Whether the history list has changed since the last save operation.")
+
+(defvar url-proxy-basic-authentication nil
+  "Internal structure - do not modify!")
+  
+(defvar url-registered-protocols nil
+  "Internal structure - do not modify!  See `url-register-protocol'")
+
+(defvar url-package-version "Unknown" "Version # of package using URL.")
+
+(defvar url-package-name "Unknown" "Version # of package using URL.")
+
+(defvar url-system-type nil "What type of system we are on.")
+(defvar url-os-type nil "What OS we are on.")
+
+(defcustom url-max-password-attempts 5
+  "*Maximum number of times a password will be prompted for when a
+protected document is denied by the server."
+  :type 'integer
+  :group 'url)
+
+(defcustom url-temporary-directory (or (getenv "TMPDIR") "/tmp")
+  "*Where temporary files go."
+  :type 'directory
+  :group 'url-file)
+
+(defcustom url-show-status t
+  "*Whether to show a running total of bytes transferred.  Can cause a
+large hit if using a remote X display over a slow link, or a terminal
+with a slow modem."
+  :type 'boolean
+  :group 'url)
+
+(defvar url-using-proxy nil
+  "Either nil or the fully qualified proxy URL in use, e.g.
+http://www.domain.com/";)
+
+(defcustom url-news-server nil
+  "*The default news server to get newsgroups/articles from if no server
+is specified in the URL.  Defaults to the environment variable NNTPSERVER
+or \"news\" if NNTPSERVER is undefined."
+  :type '(choice (const :tag "None" :value nil) string)
+  :group 'url)
+
+(defcustom url-gopher-to-mime
+  '((?0 . "text/plain")                        ; It's a file
+    (?1 . "www/gopher")                        ; Gopher directory
+    (?2 . "www/gopher-cso-search")     ; CSO search
+    (?3 . "text/plain")                        ; Error
+    (?4 . "application/mac-binhex40")  ; Binhexed macintosh file
+    (?5 . "application/pc-binhex40")   ; DOS binary archive of some sort
+    (?6 . "archive/x-uuencode")                ; Unix uuencoded file
+    (?7 . "www/gopher-search")         ; Gopher search!
+    (?9 . "application/octet-stream")  ; Binary file!
+    (?g . "image/gif")                 ; Gif file
+    (?I . "image/gif")                 ; Some sort of image
+    (?h . "text/html")                 ; HTML source
+    (?s . "audio/basic")               ; Sound file
+    )
+  "*An assoc list of gopher types and their corresponding MIME types."
+  :type '(repeat (cons sexp string))
+  :group 'url-hairy)
+
+(defcustom url-use-hypertext-gopher t
+  "*Controls how gopher documents are retrieved.
+If non-nil, the gopher pages will be converted into HTML and parsed
+just like any other page.  If nil, the requests will be passed off to
+the gopher.el package by Scott Snyder.  Using the gopher.el package
+will lose the gopher+ support, and inlined searching."
+  :type 'boolean
+  :group 'url)
+
+(defvar url-global-history-hash-table nil
+  "Hash table for global history completion.")
+
+(defvar url-nonrelative-link
+  "^\\([-a-zA-Z0-9+.]+:\\)"
+  "A regular expression that will match an absolute URL.")
+
+(defcustom url-confirmation-func 'y-or-n-p
+  "*What function to use for asking yes or no functions.  Possible
+values are 'yes-or-no-p or 'y-or-n-p, or any function that takes a
+single argument (the prompt), and returns t only if a positive answer
+is gotten."
+  :type '(choice (const :tag "Short (y or n)" :value y-or-n-p)
+                (const :tag "Long (yes or no)" :value yes-or-no-p)
+                (function :tag "Other"))
+  :group 'url-hairy)
+
+(defcustom url-gateway-method 'native
+  "*The type of gateway support to use.
+Should be a symbol specifying how we are to get a connection off of the
+local machine.
+
+Currently supported methods:
+'telnet        :: Run telnet in a subprocess to connect
+'rlogin         :: Rlogin to another machine to connect
+'socks          :: Connects through a socks server
+'ssl            :: Connection should be made with SSL
+'tcp            :: Use the excellent tcp.el package from gnus.
+                   This simply does a (require 'tcp), then sets
+                   url-gateway-method to be 'native.
+'native                :: Use the native open-network-stream in emacs
+"
+  :type '(radio (const :tag "Telnet to gateway host" :value telnet)
+               (const :tag "Rlogin to gateway host" :value rlogin)
+               (const :tag "Use SOCKS proxy" :value socks)
+               (const :tag "Use SSL for all connections" :value ssl)
+               (const :tag "Use the `tcp' package" :value tcp)
+               (const :tag "Direct connection" :value native))
+  :group 'url-hairy)
+
+(defvar url-running-xemacs (string-match "XEmacs" emacs-version)
+  "*Got XEmacs?")
+
+(defvar url-default-ports '(("http"   .  "80")
+                           ("gopher" .  "70")
+                           ("telnet" .  "23")
+                           ("news"   . "119")
+                           ("https"  . "443")
+                           ("shttp"  .  "80"))
+  "An assoc list of protocols and default port #s")
+
+(defvar url-setup-done nil "*Has setup configuration been done?")
+
+(defvar url-source nil
+  "*Whether to force a sourcing of the next buffer.  This forces local
+files to be read into a buffer, no matter what.  Gets around the
+optimization that if you are passing it to a viewer, just make a
+symbolic link, which looses if you want the source for inlined
+images/etc.")
+
+(defconst weekday-alist
+  '(("Sunday" . 0) ("Monday" . 1) ("Tuesday" . 2) ("Wednesday" . 3)
+    ("Thursday" . 4) ("Friday" . 5) ("Saturday" . 6)
+    ("Tues" . 2) ("Thurs" . 4)
+    ("Sun" . 0) ("Mon" . 1) ("Tue" . 2) ("Wed" . 3)
+    ("Thu" . 4) ("Fri" . 5) ("Sat" . 6)))
+
+(defconst monthabbrev-alist
+  '(("Jan" . 1) ("Feb" . 2) ("Mar" . 3) ("Apr" . 4) ("May" . 5) ("Jun" . 6)
+    ("Jul" . 7) ("Aug" . 8) ("Sep" . 9) ("Oct" . 10) ("Nov" . 11) ("Dec" . 12))
+  )
+
+(defvar url-lazy-message-time 0)
+
+(defvar url-extensions-header "Security/Digest Security/SSL")
+
+(defvar url-mailserver-syntax-table
+  (copy-syntax-table emacs-lisp-mode-syntax-table)
+  "*A syntax table for parsing the mailserver URL")
+
+(modify-syntax-entry ?' "\"" url-mailserver-syntax-table)
+(modify-syntax-entry ?` "\"" url-mailserver-syntax-table)
+(modify-syntax-entry ?< "(>" url-mailserver-syntax-table)
+(modify-syntax-entry ?> ")<" url-mailserver-syntax-table)
+(modify-syntax-entry ?/ " " url-mailserver-syntax-table)
+
+(defvar url-handle-no-scheme-hook nil
+  "*Hooks to be run until one can successfully transform an incomplete URL.
+
+Each hook is called with a single argument URL and should return a tranformed
+url with a valid scheme (e.g., \"gnu\" --> \"http://www.gnu.org/\";), or nil
+otherwise.")
+
+;;; Make OS/2 happy - yeeks
+(defvar        tcp-binary-process-input-services nil
+  "*Make OS/2 happy with our CRLF pairs...")
+
+(provide 'url-vars)
diff --git a/lisp/url-wais.el b/lisp/url-wais.el
new file mode 100644
index 0000000..0efbce0
--- /dev/null
+++ b/lisp/url-wais.el
@@ -0,0 +1,251 @@
+;;; url-wais.el --- WAIS Uniform Resource Locator retrieval code
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:09 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'url-vars)
+(require 'url-parse)
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; WAIS support
+;;; ------------
+;;; Here are even more gross hacks that I call native WAIS support.
+;;; This code requires a working waisq program that is fully
+;;; compatible with waisq from think.com
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun url-create-wais-source (server port dbase)
+  ;; Create a temporary wais source description file.  Returns the
+  ;; file name the description is in.
+  (let ((x (url-generate-unique-filename))
+       (y (get-buffer-create " *waisq-tmp*")))
+    (save-excursion
+      (set-buffer y)
+      (erase-buffer)
+      (insert 
+       (format
+       (concat "(:source\n:version 3\n"
+               ":ip-name \"%s\"\n:tcp-port %s\n"
+               ":database-name \"%s\"\n)")
+       server (if (equal port "") "210" port) dbase))
+      (write-region (point-min) (point-max) x nil nil)
+      (kill-buffer y))
+    x))
+
+(defun url-wais-stringtoany (str)
+  ;; Return a wais subelement that specifies STR in any database
+  (concat "(:any :size " (length str) " :bytes #( "
+         (mapconcat 'identity str " ")
+         " ) )"))
+
+;(defun url-retrieve-wais-docid (server port dbase local-id)
+;  (call-process "waisretrieve" nil url-working-buffer nil
+;              (format "%s:address@hidden:%s" (url-unhex-string local-id)
+;                      dbase server port)))
+
+;(url-retrieve-wais-docid "quake.think.com" "210" "directory-of-servers"
+;                      "0 2608 /proj/wais/wais-sources/vpiej-l.src")
+(defun url-retrieve-wais-docid (server port dbase local-id)
+  ;; Retrieve a wais document.
+  ;; SERVER is the server the database is on (:ip-name in source description)
+  ;; PORT is the port number to contact (:tcp-port in the source description)
+  ;; DBASE is the database name (:database-name in the source description)
+  ;; LOCAL-ID is the document (:original-local-id in the question description)
+  (let* ((dbf (url-create-wais-source server port dbase))
+        (qstr (format
+               (concat "(:question :version 2\n"
+                       "           :result-documents\n"
+                       "           ( (:document-id\n"
+                       "              :document\n"
+                       "              (:document\n"
+                       "               :headline \"\"\n"
+                       "               :doc-id\n"
+                       "               (:doc-id :original-database %s\n"
+                       "                :original-local-id %s )\n"
+                       "               :number-of-bytes -1\n"
+                       "               :type \"\"\n"
+                       "               :source\n"
+                       "               (:source-id :filename \"%s\") ) ) ) )")
+               (url-wais-stringtoany dbase)
+               (url-wais-stringtoany (url-unhex-string local-id))
+               dbf))
+        (qf (url-generate-unique-filename)))
+    (set-buffer (get-buffer-create url-working-buffer))
+    (insert qstr)
+    (write-region (point-min) (point-max) qf nil nil)
+    (erase-buffer)
+    (call-process url-waisq-prog nil url-working-buffer nil "-f" qf "-v" "1")
+    (save-excursion
+      (set-buffer url-working-buffer)
+      (setq url-current-file (url-unhex-string local-id)))
+    (condition-case ()
+       (delete-file dbf)
+      (error nil))
+    (condition-case ()
+       (delete-file qf)
+      (error nil))))
+
+;(url-perform-wais-query "quake.think.com" "210" "directory-of-servers" "SGML")
+(defun url-perform-wais-query (server port dbase search)
+  ;; Perform a wais query.
+  ;; SERVER is the server the database is on (:ip-name in source description)
+  ;; PORT is the port number to contact (:tcp-port in the source description)
+  ;; DBASE is the database name (:database-name in the source description)
+  ;; SEARCH is the search term (:seed-words in the question description)"
+  (let ((dbfname (url-create-wais-source server port dbase))
+       (qfname (url-generate-unique-filename))
+       (results 'url-none-gotten))
+    (save-excursion
+      (url-clear-tmp-buffer)
+      (insert
+       (format
+       (concat "(:question\n"
+               " :version 2\n"
+               " :seed-words \"%s\"\n"
+               " :sourcepath \"" url-temporary-directory "\"\n"
+               " :sources\n"
+               " (  (:source-id\n"
+               "     :filename \"%s\"\n"
+               "    )\n"
+               " )\n"
+               " :maximum-results 100)\n")
+       search dbfname))
+      (write-region (point-min) (point-max) qfname nil nil)
+      (erase-buffer)
+      (call-process url-waisq-prog nil url-working-buffer nil "-g" "-f" qfname)
+      (set-buffer url-working-buffer)
+      (erase-buffer)
+      (setq url-current-server server
+           url-current-port port
+           url-current-file dbase)
+      (insert-file-contents-literally qfname)
+      (goto-char (point-min))
+      (if (re-search-forward "(:question" nil t)
+         (delete-region (point-min) (match-beginning 0)))
+      (url-replace-regexp "Process.*finished.*" "")
+      (subst-char-in-region (point-min) (point-max) 35 32)
+      (goto-char (point-min))
+      (message "Done reading info - parsing results...")
+      (if (re-search-forward ":result-documents[^(]+" nil t)
+         (progn
+           (goto-char (match-end 0))
+           (while (eq results 'url-none-gotten)
+             (condition-case ()
+                 (setq results (read (current-buffer)))
+               (error (progn
+                        (setq results 'url-none-gotten)
+                        (goto-char (match-end 0))))))
+           (erase-buffer)
+           (insert "<title>Results of WAIS search</title>\n"
+                   "<h1>Searched " dbase " for " search "</h1>\n"
+                   "<hr>\n"
+                   "Found <b>" (int-to-string (length results))
+                   "</b> matches.\n"
+                   "<ol>\n<li>"
+                   (mapconcat 'url-parse-wais-doc-id results "\n<li>")
+                   "\n</ol>\n<hr>\n"))
+       (message "No results"))
+      (setq url-current-mime-type "text/html")
+      (condition-case ()
+         (delete-file qfname)
+       (error nil))
+      (condition-case ()
+         (delete-file dbfname)
+       (error nil)))))
+
+(defun url-wais-anytostring (x)
+  ;; Convert a (:any ....) wais construct back into a string.
+  (mapconcat 'char-to-string (car (cdr (memq ':bytes x))) ""))
+
+(defun url-parse-wais-doc-id (x)
+  ;; Return a list item that points at the doc-id specified by X
+  (let* ((document (car (cdr (memq ':document x))))
+        (doc-id (car (cdr (memq ':doc-id document))))
+        (score (car (cdr (memq ':score x)))) 
+        (title (car (cdr (memq ':headline document))))
+        (type (car (cdr (memq ':type document))))
+        (size (car (cdr (memq ':number-of-bytes document))))
+        (server (car (cdr (memq ':original-server doc-id))))
+        (dbase (car (cdr (memq ':original-database doc-id))))
+        (localid (car (cdr (memq ':original-local-id doc-id))))
+        (dist-server (car (cdr (memq ':distributor-server doc-id))))
+        (dist-dbase (car (cdr (memq ':distributor-database doc-id))))
+        (dist-id (car (cdr (memq ':distributor-local-id doc-id))))
+        (copyright (or (car (cdr (memq ':copyright-disposition doc-id))) 0)))
+    (format "<a 
href=\"wais://%s:%s/%s/%s/%d/1=%s;2=%s;3=%s;4=%s;5=%s;6=%s;7=%d;\">%s (Score = 
%s)</a>"
+           url-current-server url-current-port url-current-file
+           type size
+           (url-hexify-string (url-wais-anytostring server))
+           (url-hexify-string (url-wais-anytostring dbase))
+           (url-hexify-string (url-wais-anytostring localid))
+           (url-hexify-string (url-wais-anytostring dist-server))
+           (url-hexify-string (url-wais-anytostring dist-dbase))
+           (url-hexify-string (url-wais-anytostring dist-id))
+           copyright title score)))
+
+(defun url-grok-wais-href (url)
+  "Return a list of server, port, database, search-term, doc-id"
+  (if (string-match "wais:/+\\([^/:]+\\):*\\([^/]*\\)/+\\(.*\\)" url)
+      (let ((host (url-match url 1))
+           (port (url-match url 2))
+           (data (url-match url 3)))
+       (list host port data))
+    (make-list 3 nil)))
+
+(defun url-wais (url)
+  ;; Retrieve a document via WAIS
+  (if (and url-wais-gateway-server url-wais-gateway-port)
+      (url-retrieve
+       (format "http://%s:%s/%s";
+              url-wais-gateway-server
+              url-wais-gateway-port
+              (substring url (match-end 0) nil)))
+    (let ((href (url-grok-wais-href url)))
+      (url-clear-tmp-buffer)
+      (setq url-current-type "wais"
+           url-current-server (nth 0 href)
+           url-current-port (nth 1 href)
+           url-current-file (nth 2 href))
+      (cond
+       ((string-match "2=\\(.*\\);3=\\([^ ;]+\\)" (nth 2 href)); full link
+       (url-retrieve-wais-docid (nth 0 href) (nth 1 href)
+                               (url-match (nth 2 href) 1)
+                               (url-match (nth 2 href) 2)))
+       ((string-match "\\([^\\?]+\\)\\?\\(.*\\)" (nth 2 href)) ; stored query
+       (url-perform-wais-query (nth 0 href) (nth 1 href)
+                              (url-match (nth 2 href) 1)
+                              (url-match (nth 2 href) 2)))
+       (t
+       (insert "<title>WAIS search</title>\n"
+               "<h1>WAIS search of " (nth 2 href) "</h1>"
+               "<hr>\n"
+               (format "<form action=\"%s\" 
enctype=\"application/x-w3-wais\">\n" url)
+               "Enter search term: <input name=\"internal-wais\">\n"
+               "</form>\n"
+               "<hr>\n"))))))
+
+(provide 'url-wais)
+
diff --git a/lisp/url.el b/lisp/url.el
new file mode 100644
index 0000000..69eb201
--- /dev/null
+++ b/lisp/url.el
@@ -0,0 +1,2114 @@
+;;; url.el --- Uniform Resource Locator retrieval tool
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:12 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, data, processes, hypermedia
+
+;;; LCD Archive Entry:
+;;; url|William M. Perry|address@hidden|
+;;; Functions for retrieving/manipulating URLs|
+;;; $Date: 1998/12/01 22:12:12 $|$Revision: 1.1 $|Location Undetermined
+;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+
+(require 'cl)
+(require 'url-vars)
+(require 'url-parse)
+(require 'mm)
+(require 'mule-sysdp)
+(require 'devices)
+(or (featurep 'efs)
+    (featurep 'efs-auto)
+    (condition-case ()
+       (require 'ange-ftp)
+      (error nil)))
+
+(eval-and-compile
+  (if (not (and (string-match "XEmacs" emacs-version)
+               (or (> emacs-major-version 19)
+                   (>= emacs-minor-version 14))))
+      (require 'w3-sysdp)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Functions that might not exist in old versions of emacs
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun url-save-error (errobj)
+  (save-excursion
+    (set-buffer (get-buffer-create " *url-error*"))
+    (erase-buffer))
+  (display-error errobj (get-buffer-create " *url-error*")))
+
+(cond
+ ((fboundp 'display-warning)
+  (fset 'url-warn 'display-warning))
+ ((fboundp 'w3-warn)
+  (fset 'url-warn 'w3-warn))
+ ((fboundp 'warn)
+  (defun url-warn (class message &optional level)
+    (warn "(%s/%s) %s" class (or level 'warning) message)))
+ (t
+  (defun url-warn (class message &optional level)
+    (save-excursion
+      (set-buffer (get-buffer-create "*W3-WARNINGS*"))
+      (goto-char (point-max))
+      (save-excursion
+       (insert (format "(%s/%s) %s\n" class (or level 'warning) message)))
+      (display-buffer (current-buffer))))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Autoload all the URL loaders
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(autoload 'url-file "url-file")
+(autoload 'url-ftp "url-file")
+(autoload 'url-gopher "url-gopher")
+(autoload 'url-irc "url-irc")
+(autoload 'url-http "url-http")
+(autoload 'url-nfs "url-nfs")
+(autoload 'url-mailserver "url-mail")
+(autoload 'url-mailto "url-mail")
+(autoload 'url-mail "url-mail")
+(autoload 'url-info "url-misc")
+(autoload 'url-shttp "url-http")
+(autoload 'url-https "url-http")
+(autoload 'url-data "url-misc")
+(autoload 'url-finger "url-misc")
+(autoload 'url-rlogin "url-misc")
+(autoload 'url-telnet "url-misc")
+(autoload 'url-tn3270 "url-misc")
+(autoload 'url-proxy "url-misc")
+(autoload 'url-netrek "url-misc")
+(autoload 'url-news "url-news")
+(autoload 'url-nntp "url-news")
+(autoload 'url-cid "url-misc")
+
+(autoload 'url-open-stream "url-gw")
+(autoload 'url-mime-response-p "url-http")
+(autoload 'url-parse-mime-headers "url-http")
+(autoload 'url-handle-refresh-header "url-http")
+(autoload 'url-create-mime-request "url-http")
+(autoload 'url-create-message-id "url-http")
+(autoload 'url-create-multipart-request "url-http")
+(autoload 'url-parse-viewer-types "url-http")
+
+(autoload 'url-get-authentication "url-auth")
+(autoload 'url-register-auth-scheme "url-auth")
+(autoload 'url-cookie-write-file "url-cookie")
+(autoload 'url-cookie-retrieve "url-cookie")
+(autoload 'url-cookie-generate-header-lines "url-cookie")
+(autoload 'url-cookie-handle-set-cookie "url-cookie")
+
+(autoload 'url-is-cached "url-cache")
+(autoload 'url-store-in-cache "url-cache")
+(autoload 'url-is-cached "url-cache")
+(autoload 'url-cache-create-filename "url-cache")
+(autoload 'url-cache-extract "url-cache")
+(autoload 'url-cache-expired "url-cache")
+
+(require 'md5)
+(require 'base64)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; File-name-handler-alist functions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun url-setup-file-name-handlers ()
+  ;; Setup file-name handlers.
+  '(cond
+    ((not (boundp 'file-name-handler-alist))
+     nil)                              ; Don't load if no alist
+    ((rassq 'url-file-handler file-name-handler-alist)
+     nil)                              ; Don't load twice
+    (t
+     (setq file-name-handler-alist
+          (let ((new-handler (cons
+                              (concat "^/*"
+                                      (substring url-nonrelative-link1 nil))
+                              'url-file-handler)))
+            (if file-name-handler-alist
+                (append (list new-handler) file-name-handler-alist)
+              (list new-handler)))))))
+  
+(defun url-file-handler (operation &rest args)
+  ;; Function called from the file-name-handler-alist routines.  OPERATION
+  ;; is what needs to be done ('file-exists-p, etc).  args are the arguments
+  ;; that would have been passed to OPERATION."
+  (let ((fn (get operation 'url-file-handlers))
+       (url (car args))
+       (myargs (cdr args)))
+    (if (= (string-to-char url) ?/)
+       (setq url (substring url 1 nil)))
+    (if fn (apply fn url myargs)
+      (let (file-name-handler-alist)
+       (apply operation url myargs)))))
+
+(defun url-file-handler-identity (&rest args)
+  (car args))
+
+(defun url-file-handler-null (&rest args)
+  nil)
+
+(put 'file-directory-p 'url-file-handlers 'url-file-handler-null)
+(put 'substitute-in-file-name 'url-file-handlers 'url-file-handler-identity)
+(put 'file-writable-p 'url-file-handlers 'url-file-handler-null)
+(put 'file-truename 'url-file-handlers 'url-file-handler-identity)
+(put 'insert-file-contents 'url-file-handlers 'url-insert-file-contents)
+(put 'expand-file-name 'url-file-handlers 'url-expand-file-name)
+(put 'directory-files 'url-file-handlers 'url-directory-files)
+(put 'file-directory-p 'url-file-handlers 'url-file-directory-p)
+(put 'file-writable-p 'url-file-handlers 'url-file-writable-p)
+(put 'file-readable-p 'url-file-handlers 'url-file-exists)
+(put 'file-executable-p 'url-file-handlers 'null)
+(put 'file-symlink-p 'url-file-handlers 'null)
+(put 'file-exists-p 'url-file-handlers 'url-file-exists)
+(put 'copy-file 'url-file-handlers 'url-copy-file)
+(put 'file-attributes 'url-file-handlers 'url-file-attributes)
+(put 'file-name-all-completions 'url-file-handlers
+     'url-file-name-all-completions)
+(put 'file-name-completion 'url-file-handlers 'url-file-name-completion)
+(put 'file-local-copy 'url-file-handlers 'url-file-local-copy)
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Utility functions
+;;; -----------------
+;;; Various functions used around the url code.
+;;; Some of these qualify as hacks, but hey, this is elisp.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(if (fboundp 'mm-string-to-tokens)
+    (fset 'url-string-to-tokens 'mm-string-to-tokens)
+  (defun url-string-to-tokens (str &optional delim)
+    "Return a list of words from the string STR"
+    (setq delim (or delim ? ))
+    (let (results y)
+      (mapcar
+       (function
+       (lambda (x)
+         (cond
+          ((and (= x delim) y) (setq results (cons y results) y nil))
+          ((/= x delim) (setq y (concat y (char-to-string x))))
+          (t nil)))) str)
+      (nreverse (cons y results)))))
+
+(defun url-days-between (date1 date2)
+  ;; Return the number of days between date1 and date2.
+  (- (url-day-number date1) (url-day-number date2)))
+
+(defun url-day-number (date)
+  (let ((dat (mapcar (function (lambda (s) (and s (string-to-int s)) ))
+                    (timezone-parse-date date))))
+    (timezone-absolute-from-gregorian 
+     (nth 1 dat) (nth 2 dat) (car dat))))
+
+(defun url-seconds-since-epoch (date)
+  ;; Returns a number that says how many seconds have
+  ;; lapsed between Jan 1 12:00:00 1970 and DATE."
+  (let* ((tdate (mapcar (function (lambda (ti) (and ti (string-to-int ti))))
+                       (timezone-parse-date date)))
+        (ttime (mapcar (function (lambda (ti) (and ti (string-to-int ti))))
+                       (timezone-parse-time
+                        (aref (timezone-parse-date date) 3))))
+        (edate (mapcar (function (lambda (ti) (and ti (string-to-int ti))))
+                       (timezone-parse-date "Jan 1 12:00:00 1970")))
+        (tday (- (timezone-absolute-from-gregorian 
+                  (nth 1 tdate) (nth 2 tdate) (nth 0 tdate))
+                 (timezone-absolute-from-gregorian 
+                  (nth 1 edate) (nth 2 edate) (nth 0 edate)))))
+    (+ (nth 2 ttime)
+       (* (nth 1 ttime) 60)
+       (* (nth 0 ttime) 60 60)
+       (* tday 60 60 24))))
+
+(defun url-match (s x)
+  ;; Return regexp match x in s.
+  (substring s (match-beginning x) (match-end x)))
+
+(defun url-split (str del)
+  ;; Split the string STR, with DEL (a regular expression) as the delimiter.
+  ;; Returns an assoc list that you can use with completing-read."
+  (let (x y)
+    (while (string-match del str)
+      (setq y (substring str 0 (match-beginning 0))
+           str (substring str (match-end 0) nil))
+      (if (not (string-match "^[ \t]+$" y))
+         (setq x (cons (list y y) x))))
+    (if (not (equal str ""))
+       (setq x (cons (list str str) x)))
+    x))
+
+(defun url-replace-regexp (regexp to-string)
+  (goto-char (point-min))
+  (while (re-search-forward regexp nil t)
+    (replace-match to-string t nil)))
+
+(defun url-clear-tmp-buffer ()
+  (set-buffer (get-buffer-create url-working-buffer))
+  (if buffer-read-only (toggle-read-only))
+  (erase-buffer))  
+
+(defun url-maybe-relative (url)
+  (url-retrieve (url-expand-file-name url)))
+
+(defun url-buffer-is-hypertext (&optional buff)
+  "Return t if a buffer contains HTML, as near as we can guess."
+  (setq buff (or buff (current-buffer)))
+  (save-excursion
+    (set-buffer buff)
+    (let ((case-fold-search t))
+      (goto-char (point-min))
+      (re-search-forward
+       "<\\(TITLE\\|HEAD\\|BASE\\|H[0-9]\\|ISINDEX\\|P\\)>" nil t))))
+
+(defun url-percentage (x y)
+  (if (fboundp 'float)
+      (round (* 100 (/ x (float y))))
+    (/ (* x 100) y)))
+
+(defun url-pretty-length (n)
+  (cond
+   ((< n 1024)
+    (format "%d bytes" n))
+   ((< n (* 1024 1024))
+    (format "%dk" (/ n 1024.0)))
+   (t
+    (format "%2.2fM" (/ n (* 1024 1024.0))))))
+
+(defun url-after-change-function (&rest args)
+  ;; The nitty gritty details of messaging the HTTP/1.0 status messages
+  ;; in the minibuffer."
+  (or url-current-content-length
+      (save-excursion
+       (goto-char (point-min))
+       (skip-chars-forward " \t\n")
+       (if (not (looking-at "HTTP/[0-9]\.[0-9]"))
+           (setq url-current-content-length 0)
+         (setq url-current-isindex
+               (and (re-search-forward "$\r*$" nil t) (point)))
+         (if (re-search-forward
+              "^content-type:[ \t]*\\([^\r\n]+\\)\r*$"
+              url-current-isindex t)
+             (setq url-current-mime-type (downcase
+                                          (url-eat-trailing-space
+                                           (buffer-substring
+                                            (match-beginning 1)
+                                            (match-end 1))))))
+         (goto-char (point-min))
+         (if (re-search-forward "^content-length:\\([^\r\n]+\\)\r*$"
+                                url-current-isindex t)
+             (setq url-current-content-length
+                   (string-to-int (buffer-substring (match-beginning 1)
+                                                    (match-end 1))))
+           (setq url-current-content-length nil))))
+      )
+  (let ((current-length (max (point-max)
+                            (if url-current-isindex
+                                (- (point-max) url-current-isindex)
+                              (point-max)))))
+    (cond
+     ((and url-current-content-length (> url-current-content-length 1)
+          url-current-mime-type)
+      (url-lazy-message "Reading [%s]... %s of %s (%d%%)"
+                       url-current-mime-type
+                       (url-pretty-length current-length)
+                       (url-pretty-length url-current-content-length)
+                       (url-percentage current-length
+                                       url-current-content-length)))
+     ((and url-current-content-length (> url-current-content-length 1))
+      (url-lazy-message "Reading... %s of %s (%d%%)"
+                       (url-pretty-length current-length)
+                       (url-pretty-length url-current-content-length)
+                       (url-percentage current-length
+                                       url-current-content-length)))
+     ((and (/= 1 current-length) url-current-mime-type)
+      (url-lazy-message "Reading [%s]... %s"
+                       url-current-mime-type
+                       (url-pretty-length current-length)))
+     ((/= 1 current-length)
+      (url-lazy-message "Reading... %s."
+                       (url-pretty-length current-length)))
+     (t (url-lazy-message "Waiting for response...")))))
+
+(defun url-insert-entities-in-string (string)
+  "Convert HTML markup-start characters to entity references in STRING.
+  Also replaces the \" character, so that the result may be safely used as
+  an attribute value in a tag.  Returns a new string with the result of the
+  conversion.  Replaces these characters as follows:
+    &  ==>  &amp;
+    <  ==>  &lt;
+    >  ==>  &gt;
+    \"  ==>  &quot;"
+  (if (string-match "[&<>\"]" string)
+      (save-excursion
+       (set-buffer (get-buffer-create " *entity*"))
+       (erase-buffer)
+       (buffer-disable-undo (current-buffer))
+       (insert string)
+       (goto-char (point-min))
+       (while (progn
+                (skip-chars-forward "^&<>\"")
+                (not (eobp)))
+         (insert (cdr (assq (char-after (point))
+                            '((?\" . "&quot;")
+                              (?& . "&amp;")
+                              (?< . "&lt;")
+                              (?> . "&gt;")))))
+         (delete-char 1))
+       (buffer-string))
+    string))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Information information
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar url-process-lookup-table nil)
+
+(defun url-process-get (proc prop &optional default)
+  "Get a value associated to PROC as property PROP
+         in plist stored in `url-process-lookup-table'"
+  (or (plist-get (cdr-safe (assq proc url-process-lookup-table)) prop)
+      default))
+
+(defun url-process-put (proc prop val)
+  "Associate to PROC as property PROP the value VAL
+         in plist stored in `url-process-lookup-table'"
+  (let ((node (assq proc url-process-lookup-table)))
+    (if (not node)
+       (setq url-process-lookup-table (cons (cons proc (list prop val))
+                                            url-process-lookup-table))
+      (setcdr node (plist-put (cdr node) prop val)))))
+
+(defun url-gc-process-lookup-table ()
+  (let (new)
+    (while url-process-lookup-table
+      (if (not (memq (process-status (caar url-process-lookup-table))
+                    '(stop closed nil)))
+         (setq new (cons (car url-process-lookup-table) new)))
+      (setq url-process-lookup-table (cdr url-process-lookup-table)))
+    (setq url-process-lookup-table new)))
+
+(defun url-process-list ()
+  (url-gc-process-lookup-table)
+  (let ((processes (process-list))
+       (retval nil))
+    (while processes
+      (if (url-process-get (car processes) 'url)
+         (setq retval (cons (car processes) retval)))
+      (setq processes (cdr processes)))
+    retval))
+    
+(defun url-list-processes ()
+  (interactive)
+  (let ((processes (url-process-list))
+       proc total-len len type url
+       (url-status-buf (get-buffer-create "URL Status Display")))
+    (set-buffer url-status-buf)
+    (erase-buffer)
+    (display-buffer url-status-buf)
+    (insert
+     (eval-when-compile (format "%-40s %-20s %-15s" "URL" "Size" "Type")) "\n"
+     (eval-when-compile (make-string 77 ?-)) "\n")
+    (while processes
+      (setq proc (car processes)
+           processes (cdr processes))
+      (save-excursion
+       (set-buffer (process-buffer proc))
+       (setq total-len url-current-content-length
+             len (max (point-max)
+                      (if url-current-isindex
+                          (- (point-max) url-current-isindex)
+                        (point-max)))
+             type url-current-mime-type
+             url (url-process-get proc 'url))
+       (set-buffer url-status-buf)
+       (insert
+        (format "%-40s%s%-20s %-15s\n"
+                (url-process-get proc 'url)
+                (if (> (length url) 40)
+                    (format "\n%-40s " " ")
+                  " ")
+                (if total-len
+                    (format "%d of %d" len total-len)
+                  (format "%d" len))
+                (or type "unknown")))))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; file-name-handler stuff calls this
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun url-have-visited-url (url &rest args)
+  "Return non-nil iff the user has visited URL before.
+The return value is a cons of the url and the date last accessed as a string"
+  (cl-gethash url url-global-history-hash-table))
+
+(defun url-directory-files (url &rest args)
+  "Return a list of files on a server."
+  nil)
+
+(defun url-file-writable-p (url &rest args)
+  "Return t iff a url is writable by this user"
+  nil)
+
+(defun url-copy-file (url &rest args)
+  "Copy a url to the specified filename."
+  nil)
+
+(defun url-file-directly-accessible-p (url)
+  "Returns t iff the specified URL is directly accessible
+on your filesystem.  (nfs, local file, etc)."
+  (let* ((urlobj (if (vectorp url) url (url-generic-parse-url url)))
+        (type (url-type urlobj)))
+    (and (member type '("file" "ftp"))
+        (not (url-host urlobj)))))
+
+;;;###autoload
+(defun url-file-attributes (url &rest args)
+  "Return a list of attributes of URL.
+Value is nil if specified file cannot be opened.
+Otherwise, list elements are:
+ 0. t for directory, string (name linked to) for symbolic link, or nil.
+ 1. Number of links to file.
+ 2. File uid.
+ 3. File gid.
+ 4. Last access time, as a list of two integers.
+  First integer has high-order 16 bits of time, second has low 16 bits.
+ 5. Last modification time, likewise.
+ 6. Last status change time, likewise.
+ 7. Size in bytes. (-1, if number is out of range).
+ 8. File modes, as a string of ten letters or dashes as in ls -l.
+    If URL is on an http server, this will return the content-type if possible.
+ 9. t iff file's gid would change if file were deleted and recreated.
+10. inode number.
+11. Device number.
+
+If file does not exist, returns nil."
+  (and url
+       (let* ((urlobj (url-generic-parse-url url))
+             (type (url-type urlobj))
+             (url-automatic-caching nil)
+             (data nil)
+             (exists nil))
+        (cond
+         ((equal type "http")
+          (cond
+           ((not url-be-anal-about-file-attributes)
+            (setq data (list
+                        (url-file-directory-p url) ; Directory
+                        1              ; number of links to it
+                        0              ; UID
+                        0              ; GID
+                        (cons 0 0)     ; Last access time
+                        (cons 0 0)     ; Last mod. time
+                        (cons 0 0)     ; Last status time
+                        -1             ; file size
+                        (mm-extension-to-mime
+                         (url-file-extension (url-filename urlobj)))
+                        nil            ; gid would change
+                        0              ; inode number
+                        0              ; device number
+                        )))
+           (t                          ; HTTP/1.0, use HEAD
+            (let ((url-request-method "HEAD")
+                  (url-request-data nil)
+                  (url-working-buffer " *url-temp*"))
+              (save-excursion
+                (condition-case ()
+                    (progn
+                      (url-retrieve url)
+                      (setq data (and
+                                  (setq exists
+                                        (cdr
+                                         (assoc "status"
+                                                url-current-mime-headers)))
+                                  (>= exists 200)
+                                  (< exists 300)
+                                  (list
+                                   (url-file-directory-p url) ; Directory
+                                   1   ; links to
+                                   0   ; UID
+                                   0   ; GID
+                                   (cons 0 0) ; Last access time
+                                   (cons 0 0) ; Last mod. time
+                                   (cons 0 0) ; Last status time
+                                   (or ; Size in bytes
+                                    (cdr (assoc "content-length"
+                                                url-current-mime-headers))
+                                    -1)
+                                   (or
+                                    (cdr (assoc "content-type"
+                                                url-current-mime-headers))
+                                    (mm-extension-to-mime
+                                     (url-file-extension
+                                      (url-filename urlobj)))) ; content-type
+                                   nil ; gid would change
+                                   0   ; inode number
+                                   0   ; device number
+                                   ))))
+                  (error nil))
+                (and (not data)
+                     (setq data (list (url-file-directory-p url)
+                                      1 0 0 (cons 0 0) (cons 0 0) (cons 0 0)
+                                      -1 (mm-extension-to-mime
+                                          (url-file-extension
+                                           (url-filename
+                                            url-current-object)))
+                                      nil 0 0)))
+                (kill-buffer " *url-temp*"))))))
+         ((member type '("ftp" "file"))
+          (let ((fname (if (url-host urlobj)
+                           (concat "/"
+                                   (if (url-user urlobj)
+                                       (concat (url-user urlobj) "@")
+                                     "")
+                                   (url-host urlobj) ":"
+                                   (url-filename urlobj))
+                         (url-filename urlobj))))
+            (setq data (or (file-attributes fname) (make-list 12 nil)))
+            (setcar (cdr (cdr (cdr (cdr (cdr (cdr (cdr (cdr data))))))))
+                    (mm-extension-to-mime (url-file-extension fname)))))
+         (t nil))
+        data)))
+
+(defun url-file-name-all-completions (file dirname &rest args)
+  "Return a list of all completions of file name FILE in directory DIR.
+These are all file names in directory DIR which begin with FILE."
+  ;; need to rewrite
+  )
+
+(defun url-file-name-completion (file dirname &rest args)
+  "Complete file name FILE in directory DIR.
+Returns the longest string
+common to all filenames in DIR that start with FILE.
+If there is only one and FILE matches it exactly, returns t.
+Returns nil if DIR contains no name starting with FILE."
+  (apply 'url-file-name-all-completions file dirname args))
+
+(defun url-file-local-copy (file &rest args)
+  "Copy the file FILE into a temporary file on this machine.
+Returns the name of the local copy, or nil, if FILE is directly
+accessible."
+  nil)
+
+(defun url-insert-file-contents (url &rest args)
+  "Insert the contents of the URL in this buffer."
+  (interactive "sURL: ")
+  (save-excursion
+    (let ((old-asynch (default-value 'url-be-asynchronous)))
+      (unwind-protect
+         (progn
+           (setq-default url-be-asynchronous nil)
+           (let ((buf (current-buffer))
+                 (url-working-buffer (cdr (url-retrieve url))))
+             (set-buffer url-working-buffer)
+             (url-uncompress)
+             (set-buffer buf)
+             (insert-buffer url-working-buffer)
+             (setq buffer-file-name url)
+             (save-excursion
+               (set-buffer url-working-buffer)
+               (set-buffer-modified-p nil))
+             (kill-buffer url-working-buffer)))
+       (setq-default url-be-asynchronous old-asynch)))))
+
+(defun url-file-directory-p (url &rest args)
+  "Return t iff a url points to a directory"
+  (equal (substring url -1 nil) "/"))
+
+(defun url-file-exists (url &rest args)
+  "Return t iff a file exists."
+  (let* ((urlobj (url-generic-parse-url url))
+        (type (url-type urlobj))
+        (exists nil))
+    (cond
+     ((equal type "http")              ; use head
+      (let ((url-request-method "HEAD")
+           (url-request-data nil)
+           (url-working-buffer " *url-temp*"))
+       (save-excursion
+         (url-retrieve url)
+         (setq exists (or (cdr
+                           (assoc "status" url-current-mime-headers)) 500))
+         (kill-buffer " *url-temp*")
+         (setq exists (and (>= exists 200) (< exists 300))))))
+     ((member type '("ftp" "file"))    ; file-attributes
+      (let ((fname (if (url-host urlobj)
+                      (concat "/"
+                              (if (url-user urlobj)
+                                  (concat (url-user urlobj) "@")
+                                "")
+                              (url-host urlobj) ":"
+                              (url-filename urlobj))
+                    (url-filename urlobj))))
+       (setq exists (file-exists-p fname))))
+     (t nil))
+    exists))
+
+;;;###autoload
+(defun url-normalize-url (url)
+  "Return a 'normalized' version of URL.  This strips out default port
+numbers, etc."
+  (let (type data grok retval)
+    (setq data (url-generic-parse-url url)
+         type (url-type data))
+    (if (member type '("www" "about" "mailto" "mailserver" "info"))
+       (setq retval url)
+      (url-set-target data nil)
+      (setq retval (url-recreate-url data)))
+    retval))
+
+;;;###autoload
+(defun url-buffer-visiting (url)
+  "Return the name of a buffer (if any) that is visiting URL."
+  (setq url (url-normalize-url url))
+  (let ((bufs (buffer-list))
+       (found nil))
+    (while (and bufs (not found))
+      (save-excursion
+       (set-buffer (car bufs))
+       (setq found (if (and
+                        (not (string-match " \\*URL-?[0-9]*\\*" (buffer-name 
(car bufs))))
+                        (memq major-mode '(url-mode w3-mode))
+                        (equal (url-normalize-url (url-view-url t)) url))
+                       (car bufs) nil)
+             bufs (cdr bufs))))
+    found))
+
+(defun url-file-size (url &rest args)
+  "Return the size of a file in bytes, or -1 if can't be determined."
+  (let* ((urlobj (url-generic-parse-url url))
+        (type (url-type urlobj))
+        (size -1)
+        (data nil))
+    (cond
+     ((equal type "http")              ; use head
+      (let ((url-request-method "HEAD")
+           (url-request-data nil)
+           (url-working-buffer " *url-temp*"))
+       (save-excursion
+         (url-retrieve url)
+         (setq size (or (cdr
+                         (assoc "content-length" url-current-mime-headers))
+                        -1))
+         (kill-buffer " *url-temp*"))))
+     ((member type '("ftp" "file"))    ; file-attributes
+      (let ((fname (if (url-host urlobj)
+                      (concat "/"
+                              (if (url-user urlobj)
+                                  (concat (url-user urlobj) "@")
+                                "")
+                              (url-host urlobj) ":"
+                              (url-filename urlobj))
+                    (url-filename urlobj))))
+       (setq data (file-attributes fname)
+             size (nth 7 data))))
+     (t nil))
+    (cond
+     ((stringp size) (string-to-int size))
+     ((integerp size) size)
+     ((null size) -1)
+     (t -1))))
+
+(defun url-generate-new-buffer-name (start)
+  "Create a new buffer name based on START."
+  (let ((x 1)
+       name)
+    (if (not (get-buffer start))
+       start
+      (progn
+       (setq name (format "%s<%d>" start x))
+       (while (get-buffer name)
+         (setq x (1+ x)
+               name (format "%s<%d>" start x)))
+       name))))
+
+(defun url-generate-unique-filename (&optional fmt)
+  "Generate a unique filename in url-temporary-directory"
+  (if (not fmt)
+      (let ((base (format "url-tmp.%d" (user-real-uid)))
+           (fname "")
+           (x 0))
+       (setq fname (format "%s%d" base x))
+       (while (file-exists-p (expand-file-name fname url-temporary-directory))
+         (setq x (1+ x)
+               fname (concat base (int-to-string x))))
+       (expand-file-name fname url-temporary-directory))
+    (let ((base (concat "url" (int-to-string (user-real-uid))))
+         (fname "")
+         (x 0))
+      (setq fname (format fmt (concat base (int-to-string x))))
+      (while (file-exists-p (expand-file-name fname url-temporary-directory))
+       (setq x (1+ x)
+             fname (format fmt (concat base (int-to-string x)))))
+      (expand-file-name fname url-temporary-directory))))
+
+(defun url-lazy-message (&rest args)
+  "Just like `message', but is a no-op if called more than once a second.
+Will not do anything if url-show-status is nil."
+  (if (or (null url-show-status)
+         (active-minibuffer-window)
+         (= url-lazy-message-time
+            (setq url-lazy-message-time (nth 1 (current-time)))))
+      nil
+    (apply 'message args)))
+
+
+(defun url-kill-process (proc)
+  "Kill the process PROC - knows about all the various gateway types,
+and acts accordingly."
+  (delete-process proc))
+
+(defun url-accept-process-output (proc)
+  "Allow any pending output from subprocesses to be read by Emacs.
+It is read into the process' buffers or given to their filter functions.
+Where possible, this will not exit until some output is received from PROC,
+or 1 second has elapsed."
+  (accept-process-output proc 1))
+
+(defun url-process-status (proc)
+  "Return the process status of a url buffer"
+  (process-status proc))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Miscellaneous functions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun url-setup-privacy-info ()
+  (interactive)
+  (setq url-system-type
+       (cond
+        ((or (eq url-privacy-level 'paranoid)
+             (and (listp url-privacy-level)
+                  (memq 'os url-privacy-level)))
+         nil)
+        ;; First, we handle the inseparable OS/Windowing system
+        ;; combinations
+        ((eq system-type 'Apple-Macintosh) "Macintosh")
+        ((eq system-type 'next-mach) "NeXT")
+        ((eq system-type 'windows-nt) "Windows-NT; 32bit")
+        ((eq system-type 'ms-windows) "Windows; 16bit")
+        ((eq system-type 'ms-dos) "MS-DOS; 32bit")
+        ((memq (device-type) '(win32 w32)) "Windows; 32bit")
+        ((eq (device-type) 'pm) "OS/2; 32bit")
+        (t
+         (case (device-type)
+           (x "X11")
+           (ns "OpenStep")
+           (tty "TTY")
+           (otherwise nil)))))
+
+  (setq url-personal-mail-address (or url-personal-mail-address
+                                     user-mail-address
+                                     (format "address@hidden"  
(user-real-login-name)
+                                             (system-name))))
+
+  (if (or (memq url-privacy-level '(paranoid high))
+         (and (listp url-privacy-level)
+              (memq 'email url-privacy-level)))
+      (setq url-personal-mail-address nil))
+
+  (setq url-os-type
+       (cond
+        ((or (eq url-privacy-level 'paranoid)
+             (and (listp url-privacy-level)
+                  (memq 'os url-privacy-level)))
+         nil)
+        ((boundp 'system-configuration)
+         system-configuration)
+        ((boundp 'system-type)
+         (symbol-name system-type))
+        (t nil))))
+
+(defun url-handle-no-scheme (url)
+  (let ((temp url-registered-protocols)
+       (found nil))
+    (while (and temp (not found))
+      (if (and (not (member (car (car temp)) '("auto" "www")))
+              (string-match (concat "^" (car (car temp)) "\\.")
+                                       url))
+         (setq found t)
+       (setq temp (cdr temp))))
+    (cond
+     (found                            ; Found something like ftp.spry.com
+      (url-retrieve (concat (car (car temp)) "://" url)))
+     ((string-match "^www\\." url)
+      (url-retrieve (concat "http://"; url)))
+     ((string-match "\\(\\.[^\\.]+\\)\\(\\.[^\\.]+\\)" url)
+      ;; Ok, we have at least two dots in the filename, just stick http on it
+      (url-retrieve (concat "http://"; url)))
+     ((setq temp (run-hook-with-args-until-success
+                 'url-handle-no-scheme-hook url))
+      (url-retrieve temp))
+     (t
+      (url-retrieve (concat "http://www."; url ".com"))))))
+
+;;;###autoload
+(defun url-setup-save-timer ()
+  "Reset the history list timer."
+  (interactive)
+  (cond
+   ((featurep 'itimer)
+    (if (get-itimer "url-history-saver")
+       (delete-itimer (get-itimer "url-history-saver")))
+    (start-itimer "url-history-saver" 'url-write-global-history
+                 url-global-history-save-interval
+                 url-global-history-save-interval))
+   ((fboundp 'run-at-time)
+    (run-at-time url-global-history-save-interval
+                url-global-history-save-interval
+                'url-write-global-history))
+   (t nil)))
+
+(defvar url-download-minor-mode nil)
+
+(defun url-download-minor-mode (on)
+  (setq url-download-minor-mode (if on
+                                  (1+ (or url-download-minor-mode 0))
+                                (1- (or url-download-minor-mode 1))))
+  (if (<= url-download-minor-mode 0)
+      (setq url-download-minor-mode nil)))
+
+;;;###autoload
+(defun url-do-setup ()
+  "Do setup - this is to avoid conflict with user settings when URL is
+dumped with emacs."
+  (if url-setup-done
+      nil
+
+    (add-minor-mode 'url-download-minor-mode " Webbing" nil)
+    
+    ;; Make OS/2 happy
+    (setq tcp-binary-process-input-services
+         (append '("http" "80")
+                 tcp-binary-process-input-services))
+    
+    ;; Register all the protocols we can handle
+    (url-register-protocol 'file)
+    (url-register-protocol 'ftp        nil nil "21")
+    (url-register-protocol 'gopher     nil nil "70")
+    (url-register-protocol 'http       nil nil "80")
+    (url-register-protocol 'https      nil nil "443")
+    (url-register-protocol 'nfs        nil nil "2049")
+    (url-register-protocol 'info       nil 'url-identity-expander)
+    (url-register-protocol 'mailserver nil 'url-identity-expander)
+    (url-register-protocol 'finger     nil 'url-identity-expander "79")
+    (url-register-protocol 'mailto     nil 'url-identity-expander)
+    (url-register-protocol 'news       nil 'url-identity-expander "119")
+    (url-register-protocol 'nntp       nil 'url-identity-expander "119")
+    (url-register-protocol 'irc        nil 'url-identity-expander "6667")
+    (url-register-protocol 'data       nil 'url-identity-expander)
+    (url-register-protocol 'netrek     nil 'url-identity-expander)
+    (url-register-protocol 'cid        nil 'url-identity-expander)
+    (url-register-protocol 'rlogin)
+    (url-register-protocol 'telnet)
+    (url-register-protocol 'tn3270)
+    (url-register-protocol 'proxy)
+    (url-register-protocol 'auto 'url-handle-no-scheme)
+
+    ;; Register all the authentication schemes we can handle
+    (url-register-auth-scheme "basic" nil 4)
+    (url-register-auth-scheme "digest" nil 7)
+
+    ;; Filename handler stuff for emacsen that support it
+    (url-setup-file-name-handlers)
+
+    (setq url-cookie-file
+         (or url-cookie-file
+             (expand-file-name "cookies" w3-configuration-directory)))
+    
+    (setq url-global-history-file
+         (or url-global-history-file
+             (and (memq system-type '(ms-dos ms-windows))
+                  (expand-file-name "~/mosaic.hst"))
+             (and (memq system-type '(axp-vms vax-vms))
+                  (expand-file-name "~/mosaic.global-history"))
+             (condition-case ()
+                 (expand-file-name (concat w3-configuration-directory 
"history"))
+               (error nil))))
+  
+    ;; Parse the global history file if it exists, so that it can be used
+    ;; for URL completion, etc.
+    (if (and url-global-history-file
+            (file-exists-p url-global-history-file))
+       (url-parse-global-history))
+
+    ;; Setup save timer
+    (and url-global-history-save-interval (url-setup-save-timer))
+
+    (if (and url-cookie-file
+            (file-exists-p url-cookie-file))
+       (url-cookie-parse-file url-cookie-file))
+    
+    ;; Read in proxy gateways
+    (let ((noproxy (and (not (assoc "no_proxy" url-proxy-services))
+                       (or (getenv "NO_PROXY")
+                           (getenv "no_PROXY")
+                           (getenv "no_proxy")))))
+      (if noproxy
+         (setq url-proxy-services
+               (cons (cons "no_proxy"
+                           (concat "\\("
+                                   (mapconcat
+                                    (function
+                                     (lambda (x)
+                                       (cond
+                                        ((= x ?,) "\\|")
+                                        ((= x ? ) "")
+                                        ((= x ?.) (regexp-quote "."))
+                                        ((= x ?*) ".*")
+                                        ((= x ??) ".")
+                                        (t (char-to-string x)))))
+                                    noproxy "") "\\)"))
+                     url-proxy-services))))
+
+    ;; Set the password entry funtion based on user defaults or guess
+    ;; based on which remote-file-access package they are using.
+    (cond
+     (url-passwd-entry-func nil)       ; Already been set
+     ((fboundp 'read-passwd)           ; Use secure password if available
+      (setq url-passwd-entry-func 'read-passwd))
+     ((or (featurep 'efs)              ; Using EFS
+         (featurep 'efs-auto))         ; or autoloading efs
+      (if (not (fboundp 'read-passwd))
+         (autoload 'read-passwd "passwd" "Read in a password" nil))
+      (setq url-passwd-entry-func 'read-passwd))
+     ((or (featurep 'ange-ftp)         ; Using ange-ftp
+         (and (boundp 'file-name-handler-alist)
+              (not (string-match "Lucid" (emacs-version)))))
+      (setq url-passwd-entry-func 'ange-ftp-read-passwd))
+     (t
+      (url-warn
+       'security
+       "(url-setup): Can't determine how to read passwords, winging it.")))
+  
+    ;; Set up the news service if they haven't done so
+    (setq url-news-server
+         (cond
+          (url-news-server url-news-server)
+          ((and (boundp 'gnus-default-nntp-server)
+                (not (equal "" gnus-default-nntp-server)))
+           gnus-default-nntp-server)
+          ((and (boundp 'gnus-nntp-server)
+                (not (null gnus-nntp-server))
+                (not (equal "" gnus-nntp-server)))
+           gnus-nntp-server)
+          ((and (boundp 'nntp-server-name)
+                (not (null nntp-server-name))
+                (not (equal "" nntp-server-name)))
+           nntp-server-name)
+          ((getenv "NNTPSERVER") (getenv "NNTPSERVER"))
+          (t "news")))
+  
+    ;; Set up the MIME accept string if they haven't got it hardcoded yet
+    (or url-mime-accept-string
+       (setq url-mime-accept-string (url-parse-viewer-types)))
+    (or url-mime-encoding-string
+       (setq url-mime-encoding-string
+             (mapconcat 'car
+                        mm-content-transfer-encodings
+                        ", ")))
+  
+    (url-setup-privacy-info)
+    (run-hooks 'url-load-hook)
+    (setq url-setup-done t)))
+
+(defvar url-get-url-filename-chars "address@hidden()_/:~=&"
+  "Valid characters in a URL")
+
+;;;###autoload
+(defun url-get-url-at-point (&optional pt)
+  "Get the URL closest to point, but don't change your
+position. Has a preference for looking backward when not
+directly on a symbol."
+  ;; Not at all perfect - point must be right in the name.
+  (save-excursion
+    (if pt (goto-char pt))
+    (let (start url)
+      (save-excursion
+       ;; first see if you're just past a filename
+       (if (not (eobp))
+           (if (looking-at "[] \t\n[{}()]") ; whitespace or some parens
+               (progn
+                 (skip-chars-backward " \n\t\r({[]})")
+                 (if (not (bobp))
+                     (backward-char 1)))))
+       (if (and (char-after (point))
+                (string-match (eval-when-compile
+                                (concat "[" url-get-url-filename-chars "]"))
+                              (char-to-string (char-after (point)))))
+           (progn
+             (skip-chars-backward url-get-url-filename-chars)
+             (setq start (point))
+             (skip-chars-forward url-get-url-filename-chars))
+         (setq start (point)))
+       (setq url (buffer-substring-no-properties start (point))))
+      (if (string-match "^(.*)$" url)
+         (setq url (substring url 1 -1)))
+      (if (string-match "^URL:" url)
+         (setq url (substring url 4 nil)))
+      (if (string-match "\\.$" url)
+         (setq url (substring url 0 -1)))
+      (if (string-match "^www\\." url)
+         (setq url (concat "http://"; url)))
+      (if (not (string-match url-nonrelative-link url))
+         (setq url nil))
+      url)))
+
+(defun url-eat-trailing-space (x)
+  ;; Remove spaces/tabs at the end of a string
+  (let ((y (1- (length x)))
+       (skip-chars (list ?  ?\t ?\n)))
+    (while (and (>= y 0) (memq (aref x y) skip-chars))
+      (setq y (1- y)))
+    (substring x 0 (1+ y))))
+
+(defun url-strip-leading-spaces (x)
+  ;; Remove spaces at the front of a string
+  (let ((y (1- (length x)))
+       (z 0)
+       (skip-chars (list ?  ?\t ?\n)))
+    (while (and (<= z y) (memq (aref x z) skip-chars))
+      (setq z (1+ z)))
+    (substring x z nil)))
+
+(defun url-convert-newlines-to-spaces (x)
+  "Convert newlines and carriage returns embedded in a string into spaces,
+and swallow following whitespace.
+The argument is not side-effected, but may be returned by this function."
+  (if (string-match "[\n\r]+\\s-*" x)   ; [\\n\\r\\t ]
+      (concat (substring x 0 (match-beginning 0)) " "
+             (url-convert-newlines-to-spaces
+              (substring x (match-end 0))))
+    x))
+
+;; Test cases
+;; (url-convert-newlines-to-spaces "foo    bar")  ; nothing happens
+;; (url-convert-newlines-to-spaces "foo\n  \t  bar") ; whitespace converted
+;;
+;; This implementation doesn't mangle the match-data, is fast, and doesn't
+;; create garbage, but it leaves whitespace.
+;; (defun url-convert-newlines-to-spaces (x)
+;;   "Convert newlines and carriage returns embedded in a string into spaces.
+;; The string is side-effected, then returned."
+;;   (let ((i 0)
+;;      (limit (length x)))
+;;     (while (< i limit)
+;;       (if (or (= ?\n (aref x i))
+;;            (= ?\r (aref x i)))
+;;        (aset x i ? ))
+;;       (setq i (1+ i)))
+;;     x))
+
+(defun url-expand-file-name (url &optional default)
+  "Convert URL to a fully specified URL, and canonicalize it.
+Second arg DEFAULT is a URL to start with if URL is relative.
+If DEFAULT is nil or missing, the current buffer's URL is used.
+Path components that are `.' are removed, and 
+path components followed by `..' are removed, along with the `..' itself."
+  (if url
+      (setq url (mapconcat (function (lambda (x)
+                                      (if (memq x '(?  ?\n ?\r))
+                                          ""
+                                        (char-to-string x))))
+                          (url-strip-leading-spaces
+                           (url-eat-trailing-space url)) "")))
+  (cond
+   ((null url) nil)                    ; Something hosed!  Be graceful
+   ((string-match "^#" url)            ; Offset link, use it raw
+    url)
+   (t
+    (let* ((urlobj (url-generic-parse-url url))
+          (inhibit-file-name-handlers t)
+          (defobj (cond
+                   ((vectorp default) default)
+                   (default (url-generic-parse-url default))
+                   (url-current-object url-current-object)
+                   (t (url-generic-parse-url (url-view-url t)))))
+          (expander (cdr-safe
+                     (cdr-safe
+                      (assoc (or (url-type urlobj)
+                                 (url-type defobj))
+                             url-registered-protocols)))))
+      (if (string-match "^//" url)
+         (setq urlobj (url-generic-parse-url (concat (url-type defobj) ":"
+                                                     url))))
+      (if (fboundp expander)
+         (funcall expander urlobj defobj)
+       (message "Unknown URL scheme: %s" (or (url-type urlobj)
+                                            (url-type defobj)))
+       (url-identity-expander urlobj defobj))
+      (url-recreate-url urlobj)))))
+
+(defun url-default-expander (urlobj defobj)
+  ;; The default expansion routine - urlobj is modified by side effect!
+  (url-set-type urlobj (or (url-type urlobj) (url-type defobj)))
+  (url-set-port urlobj (or (url-port urlobj)
+                          (and (string= (url-type urlobj)
+                                        (url-type defobj))
+                               (url-port defobj))))
+  (if (not (string= "file" (url-type urlobj)))
+      (url-set-host urlobj (or (url-host urlobj) (url-host defobj))))
+  (if (string= "ftp"  (url-type urlobj))
+      (url-set-user urlobj (or (url-user urlobj) (url-user defobj))))
+  (if (string= (url-filename urlobj) "")
+      (url-set-filename urlobj "/"))
+  (if (string-match "^/" (url-filename urlobj))
+      nil
+    (url-set-filename urlobj
+                     (url-remove-relative-links
+                      (concat (url-basepath (url-filename defobj))
+                              (url-filename urlobj))))))
+
+(defun url-identity-expander (urlobj defobj)
+  (url-set-type urlobj (or (url-type urlobj) (url-type defobj))))
+
+(defconst url-unreserved-chars
+  '(
+    ?a ?b ?c ?d ?e ?f ?g ?h ?i ?j ?k ?l ?m ?n ?o ?p ?q ?r ?s ?t ?u ?v ?w ?x ?y 
?z
+    ?A ?B ?C ?D ?E ?F ?G ?H ?I ?J ?K ?L ?M ?N ?O ?P ?Q ?R ?S ?T ?U ?V ?W ?X ?Y 
?Z
+    ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9
+    ?$ ?- ?_ ?. ?! ?~ ?* ?' ?\( ?\) ?,)
+  "A list of characters that are _NOT_ reserve in the URL spec.
+This is taken from draft-fielding-url-syntax-02.txt - check your local
+internet drafts directory for a copy.")
+       
+(defun url-hexify-string (str)
+  "Escape characters in a string"
+  (mapconcat
+   (function
+    (lambda (char)
+      (if (not (memq char url-unreserved-chars))
+         (if (< char 16)
+             (upcase (format "%%0%x" char))
+           (upcase (format "%%%x" char)))
+       (char-to-string char))))
+   (mule-decode-string str) ""))
+
+(defun url-make-sequence (start end)
+  "Make a sequence (list) of numbers from START to END"
+  (cond
+   ((= start end) '())
+   ((> start end) '())
+   (t
+    (let ((sqnc '()))
+      (while (<= start end)
+       (setq sqnc (cons end sqnc)
+             end (1- end)))
+      sqnc))))
+ 
+(defun url-file-extension (fname &optional x)
+  "Return the filename extension of FNAME.  If optional variable X is t,
+then return the basename of the file with the extension stripped off."
+  (if (and fname
+          (setq fname (url-basepath fname t))
+          (string-match "\\.[^./]+$" fname))
+      (if x (substring fname 0 (match-beginning 0))
+       (substring fname (match-beginning 0) nil))
+    ;;
+    ;; If fname has no extension, and x then return fname itself instead of 
+    ;; nothing. When caching it allows the correct .hdr file to be produced
+    ;; for filenames without extension.
+    ;;
+    (if x
+       fname
+      "")))
+
+(defun url-basepath (file &optional x)
+  "Return the base pathname of FILE, or the actual filename if X is true"
+  (cond
+   ((null file) "")
+   ((string-match (eval-when-compile (regexp-quote "?")) file)
+    (if x
+       (file-name-nondirectory (substring file 0 (match-beginning 0)))
+      (file-name-directory (substring file 0 (match-beginning 0)))))
+   (x (file-name-nondirectory file))
+   (t (file-name-directory file))))
+
+(defun url-parse-query-string (query &optional downcase)
+  (let (retval pairs cur key val)
+    (setq pairs (split-string query "&"))
+    (while pairs
+      (setq cur (car pairs)
+           pairs (cdr pairs))
+      (if (not (string-match "=" cur))
+         nil                           ; Grace
+       (setq key (url-unhex-string (substring cur 0 (match-beginning 0)))
+             val (url-unhex-string (substring cur (match-end 0) nil)))
+       (if downcase
+           (setq key (downcase key)))
+       (setq cur (assoc key retval))
+       (if cur
+           (setcdr cur (cons val (cdr cur)))
+         (setq retval (cons (list key val) retval)))))
+    retval))
+
+(defun url-unhex (x)
+  (if (> x ?9)
+      (if (>= x ?a)
+         (+ 10 (- x ?a))
+       (+ 10 (- x ?A)))
+    (- x ?0)))
+
+(defun url-unhex-string (str &optional allow-newlines)
+  "Remove %XXX embedded spaces, etc in a url.
+If optional second argument ALLOW-NEWLINES is non-nil, then allow the
+decoding of carriage returns and line feeds in the string, which is normally
+forbidden in URL encoding."
+  (setq str (or str ""))
+  (let ((tmp "")
+       (case-fold-search t))
+    (while (string-match "%[0-9a-f][0-9a-f]" str)
+      (let* ((start (match-beginning 0))
+            (ch1 (url-unhex (elt str (+ start 1))))
+            (code (+ (* 16 ch1)
+                     (url-unhex (elt str (+ start 2))))))
+       (setq tmp (concat 
+                  tmp (substring str 0 start)
+                  (cond
+                   (allow-newlines
+                    (char-to-string code))
+                   ((or (= code ?\n) (= code ?\r))
+                    " ")
+                   (t (char-to-string code))))
+             str (substring str (match-end 0)))))
+    (setq tmp (concat tmp str))
+    tmp))
+
+(defun url-remove-compressed-extensions (filename)
+  (while (assoc (url-file-extension filename) url-uncompressor-alist)
+    (setq filename (url-file-extension filename t)))
+  filename)
+
+(defun url-uncompress ()
+  "Do any necessary uncompression on `url-working-buffer'"
+  (set-buffer url-working-buffer)
+  (if (not url-inhibit-uncompression)
+      (let* ((decoder nil)
+            (code-1 (cdr-safe
+                     (assoc "content-transfer-encoding"
+                            url-current-mime-headers)))
+            (code-2 (cdr-safe
+                     (assoc "content-encoding" url-current-mime-headers)))
+            (done nil)
+            (default-process-coding-system
+              (cons mule-no-coding-system mule-no-coding-system)))
+       (mapcar
+        (function
+         (lambda (code)
+           (setq decoder (and (not (member code done))
+                              (cdr-safe
+                               (assoc code mm-content-transfer-encodings)))
+                 done (cons code done))
+           (if (not decoder)
+               nil
+             (message "Decoding (%s)..." code)
+             (cond
+              ((stringp decoder)
+               (call-process-region (point-min) (point-max) decoder t t nil))
+              ((listp decoder)
+               (apply 'call-process-region (point-min) (point-max)
+                      (car decoder) t t nil (cdr decoder)))
+              ((and (symbolp decoder) (fboundp decoder))
+               (funcall decoder (point-min) (point-max)))
+              (t
+               (error "Bad entry for %s in `mm-content-transfer-encodings'"
+                      code)))
+             (message "Decoding (%s)... done." code))))
+        (list code-1 code-2))))
+  (set-buffer-modified-p nil))
+
+(defun url-filter (proc string)
+  (save-excursion
+    (set-buffer url-working-buffer)
+    (insert string)
+    (if (string-match "\nConnection closed by" string)
+       (progn (set-process-filter proc nil)
+              (url-sentinel proc string))))
+  string)
+
+(defun url-default-callback (buf)
+  (url-download-minor-mode nil)
+  (url-store-in-cache buf)
+  (cond
+   ((save-excursion (set-buffer buf)
+                   (and url-current-callback-func
+                        (fboundp url-current-callback-func)))
+    (save-excursion
+      (save-window-excursion
+       (set-buffer buf)
+       (cond
+        ((listp url-current-callback-data)
+         (apply url-current-callback-func
+                url-current-callback-data))
+        (url-current-callback-data
+         (funcall url-current-callback-func
+                  url-current-callback-data))
+        (t
+         (funcall url-current-callback-func))))))
+   ((and (fboundp 'w3-sentinel) (get-buffer buf))
+    (w3-sentinel))
+   (t
+    (message "Retrieval for %s complete." buf))))
+
+(defun url-sentinel (proc string)
+  (let* ((buf (if (processp proc) (process-buffer proc) proc))
+        (url-working-buffer (and buf (get-buffer buf)))
+        status)
+    (if (not url-working-buffer)
+       (url-warn 'url (format "Process %s completed with no buffer!" proc))
+      (save-excursion
+       (set-buffer url-working-buffer)
+       (remove-hook 'after-change-functions 'url-after-change-function)
+       (if url-be-asynchronous
+           (progn
+             (widen)
+             (cond
+              ((and (null proc) (not url-working-buffer)) nil)
+              ((url-mime-response-p)
+               (setq status (url-parse-mime-headers))))
+             (if (not url-current-mime-type)
+                 (setq url-current-mime-type (or
+                                              (mm-extension-to-mime
+                                               (url-file-extension
+                                                (url-filename
+                                                 url-current-object)))
+                                              "text/plain"))))))
+      (if (member status '(401 301 302 303 204))
+         nil
+       (funcall url-default-retrieval-proc (buffer-name url-working-buffer)))))
+  ;; FSF Emacs doesn't do this after calling a process-sentinel
+  (set-buffer (window-buffer (selected-window))))
+
+(defun url-remove-relative-links (name)
+  ;; Strip . and .. from pathnames
+  (let ((new (if (not (string-match "^/" name))
+                (concat "/" name)
+              name)))
+    (while (string-match "/\\(\\./\\)" new)
+      (setq new (concat (substring new 0 (match-beginning 1))
+                       (substring new (match-end 1)))))
+    (while (string-match "/\\([^/]*/\\.\\./\\)" new)
+      (setq new (concat (substring new 0 (match-beginning 1))
+                       (substring new (match-end 1)))))
+    (while (string-match "^/\\.\\.\\(/\\)" new)
+      (setq new (substring new (match-beginning 1) nil)))
+    new))
+
+(defun url-truncate-url-for-viewing (url &optional width)
+  "Return a shortened version of URL that is WIDTH characters or less wide.
+WIDTH defaults to the current frame width."
+  (let* ((fr-width (or width (frame-width)))
+        (str-width (length url))
+        (tail (file-name-nondirectory url))
+        (fname nil)
+        (modified 0)
+        (urlobj nil))
+    ;; The first thing that can go are the search strings
+    (if (and (>= str-width fr-width)
+            (string-match "?" url))
+       (setq url (concat (substring url 0 (match-beginning 0)) "?...")
+             str-width (length url)
+             tail (file-name-nondirectory url)))
+    (if (< str-width fr-width)
+       nil                             ; Hey, we are done!
+      (setq urlobj (url-generic-parse-url url)
+           fname (url-filename urlobj)
+           fr-width (- fr-width 4))
+      (while (and (>= str-width fr-width)
+                 (string-match "/" fname))
+       (setq fname (substring fname (match-end 0) nil)
+             modified (1+ modified))
+       (url-set-filename urlobj fname)
+       (setq url (url-recreate-url urlobj)
+             str-width (length url)))
+      (if (> modified 1)
+         (setq fname (concat "/.../" fname))
+       (setq fname (concat "/" fname)))
+      (url-set-filename urlobj fname)
+      (setq url (url-recreate-url urlobj)))
+    url))
+
+(defun url-view-url (&optional no-show)
+  "View the current document's URL.  Optional argument NO-SHOW means
+just return the URL, don't show it in the minibuffer."
+  (interactive)
+  (if (not url-current-object)
+      nil
+    (if no-show
+       (url-recreate-url url-current-object)
+      (message "%s" (url-recreate-url url-current-object)))))
+
+(defun url-parse-Netscape-history (fname)
+  ;; Parse a Netscape/X style global history list.
+  (let (pos                            ; Position holder
+       url                             ; The URL
+       time)                           ; Last time accessed
+    (goto-char (point-min))
+    (skip-chars-forward "^\n")
+    (skip-chars-forward "\n \t")       ; Skip past the tag line
+    (setq url-global-history-hash-table (make-hash-table :size 131
+                                                        :test 'equal))
+    ;; Here we will go to the end of the line and
+    ;; skip back over a token, since we might run
+    ;; into spaces in URLs, depending on how much
+    ;; smarter netscape is than the old XMosaic :)
+    (while (not (eobp))
+      (setq pos (point))
+      (end-of-line)
+      (skip-chars-backward "^ \t")
+      (skip-chars-backward " \t")
+      (setq url (buffer-substring pos (point))
+           pos (1+ (point)))
+      (skip-chars-forward "^\n")
+      (setq time (buffer-substring pos (point)))
+      (skip-chars-forward "\n")
+      (setq url-history-changed-since-last-save t)
+      (cl-puthash url time url-global-history-hash-table))))
+
+(defun url-parse-Mosaic-history-v1 (fname)
+  ;; Parse an NCSA Mosaic/X style global history list
+  (goto-char (point-min))
+  (skip-chars-forward "^\n")
+  (skip-chars-forward "\n \t") ; Skip past the tag line
+  (skip-chars-forward "^\n")
+  (skip-chars-forward "\n \t") ; Skip past the second tag line
+  (setq url-global-history-hash-table (make-hash-table :size 131
+                                                      :test 'equal))
+  (let (pos                            ; Temporary position holder
+       bol                             ; Beginning-of-line
+       url                             ; URL
+       time                            ; Time
+       last-end                        ; Last ending point
+       )
+    (while (not (eobp))
+      (setq bol (point))
+      (end-of-line)
+      (setq pos (point)
+           last-end (point))
+      (skip-chars-backward "^ \t" bol) ; Skip over year
+      (skip-chars-backward " \t" bol)
+      (skip-chars-backward "^ \t" bol) ; Skip over time
+      (skip-chars-backward " \t" bol)
+      (skip-chars-backward "^ \t" bol) ; Skip over day #
+      (skip-chars-backward " \t" bol)
+      (skip-chars-backward "^ \t" bol) ; Skip over month
+      (skip-chars-backward " \t" bol)
+      (skip-chars-backward "^ \t" bol) ; Skip over day abbrev.
+      (if (bolp)
+         nil                           ; Malformed entry!!! Ack! Bailout!
+       (setq time (buffer-substring pos (point)))
+       (skip-chars-backward " \t")
+       (setq pos (point)))
+      (beginning-of-line)
+      (setq url (buffer-substring (point) pos))
+      (goto-char (min (1+ last-end) (point-max))) ; Goto next line
+      (if (/= (length url) 0)
+         (progn
+           (setq url-history-changed-since-last-save t)
+           (cl-puthash url time url-global-history-hash-table))))))
+
+(defun url-parse-Mosaic-history-v2 (fname)
+  ;; Parse an NCSA Mosaic/X style global history list (version 2)
+  (goto-char (point-min))
+  (skip-chars-forward "^\n")
+  (skip-chars-forward "\n \t") ; Skip past the tag line
+  (skip-chars-forward "^\n")
+  (skip-chars-forward "\n \t") ; Skip past the second tag line
+  (setq url-global-history-hash-table (make-hash-table :size 131
+                                                      :test 'equal))
+  (let (pos                            ; Temporary position holder
+       bol                             ; Beginning-of-line
+       url                             ; URL
+       time                            ; Time
+       last-end                        ; Last ending point
+       )
+    (while (not (eobp))
+      (setq bol (point))
+      (end-of-line)
+      (setq pos (point)
+           last-end (point))
+      (skip-chars-backward "^ \t" bol) ; Skip over time
+      (if (bolp)
+         nil                           ; Malformed entry!!! Ack! Bailout!
+       (setq time (buffer-substring pos (point)))
+       (skip-chars-backward " \t")
+       (setq pos (point)))
+      (beginning-of-line)
+      (setq url (buffer-substring (point) pos))
+      (goto-char (min (1+ last-end) (point-max))) ; Goto next line
+      (if (/= (length url) 0)
+         (progn
+           (setq url-history-changed-since-last-save t)
+           (cl-puthash url time url-global-history-hash-table))))))
+
+(defun url-parse-Emacs-history (&optional fname)
+  ;; Parse out the Emacs-w3 global history file for completion, etc.
+  (or fname (setq fname (expand-file-name url-global-history-file)))
+  (cond
+   ((not (file-exists-p fname))
+    (message "%s does not exist." fname))
+   ((not (file-readable-p fname))
+    (message "%s is unreadable." fname))
+   (t
+    (condition-case ()
+       (load fname nil t)
+      (error (message "Could not load %s" fname)))
+    (if (boundp 'url-global-history-completion-list)
+       ;; Hey!  Automatic conversion of old format!
+       (progn
+         (setq url-global-history-hash-table (make-hash-table :size 131
+                                                              :test 'equal)
+               url-history-changed-since-last-save t)
+         (mapcar (function
+                  (lambda (x)
+                    (cl-puthash (car x) (cdr x)
+                                url-global-history-hash-table)))
+                 (symbol-value 'url-global-history-completion-list)))))))
+
+(defun url-parse-global-history (&optional fname)
+  ;; Parse out the mosaic global history file for completions, etc.
+  (or fname (setq fname (expand-file-name url-global-history-file)))
+  (cond
+   ((not (file-exists-p fname))
+    (message "%s does not exist." fname))
+   ((not (file-readable-p fname))
+    (message "%s is unreadable." fname))
+   (t
+    (save-excursion
+      (set-buffer (get-buffer-create " *url-tmp*"))
+      (erase-buffer)
+      (insert-file-contents-literally fname)
+      (goto-char (point-min))
+      (cond
+       ((looking-at "(setq") (url-parse-Emacs-history fname))
+       ((looking-at "ncsa-mosaic-.*-1$") (url-parse-Mosaic-history-v1 fname))
+       ((looking-at "ncsa-mosaic-.*-2$") (url-parse-Mosaic-history-v2 fname))
+       ((or (looking-at "MCOM-") (looking-at "netscape"))
+       (url-parse-Netscape-history fname))
+       (t
+       (url-warn 'url (format "Cannot deduce type of history file: %s"
+                              fname))))))))
+
+(defun url-write-Emacs-history (fname)
+  ;; Write an Emacs-w3 style global history list into FNAME
+  (erase-buffer)
+  (let ((count 0))
+    (cl-maphash (function
+                (lambda (key value)
+                  (while (string-match "[\r\n]+" key)
+                    (setq key (concat (substring key 0 (match-beginning 0))
+                                      (substring key (match-end 0) nil))))
+                  (setq count (1+ count))
+                  (insert "(cl-puthash \"" key "\""
+                          (if (not (stringp value)) " '" "")
+                          (prin1-to-string value)
+                          " url-global-history-hash-table)\n")))
+               url-global-history-hash-table)
+    (goto-char (point-min))
+    (insert (format
+            "(setq url-global-history-hash-table (make-hash-table :size %d 
:test 'equal))\n"
+            (/ count 4)))
+    (goto-char (point-max))
+    (insert "\n")
+    (write-file fname)))
+
+(defun url-write-Netscape-history (fname)
+  ;; Write a Netscape-style global history list into FNAME
+  (erase-buffer)
+  (let ((last-valid-time "785305714")) ; Picked out of thin air,
+                                       ; in case first in assoc list
+                                       ; doesn't have a valid time
+    (goto-char (point-min))
+    (insert "MCOM-Global-history-file-1\n")
+    (cl-maphash (function
+                (lambda (url time)
+                  (if (or (not (stringp time)) (string-match " \t" time))
+                      (setq time last-valid-time)
+                    (setq last-valid-time time))
+                  (insert url " " time "\n")))
+               url-global-history-hash-table)
+    (write-file fname)))
+
+(defun url-write-Mosaic-history-v1 (fname)
+  ;; Write a Mosaic/X-style global history list into FNAME
+  (erase-buffer)
+  (goto-char (point-min))
+  (insert "ncsa-mosaic-history-format-1\nGlobal\n")
+  (cl-maphash (function
+              (lambda (url time)
+                (if (listp time)
+                    (setq time (current-time-string time)))
+                (if (or (not (stringp time))
+                        (not (string-match " " time)))
+                    (setq time (current-time-string)))
+                (insert url " " time "\n")))
+             url-global-history-hash-table)
+  (write-file fname))
+
+(defun url-write-Mosaic-history-v2 (fname)
+  ;; Write a Mosaic/X-style global history list into FNAME
+  (let ((last-valid-time "827250806"))
+    (erase-buffer)
+    (goto-char (point-min))
+    (insert "ncsa-mosaic-history-format-2\nGlobal\n")
+    (cl-maphash (function
+                (lambda (url time)
+                  (if (listp time)
+                      (setq time last-valid-time)
+                    (setq last-valid-time time))
+                  (if (not (stringp time))
+                      (setq time last-valid-time))
+                  (insert url " " time "\n")))
+               url-global-history-hash-table)
+    (write-file fname)))
+
+(defun url-write-global-history (&optional fname)
+  "Write the global history file into `url-global-history-file'.
+The type of data written is determined by what is in the file to begin
+with.  If the type of storage cannot be determined, then prompt the
+user for what type to save as."
+  (interactive)
+  (or fname (setq fname (expand-file-name url-global-history-file)))
+  (cond
+   ((not url-history-changed-since-last-save) nil)
+   ((not (file-writable-p fname))
+    (message "%s is unwritable." fname))
+   (t
+    (let ((make-backup-files nil)
+         (version-control nil)
+         (require-final-newline t))
+      (save-excursion
+       (set-buffer (get-buffer-create " *url-tmp*"))
+       (erase-buffer)
+       (condition-case ()
+           (insert-file-contents-literally fname)
+         (error nil))
+       (goto-char (point-min))
+       (cond
+        ((looking-at "ncsa-mosaic-.*-1$") (url-write-Mosaic-history-v1 fname))
+        ((looking-at "ncsa-mosaic-.*-2$") (url-write-Mosaic-history-v2 fname))
+        ((looking-at "MCOM-") (url-write-Netscape-history fname))
+        ((looking-at "netscape") (url-write-Netscape-history fname))
+        ((looking-at "(setq") (url-write-Emacs-history fname))
+        (t (url-write-Emacs-history fname)))
+       (kill-buffer (current-buffer))))))
+  (setq url-history-changed-since-last-save nil))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; The main URL fetching interface
+;;; -------------------------------
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;###autoload
+(defun url-popup-info (url)
+  "Retrieve the HTTP/1.0 headers and display them in a temp buffer."
+  (let* ((urlobj (url-generic-parse-url url))
+        (type (url-type urlobj))
+        data)
+    (cond
+     ((string= type "http")
+      (let ((url-request-method "HEAD")
+           (url-automatic-caching nil)
+           (url-inhibit-mime-parsing t)
+           (url-working-buffer " *popup*"))
+       (save-excursion
+         (set-buffer (get-buffer-create url-working-buffer))
+         (erase-buffer)
+         (setq url-be-asynchronous nil)
+         (url-retrieve url)
+         (subst-char-in-region (point-min) (point-max) ?\r ? )
+         (buffer-string))))
+     ((or (string= type "file") (string= type "ftp"))
+      (setq data (url-file-attributes url))
+      (set-buffer (get-buffer-create
+                  (url-generate-new-buffer-name "*Header Info*")))
+      (erase-buffer)
+      (if data
+         (concat (if (stringp (nth 0 data))
+                     (concat "    Linked to: " (nth 0 data))
+                   (concat "    Directory: " (if (nth 0 data) "Yes" "No")))
+                 "\n        Links: " (int-to-string (nth 1 data))
+                 "\n     File UID: " (int-to-string (nth 2 data))
+                 "\n     File GID: " (int-to-string (nth 3 data))
+                 "\n  Last Access: " (current-time-string (nth 4 data))
+                 "\nLast Modified: " (current-time-string (nth 5 data))
+                 "\n Last Changed: " (current-time-string (nth 6 data))
+                 "\n Size (bytes): " (int-to-string (nth 7 data))
+                 "\n    File Type: " (or (nth 8 data) "text/plain"))
+       (concat "No info found for " url)))
+     ((and (string= type "news") (string-match "@" url))
+      (let ((art (url-filename urlobj)))
+       (if (not (string= (substring art -1 nil) ">"))
+           (setq art (concat "<" art ">")))
+       (url-get-headers-from-article-id art)))
+     (t (concat "Don't know how to find information on " url)))))
+
+(defun url-decode-text ()
+  ;; Decode text transmitted by NNTP.
+  ;; 0. Delete status line.
+  ;; 1. Delete `^M' at end of line.
+  ;; 2. Delete `.' at end of buffer (end of text mark).
+  ;; 3. Delete `.' at beginning of line."
+  (save-excursion
+    (set-buffer nntp-server-buffer)
+    ;; Insert newline at end of buffer.
+    (goto-char (point-max))
+    (if (not (bolp))
+       (insert "\n"))
+    ;; Delete status line.
+    (goto-char (point-min))
+    (delete-region (point) (progn (forward-line 1) (point)))
+    ;; Delete `^M' at end of line.
+    ;; (replace-regexp "\r$" "")
+    (while (not (eobp))
+      (end-of-line)
+      (if (= (preceding-char) ?\r)
+         (delete-char -1))
+      (forward-line 1)
+      )
+    ;; Delete `.' at end of buffer (end of text mark).
+    (goto-char (point-max))
+    (forward-line -1)                  ;(beginning-of-line)
+    (if (looking-at "^\\.$")
+       (delete-region (point) (progn (forward-line 1) (point))))
+    ;; Replace `..' at beginning of line with `.'.
+    (goto-char (point-min))
+    ;; (replace-regexp "^\\.\\." ".")
+    (while (search-forward "\n.." nil t)
+      (delete-char -1))
+    ))
+
+(defun url-get-headers-from-article-id (art)
+  ;; Return the HEAD of ART (a usenet news article)
+  (cond
+   ((string-match "flee" nntp-version)
+    (nntp/command "HEAD" art)
+    (save-excursion
+      (set-buffer nntp-server-buffer)
+      (while (progn (goto-char (point-min))
+                   (not (re-search-forward "^.\r*$" nil t)))
+       (url-accept-process-output nntp/connection))))
+   (t
+    (nntp-send-command "^\\.\r$" "HEAD" art)
+    (url-decode-text)))
+  (save-excursion
+    (set-buffer nntp-server-buffer)
+    (buffer-string)))
+
+(defcustom url-external-retrieval-program "www"
+  "*Name of the external executable to run to retrieve URLs."
+  :type 'string
+  :group 'url)
+
+(defcustom url-external-retrieval-args '("-source")
+  "*A list of arguments to pass to `url-external-retrieval-program' to
+retrieve a URL by its HTML source."
+  :type '(repeat string)
+  :group 'url)
+
+(defun url-retrieve-externally (url &optional no-cache)
+  (let ((url-working-buffer (if (and url-multiple-p
+                                    (string-equal url-working-buffer
+                                                  url-default-working-buffer))
+                               (url-get-working-buffer-name)
+                             url-working-buffer)))
+    (if (get-buffer-create url-working-buffer)
+       (save-excursion
+         (set-buffer url-working-buffer)
+         (set-buffer-modified-p nil)
+         (kill-buffer url-working-buffer)))
+    (set-buffer (get-buffer-create url-working-buffer))
+    (let* ((args (append url-external-retrieval-args (list url)))
+          (urlobj (url-generic-parse-url url))
+          (type (url-type urlobj)))
+      (if (or (member type '("www" "about" "mailto" "mailserver"))
+             (url-file-directly-accessible-p urlobj))
+         (url-retrieve-internally url)
+       (url-lazy-message "Retrieving %s..." url)
+       (apply 'call-process url-external-retrieval-program
+              nil t nil args)
+       (url-lazy-message "Retrieving %s... done" url)))))
+
+(defun url-get-normalized-date (&optional specified-time)
+  ;; Return a 'real' date string that most HTTP servers can understand.
+  (require 'timezone)
+  (let* ((raw (if specified-time (current-time-string specified-time)
+               (current-time-string)))
+        (gmt (timezone-make-date-arpa-standard raw
+                                               (nth 1 (current-time-zone))
+                                               "GMT"))
+        (parsed (timezone-parse-date gmt))
+        (day (cdr-safe (assoc (substring raw 0 3) weekday-alist)))
+        (year nil)
+        (month (car
+                (rassoc
+                 (string-to-int (aref parsed 1)) monthabbrev-alist)))
+        )
+    (setq day (or (car-safe (rassoc day weekday-alist))
+                 (substring raw 0 3))
+         year (aref parsed 0))
+    ;; This is needed for plexus servers, or the server will hang trying to
+    ;; parse the if-modified-since header.  Hopefully, I can take this out
+    ;; soon.
+    (if (and year (> (length year) 2))
+       (setq year (substring year -2 nil)))
+
+    (concat day ", " (aref parsed 2) "-" month "-" year " "
+           (aref parsed 3) " " (or (aref parsed 4)
+                                   (concat "[" (nth 1 (current-time-zone))
+                                           "]")))))
+
+(defun url-get-working-buffer-name ()
+  "Get a working buffer name such as ` *URL-<i>*' without a live process and 
empty"
+  (let ((num 1)
+       name buf)
+    (while (progn (setq name (format " *URL-%d*" num))
+                 (setq buf (get-buffer name))
+                 (and buf (or (get-buffer-process buf)
+                              (save-excursion (set-buffer buf)
+                                              (> (point-max) 1)))))
+      (setq num (1+ num)))
+    name))
+
+(defun url-default-find-proxy-for-url (urlobj host)
+  (cond
+   ((or (and (assoc "no_proxy" url-proxy-services)
+            (string-match
+             (cdr
+              (assoc "no_proxy" url-proxy-services))
+             host))
+       (equal "www" (url-type urlobj)))
+    "DIRECT")
+   ((cdr (assoc (url-type urlobj) url-proxy-services))
+    (concat "PROXY " (cdr (assoc (url-type urlobj) url-proxy-services))))
+   ;;
+   ;; Should check for socks
+   ;;
+   (t
+    "DIRECT")))
+
+(defvar url-proxy-locator 'url-default-find-proxy-for-url)
+
+(defun url-find-proxy-for-url (url host)
+  (let ((proxies (split-string (funcall url-proxy-locator url host) " *; *"))
+       (proxy nil)
+       (case-fold-search t))
+    ;; Not sure how I should handle gracefully degrading from one proxy to
+    ;; another, so for now just deal with the first one
+    ;; (while proxies
+    (if (listp proxies)
+       (setq proxy (pop proxies))
+      (setq proxy proxies))
+    (cond
+     ((string-match "^direct" proxy) nil)
+     ((string-match "^proxy +" proxy)
+      (concat "http://"; (substring proxy (match-end 0)) "/"))
+     ((string-match "^socks +" proxy)
+      (concat "socks://" (substring proxy (match-end 0))))
+     (t
+      (url-warn 'url (format "Unknown proxy directive: %s" proxy) 'critical)
+      nil))))
+
+(defun url-retrieve-internally (url &optional no-cache)
+  (let* ((url-working-buffer (if (and url-multiple-p
+                                     (string-equal
+                                      (if (bufferp url-working-buffer)
+                                          (buffer-name url-working-buffer)
+                                        url-working-buffer)
+                                      url-default-working-buffer))
+                                (url-get-working-buffer-name)
+                              url-working-buffer))
+        (urlobj (url-generic-parse-url url))
+        (type (url-type urlobj))
+        (url-using-proxy (if (url-host urlobj)
+                             (url-find-proxy-for-url urlobj
+                                                     (url-host urlobj))
+                           nil))
+        (handler nil)
+        (original-url url)
+        (cached nil))
+    (if url-using-proxy (setq type "proxy"))
+    (setq cached (url-is-cached url)
+         cached (and cached (not (url-cache-expired url cached)))
+         handler (if cached
+                     'url-cache-extract
+                   (car-safe
+                    (cdr-safe (assoc (or type "auto")
+                                     url-registered-protocols))))
+         url (if cached (url-cache-create-filename url) url))
+    (save-excursion
+      (set-buffer (get-buffer-create url-working-buffer))
+      (if (boundp 'buffer-file-coding-system)
+         (setq buffer-file-coding-system nil))
+      (setq url-current-can-be-cached (not no-cache)
+           url-current-object urlobj))
+    (if (and handler (fboundp handler))
+       (funcall handler url)
+      (set-buffer (get-buffer-create url-working-buffer))
+      (erase-buffer)
+      (setq url-current-mime-type "text/html")
+      (insert "<title> Link Error! </title>\n"
+             "<h1> An error has occurred... </h1>\n"
+             (format "The link type `<code>%s</code>'" type)
+             " is unrecognized or unsupported at this time.<p>\n"
+             "If you feel this is an error in Emacs-W3, please "
+             "<a href=\"mailto://"; url-bug-address "\">send me mail.</a>"
+             "<p><address>William Perry</address><br>"
+             "<address>" url-bug-address "</address>"))
+    (cond
+     ((and url-be-asynchronous (not cached)
+          (member type '("http" "https" "proxy" "file" "ftp")))
+      nil)
+     ((and url-be-asynchronous (get-buffer url-working-buffer))
+      (funcall url-default-retrieval-proc (buffer-name)))
+     ((not (get-buffer url-working-buffer)) nil)
+     ((and (not url-inhibit-mime-parsing)
+          (or cached (url-mime-response-p t)))
+      (or cached (url-parse-mime-headers nil t))))
+    (if (and (or (not url-be-asynchronous)
+                (not (equal type "http")))
+            url-current-object
+            (not url-current-mime-type))
+       (setq url-current-mime-type (mm-extension-to-mime
+                                    (url-file-extension
+                                     (url-filename
+                                      url-current-object)))))
+    (if (not url-be-asynchronous)
+       (url-store-in-cache url-working-buffer))
+    (if (not url-global-history-hash-table)
+       (setq url-global-history-hash-table (make-hash-table :size 131
+                                                            :test 'equal)))
+    (if (not (string-match "^\\(about\\|www\\):" original-url))
+       (progn
+         (setq url-history-changed-since-last-save t)
+         (cl-puthash original-url (current-time)
+                     url-global-history-hash-table)))
+    (cons cached url-working-buffer)))
+
+;;;###autoload
+(defun url-retrieve (url &optional no-cache expected-md5)
+  "Retrieve a document over the World Wide Web.
+The document should be specified by its fully specified
+Uniform Resource Locator.  No parsing is done, just return the
+document as the server sent it.  The document is left in the
+buffer specified by url-working-buffer.  url-working-buffer is killed
+immediately before starting the transfer, so that no buffer-local
+variables interfere with the retrieval.  HTTP/1.0 redirection will
+be honored before this function exits."
+  (url-do-setup)
+  ;;(url-download-minor-mode t)
+  (if (and (fboundp 'set-text-properties)
+          (subrp (symbol-function 'set-text-properties)))
+      (set-text-properties 0 (length url) nil url))
+  (if (and url (string-match "^url:" url))
+      (setq url (substring url (match-end 0) nil)))
+  (let ((status (url-retrieve-internally url no-cache)))
+    status))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; How to register a protocol
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun url-register-protocol (protocol &optional retrieve expander defport)
+  "Register a protocol with the URL retrieval package.
+PROTOCOL is the type of protocol being registers (http, nntp, etc),
+         and is the first chunk of the URL.  ie: http:// URLs will be
+         handled by the protocol registered as 'http'.  PROTOCOL can
+         be either a symbol or a string - it is converted to a string,
+         and lowercased before being registered.
+RETRIEVE (optional) is the function to be called with a url as its
+         only argument.  If this argument is omitted, then this looks
+         for a function called 'url-PROTOCOL'.  A warning is shown if
+         the function is undefined, but the protocol is still
+         registered.
+EXPANDER (optional) is the function to call to expand a relative link
+         of type PROTOCOL.  If omitted, this defaults to
+         `url-default-expander'
+
+Any proxy information is read in from environment variables at this
+time, so this function should only be called after dumping emacs."
+  (let* ((protocol (cond
+                   ((stringp protocol) (downcase protocol))
+                   ((symbolp protocol) (downcase (symbol-name protocol)))
+                   (t nil)))
+                    
+        (retrieve (or retrieve (intern (concat "url-" protocol))))
+        (expander (or expander 'url-default-expander))
+        (cur-protocol (assoc protocol url-registered-protocols))
+        (urlobj nil)
+        (cur-proxy (assoc protocol url-proxy-services))
+        (env-proxy (or (getenv (concat protocol "_proxy"))
+                       (getenv (concat protocol "_PROXY"))
+                       (getenv (upcase (concat protocol "_PROXY"))))))
+
+    (if (not protocol)
+       (error "Invalid data to url-register-protocol."))
+    
+    (if (not (fboundp retrieve))
+       (message "Warning: %s registered, but no function found." protocol))
+
+    ;; Store the default port, if none previously specified and
+    ;; defport given
+    (if (and defport (not (assoc protocol url-default-ports)))
+       (setq url-default-ports (cons (cons protocol defport)
+                                     url-default-ports)))
+    
+    ;; Store the appropriate information for later
+    (if cur-protocol
+       (setcdr cur-protocol (cons retrieve expander))
+      (setq url-registered-protocols (cons (cons protocol
+                                                (cons retrieve expander))
+                                          url-registered-protocols)))
+
+    ;; Store any proxying information - this will not overwrite an old
+    ;; entry, so that people can still set this information in their
+    ;; .emacs file
+    (cond
+     (cur-proxy nil)                   ; Keep their old settings
+     ((null env-proxy) nil)            ; No proxy setup
+     ;; First check if its something like hostname:port
+     ((string-match "^\\([^:]+\\):\\([0-9]+\\)$" env-proxy)
+      (setq urlobj (url-generic-parse-url nil)) ; Get a blank object
+      (url-set-type urlobj "http")
+      (url-set-host urlobj (url-match env-proxy 1))
+      (url-set-port urlobj (url-match env-proxy 2)))
+     ;; Then check if its a fully specified URL
+     ((string-match url-nonrelative-link env-proxy)
+      (setq urlobj (url-generic-parse-url env-proxy))
+      (url-set-type urlobj "http")
+      (url-set-target urlobj nil))
+     ;; Finally, fall back on the assumption that its just a hostname
+     (t
+      (setq urlobj (url-generic-parse-url nil)) ; Get a blank object
+      (url-set-type urlobj "http")
+      (url-set-host urlobj env-proxy)))
+
+     (if (and (not cur-proxy) urlobj)
+        (progn
+          (setq url-proxy-services
+                (cons (cons protocol (concat (url-host urlobj) ":"
+                                             (url-port urlobj)))
+                      url-proxy-services))
+          (message "Using a proxy for %s..." protocol)))))
+
+(provide 'url)
diff --git a/lisp/vmsloadup.el b/lisp/vmsloadup.el
new file mode 100644
index 0000000..6537ea7
--- /dev/null
+++ b/lisp/vmsloadup.el
@@ -0,0 +1,3 @@
+(load "./docomp.el")
+(load "./w3-vars.el")
+(load "./url.el")
diff --git a/lisp/w3-about.el b/lisp/w3-about.el
new file mode 100644
index 0000000..6e7bda7
--- /dev/null
+++ b/lisp/w3-about.el
@@ -0,0 +1,580 @@
+;;; w3-about.el --- About pages for emacs-w3
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:10 $
+;; Version: $Revision: 1.1 $
+;; Keywords: hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;###autoload
+(defun w3-about (url)
+  ;; Fetch an about page url
+  (let* ((data (url-generic-parse-url url))
+        (node (downcase (url-filename data))))
+    (if (string= "document" node)
+       (w3-document-information)
+      (save-excursion
+       (set-buffer (get-buffer-create url-working-buffer))
+       (erase-buffer)
+       (setq url-current-mime-viewer (mm-mime-info "text/html" nil 5)
+             url-current-mime-headers '(("content-type" . "text/html")))
+       (cond
+        ((string= "" node)
+         (insert (format
+                  "
+<html>
+  <head>
+    <title>Emacs-W3 v%s</title>
+    <link rel=\"made\" href=\"mailto:address@hidden";>
+    <link rel=\"stylesheet\" href=\"about:style\">
+  </head>
+  <body>
+    <h1>Emacs-W3 &trade;<br>v%s</h1>
+    <p align=\"center\">
+      Copyright &copy; 1993-1995 William M. Perry<br>
+      All rights reserved.
+    </p>
+    <hr width=\"50%%\">
+    <p>
+      Welcome to Emacs-w3!  Please see the <a href=\"info:w3#Top\">info
+       documentation</a>, or the <a
+       href=\"http://www.cs.indiana.edu/elisp/w3/docs.html\";>HTML
+       version</a> online.
+    </p>
+    <p>
+      Information about the <a href=\"authors\">authors</a>, <a
+       href=\"emacs\">versions of emacs</a>, and <a
+       href=\"eggs\">easter eggs</a> is also available.
+    </p>
+    <address>
+      Please send any bugs/comments to<br>
+      <a href=\"mailto:%s\";>%s</a>
+    </address>
+    <hr>
+    <wired><pinhead></wired>
+  </body>
+</html>
+"
+                  w3-version-number w3-version-number w3-bug-address 
w3-bug-address)))
+        ((string= "style" node)
+         (insert
+          "
+/* This is the stylesheet for the about pages for Emacs-w3 */
+
+address,h1,h2,h3,h4,h5,h6 { text-align: center }
+wired { color: yellow }
+wired { background: red }
+"))
+        ((string= "license" node)
+         (kill-buffer (current-buffer))
+         (describe-copying))
+        ((string= "warranty" node)
+         (kill-buffer (current-buffer))
+         (describe-no-warranty))
+        ((string= "arena.xpm" node)
+         (insert
+          "/* XPM */
+static char *arena[] = {
+/* width height num_colors chars_per_pixel */
+\"   109    84        3            1\",
+/* colors */
+\". c #d2c7b1\",
+\"# c #dcd1ba\",
+\"a c #e6dac2\",
+/* pixels */
+\"a.a.aa.a##a###aa##a.a.#.aa.....a##a#aa.#a#a###.#.#aa.aa.#aa#aa#.a.a.aa.a##a###aa##a.a.#.aa.....a##a#aa.#a#a##\",
+\"#a.a#a##a###...a#aa#aa..aa.aa###aa#.a...a.aa#..a##..aa#a.##aa.a.#a.a#a##a###...a#aa#aa..aa.aa###aa#.a...a.aa#\",
+\"a.aaa.aaa#aa#aa#.aa#....aa..###a.#a...#.#.#.....a.#.#aaa#aa..#a#a.aaa.aaa#aa#aa#.aa#....aa..###a.#a...#.#.#..\",
+\".#a#.##a..a#aa#.###a.#a..a#.aa.##.#.a#.#..a#.a#a#a.aa#.##a####.#.#a#.##a..a#aa#.###a.#a..a#.aa.##.#.a#.#..a#.\",
+\"####.###a##a.#aa#.#..a..##a.a#a##a##..aa##.#..#.....a..##..a.a..####.###a##a.#aa#.#..a..##a.a#a##a##..aa##.#.\",
+\"..aa..a#aa#.#a#aaa.a#aa.#....#a#a.###a.#a.a.aaa.###.aaaa#.##aa.#..aa..a#aa#.#a#aaa.a#aa.#....#a#a.###a.#a.a.a\",
+\"##a##aa#a#..#a..a.##a..#..##..aaa#a.aaa.#a..###.a.#.#aa#.##.a.a###a##aa#a#..#a..a.##a..#..##..aaa#a.aaa.#a..#\",
+\".aaaaaaa#a#.aaa#.a#.aa.#a.a#aa..##aa#.##..#.a..#.a#.#a####aaaaa#.aaaaaaa#a#.aaa#.a#.aa.#a.a#aa..##aa#.##..#.a\",
+\".a#.aa#.#a..a#aa###.aa#.a.a#.#.a.##.aaaa#####aaa.a.a#.a..a.aa#...a#.aa#.#a..a#aa###.aa#.a.a#.#.a.##.aaaa#####\",
+\"#.#.##.##a.#.a#..#a###a.##aa..a.#a#a.##a#.##...a#.aa.aa#a..aa####.#.##.##a.#.a#..#a###a.##aa..a.#a#a.##a#.##.\",
+\".#.##a..a..#a.#.#aa##a.#..#aa#.#a#...#..#.a#a#aa#.#a.aa..##.aaaa.#.##a..a..#a.#.#aa##a.#..#aa#.#a#...#..#.a#a\",
+\".#aa...a.a##aaa..#a.aa.#a##...#a##aa#aa#..#...#.##...a.a...aa..a.#aa...a.a##aaa..#a.aa.#a##...#a##aa#aa#..#..\",
+\".aaa###.a#..a#.#..aa.a##..##.#a#.a##a#a.#aa#....#..#a.a.a#aa.aa#.aaa###.a#..a#.#..aa.a##..##.#a#.a##a#a.#aa#.\",
+\"#.#...aa.#aaaa.#####.##..a..a.##.#aa##aaaaa.aa.aa#.#....##aa.a###.#...aa.#aaaa.#####.##..a..a.##.#aa##aaaaa.a\",
+\".a...a.aa.#a#aa#.aa.a.a...#a#..a#a.a.a##.#aaaa.#a##aa.#aa.#a.#.#.a...a.aa.#a#aa#.aa.a.a...#a#..a#a.a.a##.#aaa\",
+\"#.a.a#aaaaa#aa#.a#.aaa.#aa#..a##aa#a#.aaa..##.a.aa.aa.a....##a.##.a.a#aaaaa#aa#.a#.aaa.#aa#..a##aa#a#.aaa..##\",
+\"..##.aaaa#aa.aa.#a#a#a#.a##.###..##.a#.#aa.a#.a#.###a.###a#.#aa...##.aaaa#aa.aa.#a#a#a#.a##.###..##.a#.#aa.a#\",
+\".a.#.aaa######a##.##a#..a#.#.aa.aa#aa...a#.a#.aaaa#a..a.aa#...a#.a.#.aaa######a##.##a#..a#.#.aa.aa#aa...a#.a#\",
+\".a#.##a#a#####.##a.#.a#aaa#a.##a.aa##aa##aa.aa##..a###a#a.aaa..a.a#.##a#a#####.##a.#.a#aaa#a.##a.aa##aa##aa.a\",
+\"a.aa#.##.a.a#aaa...aa.aaaa.#a#a.a.a.#aa..#a#aa#.aaaa.aa#....#a.#a.aa#.##.a.a#aaa...aa.aaaa.#a#a.a.a.#aa..#a#a\",
+\"#.aaa.###aa.#.aaa##aa#.aaaa#.###a#.a.#..aaa#.a.a#.#....a#.#a#a.##.aaa.###aa.#.aaa##aa#.aaaa#.###a#.a.#..aaa#.\",
+\"##a.aa..#.a.##.a.a###a##a#....a#...a#a..#a..#.aa..a.#a.#..a..a.a##a.aa..#.a.##.a.a###a##a#....a#...a#a..#a..#\",
+\"a#.a#a..#a.####..#aa###.#aa#a..aa.a.aa#aa#a..a#..aaa#a..a#a.aaa.a#.a#a..#a.####..#aa###.#aa#a..aa.a.aa#aa#a..\",
+\"#a..aaa.a.#.a##aa##aa#aa.aaa##.###...aa.aa#a.##a##a.a##.#..#.##a#a..aaa.a.#.a##aa##aa#aa.aaa##.###...aa.aa#a.\",
+\".a.a.a#a#a#.#a...aaa##...#.#aa#aaa...##.###.a#a.#.#a.a..#aaa.a.a.a.a.a#a#a#.#a...aaa##...#.#aa#aaa...##.###.a\",
+\"a.#a#.##...#.aa#####aaa#.###a##..a.a.##..#.#a####.#.###.a....##aa.#a#.##...#.aa#####aaa#.###a##..a.a.##..#.#a\",
+\".#a#a.###....##..a#a#.a##..#aaa#a.#aa###.#..a####a..###aaa..#.##.#a#a.###....##..a#a#.a##..#aaa#a.#aa###.#..a\",
+\".##aa#a.#..##aa.a.#..###a#.aa.#.##..#.##...#..a.####.#.a.a##aa.#.##aa#a.#..##aa.a.#..###a#.aa.#.##..#.##...#.\",
+\".#a#.#a#a#..a#a.a#a.a#.aa#.#aa##aaa##.##...aa#..#.##...##.####aa.#a#.#a#a#..a#a.a#a.a#.aa#.#aa##aaa##.##...aa\",
+\"..aaaa.a#a.#.aa.....a.aa...aa#aa.a####aa##a.##a####.aa.#a.a..#.#..aaaa.a#a.#.aa.....a.aa...aa#aa.a####aa##a.#\",
+\".#...#..####.#.a.a.aa.#aa...#aa#a.###a#aa..a#.#a.##.#a##.aaaa.##.#...#..####.#.a.a.aa.#aa...#aa#a.###a#aa..a#\",
+\"aa##..a.a..a.aa.###aa.##aa.a##a..#.###.a.#a#a#...##a.aaaa#..#.aaaa##..a.a..a.aa.###aa.##aa.a##a..#.###.a.#a#a\",
+\"#aaaaa#aa#a##.a#aa...aaa.aaaa..a#.a.##.a.#.a#.a#a###.##a#aa.aaa##aaaaa#aa#a##.a#aa...aaa.aaaa..a#.a.##.a.#.a#\",
+\"..a#..#####aa#a.aa.a##.a.a#.#aa#.a.#a.#aa#...a...#.a#.a##a.aa..#..a#..#####aa#a.aa.a##.a.a#.#aa#.a.#a.#aa#...\",
+\"#aa#a....#aa####a.#a.#aa#a#..#.a#.aa#.aa##a.#a.#..a#a#..#a.a.aaa#aa#a....#aa####a.#a.#aa#a#..#.a#.aa#.aa##a.#\",
+\"#aa...#aa#a.#.#.a.a#a#####a#.a.#a#a##.aa.#aaaa#.aaa..#..a...aa.a#aa...#aa#a.#.#.a.a#a#####a#.a.#a#a##.aa.#aaa\",
+\"....#..#a##.#.##aa###aaaaa..a..#.#..##.##..#aa.#.aa#a.a.#aa.a.aa....#..#a##.#.##aa###aaaaa..a..#.#..##.##..#a\",
+\"#a#a..#a#aa.a..a...##.a##.#a##.....a.##.aa.aa....aa..###a##..##a#a#a..#a#aa.a..a...##.a##.#a##.....a.##.aa.aa\",
+\"aa#aa.a##.#a##a#...#.#a#aa#.#a#aaa.##a.##.aa.#.aaa##.a#a.##a#.a.aa#aa.a##.#a##a#...#.#a#aa#.#a#aaa.##a.##.aa.\",
+\"a.##.a##.a#a.###..aa.#..a#.a#.a#.a#a..#a##a.a#..a...aaaaa###....a.##.a##.a#a.###..aa.#..a#.a#.a#.a#a..#a##a.a\",
+\"#a......##.##a.aaaa#.##a...###.#.#a.a.aa#.#a..aaa...#.#aaaa###a##a......##.##a.aaaa#.##a...###.#.#a.a.aa#.#a.\",
+\".aa#a#..a.#a...a..a##.###...####a..#aa#a..a..a.a#....a##a.a#..a..aa#a#..a.#a...a..a##.###...####a..#aa#a..a..\",
+\".#..#.aa#aaaa.aa..a.aa#.#.#..a##.##a##a.aaaaa...#.##a#.aaaa##.a..#..#.aa#aaaa.aa..a.aa#.#.#..a##.##a##a.aaaaa\",
+\"aa..#.a##a.a##aaaa#aa#aa#a.#a...a#a##a#.a.#a.a#..a.a..####a.a##.aa..#.a##a.a##aaaa#aa#aa#a.#a...a#a##a#.a.#a.\",
+\"a#...##..#.#aa#.aa...#..#.aa#a...###.##a###a#.a#.#.a.#.a.aa#.#a#a#...##..#.#aa#.aa...#..#.aa#a...###.##a###a#\",
+\"#a.aa.##a.aa#.a.###.a#a##aaa.aa###.a.#a####...a.a...#.a#a##.###a#a.aa.##a.aa#.a.###.a#a##aaa.aa###.a.#a####..\",
+\"a##.a.#.a..a#...###aa###a.a.aaaa.##.#a.#.#.a.##aa.a#.a.###.#aa.#a##.a.#.a..a#...###aa###a.a.aaaa.##.#a.#.#.a.\",
+\"#a##..##.#.aa..######.a#aaa#a.aa#a.###a.###.aaa.a.a#a#aaaa##a#aa#a##..##.#.aa..######.a#aaa#a.aa#a.###a.###.a\",
+\".a#a#.a###a##.a....##aa..a.a...#a#.a#a..###.aa#.a..a#.a.aa#a.a##.a#a#.a###a##.a....##aa..a.a...#a#.a#a..###.a\",
+\"a.a#.#aa#aa#.#aaa.#a.a##.aa..aa#a.a..a..a##.a#aa..#a.aa#a##a.a#.a.a#.#aa#aa#.#aaa.#a.a##.aa..aa#a.a..a..a##.a\",
+\"..a##a.##.####a##..a#a.aa.aa.a.aa##.##a##.###a.aaa..#aaa#.#.a#....a##a.##.####a##..a#a.aa.aa.a.aa##.##a##.###\",
+\".#..#....a..a#..####.#a##.#a#a.aa.##a.a.a#a.aaa#a#...a#.....a..a.#..#....a..a#..####.#a##.#a#a.aa.##a.a.a#a.a\",
+\"..#.#.a...a.#.a#.a#a##.a...#a.#.###a....a#....a#.#.#a.##..#a...#..#.#.a...a.#.a#.a#a##.a...#a.#.###a....a#...\",
+\"aa###.aaaa##aa..a#aaa.#a..a.a#.a#a..#..#.##aa#.##.a#.#.aaa#.aa#aaa###.aaaa##aa..a#aaa.#a..a.a#.a#a..#..#.##aa\",
+\"#.a#a..#aaa..#aa##aa#..aa...a#####a..###.aa..a.#.#a.#a#.a#a.a#aa#.a#a..#aaa..#aa##aa#..aa...a#####a..###.aa..\",
+\"a#a.aa##a..#.a#aa..#a#.#a#..#.#.###a#.#...aaaa##aa.#aaa...###.#aa#a.aa##a..#.a#aa..#a#.#a#..#.#.###a#.#...aaa\",
+\"aa.#...##...a#.##.a..a###..#..#.#.a.a#aa.a##.aa.aaa..a.a##.a.#a#aa.#...##...a#.##.a..a###..#..#.#.a.a#aa.a##.\",
+\"a###..##aa##.#.####.###..aa.a#..aa.###a#a##a#a#aa.##a.a.a#.#aaa#a###..##aa##.#.####.###..aa.a#..aa.###a#a##a#\",
+\"#a#...a.aaa#.#a.a#aa#a#a#a.aa....a#.#..a.##....aa#.a.#a..#.##aaa#a#...a.aaa#.#a.a#aa#a#a#a.aa....a#.#..a.##..\",
+\"a.aaa#a######a##.a#aaa.###.##aaa.aa##a#.#a#aaa###a..#a##a..aa.a.a.aaa#a######a##.a#aaa.###.##aaa.aa##a#.#a#aa\",
+\"a##...##aaaa##a##..#aa#..##.#.a####a.......#a#a##a###a####a..a.aa##...##aaaa##a##..#aa#..##.#.a####a.......#a\",
+\".a.a..#a....#a#...a#..#.a.#.aa.a..##a...#a.#aa...#.a##.aa.#.aa#..a.a..#a....#a#...a#..#.a.#.aa.a..##a...#a.#a\",
+\".a..aa#..a.aa#.aaaaa##.a.a.a.a#.a.#..a....#.#a..aa...a...a#aaa#a.a..aa#..a.aa#.aaaaa##.a.a.a.a#.a.#..a....#.#\",
+\"##.a.a.a.##...#..#aaa.a.#.a#.#a#.a..#aa.#a##aaaa.aa#.##.aa..aa####.a.a.a.##...#..#aaa.a.#.a#.#a#.a..#aa.#a##a\",
+\"a.a.aa.a##a###aa##a.a.#.aa.....a##a#aa.#a#a###.#.#aa.aa.#aa#aa#.a.a.aa.a##a###aa##a.a.#.aa.....a##a#aa.#a#a##\",
+\"#a.a#a##a###...a#aa#aa..aa.aa###aa#.a...a.aa#..a##..aa#a.##aa.a.#a.a#a##a###...a#aa#aa..aa.aa###aa#.a...a.aa#\",
+\"a.aaa.aaa#aa#aa#.aa#....aa..###a.#a...#.#.#.....a.#.#aaa#aa..#a#a.aaa.aaa#aa#aa#.aa#....aa..###a.#a...#.#.#..\",
+\".#a#.##a..a#aa#.###a.#a..a#.aa.##.#.a#.#..a#.a#a#a.aa#.##a####.#.#a#.##a..a#aa#.###a.#a..a#.aa.##.#.a#.#..a#.\",
+\"####.###a##a.#aa#.#..a..##a.a#a##a##..aa##.#..#.....a..##..a.a..####.###a##a.#aa#.#..a..##a.a#a##a##..aa##.#.\",
+\"..aa..a#aa#.#a#aaa.a#aa.#....#a#a.###a.#a.a.aaa.###.aaaa#.##aa.#..aa..a#aa#.#a#aaa.a#aa.#....#a#a.###a.#a.a.a\",
+\"##a##aa#a#..#a..a.##a..#..##..aaa#a.aaa.#a..###.a.#.#aa#.##.a.a###a##aa#a#..#a..a.##a..#..##..aaa#a.aaa.#a..#\",
+\".aaaaaaa#a#.aaa#.a#.aa.#a.a#aa..##aa#.##..#.a..#.a#.#a####aaaaa#.aaaaaaa#a#.aaa#.a#.aa.#a.a#aa..##aa#.##..#.a\",
+\".a#.aa#.#a..a#aa###.aa#.a.a#.#.a.##.aaaa#####aaa.a.a#.a..a.aa#...a#.aa#.#a..a#aa###.aa#.a.a#.#.a.##.aaaa#####\",
+\"#.#.##.##a.#.a#..#a###a.##aa..a.#a#a.##a#.##...a#.aa.aa#a..aa####.#.##.##a.#.a#..#a###a.##aa..a.#a#a.##a#.##.\",
+\".#.##a..a..#a.#.#aa##a.#..#aa#.#a#...#..#.a#a#aa#.#a.aa..##.aaaa.#.##a..a..#a.#.#aa##a.#..#aa#.#a#...#..#.a#a\",
+\".#aa...a.a##aaa..#a.aa.#a##...#a##aa#aa#..#...#.##...a.a...aa..a.#aa...a.a##aaa..#a.aa.#a##...#a##aa#aa#..#..\",
+\".aaa###.a#..a#.#..aa.a##..##.#a#.a##a#a.#aa#....#..#a.a.a#aa.aa#.aaa###.a#..a#.#..aa.a##..##.#a#.a##a#a.#aa#.\",
+\"#.#...aa.#aaaa.#####.##..a..a.##.#aa##aaaaa.aa.aa#.#....##aa.a###.#...aa.#aaaa.#####.##..a..a.##.#aa##aaaaa.a\",
+\".a...a.aa.#a#aa#.aa.a.a...#a#..a#a.a.a##.#aaaa.#a##aa.#aa.#a.#.#.a...a.aa.#a#aa#.aa.a.a...#a#..a#a.a.a##.#aaa\",
+\"#.a.a#aaaaa#aa#.a#.aaa.#aa#..a##aa#a#.aaa..##.a.aa.aa.a....##a.##.a.a#aaaaa#aa#.a#.aaa.#aa#..a##aa#a#.aaa..##\",
+\"..##.aaaa#aa.aa.#a#a#a#.a##.###..##.a#.#aa.a#.a#.###a.###a#.#aa...##.aaaa#aa.aa.#a#a#a#.a##.###..##.a#.#aa.a#\",
+\".a.#.aaa######a##.##a#..a#.#.aa.aa#aa...a#.a#.aaaa#a..a.aa#...a#.a.#.aaa######a##.##a#..a#.#.aa.aa#aa...a#.a#\",
+\".a#.##a#a#####.##a.#.a#aaa#a.##a.aa##aa##aa.aa##..a###a#a.aaa..a.a#.##a#a#####.##a.#.a#aaa#a.##a.aa##aa##aa.a\",
+\"a.aa#.##.a.a#aaa...aa.aaaa.#a#a.a.a.#aa..#a#aa#.aaaa.aa#....#a.#a.aa#.##.a.a#aaa...aa.aaaa.#a#a.a.a.#aa..#a#a\"
+};
+")
+         (setq url-current-mime-headers
+               '(("content-type"              . "image/x-pixmap"))
+               url-current-mime-type "image/x-pixmap"
+               url-current-mime-viewer (mm-mime-info "image/x-pixmap" nil 5)))
+        ((string= "cXVvdGVz" (base64-encode node))
+         (insert
+          "
+H4sIAMtPtS8AA5VZTZPbNhLdM38FrMtcNPoBe5kax+tYW/HGtXHWtUeIhERkSIABQDPMr9/3ukFq
+7JzW5bIlimz05+vXzb81D597Z+bgv7qUnfHZWPOpP707mdK7jK+lt8X8GDuz2Iz77GVwpkST57Z1
+OV/nYVhN564udKeHxuDPo/mnHV02H2NKcTmaw88Bt7x1t1iKC+adnW99cenQ/K15eGsvHrfa5Mzg
+X5x58bwnH3n4am543vjA0+LoSu/DzYxz25sx4oHsg88Q9P8f+852xg6LXWld5HUz1J/FShxuLi4X
+M7rOtz64o1l6j3PP5jbDaHipWfrVZAen2cHEq5mz6bzr+LHMF5faeYjw3gmnfbTrBY4NJqYOB8Ca
+OeBDLjZ0ZrThxYcOBzjT26/i2iHGFwOnU40FDzW+ZDdc/24OH/Xuw8m8tdm3Fr4/Gl8eMuR0iOIk
+5y/wl5tsskWfz+axOfCgg+GRB5XwhXHtooR5u290Npgnc6ZEa8aV7sUJeKphGuCqmB2ZJlVzWng2
+fZxg4hXybtnQK6ZYhDPKJzVj6ESQRrbtIw61iHe4abCbLoaHYn6b4fZbNBcc4/+E4y+utTPuPeOT
+uASRZ7owI8wPve9ni79QzJe+kYu3iGT1nbPi/XMRVWjPxd+oNV3c0qzLXOC81z/foG69QxJCo2BL
+g4tqqMYfwVpEkWHAFT8UhiFABnIKntUfch+L6f0osZULsDa4rpFrdEW9jgzFo20cp8GPLhSbVug2
+TlAmF9++iA+hSbYePjycm94NE3KN8szbeDkdRLXqHxiAywnmxyDfpzj4FqXl3GQmFyfUr4We5pri
+iHOnwQYHh9jcN1LuCI/GYrEBioX1ErsVXwYGS8yE6sPKL11cAq/wGJWQy3y9SkQDiwaFx5iIBBgI
+P88TbG+LlrscJiFf4ovkL1PtFmGlpCeL8fOH589Pb2gigepqYQqSHP7q/dCZFtHKMAZxhCuPxuXJ
+tZ6Fob6Ic+kNaqFIZfSuoQCG8nm8+OLhItgsulg65IasK4WmRYbzPy6gsN8Pa0l2OhlRQL/w4AYS
+nHiDH/Z8WsR5l8hcFSVE7pbHuCESmHrLc0sZXIPzVgkD4ucAc6huSJJcViHiVPhvhsG9nSanMYAo
+vXZxjZpQbZJUfegMEICPA30S0QtJFChr8lq1V7PGuSYysiQmcw6dxz2sJRMifrJTJBrzNBTIHCAl
+Xps2ht9nYK/tYsrwxCihQ9FQntybX5CfixQrPXCLg/SPI8pYcqshmL+ot9QCyN8LV/qLXZnrJiPx
+hrg4mnsyv7DxIKxOc14tQPfxTOG42NQx1eHaNIfAMEqmVyy9eoAuAnwLTIbOBpT7scktamWUe4lO
+yU/T9uXibjd+vsI1IzB91cQ2q4MlHxPilAjZAIfjDg3nh1GKmbqc9rqM0G9wNyf4B3VYjFDStXNK
+PKH0iX0I2QrEyCUmBRQi6dqgl5Q5IcG0PI38ThM+AXVXyeYvohZ8AejEc1TYmt/ihd3Tpa/eLXS9
+Or06WtspPI1gUbK/NlKOgt5Toi1tb9PNCYx+jvAAUjz+ISCw18wF0XEFdfdH66aKz2gTSJ5xRoc6
+4lMDsE8u3lA1/br3APq/RReEvcU4y8Tiw2oMPESNFHzhXwVoQUhX6IAkwUPL/eqUICBrfbsiz6Xj
+xCYzMBZFNPhO0+9iL+uT0Wa8uAfgbhBTX0Jc5FSkqsQHKdZG1FvNmosbvLvmih84qPXA6KxFCgQH
+EKDct0fowxEwm4C+2p6LtFifBLryZj/NYze1RNgQV/ZeavEpRSha0cvZhLORswAd1AF4TMparyFW
+NhSlwqzCLP4RoAMKJy9oneckiIln4WLXVW0MDRUUHSLvYpfRZNUUoTCmLFqYYs5XspMaN9e6AFdT
+koMXRy3xgeCAhxpi9jU5B7iMErpdGmrSMMMFXqZYrJT5ALlIWXoEdnTHBrnHQFD9nrnE2lj4ja3D
+M7eKOu5syIDAPfLkiwWYrq8ytQVoBGGWDM8VcIDOfA6MQlHG8ZDIN9URuUXTxe8PX10D/AY9e4Vf
+OBNYlwouMXibkzyJChLzYtuXza8FDdycm8URy/VS60EGdwwVtXAsqgbkD53WCko8ZxIcSJRk5mPB
+tThTuCcu0/l4OPk8oV8KJ0V92kusFIYchY4nXqCVoPnPSZj6I8hm8QOkA+UGMCppG7iVXrH3U5jt
+bKANm9iz+fDrx+d/mQ//eH735g0pbEQSVu6g3KBK0wIdCBNm8sgMqZM2ghVvnFmS5+JcaCZLNEIl
+JvpA/PFdWuYXjBPkfij1ER14IVARoBc4kB1X8mnr/cKTKw51TrEDLaEg+XLtjArux9plFipC+tra
+r1Afxa8ebGft+azdhpzmiRxu9JgIjmS1gosqijkAFbdYHwVqgXYCqUq6qMZbx2KVVC2qMpixqYQs
+TyzJ3M/s/neGi4ME3FGLRMUMmoeoS8FUdGfGwjNSGSx3ZqaUt6iK/pwCioTn/xetgMCmhaLWV9+J
+ptJCntBOt7FKHbHl59JHdXWNOUnHRphDRovWymQSoIK7k3keMkhb74TWyFjkGlCJlGAD9ZGDPPmf
+2HI2V+eGbeQbBoEqRQmlCEQmIUdsyFJeDWp95EiCSUh4J6tVyHOdMjSDFHnhv0iXMsdqf4U+YDgA
+84Gjjwuv7q7MtErgbUdp4zdRh0av1Z2N4g5QAt38WszOsFPbP6FsfgMUPMZHUjmXKo/CkBP8lYGd
+YYgPjaQAfYhKkdlN4lzvRca4je2jKRwQyNPBPF/LNgScmznPwm/FhUTwQoqBGxRjkIxo2yPr1N1p
+3oOQPDTi7PS2DZRvrmTagXv0hyuEs4qve6sOjdyUNMmIdtv9GxTSP7VXXGglJhxKqI+Qg70inDoe
+Ssu3uNA5CX872Iwin173P9jRsf1pipL9xEbGGGVBc8dGrHOMDBElrZXTiNh6PBQ5GRZEdhzkHSCO
+6CHhtuV7xWi+6M4zfkEHxgQC+gnnbqOpZD0mteleuiNZRUM34+FvYGkeAfL0Y62kxRM9krTP1hb4
+gCdXOUeUPMqM3VOf3Ii8Dksc6yk0zEwe5K69a7DUlF6FTxUZr3uYLwmVj5WG8ixOTDRhWEWc9Jz6
+APgpG6kQvuewajOTu+77F8KgY+jaFNmCTIocIzkSijlxW9cguXKD/vJyp3y3eYPRvJFtrTvklwxG
+TLrzfQ/CERwdaTdRaaGUgShDPT84mRKFcl8ivDfKUkgPJS8BOujpqEog1YftkueIpeskgIPsTzC/
+R47/hEJOCD4Vo0sasHRHcanSPnq7J3blrNePyH9CXmaLu3H1grN+sqpJHT/m4Gpf3OAnsQo44Olk
+/06SODYd/j8elNLVvBFfuPsKpZqrSwb2LWBw2UgUhxbmEmQNerdw68yBihlKBmx92UYbZgUZmIPf
+w+NjRaLbHE7b1D06EE2vzR35fMW8hPSBmyBCt3doW8MghHtOOqGDg7pwgygYBG4rDARyLtyxuQdt
+o5Mf3J3ygIOBr5ypExNC4i0ETRlL8yjGd+T4908ngWo2WlAeVzmbHMA1AsF7AymZTRqhz+JZ5Qly
+VUf7PDqp/VfZztSCIVEXH8L/weShC6gEJvZVWCKiTOTIE9n3/sM3Fm/bpaNBRPCdlQAkIn+FiMM7
+9NADOAe0draO/nWTIvSi3LF4N0d2UKE0ZAKnfTOplvUSF51vBoaVMa5Ix6WbTOi5OitxX6QtkFD6
+elAEMXL3QVHoPqCda6IDN8L4vxXIZYtinITBVNGr+eYWWqDbDApt/iKUdx726Wer+W+CIbO+7yQr
+fwDOJKs4KokyvqKosjvQ9Q8u6qAPPgAN/Ajs1kg2spPcBgoBCK6DYqrkjvMlvsCHGng3uAm1VU7b
+ejSjPb00yXfbuijs9zzoVHDc2pLlaq8uFRBgfpTRXuzSsRsoWweBbbnI9BbHLbRo4YlcXeyrQHP4
+IojLEv53BGlEFD5iTLGN/Ep805acyC9e3fwJA1ZZ92fOChOCQ/028zVL4nJLYAHXZyRvlnVZrVX2
+Fq5WOi6aC7eWWmwiQYclqCHtWKtX9hEvHEjUJwr6FWl5mPgHJo4Cd0Jo3jCrZCjVJf1ZBA32z5VD
+yc9hy00kdF1ICEcgvgltZBG+h8HgrIXbhmOVcIuafI1wcwBa5ZoB0XMLJbzzObj1J86jG+st9CK4
+aYochpGwunWA6xoSb9c9ClUHGAr3PJnDzz3XH0d6eAP4XazRZ5TJHtCVmlZaDH+ST99jF5f1pD6y
+cmWCVp/s3p0kqo3Qe3qamLCNrVBVYfM1VRYe8xdDFWoRGwmICmVrf8UlJRv5lgEohuqRoeiDHS+k
+k9T//eBlXND5j1d1AMGjde/HWNH2YcLXvJfqkyHZ4Tp3F8EHOW/i2SeSuAfZdi5E5GP1QS3IqgHV
+/MnOcKHs1UEpHMb5unY7mzlXNsAXHuYwzXDUQXp60b2BvudQot/LiikEeZ2R6UgqXpdFKunVi4If
+E4yf7EYOHjol9rIXCmxH5uqz0Ja6Omp26y61weuoAllEHek/uywCtJJv6c+C8wsXa+zzkyQ7l7DE
+NqaULHMWnCcM7RK3IZBFB5RqaQyXfJ4cmu1Ptu3rcac2stVliUCaQJAO1DL86iAp1MPKK446eBSd
+SUpECe57DcHOak5+IXlgOOrLh4yhTgawIUpe2m2FZa4ATNDtBJ1eIcDrXUt9llsg+U13hTGF2m3g
+fwzAlECCJ9vn7eK5Zi1Vf8+Dvh+U8AHqfrRXDyKE/kFKqWAlk0+qu+TOFgGVi/BXpI3UFFo+CCPG
+GUG/6z5q7XSXI+/WkTmLSp9Woq2Igmzo0BJQBPtIpi8kFldkduTbmKNQMerREJ58aEvFP8klzbLX
+lOG4U2iFQcueVakF2evV6TGj8qGwr+dlwencaH6f2RRAm3WfdkcEJDdfOLa9UEIVKX7arnKudrJ0
+wuAS9huaK3wSOuWQtHJhl9qa/VVe6dzpiJyKeNzubw2QoXVfeH+ZkRc/jnU8+KL2K0SS+Ah9/Rql
+uyUHYCMs8udfQ4sW8APIEl/21ZE7t32MQ7MTVto58HWTLixb3K22SDuH81pXXwT2pLb9Bn1o+g1T
+QN4UE7C2FZxu54iv23yPFj0H3fvIhW/0atSQC+ZSWvc/LM46zb4fAAA=
+")
+         (setq url-current-mime-headers
+               '(("content-transfer-encoding" . "base64")
+                 ("content-encoding" . "x-gzip"))))
+        ((string= "emlwcHk=" (base64-encode node))
+         (insert
+          "
+/9j/4AAQSkZJRgABAQAAAQABAAD//gBLCgpDUkVBVE9SOiBYViBWZXJzaW9uIDMuMTBhICBSZXY6
+IDEyLzI5Lzk0ICBRdWFsaXR5ID0gNTAsIFNtb290aGluZyA9IDE0Cv/bAEMAEAsMDgwKEA4NDhIR
+EBMYKBoYFhYYMSMlHSg6Mz08OTM4N0BIXE5ARFdFNzhQbVFXX2JnaGc+TXF5cGR4XGVnY//bAEMB
+ERISGBUYLxoaL2NCOEJjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2Nj
+Y2NjY2NjY//AABEIAJ0AWwMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJ
+Cgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQz
+YnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOE
+hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm
+5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIE
+BAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZ
+GiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SV
+lpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4
++fr/2gAMAwEAAhEDEQA/AKF84W+nHA+duewOTUY5A9fpU14o+3zkE/6xu/v6UyIBpUVskE81xStc
+9umpJczJI0iaFnZgpBPU+3GOv+fzEHOOhAx371S+2SHkhcjrxTXu5Sv8K4PH+fzrf2UjBYuEW7lw
+sMn5uRjHb/PSmiRd2O/+f1rNa7k3cgAgenP+elNN1IzDAUdOOfy/z/Sh0mDxsTWBPc/nSqAUY+Zg
+g4CEdemfyrOF7N6g+nGP8/40v2yQjbhccDG3H+f8/iKlImWLg1oXwxxnn8Of1oJP69apfa5ck8dO
+SR0A9fx7Gk+1SkEblz04X8MdP8/yXsZD+uQLfXBZm298Dr9f8/4VC0uCQ27PfmojcyMOCoz2wOP8
+/jTftTp8okjA9DGuf1FP2UjKWJV7o27wj7ZMSTjzDnjPf+fWnzxQRXcSW0vmrxk5zk55/wA/lTL7
+/j7uM44c5HU4zUcIH2iPIz839awkmmdsbTimmYyj5RnjA9unH/6qQ9e+49cCnjkdDkdh/SpbZSJj
+jkhOP8/56+9ei3yxuePTjzzUSlJgYPQDqP8APfn9ahB/eD0xknFaskAuEzIhVwOeR+VOhslKoYba
+RyMYYIT/APWrH2p0PDNPfQqm1YR5DjeBuCgcgdqi/hzn8znA/wA/41dnjFqrlw4lcY+cYzVRRjG3
+t0/z6/5+l023uZV4xjblADnAwCOc/h/n/wCv1p2AeuR6fSgDvgcAde340vf+ec1qc4hHG08D6YH+
+frTd+P8AloB7E0/GOw46UmWHHT6ilYdzevSxvJxuOPMY9eep71FD/r48f3h/OproIb6dXYgGRj0/
+n37frmqiysJMgDcOfavNk22e3BpLlSM5RwMcHPGKmsbeS6uxHCdnBLORkIo6k/p/jSskUR5Pmtx8
+vQDHrW5oUDCzEp+/PJ8pA/hBxx+v1rslU93Y8yNPllq9S/b6fbwqvyB3H8b8n6+34VZPPTHB/wA8
+09h2wcZ6dRTT256VyHX6kbwxzRmOVAyt1VhmuU1jTf7PuB5e4wyjKZOce3+f6V1w44649qq6taC8
+06RAuXX50wOcj+v+Na05crMqsOZHG+hH4Cj09sGlHIyPrz/9el2+ua7jzxpzjqR1z7UnP0/CnkZI
+JHft/n/P60gHHQ/nQM2r3/j9n6f6xun1qAW486PzYzl8HB9DU144N7OCQG85gMZznP8AhTRJJJKh
+dtxU8Z5rzJJpnuxfNFNGYcKpZx0HI9eP/rV1umRGC3tYdpUrCN2PUj/GuctLb7VdwQEAh2G/P90c
+muvhUF3b1OBj/PWums9Ejy6C3Y5uvqe3em8g96ec7e5PX/69MYfNnHX1rmOtAuc8fnTwcDgnPY0w
+cnnrwPpT1JK8Z64oEcbqtmbTUHjUZRiXQEYBBP8ASqnQkjnjp2/Ouv1WwF9bbVAWVMsjYHB78+n+
+fauUeNo3aN1ZXTgr6f59RXdRnzKx59aDi7ojI6nk5Jz1A/X+VJlv4UJHY7c1IVGQc9OeOnWmlTnq
+w+gOK2Zkmal4v+mze0jEA9etOgt55zuigd1B64AB/H/Ck1cNBNPhlyxY/KckD0I7etdEY5IoRHbl
+I0jUBVIBB9c+305615r953PZdRQilAx9CtpI7q5aRWSRIwoDKQeSc9evKj8q24MBMcc9vaoLK7F1
+G7yoqyREhypBBHqPY+9WYU2RqTgMRnp+ePanKV3c54xsrIcwwec+/vVK5cBlV2kZmOFjj6t+XNW8
+BSKRA8c/mR4DhSBuBOM9e4/n/TEqxbvbQomxfkjTyWzglphnP1z/AJ96WxdDNJCYpYpYjgpJIW59
+snmrVsv2UN5ZVS7mRwvPzHqeSeeBUhTdIZGA3kcnPBxiqbXQiKlfUr3CqSMB2duiiUr/AFGenasj
+VbWSWaOIWsouMkDeQfk5z82en41s3FslxNFI4BMTbxxnn/PPr1p1zH5yffIYfdc8kHn/AOv9aIy5
+dSZxctHscfPC8LlJEKuOQM5yPX/PvUBbk4DAfQVbvWke6k8376AJknrgdf1J9s1WIUHBJ/KvSi7x
+TZ58kk7I0dQUNdTr2LsD6da19L1CK6iS3nYrOq7SGPD47g1mXb7bq7XYpLSN8xPI5PT/AD2qopKS
+wyLuPlyK24DIUAj/AOv1rzOp7c0uS7N7T7KS3ub8TSBmmfMYH93/AB5/T3rRYlYiw9M8VJlGQEkN
+xxRxgc/Ngc569u34UNnOtCJSpRdpBXGRg8fWkPGB0xzzVN0ntb5UicfZ5SSqsM7W44/LpVht/lME
+Ks+3jjGD2pWLTJV45wTjsKrtcGK4bzj5ECDIdiMMfX8P8+lUNJ1T7U8sEoP2iFir9COO4Hp7Vpu0
+EsTRuUMbAhl45H/6qdmtyOZPYig1OyuAfKuomI6gN05/+v8ArUkMjuXJJwWOzjBxj0+uev8A9aob
+O0stPQpAEjz1YnOce/8An+VTHbKqSoW4JIxkbhQ0rgm7amBrgCaiWHeNT0z69fXoKz1kKDaJpFA7
+Dp/OrWvSg6iyDnYqrz0z9fx+tZbTRIxUvuPrxzXfTa5Ejz6qvN2OoawV55ZZcOGdiF/hHPepwiKo
+GF24OO+f8all5d/Uk8Zx+f8Aj+FMAGRgcnvXjzlqdVOnOs9RunwIl3cCNAg8pQFGeMlun5flWkjB
+kyDnHGD06dqy/Oe3mWSMByRh07EevHerkV3BLJtRtsrHPlycEn29fwrWDujZpQfKTSIHXay459Px
+phyevXqOKk3EEZGDj8Ka3T2z1FWykc3q3h/zrpruAPlzuZVPKn1HqKzLi+1rTkWMXcxU/wAMg3Ef
+ga7fuR0b6Zx+FNeNnHyyEfhkH/P+fWqjNrciUE1Y47S7vWdSu4opWmNqW/eBV2Lj0JA/D9K7EkBS
+c5A9R0H+c1EtvIXIluHfHO1VC/X3/Wm6hIVtGRW5k2xjPHUjP6USlfUUY8qsZakSxM7AMJSWKkdj
+ng+vGBVKTTrfedolA9EfA/CtORQccD26cH0x7/564qoyyhiFIYepzWEajTumZTw8r6M15MGRu+WI
+AP1/yKjkYKpbr2Hv/n/Hv1lk4lfjHzZ49z7VXYkyKAcYGcD8h+HWsXrI7F+6pXQD5PmPJIycHkf5
+9vT60s0auux4w3s388f59qeT+XcE4zn8v/1fSmjHPJ64B6dP8/Tp6U27LQ4aUHUnqMAniX9xcOpH
+ZvmB9uaI76aMgPAjcctEevboe/1NK5wD3I7dPwpgUBQTySCT7+/+fSqjNnXXaprQsjUoBw4ki9ih
+OB9RxUc2uabCmXuk5PQc+v8AnNYOuaq1p/o9sP3rDJY/wjnoK5zyppCzMCWxklq64Q5ldnMq0n0O
+8XxBb3LgWjCR+cb2Cg+nHX8uajbzJX8ydgzD7qrwF/z61yEGlySbTkjcOMCtqz+1WYCtIZkJACk5
+I7fLn/8AV2qZpbJjcaslc1SxUHcxIHGe/THP+I9fSomYBiPl6+oqTcHQMuMHp1A9cY/Tn8qqtJsY
+rg8e5/pXPbsOFbS0jWc/vH3dQx7dOf04/r1qPpMCo+8MZ5/z3p8jEXTgqykk/K3Gecgj68c0yQYA
+Ix8pHbt/nNRLSRv8dGw8HJAHXjt+Of5flTFbKnJPXnn39ad6Y6e38/rTBxIw/vcrzyex/kKTMMM7
+TGzkbRx3HQH17DsPrSkjP05z/SiQfKV9uwxg/T/P603cCoI6HGP8aI7F4xO6ZUl0WK5tZrwkGbcT
+gdcDjv7Dj6+lVkt41UAjA4xx/nP4fjW/pEypLJAwwGO9COMccgfln8/Ss66tzbXUsOMIDleP4T/k
+/XFXGpK7i2aYVx2M+3IjmeBcBcZU+nY/zqysscc8LyD5Q4bgegyMfl/kVBbqftc7EYYMO+e3+eaL
+v5RHnpuHt2P8v6Vo9WdVrxsy0t0Li4n/AHaoGIfHUAnr/L8zUEpzI3B61FbMFkZ2IVQvJz3P5eh/
+zzUMtyxkYrAXHZgcA/SmonmVKb9o+VHaTLaXimGR43Yfwg5IPf3zVabTp15hcSoeofhh+Pf8h/Os
+K7JW+mKsQRISMfWuh0q5lnsVeRtzKSM9zjPX8q5akXDVHTODpJST3M9mNv8ALMjRqDwXGF/E9M/j
+Q53AFSGIPBzwf8/59K0tV50q59FwAPbIrkwPKGY8puPO04z+VXS/eK5nCi5++nY2NwYZySDx/kVG
+CynHZjweuCTWZJLNGjsszDB6cEHn6VDJqNwo5KvnA+ZfWr9k0dVSHPC0jYIDEcnOcgjqP6j1/wDr
+VNPI14ieZgXaAhSOkoz0+vH0rNsbqS5GHIAzjj6j1+tbNtpsU8atJJIVJAKcAdfpUysmedC8JaGF
+cjy3W7jbIwAwx1H19Qe3/wBai8BZkCglVBcnGcdB9e9P1BQrSwrkJ5xXqScZB6/WtLSQDdvuAYeT
+jBHYnp+gq3LljzHoSm0ub0MAqu48Zz1Hr2/pTTjPJQn3UZrqNQ0i02u6qyEMB8p4x+NYMtqgkOGc
+D/epxqqSuHtY9j//2Q==
+")
+         (setq url-current-mime-viewer (mm-mime-info "image/jpeg" nil 5)
+               url-current-mime-type "image/gif"
+               url-current-mime-headers
+               '(("content-transfer-encoding" . "base64")
+                 ("content-type" . "image/gif"))))
+        ((string= "emacs" node)
+         (insert
+          "
+<html>
+  <head>
+    <title>Versions of Emacs</title>
+    <link rel=\"made\" href=\"mailto:address@hidden";>
+    <link rel=\"stylesheet\" href=\"about:style\">
+  </head>
+  <body>
+    <h1>Pointers to versions of emacs</h1>
+    <dl>
+      <dt> XEmacs
+      <dd> An extremely X-aware version of emacs 19 from Sun and UIUC.
+       This is the recommended emacsen to run Emacs-W3 on, allowing
+       inlined images, inlined mpegs, and variable height fonts,
+       among lots of other cool features.  Distribution is at <a
+       href=\"ftp://ftp.xemacs.org/pub/xemacs/\";>
+       ftp://ftp.xemacs.org/pub/xemacs/</a>, or check out the <a
+       href=\"http://www.xemacs.org/\";>XEmacs web page</a>.
+      <dt> Emacs 19
+      <dd> A slightly-less X-aware version, direct from the FSF.  This
+       is the second choice for most capable version of emacsen for
+       emacs-w3, and allows for different fonts (of the same height),
+       coloring of links, mouse, and menu support.  Distribution is
+       at <a href=\"ftp://ftp.gnu.ai.mit.edu/pub/gnu/\";>
+         ftp://ftp.gnu.ai.mit.edu/pub/gnu/</a>.
+      <dt> Emacs 19 for NeXTStep
+      <dd> A version of Emacs 19 that runs as a native NeXTStep
+       application.  Fonts/colors/menus/mouse support.  Distribution
+       is at <a
+         href=\"ftp://lynx.ps.uci.edu/pub/NeXT/emacs-19-for-NeXTstep\";>
+         ftp://lynx.ps.uci.edu/pub/NeXT/emacs-19-for-NeXTstep</a>.
+      <dt> OEmacs for DOS
+      <dd> A version of Emacs-19 for MS-DOG.  Distribution at <a
+         href=\"ftp://oak.oakland.edu/pub/msdos/oemacs/\";>OEmacs
+         4.1</a>.  Color and mouse support.  NOTE: Emacs-19 now has
+       native support for MS-DOS, so this version will likely
+       disappear.
+      <dt> AmigaDOS
+      <dd> A version of emacs 19 are available for AmigaDOS.  Emacs 19
+         is at <a href=\"ftp://ftp.wustl.edu:/pub/aminet/utils/gnu/\";>
+         ftp://ftp.wustl.edu:/pub/aminet/utils/gnu/</a> under the
+         filename a2.0bEmacs-bin.LHA.
+    </dl>
+    <hr width=\"75%\">
+    <p><cookie src=\"about:quotes\"></p>
+  </body>
+</html>
+"))
+        ((string= "eggs" node)
+         (insert "
+<html>
+ <head>
+  <title>Emacs-W3 Easter Eggs</title>
+  <link rel=\"stylesheet\" href=\"about:style\">
+ </head>
+ <body>
+  <h1>Emacs-W3 Easter Eggs</h1>
+  <hr width=\"75%\">
+  <p>
+   Did you really think it would be that easy?  Read the source, or
+experiment! :)
+  </p>
+  <hr width=\"75%\">
+  <cookie href=\"about:quotes\">
+ </body>
+</html>
+"))
+        ((string= "authors" node)
+         (insert "
+<html>
+ <head>
+  <title>The Emacs-W3 Team</title>
+  <link rel=\"stylesheet\" href=\"about:style\">
+ </head>
+ <body>
+  <hr width=\"85%\">
+  <hr width=\"75%\" label=\" The Emacs-W3 Team \">
+  <hr width=\"65%\" label=\" 1993 - 1996 \">
+  <hr width=\"55%\">
+  <dl>
+   <dt> Author
+   <dd> William Perry &lt;address@hidden&gt; (Hey, that's <i>me</i>)!
+        <br>
+        The main author of Emacs-W3.  Currently unsure what to put in here
+        about his employer. :)
+   <dt> Supporting Cast
+   <dd>
+    <dl>
+     <dt> Chuck Thompson &lt;address@hidden&gt;
+     <dd> The master of the XEmacs display code, which makes many of
+          the really cool things in Emacs-w3 possible.  I owe him
+          copious amounts of beer.
+     <dt> Ben Wing &lt;address@hidden&gt;
+     <dd> Another main XEmacs developer, and the man behind the
+          PearlSoft port of XEmacs to windows.  I owe him his choice
+          of alcoholic beverage as well.
+     <dt> Jamie Zawinski &lt;address@hidden&gt;
+     <dd> The main Lucid Emacs developer, now working for netscape on
+          Mozilla.  Helped me do the initial integration with Lucid
+          Emacs by telling me about stupid mistakes I made. :)
+     <dt> Marc Andreesen, Lou Montulli &lt;marca/address@hidden&gt;
+     <dd> The inspiration behind my efforts to create Emacs-W3
+          initially, because I hated the interfaces to Mosaic
+          and Lynx so much.
+    </dl>
+  </dl>
+  <p><cookie href=\"about:quotes\"></p>
+ </body>
+</html>
+"))
+
+        ((string= "cGhvdG8=" (base64-encode node))
+         (insert "
+R0lGODdhbAB4APQAADIyMjo6Ojw8PENDQ05OTldXV19fX2dnZ21tbXV1dXh4eIaGho+Pj5GRkZqa
+mqWlpaysrLW1tb29vcnJydHR0dPT0+Dg4Ofn5+zs7Pn5+fz8/AAAAAAAAAAAAAAAAAAAACwAAAAA
+bAB4AAAF/iAgjmRpnmiqrmzrvnAsz3Rt33iu73zv/8CgcEgsGo/IpHLJbDqf0Kh0Sq1ar9isdsvt
+er/gsHhMlgkC5aPgnB6u0d/AQEAcDAIBdnctuBPPcnhwWnYDRneBggCDJno3AwQEhjB5jDN2BAWS
+kyd2goAoeDmRBQamCAgGmoV0lJYnAgWyppmRKIWegK+LgTeRpgaoqAkJCgoLCwwELAOlqJqS0LK/
+qcHV0reeiIok3DaQBAYH1gjFyOcLCQeveeEIx8jGC8bC5QnDqAcJ4tMnm3NydJXwVgOcOHLm0KVb
+Z6JdMHjzjtETRgwfAn38NPljFZCgIDuPIh2oZw7iggYN/hyojJggHjIHKVWqTMkgHjwFxHDeGwds
+WaM+ubwJ2iWjmbNh8s4xYCDzgYMHEKJCUBnVqdOnMhswaKBQos4DPAtwGvGvUKIRH0F+ExksITqt
+MWWqfEBXagQIDyJEoJsVZc2uOC+aKnAghdk3cIbmuSFnFlJ4W1E2vSo1qt7KVfFOTal1add7F8H6
+LIFrzp05IoYWYnzKHrrIMelChaA3ggQJtXHfhSChqlWaTLXGI6YOrIFOuN7owdNnsS+KxY5FXvq0
+bl7atm9rx6378l7ZWR2g0ymscImyrFDzat7KBgHo8qYzlY33rt7t2m3Xti/7Kkzx55CXjwno2dGH
+LgGt/vaNKTm9FpdVlmWn3QQU4nfbbv3JxVVNxoB20WgjlDbHGdtUopYNCEEm2VzVRXgbhRRQCKOF
+uvnGlwN/zUPcRe2JIBY4pelymmk3IKTQg01J9SKMMTZZYX694XWjcMNVFMxAkRQiCVCfyHEiDa0h
+EBEyccF0kgOZ3SfBBBS06aSMF+Im5VU26VTRASACAA2QBiJy4B2SFNQWcejMRA8yfzUwlQO4wVgB
+jDI+iVt/NdmjgHHAgIWlJAXiMaR6NIxkT3THqKSAAZEQYEwwwJhywAIQRMpmmxVOcOEDJzVwgCal
+oArOL8eRAE2qZXkKlIJmiDOqST+SQso2axAgQDAO/tjGJJy3QbDQAXRY0mMzJBiVJSRmJYgLDdOO
+RByzmNSSCbQCSEuttbNi29u23ZbwbQHhTrPJP3wAFe9YMBi3rjkFNCZLrwX0SAIdB9DG5m0UrHlr
+wjQQSywuxmr55QuEldPhPgbY8WoDxuijgCYGOAwAHQtEYKuMFU9g2wN5IrfLwln2nB65kFyiTk4d
+pgLaSUuJqQBVEThAzQGnKpAXzTFmq8wmIfbMc568Dgv0iCJmIkMA95C6wDAKEWOAOamcXVFLZE5d
+wdwWtLkXAzvtiuo0C88iVnvNOLvKJmvgkiVRKhSAU1JjkrkAWCONI0IkCciVzgJ5SUDB3BVYUHfT
+/sYogIoqeQJVypYi4Ll1qpAU7rHYMbwHN5lwoaTVrrxOgkABFCzFgAUYMLC0Xm5acIEFFUjAFZXB
+ktWvJgr4yPOwhB9LLuwwyP5W7X7h/q4Iu/e+FPDCVxtB8ccnv/xfzU/+vKrS872xiO2OrXIycl3l
+VMkjYADBCAjAQAYygKMLZIAu9JpA55D3AAbcZWkOoEACSCCBBQhLb9ITHKcKpLUYBGBtL5mLbxwQ
+vZcJwAEWkAACDNEADQwweBLIQAptpR0KeK4CvKHAMTj3ALJUiwQEGMcEJ0cLjX1NS5FAHArA0pL5
+QKU2D+DKRYzBG5v1ZoC0EmAGLtAm7qypcxU4/l9vdmObsxFAKwkYjT700Ypfra4sG7QFDFBhjAbM
+Rk36sRUCaaM5z03AcxYYICCrFhUJcM5mm5tAVWbCFZwsbFDEIEstqAc2TABpBPxagT7egT+6NKpC
+baoArRZItwtgQIsyvKEV1xTKF13oLmhaSdo4mQB+jUN+z0KPESfnhxQwUTpowo6tQkk3QBrvAgZE
+ZQYw4LkLiFJCm3uUzCr2yu84JSUuGRkABqCK0/lrXJZMVSYBsCuBNUIY8zhJXbgTTc+d0pSnHKA8
+5YnMQerGUY+yWKRuxhfbcUh0E+wmLsEZTlKMoJwGOicq0mlHqLCzmO88pTLnWU/PVUwv+JzZ/ppk
+xM9r+iUi5QCAQHk1v4JGwyfhkISmUoOGkDWIAbKhVzuNGc95ZsCFMkwfDV8UTZvNbKcjhIlwisbN
+bpKOkkiEhCZasbAB4EkEhnsM/qpjLWJCtKY2XSYXqzYhBXJ1QvexJo48Mw9UhGOk7jpiHOUYRHcQ
+wEvReg9Y3qGAyDwFo01aICAnKk8MpK9q96GQKK1oM/3UiC9kpYfe+vZNcK5VFoXAE1jEgqpouTQ6
+ubJjFR11Q+Pxta/Io5CEWGm30XZHSkLlSlnxlJG9IRVIJyUcAgigjlPs6bLlSMZWPMlKzun1sy90
+Jg3VpMC5FfZJtYkKVoSqI1WMlHr/+Bex/hpGh90JRjCmaAY5RIaoYG60mJ4VoAs1QN55pjA3jaoA
+Mx/Fx+3YBy9ZASmq9HbUTKzCkr8ixRoAYN1xYLdkR0FKdwspWL3C86Y3La88z4tHBa5XkaZ9r38a
+Kbr5MmyS921XfqFBzgJUAzRg0S4+WlLHp2zWhnNDJnDlqUjuBFa9fqVAVJB7GSl9tKyoei50w0aK
+H5EziMq6hynitd17IEqzMmMTKVU8QJwiWIYPyI9lFGhKLuLFlcmF70xASlm0eg2JseXwbEdiDeoa
+pR6cnEdKopxk9AEvqwO8gBezNWOaSQBH+akxfFFik9metW/25ZTh3OjjUyEEpeEQlcji/oNkqiHv
+eFh9oa14ozkF4CFii5pAOmCal/eils/IUIcdBoPLPRnupAsT6TjmOg8DZQLNmE0GAhO4OXfGU6L5
+pMsEHCAsHIlHBDKxzJzMlAx6lCwWjCWpWjcMEgHsTh9wQwWRt0tXyCBwSUq2tUSZublTRcA8k0MA
+jnyEAGHP5io5OtvuthkOxr6LoPntMRrcscZqQCJMgzoHSp7YVRs2E5AVVYYBMCeTX1arAQiAInhw
+FKCzPfUX0zspj6eLMXqrw95nFUa+acfvJfnbeAA/ngUETnCVGDwCCFf4jXJ0jA8BAOLyC1xp4ti3
+VjjcIvf27+galCsTS0jJC0SmipFn/gEItCRJKHuKcDCzXNWWdXdoUKq7xcLBMJdiBJeaqzGUOtdU
+QA4iu31idkJpzGPe0Lj0kVMUMUcfLTM8HVYyRLzaHXHWXe+xGIOqOFR2Km7qvBoPObJmC0mxWh9T
+5HWj1XGllJnZLJLYoftQ1EfNN7FQfeKBxl5qSK1UV43uFJAJu2W+q1dAzs1JGy0sdmzkdtWKTjBs
+mDegvabLDctiBdOeK0/QptvqiF1z4D09rVI/MRfb6EYAAqioS0BqafwqqRp75DhN0HlR7V1UEIEJ
+faoKRuFHCtu20s93NGQmY6vCEXqqu6ChT/FSTJ80mVCW17ue/YbyO9ucU/yTvi9+/uT/h8LXgH6z
+xzoFAiTDkmooEC+9EgyKxnuR0Xa2EUr7JCkxsn96sXCpFQ+fN33TkmwaA0e290guswh9cFar1nXE
+oGYPQngWkhvZQUMVIjO7ASBIMxwXAVmYhDtbsydVp1TiohGkoQ3x5ypdR0fd1R/8piaaEWUTQxma
+MwENxHamchOvhyfSkhqLJQ1GVHUfqAoDMQ0lOAtECB3nMBkxdRc3IgFOQQwj0SEScYMFUDkOUEuR
+ZxyR0EbNt4Uzp2HihIPhEmimYRRjiA/SUSYtEhUhggh9klCewglqEYf5oAqikDru1zUfeEQadoCl
+k3kBMF2t8jYqsma+F0XTYAeE/jERRMgPF8EJJRg5p7Nf29R8zkdQriNdbvRWaNFjg+OJYZJbiMIU
+TVEdFVITW0EVw1UfY4UTkVBs/zUWJDNQVCdotciHzjIInWhfuyhOwEASSgGMLKJrtkKMMRErF4KM
+S6GMBMCMPME/I/CMJJVL6/c1G3SADAFVW8OHj6Qu3KVvZrgoa5d9jDcXwqGDkVdEIIKNlQdbrGA9
+G0Ms3dBjpDN30bd3IjM7dmUV/oEjEpFOv5gjCzNXQkYLY0EYAuUu0ViAQPMsrQN/v9CQvKhojAMX
+1RETvoMMUxQgoaMOj+Qq3XSHwuI37lJSyTFoccQIjQEsdqcxnrdo8ZFZ/hEZ/s1VklvYK7hDOiZw
+SwO1QUBTOAy5Me3zcghJe/m1lKQSirZzlluBY4OBCdCwjj0WKOGSEY1ld6bBBykpj+y4TVLnfg3Z
+LpmgaIQCD/7kF2eZDKFWHJATGj3pLkAURLMwSQR4RHb5L3jpiHtJOpHpRoCZgoJJmNyzIYcJObqH
+lc5ykI7pTUF5PckhMIOGCaYwAgMzDYv5gcCCELFWExtCjLBxYzipceKUJT85gJcYJNYjj/aFKlCl
+i8LZM8fZgPcAGYZpmNPRGbIUIIIhP98yGCV5kqq5kK7zOqQgDstwjcoJaAQ4hEVohArRjb7Tnn1W
+W6QGiz4ii6kpmSNil3so/oj8AJaC80bMiZ4k4RXrmW7ppiOK6S+MwE3LKZR9YpcCYzosUwqiIZGB
+Zoku2ZzOSWKhEzqvgZPqlgo800vSMxhBuX5lcSDMMSJocI2m6H5z5Zd+Y57joo2ZEibRsS4RIaCB
+gV2s0yNTB10oGTDyyUt9owr+ZYUVSlKvRXE1imb1IA/FQBwVUQ3/YAk7WJp3t5B1yQfnYRR+c6R9
+WKElCmbHyZNOKgxQaidTKpKeUAJXmlZaaSB/8gYs2Yet8iG66FqrM3PK2SqZIipSuiORiDpXOXXn
+ST9ggxxvKYYHERoQR3eZ51jRJ307KX/1ADmDgX4h8o7wGKSFYwmNOF1D/kiEmBKWWoiSa/WBYriO
+reKHJnA6qtNYCjmUZ+AwQFGaZcqTukd3hoqqs8qnO7gnKbCDphinxGkak8hS8YZhrSKaIOpc7kaX
+Q0mcJJgHiDqCRGShkNWXItIRDsOilsgrzbqURuWB8RgkdfkJ6MKp7/KrItIclbApgSM/C3gQ8leu
+0YqJ6YGizLGuJdos54quzPEKCiiqXcOTY6iDMrp+XFmX96lEhsFNkElJ8Iau8NoJpdk17tesiamd
+j8mDtIqsXKKpLLAGSkqbg3YgfFAJBPEw4TpJzjWuoWGu0howA6scJKsCpFaitogerlMJoJCAFAez
+ftqok+Wx1MOataoYPi3LAqJ6np5qswKRAr+ppAI1rq64sOAktTZwqmuFX/u6sggCsTBKtDGrq5Bj
+oTW7tBCrAr/JoNOKGGwLByEAADs=
+")
+         (setq url-current-mime-viewer (mm-mime-info "image/gif" nil 5)
+               url-current-mime-type "image/gif"
+               url-current-mime-headers
+               '(("content-transfer-encoding" . "base64")
+                 ("content-type" . "image/gif"))))
+        ((string= "bW96aWxsYQ==" (base64-encode node))
+         (insert
+          "
+PGh0bWw+CiAgPGhlYWQ+CiAgICA8dGl0bGU+VGhlIEJvb2sgb2YgTW96aWxsYSwgMTg6Mjc8L3Rp
+dGxlPgogIDwvaGVhZD4KICA8Ym9keSBiZ2NvbG9yPSIjODAwMDAwIiB0ZXh0PSIjRkZGRkZGIj4K
+ICAgIDxociBhbGlnbj1jZW50ZXIgd2lkdGg9Ijc1JSI+CiAgICA8cD4KICAgICBBbmQgSSBzYXcg
+YW4gU0dNTCBwdXJpc3QgY29tZSBkb3duIGZyb20gTUlULCBoYXZpbmcgdGhlIGtleSBvZgogICAg
+IHRoZSBib3R0b21sZXNzIHBpdCBhbmQgYSBncmVhdCBjaGFpbiBpbiBoaXMgaGFuZC4KICAgIDwv
+cD4KICAgIDxwPgogICAgIEFuZCBoZSBsYWlkIGhvbGQgb24gTW96aWxsYSwgdGhhdCBvbGQgc2Vy
+cGVudCwgd2hpY2ggaXMgdGhlCiAgICAgPHNlY3JldD5NYXJjQTwvc2VjcmV0PiwgYW5kIHRoZSA8
+c2VjcmV0PkppbUM8L3NlY3JldD4sIGFuZAogICAgIGJvdW5kIGhpbSBhIHRob3VzYW5kIHllYXJz
+LgogICAgPC9wPgogICAgPHA+CiAgICAgQW5kIGNhc3QgaGltIGludG8gdGhlIGJvdHRvbWxlc3Mg
+cGl0LCBhbmQgc2h1dCBoaW0gdXAsIGFuZCBzZXQgYQogICAgIHNlYWwgdXBvbiBoaW0sIHRoYXQg
+aGUgc2hvdWxkIGRlY2VpdmUgdGhlIG5ldCBubyBtb3JlLCB0aWxsIHRoZQogICAgIHRob3VzYW5k
+IHllYXJzIHNob3VsZCBiZSBmdWxmaWxsZWQ6ICBhbmQgYWZ0ZXIgdGhhdCBoZSBtdXN0IGJlCiAg
+ICAgbG9vc2VkIGEgbGl0dGxlIHNlYXNvbi4KICAgIDwvcD4KICAgIDxociB3aWR0aD0iNzUlIj4K
+ICAgIDxiPjxociB3aWR0aD0iODUlIiBsYWJlbD0iIGZyb20gYGBUaGUgQm9vayBvZiBNb3ppbGxh
+JycsIDE4OjI3ICI+PC9iPgogICAgPGhyIHdpZHRoPSI3NSUiPgogIDwvYm9keT4KPC9odG1sPgo=
+")
+         (setq url-current-mime-headers
+               '(("content-transfer-encoding" . "base64"))))
+        (t
+         (insert "
+<html>
+ <head>
+  
+ </head>
+ <body>
+  <p>
+    I don't know what you are talking about.  What about " node "?
+  </p>
+  <hr width=\"75%\">
+  <hype>
+ </body>
+</html>
+")))))))
+
+(provide 'w3-about)
diff --git a/lisp/w3-annotat.el b/lisp/w3-annotat.el
new file mode 100644
index 0000000..af72358
--- /dev/null
+++ b/lisp/w3-annotat.el
@@ -0,0 +1,275 @@
+;;; w3-annotat.el --- Annotation functions for Emacs-W3
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:12 $
+;; Version: $Revision: 1.1 $
+;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Private annotation support
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-parse-personal-annotations ()
+  ;; Read in personal annotation file
+  (if (and
+       (file-exists-p (format "%s/LOG" w3-personal-annotation-directory))
+       (file-readable-p (format "%s/LOG" w3-personal-annotation-directory)))
+      (save-excursion
+       (setq w3-personal-annotations nil);; nuke the old list
+       (let ((start nil)
+             (end nil)
+             (txt nil)
+             (url nil)
+             (num nil))
+         (set-buffer (get-buffer-create " *panno*"))
+         (erase-buffer)
+         (insert-file-contents-literally
+          (format "%s/LOG" w3-personal-annotation-directory))
+         (goto-char (point-min))
+         (w3-replace-regexp "\n+" "\n")
+         (goto-char (point-min))
+         ;; nuke the header lines
+         (delete-region (point-min) (progn (forward-line 2) (point)))
+         (cond
+          ((eobp) nil)                 ; Empty LOG file
+          (t
+           (if (/= (char-after (1- (point-max))) ?\n)
+               (save-excursion
+                 (goto-char (point-max))
+                 (insert "\n")))
+           (while (not (eobp))
+             (setq start (point)
+                   end (prog2 (end-of-line) (point) (forward-char 1))
+                   txt (buffer-substring start end)
+                   url (substring txt 0 (string-match " " txt))
+                   num (url-split
+                        (substring txt (1+ (string-match " " txt)) nil)
+                        "[ \t]"))
+             (while num
+               (setq w3-personal-annotations
+                     (cons
+                      (list url
+                            (list (car (car num))
+                                  (w3-grok-annotation-format
+                                   (car (car num)))))
+                      w3-personal-annotations)
+                     num (cdr num))))))
+         (kill-buffer " *panno*")))))
+
+(defun w3-grok-annotation-format (anno)
+  ;; Grab the title from an annotation
+  (let ((fname  (format "%s/PAN-%s.html"
+                       w3-personal-annotation-directory anno)))
+    (save-excursion
+      (set-buffer (get-buffer-create " *annotmp*"))
+      (erase-buffer)
+      (if (file-exists-p fname)
+         (insert-file-contents-literally fname))
+      (goto-char (point-min))
+      (prog1
+         (if (re-search-forward "<title>\\(.*\\)</title>" nil t)
+             (buffer-substring (match-beginning 1) (match-end 1))
+           (concat "Annotation on "
+                   (current-time-string (nth 5 (file-attributes fname)))))
+       (kill-buffer " *annotmp*")))))
+
+(defun w3-is-personal-annotation (url)
+  ;; Is URL a personal annotation?
+  (string-match "file:/.*/PAN-.*\\.html" url))
+
+(defun w3-delete-personal-annotation-internal (url num)
+  (save-excursion
+    (set-buffer (get-buffer-create " *annotmp*"))
+    (erase-buffer)
+    (insert-file-contents-literally (format "%s/LOG"
+                                           w3-personal-annotation-directory))
+    (replace-regexp (format "[ \t]+\\b%s\\b[ \t]*" num) " ")
+    (goto-char (point-min))
+    (delete-matching-lines (format "^%s +$" url))
+    (let ((make-backup-files nil)
+         (version-control nil)
+         (require-final-newline t))
+      (write-region (point-min) (point-max)
+                   (format "%s/LOG"
+                           w3-personal-annotation-directory)))
+    (kill-buffer " *annotmp*")
+    (let ((anno w3-personal-annotations))
+      (setq w3-personal-annotations nil)
+      (while anno
+       (if (not (string= num (car (car (cdr (car anno))))))
+           (setq w3-personal-annotations
+                 (cons (car anno) w3-personal-annotations)))
+       (setq anno (cdr anno)))
+      (delete-file (format "%s/PAN-%s.html"
+                          w3-personal-annotation-directory num)))))
+
+(defun w3-delete-personal-annotation ()
+  "Delete a personal annotation."
+  (interactive)
+  (let ((url (url-view-url t)))
+    (cond
+     ((w3-is-personal-annotation (url-view-url t))
+      (let ((num nil)
+           (annotated-url nil)
+           (anno w3-personal-annotations))
+       (string-match "file:/.*/PAN-\\(.*\\)\\.html" url)
+       (setq num (match-string 1 url))
+       (while anno
+         (if (equal num (car (car (cdr (car anno)))))
+             (setq annotated-url (car (car anno))))
+         (setq anno (cdr anno)))
+       (if (not annotated-url)
+           (message "Couldn't find url that this is annotating!")
+         (w3-delete-personal-annotation-internal annotated-url num)
+         (w3-quit))))
+     (t
+      (let* ((tmp w3-personal-annotations)
+            (thelist nil)
+            (node nil)
+            (todel nil))
+       (if (not (assoc url tmp))
+           (message "No personal annotations.")
+         (while tmp
+           (setq node (car tmp))
+           (if (string= (car node) url)
+               (setq thelist (cons (cons (nth 1 (nth 1 node)) "") thelist)))
+           (setq tmp (cdr tmp)))
+         (setq todel (completing-read "Delete annotation: " thelist nil t))
+         ;; WORK ;;
+         (message "I should delete %s, but can't." todel)))))))
+
+(defun w3-personal-annotation-add ()
+  "Add an annotation to this document."
+  (interactive)
+  (let ((url (url-view-url t))
+       (buf (get-buffer-create "*Personal Annotation*"))
+       (title (read-string "Title: "
+                           (format "Annotation by %s on %s"
+                                   (user-real-login-name)
+                                   (current-time-string)))))
+    (set-buffer buf)
+    (switch-to-buffer buf)
+    (erase-buffer)
+    (if (and w3-annotation-mode (fboundp w3-annotation-mode))
+       (funcall w3-annotation-mode)
+      (message "%S is undefined, using %s" w3-annotation-mode
+              default-major-mode)
+      (funcall default-major-mode))
+    (w3-annotation-minor-mode 1)
+    (setq w3-current-annotation (cons url title))
+    (insert "<html>\n"
+           " <head>\n"
+           "  <title>" (url-insert-entities-in-string title) "</title>"
+           " </head>\n"
+           "  <h1>" (url-insert-entities-in-string title) "</h1>\n"
+           "  <p>\n"
+           "   <address>" (url-insert-entities-in-string (user-full-name))
+            (if (stringp url-personal-mail-address)
+                (concat " &lt;" (url-insert-entities-in-string
+                             url-personal-mail-address) "&gt;")
+              "")
+           "</address>\n"
+           "   <address>" (current-time-string) "</address>\n"
+           "  </p>\n"
+           "  <pre>\n")
+    (save-excursion
+      (insert "\n\n\n  </pre>\n"
+             "</html>"))
+    (message "Hit C-cC-c to send this annotation.")))
+
+(defun w3-annotation-minor-mode (&optional arg)
+  "Minimal minor mode for entering annotations.  Just rebinds C-cC-c to
+finish the annotation."
+  (interactive "P")
+  (cond
+   ((null arg) (setq w3-annotation-minor-mode (not w3-annotation-minor-mode)))
+   ((= 0 arg)  (setq w3-annotation-minor-mode nil))
+   (t          (setq w3-annotation-minor-mode t)))
+  )
+
+(defun w3-annotation-find-highest-number ()
+  ;; Find the highest annotation number in this buffer
+  (let (x)
+    (goto-char (point-min))
+    (while (re-search-forward "[^ \t\n]*[ \t]\\(.*\\)" nil t)
+      (setq x (nconc (mapcar (function (lambda (x) (string-to-int (car x))))
+                            (url-split (buffer-substring (match-beginning 1)
+                                                        (match-end 1))
+                                      "[ \t]")) x)))
+    (if (not x) (setq x '(0)))
+    (1+ (car (sort x '>)))))
+
+(defun w3-personal-annotation-finish ()
+  "Finish doing a personal annotation."
+  (interactive)
+  (if (or (not w3-personal-annotation-directory)
+         (not (file-exists-p w3-personal-annotation-directory))
+         (not (file-directory-p w3-personal-annotation-directory)))
+      (error "No personal annotation directory!")
+    (let ((url (car w3-current-annotation))
+         (txt (buffer-string))
+         (title (cdr w3-current-annotation))
+         (fname nil)
+         (num nil))
+      (save-excursion
+       (not-modified)
+       (kill-buffer (current-buffer))
+       (set-buffer (get-buffer-create " *annotmp*"))
+       (erase-buffer)
+       (if (file-exists-p              ; Insert current LOG file if
+                                       ; it exists.
+            (format "%s/LOG" w3-personal-annotation-directory))
+           (insert-file-contents-literally
+            (format "%s/LOG" w3-personal-annotation-directory))
+         (progn                        ; Otherwise, create a file
+           (goto-char (point-min))     ; that conforms to first
+                                       ; annotation format from NCSA
+           (insert "ncsa-mosaic-personal-annotation-log-format-1\n")
+           (insert "Personal\n")))
+       (goto-char (point-min))
+       (setq num (int-to-string (w3-annotation-find-highest-number))
+             fname (format "%s/PAN-%s.html"
+                           w3-personal-annotation-directory num))
+       (goto-char (point-min))
+       (if (re-search-forward (regexp-quote url) nil t)
+           (progn
+             (end-of-line)
+             (insert " "))
+         (goto-char (point-max))
+         (insert "\n" url " "))
+       (insert num)
+       (let ((make-backup-files nil)
+             (version-control nil)
+             (require-final-newline t))
+         (write-region (point-min) (point-max)
+                       (format "%s/LOG" w3-personal-annotation-directory))
+         (erase-buffer)
+         (insert w3-annotation-marker txt)
+         (write-region (point-min) (point-max) fname))
+       (setq w3-personal-annotations
+             (cons (list url (list num title)) w3-personal-annotations))))))
+
+(defun w3-annotation-add ()
+  "Add an annotation to the current document."
+  (interactive)
+  (w3-personal-annotation-add))
diff --git a/lisp/w3-book.el b/lisp/w3-book.el
new file mode 100644
index 0000000..cefe22c
--- /dev/null
+++ b/lisp/w3-book.el
@@ -0,0 +1,160 @@
+;;; w3-book.el --- Bookmark abstraction
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:10 $
+;; Version: $Revision: 1.1 $
+;; Keywords: menu, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1997, 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'cl)
+
+(defstruct bookmark
+  location                             ; The URL
+  label                                        ; short description
+  description                          ; A longer description
+  added                                        ; Date added
+  visited                              ; Date last visited
+  annotations                          ; Any annotations
+  children                             ; Subnodes
+  ;; These are really only relevant to HTTP requests
+  method                               ; What HTTP method was used
+  headers                              ; Extra HTTP headers
+  data                                 ; Any extra data sent in the request
+  )
+
+(defun w3-bookmark-to-menu (bookmark)
+  (if (bookmark-children bookmark)
+      (cons (or (bookmark-label bookmark) "...")
+           (mapcar 'w3-bookmark-to-menu (bookmark-children bookmark)))
+    (vector (or (bookmark-label bookmark)
+               (bookmark-location bookmark))
+           (list 'w3-bookmark-fetch bookmark)
+           (bookmark-location bookmark))))
+
+(defun w3-bookmark-fetch (bookmark)
+  (interactive)
+  (let ((url-request-method (bookmark-method bookmark))
+       (url-request-data (bookmark-data bookmark))
+       (url-request-extra-headers (bookmark-headers bookmark)))
+    (w3-fetch (bookmark-location bookmark))))
+
+(defun w3-bookmark-delete (bookmark)
+  (interactive)
+  )
+
+(defun w3-bookmark-add ()
+  (interactive)
+  )
+
+(defun w3-bookmark-browse ()
+  (interactive)
+  )
+
+
+;; HTML Bookmarks
+(defun w3-bookmark-flatten-list (list)
+  (cond
+   ((atom list) (list list))
+   ((and (cdr list) (atom (cdr list))) (list list))
+   (t (apply 'append (mapcar 'w3-bookmark-flatten-list list)))))
+
+(defun w3-bookmark-html-strip-strings (tree)
+  (setq tree (w3-bookmark-flatten-list tree))
+  (w3-normalize-spaces
+   (mapconcat (function (lambda (n) (if (stringp n) n ""))) tree "")))
+
+(defmacro w3-bookmark-html-handle-content (node)
+  (`
+   (progn
+     (push content stack)
+     (setq content (nth 2 (, node))))))
+
+(defmacro w3-bookmark-html-handle-empty-tag ()
+  (`
+   (progn
+     (push content stack)
+     (setq content nil))))
+
+(defun w3-bookmark-read-html-internal (tree)
+  (let (tag attr node content stack last bkmrk bkmrk-stack tag-stack)
+    (setq stack (list tree))
+    (while stack
+      (setq content (pop stack))
+      (case (pop tag-stack)
+       ((dl ol ul dir menu)
+        (debug)
+        (pop bkmrk-stack)))
+      (while content
+       (setq node (pop content))
+       (if (not (stringp node))
+           (setq tag (nth 0 node)
+                 attr (nth 1 node))
+         (setq tag '%text))
+       (push tag tag-stack)
+       (case tag
+         (%text
+          (w3-bookmark-html-handle-empty-tag))
+         (title
+          (setq bkmrk (make-bookmark :location nil
+                                     :label (w3-bookmark-html-strip-strings
+                                             (nth 2 node))))
+          (w3-bookmark-html-handle-empty-tag))
+         (a                            ; Marks a link
+          (let ((n (make-bookmark :location (cdr-safe (assq 'href attr))
+                                  :label (or (cdr-safe (assq 'title attr))
+                                             (w3-bookmark-html-strip-strings
+                                              (nth 2 node)))
+                                  :added (cdr-safe (assq 'add_date attr))
+                                  :visited (cdr-safe (assq 'last_visit 
attr)))))
+            (if bkmrk-stack
+                (push n (bookmark-children (car bkmrk-stack)))
+              (push n (bookmark-children bkmrk))))
+          (w3-bookmark-html-handle-empty-tag))
+         ((dl ol ul dir menu)          ; Marks a parent node
+          (push (make-bookmark :location nil
+                               :label "submenu") bkmrk-stack)
+          (push (car bkmrk-stack) (bookmark-children bkmrk))
+          (w3-bookmark-html-handle-content node))
+         ((li dt)                      ; Marks a description block
+          (w3-bookmark-html-handle-content node))
+         (otherwise
+          (w3-bookmark-html-handle-content node)))))
+    bkmrk))
+
+(defun w3-bookmark-read-html (url)
+  "Import an HTML file into the Emacs-w3 format."
+  (interactive "fBookmark file: ")
+  (if (not (file-readable-p url))
+      (error "Can not read %s..." url))
+  (save-excursion
+    (set-buffer (get-buffer-create " *bookmark-work*"))
+    (erase-buffer)
+    (insert-file-contents url)
+    (let* ((w3-debug-html nil)
+          (bkmarks nil)
+          (parse (w3-parse-buffer (current-buffer))))
+      (setq bkmarks (w3-bookmark-read-html-internal parse)
+           w3-html-bookmarks (w3-bookmark-to-menu bkmarks)))))
+
+(defun w3-bookmark-write-html (fname)
+  )
+
+(provide 'w3-book)
diff --git a/lisp/w3-cfg.el.in b/lisp/w3-cfg.el.in
new file mode 100644
index 0000000..52c20d4
--- /dev/null
+++ b/lisp/w3-cfg.el.in
@@ -0,0 +1,57 @@
+;;; w3-cfg.el --- Configuration info from Emacs/W3
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:12 $
+;; Version: $Revision: 1.1 $
+;; Keywords: hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defconst w3-configuration-data
+  '(
+    (srcdir              . "@srcdir@")
+    (datadir             . "@datadir@")
+    (prefix              . "@prefix@")
+    (infodir             . "@infodir@")
+    (lispdir             . "@lispdir@")
+    (EMACS               . "@EMACS@")
+    (CUSTOM              . "@CUSTOM@")
+    (EMACS_FLAVOR        . "@EMACS_FLAVOR@")
+    (EMACS_VERSION       . "@EMACS_VERSION@")
+    (EMACS_PACKAGE_DIR   . "@EMACS_PACKAGE_DIR@")
+    (XEMACS              . "@XEMACS@")
+    )
+  "Emacs/W3 configuration data.
+This data is from the configuration step in building Emacs/W3, and
+the data may not accurately reflect your current environment.")
+
+(defun w3-configuration-data (option &optional default)
+  (let ((info (or (cdr-safe (assq option w3-configuration-data)) default)))
+    (if (not (stringp info))
+       (setq info (eval info)))
+    (while (string-match "\\$[({]\\([^{(]+\\)[})]" info)
+      (setq info (concat (substring info 0 (match-beginning 0))
+                        (w3-configuration-data (intern (match-string 1 info))
+                                               "")
+                        (substring info (match-end 0)))))
+    info))
+    
+(provide 'w3-cfg)
diff --git a/lisp/w3-cfg.nt b/lisp/w3-cfg.nt
new file mode 100644
index 0000000..30d1a4c
--- /dev/null
+++ b/lisp/w3-cfg.nt
@@ -0,0 +1,59 @@
+;;; w3-cfg.el --- Configuration info from Emacs/W3
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:12 $
+;; Version: $Revision: 1.1 $
+;; Keywords: hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defconst w3-configuration-data
+  '(
+    (srcdir              . ".")
+    (datadir             . data-directory)
+    (prefix              . (expand-file-name (if w3-running-xemacs
+                                                "../../../"
+                                              "../../../../") data-directory))
+    (infodir             . "${prefix}info")
+    (lispdir             . "$(prefix)share/emacs/site-lisp")
+    (EMACS               . "emacs")
+    (EMACS_FLAVOR        . "emacs")
+    (CUSTOM              . (file-name-directory (locate-library "widget")))
+    (EMACS_VERSION       . (format "%d.%d" emacs-major-version 
emacs-minor-version))
+    (EMACS_PACKAGE_DIR   . "")
+    (XEMACS              . (if w3-running-xemacs "yes" "no"))
+    )
+  "Emacs/W3 configuration data.
+This data is from the configuration step in building Emacs/W3, and
+the data may not accurately reflect your current environment.")
+
+(defun w3-configuration-data (option &optional default)
+  (let ((info (or (cdr-safe (assq option w3-configuration-data)) default)))
+    (if (not (stringp info))
+       (setq info (eval info)))
+    (while (string-match "\\$[({]\\([^{(]+\\)[})]" info)
+      (setq info (concat (substring info 0 (match-beginning 0))
+                        (w3-configuration-data (intern (match-string 1 info))
+                                               "")
+                        (substring info (match-end 0)))))
+    info))
+    
+(provide 'w3-cfg)
diff --git a/lisp/w3-cus.el b/lisp/w3-cus.el
new file mode 100644
index 0000000..812d2c7
--- /dev/null
+++ b/lisp/w3-cus.el
@@ -0,0 +1,571 @@
+;;; w3-cus.el --- Customization support for Emacs-W3
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:10 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, help, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(eval-and-compile
+  (condition-case ()
+      (require 'custom)
+    (error nil))
+  (if (and (featurep 'custom) (fboundp 'custom-declare-variable))
+      nil ;; We've got what we needed
+    ;; We have the old custom-library, hack around it!
+    (defmacro defgroup (&rest args)
+      nil)
+    (defmacro defcustom (var value doc &rest args) 
+      (` (defvar (, var) (, value) (, doc))))))
+
+(defgroup w3 '((url custom-group))
+  "Emacs-W3 - the web browser of choice."
+  :group 'hypermedia)
+
+(defgroup w3-files nil
+  "Emacs-W3 configuration files."
+  :group 'w3
+  :prefix "w3-")
+
+(defgroup w3-images nil
+  "Controlling image handling."
+  :group 'w3
+  :prefix "w3-")
+
+(defgroup w3-printing nil
+  "Various options for hardcopy from web pages."
+  :group 'w3
+  :prefix "w3-")
+
+(defgroup w3-menus nil
+  "The look of menus in Emacs-W3"
+  :group 'w3
+  :prefix "w3-")
+
+(defgroup w3-parsing nil
+  "Options relating to HTML parsing"
+  :group 'w3
+  :prefix "w3-")
+
+(defgroup w3-display nil
+  "Variables relating to how web pages are displayed."
+  :group 'w3
+  :prefix "w3-")
+
+(defgroup w3-hooks nil
+  "Hooks relating to Emacs-W3."
+  :group 'w3
+  :prefix "w3-")
+
+;;; File related variables
+(defcustom w3-configuration-directory "~/.w3/"
+  "*Directory where Emacs-w3 can find its configuration files"
+  :group 'w3-files
+  :type 'directory)  
+
+(defcustom w3-default-configuration-file nil
+  "*Where per-user customizations of w3 are kept."
+  :group 'w3-files
+  :type 'file)
+
+(defcustom w3-default-homepage nil
+  "*The url to open at startup.  It can be any valid URL.
+This will default to the environment variable WWW_HOME if you do not
+set it in your .emacs file. If WWW_HOME is undefined, then it will
+default to  the hypertext documentation for W3 at Indiana University."
+  :group 'w3-files
+  :type 'string)
+
+(defcustom w3-default-stylesheet nil
+  "*The filename of the users default stylesheet."
+  :group 'w3-files
+  :type 'file)
+
+(defcustom w3-hotlist-file nil
+  "*Hotlist filename.
+This should be the name of a file that is stored in either
+NCSA's Mosaic/X or Netscape/X format.  It is used to keep a listing
+of commonly accessed URL's without having to go through 20 levels of
+menus to get to them."
+  :group 'w3-files
+  :type 'file)
+
+(defcustom w3-documentation-root "http://www.cs.indiana.edu/elisp/w3/";
+  "*Where the w3 documentation lives.  This MUST end in a slash."
+  :group 'w3-files
+  :type 'string)
+
+(defcustom w3-temporary-directory (or (getenv "TMPDIR") "/tmp")
+  "*Where temporary files go."
+  :group 'w3-files
+  :type 'directory)
+
+;;; Display related variables
+(defcustom w3-display-frames t
+  "*Fetch frames - can be:
+nil            no frame display whatsoever
+'as-links      display frame hyperlinks, but do not fetch them
+'ask           display frame hyperlinks and ask whether to fetch them
+t              display frame hyperlinks and fetch them."
+  :group 'w3-display
+  :type '(choice (const :tag "Do not display frames" :value nil)
+                (const :tag "Show hyperlinks" :value as-links)
+                (const :tag "Show hyperlinks, ask whether to retrieve them" 
:value ask)
+                (const :tag "Automatically retrieve frames" :value t)))
+
+(defcustom w3-bullets
+  '((disc   . ?*)
+    (circle . ?o)
+    (square . ?#)
+    (none   . ? )
+    )
+  "*An assoc list of unordered list types mapping to characters to use
+as the bullet character."
+  :group 'w3-display
+  :type 'list)
+
+(defcustom w3-echo-link '(title url text name)
+  "*Whether to display the URL of a link when tabbing through links.
+Value is a list of one or more of the following symbols:
+
+  url    == url of the target
+  text   == text of the link
+  title  == title attribute of the link
+  name   == name or id attribute of the link
+
+If none of the information is available, nothing will be shown for the link
+in menus, etc."
+  :group 'w3-display
+  :type '(set (const :tag "URL" :value url)
+             (const :tag "Link Text" :value text)
+             (const :tag "Title of the link as defined in the HTML tag"
+                    :value title)
+             (const :tag "Name of the link as defined in the HTML tag"
+                    :value name)))
+
+(defcustom w3-horizontal-rule-char nil
+  "*The character to use to create a horizontal rule.
+Must be the character's code, not a string.  This character is
+replicated across the screen to create a division.
+If nil W3 will use a terminal graphic character if possible."
+  :group 'w3-display
+  :type '(choice (const :tag "Best possible" :value nil)
+                (character)))
+
+(defcustom w3-force-conversion-alist nil
+  "*An assoc list of URL host/filename regexps and coding systems in which to 
force conversion in Mule"
+  :group 'w3-display
+  :type 'list)
+
+;;; these three variables control how w3-setup-terminal-chars works
+(defcustom w3-use-terminal-characters t
+  "*Use terminal graphics characters for drawing tables and rules if available"
+  :group 'w3-display
+  :type 'boolean)
+
+(defcustom w3-use-terminal-characters-on-tty nil
+  "*Use terminal graphics characters for tables and rules even on a tty.
+This triggers display bugs on both FSF Emacs and XEmacs. 
+(Though it's usually tolerable at least on FSF Emacs.)"
+  :group 'w3-display
+  :type 'boolean)
+
+(defcustom w3-use-terminal-glyphs t
+  "*Use glyphs if possible rather than properties for terminal graphics 
characters
+
+Glyphs are probably more efficient but don't work with the most recent versions
+of XEmacs and there are some cute tricks we can play with text-properties that
+glyphs won't let us do. It may be possible someday to make XEmacs automagically
+translate the characters back to ascii characters when pasted into another
+buffer. (On the other hand, right now w3-excise-terminal-characters doesn't
+work at all if we're using text-properties)."
+  :group 'w3-display
+  :type '(choice (const :tag "Use Glyphs" :value t)
+                (const :tag "Use Text Properties" :value nil)))
+
+(defcustom w3-do-incremental-display nil
+  "*Whether to do incremental display of pages or not."
+  :group 'w3-display
+  :type 'boolean)
+
+(defcustom w3-defined-link-types
+  ;; This is the HTML3.0 list (downcased) plus "made".
+  '("previous" "next" "up" "down" "home" "toc" "index" "glossary"
+    "copyright" "bookmark" "help" "made" "contents" "top")
+  "A list of the (lower-case) names which have special significance
+as the values of REL or REV attributes of <link> elements.  They will
+be presented on the toolbar or the links menu, for instance."
+  :group 'w3-display
+  :type '(repeat string))
+
+;;; Parsing related variables
+(defcustom w3-debug-html nil
+  "*Whether to gripe about bad HTML or not."
+  :group 'w3-parsing
+  :type '(choice (const :tag "HTML Errors" :value t)
+                (const :tag "Errors and stylistic issues" :value style)
+                (const :tag "None" :value nil)))
+
+(defcustom w3-debug-buffer "*HTML Debug*"
+  "*Name of buffer to store debugging information in."
+  :group 'w3-parsing
+  :type 'string)
+
+;;; Image related variables
+(defcustom w3-auto-image-alt 'w3-default-image-alt-func
+  "*Whether emacs-w3 should create an alt attribute for an image that
+is missing it.
+If nil, Emacs-W3 will not automatically create an ALT attribute.
+
+If a string, it should be a string suitable for running through format,
+with only one %s, which will be replaced with just the filename of the
+graphic that is not loaded.
+
+Otherwise, it is considered a function and is passed a single
+argument, the filename of the graphic that is not loaded.
+"
+  :group 'w3-images
+  :type '(choice (const :tag "None" :value nil)
+                (const :tag "Default" :value "[IMAGE(%s)]")
+                (string :tag "Format string")
+                (sexp :tag "Function" :value nil)))
+
+(defcustom w3-icon-directory "http://cs.indiana.edu/elisp/w3/icons/";
+  "*Where to find standard icons.  Must end in a /!"
+  :group 'w3-images
+  :type 'string)
+
+(defcustom w3-icon-format 'gif
+  "*Image format the default icons are expected to be in.
+This is a symbol specifing what file extension to use.
+If nil, then no file extension is used."
+  :group 'w3-images
+  :type '(choice (const :tag "GIF Image" :value gif)
+                (const :tag "XPM Image" :value xpm)
+                (const :tag "XBM Image" :value xbm)
+                (const :tag "Let the server decide" :value nil)
+                (symbol :tag "Other")))
+
+(defcustom w3-delay-image-loads (not (or (featurep 'gif)
+                                        (featurep 'jpeg)
+                                        (featurep 'imagick)
+                                        (featurep 'png)))
+  "*Whether to delay image loading, or automatically retrieve them."
+  :group 'w3-images
+  :type 'boolean)
+
+(defcustom w3-image-mappings
+  (if (featurep 'imagick)
+      '(
+       ("image/x-xbitmap"        . xbm)
+       ("image/xbitmap"          . xbm)
+       ("image/xbm"              . xbm)
+       ("image/jpeg"             . imagick)
+       ("image/gif"              . imagick)
+       ("image/png"              . imagick)
+       ("image/x-fax"            . imagick)
+       ("image/x-raster"         . imagick)
+       ("image/windowdump"       . imagick)
+       ("image/x-icon"           . imagick)
+       ("image/portable-graymap" . imagick)
+       ("image/portable-pixmap"  . imagick)
+       ("image/x-pixmap"         . imagick)
+       ("image/x-xpixmap"        . imagick)
+       ("image/pict"             . imagick)
+       ("image/x-rgb"            . imagick)
+       ("image/x-sgi"            . imagick)
+       ("image/x-macpaint"       . imagick)
+       ("image/x-targa"          . imagick)
+       ("image/tiff"             . imagick)
+       )
+    '(
+      ("image/x-xbitmap"        . xbm)
+      ("image/xbitmap"          . xbm)
+      ("image/xbm"              . xbm)
+      ("image/jpeg"             . jpeg)
+      ("image/gif"              . gif)
+      ("image/png"              . png)
+      ("image/x-fax"            . g3fax)
+      ("image/x-raster"         . rast)
+      ("image/windowdump"       . xwd)
+      ("image/x-icon"           . icon)
+      ("image/portable-graymap" . pgm)
+      ("image/portable-pixmap"  . ppm)
+      ("image/x-pixmap"         . xpm)
+      ("image/x-xpixmap"        . xpm)
+      ("image/pict"             . pict)
+      ("image/x-rgb"            . sgi)
+      ("image/x-sgi"            . sgi)
+      ("image/x-macpaint"       . macpt)
+      ("image/x-targa"          . tga)
+      ("image/tiff"             . tiff)
+      )
+    )
+  "*How to map MIME types to image types for the `image' package.
+Each entry is a cons cell of MIME types and image-type symbols."
+  :group 'w3-images
+  :type '(repeat (cons :format "%v"
+                      (string :tag "MIME Type")
+                      (symbol :tag "Image type"))))
+
+;;; Printing variables
+(defcustom w3-latex-docstyle "{article}"
+  "*The documentstyle to use when printing or mailing files as LaTeX.
+Good defaults are: {article}, [psfig,twocolumn]{article}, etc."
+  :group 'w3-printing
+  :type 'string)
+
+(defcustom w3-latex-print-links nil
+  "*If non-nil, prints the URLs of hypertext links as endnotes at the end of
+the document.  If `footnote', prints the URL's as footnotes on a page."
+  :group 'w3-printing
+  :type '(choice (const :tag "As endnotes" :value t)
+                (const :tag "As footnotes" :value footnote)
+                (const :tag "Do not print" :value nil)))
+
+(defcustom w3-latex-use-latex2e nil
+  "*If non-nil, configures LaTeX generator to use LaTeX2e syntax.  A `nil' 
+value indicates that LaTeX 2.0.9 compatibility will be used instead."
+  :group 'w3-printing
+  :type 'boolean)
+
+(defcustom w3-latex-packages nil
+  "*List of LaTeX packages to include when converting HTML to LaTeX.
+Currently this is only used if `w3-latex-use-latex2e' is non-nil."
+  :group 'w3-printing
+  :type '(repeat string))
+
+(defcustom w3-latex-use-maketitle nil
+  "*Non-nil makes the LaTeX parser use real LaTeX title pages."
+  :group 'w3-printing
+  :type 'boolean)
+
+;;; Menus
+(defcustom w3-max-menu-length 35
+  "*The maximum length of a pulldown menu before it will be split into
+smaller chunks, with the first part as a submenu, followed by the rest
+of the menu."
+  :group 'w3-menus
+  :type 'integer)
+
+(defcustom w3-max-menu-width 40
+  "*The maximum width of a pulldown menu choice."
+  :group 'w3-menus
+  :type 'integer)
+
+;;; Advanced stuff
+(defcustom w3-modeline-format
+  '("  " ("W3"
+       (w3-netscape-emulation-minor-mode
+        " (NS)")
+       (w3-lynx-emulation-minor-mode
+        " (Lynx)")
+       ": "
+       (40 (-40 "%b"))
+       " "
+       (w3-current-isindex "[Searchable]  ")
+       (w3-current-badhtml "[BAD HTML]  ")
+       "%p" "  " global-mode-string))
+  "*The modeline format string when in w3 mode"
+  :group 'w3-advanced
+  :type 'list)
+
+(defcustom w3-netscape-compatible-comments t
+  "*Whether to honor netscape-style <! > comments.
+Ye gods I wish I could turn this off by default."
+  :group 'w3-parsing
+  :type 'boolean)
+
+(defcustom w3-notify 'semibully
+  "*Selects the behavior when w3 page is ready.
+This variable may have one of the following values:
+
+newframe   -- put the w3 page in its own frame
+bully      -- make the w3 page the current buffer and only window
+semibully  -- make the w3 page the current buffer in the same window
+aggressive -- make the w3 page the current buffer in the other window
+friendly   -- display  w3page in other window but don't make current
+polite     -- don't display w3 page, but prints message when ready (beeps)
+quiet      -- like `polite', but don't beep
+meek       -- make no indication that page is ready
+
+Any other value of `w3-notify' is equivalent to `meek'."
+  :group 'w3-display
+  :type '(choice (const :tag "Display in a new frame"
+                       :value newframe)
+                (const :tag "Display in the current window, select buffer, and 
kill other windows"
+                       :value bully)
+                (const :tag "Display in the current window, select buffer"
+                       :value semibully)
+                (const :tag "Display in another window, select buffer"
+                       :value aggressive)
+                (const :tag "Display in another window, but do not select it"
+                       :value friendly)
+                (const :tag "Do not display page, but show a message and beep"
+                       :value polite)
+                (const :tag "Do not display page, but show a message (no beep)"
+                       :value quiet)
+                (const :tag "Do not indicate that the page has been retrieved"
+                       :value meek)))
+
+(defcustom w3-popup-menu-on-mouse-3 t
+  "*Non-nil value means W3 should provide context-sensitive menus on mouse-3.
+A nil value means W3 should not change the binding of mouse-3."
+  :group 'w3-display
+  :type 'boolean)
+
+(defcustom w3-print-command "lpr -h -d"
+  "*Print command for dvi files.
+This is usually 'lpr -h -d' to send it to a postscript printer, but you can set
+it up so that it is any command that takes a dvi file as its last argument."
+  :group 'w3-printing
+  :type 'string)
+
+(defcustom w3-reuse-buffers 'yes
+  "What to do when following a link will re-fetch a document that has
+already been fetched into a W3 buffer.  Possible values are: nil,
+'yes, and 'no.  Nil means ask the user if we should reuse the buffer.
+ A value of 'yes means assume the user wants us to reuse the buffer.
+A value of 'no means assume the user wants us to re-fetch the document.
+
+This will also accept:
+'no    ==> always reload
+'yes   ==> always reuse
+'ask   ==> always ask"
+  :group 'w3-display
+  :type '(choice (const :tag "Always reload" :value no)
+                (const :tag "Always reuse" :value yes)
+                (const :tag "Always ask" :value ask)))
+
+(defcustom w3-right-margin 2
+  "*Default right margin for Emacs-W3 buffers.
+This amount is subtracted from (window-width) for each new WWW buffer
+and used as the new fill-column."
+  :group 'w3-display
+  :type 'integer)
+
+(defcustom w3-maximum-line-length nil
+  "*Maximum length of a line.
+If nil, then lines can extend all the way to the window margin."
+  :group 'w3-display
+  :type 'integer)
+
+(defcustom w3-track-mouse t
+  "*Whether to track the mouse and message the url under the mouse."
+  :group 'w3-display
+  :type 'boolean)
+
+(defcustom w3-honor-stylesheets t
+  "*Whether to let a document specify a CSS stylesheet."
+  :group 'w3-display
+  :type 'boolean)
+
+(defcustom w3-user-colors-take-precedence nil
+  "*Whether to let a document define certain colors about itself.
+Like foreground and background colors and pixmaps, color of links and
+visited links, etc."
+  :group 'w3-display
+  :type 'boolean)
+
+(defcustom w3-user-fonts-take-precedence nil
+  "*Whether to let a document define certain fonts.
+Certain fonts can cause problems under Emacs."
+  :group 'w3-display
+  :type 'boolean)
+
+;;; Hook Variables
+(defcustom w3-load-hook nil
+  "*Hooks to be run after loading w3."
+  :group 'w3-hooks
+  :type 'hook)
+
+(defcustom w3-mode-hook nil
+  "*Hooks to be run after entering w3-mode."
+  :group 'w3-hooks
+  :type 'hook)
+
+(defcustom w3-source-file-hook nil
+  "*Hooks to be run after getting document source."
+  :group 'w3-hooks
+  :type 'hook)
+
+(defcustom w3-display-errors-hook nil
+  "*Hooks to be run after displaying HTML errors for a page."
+  :group 'w3-hooks
+  :type 'hook)
+
+(defcustom w3-html-errors-font-lock-keywords
+  '(("\\(HTML errors for\\) \\(.*\\)"
+     (1 font-lock-function-name-face) (2 font-lock-reference-face))
+    ("Empty \\([A-Z0-9]+\\) element." (1 font-lock-type-face))
+    ("Bad attribute name syntax: \\(.*\\)" (1 font-lock-type-face))
+    ("Bad attribute value syntax: \\(.*\\)" (1 font-lock-type-face))
+    ("Evil attribute value syntax: \\(.*\\)" (1 font-lock-type-face))
+    ("Attribute value missing end quote: \\(.*\\)" (1 font-lock-type-face))
+    ("Bad start-tag \\([A-Z0-9]+\\)" (1 font-lock-type-face))
+    ("\\([A-Z0-9]+\\) element has no \\([A-Z0-9]+\\) attribute"
+     (1 font-lock-type-face) (2 font-lock-type-face))
+    (", inferring \\(</?[A-Z0-9]+>\\)" (1 font-lock-type-face))
+    ("Bad unclosed \\([A-Z0-9]+\\) tag" (1 font-lock-type-face))
+    ("Bad comment (unterminated or unbalanced \"\\(--\\)\" pairs)" (1 
font-lock-type-face t))
+    ("Obsolete element \\(.*\\)" (1 font-lock-type-face))
+    ("Deprecated element \\(.*\\)" (1 font-lock-type-face))
+    ("\\[deprecated inside \\([A-Z0-9]+\\)\\]" (1 font-lock-type-face))
+    ("\\(</[A-Z0-9]+>\\) end-tag not omissible (required due to 
\\(</?[A-Z0-9]+>\\) end-tag)"
+     (1 font-lock-type-face) (2 font-lock-type-face))
+    ("Bad data characters [\\([^][]\\)], " (1 font-lock-comment-face))
+    ("Bad \\(<!\\) syntax." (1 font-lock-type-face))
+    ("Unterminated IGNORE marked section.")
+    ("Invalid SGML character: \\(.\\)" (1 font-lock-type-face))
+    ("Unmatched end-tag \\(</[A-Z0-9]+>\\)" (1 font-lock-type-face))
+    ;;("</?[A-Z0-9]+>" . font-lock-type-face)
+    ("^  [A-Z][a-zA-Z0-9 ]*: .*" . font-lock-comment-face)
+    ("^  [A-Z][a-zA-Z0-9 ]*: " . font-lock-comment-face)
+    ("\\*ERROR\\*" 0 font-lock-keyword-face t))
+  "*Font locking keywords used for HTML error display"
+  :group 'w3
+  :type 'list)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Internationalization
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defconst w3-mule-charset-to-coding-alist
+  '(
+    ("us-ascii"          . no-conversion)
+    ("iso-8859-1" . no-conversion)
+    ("iso-8859-2" . iso-8859-2)
+    ("iso-8859-3" . iso-8859-3)
+    ("iso-8859-4" . iso-8859-4)
+    ("iso-8859-5" . iso-8859-5)
+    ("iso-8859-6" . iso-8859-6)
+    ("iso-8859-7" . iso-8859-7)
+    ("iso-8859-8" . iso-8859-8)
+    ("iso-8859-9" . iso-8859-9)
+    ("iso-2022-jp" . iso-2022-jp)
+    ;; probably not correct, but probably better than nothing.
+    ("iso-2022-jp-2" . iso-2022-jp)
+    ("iso-2022-int-1" . iso-2022-int-1)
+    ("iso-2022-kr"    . iso-2022-kr)
+    ("euc-kr"         . iso-2022-kr)
+    ))
+  
+(provide 'w3-cus)
diff --git a/lisp/w3-display.el b/lisp/w3-display.el
new file mode 100644
index 0000000..c9699cd
--- /dev/null
+++ b/lisp/w3-display.el
@@ -0,0 +1,2788 @@
+;;; w3-display.el --- display engine
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:12 $
+;; Version: $Revision: 1.1 $
+;; Keywords: faces, help, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'cl)
+(eval-when-compile
+  (require 'w3-props))
+(require 'w3-keyword)
+(require 'css)
+(require 'font)
+(require 'w3-widget)
+(require 'w3-imap)
+
+(autoload 'sentence-ify "flame")
+(autoload 'string-ify "flame")
+(autoload '*flame "flame")
+(if (not (fboundp 'flatten)) (autoload 'flatten "flame"))
+(defvar w3-cookie-cache nil)
+
+(defmacro w3-d-s-var-def (var)
+  (` (make-variable-buffer-local (defvar (, var) nil))))
+
+(w3-d-s-var-def w3-display-label-marker)
+(w3-d-s-var-def w3-display-open-element-stack)
+(w3-d-s-var-def w3-display-alignment-stack)
+(w3-d-s-var-def w3-display-list-stack)
+(w3-d-s-var-def w3-display-form-id)
+(w3-d-s-var-def w3-display-whitespace-stack)
+(w3-d-s-var-def w3-display-liststyle-stack)
+(w3-d-s-var-def w3-display-font-family-stack)
+(w3-d-s-var-def w3-display-font-weight-stack)
+(w3-d-s-var-def w3-display-font-variant-stack)
+(w3-d-s-var-def w3-display-font-size-stack)
+(w3-d-s-var-def w3-face-color)
+(w3-d-s-var-def w3-face-background-color)
+(w3-d-s-var-def w3-active-faces)
+(w3-d-s-var-def w3-active-voices)
+(w3-d-s-var-def w3-current-form-number)
+(w3-d-s-var-def w3-face-font-family)
+(w3-d-s-var-def w3-face-font-weight)
+(w3-d-s-var-def w3-face-font-variant)
+(w3-d-s-var-def w3-face-font-size)
+(w3-d-s-var-def w3-face-font-family)
+(w3-d-s-var-def w3-face-font-size)
+(w3-d-s-var-def w3-face-font-style)
+(w3-d-s-var-def w3-face-font-spec)
+(w3-d-s-var-def w3-face-text-decoration)
+(w3-d-s-var-def w3-face-face)
+(w3-d-s-var-def w3-face-descr)
+(w3-d-s-var-def w3-face-background-image)
+(w3-d-s-var-def w3-display-css-properties)
+(w3-d-s-var-def w3-display-background-properties)
+
+(eval-when-compile
+  (defmacro w3-get-attribute (attr)
+    (` (cdr-safe (assq (, attr) args))))
+  
+  (defmacro w3-get-face-info (info &optional other)
+    (let ((var (intern (format "w3-face-%s" info))))
+      (` (push (w3-get-style-info (quote (, info)) node
+                                 (or (and (not w3-user-colors-take-precedence)
+                                          (cdr-safe (assq (quote (, other))
+                                                          (nth 1 node))))
+                                     (car (, var))))
+              (, var)))))
+
+  (defmacro w3-pop-face-info (info)
+    (let ((var (intern (format "w3-face-%s" info))))
+      (` (pop (, var)))))
+
+  (defmacro w3-get-all-face-info ()
+    (`
+     (progn
+       (w3-get-face-info font-family)
+       ;; This is to handle the 'face' attribute on arbitrary elements
+       (if (cdr-safe (assq 'face (nth 1 node)))
+          (setf (car w3-face-font-family)
+                (append (car w3-face-font-family)
+                        (split-string (cdr-safe
+                                       (assq 'face (nth 1 node)))
+                                      " *, *"))))
+       (w3-get-face-info font-style)
+       (w3-get-face-info font-weight)
+       (w3-get-face-info font-variant)
+       (w3-get-face-info font-size)
+       (w3-get-face-info text-decoration)
+       (w3-get-face-info background-image)
+       (w3-get-face-info color color)
+       (w3-get-face-info background-color bgcolor)
+       (setq w3-face-font-spec (make-font
+                               :weight (car w3-face-font-weight)
+                               :family  (if (not w3-user-fonts-take-precedence)
+                                            (car w3-face-font-family))
+                               :size (car w3-face-font-size))))))
+
+  (defmacro w3-pop-all-face-info ()
+    (`
+     (progn
+       (w3-pop-face-info font-family)
+       (w3-pop-face-info font-weight)
+       (w3-pop-face-info font-variant)
+       (w3-pop-face-info font-size)
+       (w3-pop-face-info font-style)
+       (w3-pop-face-info text-decoration)
+       (w3-pop-face-info background-image)
+       (w3-pop-face-info color)
+       (w3-pop-face-info background-color))))
+
+  )
+
+(defvar w3-display-same-buffer nil)
+(defvar w3-face-cache nil  "Cache for w3-face-for-element")
+(defvar w3-face-index 0)
+(defvar w3-image-widgets-waiting nil)
+
+(make-variable-buffer-local 'w3-last-fill-pos)
+
+(defconst w3-fill-prefixes-vector
+  (let ((len 0)
+        (prefix-vector (make-vector 80 nil)))
+    (while (< len 80)
+      (aset prefix-vector len (make-string len ? ))
+      (setq len (1+ len)))
+    prefix-vector))
+
+(defconst w3-line-breaks-vector
+  (let ((len 0)
+       (breaks-vector (make-vector 10 nil)))
+    (while (< len 10)
+      (aset breaks-vector len (make-string len ?\n))
+      (setq len (1+ len)))
+    breaks-vector))
+
+(defvar w3-pause-keystroke nil)
+
+(defsubst w3-pause ()
+  (declare (special cur-viewing-pos))
+  (save-excursion
+    (goto-char (or cur-viewing-pos (point-min)))
+    (cond
+     (w3-running-xemacs
+      (if (and (not (sit-for 0)) (input-pending-p))
+         (condition-case ()
+             (dispatch-event (next-command-event))
+           (error nil))))
+     (t
+      (if (and (not (sit-for 0)) (input-pending-p))
+         (condition-case ()
+             (progn
+               (setq w3-pause-keystroke
+                     (lookup-key w3-mode-map (vector (read-event))))
+               (case w3-pause-keystroke
+                 ((w3-quit w3-leave-buffer) nil)
+                 (otherwise
+                  (call-interactively w3-pause-keystroke))))
+           (error nil)))))
+    (setq cur-viewing-pos (point))))
+
+(defmacro w3-get-pad-string (len)
+  (` (cond
+      ((< (, len) 0)
+       "")
+      ((< (, len) 80)
+       (aref w3-fill-prefixes-vector (, len)))
+      (t (make-string (, len) ? )))))
+
+(defsubst w3-set-fill-prefix-length (len)
+  (setq fill-prefix (if (< len (- (or w3-strict-width (window-width)) 4))
+                       (w3-get-pad-string len)
+                     (url-warn
+                      'html
+                      "Runaway indentation!  Too deep for window width!")
+                     fill-prefix)))
+
+(defsubst w3-get-style-info (info node &optional default)
+  (or (cdr-safe (assq info w3-display-css-properties)) default))
+
+(defun w3-decode-area-coords (str)
+  (let (retval)
+    (while (string-match "\\([ \t0-9]+\\),\\([ \t0-9]+\\)" str)
+      (setq retval (cons (vector (string-to-int (match-string 1 str))
+                                (string-to-int (match-string 2 str))) retval)
+           str (substring str (match-end 0) nil)))
+    (if (string-match "\\([0-9]+\\)" str)
+       (setq retval (cons (vector (+ (aref (car retval) 0)
+                                     (string-to-int (match-string 1 str)))
+                                  (aref (car retval) 1)) retval)))
+    (nreverse retval)))
+
+(defun w3-normalize-color (color)
+  (cond
+   ((valid-color-name-p color)
+    color)
+   ((valid-color-name-p (concat "#" color))
+    (concat "#" color))
+   ((string-match "[ \t\r\n]" color)
+    (w3-normalize-color
+     (mapconcat (function (lambda (x) (if (memq x '(?\t ?\r ?\n ? )) ""
+                                       (char-to-string x)))) color "")))
+   ((valid-color-name-p (font-normalize-color color))
+    (font-normalize-color color))
+   (t
+    (w3-warn 'html (format "Bad color specification: %s" color))
+    nil)))
+
+(defsubst w3-voice-for-element (node)
+  (if (featurep 'emacspeak)
+      (let (family gain left right pitch pitch-range stress richness voice)
+       (setq family (w3-get-style-info 'voice-family node)
+             gain (w3-get-style-info 'gain node)
+             left (w3-get-style-info 'left-volume node)
+             right (w3-get-style-info 'right-volume node)
+             pitch (w3-get-style-info 'pitch node)
+             pitch-range (w3-get-style-info 'pitch-range node)
+             stress (w3-get-style-info 'stress node)
+             richness (w3-get-style-info 'richness node))
+       (if (or family gain left right pitch pitch-range stress richness)
+           (setq voice (dtk-personality-from-speech-style
+                        (make-dtk-speech-style :family (or family 'paul)
+                                               :gain (or gain 5)
+                                               :left-volume (or left 5)
+                                               :right-volume (or right 5)
+                                               :average-pitch (or pitch 5)
+                                               :pitch-range (or pitch-range 5)
+                                               :stress (or stress 5)
+                                               :richness (or richness 5))))
+         (setq voice nil))
+       (or voice (car w3-active-voices)))))
+
+(defun w3-make-face-emacs19 (name &optional doc-string temporary)
+  "Defines and returns a new FACE described by DOC-STRING.
+If the face already exists, it is unmodified."
+  (make-face name))
+
+(cond
+ ((not (fboundp 'make-face))
+  (fset 'w3-make-face 'ignore))
+ (w3-running-xemacs
+  (fset 'w3-make-face 'make-face))
+ (t
+  (fset 'w3-make-face 'w3-make-face-emacs19)))
+
+(defsubst w3-face-for-element (node)
+  (w3-get-all-face-info)
+  (if (car w3-face-text-decoration)
+      (set-font-style-by-keywords w3-face-font-spec
+                                 (car w3-face-text-decoration)))
+  (if w3-face-font-variant
+      (set-font-style-by-keywords w3-face-font-spec
+                                 (car w3-face-font-variant)))
+  (if w3-face-font-style
+      (set-font-style-by-keywords w3-face-font-spec
+                                 (car w3-face-font-style)))
+  (setq w3-face-descr (list w3-face-font-spec
+                           (car w3-face-background-image)
+                           (car w3-face-color)
+                           (car w3-face-background-color))
+       w3-face-face (cdr-safe (assoc w3-face-descr w3-face-cache)))
+  (if (or w3-face-face
+         (not (or (car w3-face-color)
+                  (car w3-face-background-image)
+                  (car w3-face-background-color)
+                  w3-face-font-spec)))
+      nil                              ; Do nothing, we got it already
+    (setq w3-face-face
+         (w3-make-face (intern (format "w3-style-face-%05d" w3-face-index))
+                       "An Emacs-W3 face... don't edit by hand." t)
+         w3-face-index (1+ w3-face-index))
+    (if (car w3-face-background-image)
+       (w3-maybe-start-background-image-download
+        (car w3-face-background-image) w3-face-face))
+    (if w3-face-font-spec
+       (font-set-face-font w3-face-face w3-face-font-spec))
+    (if (car w3-face-color)
+       (font-set-face-foreground w3-face-face (car w3-face-color)))
+    (if (car w3-face-background-color)
+       (font-set-face-background w3-face-face (car w3-face-background-color)))
+    (if (not (car w3-face-background-image))
+       (setq w3-face-cache (cons
+                            (cons w3-face-descr w3-face-face)
+                            w3-face-cache))))
+  w3-face-face)
+
+(defun w3-normalize-spaces (string)
+  ;; nuke spaces in the middle
+  (while (string-match "[ \t\r\n][ \r\t\n]+" string)
+    (setq string (concat (substring string 0 (1+ (match-beginning 0)))
+                        (substring string (match-end 0)))))
+
+  ;; nuke spaces at the beginning
+  (if (string-match "^[ \t\r\n]+" string)
+      (setq string (substring string (match-end 0))))
+
+  ;; nuke spaces at the end
+  (if (string-match "[ \t\n\r]+$" string)
+      (setq string (substring string 0 (match-beginning 0))))
+  string)
+
+
+(if (not (fboundp 'char-before))
+    (defun char-before (&optional pos)
+      (char-after (1- (or pos (point))))))
+
+(defsubst w3-display-line-break (n)
+  (if (or
+       (memq (car w3-display-whitespace-stack) '(pre nowrap)) ; Been told
+       (= w3-last-fill-pos (point))
+       (> w3-last-fill-pos (point-max)))
+      (if (not (eq (char-before (point)) ?\n))
+         (setq n (1+ n))) ; at least put one line in
+    (let ((fill-column (max (1+ (length fill-prefix)) fill-column))
+         width)
+      (case (car w3-display-alignment-stack)
+       (center
+        (fill-region-as-paragraph w3-last-fill-pos (point))
+        (center-region w3-last-fill-pos (point-max)))
+       ((justify full)
+        (fill-region-as-paragraph w3-last-fill-pos (point) 'full))
+       (right
+        (fill-region-as-paragraph w3-last-fill-pos (point))
+        (goto-char w3-last-fill-pos)
+        (catch 'fill-exit
+          (while (re-search-forward ".$" nil t)
+            (if (>= (setq width (current-column)) fill-column)
+                nil                    ; already justified, or error
+              (beginning-of-line)
+              (insert-char ?  (- fill-column width) t)
+              (end-of-line)
+              (if (eobp)
+                  (throw 'fill-exit t))
+              (condition-case ()
+                  (forward-char 1)
+                (error (throw 'fill-exit t))))))
+        )
+       (otherwise                      ; Default is left justification
+        (fill-region-as-paragraph w3-last-fill-pos (point)))
+       ))
+    (setq n (1- n)))
+  (setq w3-last-fill-pos (point-max))
+  (insert (cond
+          ((<= n 0) "")
+          ((< n 10)
+           (aref w3-line-breaks-vector n))
+          (t
+           (make-string n ?\n)))))
+
+(defsubst w3-munge-line-breaks-p ()
+  (eq (car w3-display-whitespace-stack) 'pre))
+
+(defvar w3-display-nil-face (w3-make-face nil "Stub face... don't ask." t))
+
+(defvar w3-scratch-start-point nil)
+
+(defsubst w3-handle-string-content (string)
+  (setq w3-scratch-start-point (point))
+  (insert string)
+  (if (w3-munge-line-breaks-p)
+      (progn
+       (goto-char w3-scratch-start-point)
+       (if (not (search-forward "\n" nil t))
+           (subst-char-in-region w3-scratch-start-point (point-max) ?\r ?\n)
+         (subst-char-in-region w3-scratch-start-point (point-max) ?\r ? )))
+    (goto-char w3-scratch-start-point)
+    (while (re-search-forward
+           " [ \t\n\r]+\\|[\t\n\r][ \t\n\r]*"
+           nil 'move)
+      (replace-match " "))
+    (goto-char w3-scratch-start-point)
+    (if (and (memq (char-before (point)) '(?  ?\t ?\r ?\n))
+            (looking-at "[ \t\r\n]"))
+       (delete-region (point)
+                      (progn
+                        (skip-chars-forward " \t\r\n")
+                        (point)))))
+  (goto-char (point-max))
+  (add-text-properties w3-scratch-start-point
+                      (point) (list 'face w3-active-faces
+                                    'html-stack w3-display-open-element-stack
+                                    'start-open nil
+                                    'end-open nil
+                                    'front-sticky t
+                                    'rear-nonsticky nil
+                                    'duplicable t))
+  (if (car w3-active-voices)
+      (add-text-properties w3-scratch-start-point (point)
+                          (list 'personality (car w3-active-voices))))
+  )
+
+(require 'mule-sysdp)
+
+(defun w3-display-get-cookie (args)
+  (if (not (fboundp 'cookie))
+      "Sorry, no cookies today."
+    (let* ((href (or (w3-get-attribute 'href) (w3-get-attribute 'src)))
+          (fname (or (cdr-safe (assoc href w3-cookie-cache))
+                     (url-generate-unique-filename "%s.cki")))
+          (st (or (cdr-safe (assq 'start args)) "Loading cookies..."))
+          (nd (or (cdr-safe (assq 'end args)) "Loading cookies... done.")))
+      (if (not (file-exists-p fname))
+         (save-excursion
+           (set-buffer (generate-new-buffer " *cookie*"))
+           (url-insert-file-contents href)
+           (mule-write-region-no-coding-system (point-min) (point-max) fname 5)
+           (setq w3-cookie-cache (cons (cons href fname) w3-cookie-cache))))
+      (cookie fname st nd))))
+
+(defun w3-widget-echo (widget &rest ignore)
+  (let* ((url (widget-get widget :href))
+        (name (widget-get widget :name))
+        (text (buffer-substring-no-properties (widget-get widget :from)
+                                              (widget-get widget :to)))
+        (title (widget-get widget :title))
+        (check w3-echo-link)
+        (msg nil))
+    (if url
+       (setq url (url-truncate-url-for-viewing url)))
+    (if name
+       (setq name (concat "anchor:" name)))
+    (if (not (listp check))
+       (setq check (cons check '(title url text name))))
+    (catch 'exit
+      (while check
+       (and (boundp (car check))
+            (stringp (symbol-value (car check)))
+            (> (length (symbol-value (car check))) 0)
+            (throw 'exit (symbol-value (car check))))
+       (pop check)))))
+
+(defun w3-follow-hyperlink (widget &rest ignore)
+  (let* ((target (or (widget-get widget :target) w3-base-target))
+        (visited (widget-get widget :visited-face))
+        (href (widget-get widget :href)))
+    (if target (setq target (intern (downcase target))))
+    (if visited
+       (condition-case ()
+           (add-text-properties (widget-get widget :start)
+                                (widget-get widget :end)
+                                (list 'face visited))
+       (error nil)))
+    (case target
+      ((_blank external)
+       (w3-fetch-other-frame href))
+      (_top
+       (delete-other-windows)
+       (w3-fetch href))
+      (otherwise
+       (w3-fetch href target)))))
+
+(defun w3-balloon-help-callback (object &optional event)
+  (let* ((widget (widget-at (extent-start-position object)))
+        (href (widget-get widget :href)))
+    (if href
+       (url-truncate-url-for-viewing href)
+      nil)))
+
+
+;; Various macros
+(eval-when-compile
+  (defmacro w3-node-visible-p ()
+    (` (not (eq (car break-style) 'none))))
+
+  (defmacro w3-handle-empty-tag ()
+    (`
+     (progn
+       (push (cons tag args) w3-display-open-element-stack)
+       (push content content-stack)
+       (setq content nil))))
+
+  (defmacro w3-handle-content (node)
+    (`
+     (progn
+       (push (cons tag args) w3-display-open-element-stack)
+       (push content content-stack)
+       (setq content (nth 2 (, node))))))
+
+  (defmacro w3-display-handle-list-type ()
+    (`
+     (add-text-properties
+      (point)
+      (progn
+       (case (car break-style)
+         (list-item
+          (let ((list-style (or (car w3-display-liststyle-stack) 'disc))
+                (list-num (if (car w3-display-list-stack)
+                              (incf (car w3-display-list-stack))
+                            1))
+                (margin (1- (car left-margin-stack)))
+                (indent (w3-get-style-info 'text-indent node 0)))
+            (if (> indent 0)
+                (setq margin (+ margin indent))
+              (setq margin (max 0 (- margin indent))))
+            (beginning-of-line)
+            (case list-style
+              ((disc circle square)
+               (insert (format (format "%%%dc" margin)
+                               (or (cdr-safe (assq list-style w3-bullets))
+                                   ?o))))
+              ((decimal lower-roman upper-roman lower-alpha upper-alpha)
+               (let ((x (case list-style
+                          (lower-roman
+                           (w3-decimal-to-roman list-num))
+                          (upper-roman
+                           (upcase
+                            (w3-decimal-to-roman list-num)))
+                          (lower-alpha
+                           (w3-decimal-to-alpha list-num))
+                          (upper-alpha
+                           (upcase
+                            (w3-decimal-to-alpha list-num)))
+                          (otherwise
+                           (int-to-string list-num)))))
+                 (insert (format (format "%%%ds." margin) x))
+                 )
+               )
+              (otherwise
+               (insert (w3-get-pad-string margin)))
+              )
+            )
+          )
+         (otherwise
+          (insert (w3-get-pad-string (+ (car left-margin-stack)
+                                        (w3-get-style-info 'text-indent node 
0)))))
+         )
+       (point))
+      (list 'start-open t
+           'end-open t
+           'rear-nonsticky nil
+           'face 'nil))))
+
+  (defmacro w3-display-set-margins ()
+    (`
+     (progn
+       (push (+ (w3-get-style-info 'margin-left node 0)
+               (car left-margin-stack)) left-margin-stack)
+       (push (-
+             (car right-margin-stack)
+             (w3-get-style-info 'margin-right node 0)) right-margin-stack)
+       (setq fill-column (car right-margin-stack))
+       (w3-set-fill-prefix-length (car left-margin-stack))
+       (w3-display-handle-list-type))))
+
+  (defmacro w3-display-restore-margins ()
+    (`
+     (progn
+       (pop right-margin-stack)
+       (pop left-margin-stack))))
+
+  (defmacro w3-display-handle-break ()
+    (`
+     (case (car break-style)
+       (block                          ; Full paragraph break
+       (if (eq (cadr break-style) 'list-item)
+           (setf (cadr break-style) 'line)
+         (w3-display-line-break 1))
+       (w3-display-set-margins)
+       (push
+        (w3-get-style-info 'white-space node
+                           (car w3-display-whitespace-stack))
+        w3-display-whitespace-stack)
+       (push
+        (or (w3-get-attribute 'foobarblatz)
+            (w3-get-style-info 'list-style-type node
+                               (car w3-display-liststyle-stack)))
+        w3-display-liststyle-stack)
+       (push
+        (or (w3-get-attribute 'align)
+            (w3-get-style-info 'text-align node
+                               (car w3-display-alignment-stack)))
+        w3-display-alignment-stack)
+       (and w3-do-incremental-display (w3-pause)))
+       ((line list-item)               ; Single line break
+       (w3-display-line-break 0)
+       (w3-display-set-margins)
+       (push
+        (or (w3-get-attribute 'foobarblatz)
+            (w3-get-style-info 'list-style-type node
+                               (car w3-display-liststyle-stack)))
+        w3-display-liststyle-stack)
+       (push
+        (w3-get-style-info 'white-space node
+                           (car w3-display-whitespace-stack))
+        w3-display-whitespace-stack)
+       (push
+        (w3-get-style-info 'text-align node
+                           (or (w3-get-attribute 'align)
+                               (car w3-display-alignment-stack)))
+        w3-display-alignment-stack))
+       (otherwise                      ; Assume 'inline' rendering as default
+       nil))
+     )
+    )
+
+  (defmacro w3-display-progress-meter ()
+    (`
+     (url-lazy-message "Drawing... %c" (aref "/|\\-" (random 4)))))
+    
+  (defmacro w3-display-handle-end-break ()
+    (`
+     (case (pop break-style)
+       (block                          ; Full paragraph break
+       (w3-display-line-break 1)
+       (w3-display-restore-margins)
+       (pop w3-display-whitespace-stack)
+       (pop w3-display-liststyle-stack)
+       (pop w3-display-alignment-stack)
+       (and w3-do-incremental-display (w3-pause)))
+       ((line list-item)               ; Single line break
+       (w3-display-restore-margins)
+       (w3-display-line-break 0)
+       (pop w3-display-whitespace-stack)
+       (pop w3-display-liststyle-stack)
+       (pop w3-display-alignment-stack))      
+       (otherwise                      ; Assume 'inline' rendering as default
+       nil))
+     )
+    )
+  )
+
+;; <link> handling
+(defun w3-parse-link (args)
+  (let* ((type (if (w3-get-attribute 'rel) 'rel 'rev))
+        (desc (w3-get-attribute type))
+        (dc-desc (and desc (downcase desc))) ; canonical case
+        (dest (w3-get-attribute 'href))
+        (plist (alist-to-plist args))
+        (node-1 (assq type w3-current-links))
+        (node-2 (and node-1 desc (or (assoc desc
+                                            (cdr node-1))
+                                     (assoc dc-desc
+                                            (cdr node-1)))))
+        )
+    ;; Canonicalize the case of link types we may look for
+    ;; specifically (toolbar etc.) since that's done with
+    ;; assoc.  See `w3-mail-document-author' and
+    ;; `w3-link-toolbar', at least.
+    (if (member dc-desc w3-defined-link-types)
+       (setq desc dc-desc))
+    (if dest                           ; ignore if HREF missing
+       (cond
+        (node-2                        ; Add to old value
+         (setcdr node-2 (cons plist (cdr node-2))))
+        (node-1                        ; first rel/rev
+         (setcdr node-1 (cons (cons desc (list plist))
+                              (cdr node-1))))
+        (t (setq w3-current-links
+                 (cons (cons type (list (cons desc (list plist))))
+                       w3-current-links)))))
+    (setq desc (and desc (intern dc-desc)))
+    (case desc
+      ((style stylesheet)
+       (if w3-honor-stylesheets
+          (w3-handle-style plist)))
+      (otherwise
+       )
+      )
+    )
+  )
+
+
+;; Image handling
+(defun w3-maybe-start-image-download (widget)
+  (let* ((src (widget-get widget :src))
+        (cached-glyph (w3-image-cached-p src)))
+    (cond
+     ((and cached-glyph
+          (widget-glyphp cached-glyph)
+          (not (eq 'nothing
+                   (condition-case ()
+                       (image-instance-type
+                        (glyph-image-instance cached-glyph))
+                     (error 'nothing)))))
+      (setq w3-image-widgets-waiting (cons widget w3-image-widgets-waiting)))
+     ((or w3-delay-image-loads         ; Delaying images
+         (not (fboundp 'valid-specifier-domain-p)) ; Can't do images
+         (eq (device-type) 'tty))      ; Why bother?
+      (w3-add-delayed-graphic widget))
+     ((not (w3-image-loadable-p src nil)) ; Hey, we can't load it!
+      (mesage "Skipping image %s" (url-basepath src t))
+      (w3-add-delayed-graphic widget))
+     (t                                        ; Grab the images
+      (let (
+           (url-request-method "GET")
+           (old-asynch (default-value 'url-be-asynchronous))
+           (url-request-data nil)
+           (url-request-extra-headers nil)
+           (url-source t)
+           (url-mime-accept-string (substring
+                                    (mapconcat
+                                     (function
+                                      (lambda (x)
+                                        (if x
+                                            (concat (car x) ",")
+                                          "")))
+                                     w3-allowed-image-types "")
+                                    0 -1))
+           (url-working-buffer (generate-new-buffer-name " *W3GRAPH*")))
+       (unwind-protect
+           (progn
+             (setq-default url-be-asynchronous t)
+             (setq w3-graphics-list (cons (cons src (make-glyph))
+                                          w3-graphics-list))
+             (save-excursion
+               (set-buffer (get-buffer-create url-working-buffer))
+               (setq url-current-callback-data (list src (widget-get widget 
'buffer)
+                                                     widget)
+                     url-be-asynchronous t
+                     url-current-callback-func 'w3-finalize-image-download)
+               (url-retrieve src)))
+         (setq-default url-be-asynchronous old-asynch)))))))
+
+(defun w3-maybe-start-background-image-download (src face)
+  (let* ((cached-glyph (w3-image-cached-p src))
+        (buf (current-buffer)))
+    (cond
+     ((and cached-glyph
+          (widget-glyphp cached-glyph)
+          (not (eq 'nothing
+                   (image-instance-type
+                    (glyph-image-instance cached-glyph)))))
+      (set-face-background-pixmap face
+                                 (glyph-image-instance cached-glyph) buf))
+     ((or (not (fboundp 'valid-specifier-domain-p)) ; Can't do images
+         (eq (device-type) 'tty))      ; Why bother?
+      nil)
+     ((not (w3-image-loadable-p src nil)) ; Hey, we can't load it!
+      (mesage "Skipping image %s" (url-basepath src t))
+      nil)
+     (t                                        ; Grab the images
+      (let (
+           (url-request-method "GET")
+           (old-asynch (default-value 'url-be-asynchronous))
+           (url-request-data nil)
+           (url-request-extra-headers nil)
+           (url-source t)
+           (url-mime-accept-string (substring
+                                    (mapconcat
+                                     (function
+                                      (lambda (x)
+                                        (if x
+                                            (concat (car x) ",")
+                                          "")))
+                                     w3-allowed-image-types "")
+                                    0 -1))
+           (url-working-buffer (generate-new-buffer-name " *W3GRAPH*")))
+       (unwind-protect
+           (progn
+             (setq-default url-be-asynchronous t)
+             (setq w3-graphics-list (cons (cons src (make-glyph))
+                                          w3-graphics-list))
+             (save-excursion
+               (set-buffer (get-buffer-create url-working-buffer))
+               (setq url-current-callback-data (list src buf 'background face)
+                     url-be-asynchronous t
+                     url-current-callback-func 'w3-finalize-image-download)
+               (url-retrieve src)))
+         (setq-default url-be-asynchronous old-asynch)))))))
+
+(defun w3-finalize-image-download (url buffer &optional widget face)
+  (let ((glyph nil)
+       (node nil))
+    (url-uncompress)
+    (message "Enhancing image...")
+    (setq glyph (image-normalize (cdr-safe (assoc url-current-mime-type
+                                                 w3-image-mappings))
+                                (buffer-string)))
+    (message "Enhancing image... done")
+    (kill-buffer (current-buffer))
+    (cond
+     ((w3-image-invalid-glyph-p glyph)
+      (setq glyph nil)
+      (message "Reading of %s failed." url))
+     ((eq (aref glyph 0) 'xbm)
+      (let ((temp-fname (url-generate-unique-filename "%s.xbm")))
+       (save-excursion
+         (set-buffer (generate-new-buffer " *xbm-garbage*"))
+         (erase-buffer)
+         (insert (aref glyph 2))
+         (setq glyph temp-fname)
+         (mule-write-region-no-coding-system (point-min) (point-max) 
temp-fname)
+         (kill-buffer (current-buffer)))
+       (setq glyph (make-glyph (list (cons 'x glyph))))
+       (condition-case ()
+           (delete-file temp-fname)
+         (error nil))))
+     (t
+      (setq glyph (make-glyph glyph))))
+    (setq node (assoc url w3-graphics-list))
+    (cond
+     ((and node glyph)
+      (set-glyph-image (cdr node) (glyph-image glyph)))
+     (glyph
+      (setq w3-graphics-list (cons (cons url glyph) w3-graphics-list)))
+     (t nil))
+
+    (cond
+     ((or (not buffer)
+         (not (widget-glyphp glyph))
+         (not (buffer-name buffer)))
+      nil)
+     ((and (eq widget 'background)
+          w3-running-xemacs)
+      (set-face-background-pixmap face
+                                 (glyph-image-instance glyph)
+                                 buffer))
+     ((not (eq widget 'background))
+      (save-excursion
+       (set-buffer buffer)
+       (if (eq major-mode 'w3-mode)
+           (widget-value-set widget glyph)
+         (setq w3-image-widgets-waiting
+               (cons widget w3-image-widgets-waiting))))))))
+
+(defcustom w3-min-img-size 15
+  "*Image size under which the alt string is replaced by 
`w3-dummy-img-alt-repl'.
+15 is a bit aggressive, 5 pixels would be safer"
+  :group 'w3-images
+  :type 'integer
+  )
+
+(defcustom w3-dummy-img-re
+  "\\b\\(boule\\|bullet\\|dot\\|pebble[0-9]*[a-z]?[0-9]*\\|pixel\\)\\b"
+  "Image name regexp for which the alt string is replaced by 
`w3-dummy-img-alt-repl'."
+  :group 'w3-images
+  :type 'regexp)
+
+(defcustom w3-dummy-img-alt-repl "*"
+  "*Dummy image alt string replacement."
+  :group 'w3-images
+  :type 'string)  
+
+(defun w3-default-image-alt-func (fname)
+  ;; Assumes height/width bound by calling function
+  (declare (special height width))
+  (if (or (and (stringp height)
+              (< (string-to-int height) w3-min-img-size))
+         (and (stringp width)
+              (< (string-to-int width) w3-min-img-size))
+         (string-match w3-dummy-img-re fname))
+      w3-dummy-img-alt-repl
+    (concat "[" (file-name-sans-extension fname) "]")))
+
+(defmacro w3-image-alt (src)
+  (`
+   (let* ((doc-alt (w3-get-attribute 'alt))
+         (alt (or (and doc-alt
+                       (not (string-equal doc-alt ""))
+                       doc-alt)
+                  (cond
+                   ((null w3-auto-image-alt) "")
+                   ((eq t w3-auto-image-alt)
+                    (concat "[IMAGE(" (url-basepath src t) ")] "))
+                   ((stringp w3-auto-image-alt)
+                    (format w3-auto-image-alt (url-basepath src t)))
+                   ((functionp w3-auto-image-alt)
+                    (funcall w3-auto-image-alt (url-basepath src t))))))
+         c)
+     (while (setq c (string-match "[\C-i\C-j\C-l\C-m]" alt))
+       (aset alt c ? ))
+     alt)))
+
+(defmacro w3-handle-image ()
+  (`
+   (let* ((height (w3-get-attribute 'height))
+         (width (w3-get-attribute 'width))
+         (src (or (w3-get-attribute 'src) "Error Image"))
+         (alt (w3-image-alt src))
+         (ismap (and (assq 'ismap args) 'ismap))
+         (usemap (w3-get-attribute 'usemap))
+         (base (w3-get-attribute 'base))
+         (href (and hyperlink-info (cadr (widget-plist-member (cadr 
hyperlink-info) :href))))
+         (target (and hyperlink-info (cadr (widget-plist-member (cadr 
hyperlink-info) :target))))
+         (widget nil)
+         (align (or (w3-get-attribute 'align)
+                    (w3-get-style-info 'vertical-align node)))
+         (face w3-active-faces))
+     (if (assq '*table-autolayout w3-display-open-element-stack)
+        (insert alt)
+       (setq hyperimage-info
+            (list (point)
+                  (list 'image
+                        :src src          ; Where to load the image from
+                        'alt alt          ; Textual replacement
+                        'ismap ismap      ; Is it a server-side map?
+                        'usemap usemap    ; Is it a client-side map?
+                        :href href        ; Hyperlink destination
+                        :target target    ; target frame
+                        :button-face face ; img:link or img:visited entry in 
stylesheet
+                        )))
+       (setq widget (apply (function widget-create) (cadr hyperimage-info)))
+       (widget-put widget 'buffer (current-buffer))
+       ;;(w3-maybe-start-image-download widget) ; in w3-resurrect-images
+       (if (widget-get widget :from)
+          (add-text-properties (widget-get widget :from)
+                               (widget-get widget :to)
+                               (list 'html-stack 
w3-display-open-element-stack)))
+       (goto-char (point-max))))))
+
+;; The table handling
+(eval-and-compile
+  (case mule-sysdep-version
+    (xemacs
+     (if (not (find-charset 'w3-dingbats))
+        (make-charset 'w3-dingbats "Dingbats character set for Emacs/W3"
+                      '(registry "" dimension 1 chars 96 final ?:))))
+    ((4.0 3.0 3.1)
+     (if (not (charsetp 'w3-dingbats))
+        (define-charset nil 'w3-dingbats
+          (vector
+           1                           ; dimension
+           96                          ; chars
+           1                           ; width
+           1                           ; direction
+           ?:                          ; iso-final-char
+           0                           ; iso-graphic-plane (whats this?)
+           "dingbats" "emacs/w3-dingbats"
+           "Dingbats character set for Emacs/W3"))))
+    (t
+     nil)))
+
+(defun w3-make-char (oct)
+  (case mule-sysdep-version
+    (xemacs 
+     (make-char 'w3-dingbats (if (characterp oct) (char-int oct) oct)))
+    ((4.0 3.0 3.1)
+     (make-char 'w3-dingbats oct))
+    (t
+     oct)))
+
+(defvar w3-table-ascii-border-chars
+  [nil  nil  nil  ?+ nil  ?- ?+ ?- nil ?+ ?| ?| ?+ ?- ?| ?+]
+  "*Vector of ascii characters to use to draw table borders.
+This vector is used when terminal characters are unavailable")
+
+(defvar w3-table-glyph-border-chars
+  [nil  nil  nil  11 nil  2 7 14 nil 3 8 6 1 15 4 5]
+  "Vector of characters to use to draw table borders.
+This vector is used when terminal characters are used via glyphs")
+
+(defvar w3-table-graphic-border-chars
+  (vector
+   nil
+   nil
+   nil
+   (w3-make-char ?j)
+   nil
+   (w3-make-char ?q)
+   (w3-make-char ?m)
+   (w3-make-char ?v)
+   nil
+   (w3-make-char ?k)
+   (w3-make-char ?x)
+   (w3-make-char ?u)
+   (w3-make-char ?l)
+   (w3-make-char ?w)
+   (w3-make-char ?t)
+   (w3-make-char ?n))
+  "Vector of characters to use to draw table borders.
+This vector is used when terminal characters are used directly")
+
+(defvar w3-table-border-chars w3-table-ascii-border-chars
+  "Vector of characters to use to draw table borders.
+w3-setup-terminal-chars sets this to one of 
+w3-table-ascii-border-chars, 
+w3-table-glyph-border-chars, or
+w3-table-graphic-border-chars.")
+
+(defsubst w3-table-lookup-char (l u r b &optional char)
+  (or char (aref w3-table-border-chars (logior (if l 1 0)
+                                              (if u 2 0)
+                                              (if r 4 0)
+                                              (if b 8 0)))))
+
+(defvar w3-terminal-properties nil)
+
+(defsubst w3-insert-terminal-char (character &optional count inherit)
+  (if w3-terminal-properties
+      (set-text-properties (point)
+                          (progn
+                            (insert-char (or character ? )
+                                         (or count 1) inherit)
+                            (point))
+                          w3-terminal-properties)
+    (insert-char (or character ? ) (or count 1) inherit)))
+
+(defsubst w3-horizontal-rule-char ()
+  (w3-table-lookup-char t nil t nil w3-horizontal-rule-char))
+
+(defun w3-setup-terminal-chars ()
+  "Try to find the best set of characters to draw table borders with.
+On a console, this can trigger some Emacs display bugs.
+
+Initializes a number of variables:
+w3-terminal-properties to either nil or a list of properties including 'face
+w3-table-border-chars to one of the the three other vectors"
+  (interactive)
+  (setq w3-table-border-chars w3-table-ascii-border-chars
+       w3-terminal-properties nil)
+  (cond
+   ((and w3-use-terminal-characters
+        (eq (device-type) 'x))
+    (if (and (find-face 'w3-table-hack-x-face)
+            (face-differs-from-default-p 'w3-table-hack-x-face))
+       nil
+      (make-face 'w3-table-hack-x-face)
+      (if (not (face-differs-from-default-p 'w3-table-hack-x-face))
+         (font-set-face-font 'w3-table-hack-x-face
+                             (make-font :family "terminal"
+                                        :registry "*"
+                                        :encoding "*"
+                                        ))))
+    (cond
+     ((not (face-differs-from-default-p 'w3-table-hack-x-face))
+      nil)
+     ((and w3-use-terminal-glyphs (fboundp 'face-id))
+      (let ((id (face-id 'w3-table-hack-x-face))
+           (c (length w3-table-border-chars)))
+       (while (> (decf c) 0)
+         (if (aref w3-table-glyph-border-chars c)
+             (aset standard-display-table (aref w3-table-glyph-border-chars c)
+                   (vector (+ (* 256 id)
+                              (aref w3-table-graphic-border-chars c))))))
+       (setq w3-table-border-chars w3-table-glyph-border-chars
+             w3-terminal-properties nil)))
+     (t 
+      (setq w3-table-border-chars w3-table-graphic-border-chars
+           w3-terminal-properties (list 'start-open t
+                                        'end-open t
+                                        'rear-nonsticky t
+                                        'w3-table-border t
+                                        'face 'w3-table-hack-x-face)))))
+   ((and w3-use-terminal-characters-on-tty
+        (eq (device-type) 'tty))
+    (let ((c (length w3-table-border-chars)))
+      (while (> (decf c) 0)
+       (and (aref w3-table-glyph-border-chars c)
+            (aref w3-table-graphic-border-chars c)
+            (standard-display-g1 (aref w3-table-glyph-border-chars c)
+                                 (aref w3-table-graphic-border-chars c)))))
+    (setq w3-table-border-chars w3-table-glyph-border-chars
+         w3-terminal-properties (list 'w3-table-border t)))
+   (t
+    nil))
+  w3-table-border-chars)
+
+(defun w3-unsetup-terminal-characters nil
+  (interactive)
+  (w3-excise-terminal-characters (buffer-list))
+  (standard-display-default 1 15)
+  (setq w3-table-border-chars w3-table-ascii-border-chars))
+
+(defun w3-excise-terminal-characters (buffs)
+  "Replace hacked characters with ascii characters in buffers BUFFS.
+Should be run before restoring w3-table-border-chars to ascii characters.
+This will only work if we used glyphs rather than text properties"
+  (interactive (list (list (current-buffer))))
+  (let ((inhibit-read-only t)
+       (tr (make-string 16 ? ))
+       (i 0))
+    (while (< i (length tr))
+      (aset tr i i)
+      (setq i (1+ i)))
+    (setq i 0)
+    (while (< i (length w3-table-border-chars))
+      (and (aref w3-table-border-chars i)
+          (< (aref w3-table-border-chars i) 16)
+          (aset tr 
+                (aref w3-table-glyph-border-chars i)
+                (aref w3-table-ascii-border-chars i)))
+      (setq i (1+ i)))
+    (mapcar (function (lambda (buf)
+                       (save-excursion
+                         (set-buffer buf)
+                         (if (eq major-mode 'w3-mode)
+                             (translate-region (point-min)
+                                               (point-max)
+                                               tr)))))
+           buffs)))
+
+(defvar w3-display-table-cut-words-p nil
+  "*Whether to cut words that are oversized in table cells")
+  
+(defvar w3-display-table-force-borders (featurep 'emacspeak)
+  "*Whether to always draw table borders
+Can sometimes make the structure of a document clearer")
+
+(defvar w3-display-current-row nil)
+(defvar w3-display-current-col nil)
+(defvar w3-display-current-cell-offset 0)
+
+(defun w3-display-table-cut ()
+  (save-excursion
+    (goto-char (point-min))
+    (let ((offset -1))
+      (while (< offset 0)
+       (end-of-line)
+       (setq offset (- fill-column (current-column)))
+       (cond ((< offset 0)
+              (condition-case nil
+                  (progn (forward-char offset)
+                         (insert ?\n))
+                (error (setq offset 0))))
+             ((not (eobp))
+              (forward-line 1)
+              (setq offset -1)))))))
+
+(defun w3-display-fix-widgets ()
+  ;; Make markers belong to the right buffer
+  (save-excursion
+    (let ((st (point-min))
+         (nd nil)
+         (widget nil) parent
+         (to-marker nil)
+         (from-marker nil))
+      (while (setq st (next-single-property-change st 'button))
+       (setq nd (or (next-single-property-change st 'button) (point-max))
+             widget (widget-at st)
+             to-marker (and widget (widget-get widget :to))
+             from-marker (and widget (widget-get widget :from))
+             parent (and widget (widget-get widget :parent))
+             )
+       (if (not widget)
+           nil
+         (widget-put widget :from (set-marker (make-marker) st))
+         (widget-put widget :to   (set-marker (make-marker) nd))
+         (if (not parent)
+             nil
+           (widget-put parent :from (set-marker (make-marker) st))
+           (widget-put parent :to   (set-marker (make-marker) nd))))
+       (if (condition-case ()
+               (get-text-property (1+ nd) 'button)
+             (error nil))
+           (setq st nd)
+         (setq st (min (point-max) (1+ nd))))))))
+
+(defun w3-size-of-tree (tree minmax)
+  (declare (special args))
+  (save-excursion
+    (save-restriction
+      (narrow-to-region (point) (point))
+      ;; XXX fill-column set to 1 fails when fill-prefix is set
+      ;; XXX setting fill-column at all isn't really right
+      ;; for example <hr>s shouldn't be especially wide
+      ;; we should set a flag that makes w3 never wrap a line
+      (let ((fill-column (cond ((eq minmax 'min)
+                               3)
+                              ((eq minmax 'max)
+                               400))) 
+           (fill-prefix "")
+           (w3-last-fill-pos (point-min))
+           a retval
+           (w3-do-incremental-display nil)
+           (hr-regexp  (concat "^"
+                               (regexp-quote 
+                                (make-string 5 (w3-horizontal-rule-char)))
+                               "*$"))
+           )
+       ;;(push 'left  w3-display-alignment-stack)
+       (push (if (eq minmax 'max) 'nowrap) w3-display-whitespace-stack)
+       (while tree
+         (push (cons '*td args) w3-display-open-element-stack)
+         (w3-display-node (pop tree)))
+       (pop w3-display-whitespace-stack)
+       (goto-char (point-min))
+       (while (re-search-forward hr-regexp nil t)
+         (replace-match "" t t))
+       (goto-char (point-min))
+       (while (not (eobp))
+         ;; loop invariant: at beginning of uncounted line
+         (end-of-line)
+         (skip-chars-backward " ")
+         (setq retval (cons (current-column)
+                            retval))
+         (beginning-of-line 2))
+       (if (= (point-min) (point-max))
+           (setq retval 0)
+         (setq retval (apply 'max (cons 0 retval))))
+       (delete-region (point-min) (point-max))
+       retval))))
+
+(defun w3-display-table-dimensions (node)
+  ;; fill-column sets maximum width
+  (declare (special args))
+  (let (min-vector
+       max-vector
+       rows cols
+       ;;(w3-form-elements (and (boundp 'w3-form-elements) w3-form-elements))
+       (table-info (assq 'w3-table-info (cadr node)))) 
+    
+    (if table-info 
+       (setq min-vector (nth 1 table-info)
+             max-vector (nth 2 table-info)
+             rows       (nth 3 table-info)
+             cols       (nth 4 table-info))
+
+      (push (cons '*table-autolayout args) w3-display-open-element-stack)
+      (let (content
+           cur
+           (table-spans (list nil))    ; don't make this '(nil) 
+           ptr
+           col
+           constraints
+           
+           colspan rowspan min max)
+       (setq content (nth 2 node))
+       (setq rows 0 cols 0)
+       (while content
+         (setq cur (pop content))
+         (if (stringp cur)
+             nil
+           (case (car cur)
+             ((thead tfoot col colgroup)
+              (if (nth 2 cur)
+                  (setq content (append (nth 2 cur) content))))
+             (tr
+              (setq col 0)
+              (setq rows (1+ rows))
+              (setq ptr table-spans)
+              (mapcar
+               (function
+                (lambda (td)
+                  (setq colspan (string-to-int (or (cdr-safe (assq 'colspan 
(nth 1 td))) "1"))
+                        rowspan (string-to-int (or (cdr-safe (assq 'rowspan 
(nth 1 td))) "1"))
+                        min  (w3-size-of-tree  (nth 2 td) 'min)
+                        max  (w3-size-of-tree  (nth 2 td) 'max)
+                        )
+                  (while (eq (car-safe (car-safe (cdr ptr))) col)
+                    (setq col (+ col (cdr (cdr (car (cdr ptr))))))
+                    (if (= 0 (decf (car (cdr (car (cdr ptr))))))
+                        (pop (cdr ptr))
+                      (setq ptr (cdr ptr))))
+                  (push (list col colspan min max)
+                        constraints)
+                  (if (= rowspan 1) nil
+                    (push (cons col (cons (1- rowspan) colspan)) (cdr ptr))
+                    (setq ptr (cdr ptr)))
+                  (setq col (+ col colspan))
+                  ))
+               (nth 2 cur))
+              (while (cdr ptr)
+                (if (= 0 (decf (car (cdr (car (cdr ptr))))))
+                    (pop (cdr ptr))
+                  (setq ptr (cdr ptr))))
+              (setq cols (max cols col))
+              )
+             (caption
+              nil)
+             (otherwise
+              (setq content (nth 2 cur)))
+             )
+           )
+         )
+       (setq constraints (sort constraints
+                               (function
+                                (lambda (a b)
+                                  (< (cadr a) (cadr b)))))
+             min-vector (make-vector cols 0)
+             max-vector (make-vector cols 0))
+       (let (start end i mincellwidth maxcellwidth)
+         (mapcar (function (lambda (c)
+                             (cond ((= (cadr c) 1) 
+                                    (aset min-vector (car c) 
+                                          (max (aref min-vector (car c))
+                                               (nth 2 c)))
+                                    (aset max-vector (car c) 
+                                          (max (aref max-vector (car c))
+                                               (nth 3 c))))
+                                   (t 
+                                    (setq start (car c)
+                                          end (+ (car c) (cadr c))
+                                          mincellwidth 0
+                                          maxcellwidth 0
+                                          i start)
+                                    (while (< i end)
+                                      (setq mincellwidth (+ mincellwidth
+                                                            (aref min-vector 
i))
+                                            maxcellwidth (+
+                                                          maxcellwidth
+                                                          (aref max-vector i))
+                                            i (1+ i)))
+                                    (setq i start)
+                                    (if (= mincellwidth 0)
+                                        ;; if existing width is 0 divide evenly
+                                        (while (< i end)
+                                          (aset min-vector i
+                                                (/ (nth 2 c) (cadr c)))
+                                          (aset max-vector i
+                                                (/ (nth 3 c) (cadr c)))
+                                          (setq i (1+ i)))
+                                      ;; otherwise weight it by existing widths
+                                      (while (< i end)
+                                        (aset min-vector i
+                                              (max (aref min-vector i)
+                                                   (/ (* (nth 2 c)
+                                                         (aref min-vector i))
+                                                      mincellwidth)))
+                                        (aset max-vector i
+                                              (max (aref max-vector i)
+                                                   (/ (* (nth 3 c)
+                                                         (aref max-vector i))
+                                                      maxcellwidth)))
+                                        (setq i (1+ i))))
+                                    ))))
+                 constraints)))
+      (push (cons 'w3-table-info
+                 (list min-vector max-vector rows cols))
+           (cadr node))
+      (pop w3-display-open-element-stack))
+    
+    (let (max-width
+         min-width 
+         ret-vector
+         col
+         )
+    
+
+      (setq max-width (apply '+ (append max-vector (list cols 1))))
+      (setq min-width (apply '+ (append min-vector (list cols 1))))
+
+      ;; the comments in the cond are excerpts from rfc1942 itself
+      (cond 
+       ;;   1.  The minimum table width is equal to or wider than the available
+       ;;       space. In this case, assign the minimum widths and allow the
+       ;;       user to scroll horizontally. For conversion to braille, it will
+       ;;       be necessary to replace the cells by references to notes
+       ;;       containing their full content. By convention these appear
+       ;;       before the table.
+       ((>= min-width fill-column)
+       (setq ret-vector min-vector))
+     
+       ;;   2.  The maximum table width fits within the available space. In
+       ;;       this case, set the columns to their maximum widths.
+       ((<= max-width fill-column)
+       (setq ret-vector max-vector))
+     
+       ;;   3.  The maximum width of the table is greater than the available
+       ;;       space, but the minimum table width is smaller. In this case,
+       ;;       find the difference between the available space and the minimum
+       ;;       table width, lets call it W. Lets also call D the difference
+       ;;       between maximum and minimum width of the table.
+     
+       ;;       For each column, let d be the difference between maximum and
+       ;;       minimum width of that column. Now set the column's width to the
+       ;;       minimum width plus d times W over D. This makes columns with
+       ;;       large differences between minimum and maximum widths wider than
+       ;;       columns with smaller differences.
+       (t
+       (setq ret-vector (make-vector cols 0))
+       (let ((W (- fill-column min-width))
+             (D (- max-width min-width))
+             d extra)
+         (setq col 0)
+         (while (< col (length ret-vector))
+           (setq d (- (aref max-vector col)
+                      (aref min-vector col)))
+           (aset ret-vector col 
+                 (+ (aref min-vector col)
+                    (/ (* d W) D)))
+           (setq col (1+ col)))
+         (setq extra (- fill-column
+                        (apply '+ (append ret-vector
+                                          (list (length ret-vector) 1))))
+               col 0)
+         (while (and (< col (length ret-vector)) (> extra 0))
+           (if (= 1 (- (aref max-vector col) (aref ret-vector col) ))
+               (aset ret-vector col (1+ (aref ret-vector col))))
+           (setq extra (1- extra)
+                 col (1+ col)))
+         )))
+      (list rows cols ret-vector))))
+
+(defun w3-display-table (node)
+  (let* ((dimensions (w3-display-table-dimensions node))
+        (num-cols (max (cadr dimensions) 1))
+        (num-rows (max (car dimensions) 1))
+        (column-dimensions (caddr dimensions))
+        (row-dimensions (make-vector num-rows 0))
+        (row-index 0)
+        (table-width (apply '+ (append column-dimensions (list num-cols 1)))))
+    (cond
+     ((or (<= (cadr dimensions) 0) (<= (car dimensions) 0))
+      ;; We have an invalid table
+      nil)
+     ((assq '*table-autolayout w3-display-open-element-stack)
+      ;; don't bother displaying the table if all we really need is the size
+      (progn (insert-char ?T table-width) (insert "\n")))
+     (t
+      (let* ((tag  (nth 0 node))
+            (args (nth 1 node))
+            (border-node (cdr-safe (assq 'border args)))
+            (border (or w3-display-table-force-borders
+                        (and border-node (or
+                                          (/= 0 (string-to-int border-node))
+                                          (string= "border" border-node)))))
+            (border-char (unless border ? ))
+            (valign nil)
+            (align nil)
+            (content (nth 2 node))
+            (avgwidth (/ (- fill-column num-cols num-cols) num-cols))
+            (formatted-cols (make-vector num-cols nil))
+            (table-rowspans (make-vector num-cols 0))
+            (table-colspans (make-vector num-cols 1))
+            (whole-table-rowspans (make-vector num-rows nil))
+            (whole-table-colspans (make-vector num-rows nil))
+            (prev-colspans  (make-vector num-cols 0))
+            (prev-rowspans  (make-vector num-cols 0))
+            (table-colwidth (make-vector num-cols 0))
+            (fill-prefix "")
+            (height nil)
+            (cur-height nil)
+            (cols nil)
+            (rows nil)
+            (row 0)
+            (this-rectangle nil)
+            (inhibit-read-only t)
+            (i 0)
+            (origin (- (point) w3-display-current-cell-offset))
+            (inside-table-p (and w3-display-current-row 
w3-display-current-col))
+            (incoming-w3-table-structure w3-table-structure)
+            )
+       ;; for emacspeak
+       (when (featurep 'emacspeak)
+         (if inside-table-p
+             (let ((surrounding-table-descr (car incoming-w3-table-structure)))
+               (setq w3-table-structure
+                     (list (list w3-display-current-row w3-display-current-col 
origin origin nil)))
+               (setcar (cddr surrounding-table-descr)
+                       (append w3-table-structure
+                               (caddr surrounding-table-descr))))
+           (setq w3-table-structure (list (list origin origin nil))) ; to be 
completed (see below)
+           (setq incoming-w3-table-structure (append w3-table-structure
+                                                     
incoming-w3-table-structure))))
+
+       (push (cons tag args) w3-display-open-element-stack)
+
+       (if (memq 'nowrap w3-display-whitespace-stack)
+           (setq fill-prefix "")
+         (case (car w3-display-alignment-stack)
+           (center
+            (w3-set-fill-prefix-length
+             (max 0 (/ (- fill-column table-width) 2))))
+           (right
+            (w3-set-fill-prefix-length
+             (max 0 (- fill-column table-width))))
+           (t
+            (setq fill-prefix ""))))
+       (while content
+         (case (caar content)
+           ((thead tfoot col colgroup)
+            (if (nth 2 (car content))
+                (setq content (append (nth 2 (car content)) (cdr content)))
+              (setq content (cdr content))))
+           (tr
+            (setq w3-display-css-properties (css-get
+                                             (nth 0 (car content))
+                                             (nth 1 (car content))
+                                             w3-current-stylesheet
+                                             w3-display-open-element-stack))
+            (setq cols (nth 2 (car content))
+                  valign (or (cdr-safe (assq 'valign (nth 1 (car content))))
+                             (w3-get-style-info 'vertical-align node))
+                  align  (or (cdr-safe (assq 'align  (nth 1 (car content))))
+                             (w3-get-style-info 'text-align node))
+                  content (cdr content)
+                  row (1+ row))
+            (if (and valign (stringp valign))
+                (setq valign (intern (downcase valign))))
+            ;; this is iffy
+            ;;(if align (push (intern (downcase align)) 
w3-display-alignment-stack))
+            (save-excursion
+              (save-restriction
+                (let* ((cell-origin (point))
+                       (w3-display-current-cell-offset (1+ cell-origin)))
+                  (narrow-to-region cell-origin cell-origin)
+                  (setq fill-column avgwidth
+                        w3-last-fill-pos (point-min)
+                        i 0)
+                  ;; skip over columns that have leftover content
+                  (while (and (< i num-cols)
+                              (/= 0 (aref table-rowspans i)))
+                    (setq i (+ i (max 1 (aref table-colspans i)))))
+                  ;; Need to push the properties for the table onto the stack
+                  (setq w3-display-css-properties (css-get
+                                                   tag
+                                                   args
+                                                   w3-current-stylesheet
+                                                   
w3-display-open-element-stack))
+                  (push (w3-face-for-element (list tag args nil)) 
w3-active-faces)
+                  (push (w3-voice-for-element (list tag args nil)) 
w3-active-voices)
+                  (push (cons tag args) w3-display-open-element-stack)
+                  (while cols
+                    ;; And need to push these bogus placeholders on there
+                    ;; so that w3-display-node doesn't pop off the real face
+                    ;; or voice we just put in above.
+                    (push nil w3-active-faces)
+                    (push nil w3-active-voices)
+                    (let* ((node (car cols))
+                           (attributes (nth 1 node))
+                           (colspan (string-to-int
+                                     (or (cdr-safe (assq 'colspan attributes))
+                                         "1")))
+                           (rowspan (string-to-int
+                                     (or (cdr-safe (assq 'rowspan attributes))
+                                         "1")))
+                           fill-column column-width
+                           (fill-prefix "")
+                           (w3-do-incremental-display nil)
+                           (indent-tabs-mode nil)
+                           c e
+                           )
+
+                      (aset table-colspans i colspan)
+                      (aset table-rowspans i rowspan)
+
+                      (setq fill-column 0)
+                      (setq c i
+                            e (+ i colspan))
+                      (while (< c e)
+                        (setq fill-column (+ fill-column 
+                                             (aref column-dimensions c)
+                                             1)
+                              c (1+ c)))
+                      (setq fill-column (1- fill-column))
+                      (aset table-colwidth i fill-column)
+
+                      (setq w3-last-fill-pos (point-min))
+                      (push (cons (nth 0 node) (nth 1 node))
+                            w3-display-open-element-stack)
+                      (let ((w3-display-current-row row)
+                            (w3-display-current-col (1+ i)))
+                        (w3-display-node node))
+                      (setq fill-column (aref table-colwidth i))
+                      (if w3-display-table-cut-words-p
+                          (w3-display-table-cut)
+                        (w3-display-line-break 1))
+                      (setq cols (cdr cols))
+                      (goto-char (point-min))
+                      (skip-chars-forward "\t\n\r")
+                      (beginning-of-line)
+                      (delete-region (point-min) (point))
+                      (goto-char (point-max))
+                      (skip-chars-backward " \t\n\r")
+                      (delete-region (point) (point-max))
+                      (if (>= fill-column (current-column))
+                          (insert-char ?  (- fill-column (current-column)) t))
+                      (goto-char (point-min))
+                      ;; This gets our text properties out to the
+                      ;; end of lines for table rows/cells with backgrounds
+                      (while (not (eobp))
+                        (re-search-forward "$" nil t)
+                        (if (>= fill-column (current-column))
+                            (insert-char ?  (- fill-column (current-column)) 
t))
+                        (or (eobp) (forward-char 1)))
+                      (aset formatted-cols i (extract-rectangle (point-min) 
(point-max)))
+                      (delete-region (point-min) (point-max))
+                      (let ((j (1- colspan)))
+                        (while (> j 0)
+                          (aset table-colspans (+ i j) 0)
+                          (setq j (1- j))))            
+                      (setq i (+ i colspan))
+                      ;; skip over columns that have leftover content
+                      (while (and (< i num-cols)
+                                  (/= 0 (aref table-rowspans i)))
+                        (setq i (+ i (max 1 (aref table-colspans i)))))
+                      ))
+                  (pop w3-display-open-element-stack)
+                  (pop w3-active-faces)
+                  (pop w3-active-voices)
+                  (w3-pop-all-face-info)
+                  ;; finish off the columns
+                  (while (< i num-cols)
+                    (aset table-colwidth i (aref column-dimensions i))
+                    (aset table-colspans i 1)
+                    (setq i (1+ i))
+                    (while (and (< i num-cols)
+                                (/= 0 (aref table-rowspans i)))
+                      (setq i (+ i (max 1 (aref table-colspans i))))))
+
+                  ;; on the last row empty any pending rowspans per the rfc
+                  (if content nil
+                    (fillarray table-rowspans 1)) 
+
+                  ;; Find the tallest rectangle that isn't a rowspanning cell
+                  (setq height 0 
+                        i 0)
+                  (while (< i num-cols)
+                    (if (= 1 (aref table-rowspans i))
+                        (setq height (max height (length (aref formatted-cols 
i)))))
+                    (setq i (+ i (max 1 (aref table-colspans i)))))
+
+                  ;; Make all rectangles the same height
+                  (setq i 0)
+                  (while (< i num-cols)
+                    (setq this-rectangle (aref formatted-cols i))
+                    (if (> height (length this-rectangle))
+                        (let ((colspan-fill-line
+                               (make-string (abs (aref table-colwidth i)) ? )))
+                          (case valign
+                            ((center middle)
+                             (aset formatted-cols i
+                                   (append (make-list (/ (- height (length 
this-rectangle)) 2) 
+                                                      colspan-fill-line)
+                                           this-rectangle)))
+                            (bottom
+                             (aset formatted-cols i 
+                                   (append (make-list (- height (length 
this-rectangle))
+                                                      colspan-fill-line)
+                                           this-rectangle))))))
+                    (setq i (+ i (max 1 (aref table-colspans i))))))))
+            
+
+            ;; fix broken colspans (this should only matter on illegal tables)
+            (setq i 0)
+            (while (< i num-cols)
+              (if (= (aref table-colspans i) 0)
+                  (aset table-colspans i 1))
+              (setq i (+ i (aref table-colspans i))))
+
+            ;; Insert a separator 
+            (insert fill-prefix)
+            (setq i 0)
+            (let (rflag bflag tflag lflag)
+              (while (< i num-cols)
+                (setq rflag (= (aref prev-rowspans i) 0)
+                      bflag (/= (aref table-colspans i) 0)
+                      tflag (/= (aref prev-colspans  i) 0))
+                ;; insert the vertical dividers if necessary
+                (w3-insert-terminal-char
+                 (w3-table-lookup-char lflag tflag rflag bflag border-char))
+                (setq lflag t)
+                (cond
+                 ((= (aref prev-rowspans i) 0)
+                  ;; First row, insert the top horizontal divider
+                  (if border
+                      (w3-insert-terminal-char
+                       (w3-table-lookup-char t nil t nil border-char) 
+                       (aref column-dimensions i)))
+                  (setq i (1+ i)))
+                 ((car (aref formatted-cols i))
+                  ;; Slap in the rows
+                  (insert (pop (aref formatted-cols i)))
+                  (setq lflag nil)
+                  (setq i (+ i (max (aref table-colspans i)
+                                    (aref prev-colspans  i) 1))))
+                 (t
+                  (if border
+                      (insert-char ?  (aref table-colwidth i) t))
+                  (setq lflag nil)
+                  (setq i (+ i (max (aref table-colspans i)
+                                    (aref prev-colspans  i) 1))))))
+              (if (not border)
+                  nil
+                (w3-insert-terminal-char
+                 (w3-table-lookup-char lflag (/= row 1) nil t border-char))
+                (insert "\n")))
+            
+            ;; recalculate height (in case we've shortened a rowspanning cell)
+            (setq height 0 
+                  i 0)
+            (while (< i num-cols)
+              (if (= 1 (aref table-rowspans i))
+                  (setq height (max height (length (aref formatted-cols i)))))
+              (setq i (+ i (max 1 (aref table-colspans i)))))
+
+            (aset whole-table-rowspans row-index (copy-seq table-rowspans))
+            (aset whole-table-colspans row-index (copy-seq table-colspans))
+            
+            ;; update row-dimensions
+            (aset row-dimensions row-index (1+ height))
+            (setq row-index (1+ row-index))
+
+            ;; Insert a row back in original buffer
+            (while (> height 0)
+              (insert fill-prefix)
+              (w3-insert-terminal-char (w3-table-lookup-char nil t nil t 
border-char))
+              (setq i 0)
+              (while (< i num-cols)
+                (if (car (aref formatted-cols i))
+                    (insert (pop (aref formatted-cols i))) 
+                  (insert-char ?  (aref table-colwidth i) t)) 
+                (w3-insert-terminal-char (w3-table-lookup-char nil t nil t 
border-char))
+                (setq i (+ i (max (aref table-colspans i) 1))))
+              (insert "\n")
+              ;;(and w3-do-incremental-display (w3-pause))
+              (setq height (1- height)))
+            
+            (setq i 0)
+            (while (< i num-cols)
+              (if (> (aref table-rowspans i) 0)
+                  (decf (aref table-rowspans i)))
+              (incf i))
+            
+            (setq prev-rowspans (copy-seq table-rowspans))
+            (setq prev-colspans (copy-seq table-colspans))
+        
+            (and w3-do-incremental-display (w3-pause))
+            )
+           (caption
+            (let ((left (length fill-prefix))
+                  (fill-prefix "")
+                  (fill-column table-width)
+                  (start (point)))
+              (w3-display-node (pop content))
+              (indent-rigidly start (point) left)))
+           (otherwise                  
+            (delete-horizontal-space)
+            (setq content (nth 2 (car content))))
+           ))
+       (if (= (length column-dimensions) 0) nil
+         (insert fill-prefix)
+         (setq i 0)
+         (let (tflag lflag)
+           (while (< i num-cols)
+             (setq tflag (/= (aref prev-colspans  i) 0))
+             (w3-insert-terminal-char (w3-table-lookup-char lflag tflag t nil 
border-char))
+             (setq lflag t)
+             (w3-insert-terminal-char
+              (w3-table-lookup-char t nil t nil border-char)
+              (aref column-dimensions i))
+             (setq i (1+ i)))
+           (w3-insert-terminal-char
+            (w3-table-lookup-char t t nil nil border-char))
+           (insert "\n")))
+
+       ;; for emacspeak
+       (when (featurep 'emacspeak)
+         ;; completion of table info
+         (let ((dimensions (list num-rows num-cols
+                                 row-dimensions column-dimensions
+                                 whole-table-rowspans whole-table-colspans)))
+           (cond (inside-table-p
+                  (setcar (cddr (cdar w3-table-structure)) (- (point) 
w3-display-current-cell-offset 1))
+                  (setcdr (cddr (cddar w3-table-structure)) dimensions))
+                 (t
+                  (setcar (cdar w3-table-structure) (1- (point)))
+                  (setcdr (cddar w3-table-structure) dimensions))))
+         (setq w3-table-structure incoming-w3-table-structure))
+       )
+      (pop w3-display-open-element-stack)))))
+
+
+
+(defun w3-display-create-unique-id ()
+  (let* ((date (current-time-string))
+        (dateinfo (and date (timezone-parse-date date)))
+        (timeinfo (and date (timezone-parse-time (aref dateinfo 3)))))
+    (if (and dateinfo timeinfo)
+       (concat (aref dateinfo 0)       ; Year
+               (aref dateinfo 1)       ; Month
+               (aref dateinfo 2)       ; Day
+               (aref timeinfo 0)       ; Hour
+               (aref timeinfo 1)       ; Minute 
+               (aref timeinfo 2)       ; Second
+               )
+      "HoplesSLYCoNfUSED")))
+
+(defun w3-display-chop-into-table (node cols)
+  ;; Chop the content of 'node' up into 'cols' columns suitable for inclusion
+  ;; as the content of a table
+  (let ((content (nth 2 node))
+       (items nil)
+       (rows nil))
+    (setq cols (max cols 1))
+    (while content
+      (push (list 'td nil (list (pop content))) items)
+      (if (= (length items) cols)
+         (setq rows (cons (nreverse items) rows)
+               items nil)))
+    (if items                          ; Store any leftovers
+       (setq rows (cons (nreverse items) rows)
+             items nil))
+    (while rows
+      (push (list 'tr nil (pop rows)) items))
+    items))
+
+(defun w3-fix-color (color)
+  (if (and color
+          (string-match 
"^[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]$" color))
+      (concat "#" color)
+    color))
+
+(defun w3-display-normalize-form-info (args)
+  (let* ((plist (alist-to-plist args))
+        (type (intern (downcase
+                       (or (plist-get plist 'type) "text"))))
+        (name (plist-get plist 'name))
+        (value (or (plist-get plist 'value) ""))
+        (size (if (plist-get plist 'size)
+                  (string-to-int (plist-get plist 'size))))
+        (maxlength (if (plist-get plist 'maxlength)
+                       (string-to-int
+                        (plist-get plist 'maxlength))))
+        (default value)
+        (checked (assq 'checked args)))
+    (if (memq type '(checkbox radio)) (setq default checked))
+    (if (and (eq type 'checkbox) (string= value ""))
+       (setq value "on"))
+    (if (and (not (memq type '(submit reset button)))
+            (not name))
+       (setq name (symbol-name type)))
+    (while (and name (string-match "[\r\n]+" name))
+      (setq name (concat (substring name 0 (match-beginning 0))
+                        (substring name (match-end 0) nil))))
+    (setq plist (plist-put plist 'type type)
+         plist (plist-put plist 'name name)
+         plist (plist-put plist 'value value)
+         plist (plist-put plist 'size size)
+         plist (plist-put plist 'default default)
+         plist (plist-put plist 'internal-form-number w3-current-form-number)
+         plist (plist-put plist 'action w3-display-form-id)
+         plist (plist-put plist 'maxlength maxlength))
+    plist))
+
+(defvar w3-resurrect-images-offset nil
+  "A-list of image-alt offsets for widgets cut in tables, used in 
`w3-resurrect-images'.
+Format: (((image-alt row column) . offset) ...)")
+
+(defun w3-resurrect-images ()
+  (let ((st (point-min))
+       (inhibit-read-only t)
+       info nd node face widget)
+    (while st
+      (if (setq info (get-text-property st 'w3-hyperimage-info))
+         (progn
+           (setq nd (or (next-single-property-change st 'w3-hyperimage-info)
+                        (point-max)))
+           (let* ((raw-alt (widget-get info 'alt))
+                  (drawn-alt (if (and (stringp raw-alt) (string-match "\\([^ 
\t\n]+\\)[ \t\n]" raw-alt))
+                                 (substring raw-alt 0 (match-end 1))
+                               raw-alt))
+                  (row (widget-get info 'row))
+                  (col (widget-get info 'column))
+                  (max (point-max))
+                  (offset-elt (assoc (list drawn-alt row col) 
w3-resurrect-images-offset))
+                  (offset (if offset-elt (cdr offset-elt) 0))
+                  to-cut new-offset)
+             (delete-region st nd)
+             (goto-char st)
+             (setq widget (apply (function widget-create) info))
+             (if (not (zerop offset))
+                 ;; already started on this widget - remove beginning of 
drawn-alt
+                 (delete-region st (+ st offset)))
+             (setq to-cut (- (point-max) max)
+                   new-offset (1+ (- nd st)))
+             (cond ((not (zerop to-cut))
+                    ;; cut end of drawn-alt if too long after resurrection
+                    (delete-region nd (+ nd to-cut))
+                    (if offset-elt
+                        (setcdr offset-elt (+ offset new-offset))
+                      (setq w3-resurrect-images-offset
+                            (cons (cons (list drawn-alt row col) new-offset)
+                                  w3-resurrect-images-offset))))))
+           (widget-put widget 'buffer (current-buffer))
+           (w3-maybe-start-image-download widget)
+           (if (widget-get widget :from)
+               (add-text-properties (widget-get widget :from)
+                                    (widget-get widget :to)
+                                    (list 'html-stack 
w3-display-open-element-stack)))))
+      (setq st (next-single-property-change st 'w3-hyperimage-info)))
+    (setq w3-resurrect-images-offset nil)))
+
+(defun w3-resurrect-hyperlinks ()
+  (let ((st (point-min))
+       (inhibit-read-only t)
+       info nd node face)
+    (while st
+      (if (setq info (get-text-property st 'w3-hyperlink-info))
+         (progn
+           (setq nd (or (next-single-property-change st 'w3-hyperlink-info)
+                        (point-max)))
+           (apply 'widget-convert-text 'link st nd st nd (nconc
+                                                          (list :start st
+                                                                :end nd)
+                                                          info))))
+      (setq st (next-single-property-change st 'w3-hyperlink-info)))))
+
+(defun w3-display-convert-arglist (args)
+  (let ((rval nil)
+       (newsym nil)
+       (cur nil))
+    (while (setq cur (pop args))
+      (setq newsym (intern (concat ":" (symbol-name (car cur))))
+           rval (plist-put rval newsym (cdr cur))))
+    rval))
+
+(defun w3-display-node (node &optional nofaces)
+  (let (
+       (content-stack (list (list node)))
+       (right-margin-stack (list fill-column))
+       (left-margin-stack (list 0))
+       (inhibit-read-only t)
+       (widget-push-button-gui nil)
+       node
+       insert-before
+       insert-after
+       tag
+       args
+       content
+       hyperlink-info
+       hyperimage-info
+       break-style
+       cur
+       id
+       class
+       last-element
+       )
+    (while content-stack
+      (setq content (pop content-stack))
+      (pop w3-active-faces)
+      (pop w3-active-voices)
+      (w3-display-progress-meter)
+      (setq last-element (pop w3-display-open-element-stack))
+      (case (car last-element)
+       ;; Any weird, post-display-of-content stuff for specific tags
+       ;; goes here.   Couldn't think of any better way to do this when we
+       ;; are iterative.  *sigh*
+       (a
+        (if (not hyperlink-info)
+            nil
+          (add-text-properties (car hyperlink-info) (point)
+                               (list
+                                'duplicable t
+                                'balloon-help 'w3-balloon-help-callback
+                                'start-open t
+                                'end-open t
+                                'rear-nonsticky t
+                                'w3-hyperlink-info (cadr hyperlink-info))))
+        (setq hyperlink-info nil))
+       (img
+        (if (not hyperimage-info)
+            nil
+          (add-text-properties (car hyperimage-info) (point)
+                               (list
+                                'duplicable t
+                                'start-open t
+                                'end-open t
+                                'rear-nonsticky t
+                                'w3-hyperimage-info (cadr hyperimage-info))))
+        (setq hyperimage-info nil))
+       ((ol ul dl dir menu)
+        (pop w3-display-list-stack))
+       (label
+        (if (and (markerp w3-display-label-marker)
+                 (marker-position w3-display-label-marker)
+                 (marker-buffer w3-display-label-marker))
+            (push (cons (or (cdr-safe (assq 'for (cdr last-element)))
+                            (cdr-safe (assq 'id (cdr last-element)))
+                            "unknown")
+                        (buffer-substring w3-display-label-marker (point)))
+                  w3-form-labels)))
+       (otherwise
+        nil))
+      (if (car insert-after)
+         (w3-handle-string-content (car insert-after)))
+      (pop insert-after)
+      (w3-display-handle-end-break)
+      (w3-pop-all-face-info)
+      ;; Handle the element's content
+      (while content
+       (w3-display-progress-meter)
+       (if (stringp (car content))
+           (w3-handle-string-content (pop content))
+         (setq node (pop content)
+               tag (nth 0 node)
+               args (nth 1 node)
+               id (or (w3-get-attribute 'name)
+                      (w3-get-attribute 'id))
+               )
+         ;; This little bit of magic takes care of inline styles.
+         ;; Evil Evil Evil, but it appears to work.
+         (if (w3-get-attribute 'style)
+             (let ((unique-id (or (w3-get-attribute 'id)
+                                  (w3-display-create-unique-id)))
+                   (sheet "")
+                   (class (assq 'class args)))
+               (setq sheet (format "%s.%s { %s }\n" tag unique-id
+                                   (w3-get-attribute 'style)))
+               (if class
+                   (setcdr class (cons unique-id (cdr class)))
+                 (setf (nth 1 node) (cons (cons 'class (list unique-id))
+                                          (nth 1 node))))
+               (setf (nth 1 node) (cons (cons 'id unique-id) (nth 1 node)))
+               (w3-handle-style (list 'data sheet
+                                      'notation "text/css"))))
+         (setq w3-display-css-properties (css-get
+                                          (nth 0 node)
+                                          (nth 1 node)
+                                          w3-current-stylesheet
+                                          w3-display-open-element-stack))
+         (push (w3-get-style-info 'display node) break-style)
+         (push (w3-get-style-info 'insert-after node) insert-after)
+         (setq insert-before (w3-get-style-info 'insert-before node))
+         (w3-display-handle-break)
+         (if (w3-node-visible-p)
+             nil
+           (setq insert-before nil
+                 tag '*invisible)
+           (setcar insert-after nil))
+         (if insert-before
+             (w3-handle-string-content insert-before))
+         (if nofaces
+             nil
+           (push (w3-face-for-element node) w3-active-faces)
+           (push (w3-voice-for-element node) w3-active-voices))
+         (setq insert-before nil)
+         (if id
+             (setq w3-id-positions (cons
+                                    (cons (intern id)
+                                          (set-marker (make-marker)
+                                                      (point-max)))
+                                    w3-id-positions)))
+         (case tag
+           (a                          ; Hyperlinks
+            (let* (
+                   (title (w3-get-attribute 'title))
+                   (name (or (w3-get-attribute 'id)
+                             (w3-get-attribute 'name)))
+                   (btdt nil)
+                   class
+                   (before nil)
+                   (after nil)
+                   (face nil)
+                   (voice nil)
+                   (st nil)
+                   (old-props w3-display-css-properties)
+                   (active-face nil)
+                   (visited-face nil)
+                   (munged (copy-tree args)))
+              (if (assq 'class munged)
+                  (push ":active" (cdr (assq 'class munged)))
+                (setq munged (cons (cons 'class '(":active")) munged)))
+              (setq w3-display-css-properties (css-get
+                                               tag
+                                               munged
+                                               w3-current-stylesheet
+                                               w3-display-open-element-stack))
+              (setq active-face (w3-face-for-element (list tag munged nil)))
+              (w3-pop-all-face-info)
+              (setq munged (copy-tree args))
+              (if (assq 'class munged)
+                  (push ":visited" (cdr (assq 'class munged)))
+                (setq munged (cons (cons 'class '(":visited")) munged)))
+              (setq w3-display-css-properties (css-get
+                                               tag
+                                               munged
+                                               w3-current-stylesheet
+                                               w3-display-open-element-stack))
+              (setq visited-face (w3-face-for-element (list tag munged nil)))
+              (w3-pop-all-face-info)
+              (setq w3-display-css-properties old-props)
+              (if (w3-get-attribute 'href)
+                  (setq st (point)
+                        hyperlink-info (list
+                                        st
+                                        (append
+                                         (list :args nil
+                                               :value "" :tag ""
+                                               :action 'w3-follow-hyperlink
+                                               :button-face '(nil)
+                                               :active-face active-face
+                                               :visited-face visited-face
+                                               :from (set-marker
+                                                      (make-marker) st)
+                                               :help-echo 'w3-widget-echo
+                                               :emacspeak-help 'w3-widget-echo
+                                               )
+                                         (w3-display-convert-arglist args)))))
+              (w3-handle-content node)
+              )
+            )
+           ((ol ul dl menu)
+            (push (if (w3-get-attribute 'seqnum)
+                      (1- (string-to-int (w3-get-attribute 'seqnum)))
+                    0) w3-display-list-stack)
+            (w3-handle-content node))
+           (dir
+            (push 0 w3-display-list-stack)
+            (setq node
+                  (list tag args
+                        (list
+                         (list 'table nil
+                               (w3-display-chop-into-table node 3)))))
+            (w3-handle-content node))
+           (multicol
+            (setq node (list tag args
+                             (list
+                              (list 'table nil
+                                    (w3-display-chop-into-table node 2)))))
+            (w3-handle-content node))
+           (img                        ; inlined image
+            (w3-handle-image)
+            (w3-handle-empty-tag))
+           (frameset
+            (if w3-display-frames
+                (let ((frames (nth 2 node))
+                      (frameset-cardinal 0)
+                      (cols (cdr-safe (assq 'cols args))))
+                  (while (and frames (memq (car (car frames)) '(frame 
frameset)))
+                     (setq frameset-cardinal (1+ frameset-cardinal)
+                           frames (cdr frames)))
+                  (push (list 'frameset
+                              frameset-cardinal
+                              (if (w3-frameset-dimensions-p cols)
+                                  (assq 'cols args)
+                                (assq 'rows args)))
+                        w3-frameset-structure)
+                  (w3-handle-content node))
+              (w3-handle-content node)))
+           (frame
+            (if w3-display-frames
+                (let* ((href (or (w3-get-attribute 'src)
+                                 (w3-get-attribute 'href)))
+                       (name (or (w3-get-attribute 'name)
+                                 (w3-get-attribute 'title)
+                                 (w3-get-attribute 'alt)
+                                 "Unknown frame name")))
+                  (push (list 'frame name href) w3-frameset-structure)
+                  (w3-handle-content
+                   (list tag args
+                         (list
+                          (list 'p nil
+                                (list
+                                 (list 'a
+                                       (cons (cons 'href href)
+                                             args)
+                                       (list "Fetch frame: " name))))))))
+              (w3-handle-empty-tag)))
+           (noframes
+            (if w3-display-frames
+                (w3-handle-empty-tag)
+              (w3-handle-content node)))
+           (applet                     ; Wow, Java
+            (w3-handle-content node)
+            )
+           (script                     ; Scripts
+            (w3-handle-empty-tag))
+           ((embed object)             ; Embedded images/content
+            (w3-handle-content node)
+            )
+           (hr                         ; Cause line break & insert rule
+            (let* ((perc (or (w3-get-attribute 'width)
+                             (w3-get-style-info 'width node)
+                             "100%"))
+                   (width nil))
+              (if (stringp perc)
+                  (setq perc (/ (min (string-to-int perc) 100) 100.0)
+                        width (truncate (* fill-column perc)))
+                (setq width perc))
+              (w3-insert-terminal-char (w3-horizontal-rule-char) width)
+              (w3-handle-empty-tag)))
+           (map                        ; Client side imagemaps
+            (let ((name (or (w3-get-attribute 'name)
+                            (w3-get-attribute 'id)
+                            "unnamed"))
+                  (areas
+                   (mapcar
+                    (function
+                     (lambda (node)
+                       (let* ((args (nth 1 node))
+                              (type (downcase (or
+                                               (w3-get-attribute 'shape)
+                                               "rect")))
+                              (coords (w3-decode-area-coords
+                                       (or (cdr-safe
+                                            (assq 'coords args)) "")))
+                              (alt (w3-get-attribute 'alt))
+                              (href (if (assq 'nohref args)
+                                        t
+                                      (or (w3-get-attribute 'src)
+                                          (w3-get-attribute 'href))))
+                              )
+                         (vector type coords href alt))
+                       )
+                     )
+                    (nth 2 node))))
+              (setq w3-imagemaps (cons (cons name areas) w3-imagemaps)))
+            (w3-handle-empty-tag)
+            )
+           (note
+            ;; Ewwwwhhh.  Looks gross, but it works.  This converts a
+            ;; <note> into a two-cell table, so that things look all
+            ;; pretty.
+            (setq node
+                  (list 'note nil
+                        (list
+                         (list 'table nil
+                               (list
+                                (list 'tr nil
+                                      (list
+                                       (list 'td (list 'align 'right)
+                                             (list
+                                              (concat
+                                               (or (w3-get-attribute 'role)
+                                                   "CAUTION") ":")))
+                                       (list 'td nil
+                                             (nth 2 node)))))))))
+            (w3-handle-content node)
+            )
+           (table
+            (w3-display-table node)
+            (setq w3-last-fill-pos (point))
+            (w3-handle-empty-tag)
+            )
+           (isindex
+            (let ((prompt (or (w3-get-attribute 'prompt)
+                              "Search on (+ separates keywords): "))
+                  action node)
+              (setq action (or (w3-get-attribute 'src)
+                               (w3-get-attribute 'href)
+                               (url-view-url t)))
+              (if (and prompt (string-match "[^: \t-]+$" prompt))
+                  (setq prompt (concat prompt ": ")))
+              (setq node
+                    (list 'isindex nil
+                          (list
+                           (list 'hr nil nil)
+                           (list 'form
+                                 (list (cons 'action action)
+                                       (cons 'enctype
+                                             "application/x-w3-isindex")
+                                       (cons 'method "get"))
+                                 (list
+                                  prompt
+                                  (list 'input
+                                        (list (cons 'type "text")
+                                              (cons 'name "isindex"))))))))
+              (w3-handle-content node)
+              (setq w3-current-isindex (cons action prompt)))
+            )
+           ((html body)
+            (let ((fore (car (delq nil (copy-list w3-face-color))))
+                  (back (car (delq nil (copy-list w3-face-background-color))))
+                  (pixm (car (delq nil (copy-list w3-face-background-image))))
+                  (alink (w3-get-attribute 'alink))
+                  (vlink (w3-get-attribute 'vlink))
+                  (link  (w3-get-attribute 'link))
+                  (sheet "")
+                  )
+              (if link
+                  (setq sheet (format "%sa:link { color: %s }\n" sheet
+                                      (w3-fix-color link))))
+              (if vlink
+                  (setq sheet (format "%sa:visited { color: %s }\n" sheet
+                                      (w3-fix-color vlink))))
+              (if alink
+                  (setq sheet (format "%sa:active { color: %s }\n" sheet
+                                      (w3-fix-color alink))))
+              (if w3-user-colors-take-precedence
+                  nil
+                (if (/= (length sheet) 0)
+                    (w3-handle-style (list 'data sheet
+                                           'notation "text/css")))
+                (if (and (w3-get-attribute 'background)
+                         (not pixm))
+                    (progn
+                      (setq pixm (w3-get-attribute 'background))
+                      (setf (car w3-face-background-image) pixm)))
+                (if (and (w3-get-attribute 'text) (not fore))
+                    (progn
+                      (setq fore (w3-fix-color (w3-get-attribute 'text)))
+                      (setf (car w3-face-color) fore)))
+                (if (not font-running-xemacs)
+                    (setq w3-display-background-properties (cons fore back))
+                  (if pixm
+                      (w3-maybe-start-background-image-download pixm 'default))
+                  (if fore
+                      (font-set-face-foreground 'default fore 
(current-buffer)))
+                  (if back
+                      (font-set-face-background 'default back 
(current-buffer)))))
+              (w3-handle-content node)))
+           (*document
+            (let ((info (mapcar (lambda (x) (cons x (and (boundp x) 
(symbol-value x))))
+                                w3-persistent-variables)))
+              (if (not w3-display-same-buffer)
+                  (set-buffer (generate-new-buffer "Untitled")))
+              (setq w3-current-form-number 0
+                    w3-display-open-element-stack nil
+                    w3-last-fill-pos (point-min))
+              (setcar right-margin-stack
+                      (min (- (or w3-strict-width (window-width))
+                              w3-right-margin)
+                           (or w3-maximum-line-length
+                               (window-width))))
+              (condition-case nil
+                  (switch-to-buffer (current-buffer))
+                (error (message  "W3 buffer %s is being drawn." (buffer-name 
(current-buffer)))))
+
+              (buffer-disable-undo (current-buffer))
+              (mapcar (function (lambda (x)
+                                  (if (boundp (car x))
+                                      (set (car x) (cdr x))))) info)
+              ;; ACK!  We don't like filladapt mode!
+              (set (make-local-variable 'filladapt-mode) nil)
+              (set (make-local-variable 'adaptive-fill-mode) nil)
+              (set (make-local-variable 'voice-lock-mode) t)
+              (set (make-local-variable 'cur-viewing-pos) (point-min))
+              (setq w3-current-stylesheet (css-copy-stylesheet
+                                           w3-user-stylesheet)
+                    w3-last-fill-pos (point)
+                    fill-prefix "")
+              )
+            (w3-handle-content node)
+            )
+           (*invisible
+            (w3-handle-empty-tag))
+           (meta
+            (let* ((equiv (cdr-safe (assq 'http-equiv args)))
+                   (value (w3-get-attribute 'content))
+                   (name  (w3-get-attribute 'name))
+                   (node  (and equiv (assoc (setq equiv (downcase equiv))
+                                            url-current-mime-headers))))
+              (if equiv
+                  (setq url-current-mime-headers (cons
+                                                  (cons equiv value)
+                                                  url-current-mime-headers)))
+              (if name
+                  (setq w3-current-metainfo (cons
+                                             (cons name value)
+                                             w3-current-metainfo)))
+
+              ;; Special-case the Set-Cookie header
+              (if (and equiv (string= (downcase equiv) "set-cookie"))
+                  (url-cookie-handle-set-cookie value))
+              ;; Special-case the refresh header
+              (if (and equiv (string= (downcase equiv) "refresh"))
+                  (url-handle-refresh-header value)))
+            (w3-handle-empty-tag)
+            )
+           (link
+            ;; This doesn't handle blank-separated values per the RFC.
+            (w3-parse-link args)
+            (w3-handle-empty-tag))
+           (title
+            (let ((potential-title "")
+                  (content (nth 2 node)))
+              (while content
+                (setq potential-title (concat potential-title (car content))
+                      content (cdr content)))
+              (setq potential-title (w3-normalize-spaces potential-title))
+              (if (or w3-display-same-buffer
+                      (string-match "^[ \t]*$" potential-title))
+                  nil
+                (rename-buffer (generate-new-buffer-name
+                                (w3-fix-spaces potential-title)))))
+            (w3-handle-empty-tag))
+           (base
+            (setq w3-base-target (cdr-safe (assq 'target args)))
+            (w3-handle-content node))
+           (form
+            (setq w3-current-form-number (1+ w3-current-form-number))
+            (let* (
+                   (action (w3-get-attribute 'action))
+                   (url nil))
+              (if (not action)
+                  (setq args (cons (cons 'action (url-view-url t)) args)))
+              (setq w3-display-form-id (cons
+                                        (cons 'form-number
+                                              w3-current-form-number)
+                                        args))
+              (w3-handle-content node)))
+           (keygen
+            (w3-form-add-element 
+             (w3-display-normalize-form-info 
+              (cons '(type . "keygen")
+                    args))
+             w3-active-faces)
+            (w3-handle-empty-tag))
+           (input
+            (w3-form-add-element
+             (w3-display-normalize-form-info args)
+             w3-active-faces)
+            (w3-handle-empty-tag)
+            )
+           (select
+            (let* ((plist (w3-display-normalize-form-info args))
+                   (tmp nil)
+                   (multiple (assq 'multiple args))
+                   (value nil)
+                   (name (plist-get plist 'name))
+                   (options (mapcar
+                             (function
+                              (lambda (n)
+                                (setq tmp (w3-normalize-spaces
+                                           (apply 'concat (nth 2 n)))
+                                      tmp (vector tmp
+                                                  (or
+                                                   (cdr-safe
+                                                    (assq 'value (nth 1 n)))
+                                                   tmp)
+                                                  (assq 'selected (nth 1 n))))
+                                (if (assq 'selected (nth 1 n))
+                                    (setq value (aref tmp 0)))
+                                tmp))
+                             (nth 2 node))))
+              (if (not value)
+                  (setq value (and options (aref (car options) 0))))
+              (setq plist (plist-put plist 'value value))
+              (if multiple
+                  (progn
+                    (setq options
+                          (mapcar
+                           (function
+                            (lambda (opt)
+                              (list 'div nil
+                                    (list
+                                     (list 'input
+                                           (list (cons 'name name)
+                                                 (cons 'type "checkbox")
+                                                 (cons (if (aref opt 2)
+                                                           'checked
+                                                         '__bogus__) "yes")
+                                                 (cons 'value (aref opt 1))))
+                                     " " (aref opt 0) (list 'br nil nil)))))
+                           options))
+                    (setq node (list 'p nil options))
+                    (w3-handle-content node))
+                (setq options (mapcar (function
+                                       (lambda (x)
+                                         (cons (aref x 0) (aref x 1))))
+                                      options))
+                (setq plist (plist-put plist 'type 'option)
+                      plist (plist-put plist 'options options))
+                (w3-form-add-element plist w3-active-faces)
+                ;; This should really not be necessary, but some versions
+                ;; of the widget library leave point _BEFORE_ the menu
+                ;; widget instead of after.
+                (goto-char (point-max))
+                (w3-handle-empty-tag))))
+           (textarea
+            (let* ((plist (w3-display-normalize-form-info args))
+                   (value (apply 'concat (nth 2 node))))
+              (setq plist (plist-put plist 'type 'multiline)
+                    plist (plist-put plist 'value value))
+              (w3-form-add-element plist w3-active-faces))
+            (w3-handle-empty-tag)
+            )
+           (style
+            (w3-handle-style (alist-to-plist
+                              (cons (cons 'data (apply 'concat (nth 2 node)))
+                                    (nth 1 node))))
+            (w3-handle-empty-tag))
+           (label
+            (if (not (markerp w3-display-label-marker))
+                (setq w3-display-label-marker (make-marker)))
+            (set-marker w3-display-label-marker (point))
+            (w3-handle-content node))
+           ;; Emacs-W3 stuff that cannot be expressed in a stylesheet
+           (pinhead
+            ;; This check is so that we don't screw up table auto-layout
+            ;; by changing our text midway through the parse/layout/display
+            ;; steps.
+            (if (nth 2 node)
+                nil
+              (setcar (cddr node)
+                      (list
+                       (if (fboundp 'yow)
+                           (yow)
+                         "AIEEEEE!  I am having an UNDULATING EXPERIENCE!"))))
+            (w3-handle-content node))
+           (flame
+            (if (nth 2 node)
+                nil
+              (setcar
+               (cddr node)
+               (list
+                (condition-case ()
+                    (concat
+                     (sentence-ify
+                      (string-ify
+                       (append-suffixes-hack (flatten (*flame))))))
+                  (error
+                   "You know, everything is really a graphics editor.")))))
+            (w3-handle-content node))
+           (cookie
+            (if (nth 2 node)
+                nil
+              (setcar
+               (cddr node)
+               (list
+                (w3-display-get-cookie args))))
+            (w3-handle-content node))
+           ;; Generic formatting - all things that can be fully specified
+           ;; by a CSS stylesheet.
+           (otherwise
+            (w3-handle-content node))
+           )                           ; case tag
+         )                             ; stringp content
+       )                               ; while content
+      )                                        ; while content-stack
+    )
+  )
+
+(defun w3-draw-tree (tree)
+  ;; The main entry point - wow complicated
+  (setq w3-current-stylesheet w3-user-stylesheet)
+  (while tree
+    (w3-display-node (car tree))
+    (setq tree (cdr tree)))
+  (w3-display-fix-widgets)
+  (let ((inhibit-read-only t))
+    (w3-resurrect-images)
+    (w3-resurrect-hyperlinks)
+    (w3-form-resurrect-widgets)))
+
+(defun time-display (&optional tree)
+  ;; Return the # of seconds it took to draw 'tree'
+  (let ((st (nth 1 (current-time)))
+       (nd nil))
+    (w3-draw-tree (or tree w3-last-parse-tree))
+    (setq nd (nth 1 (current-time)))
+    (- nd st)))
+
+
+(defun w3-fixup-eol-faces ()
+  ;; Remove 'face property at end of lines - underlining screws up stuff
+  ;; also remove 'mouse-face property at the beginning and end of lines 
+  (let ((inhibit-read-only t))
+    (save-excursion
+      (goto-char (point-min))
+      (while (re-search-forward "[ \t]*\n[ \t]*" nil t)
+       (remove-text-properties (match-beginning 0) (match-end 0)
+                               '(face nil mouse-face nil) nil)))))
+
+(defsubst w3-finish-drawing ()
+  (let (url glyph widget)
+    (while w3-image-widgets-waiting
+      (setq widget (car w3-image-widgets-waiting)
+           w3-image-widgets-waiting (cdr w3-image-widgets-waiting)
+           url (widget-get widget :src)
+           glyph (cdr-safe (assoc url w3-graphics-list)))
+      (condition-case nil
+         (widget-value-set widget glyph)
+       (error nil))))
+  (if (and url-current-object (url-target url-current-object))
+      (progn
+       (push-mark (point) t)
+       (w3-find-specific-link (url-target url-current-object)))
+    (goto-char (point-min)))
+  (and (not w3-running-xemacs)
+       (not (eq (device-type) 'tty))
+       (w3-fixup-eol-faces))
+  (message "Drawing... done"))
+
+;;;###autoload
+(defun w3-region (st nd)
+  (if (not w3-setup-done) (w3-do-setup))
+  (let* ((source (buffer-substring st nd))
+        (w3-display-same-buffer t)
+        (parse nil))
+    (save-window-excursion
+      (save-excursion
+       (set-buffer (get-buffer-create " *w3-region*"))
+       (erase-buffer)
+       (insert source)
+       (setq parse (w3-parse-buffer (current-buffer))))
+      (narrow-to-region st nd)
+      (delete-region (point-min) (point-max))
+      (w3-draw-tree parse)
+      (w3-finish-drawing)
+      (widen))))
+
+(defun w3-refresh-buffer ()
+  (interactive)
+  (let ((parse w3-current-parse)
+       (inhibit-read-only t)
+       (w3-display-same-buffer t)
+       (origin (point)))
+    (if (not parse)
+       (error "Could not find the parse tree for this buffer.  EEEEK!"))
+    (erase-buffer)
+    (w3-draw-tree parse)
+    (w3-finish-drawing)
+    (w3-mode)
+    (set-buffer-modified-p nil)
+    (goto-char (min origin (point-max)))))
+
+(defun w3-prepare-buffer (&rest args)
+  ;; The text/html viewer - does all the drawing and displaying of the buffer
+  ;; that is necessary to go from raw HTML to a good presentation.
+  (let* ((source (buffer-string))
+        (source-buf (current-buffer))
+        (parse (w3-parse-buffer source-buf)))
+    (set-buffer-modified-p nil)
+    (w3-draw-tree parse)
+    (kill-buffer source-buf)
+    (set-buffer-modified-p nil)
+    (setq w3-current-source source
+         w3-current-parse parse)
+    (w3-finish-drawing)
+    (w3-mode)
+    (set-buffer-modified-p nil)
+    (if url-keep-history
+       (let ((url (url-view-url t)))
+         (if (not url-history-list)
+             (setq url-history-list (make-hash-table :size 131 :test 'equal)))
+         (cl-puthash url (buffer-name) url-history-list)
+         (if (fboundp 'w3-shuffle-history-menu)
+             (w3-shuffle-history-menu)))))
+  (w3-maybe-fetch-frames))
+
+(defun w3-maybe-fetch-frames ()
+  (if w3-frameset-structure
+      (cond ((or (eq w3-display-frames t)
+                (and (eq w3-display-frames 'ask)
+                     (y-or-n-p "Fetch frames? ")))
+            (w3-frames)
+            t))))
+
+(defun w3-frames (&optional new-frame)
+  "Set up and fetch W3 frames. With optional prefix, do so in a new frame."
+  (interactive "P")
+  (if (not w3-display-frames)
+      (let ((w3-display-frames t))
+       (w3-refresh-buffer)))
+  (let* ((old-asynch (default-value 'url-be-asynchronous))
+        (structure (reverse w3-frameset-structure)))
+    (if new-frame
+       (select-frame (make-frame)))
+    (unwind-protect
+       (progn
+         (setq-default url-be-asynchronous nil)
+         ;; set up frames
+         (while structure
+           (if (eq (car (car structure)) 'frameset)
+               (setq structure (w3-display-frameset structure))
+             (pop structure)))
+         ;; compute target window distances
+         (let ((origin-buffer (current-buffer))
+               (stop nil))
+           (while (not stop)
+             (or w3-target-window-distances
+                 (setq w3-target-window-distances
+                       (w3-compute-target-window-distances)))
+             (other-window 1)
+             (if (eq (current-buffer) origin-buffer)
+                 (setq stop t)))))
+      (setq-default url-be-asynchronous old-asynch))))
+
+(defun w3-frameset-dimensions-p (str)
+  (and str (not (string-equal str "*")) (not (string-equal str "100%"))))
+
+(defun w3-display-frameset (frameset-structure)
+  (let* ((structure frameset-structure)
+        (frameset-cardinal (nth 1 (car structure)))
+        (current-dims (cdr (cdr (car structure))))
+        (cols (cdr-safe (assq 'cols current-dims)))
+        (rows (cdr-safe (assq 'rows current-dims)))
+        (char-width (if (> (frame-char-width) 1)
+                         (frame-char-width)
+                       w3-tty-char-width))
+        (char-height (if (> (frame-char-height) 1)
+                         (frame-char-height)
+                       w3-tty-char-height)))
+    (pop structure)
+    ;; columns ?
+    (if (w3-frameset-dimensions-p cols)
+       (setq cols (w3-decode-frameset-dimensions
+                   cols (window-width) window-min-width char-width))
+      ;; rows ?
+      (if (w3-frameset-dimensions-p rows)
+         (setq rows (w3-decode-frameset-dimensions
+                     rows (window-height) window-min-height char-height))
+       ;; default: columns of equal width
+       (let ((fwidth (/ (window-width) frameset-cardinal)))
+         (while (> frameset-cardinal 0)
+           (push fwidth cols)
+           (setq frameset-cardinal (1- frameset-cardinal))))))
+    (while (> frameset-cardinal 0)
+      (cond ((cdr cols)
+            (split-window-horizontally (car cols))
+            (pop cols))
+           ((cdr rows)
+            (split-window-vertically (car rows))
+            (pop rows)))
+      (cond ((eq (car (car structure)) 'frame)
+            (let ((href (nth 2 (car structure)))
+                  (name (nth 1 (car structure)))
+                  (url-working-buffer url-default-working-buffer) ; in case 
url-multiple-p is t
+                  (w3-notify 'semibully))
+              (pop structure)
+              (w3-fetch href)
+              (let ((buf (current-buffer)))
+                (set-buffer (url-buffer-visiting href))
+                (setq w3-frame-name name
+                      w3-target-window-distances nil)
+                (set-buffer buf))
+              (other-window 1)))
+           ((eq (car (car structure)) 'frameset)
+            (setq structure (w3-display-frameset structure))))
+      (setq frameset-cardinal (1- frameset-cardinal)))
+    structure))
+
+(defun w3-compute-target-window-distances ()
+  "Compute an alist of target names and window distances"
+  (let ((origin-buffer (current-buffer))
+       (distance 0)
+       (stop nil)
+       (window-distances nil))
+    (while (not stop)
+      (if w3-frame-name
+         (push (cons (intern (downcase w3-frame-name)) distance)
+               window-distances))
+      (other-window 1)
+      (setq distance (1+ distance))
+      (if (eq (current-buffer) origin-buffer)
+         (setq stop t)))
+    window-distances))
+
+(defun w3-decode-frameset-dimensions (dims available-dimension min-dim 
pixel-dim)
+  "Returns numbers of lines or columns in Emacs, computed from specified 
frameset dimensions"
+  (let ((dimensions nil))
+    (if dims
+       (let ((nb-stars 0)
+             (norm-stars 0)
+             (remaining-available-dimension available-dimension))
+         (while (string-match "\\([0-9]*\\*\\|[0-9]+%?\\)" dims)
+           (let ((match (substring dims (match-beginning 1) (match-end 1))))
+             (setq dims (substring dims (match-end 1)))
+             (cond ((string-match "\\([0-9]+\\)\\*" match)
+                    ;; divide rest with relative weights
+                    (let ((weight (car (read-from-string
+                                        (substring match (match-beginning 1) 
(match-end 1))))))
+                    (push (cons '* weight) dimensions)
+                    (setq nb-stars (1+ nb-stars)
+                          norm-stars (+ norm-stars weight))))
+                   ((string-match "\\*" match)
+                    ;; divide equally
+                    (push '* dimensions)
+                    (setq nb-stars (1+ nb-stars)
+                          norm-stars (1+ norm-stars)))
+                   (t
+                    (cond ((string-match "\\([0-9]+\\)%" match)
+                           ;; percentage of available height
+                           (push (/ (* (car (read-from-string (substring match 
0 -1)))
+                                       available-dimension)
+                                    100)
+                                 dimensions))
+                          (t
+                           ;; absolute number: pixel height
+                           (push (max (1+ (/ (car (read-from-string match))
+                                             pixel-dim))
+                                      min-dim)
+                                 dimensions)))
+                    (setq remaining-available-dimension
+                          (- remaining-available-dimension (car 
dimensions)))))))
+         (if (zerop nb-stars)
+             ;; push => reverse order
+             (reverse dimensions)
+           ;; substitute numbers for *
+           (let ((star-replacement (/ remaining-available-dimension 
norm-stars))
+                 (star-dimensions dimensions))
+             (setq dimensions nil)
+             (while star-dimensions
+               (push (cond ((eq '* (car star-dimensions))
+                            star-replacement)
+                           ((listp (car star-dimensions))
+                            (* (cdar star-dimensions) star-replacement))
+                           (t
+                            (car star-dimensions)))
+                     dimensions)
+               (pop star-dimensions))
+             ;; push + push => in order
+             dimensions))))))
+
+(provide 'w3-display)
diff --git a/lisp/w3-e19.el b/lisp/w3-e19.el
new file mode 100644
index 0000000..3634d19
--- /dev/null
+++ b/lisp/w3-e19.el
@@ -0,0 +1,102 @@
+;;; w3-e19.el --- Emacs 19.xx specific functions for emacs-w3
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:10 $
+;; Version: $Revision: 1.1 $
+;; Keywords: faces, help, mouse, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Enhancements For Emacs 19
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(eval-when-compile
+  (require 'w3-props))
+(require 'w3-forms)
+(require 'font)
+(require 'w3-script)
+
+(defvar w3-e19-window-width nil)
+(make-variable-buffer-local 'w3-e19-window-width)
+
+(defun w3-setup-version-specifics ()
+  ;; Set up routine for emacs 19
+  )
+
+(defun w3-store-in-clipboard (str)
+  "Store string STR in the system clipboard"
+  (cond
+   ((and (boundp 'interprogram-cut-function) interprogram-cut-function)
+    (funcall interprogram-cut-function str t))
+   (t
+    (case (device-type)
+      (x (x-select-text str))
+      (pm (pm-put-clipboard str))
+      (ns (ns-store-pasteboard-internal str))
+      (otherwise nil)))))
+
+(defun w3-mode-version-specifics ()
+  ;; Emacs 19 specific stuff for w3-mode
+  (declare (special w3-face-index w3-display-background-properties))
+  (make-local-variable 'track-mouse)
+  (setq w3-e19-window-width (window-width))
+  (if w3-track-mouse (setq track-mouse t))
+  (if w3-display-background-properties
+      (let ((face (w3-make-face (intern
+                                (format "w3-style-face-%05d" w3-face-index))
+                               "An Emacs-W3 face... don't edit by hand." t))
+           (fore (car w3-display-background-properties))
+           (inhibit-read-only t)
+           (back (cdr w3-display-background-properties)))
+       (setq w3-face-index (1+ w3-face-index))
+       (if fore (font-set-face-foreground face fore))
+       (if back (font-set-face-background face back))
+       (fillin-text-property (point-min) (point-max) 'face 'face face))))
+
+(defun w3-mouse-handler (e)
+  "Function to message the url under the mouse cursor"
+  (interactive "e")
+  (let* ((pt (posn-point (event-start e)))
+        (good (eq (posn-window (event-start e)) (selected-window)))
+        (mouse-events nil))
+    (if (not (and good pt (number-or-marker-p pt)))
+       nil
+      (widget-echo-help pt)
+      ;; FIXME!!! Need to handle onmouseover, on mouseout
+      (setq mouse-events (w3-script-find-event-handlers pt 'mouse))
+      (if (assq 'onmouseover mouse-events)
+         (w3-script-evaluate-form (cdr (assq 'onmouseover mouse-events)))))))
+
+(defun w3-window-size-change-function (frame)
+  (let ((first (frame-first-window frame))
+       (cur nil))
+    (while (not (eq cur first))
+      (setq cur (if cur (next-window cur nil frame) first))
+      (save-excursion
+       (set-buffer (window-buffer cur))
+       (if (and (eq major-mode 'w3-mode)
+                (not (eq (window-width cur) w3-e19-window-width)))
+           (w3-refresh-buffer))))))
+
+
+(provide 'w3-emacs19)
+(provide 'w3-e19)
diff --git a/lisp/w3-e20.el b/lisp/w3-e20.el
new file mode 100644
index 0000000..5ad8443
--- /dev/null
+++ b/lisp/w3-e20.el
@@ -0,0 +1,29 @@
+;;; w3-e19.el --- Emacs 20.xx specific functions for emacs-w3
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:10 $
+;; Version: $Revision: 1.1 $
+;; Keywords: faces, help, mouse, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1997, 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'w3-e19)
+(provide 'w3-e20)
diff --git a/lisp/w3-elisp.el b/lisp/w3-elisp.el
new file mode 100644
index 0000000..c860a83
--- /dev/null
+++ b/lisp/w3-elisp.el
@@ -0,0 +1,127 @@
+;;; w3-elisp.el --- Scripting support for emacs-lisp
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:10 $
+;; Version: $Revision: 1.1 $
+;; Keywords: hypermedia, scripting
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1997, 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'cl)
+
+(mapcar
+ (function
+  (lambda (x)
+    (put x 'w3-safe t)))
+ '(;; Any safe functions for untrusted scripts should go here.
+   ;; Basic stuff
+   message
+   format garbage-collect progn prog1 prog2 progn-with-message
+   while current-time current-time-string
+   plist-member plist-to-alist plist-get
+   assoc memq member function lambda point
+
+   ;; Device querying
+   device-pixel-height device-type device-color-cells
+   device-mm-height device-class device-bitplanes
+   device-on-window-system-p device-pixel-width
+   device-mm-width device-baud-rate
+
+   ;; Frame querying
+   frame-type frame-name frame-device frame-parameters
+   frame-height frame-pixel-width frame-pixel-height
+   frame-width frame-property
+
+   ;; Window querying
+   window-frame window-height window-width
+   window-pixel-width window-pixel-height
+
+   ;; Buffer querying
+   buffer-name buffer-substring buffer-substring-no-properties
+   buffer-size buffer-string
+   
+   ;; Text properties, read-only
+   get-text-property text-properties-at text-property-bounds
+   text-property-not-all
+
+   ;; URL loading stuff
+   url-insert-file-contents url-view-url
+
+   ;; Interfacing to W3
+   w3-fetch w3-refresh-buffer w3-view-this-url
+
+   ;; All the XEmacs event manipulation functions
+   event-live-p event-glyph-extent event-glyph-y-pixel event-x-pixel
+   event-type event-glyph event-button event-over-text-area-p
+   event-glyph-x-pixel event-buffer event-device event-properties
+   event-process event-timestamp event-modifier-bits event-console
+   event-window-y-pixel event-window event-window-x-pixel event-point
+   event-function event-over-toolbar-p event-matches-key-specifier-p
+   event-over-glyph-p event-frame event-x event-channel event-y
+   event-screen event-to-character event-over-border-p
+   event-toolbar-button event-closest-point event-object event-key
+   event-modifiers event-y-pixel event-over-modeline-p
+   event-modeline-position
+   )
+ )
+
+(defsubst w3-elisp-safe-function (func args)
+  (let ((validator (get func 'w3-safe)))
+    (cond
+     ((eq t validator) t)              ; Explicit allow
+     ((eq nil validator) nil)          ; Explicit deny
+     ((fboundp validator)              ; Function to call
+      (funcall validator func args))
+     ((boundp validator)               ; Variable to check
+      (symbol-value validator))
+     (t nil))))                                ; Fallback to unsafe
+
+(defun w3-elisp-safe-expression (exp)
+  "Return t if-and-only-if EXP is safe to evaluate."
+  (cond
+   ((and (listp exp) (not (listp (cdr exp)))) ; A cons cell
+    t)
+   ((or                                        ; self-quoters
+     (vectorp exp)
+     (numberp exp)
+     (symbolp exp)
+     (stringp exp)
+     (keymapp exp))
+    t)
+   ((listp exp)                                ; Function call - check 
arguments
+    (if (w3-elisp-safe-function (car exp) (cdr exp))
+       (let ((args (cdr exp))
+             (rval t))
+         (while args
+           (if (not (w3-elisp-safe-expression (pop args)))
+               (setq args nil
+                     rval nil)))
+         rval)))
+   ;; How to handle the insane # of native types?
+   (t nil)))
+
+(defun w3-elisp-safe-eval (form)
+  (if (w3-elisp-safe-expression form)
+      (condition-case ()
+         (eval form)
+       (error nil))))
+
+(provide 'w3-elisp)
diff --git a/lisp/w3-emulate.el b/lisp/w3-emulate.el
new file mode 100644
index 0000000..1b78b4c
--- /dev/null
+++ b/lisp/w3-emulate.el
@@ -0,0 +1,271 @@
+;;; w3-emulate.el --- All variable definitions for emacs-w3
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:10 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, help, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Provide emulations of various other web browsers
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'w3-vars)
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; First, we emulate Netscape 2.x
+;; ------------------------------
+;; This entails mainly a few new keybindings.
+;; Alt-S    == Save As
+;; Alt-M    == New Mail Message
+;; Alt-N    == New Window
+;; Alt-L    == Open Location
+;; Alt-O    == Open File
+;; Alt-P    == Print
+;; Alt-Q    == Quit
+;; Alt-F    == Search
+;; Alt-G    == Search Again
+;; Alt-R    == Reload
+;; Alt-I    == Load Images
+;; Alt-A    == Add Bookmark
+;; Alt-B    == Show Bookmark Window
+;; Alt-H    == Show History Window
+;; Alt-Left == Back
+;; Alt-Right== Forward
+;; Right    == Scroll left
+;; Left     == Scroll right
+;; Up       == Smooth scroll up
+;; Down     == Smooth scroll down
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(define-key w3-netscape-emulation-minor-mode-map "\M-s" 'w3-save-as)
+(define-key w3-netscape-emulation-minor-mode-map "\M-m" 'w3-mailto)
+(define-key w3-netscape-emulation-minor-mode-map "\M-n" 'make-frame)
+(define-key w3-netscape-emulation-minor-mode-map "\M-l" 'w3-fetch)
+(define-key w3-netscape-emulation-minor-mode-map "\M-o" 'w3-open-local)
+(define-key w3-netscape-emulation-minor-mode-map "\M-p" 'w3-print-this-url)
+(define-key w3-netscape-emulation-minor-mode-map "\M-q" 'w3-quit)
+(define-key w3-netscape-emulation-minor-mode-map "\M-f" 'w3-search-forward)
+(define-key w3-netscape-emulation-minor-mode-map "\M-g" 'w3-search-again)
+(define-key w3-netscape-emulation-minor-mode-map "\M-r" 'w3-reload-document)
+(define-key w3-netscape-emulation-minor-mode-map "\M-i" 
'w3-load-delayed-images)
+(define-key w3-netscape-emulation-minor-mode-map "\M-a" 
'w3-hotlist-add-document)
+(define-key w3-netscape-emulation-minor-mode-map "\M-b" 'w3-show-hotlist)
+(define-key w3-netscape-emulation-minor-mode-map "\M-h" 'w3-show-history-list)
+
+(define-key w3-netscape-emulation-minor-mode-map [up]
+  (function (lambda () (interactive) (scroll-down 1))))
+(define-key w3-netscape-emulation-minor-mode-map [down]
+  (function (lambda () (interactive) (scroll-up 1))))
+(define-key w3-netscape-emulation-minor-mode-map [right] 'scroll-left)
+(define-key w3-netscape-emulation-minor-mode-map [left] 'scroll-right)
+(define-key w3-netscape-emulation-minor-mode-map [(meta left)]
+  'w3-history-backward)
+(define-key w3-netscape-emulation-minor-mode-map [(meta right)]
+  'w3-history-forward)
+
+(defun turn-on-netscape-emulation ()
+  (interactive)
+  (w3-lynx-emulation-minor-mode 0)
+  (w3-netscape-emulation-minor-mode 1))
+
+(defun w3-netscape-emulation-minor-mode (&optional arg)
+  "Minor mode for emulating netscape key navigation."
+  (interactive "P")
+  (cond
+   ((null arg)
+    (setq w3-netscape-emulation-minor-mode
+         (not w3-netscape-emulation-minor-mode))
+    (if w3-netscape-emulation-minor-mode
+       (setq w3-lynx-emulation-minor-mode nil)))
+   ((= 0 arg)
+    (setq w3-netscape-emulation-minor-mode nil))
+   (t
+    (setq w3-lynx-emulation-minor-mode nil
+         w3-netscape-emulation-minor-mode t)))
+  )
+
+(defsubst w3-skip-word ()
+  (skip-chars-forward "^ \t\n\r")
+  (skip-chars-forward " \t"))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Now, lets try Lynx
+;; ------------------
+;; A few keybindings and modifications to some default functions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun turn-on-lynx-emulation ()
+  (interactive)
+  (w3-netscape-emulation-minor-mode 0)
+  (w3-lynx-emulation-minor-mode 1))
+
+(defun w3-lynx-emulation-minor-mode (&optional arg)
+  "Minor mode for emulating lynx key navigation."
+  (interactive "P")
+  (cond
+   ((null arg)
+    (setq w3-lynx-emulation-minor-mode
+         (not w3-lynx-emulation-minor-mode))
+    (if w3-lynx-emulation-minor-mode
+       (setq w3-netscape-emulation-minor-mode nil)))
+   ((= 0 arg)
+    (setq w3-lynx-emulation-minor-mode nil))
+   (t
+    (setq w3-lynx-emulation-minor-mode t
+         w3-netscape-emulation-minor-mode nil))))
+
+;; The list of keybindings for lynx minor mode was compiled from:
+;; 
http://www.crl.com/~subir/lynx/lynx_help/keystroke_commands/keystroke_help.htm
+
+;; Movement
+(define-key w3-lynx-emulation-minor-mode-map [up]   'widget-backward)
+(define-key w3-lynx-emulation-minor-mode-map [down] 'widget-forward)
+(define-key w3-lynx-emulation-minor-mode-map [right] 'widget-button-press)
+(define-key w3-lynx-emulation-minor-mode-map [left] 'w3-history-backward)
+
+;; Scrolling
+(define-key w3-lynx-emulation-minor-mode-map "+"    'w3-scroll-up)
+(define-key w3-lynx-emulation-minor-mode-map "-"    'scroll-down)
+(define-key w3-lynx-emulation-minor-mode-map "b"    'scroll-down)
+(define-key w3-lynx-emulation-minor-mode-map "\C-a" 'w3-start-of-document)
+(define-key w3-lynx-emulation-minor-mode-map "\C-e" 'w3-end-of-document)
+(define-key w3-lynx-emulation-minor-mode-map "\C-f" 'scroll-up)
+(define-key w3-lynx-emulation-minor-mode-map "\C-b" 'scroll-down)
+(define-key w3-lynx-emulation-minor-mode-map "\C-n" (lambda () (interactive) 
(scroll-up 2)))
+(define-key w3-lynx-emulation-minor-mode-map "\C-p" (lambda () (interactive) 
(scroll-down 2)))
+(define-key w3-lynx-emulation-minor-mode-map ")"    'ignore) ; forward half
+(define-key w3-lynx-emulation-minor-mode-map "("    'ignore) ; back half
+(define-key w3-lynx-emulation-minor-mode-map "#"    'w3-toggle-toolbar)
+
+;; Dired bindings don't have any meaning for us
+
+;; Other
+(define-key w3-lynx-emulation-minor-mode-map "?"   'w3-help)
+(define-key w3-lynx-emulation-minor-mode-map "a"   'w3-hotlist-add-document)
+(define-key w3-lynx-emulation-minor-mode-map "c"   'w3-mail-document-author)
+(define-key w3-lynx-emulation-minor-mode-map "d"   'w3-download-url) 
+(define-key w3-lynx-emulation-minor-mode-map "e"   'ignore) ; edit current
+(define-key w3-lynx-emulation-minor-mode-map "f"   'dired)
+(define-key w3-lynx-emulation-minor-mode-map "g"   'w3-fetch)
+(define-key w3-lynx-emulation-minor-mode-map "h"   'w3-help)
+(define-key w3-lynx-emulation-minor-mode-map "i"   'ignore)
+(define-key w3-lynx-emulation-minor-mode-map "j"   'w3-use-hotlist)
+(define-key w3-lynx-emulation-minor-mode-map "k"   'describe-mode)
+(define-key w3-lynx-emulation-minor-mode-map "l"   'w3-complete-link)
+(define-key w3-lynx-emulation-minor-mode-map "m"   'w3)
+(define-key w3-lynx-emulation-minor-mode-map "n"   'w3-search-again)
+(define-key w3-lynx-emulation-minor-mode-map "o"   'w3-preferences-edit)
+(define-key w3-lynx-emulation-minor-mode-map "p"   'w3-print-this-url)
+(define-key w3-lynx-emulation-minor-mode-map "q"   'w3-quit)
+(define-key w3-lynx-emulation-minor-mode-map "r"   'w3-hotlist-delete)
+(define-key w3-lynx-emulation-minor-mode-map "t"   'ignore) ; tag
+(define-key w3-lynx-emulation-minor-mode-map "u"   'w3-history-backward)
+(define-key w3-lynx-emulation-minor-mode-map "/"   'w3-search-forward)
+(define-key w3-lynx-emulation-minor-mode-map "v"   'w3-show-hotlist)
+(define-key w3-lynx-emulation-minor-mode-map "V"   'w3-show-hotlist)
+(define-key w3-lynx-emulation-minor-mode-map "x"   'widget-button-press)
+(define-key w3-lynx-emulation-minor-mode-map "z"   'keyboard-quit)
+(define-key w3-lynx-emulation-minor-mode-map "="   'w3-document-information)
+(define-key w3-lynx-emulation-minor-mode-map "\\"  'w3-source-document)
+(define-key w3-lynx-emulation-minor-mode-map "!"   'shell)
+(define-key w3-lynx-emulation-minor-mode-map "'"   'ignore) ; toggle comment
+(define-key w3-lynx-emulation-minor-mode-map "`"   'ignore) ; toggle comment
+(define-key w3-lynx-emulation-minor-mode-map "*"   'ignore) ; toggle 
image_links
+(define-key w3-lynx-emulation-minor-mode-map "@"   'ignore) ; toggle raw 8-bit
+(define-key w3-lynx-emulation-minor-mode-map "["   'ignore) ; pseudo-inlines
+(define-key w3-lynx-emulation-minor-mode-map "]"   'ignore) ; send head
+(define-key w3-lynx-emulation-minor-mode-map "\""  'ignore) ; toggle quoting
+(define-key w3-lynx-emulation-minor-mode-map "\C-r" 'w3-reload-document)
+(define-key w3-lynx-emulation-minor-mode-map "\C-w" 'w3-refresh-buffer)
+(define-key w3-lynx-emulation-minor-mode-map "\C-u" 'ignore) ; erase input
+(define-key w3-lynx-emulation-minor-mode-map "\C-g" 'keyboard-quit)
+(define-key w3-lynx-emulation-minor-mode-map "\C-t" 'ignore) ; toggle trace
+(define-key w3-lynx-emulation-minor-mode-map "\C-k" 'ignore) ; cookie jar
+
+;; Things to masquerade as other browsers in the user-agent field
+;; of an HTTP request.
+(defun w3-masquerade-stub (arg app version)
+  (if (null arg)
+      (setq arg (if (equal url-package-name "Emacs-W3") 1 0)))
+  (if (= 0 arg)
+      (setq url-package-name "Emacs-W3"
+           url-package-version w3-version-number)
+    (setq url-package-name app
+         url-package-version version)))
+
+(defun w3-lynx-masquerade-mode (&optional arg)
+  (interactive "P")
+  (w3-masquerade-stub arg "Lynx" "2.6"))
+
+(defun turn-on-lynx-masquerade-mode ()
+  (interactive)
+  (w3-lynx-masquerade-mode 1))
+
+(defun turn-off-lynx-masquerade-mode ()
+  (interactive)
+  (w3-lynx-masquerade-mode 0))
+
+(defun w3-netscape-masquerade-mode (&optional arg)
+  (interactive "P")
+  (w3-masquerade-stub arg "Mozilla" "4.0"))
+
+(defun turn-on-netscape-masquerade-mode ()
+  (interactive)
+  (w3-netscape-masquerade-mode 1))
+
+(defun turn-off-netscape-masquerade-mode ()
+  (interactive)
+  (w3-netscape-masquerade-mode 0))
+
+(defun w3-ie-masquerade-mode (&optional arg)
+  (interactive "P")
+  (w3-masquerade-stub arg "Internet_Explorer" "3.02"))
+
+(defun turn-on-ie-masquerade-mode ()
+  (interactive)
+  (w3-ie-masquerade-mode 1))
+
+(defun turn-off-ie-masquerade-mode ()
+  (interactive)
+  (w3-ie-masquerade-mode 0))
+
+(defun w3-arena-masquerade-mode (&optional arg)
+  (interactive "P")
+  (w3-masquerade-stub arg "Arena" "0.9"))
+
+(defun turn-on-arena-masquerade-mode ()
+  (interactive)
+  (w3-arena-masquerade-mode 1))
+
+(defun turn-off-arena-masquerade-mode ()
+  (interactive)
+  (w3-arena-masquerade-mode 0))
+
+;;
+(provide 'w3-emulate)
+
+;;; Local Variables:
+;;; truncate-lines: t
+;;; End:
diff --git a/lisp/w3-forms.el b/lisp/w3-forms.el
new file mode 100644
index 0000000..0d0194f
--- /dev/null
+++ b/lisp/w3-forms.el
@@ -0,0 +1,964 @@
+;;; w3-forms.el --- Emacs-w3 forms parsing code for new display engine
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:12 $
+;; Version: $Revision: 1.1 $
+;; Keywords: faces, help, comm, data, languages
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; FORMS processing for html 2.0/3.0
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(eval-when-compile
+  (require 'cl))
+
+(eval-and-compile
+  (require 'w3-keyword)
+  (require 'w3-display)
+  (require 'widget)
+  (condition-case nil
+      (require 'wid-edit)
+    (error (require 'widget-edit))))
+
+(require 'w3-vars)
+(require 'mule-sysdp)
+
+(defvar w3-form-use-old-style nil
+  "*Non-nil means use the old way of interacting for form fields.")
+
+(defvar w3-form-keymap
+  (let ((map (copy-keymap global-map))
+       (eol-loc (where-is-internal 'end-of-line global-map t)))
+    (if widget-keymap
+       (cl-map-keymap (function
+                       (lambda (key binding)
+                         (define-key map
+                           (if (vectorp key) key (vector key))
+                           (case binding
+                                 (widget-backward 'w3-widget-backward)
+                                 (widget-forward  'w3-widget-forward)
+                                 (otherwise binding)))))
+                      widget-keymap))
+    (define-key map [return]      'w3-form-maybe-submit-by-keypress)
+    (define-key map "\r"          'w3-form-maybe-submit-by-keypress)
+    (define-key map "\n"          'w3-form-maybe-submit-by-keypress)
+    (define-key map "\t"          'w3-widget-forward)
+    (define-key map "\C-k"        'widget-kill-line)
+    (define-key map "\C-a"        'widget-beginning-of-line)
+    (if eol-loc
+       (define-key map eol-loc   'widget-end-of-line))
+    map))
+
+;; A form entry area is a vector
+;; [ type name default-value value maxlength options widget plist]
+;; Where:
+;;          type = symbol defining what type of form entry area it is
+;;                 (ie: file, radio)
+;;          name = the name of the form element
+;; default-value = the value this started out with
+
+(defsubst w3-form-element-type          (obj) (aref obj 0))
+(defsubst w3-form-element-name          (obj) (aref obj 1))
+(defsubst w3-form-element-default-value (obj) (aref obj 2))
+(defsubst w3-form-element-value         (obj) (aref obj 3))
+(defsubst w3-form-element-size          (obj) (aref obj 4))
+(defsubst w3-form-element-maxlength     (obj) (aref obj 5))
+(defsubst w3-form-element-options       (obj) (aref obj 6))
+(defsubst w3-form-element-action        (obj) (aref obj 7))
+(defsubst w3-form-element-widget        (obj) (aref obj 8))
+(defsubst w3-form-element-plist         (obj) (aref obj 9))
+
+(defsubst w3-form-element-set-type          (obj val) (aset obj 0 val))
+(defsubst w3-form-element-set-name          (obj val) (aset obj 1 val))
+(defsubst w3-form-element-set-default-value (obj val) (aset obj 2 val))
+(defsubst w3-form-element-set-value         (obj val) (aset obj 3 val))
+(defsubst w3-form-element-set-size          (obj val) (aset obj 4 val))
+(defsubst w3-form-element-set-maxlength     (obj val) (aset obj 5 val))
+(defsubst w3-form-element-set-options       (obj val) (aset obj 6 val))
+(defsubst w3-form-element-set-action        (obj val) (aset obj 7 val))
+(defsubst w3-form-element-set-widget        (obj val) (aset obj 8 val))
+(defsubst w3-form-element-set-plist         (obj val) (aset obj 9 val))
+
+(defvar w3-form-valid-key-sizes
+  '(
+    ("1024 (Premium)" . 1024)
+    ("896 (Regular)" . 896)
+    ("768 (Unleaded)" . 768)
+    ("512 (Low Grade)" . 512)
+    ("508 (Woos)" . 508)
+    ("256 (Test Grade)" . 256)
+    )
+  "An assoc list of available key sizes and meaningful descriptions.")
+   
+(defun w3-form-determine-size (el size)
+  (if (equal size 0)
+      (setq size nil))
+  (case (w3-form-element-type el)
+    (checkbox 3)
+    (radio 4)
+    ((reset submit) (+ 2 (length (or (w3-form-element-value el)
+                                    (symbol-name
+                                     (w3-form-element-type el))))))
+    (multiline 21)
+    (hidden nil)
+    (file (or size 26))
+    ((float password text int)
+     (if w3-form-use-old-style
+        (+ 2 (or size 20))
+       (1+ (or size 19))))
+    (image (+ 2 (length (or
+                        (plist-get (w3-form-element-plist el) 'alt)
+                        "Form-Image"))))
+    (option
+     (let ((options (copy-sequence (w3-form-element-options el))))
+       (or size
+          (length (caar (sort options
+                              (function
+                               (lambda (x y)
+                                 (>= (length (car x))
+                                     (length (car y)))))))))))
+    (keygen
+     (+ (length "Key Length: ")
+       (apply 'max
+              (mapcar (function (lambda (pair)
+                                  (length (car pair))))
+                      w3-form-valid-key-sizes))))
+    (otherwise (or size 22))))    
+ 
+;;;###autoload
+(defun w3-form-add-element (plist face)
+  (let* ((action (plist-get plist 'action))
+        (el (vector (plist-get plist 'type)
+                    (plist-get plist 'name)
+                    (plist-get plist 'default)
+                    (plist-get plist 'value)
+                    (plist-get plist 'size)
+                    (plist-get plist 'maxlength)
+                    (plist-get plist 'options)
+                    action
+                    nil
+                    plist))
+        (size (w3-form-determine-size el (plist-get plist 'size)))
+        (node (assoc action w3-form-elements)))
+    (if (not (assq '*table-autolayout w3-display-open-element-stack))
+       (if node
+           (setcdr node (cons el (cdr node)))
+         (setq w3-form-elements (cons (cons action (list el))
+                                      w3-form-elements))))
+    (if size
+       (set-text-properties (point)
+                            (progn (insert-char ?T size) (point))
+                            (list 'w3-form-info (cons el face)
+                                  'start-open t
+                                  'end-open t
+                                  'rear-nonsticky t)))))
+
+;;;###autoload
+(defun w3-form-resurrect-widgets ()
+  (let ((st (point-min))
+       ;; FIXME! For some reason this loses on long lines right now.
+       (widget-push-button-gui nil)
+       info nd node action face)
+    (while st
+      (if (setq info (get-text-property st 'w3-form-info))
+         (progn
+           (setq nd (or (next-single-property-change st 'w3-form-info)
+                        (point-max))
+                 face (cdr info)
+                 info (car info)
+                 action (w3-form-element-action info)
+                 node (assoc action w3-form-elements))
+           (goto-char st)
+           (delete-region st nd)
+           (if (not (w3-form-element-size info))
+               (w3-form-element-set-size info 20))
+           (w3-form-add-element-internal info face)
+           (setq st (next-single-property-change st 'w3-form-info)))
+       (setq st (next-single-property-change st 'w3-form-info))))))
+
+(defsubst w3-form-mark-widget (widget el)
+  (let ((widgets (list widget))
+       (children (widget-get widget :children))
+       (parent (widget-get widget :parent)))
+    (w3-form-element-set-widget el widget)
+    ;; Get _all_ the children associated with this widget
+    (while children
+      (setq widgets (cons (car children) widgets))
+      (if (widget-get (car children) :children)
+         (setq children (append children
+                                (widget-get (car children) :children))))
+      (setq children (cdr children)))
+    (while (widget-get widget :parent)
+      (setq widget (widget-get widget :parent)
+           widgets (cons widget widgets)))
+    (setq children (widget-get widget :buttons))
+    ;; Special case for radio buttons
+    (while children
+      (setq widgets (cons (car children) widgets))
+      (if (widget-get (car children) :children)
+         (setq children (append children
+                                (widget-get (car children) :children))))
+      (setq children (cdr children)))
+    (while widgets
+      (setq widget (pop widgets))
+      (widget-put widget :emacspeak-help 'w3-form-summarize-field)
+      (widget-put widget :help-echo 'w3-form-summarize-field)
+      (widget-put widget :w3-form-data el))))
+
+(defun w3-form-add-element-internal (el face)
+  (let* ((widget nil)
+        (buffer-read-only nil)
+        (inhibit-read-only t)
+        (widget-creation-function nil))
+    (setq widget-creation-function (or (get (w3-form-element-type el)
+                                           'w3-widget-creation-function)
+                                      'w3-form-default-widget-creator)
+         widget (and (fboundp widget-creation-function)
+                     (funcall widget-creation-function el face)))
+    (if (not widget)
+       nil
+      (w3-form-mark-widget widget el))))
+
+;; These properties tell the add-element function how to actually create
+;; each type of widget.
+(put 'checkbox  'w3-widget-creation-function 'w3-form-create-checkbox)
+(put 'multiline 'w3-widget-creation-function 'w3-form-create-multiline)
+(put 'radio     'w3-widget-creation-function 'w3-form-create-radio-button)
+(put 'reset     'w3-widget-creation-function 'w3-form-create-submit-button)
+(put 'submit    'w3-widget-creation-function 'w3-form-create-submit-button)
+(put 'hidden    'w3-widget-creation-function 'ignore)
+(put 'file      'w3-widget-creation-function 'w3-form-create-file-browser)
+(put 'option    'w3-widget-creation-function 'w3-form-create-option-list)
+(put 'keygen    'w3-widget-creation-function 'w3-form-create-keygen-list)
+(put 'button    'w3-widget-creation-function 'w3-form-create-button)
+(put 'image    'w3-widget-creation-function 'w3-form-create-image)
+(put 'int       'w3-widget-creation-function 'w3-form-create-integer)
+(put 'float     'w3-widget-creation-function 'w3-form-create-float)
+(put 'custom    'w3-widget-creation-function 'w3-form-create-custom)
+(put 'text      'w3-widget-creation-function 'w3-form-create-text)
+(put 'password  'w3-widget-creation-function 'w3-form-create-password)
+
+;; Custom support.
+(defvar w3-custom-options nil)
+(make-variable-buffer-local 'w3-custom-options)
+
+(defun w3-form-create-custom (el face)
+  (condition-case ()
+      (require 'cus-edit)
+    (error (require 'custom-edit)))
+  (let* ((name (w3-form-element-name el))
+        (var-name (w3-form-element-value el))
+        (type (plist-get (w3-form-element-plist el) 'custom-type))
+        (widget (widget-create (cond ((string-equal type "variable")
+                                      'custom-variable)
+                                     ((string-equal type "face")
+                                      'custom-face)
+                                     ((string-equal type "group")
+                                      'custom-group)
+                                     (t 'item)) (intern var-name))))
+    (custom-magic-reset widget)
+    (push widget w3-custom-options)
+    widget))
+
+(defun w3-form-create-checkbox (el face)
+  (widget-create 'checkbox
+                :button-face face
+                (and (w3-form-element-default-value el) t)))
+
+(defun w3-form-radio-button-update (widget child event)
+  (widget-radio-action widget child event)
+  (w3-form-mark-widget widget (widget-get widget :w3-form-data)))
+
+(defun w3-form-create-radio-button (el face)
+  (let* ((name (w3-form-element-name el))
+        (action (w3-form-element-action el))
+        (uniqid (cons name action))
+        (formobj (cdr (assoc uniqid w3-form-radio-elements)))
+        (widget nil)
+        )
+    (if formobj
+       (progn
+         (setq widget (w3-form-element-widget formobj))
+         (widget-radio-add-item widget
+                                (list 'item
+                                      :button-face face
+                                      :format "%t"
+                                      :tag ""
+                                      :value (w3-form-element-value el)))
+         (w3-form-mark-widget widget el)
+         (if (w3-form-element-default-value el)
+             (progn
+               (widget-put widget 'w3-form-default-value
+                           (w3-form-element-value el))
+               (widget-value-set widget (w3-form-element-value el))))
+         nil)
+      (setq widget (widget-create
+                   'radio-button-choice
+                   :value (w3-form-element-value el)
+                   :action 'w3-form-radio-button-update
+                   (list 'item
+                         :button-face face
+                         :format "%t"
+                         :tag ""
+                         :value (w3-form-element-value el)))
+           w3-form-radio-elements (cons (cons uniqid el)
+                                        w3-form-radio-elements))
+      (widget-put widget 'w3-form-default-value (w3-form-element-value el))
+      widget)))
+
+(defun w3-form-create-button (el face)
+  ;; This handles dealing with the bogus Netscape 'button' input type
+  ;; that lots of places have been using to slap javascript shit onto
+  (let ((val (w3-form-element-value el)))
+    (if (or (not val) (string= val ""))
+       (setq val "Push Me"))
+    (widget-create 'push-button
+                  :notify 'ignore
+                  :button-face face
+                  :value-face face
+                  val)))
+
+(defun w3-form-create-image (el face)
+  (widget-create 'push-button
+                :button-face face
+                :value-face face
+                :notify 'w3-form-submit/reset-callback
+                :value (or
+                        (plist-get (w3-form-element-plist el) 'alt)
+                        ;; Can it have a value other than "" anyway?
+                        ;; w3-form-determine-size does not even bother
+                        ;; to check the value.
+                        (let ((val (w3-form-element-value el)))
+                          (and val
+                               (stringp val)
+                               (not (zerop (length val)))
+                               val))
+                        "Form-Image")))
+
+(defun w3-form-create-submit-button (el face)
+  (let ((val (w3-form-element-value el)))
+    (if (or (not val) (string= val ""))
+       (setq val (if (eq (w3-form-element-type el) 'submit)
+                     "Submit"
+                   "Reset")))
+    (widget-create 'push-button
+                  :notify 'w3-form-submit/reset-callback
+                  :button-face face val)))
+
+(defun w3-form-create-file-browser (el face)
+  (widget-create 'file
+                :button-face face
+                :value-face face
+                :size (w3-form-element-size el)
+                :must-match t
+                :value (w3-form-element-value el)))
+
+(defun w3-form-create-keygen-list (el face)
+  (let* ((size (apply 'max (mapcar (function (lambda (pair) (length (car 
pair)))) 
+                                  w3-form-valid-key-sizes)))
+        (options (mapcar (function (lambda (pair)
+                                     (list 'choice-item
+                                           :format "%[%t%]" 
+                                           :tab-order -1
+                                           :button-face face
+                                           :value-face face
+                                           :menu-tag-get `(lambda (zed) ,(car 
pair))
+                                           :tag (mule-truncate-string (car 
pair) size ? )
+                                           :value (cdr pair))))
+                         w3-form-valid-key-sizes)))
+    (apply 'widget-create 'menu-choice
+          :emacspeak-help 'w3-form-summarize-field
+          :value 1024
+          :ignore-case t
+          :tag "Key Length"
+          :size size
+          :button-face face
+          :value-face face
+          options)))
+
+(defun w3-form-create-option-list (el face)
+  (let* ((size (w3-form-determine-size el nil))
+        (widget (apply 'widget-create 'menu-choice
+                      :value (w3-form-element-value el)
+                      :ignore-case t
+                      :tag "Choose"
+                      :format "%v"
+                      :size size
+                      :value-face face
+                      :button-face face
+                      (mapcar
+                       (function
+                        (lambda (x)
+                          (list 'choice-item :format "%[%t%]"
+                                :emacspeak-help 'w3-form-summarize-field
+                                :menu-tag-get (` (lambda (zed) (, (car x))))
+                                :tag (mule-truncate-string (car x) size ? )
+                                :button-face face
+                                :value-face face
+                                :value (car x))))
+                       (w3-form-element-options el)))))
+    (widget-value-set widget (w3-form-element-value el))
+    widget))
+
+;(defun w3-form-create-multiline (el face)
+;  (widget-create 'text :value-face face (w3-form-element-value el)))
+
+(defun w3-form-create-multiline (el face)
+  (widget-create 'push-button
+                :button-face face
+                :notify 'w3-do-text-entry
+                "Multiline text area"))
+
+(defun w3-form-create-integer (el face)
+  (if w3-form-use-old-style
+      (w3-form-default-widget-creator el face)
+    (widget-create 'integer
+                  :size (w3-form-element-size el)
+                  :value-face face
+                  :tag ""
+                  :format "%v"
+                  :keymap w3-form-keymap
+                  :w3-form-data el
+                  (w3-form-element-value el))))
+
+(defun w3-form-create-float (el face)
+  (if w3-form-use-old-style
+      (w3-form-default-widget-creator el face)
+    (widget-create 'number
+                  :size (w3-form-element-size el)
+                  :value-face face
+                  :format "%v"
+                  :tag ""
+                  :keymap w3-form-keymap
+                  :w3-form-data el
+                  (w3-form-element-value el))))
+
+(defun w3-form-create-text (el face)
+  (if w3-form-use-old-style
+      (w3-form-default-widget-creator el face)
+    (widget-create 'editable-field
+                  :keymap w3-form-keymap
+                  :size (w3-form-element-size el)
+                  :value-face face
+                  :w3-form-data el
+                  (w3-form-element-value el))))
+
+(defun w3-form-create-password (el face)
+  ;; *sigh*  This will fail under XEmacs, but I can yell at them about
+  ;; upgrading separately for the release of 19.15 and 20.0
+  (if w3-form-use-old-style
+      (w3-form-default-widget-creator el face)
+    (widget-create 'editable-field
+                  :secret ?*
+                  :keymap w3-form-keymap
+                  :size (w3-form-element-size el)
+                  :value-face face
+                  :button-face face
+                  :w3-form-data el
+                  (w3-form-element-value el))))
+
+(defun w3-form-default-widget-creator (el face)
+  (widget-create 'link
+                :notify 'w3-form-default-button-callback
+                :value-to-internal 'w3-form-default-button-update
+                :size (w3-form-element-size el)
+                :value-face face
+                :button-face face
+                :w3-form-data el
+                (w3-form-element-value el)))
+
+(defun w3-form-default-button-update (w v)
+  (let ((info (widget-get w :w3-form-data)))
+    (widget-put w :tag 
+               (if info
+                   (mule-truncate-string
+                    (if (eq 'password (w3-form-element-type info))
+                        (make-string (length v) ?*)
+                      v)
+                    (w3-form-element-size info) ? )))
+    v))
+
+(defun w3-form-default-button-callback (widget &rest ignore)
+  (let* ((obj (widget-get widget :w3-form-data))
+        (typ (w3-form-element-type obj))
+        (def (widget-value widget))
+        (val nil)
+        )
+    (case typ
+      (password
+       (setq val (funcall url-passwd-entry-func "Password: " def)))
+      (otherwise
+       (setq val (read-string
+                 (concat (capitalize (symbol-name typ)) ": ") def))))
+    (widget-value-set widget val))
+  (apply 'w3-form-possibly-submit widget ignore))
+
+;; These properties tell the help-echo function how to summarize each
+;; type of widget.
+(put 'checkbox  'w3-summarize-function 'w3-form-summarize-checkbox)
+(put 'multiline 'w3-summarize-function 'w3-form-summarize-multiline)
+(put 'radio     'w3-summarize-function 'w3-form-summarize-radio-button)
+(put 'reset     'w3-summarize-function 'w3-form-summarize-submit-button)
+(put 'submit    'w3-summarize-function 'w3-form-summarize-submit-button)
+(put 'button    'w3-summarize-function 'w3-form-summarize-submit-button)
+(put 'file      'w3-summarize-function 'w3-form-summarize-file-browser)
+(put 'option    'w3-summarize-function 'w3-form-summarize-option-list)
+(put 'keygen    'w3-summarize-function 'w3-form-summarize-keygen-list)
+(put 'image    'w3-summarize-function 'w3-form-summarize-image)
+(put 'password  'w3-summarize-function 'w3-form-summarize-password)
+(put 'hidden    'w3-summarize-function 'ignore)
+
+(defun w3-form-summarize-field (widget &rest ignore)
+  "Sumarize a widget that should be a W3 form entry area.
+This can be used as the :help-echo property of all w3 form entry widgets."
+  (let ((info nil)
+       (func nil)
+       (msg nil)
+       )
+    (setq info (widget-get widget :w3-form-data))
+    (if info
+       nil
+      (while (widget-get widget :parent)
+       (setq widget (widget-get widget :parent)))
+      (setq info (widget-get widget :w3-form-data)))
+    (if (not info)
+       (signal 'wrong-type-argument (list 'w3-form-widget widget)))
+    (setq func (or (get (w3-form-element-type info) 'w3-summarize-function)
+                  'w3-form-summarize-default)
+         msg (and (fboundp func) (funcall func info widget)))
+    ;; FIXME!  This should be removed once emacspeak is updated to
+    ;; more closely follow the widget-y way of just returning the string
+    ;; instead of having the underlying :help-echo or :emacspeak-help
+    ;; implementation do it.
+    (and msg (message "%s" msg))))
+
+(defsubst w3-form-field-label (data)
+  ;;; FIXXX!!! Need to reimplement using the new forms implementation!
+  (declare (special w3-form-labels))
+  (cdr-safe
+   (assoc (or (plist-get (w3-form-element-plist data) 'id)
+             (plist-get (w3-form-element-plist data) 'label))        
+         w3-form-labels)))
+
+(defun w3-form-summarize-default (data widget)
+  (let ((label (w3-form-field-label data))
+       (name  (w3-form-element-name data))
+       (value (widget-value (w3-form-element-widget data))))
+    (format "Text field %s set to: %s" (or label (concat "called " name))
+           value)))
+
+(defun w3-form-summarize-password (data widget)
+  (let ((label (w3-form-field-label data))
+       (name  (w3-form-element-name data)))
+    (format "Password field %s is a secret.  Shhh."
+           (or label (concat "called " name)))))
+
+(defun w3-form-summarize-multiline (data widget)
+  (let ((name (w3-form-element-name data))
+        (label (w3-form-field-label data))
+        (value (w3-form-element-value data)))
+    (format "Multiline text input %s set to: %s"
+           (or label (concat "called " name))
+           value)))
+
+(defun w3-form-summarize-checkbox (data widget)
+  (let ((name (w3-form-element-name data))
+       (label (w3-form-field-label data))
+       (checked (widget-value (w3-form-element-widget data))))
+    (format "Checkbox %s is %s" (or label name) (if checked "on" "off"))))
+
+(defun w3-form-summarize-option-list (data widget)
+  (let ((name (w3-form-element-name data))
+       (label (w3-form-field-label data))
+       (default (w3-form-element-default-value data)))
+    (format "Option list (%s) set to: %s" (or label name)
+           (widget-value (w3-form-element-widget data)))))
+
+(defun w3-form-summarize-image (data widget)
+  (let ((name (w3-form-element-name data))
+       (label (w3-form-field-label data)))
+    (concat "Image entry " (or label (concat "called " name)))))
+
+(defun w3-form-summarize-submit-button (data widget)
+  (let*  ((type (w3-form-element-type data))
+         (label (w3-form-field-label data))
+         (button-text (widget-value (w3-form-element-widget data)))
+         (type-desc (case type
+                      (submit "Submit Form")
+                      (reset "Reset Form")
+                      (button "A Button"))))
+    (format "%s: %s" type-desc (or label button-text ""))))
+
+(defun w3-form-summarize-radio-button (data widget)
+  (let ((name (w3-form-element-name data))
+       (label (w3-form-field-label data))
+       (cur-value (widget-value (w3-form-element-widget data)))
+       (this-value (widget-value (widget-get-sibling widget))))
+    (if (equal this-value cur-value)
+       (format "Radio group %s has  %s pressed"
+               (or label name) this-value)
+      (format "Press this  to change radio group %s from %s to %s" (or label 
name) cur-value
+             this-value))))
+
+(defun w3-form-summarize-file-browser (data widget)
+  (let ((name (w3-form-element-name data))
+       (label (w3-form-field-label data))
+       (file (widget-value (w3-form-element-widget data))))
+    (format "File entry %s pointing to: %s" (or label name) (or file
+                                                               "[nothing]"))))
+
+(defun w3-form-summarize-keygen-list (data widget)
+  (format "Submitting this form will generate a %d bit key (not)" 
+         (widget-value (w3-form-element-widget data))))
+
+(defun w3-form-maybe-submit-by-keypress ()
+  (interactive)
+  (let ((widget (widget-at (point))))
+    (if widget
+       (w3-form-possibly-submit widget))))
+
+(defun w3-form-possibly-submit (widget &rest ignore)
+  (let* ((formobj (widget-get widget :w3-form-data))
+        (ident (w3-form-element-action formobj))
+        (widgets (w3-all-widgets ident))
+        (text-fields 0)
+        (text-p nil))
+    ;;
+    ;; Gack.  Netscape auto-submits forms of one text field
+    ;; here we go through the list of widgets in this form and
+    ;; determine which are not submit/reset/button inputs.
+    ;; If the # == 1, then submit the form.
+    ;;
+    (while widgets
+      (setq text-fields (+
+                        text-fields
+                        (case (w3-form-element-type (car widgets))
+                          ((submit reset image button)
+                           0)
+                          (text
+                           (setq text-p t)
+                           1)
+                          (otherwise
+                           1)))
+           widgets (cdr widgets)))
+    (if (and (= text-fields 1) text-p)
+       (w3-submit-form ident))))
+
+(defun w3-form-submit/reset-callback (widget &rest ignore)
+  (let* ((formobj (widget-get widget :w3-form-data))
+        (w3-submit-button formobj))
+    (case (w3-form-element-type formobj)
+      (submit (w3-submit-form (w3-form-element-action formobj)))
+      (reset  (w3-revert-form (w3-form-element-action formobj)))
+      (image  (w3-submit-form (w3-form-element-action formobj)))
+      (otherwise
+       (error
+       "Impossible widget type %s triggered w3-form-submit/reset-callback"
+       (w3-form-element-type formobj))))))
+
+;;;###autoload
+(defun w3-do-text-entry (widget &rest ignore)
+  (let* ((data (list widget (current-buffer)))
+        (formobj (widget-get widget :w3-form-data))
+        (buff (get-buffer-create (format "Form Entry: %s"
+                                         (w3-form-element-name formobj)))))
+    (switch-to-buffer-other-window buff)
+    (indented-text-mode)
+    (erase-buffer)
+    (if (w3-form-element-value formobj)
+       (insert (w3-form-element-value formobj)))
+    (setq w3-current-last-buffer data)
+    (message "Press C-c C-c when finished with text entry.")
+    (local-set-key "\C-c\C-c" 'w3-finish-text-entry)))
+
+(defun w3-finish-text-entry ()
+  (interactive)
+  (if w3-current-last-buffer
+      (let* ((widget (nth 0 w3-current-last-buffer))
+            (formobj (widget-get widget :w3-form-data))
+            (buff (nth 1 w3-current-last-buffer))
+            (valu (buffer-string))
+            (inhibit-read-only t)
+            )
+       (local-set-key "\C-c\C-c" 'undefined)
+       (kill-buffer (current-buffer))
+       (condition-case ()
+           (delete-window)
+         (error nil))
+       (if (not (and buff (bufferp buff) (buffer-name buff)))
+           (message "Could not find the form buffer for this text!")
+         (switch-to-buffer buff)
+         (w3-form-element-set-value formobj valu)))))
+
+(defsubst w3-all-widgets (actn)
+  ;; Return a list of data entry widgets in form number ACTN
+  (cdr-safe (assoc actn w3-form-elements)))
+
+(defun w3-revert-form (actn)
+  (save-excursion
+    (let* ((formobjs (w3-all-widgets actn))
+          (inhibit-read-only t)
+          deft type widget formobj)
+      (while formobjs
+       (setq formobj (car formobjs)
+             widget (w3-form-element-widget formobj)
+             formobjs (cdr formobjs)
+             deft (w3-form-element-default-value formobj)
+             type (w3-form-element-type formobj))
+       (case type
+         ((submit reset image hidden) nil)
+         (radio
+          (setq deft (widget-get widget 'w3-form-default-value))
+          (if (and widget deft)
+              (widget-value-set widget deft)))
+         (checkbox
+          (if deft
+              (widget-value-set widget t)
+            (widget-value-set widget nil)))
+         (multiline
+          (w3-form-element-set-value formobj (w3-form-element-default-value
+                                              formobj)))
+         (file
+          (widget-value-set widget deft))
+         (otherwise
+          (widget-value-set widget deft))))
+      (widget-setup))))
+
+(defun w3-form-encode-helper (formobjs)
+  (let (
+       (submit-button-data w3-submit-button)
+       formobj result widget temp type)
+    (while formobjs
+      (setq formobj (car formobjs)
+           type (w3-form-element-type formobj)
+           widget (w3-form-element-widget formobj)
+           formobjs (cdr formobjs)
+           temp (case type
+                  (reset nil)
+                  (button nil)
+                  (image
+                   (if (and (eq submit-button-data formobj)
+                            (w3-form-element-name formobj))
+                       (setq result (append
+                                     (list
+                                      (cons
+                                       (concat (w3-form-element-name formobj)
+                                               ".x") "0")
+                                      (cons
+                                       (concat (w3-form-element-name formobj)
+                                               ".y") "0"))
+                                     result)))
+                   nil)
+                  (submit
+                   (if (and (eq submit-button-data formobj)
+                            (w3-form-element-name formobj))
+                       (cons (w3-form-element-name formobj)
+                             (w3-form-element-value formobj))))
+                  (radio
+                   (let* ((radio-name (w3-form-element-name formobj))
+                          (radio-object (cdr-safe
+                                         (assoc
+                                          (cons
+                                           radio-name
+                                           (w3-form-element-action formobj))
+                                          w3-form-radio-elements)))
+                          (chosen-widget (and radio-object
+                                              (widget-radio-chosen
+                                               (w3-form-element-widget
+                                                radio-object)))))
+                     (if (assoc radio-name result)
+                         nil
+                       (cons radio-name (widget-value chosen-widget)))))
+                  ((int float)
+                   (cons (w3-form-element-name formobj)
+                         (number-to-string (or (condition-case ()
+                                                   (widget-value widget)
+                                                 (error nil)) 0))))
+                  (checkbox
+                   (if (widget-value widget)
+                       (cons (w3-form-element-name formobj)
+                             (w3-form-element-value formobj))))
+                  (file
+                   (let ((dat nil)
+                         (fname (widget-value widget)))
+                     (save-excursion
+                       (set-buffer (get-buffer-create " *w3-temp*"))
+                       (erase-buffer)
+                       (setq dat
+                             (condition-case ()
+                                 (insert-file-contents-literally fname)
+                               (error (concat "Error accessing " fname))))
+                       (cons (w3-form-element-name formobj)
+                             (buffer-string)))))
+                  (option
+                   (cons (w3-form-element-name formobj)
+                         (cdr-safe
+                          (assoc (widget-value widget)
+                                 (w3-form-element-options formobj)))))
+                  (keygen
+                   (condition-case ()
+                       (require 'ssl)
+                     (error (error "Not configured for SSL, please read the 
info pages.")))
+                   (if (fboundp 'ssl-req-user-cert) nil
+                     (error "This version of SSL isn't capable of requesting 
certificates."))
+                   (let ((challenge (plist-get (w3-form-element-plist formobj) 
'challenge))
+                         (size (widget-value widget)))
+                     (cons (w3-form-element-name formobj)
+                           (ssl-req-user-cert size challenge))))
+                  ((multiline hidden)
+                   (cons (w3-form-element-name formobj)
+                         (w3-form-element-value formobj)))
+                  (otherwise
+                   (cons (w3-form-element-name formobj)
+                         (widget-value widget)))))
+      (if temp
+         (setq result (cons temp result))))
+    result))
+
+(defun w3-form-encode-make-mime-part (id data separator)
+  (concat separator "\nContent-id: " id
+         "\nContent-length: " (length data)
+         "\n\n" data))
+
+(defun w3-form-encode-multipart/x-www-form-data (formobjs)
+  ;; Create a multipart form submission.
+  ;; Returns a cons of two strings.  Car is the separator used.
+  ;; cdr is the body of the MIME message."
+  (let ((separator "---some-separator-for-www-form-data"))
+    (cons separator
+         (mapconcat
+          (function
+           (lambda (formobj)
+             (w3-form-encode-make-mime-part (car formobj) (cdr formobj)
+                                            separator)))
+          (w3-form-encode-helper formobjs)
+          "\n"))))
+
+(fset 'w3-form-encode-multipart/form-data
+      'w3-form-encode-multipart/x-www-form-data)
+(fset 'w3-form-encode- 'w3-form-encode-application/x-www-form-urlencoded)
+
+(defun w3-form-encode (result &optional enctype)
+  "Create a string suitably encoded for a URL request."
+  (let ((func (intern (concat "w3-form-encode-" enctype))))
+    (if (fboundp func)
+       (funcall func result)
+      (w3-warn 'html (format "Bad encoding type for form data: %s" enctype))
+      (w3-form-encode-application/x-www-form-urlencoded result))))
+
+(defun w3-form-encode-text/plain (result)
+  (let ((query ""))
+    (setq query
+         (mapconcat
+          (function
+           (lambda (widget)
+             (let ((nam (car widget))
+                   (val (cdr widget)))
+               (if (string-match "\n" nam)
+                   (setq nam (mapconcat
+                              (function
+                               (lambda (x)
+                                 (if (= x ?\n) "," (char-to-string x))))
+                              nam "")))
+               (concat nam " " val))))
+          (w3-form-encode-helper result) "\n"))
+    query))
+
+(defun w3-form-encode-application/x-gopher-query (result)
+  (concat "\t" (cdr (car (w3-form-encode-helper result)))))
+
+(defun w3-form-encode-xwfu (chunk)
+  "Escape characters in a string for application/x-www-form-urlencoded.
+Blasphemous crap because someone didn't think %20 was good enough for encoding
+spaces.  Die Die Die."
+  (mapconcat
+   (function
+    (lambda (char)
+      (cond
+       ((= char ?  ) "+")
+       ((memq char url-unreserved-chars) (char-to-string char))
+       (t (upcase (format "%%%02x" char))))))
+    (mule-encode-string chunk) ""))
+
+(defun w3-form-encode-application/x-www-form-urlencoded (result)
+  (mapconcat
+   (function
+    (lambda (data)
+      (concat (w3-form-encode-xwfu (car data)) "="
+             (w3-form-encode-xwfu (cdr data)))))
+   (w3-form-encode-helper result) "&"))
+
+(defun w3-form-encode-application/x-w3-isindex (result)
+  (let* ((info (w3-form-encode-helper result))
+        (query (cdr-safe (assoc "isindex" info))))
+    (if query
+       (url-hexify-string query)
+      "")))
+
+(defun w3-form-encode-application/gopher-ask-block (result)
+  (let ((query ""))
+    ;;; gopher+ will expect all the checkboxes/etc, even if they are
+    ;;; not turned on.  Should still ignore RADIO boxes that are not
+    ;;; active though.
+  (while result
+    (if (and (not (and (string= (nth 2 (car result)) "RADIO")
+                      (not (nth 6 (car result)))))
+            (not (member (nth 2 (car result)) '("SUBMIT" "RESET"))))
+       (setq query (format "%s\r\n%s" query (nth 5 (car result)))))
+    (setq result (cdr result)))
+  (concat query "\r\n.\r\n")))
+
+(defun w3-submit-form (ident)
+  ;; Submit form entry fields matching ACTN as their action identifier.
+  (let* ((result (w3-all-widgets ident))
+        (enctype (or (cdr (assq 'enctype ident))
+                     "application/x-www-form-urlencoded"))
+        (query (w3-form-encode result enctype))
+        (themeth (upcase (or (cdr (assq 'method ident)) "get")))
+        (theurl (cdr (assq 'action ident))))
+    (if (and (string= "GET" themeth)
+            (string-match "\\([^\\?]*\\)\\?" theurl))
+       (setq theurl (url-match theurl 1)))
+    (cond
+     ((or (string= "POST" themeth)
+         (string= "PUT" themeth))
+      (if (consp query)
+         (setq enctype (concat enctype "; separator=\""
+                               (substring (car query) 3 nil)
+                               "\"")
+               query (cdr query)))
+      (let ((url-request-method themeth)
+           (url-request-data query)
+           (url-request-extra-headers
+            (cons (cons "Content-type" enctype) url-request-extra-headers)))
+       (w3-fetch theurl)))
+     ((string= "GET" themeth)
+      (let ((theurl (concat theurl (if (string-match "gopher" enctype)
+                                      "" "?") query)))
+       (w3-fetch theurl)))
+     (t
+      (w3-warn 'html (format "Unknown submit method: %s" themeth))
+      (let ((theurl (concat theurl "?" query)))
+       (w3-fetch theurl))))))
+
+(provide 'w3-forms)
diff --git a/lisp/w3-hot.el b/lisp/w3-hot.el
new file mode 100644
index 0000000..b9a21d9
--- /dev/null
+++ b/lisp/w3-hot.el
@@ -0,0 +1,371 @@
+;;; w3-hot.el --- Main functions for emacs-w3 on all platforms/versions
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:11 $
+;; Version: $Revision: 1.1 $
+;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Structure for hotlists
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; (
+;;;  ("name of item1" . "http://foo.bar.com/";)    ;; A single item in hotlist
+;;;  ("name of item2" . (                         ;; A sublist
+;;;                      ("name of item3" . "http://www.ack.com/";)
+;;;                     ))
+;;; )  ; end of hotlist
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'w3-vars)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Hotlist Handling Code
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar w3-html-bookmarks nil)
+
+(defun w3-hotlist-break-shit ()
+  (let ((todo '(w3-hotlist-apropos
+               w3-hotlist-delete
+               w3-hotlist-rename-entry
+               w3-hotlist-append
+               w3-use-hotlist
+               w3-hotlist-add-document
+               w3-hotlist-add-document-at-point
+               ))
+       (cur nil))
+    (while todo
+      (setq cur (car todo)
+           todo (cdr todo))
+      (fset cur
+           (`
+            (lambda (&rest ignore)
+              (interactive)
+              (error "Sorry, `%s' does not work with html bookmarks"
+                     (quote (, cur)))))))))
+
+;;;###autoload
+(defun w3-read-html-bookmarks (fname)
+  "Import an HTML file into the Emacs-w3 format."
+  (interactive "fBookmark file: ")
+  (if (not (file-readable-p fname))
+      (error "Can not read %s..." fname))
+  (save-excursion
+    (set-buffer (get-buffer-create " *bookmark-work*"))
+    (erase-buffer)
+    (insert-file-contents fname)
+    (let* ((w3-debug-html nil)
+          (bkmarks nil)
+          (parse (w3-parse-buffer (current-buffer))))
+      (setq parse w3-last-parse-tree
+           bkmarks (nreverse (w3-grok-html-bookmarks parse))
+           w3-html-bookmarks bkmarks)))
+  (w3-hotlist-break-shit))
+
+(eval-when-compile
+  (defvar cur-stack nil)
+  (defvar cur-title nil)
+  (defmacro push-new-menu ()
+    '(setq cur-stack (cons (list "") cur-stack)))
+  
+  (defmacro push-new-item (title href)
+    (` (setcar cur-stack (cons (vector (, title) (list 'w3-fetch (, href)) t)
+                              (car cur-stack)))))
+  ;;(` (setcar cur-stack (cons (cons (, title) (, href)) (car cur-stack)))))
+  
+  (defmacro finish-submenu ()
+    '(let ((x (nreverse (car cur-stack)))
+          (y (pop cur-title)))
+       (while (string= y "")
+        (setq y (pop cur-title)))
+       (and x (setcar x y))
+       (setq cur-stack (cdr cur-stack))
+       (if cur-stack
+          (setcar cur-stack (cons x (car cur-stack)))
+        (setq cur-stack (list x)))))
+  )
+
+(defun w3-grok-html-bookmarks-internal (tree)
+  (let (node tag content args)
+    (while tree
+      (setq node (car tree)
+           tree (cdr tree)
+           tag (and (listp node) (nth 0 node))
+           args (and (listp node) (nth 1 node))
+           content (and (listp node) (nth 2 node)))
+      (cond
+       ((eq tag 'title)
+       (setq cur-title (list (w3-normalize-spaces (car content))))
+       (w3-grok-html-bookmarks-internal content))
+       ((memq tag '(dl ol ul))
+       (push-new-menu)
+       (w3-grok-html-bookmarks-internal content)
+       (finish-submenu))
+       ((and (memq tag '(dt li p))
+            (stringp (car content)))
+       (setq cur-title (cons (w3-normalize-spaces (car content))
+                             cur-title)))
+       ((and (eq tag 'a)
+            (stringp (car-safe content))
+            (cdr-safe (assq 'href args)))
+       (push-new-item (w3-normalize-spaces (car-safe content))
+                      (cdr-safe (assq 'href args))))
+       (content
+       (w3-grok-html-bookmarks-internal content))))))
+
+(defun w3-grok-html-bookmarks (chunk)
+  (let (
+       cur-title
+       cur-stack
+       )
+    (w3-grok-html-bookmarks-internal chunk)
+    (reverse (car cur-stack))))
+
+;;;###autoload
+(defun w3-hotlist-apropos (regexp)
+  "Show hotlist entries matching REGEXP."
+  (interactive "sW3 Hotlist Apropos (regexp): ")
+  (or w3-setup-done (w3-do-setup))
+  (let ((save-buf (get-buffer "Hotlist")) ; avoid killing this
+       (w3-hotlist
+        (apply
+         'nconc
+         (mapcar
+          (function
+           (lambda (entry)
+             (if (or (string-match regexp (car entry))
+                     (string-match regexp (car (cdr entry))))
+                 (list entry))))
+          w3-hotlist))))
+    (if (not w3-hotlist)
+       (message "No w3-hotlist entries match \"%s\"" regexp)
+      (and save-buf (save-excursion
+                     (set-buffer save-buf)
+                     (rename-buffer (concat "Hotlist during " regexp))))
+      (unwind-protect
+         (let ((w3-reuse-buffers 'no))
+           (w3-show-hotlist)
+           (rename-buffer (concat "Hotlist \"" regexp "\""))
+           (url-set-filename url-current-object (concat "hotlist/" regexp)))
+       (and save-buf (save-excursion
+                       (set-buffer save-buf)
+                       (rename-buffer "Hotlist")))))))
+
+;;;###autoload
+(defun w3-hotlist-refresh ()
+  "Reload the default hotlist file into memory"
+  (interactive)
+  (if (not w3-setup-done) (w3-do-setup))
+  (w3-parse-hotlist))
+
+(defun w3-delete-from-alist (x alist)
+  ;; Remove X from ALIST, return new alist
+  (if (eq (assoc x alist) (car alist)) (cdr alist)
+    (delq (assoc x alist) alist)))
+
+;;;###autoload
+(defun w3-hotlist-delete ()
+  "Deletes a document from your hotlist file"
+  (interactive)
+  (save-excursion
+    (if (not w3-hotlist) (message "No hotlist in memory!")
+      (if (not (file-exists-p w3-hotlist-file))
+         (message "Hotlist file %s does not exist." w3-hotlist-file)
+       (let* ((completion-ignore-case t)
+              (title (car (assoc (completing-read "Delete Document: "
+                                                  w3-hotlist nil t)
+                                 w3-hotlist)))
+              (case-fold-search nil)
+              (buffer (get-buffer-create " *HOTW3*")))
+         (and (string= title "") (error "No document specified."))
+         (set-buffer buffer)
+         (erase-buffer)
+         (insert-file-contents w3-hotlist-file)
+         (goto-char (point-min))
+         (if (re-search-forward (concat "^" (regexp-quote title) "\r*$")
+                                nil t)
+             (let ((make-backup-files nil)
+                   (version-control nil)
+                   (require-final-newline t))
+               (previous-line 1)
+               (beginning-of-line)
+               (delete-region (point) (progn (forward-line 2) (point)))
+               (write-file w3-hotlist-file)
+               (setq w3-hotlist (w3-delete-from-alist title w3-hotlist))
+               (kill-buffer (current-buffer))
+               (w3-hotindex-delete-entry title))
+           (message "%s was not found in %s" title w3-hotlist-file)))))))
+
+;;;###autoload
+(defun w3-hotlist-rename-entry (title)
+  "Rename a hotlist item"
+  (interactive (list (let ((completion-ignore-case t))
+                      (completing-read "Rename entry: " w3-hotlist nil t))))
+  (cond                                        ; Do the error handling first
+   ((string= title "") (error "No document specified!"))
+   ((not w3-hotlist) (error "No hotlist in memory!"))
+   ((not (file-exists-p (expand-file-name w3-hotlist-file)))
+    (error "Hotlist file %s does not exist." w3-hotlist-file))
+   ((not (file-readable-p (expand-file-name w3-hotlist-file)))
+    (error "Hotlist file %s exists, but is unreadable." w3-hotlist-file)))
+  (save-excursion
+    (let ((obj (assoc title w3-hotlist))
+         (used (mapcar 'car w3-hotlist))
+         (buff (get-buffer-create " *HOTW3*"))
+         (new nil)
+         )
+      (while (or (null new) (member new used))
+       (setq new (read-string "New name: ")))
+      (set-buffer buff)
+      (erase-buffer)
+      (insert-file-contents (expand-file-name w3-hotlist-file))
+      (goto-char (point-min))
+      (if (re-search-forward (concat "^" (regexp-quote title) "$") nil t)
+         (let ((make-backup-files nil)
+               (version-control nil)
+               (require-final-newline t))
+           (previous-line 1)
+           (beginning-of-line)
+           (delete-region (point) (progn (forward-line 2) (point)))
+           (insert (format "%s %s\n%s\n" (nth 1 obj) (current-time-string)
+                           new))
+           (setq w3-hotlist (cons (list new (nth 1 obj))
+                                  (w3-delete-from-alist title w3-hotlist)))
+           (write-file w3-hotlist-file)
+           (w3-hotindex-rename-entry title new)
+           (kill-buffer (current-buffer)))
+       (message "%s was not found in %s" title w3-hotlist-file)))))
+
+;;;###autoload
+(defun w3-hotlist-append (fname)
+  "Append a hotlist to the one in memory"
+  (interactive "fAppend hotlist file: ")
+  (let ((x w3-hotlist))
+    (w3-parse-hotlist fname)
+    (setq w3-hotlist (nconc x w3-hotlist))))
+
+(defun w3-hotlist-parse-old-mosaic-format ()
+  (let (cur-link cur-alias)
+    (while (re-search-forward "^\n" nil t) (replace-match ""))
+    (goto-line 3)
+    (while (not (eobp))
+      (re-search-forward "^[^ ]*" nil t)
+      (setq cur-link (buffer-substring (match-beginning 0) (match-end 0)))
+      (setq cur-alias (buffer-substring (progn
+                                         (forward-line 1)
+                                         (beginning-of-line)
+                                         (point))
+                                       (progn
+                                         (end-of-line)
+                                         (point))))
+      (if (not (equal cur-alias ""))
+         (setq w3-hotlist (cons (list cur-alias cur-link) w3-hotlist))))))
+
+;;;###autoload
+(defun w3-parse-hotlist (&optional fname)
+  "Read in the hotlist specified by FNAME"
+  (if (not fname) (setq fname w3-hotlist-file))
+  (setq w3-hotlist nil)
+  (if (not (file-exists-p fname))
+      (message "%s does not exist!" fname)
+    (let* ((old-buffer (current-buffer))
+          (buffer (get-buffer-create " *HOTW3*"))
+          (case-fold-search t))
+      (set-buffer buffer)
+      (erase-buffer)
+      (insert-file-contents fname)
+      (goto-char (point-min))
+      (cond
+       ((looking-at "ncsa-xmosaic-hotlist-format-1");; Old-style NCSA Mosaic
+       (w3-hotlist-parse-old-mosaic-format))
+       ((or (looking-at "<!DOCTYPE")   ; Some HTML style, including netscape
+           (re-search-forward "<a[ \n]+href" nil t))
+       (w3-read-html-bookmarks fname))
+       (t
+       (message "Cannot determine format of hotlist file: %s" fname)))
+      (set-buffer-modified-p nil)
+      (kill-buffer buffer)
+      (set-buffer old-buffer))))
+
+;;;###autoload
+(defun w3-use-hotlist ()
+  "Possibly go to a link in your W3/Mosaic hotlist.
+This is part of the emacs World Wide Web browser.  It will prompt for
+one of the items in your 'hotlist'.  A hotlist is a list of often
+visited or interesting items you have found on the World Wide Web."
+  (interactive)
+  (if (not w3-setup-done) (w3-do-setup))
+  (if (not w3-hotlist) (message "No hotlist in memory!")
+    (let* ((completion-ignore-case t)
+          (url (car (cdr (assoc
+                          (completing-read "Goto Document: " w3-hotlist nil t)
+                          w3-hotlist)))))
+      (if (string= "" url) (error "No document specified!"))
+      (w3-fetch url))))
+
+;;;###autoload
+(defun w3-hotlist-add-document-at-point (pref-arg)
+  "Add the document pointed to by the hyperlink under point to the hotlist."
+  (interactive "P")
+  (let ((url (w3-view-this-url t))
+       (widget (widget-at (point)))
+       (title nil))
+    (or url (error "No link under point."))
+    (if (and (widget-get widget :from)
+            (widget-get widget :to))
+       (setq title (buffer-substring (widget-get widget :from)
+                                     (widget-get widget :to))))
+    (w3-hotlist-add-document pref-arg (or title url) url)))
+
+;;;###autoload
+(defun w3-hotlist-add-document (pref-arg &optional the-title the-url)
+  "Add this documents url to the hotlist"
+  (interactive "P")
+  (save-excursion
+    (let* ((buffer (get-buffer-create " *HOTW3*"))
+          (title (or the-title
+                     (and pref-arg (read-string "Title: "))
+                     (buffer-name)))
+          (make-backup-files nil)
+          (version-control nil)
+          (require-final-newline t)
+          (url (or the-url (url-view-url t))))
+      (if (rassoc (list url) w3-hotlist)
+         (error "That item already in hotlist, use w3-hotlist-rename-entry."))
+      (set-buffer buffer)
+      (erase-buffer)
+      (setq w3-hotlist (cons (list title url) w3-hotlist)
+           url (url-unhex-string url))
+      (if (not (file-exists-p w3-hotlist-file))
+         (progn
+           (message "Creating hotlist file %s" w3-hotlist-file)
+           (insert "ncsa-xmosaic-hotlist-format-1\nDefault\n\n")
+           (backward-char 1))
+       (progn
+         (insert-file-contents w3-hotlist-file)
+         (goto-char (point-max))
+         (backward-char 1)))
+      (insert "\n" url " " (current-time-string) "\n" title)
+      (write-file w3-hotlist-file)
+      (kill-buffer (current-buffer)))))
+
+(provide 'w3-hot)
diff --git a/lisp/w3-hotindex.el b/lisp/w3-hotindex.el
new file mode 100644
index 0000000..87dd992
--- /dev/null
+++ b/lisp/w3-hotindex.el
@@ -0,0 +1,207 @@
+;;; w3-hotindex.el --- Keywords for the hotlist
+;; Author: Laurent Martelli <address@hidden>
+;; Created: 1997/12/31
+;; Version: 0.1
+;; TODO:
+;;   patch w3-hot.el so that it removes hotindex entries.
+;;   update w3-hotindex-key-list when removing entries.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Structure for hotindexes
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; (
+;;;  ("name of item1" "key1" "key2")
+;;; )  ; end of hotlist
+;;; Every "name of item" must be in the hotlist
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'w3-vars)
+(require 'w3-hot)
+
+;; --- non Hotindex specific definitions ---
+;; It should probably go in an other file
+(defun member-nocase (elt list)
+  "Returns non-nil if ELT is a string that belongs to LIST case insensitively.
+Actually, non-nil means the string as it is in LIST.
+It won't work great if there are some non-string objects in LIST. I mean, 
+it will raise an error."
+  (setq elt (downcase elt))
+  (while (and list (not (string= elt (downcase (car list)))))
+    (setq list (cdr list)))
+  (car list))
+;; --- end of non Hotindex specific definitions ---
+
+
+(defvar w3-hotindex ()
+  "*The hotindex list. It must have the following format:
+ ((NAME KEY1 KEY2 ...) ...)
+ NAME is a string identifying the item. It must be in w3-hotlist.
+ KEYn are strings which are keywords associated with the item.")
+
+(defvar w3-hotindex-file (concat w3-configuration-directory "hotindex")
+  "*The file where to save the HotIndex.")
+
+(defvar w3-hotindex-key-list ()
+  "A list of keys used in w3-hotindex")
+
+(defun w3-hotindex-build-completion-key-list (key-list)
+  "Build a list of keys suitable for use with completing-read."
+  (mapcar (lambda (x) (list x))
+         key-list))
+
+(defun w3-hotindex-build-key-list (hotindex)
+  "(w3-hotindex-build-key-list HOTINDEX)
+Returns a list of the keys appearing in HOTINDEX."
+  (let (key-list key)
+    (while hotindex
+      ;; set key is to the list of keys of the current entry
+      (setq key (cdr (car hotindex)))
+      (while key
+       (unless (member-nocase (car key) key-list)
+         (setq key-list (cons (car key) key-list)))
+       (setq key (cdr key)))
+      (setq hotindex (cdr hotindex)))
+    key-list))
+
+(defun w3-hotindex-add-key (name keyword)
+  "*Add a keyword to an item in w3-hotindex. Completion is done
+on the list of all keywords."
+  (interactive (let ((completion-ignore-case t))
+                (list (completing-read "Entry: " w3-hotlist nil t)
+                      (completing-read "Keyword: "
+                                       (w3-hotindex-build-completion-key-list 
+                                        w3-hotindex-key-list)
+                                       nil nil))))
+  (let ((item (assoc name w3-hotindex)) key)
+    (or item
+       (progn  ;; if the item does not exist, we create it
+         (setq item (list name))
+         (setq w3-hotindex (cons item w3-hotindex))))
+    ;; If that key is already there, do not add it again
+    ;; (The comparison is case-insensitive)
+    (setq key (cdr item))
+    (message "existant keys = %S" key)
+    (while (and key (not (string= (downcase (car key)) (downcase keyword))))
+      (setq key (cdr key)))
+    ;; leading and trailing spaces should be eliminated before this.
+    ;; Is there a function doing this ????
+    (if key 
+       (message "%s is already associated with this entry." keyword)
+       (setcdr item (cons keyword (cdr item)))))
+  (w3-hotindex-save nil)
+  ;; rebuilds the list of keys
+  ;; It would better to do this incrementally
+  (setq w3-hotindex-key-list (w3-hotindex-build-key-list w3-hotindex)))
+
+(defun w3-hotindex-rm-key (entry keyword)
+  "*Remove a keyword from an item of w3-hotindex."
+  (interactive (let ((entry nil)
+                    (key-list nil)
+                    (completion-ignore-case t))
+                (setq entry (completing-read "Entry: " w3-hotindex nil t))
+                (setq key-list (mapcar 
+                                (lambda (x) (list x))
+                                (cdr (assoc entry w3-hotindex))))
+                (list entry 
+                      (completing-read "Keyword to remove: " key-list nil t))))
+  (let ((item (delete keyword (assoc entry w3-hotindex))))
+    ;; If there are no more keywords for this entry, remove it
+    (if (null (cdr item))
+       (setq w3-hotindex (delq item w3-hotindex))))
+  (w3-hotindex-save nil)
+  ;; rebuilds the list of keys
+  ;; It would better to do this incrementally
+  (setq w3-hotindex-key-list (w3-hotindex-build-key-list w3-hotindex))
+  )
+
+(defun w3-hotindex-rename-entry (old new)
+  "Renames an entry in the HotIndex. Intended to be called from 
+w3-hotlist-rename-entry. OLD should equal the entry to be renamed.
+Case is therefore important."
+  (let ((entry (assoc old w3-hotindex)))
+    (if entry
+       (progn (setcar entry new)
+              (w3-hotindex-save nil)))))
+
+(defun w3-hotindex-delete-entry (title)
+  "Deletes an entry in the HotIndex. Intended to be called from 
+w3-hotlist-delete. OLD should equal the entry to be deleted.
+Case is therefore important."
+  (let ((entry (assoc title w3-hotindex)))
+    (if entry
+       (progn (setq w3-hotindex (delq entry w3-hotindex))
+              (setq w3-hotindex-key-list (w3-hotindex-build-key-list 
+                                          w3-hotindex-key-list))
+              (w3-hotindex-save nil)))))
+
+(defun w3-hotindex-query (key)
+  "Query the HotIndex for KEY."
+  (interactive (list (let ((completion-ignore-case t))
+                (completing-read "Key: " 
(w3-hotindex-build-completion-key-list 
+                                          w3-hotindex-key-list)
+                                 nil t))))
+  (let ((index w3-hotindex) result)
+    (message "SEARCHING IN %S" index)
+    (message "LOOKING FOR %S" key)
+    (while index
+      (if (member-nocase key (cdr (car index)))
+         (progn
+           (setq result (cons (assoc-ignore-case (caar index) w3-hotlist) 
result))
+           (message "MATCH in %S" (car index))
+           (message "ADDING %S" (assoc-ignore-case (caar index) w3-hotlist)))
+       (message "no match in %S" (car index)))
+      (setq index (cdr index)))
+    (let ((w3-hotlist result)
+         (w3-reuse-buffers 'no))
+      (w3-show-hotlist))))
+
+(defun w3-hotindex-save (filename)
+  "*Save the index structure in filename. If filename is nil, 
+save into w3-configuration-directory/hotindex."
+  (interactive "i")
+  (let ((output-buffer 
+        (find-file-noselect (or filename w3-hotindex-file)))
+       output-marker)
+    (save-excursion
+      (set-buffer output-buffer)
+      ;; Delete anything that is in the file
+      (delete-region (point-min) (point-max))
+      (setq output-marker (point-marker))
+      (let ((print-readably t)
+           (print-escape-newlines t)
+           (standard-output output-marker))
+       (princ ";; W3 HotIndex\n")
+       (princ ";; ===========\n")
+       (princ "(setq-default w3-hotindex '")
+       (prin1 w3-hotindex)
+       (princ ")\n;; ==================\n")
+       (princ ";; End of W3 HotIndex\n")))
+    (set-marker output-marker nil)
+    (save-excursion
+      (set-buffer output-buffer)
+      (save-buffer))
+    ))
+
+(defun w3-hotindex-check ()
+  "Checks that the entries of w3-hotindex are in w3-hotlist.
+Raises an error if some entries are unresolved."
+  (let ((index w3-hotindex) unresolved)
+    (while index
+      (unless (assoc-ignore-case (caar index) w3-hotlist)
+       (setq unresolved (cons (caar index) unresolved)))
+      (setq index (cdr index)))
+    (if unresolved
+       (error "Unresolved entries found in w3-hotindex : %S" unresolved)))
+  )
+
+(defun w3-hotindex-load ()
+  "Load the file containing the hotindex, and updates w3-hotindex-key-list."
+  (interactive)
+  (load-file (concat w3-hotindex-file))
+  (w3-hotindex-check)
+  (setq w3-hotindex-key-list (w3-hotindex-build-key-list w3-hotindex))
+  )
+
+(w3-hotlist-refresh)
+(w3-hotindex-load)
+
+(provide 'w3-hotindex)
diff --git a/lisp/w3-imap.el b/lisp/w3-imap.el
new file mode 100644
index 0000000..7856b92
--- /dev/null
+++ b/lisp/w3-imap.el
@@ -0,0 +1,227 @@
+;;; w3-imap.el --- Imagemap functions
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:10 $
+;; Version: $Revision: 1.1 $
+;; Keywords: hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'w3-vars)
+(eval-and-compile
+  (require 'widget))
+
+(eval-when-compile
+  (defmacro x-coord (pt) (list 'aref pt 0))
+  (defmacro y-coord (pt) (list 'aref pt 1)))
+
+(defun w3-point-in-rect (point coord1 coord2 &rest ignore)
+  "Return t iff POINT is within a rectangle defined by COORD1 and COORD2.
+All arguments are vectors of [X Y] coordinates."
+  ;; D'uhhh, this is hard.
+  (and (>= (x-coord point) (x-coord coord1))
+       (<= (x-coord point) (x-coord coord2))
+       (>= (y-coord point) (y-coord coord1))
+       (<= (y-coord point) (y-coord coord2))))
+
+(defun w3-point-in-circle (point coord1 coord2 &rest ignore)
+  "Return t iff POINT is within a circle defined by COORD1 and COORD2.
+All arguments are vectors of [X Y] coordinates."
+  ;; D'uhhh, this is (barely) slightly harder.
+  (let (radius1 radius2)
+    (setq radius1 (+
+                  (*
+                   (- (y-coord coord1) (y-coord coord2))
+                   (- (y-coord coord1) (y-coord coord2)))
+                  (*
+                   (- (x-coord coord1) (x-coord coord2))
+                   (- (x-coord coord1) (x-coord coord2)))
+                  )
+         radius2 (+
+                  (*
+                   (- (y-coord coord1) (y-coord point))
+                   (- (y-coord coord1) (y-coord point)))
+                  (*
+                   (- (x-coord coord1) (x-coord point))
+                   (- (x-coord coord1) (x-coord point)))
+                  )
+         )
+    (<= radius2 radius1)))
+
+;; A polygon is a vector
+;; poly[0] = # of sides
+;; poly[1] = # of sides used
+;; poly[2] = vector of X coords
+;; poly[3] = vector of Y coords
+
+(defsubst w3-image-poly-nsegs (p)
+  (aref p 0))
+
+(defsubst w3-image-poly-used-segs (p)
+  (aref p 1))
+
+(defsubst w3-image-poly-x-coords (p)
+  (aref p 2))
+
+(defsubst w3-image-poly-y-coords (p)
+  (aref p 3))
+
+(defsubst w3-image-poly-x-coord (p n)
+  (aref (w3-image-poly-x-coords p) n))
+
+(defsubst w3-image-poly-y-coord (p n)
+  (aref (w3-image-poly-y-coords p) n))
+
+(defun w3-image-poly-alloc (n)
+  (if (< n 3)
+      (error "w3-image-poly-alloc: invalid number of sides (%d)" n))
+  
+  (vector n 0 (make-vector n nil) (make-vector n nil)))
+
+(defun w3-image-poly-assign (p x y)
+  (if (>= (w3-image-poly-used-segs p) (w3-image-poly-nsegs p))
+      (error "w3-image-poly-assign: out of space in the w3-image-polygon"))
+  (aset (w3-image-poly-x-coords p) (w3-image-poly-used-segs p) x)
+  (aset (w3-image-poly-y-coords p) (w3-image-poly-used-segs p) y)
+  (aset p 1 (1+ (w3-image-poly-used-segs p))))
+
+(defun w3-image-ccw (p0 p1 p2)
+  (let (dx1 dx2 dy1 dy2 retval)
+    (setq dx1 (- (x-coord p1) (x-coord p0))
+         dy1 (- (y-coord p1) (y-coord p0))
+         dx2 (- (x-coord p2) (x-coord p0))
+         dy2 (- (y-coord p2) (y-coord p0)))
+    (cond
+     ((> (* dx1 dy2) (* dy1 dx2))
+      (setq retval 1))
+     ((< (* dx1 dy2) (* dy1 dx2))
+      (setq retval -1))
+     ((or (< (* dx1 dx2) 0)
+         (< (* dy1 dy2) 0))
+      (setq retval -1))
+     ((< (+ (* dx1 dx1) (* dy1 dy1))
+        (+ (* dx2 dx2) (* dy2 dy2)))
+      (setq retval 1))
+     (t
+      (setq retval 0)))
+    retval))
+
+(defun w3-image-line-intersect (l1 l2)
+  (and (<= (* (w3-image-ccw (car l1) (cdr l1) (car l2))
+             (w3-image-ccw (car l1) (cdr l1) (cdr l2))) 0)
+       (<= (* (w3-image-ccw (car l2) (cdr l2) (car l1))
+             (w3-image-ccw (car l2) (cdr l2) (cdr l1))) 0)))
+
+(defun w3-point-in-poly (point &rest pgon)
+  "Return t iff POINT is within a polygon defined by the list of points PGON.
+All arguments are either vectors of [X Y] coordinates or lists of such
+vectors."
+  ;; Right now, this fails on some points that are right on a line segment
+  ;; but it works for everything else (I think)
+  (if (< (length pgon) 3)
+      ;; Malformed polygon!!!
+      nil
+    (let ((p (w3-image-poly-alloc (length pgon)))
+         (hitcount 0)
+         (i 0)
+         (ip1 0)
+         (l1 nil)
+         (l2 (cons (vector (x-coord point) (1+ (y-coord point)))
+                   (vector (x-coord point) (y-coord point))))
+         )
+      (while pgon
+       (w3-image-poly-assign p (x-coord (car pgon)) (y-coord (car pgon)))
+       (setq pgon (cdr pgon)))
+      (while (< i (w3-image-poly-nsegs p))
+       ;; Check for wraparound
+       (setq ip1 (1+ i))
+       (if (= ip1 (w3-image-poly-nsegs p))
+           (setq ip1 0))
+
+       (setq l1 (cons (vector (w3-image-poly-x-coord p i)
+                              (w3-image-poly-y-coord p i))
+                      (vector (w3-image-poly-x-coord p ip1)
+                              (w3-image-poly-y-coord p ip1))))
+
+       (if (w3-image-line-intersect l1 l2)
+           (setq hitcount (1+ hitcount)))
+       (setq i (1+ i)))
+      (= 1 (% hitcount 2)))))
+
+(defun w3-point-in-default (point &rest ignore)
+  t)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun w3-point-in-map (point map &optional alt-text)
+  (let (func args done cur default slot)
+    (setq slot (if alt-text 3 2))
+    (while (and map (not done))
+      (setq cur (car map)
+           func (intern-soft (format "w3-point-in-%s" (aref cur 0)))
+           args (aref cur 1)
+           done (and func (fboundp func) (apply func point args))
+           map (cdr map))
+      (if (equal (aref cur 0) "default")
+         (setq default (aref cur slot)
+               done nil)))
+    (cond
+     ((and done (aref cur 2)) ; Found a link
+      (if alt-text
+         (or (aref cur 3) (aref cur 2))
+       (aref cur slot)))
+     (default
+       default)
+     (t nil))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Regular image stuff
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar w3-allowed-image-types
+  (mapcar (function (lambda (x) (list (car x)))) w3-image-mappings))
+(defvar w3-image-size-restriction nil)
+
+(defmacro w3-image-cached-p (href)
+  "Return non-nil iff HREF is in the image cache."
+  (` (cdr-safe (assoc (, href) w3-graphics-list))))
+
+(defun w3-image-loadable-p (href force)
+  (let ((attribs (url-file-attributes href)))
+    (or force
+       (assoc (nth 8 attribs) w3-allowed-image-types)
+       (null w3-image-size-restriction)
+       (<= (nth 7 attribs) 0)
+       (and (numberp w3-image-size-restriction)
+            (<= (nth 7 attribs) w3-image-size-restriction)))))
+
+(defmacro w3-image-invalid-glyph-p (glyph)
+  (` (or (null (aref (, glyph) 0))
+        (null (aref (, glyph) 2))
+        (equal (aref (, glyph) 2) ""))))
+
+;; data structure in storage is a vector
+;; if (href == t) then no action should be taken
+;; [ type coordinates href (hopefully)descriptive-text]
+
+
+(provide 'w3-imap)
diff --git a/lisp/w3-jscript.el b/lisp/w3-jscript.el
new file mode 100644
index 0000000..0020f98
--- /dev/null
+++ b/lisp/w3-jscript.el
@@ -0,0 +1,30 @@
+;;; w3-elisp.el --- Scripting support for javascript
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:10 $
+;; Version: $Revision: 1.1 $
+;; Keywords: hypermedia, scripting
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1997 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; FIXME!  Well, actually IMPLEMENTME!
+
+(provide 'w3-jscript)
diff --git a/lisp/w3-keyword.el b/lisp/w3-keyword.el
new file mode 100644
index 0000000..3e11f87
--- /dev/null
+++ b/lisp/w3-keyword.el
@@ -0,0 +1,124 @@
+;;; w3-keyword.el --- Emacs-W3 binding style sheet mechanism
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:10 $
+;; Version: $Revision: 1.1 $
+;; Keywords: hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Lots of generic keywords for use by Emacs-W3
+;;;
+;;; This is in a separate file just for sanity's sake - I cannot rely on
+;;; keywords being automatically recognized (ala XEmacs), and doing a
+;;; defconst doesn't work either, because the byte-compiler gets too
+;;; smart for us, and the .elc files are no longer portable.  Joy oh joy!
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(let ((keywords '(
+                 :align
+                 :average-pitch
+                 :link-title
+                 :background
+                 :center
+                 :data
+                 :depth
+                 :left-volume
+                 :right-volume
+                 :pitch-range
+                 :stress
+                 :richness
+                 :figalt
+                 :figdata
+                 :fillcol
+                 :form
+                 :formnum
+                 :gain
+                 :header-start
+                 :help-echo
+                 :href
+                 :link-args
+                 :image
+                 :lists
+                 :map
+                 :name
+                 :needspace
+                 :next-break
+                 :nofill
+                 :nowrap
+                 :optarg
+                 :options
+                 :pre-start
+                 :select
+                 :secret
+                 :table
+                 :text-mangler
+                 :title
+                 :w3-graphic
+                 :w3-form-data
+                 :zone
+                 :label-text
+                 :seen-this-url
+
+                 ;; These are duplicated from the font.el code
+                 ;; so that we can share .elc files...
+
+                 :family
+                 :weight
+                 :extra-light
+                 :light
+                 :demi-light
+                 :medium
+                 :normal
+                 :demi-bold
+                 :bold
+                 :extra-bold
+                 :style
+                 :size
+                 :registry
+                 :encoding
+
+                 ;; These are duplicated from the widget code
+                 ;; so that we can share .elc files
+                 :from
+                 :action
+                 :to
+                 :group
+                 :args
+                 :tag
+                 :tab-order
+                 :notify
+                 :ignore-case
+                 :parent
+                 :type
+                 :src
+                 :active-face
+                 :visited-face
+                 :emacspeak-help
+                 :target
+  )))
+  (while keywords
+    (or (boundp (car keywords))
+       (set (car keywords) (car keywords)))
+    (setq keywords (cdr keywords))))
+
+(provide 'w3-keyword)
diff --git a/lisp/w3-latex.el b/lisp/w3-latex.el
new file mode 100644
index 0000000..e57651a
--- /dev/null
+++ b/lisp/w3-latex.el
@@ -0,0 +1,461 @@
+;;; w3-latex.el --- Emacs-W3 printing via LaTeX
+;; Author: wmperry
+;; Created: 1996/06/30 18:08:34
+;; Version: 1.3
+;; Keywords: hypermedia, printing, typesetting
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996, 1997 by Stephen Peters <address@hidden>
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Elisp code to convert a W3 parse tree into a LaTeX buffer.
+;;;
+;;; Heavily hacked upon by William Perry <address@hidden> to add more
+;;; bells and whistles.
+;;;
+;;; KNOWN BUGS:
+;;; 1) This does not use stylesheets to get the formatting information
+;;; 2) This means that the new drawing routines need to be abstracted
+;;;    further so that the same main engine can be used for either
+;;;    text-output (standard stuff in w3-draw), LaTeX output (this file),
+;;;    Postscript (to-be-implemented), etc., etc.
+;;; 3) This still doesn't handle tables.
+;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'w3-cus)
+(require 'w3-print)
+
+;; Internal variables - do not touch!
+(defvar w3-latex-current-url nil "What URL we are formatting")
+(defvar w3-latex-verbatim nil "Whether we are in a {verbatim} block or not")
+(defvar w3-latex-links-list nil "List of links for endnote usage")
+
+(defvar w3-latex-entities
+  '((nbsp . "~")
+    (iexcl . "!`")
+;   (cent . "")
+    (pound . "\\pounds ")
+;   (curren . "")
+;   (yen . "")
+    (brvbar . "|")
+    (sect . "\\S")
+    (uml . "\\\"{ }")
+    (copy . "\\copyright ")
+;   (ordf . "")
+    (laquo . "$\\ll$")
+    (not . "\\neg")
+    (shy . "-")
+    (reg . "(R)")
+    (macr . "\\={ }")
+    (deg . "$\\deg$")
+    (plusmn . "$\\pm$")
+    (sup2 . "$^{2}$")
+    (sup3 . "$^{3}$")
+    (acute . "\\'{ }")
+    (micro . "$\\mu$")
+    (para . "\\P ")
+    (middot . "$\\cdot$")
+    (cedil . "\\c{ }")
+    (sup1 . "$^{1}$")
+;   (ordm . "")
+    (raquo . "$\\gg$")
+    (frac14 . "$\frac{1}{4}$")
+    (frac12 . "$\frac{1}{2}$")
+    (frac34 . "$\frac{3}{4}$")
+    (iquest . "?`")
+    (Agrave . "\\`{A}")
+    (Aacute . "\\'{A}")
+    (Acirc . "\\^{A}")
+    (Atilde . "\\~{A}")
+    (Auml . "\\\"{A}")
+    (Aring . "\\AA ")
+    (AElig . "\\AE ")
+    (Ccedil . "\\c{C}")
+    (Egrave . "\\`{E}")
+    (Eacute . "\\'{E}")
+    (Ecirc . "\\^{E}")
+    (Euml . "\\\"{E}")
+    (Igrave . "\\`{I}")
+    (Iacute . "\\'{I}")
+    (Icirc . "\\^{I}")
+    (Iuml . "\\\"{I}")
+;   (ETH . "")
+    (Ntilde . "\\~{N}")
+    (Ograve . "\\`{O}")
+    (Oacute . "\\'{O}")
+    (Ocirc . "\\^{O}")
+    (Otilde . "\\~{O}")
+    (Ouml . "\\\"{O}")
+    (times . "$\\times$")
+    (Oslash . "\\O")
+    (Ugrave . "\\`{U}")
+    (Uacute . "\\'{U}")
+    (Ucirc . "\\^{U}")
+    (Uuml . "\\\"{U}")
+    (Yacute . "\\'{Y}")
+;   (THORN . "")
+    (szlig . "\\ss ")
+    (agrave . "\\`{a}")
+    (aacute . "\\'{a}")
+    (acirc . "\\^{a}")
+    (atilde . "\\~{a}")
+    (auml . "\\\"{a}")
+    (aring . "\\aa ")
+    (aelig . "\\ae ")
+    (ccedil . "\\c{c}")
+    (egrave . "\\`{e}")
+    (eacute . "\\'{e}")
+    (ecirc . "\\^{e}")
+    (euml . "\\\"{e}")
+    (igrave . "\\`{i}")
+    (iacute . "\\'{i}")
+    (icirc . "\\^{i}")
+    (iuml . "\\\"{i}")
+;   (eth . "")
+    (ntilde . "\\~{n}")
+    (ograve . "\\`{o}")
+    (oacute . "\\'{o}")
+    (ocirc . "\\^{o}")
+    (otilde . "\\~{o}")
+    (ouml . "\\\"{o}")
+    (divide . "$\\div$")
+    (oslash . "\\o")
+    (ugrave . "\\`{u}")
+    (uacute . "\\'{u}")
+    (ucirc . "\\^{u}")
+    (uuml . "\\\"{u}")
+    (yacute . "\\'{y}")
+;   (thorn . "")
+    (yuml . "\\\"{y}"))
+  "Defines mappings between `w3-html-entities' and LaTeX characters.") 
+
+(defun w3-latex-replace-entities (str)
+  (let ((start 0))
+    (while (string-match "[\200-\377]" str start)
+      ; get the character code, and then search for a match in
+      ; w3-html-entities.  If one is found, use it to perform a lookup
+      ; in w3-latex-entities, and use the resulting match to replace
+      ; the character.
+      (let* ((match (rassq (aref str (match-beginning 0))
+                          w3-html-entities))
+            (replace (and match
+                          (assq (car match) w3-latex-entities))))
+       (if replace
+           (setq str (replace-match (cdr replace) t t str)))
+       (setq start (match-end 0))))
+    str))
+
+(defun w3-latex-insert-string (str)
+  ;;; convert string to a LaTeX-compatible one.
+  (let ((todo (list (cons "\\\\"          "-BaCkSlAsH-")
+                   (cons "[%&#_{}$]"     "\\\\\\&")
+                   (cons "\\^"           "{\\\\textasciicircum}")
+                   (cons "~"             "{\\\\textasciitilde}")
+                   (cons "[*]"           "{\\&}")
+                   (cons "[><|]"         "$\\&$")
+                   (cons "-BaCkSlAsH-"   "$\\\\backslash$"))))
+    (if w3-latex-verbatim
+       (setq todo (append todo '(("\n" . "\\\\newline\\\\nullspace\n")
+                                 (" " . "\\\\ ")))))
+    (save-excursion
+      (set-buffer (get-buffer-create " *w3-latex-munging*"))
+      (erase-buffer)
+      (insert str)
+      (while todo
+       (goto-char (point-min))
+       (while (re-search-forward (caar todo) nil t)
+         (replace-match (cdar todo)))
+       (setq todo (cdr todo)))
+      (setq str (w3-latex-replace-entities (buffer-string))))
+    (insert str)))
+
+(defun w3-latex-ignore (tree)
+  ;;; ignores any contents of this tree.
+  nil)
+
+(defun w3-latex-contents (tree)
+  ;;; passes contents of subtree through to the latex-subtree
+  (let ((contents (car (cdr (cdr tree)))))
+    (while contents
+      (w3-latex-subtree (car contents))
+      (setq contents (cdr contents)))))
+
+(defun w3-latex-html (tree)
+  (insert "% This document automatically generated by Emacs-W3 v"
+         w3-version-number "\n")
+  (if w3-latex-current-url
+      (insert "% from <URL:" w3-latex-current-url ">\n"))
+  (insert "%\n"
+         "\\batchmode\n\\begin{document}\n")
+  (insert "\\setlength{\\parindent}{0pt}\n"
+         "\\setlength{\\parskip}{1.5ex}\n")
+  (insert "\\newcommand{\\nullspace}{\\rule{0pt}{0pt}}")
+  (w3-latex-contents tree)
+  (if w3-latex-links-list (w3-latex-endnotes))
+  (insert "\\end{document}\n"))
+
+(defun w3-latex-title (tree)
+  (if w3-latex-use-maketitle
+      (insert "\\title{")
+    (insert "\\section*{\\centering "))
+  (w3-latex-contents tree)
+  (insert "}\n")
+  (if w3-latex-use-maketitle
+      (insert "\\author{}\\date{}\n\\maketitle")))
+
+(defun w3-latex-heading (tree)
+  ;; look through the additional markup to see if an align=right or
+  ;; align=center is in here...
+  (let ((align (assq 'align (car (cdr tree))))
+       (sym (car tree)))
+    (insert "\n\n")
+    (cond ((and align (string-equal (cdr align) "center"))
+          (insert "\\begin{center}\n"))
+         ((and align (string-equal (cdr align) "right"))
+          (insert "\\begin{flushright}\n")))
+    (cond ((eq sym 'h1) (insert "\\section*{"))
+         ((eq sym 'h2) (insert "\\subsection*{"))
+         ((eq sym 'h3) (insert "\\subsubsection*{"))
+         ((eq sym 'h4) (insert "\\subsubsection*{"))
+         ((eq sym 'h5) (insert "\\paragraph*{"))
+         ((eq sym 'h6) (insert "\\subparagraph*{")))
+    (w3-latex-contents tree)
+    (insert "}\n")
+    (cond ((and align (string-equal (cdr align) "center"))
+          (insert "\\end{center}\n"))
+         ((and align (string-equal (cdr align) "right"))
+          (insert "\\end{flushright}\n")))))
+
+(defun w3-latex-bold (tree)
+  (insert "{\\bf ")
+  (w3-latex-contents tree)
+  (insert "}"))
+(defun w3-latex-italic (tree)
+  (insert "{\\em ")
+  (w3-latex-contents tree)
+  (insert "}"))
+(defun w3-latex-typewriter (tree)
+  (insert "{\\tt ")
+  (w3-latex-contents tree)
+  (insert "}"))
+
+(defun w3-latex-list (tree)
+  (let* ((sym (car tree))
+        (list-type (cond ((eq sym 'ol) "enumerate")
+                         ((eq sym 'dl) "description")
+                         (t "itemize"))))
+    (insert (concat "\n\\begin{" list-type "}\n"))
+    (w3-latex-contents tree)
+    (insert (concat "\n\\end{" list-type "}\n"))))
+
+(defun w3-latex-list-item (tree)
+  (let ((sym (car tree)))
+    (cond ((eq sym 'dt)
+          (insert "\n\\item["))
+         ((eq sym 'dd)
+          ;; don't do anything for dd -- the item is handled by dt.
+          nil)
+         (t (insert "\n\\item")))
+    (w3-latex-contents tree)
+    (if (eq sym 'dt)
+       (insert "]"))))
+
+(defun w3-latex-center (tree)
+  (insert "\\begin{center}")
+  (w3-latex-contents tree)
+  (insert "\\end{center}"))
+
+(defun w3-latex-rule (tree)
+  ; use \par to make paragraph division clear.
+  (insert "\n\\par\\noindent\\rule{\\textwidth}{.01in}\n"))
+
+(defun w3-latex-para (tree)
+  ;; look through the additional markup to see if an align=right or
+  ;; align=center is in here...
+  (let ((align (assq 'align (car (cdr tree)))))
+    (cond ((and align
+               (string-equal (cdr align) "center"))
+          (w3-latex-center tree))
+         ((and align
+               (string-equal (cdr align) "right"))
+          (insert "\\begin{flushright}")
+          (w3-latex-contents tree)
+          (insert "\\end{flushright}"))
+         (t (insert "\\par ")
+            (w3-latex-contents tree)))))
+
+(defun w3-latex-quote (tree)
+  (insert "\\begin{quote}\n")
+  (w3-latex-contents tree)
+  (insert "\\end{quote}\n"))
+
+(defun w3-latex-break (tree)
+  ;; no content allowed
+  (insert "\\newline "))
+
+(defun w3-latex-endnotes ()
+  (let ((i 1))
+    (insert "\\begin{thebibliography}{99}\n")
+    (while w3-latex-links-list
+      (insert (concat "\\bibitem{ref" (number-to-string i) "}"))
+      (w3-latex-insert-string (car w3-latex-links-list))
+      (insert "\n")
+      (setq w3-latex-links-list (cdr w3-latex-links-list))
+      (setq i (1+ i)))
+    (insert "\\end{thebibliography}\n")))
+
+(defun w3-latex-href (tree)
+  (let ((href (cdr-safe (assq 'href (cadr tree))))
+       (name (cdr-safe (assq 'name (cadr tree)))))
+    (cond
+     ((not w3-latex-print-links)       ; No special treatment
+      (w3-latex-contents tree))
+     (name
+      (w3-latex-contents tree)
+      (insert (concat "\\label{" name "}")))
+     (href                             ; Special treatment requested
+;      (insert "\\underline{")         ; and we have a URL - underline
+      (w3-latex-contents tree)         ; it.
+;      (insert "}")
+      (cond 
+       ((char-equal ?# (aref href 0))
+       (insert (concat " (see page~\\pageref{"
+                       (substring href 1)
+                       "})")))
+       ((eq w3-latex-print-links 'footnote)
+       (insert "\\footnote{")          ; Request to prepare footnote 
+       (w3-latex-insert-string href)
+       (insert "}"))
+       (t                              ; Otherwise, prepare endnotes
+       (let ((mem (member href w3-latex-links-list))
+             (i (1+ (length w3-latex-links-list))))
+         (if mem
+             (setq i (- i (length mem)))
+           (setq w3-latex-links-list
+                 (append w3-latex-links-list (cons href nil))))
+         (insert (concat "~\\cite{ref" (number-to-string i) "}"))))))
+     (t                                        ; Special treatment requested, 
but
+      (w3-latex-contents tree)))))     ; no URL - do nothing.
+
+(defun w3-latex-preformatted (tree)
+  (let ((w3-latex-verbatim t))
+    (insert "\\par\\noindent\\begin{tt}")
+    (w3-latex-contents tree)
+    (insert "\\end{tt}\\par")
+    ))
+
+(defun w3-latex-xmp (tree)
+  (insert "\\begin{verbatim}")
+  (w3-latex-contents tree)
+  (insert "\\end{verbatim}"))
+
+(let ((todo '((title . w3-latex-title)
+             (html . w3-latex-html)
+             (pre . w3-latex-preformatted)
+             (xmp . w3-latex-xmp)
+             (h1 . w3-latex-heading)
+             (h2 . w3-latex-heading)
+             (h3 . w3-latex-heading)
+             (h4 . w3-latex-heading)
+             (h5 . w3-latex-heading)
+             (h6 . w3-latex-heading)
+             (a  . w3-latex-href)
+             (strong . w3-latex-bold)
+             (b . w3-latex-bold)
+             (dfn . w3-latex-bold)
+             (em . w3-latex-italic)
+             (i . w3-latex-italic)
+             (address . w3-latex-italic)
+             (code . w3-latex-typewriter)
+             (samp . w3-latex-typewriter) 
+             (tt . w3-latex-typewriter)
+             (kbd . w3-latex-typewriter) 
+             (var . w3-latex-typewriter)
+             (ol . w3-latex-list)
+             (dl . w3-latex-list)
+             (ul . w3-latex-list) 
+             (menu . w3-latex-list)
+             (dir . w3-latex-list)
+             (li . w3-latex-list-item)
+             (dt . w3-latex-list-item) 
+             (dd . w3-latex-list-item)
+             (center . w3-latex-center)
+             (hr . w3-latex-rule)
+             (p . w3-latex-para)
+             (br . w3-latex-break)
+             (blockquote . w3-latex-quote))))
+  (while todo
+    (put (caar todo) 'w3-latex-formatter (cdar todo))
+    (setq todo (cdr todo))))
+
+(defun w3-latex-subtree (tree)
+  (cond
+   ((stringp tree)
+    (w3-latex-insert-string tree))
+   ((stringp (car-safe tree))
+    (while tree
+      (w3-latex-insert-string (car tree))
+      (setq tree (cdr tree))))
+   ((symbolp (car tree))
+    (let ((proc (get (car tree) 'w3-latex-formatter)))
+      (if (and proc (fboundp proc))
+         (funcall proc tree)
+       ;; anything else gets passed through unchanged
+       (w3-latex-contents tree))))
+   (t
+    (w3-latex-contents tree))))
+
+;;;###autoload
+(defun w3-parse-tree-to-latex (tree &optional url)
+  ; assumes that url-working-buffer exists.
+  (set-buffer (get-buffer-create url-working-buffer))
+  (setq w3-latex-current-url url)
+  (erase-buffer)
+  (goto-char (point-min))
+  (if w3-latex-use-latex2e
+      (insert (concat "\\documentclass" w3-latex-docstyle "\n"))
+    (insert (concat "\\documentstyle" w3-latex-docstyle "\n")))
+  (if (and w3-latex-use-latex2e
+          w3-latex-packages)
+      (insert (apply 'concat
+                    (mapcar (lambda (x) (concat "\\usepackage{" x "}\n"))
+                            w3-latex-packages))))
+  (while tree
+    (w3-latex-subtree (car tree))
+    (setq tree (cdr tree))))
+
+(require 'mule-sysdp)
+
+;;;###autoload
+(defun w3-show-dvi ()
+  "Uses xdvi to show DVI file created from `w3-parse-tree-to-latex'."
+  (interactive)
+  (w3-parse-tree-to-latex w3-current-parse)
+  (save-window-excursion
+    (set-buffer url-working-buffer)
+    (mule-write-region-no-coding-system
+     (point-min) (point-max)
+     (expand-file-name "w3-tmp.latex"
+                      w3-temporary-directory) nil 5)
+    (shell-command
+     (format 
+      "(cd %s ; latex w3-tmp.latex ; latex w3-tmp.latex ; xdvi w3-tmp.dvi ; rm 
-f w3-tmp*) &"
+      w3-temporary-directory))))
+
+(provide 'w3-latex)
diff --git a/lisp/w3-menu.el b/lisp/w3-menu.el
new file mode 100644
index 0000000..6cf8c20
--- /dev/null
+++ b/lisp/w3-menu.el
@@ -0,0 +1,834 @@
+;;; w3-menu.el --- Menu functions for emacs-w3
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:11 $
+;; Version: $Revision: 1.1 $
+;; Keywords: menu, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'w3-vars)
+(require 'w3-mouse)
+(require 'widget)
+(require 'w3-keyword)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; InfoDock stuff
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(if (fboundp 'id-menubar-set)
+    (id-menubar-set 'w3-mode 'w3-menu-make-xemacs-menubar))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Spiffy new menus (for both Emacs and XEmacs)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar w3-menu-filters-supported-p
+  (or w3-running-xemacs (and (= emacs-major-version 20)
+                            (>= emacs-minor-version 3))))
+
+(defvar w3-menu-fsfemacs-bookmark-menu nil)
+(defvar w3-menu-fsfemacs-debug-menu nil)
+(defvar w3-menu-fsfemacs-edit-menu nil)
+(defvar w3-menu-fsfemacs-file-menu nil)
+(defvar w3-menu-fsfemacs-go-menu nil)
+(defvar w3-menu-fsfemacs-help-menu nil)
+(defvar w3-menu-fsfemacs-view-menu nil)
+(defvar w3-menu-fsfemacs-options-menu nil)
+(defvar w3-menu-fsfemacs-style-menu nil)
+(defvar w3-menu-fsfemacs-search-menu nil)
+(defvar w3-menu-w3-menubar nil)
+
+(defcustom w3-use-menus '(file edit view go bookmark options buffers style
+                              emacs nil help)
+  "*Non-nil value causes W3 to provide a menu interface.
+A value that is a list causes W3 to install its own menubar.
+A value of 1 causes W3 to install a \"W3\" item in the Emacs menubar.
+
+If the value of w3-use-menus is a list, it should be a list of symbols.
+The symbols and the order that they are listed determine what menus
+will be in the menubar and how they are ordered.  Valid symbol values
+are:
+
+file           -- A list of file related commands
+edit           -- Various standard editing commands (copy/paste)
+view           -- Controlling various things about the document view
+go             -- Navigation control
+bookmark       -- Bookmark / hotlist control
+options                -- Various options
+buffers                -- The standard buffers menu
+emacs          -- A toggle button to switch back to normal emacs menus
+style          -- Control style information and who gets to set what
+search          -- Various search engines
+help           -- The help menu
+nil            -- ** special **
+
+If nil appears in the list, it should appear exactly once.  All
+menus after nil in the list will be displayed flushright in the
+menubar.
+
+NOTE!  The current port of Emacs to Windows NT/95 does not support
+buttons in the menubar, so the 'emacs' keyword is currently ignored
+on that platform."
+  :group 'w3-menus
+  :type '(set (const :tag "File related commands" :value file)
+             (const :tag "Standard editing commands" :value edit)
+             (const :tag "View document information" :value view)
+             (const :tag "Navigation" :value go)
+             (const :tag "Bookmarks" :value bookmark)
+             (const :tag "Options" :value options)
+             (const :tag "Buffer list" :value buffers)
+             (const :tag "Stylesheet information" :value style)
+             (const :tag "Search engines" :value search)
+             (const :tag "Toggle to default menus" :value emacs)
+             (const :tag "Separator" :value nil)
+             (const :tag "Help" :value help)))
+
+(defvar w3-menu-hotlist-menu nil)
+(defvar w3-menu-html-links-menu nil)
+(defvar w3-menu-links-menu nil)
+(make-variable-buffer-local 'w3-menu-links-menu)
+(make-variable-buffer-local 'w3-menu-html-links-menu)
+(make-variable-buffer-local 'w3-menu-hotlist-menu)
+
+(defun w3-menu-breakup (menu-desc max-len)
+  (if (> (length menu-desc) max-len)
+      (append (w3-first-n-items menu-desc max-len)
+             (list (cons "More..."
+                         (w3-menu-breakup (nthcdr max-len menu-desc) 
max-len))))
+    menu-desc))
+
+(defun w3-menu-dummy-menu (item)
+  (if w3-running-xemacs
+      (list (vector item nil nil))
+    (list "Ignored" (vector item nil nil))))
+      
+(defun w3-menu-hotlist-constructor (menu-items)
+  (easy-menu-define
+   w3-menu-hotlist-menu nil "Emacs/W3 Dynamic menu"
+   (or (cdr w3-html-bookmarks)
+       (let ((hot-menu nil)
+            (hot w3-hotlist))
+        (while hot
+          (setq hot-menu (cons (vector
+                                (w3-truncate-menu-item (car (car hot)))
+                                (list 'w3-fetch (car (cdr (car hot))))
+                                t) hot-menu)
+                hot (cdr hot)))
+        (or hot-menu (w3-menu-dummy-menu "No Hotlist")))))
+  w3-menu-hotlist-menu)
+
+(defun w3-menu-html-links-constructor (menu-items)
+  (let ((links (mapcar 'cdr w3-current-links))
+       (menu nil))
+    (if links
+       (setq links (delete*
+                    nil
+                    (reduce 'append links)
+                    :test-not (function
+                               (lambda (a b) ; arg order unknown
+                                 (member
+                                  (car (or a b))
+                                  w3-defined-link-types))))))
+    (while links
+      (let ((name (caar links))
+           (vals (cdar links))
+           (href nil)
+           (new nil))
+       (if (= (length vals) 1)
+           (setq vals (car vals)
+                 new (vector (or (plist-get vals 'title)
+                                 (capitalize name))
+                             (list 'w3-fetch (plist-get vals 'href)) t))
+         (setq new (cons (capitalize name)
+                         (mapcar (function
+                                  (lambda (x)
+                                    (setq href (plist-get x 'href))
+                                    (vector (or (plist-get x 'title) href)
+                                            (list 'w3-fetch href) t)))
+                                 vals))))
+       (setq links (cdr links)
+             menu (cons new menu))))
+    (easy-menu-define w3-menu-html-links-menu nil "Emacs/W3 dynamic menu"
+                     (or menu
+                         (w3-menu-dummy-menu "None")))
+    w3-menu-html-links-menu))
+
+(defun w3-menu-links-constructor (menu-items)
+  (let ((widgets (w3-only-links))
+       widget href menu)
+    (while widgets
+      (setq widget (car widgets)
+           widgets (cdr widgets)
+           href (widget-get widget :href)
+           menu (cons
+                 (vector (w3-truncate-menu-item
+                          (or (widget-get widget :title)
+                              (w3-fix-spaces
+                               (buffer-substring-no-properties
+                                (widget-get widget :from)
+                                (widget-get widget :to)))))
+                         (list 'url-maybe-relative href) t) menu)))
+    (setq menu (w3-menu-breakup menu w3-max-menu-length))
+    (easy-menu-define w3-menu-links-menu nil "Emacs/W3 dynamic menu"
+                     (or menu (w3-menu-dummy-menu "No links")))
+    w3-menu-links-menu))
+
+(defun w3-toggle-minibuffer ()
+  (interactive)
+  (cond
+   (w3-running-xemacs
+    (if (equal (frame-property (selected-frame) 'minibuffer) t)
+ 
+       ;; frame has a minibuffer, so remove it
+       ;; unfortunately, we must delete and redraw the frame
+       (let ((fp (frame-properties (selected-frame)))
+             (frame (selected-frame))
+             (buf (current-buffer)))
+         (select-frame
+          (make-frame (plist-put
+                       (plist-remprop
+                        (plist-remprop fp 'window-id) 'minibuffer)
+                       'minibuffer nil)))
+         (delete-frame frame)
+         (switch-to-buffer buf))
+      ;; no minibuffer so add one
+      (set-frame-property (selected-frame) 'minibuffer t)))
+   (t nil)))
+
+(defun w3-toggle-location ()
+  (interactive)
+  (cond
+   (w3-running-xemacs
+    (let ((on (specifier-instance has-modeline-p (selected-window))))
+      (set-specifier has-modeline-p (not on) (selected-window))))
+   (t nil)))
+   
+(defun w3-toggle-menubar ()
+  (interactive)
+  (cond
+   ;; XEmacs style
+   (w3-running-xemacs
+    (set-specifier menubar-visible-p (cons (current-buffer)
+                                          (not (specifier-instance
+                                                menubar-visible-p)))))
+   ;; Emacs 19 style
+   (t
+    (menu-bar-mode (if (w3-menubar-active) -1 1)))))
+
+(defun w3-location-active ()
+  (if w3-running-xemacs
+      (specifier-instance has-modeline-p (selected-window))
+    t))
+
+(defun w3-menubar-active ()
+  (if w3-running-xemacs
+      (and (featurep 'menubar) (specifier-instance menubar-visible-p))
+    (and (boundp 'menu-bar-mode) menu-bar-mode)))
+
+(defun w3-menu-global-menubar ()
+  (if w3-running-xemacs
+      (default-value 'default-menubar)
+    (lookup-key (current-global-map) [menu-bar])))
+
+(defconst w3-menu-file-menu
+  (list
+   "File"
+   ["Open Location..." w3-fetch t]
+   ["Open File..." w3-open-local t]
+   ["Open in New Window..." w3-fetch-other-frame t]
+   ["New Window" make-frame t]
+   "---"
+   ["Save" save-buffer t nil]
+   (list
+    "Save As..."
+    ["HTML" (w3-save-as "HTML Source") t]
+    ["Formatted Text" (w3-save-as "Formatted Text") t]
+    ["LaTeX" (w3-save-as "LaTeX Source") t]
+    ["PostScript" (w3-save-as "PostScript") t]
+    ["Binary" (w3-save-as "Binary") t]
+    )
+   "---"
+   (list
+    "Print As..."
+    ["PostScript" (w3-print-this-url nil "PostScript") t]
+    ["Formatted Text" (w3-print-this-url nil "Formatted Text") t]
+    ["HTML Source" (w3-print-this-url nil "HTML Source") t]
+    ["LaTeX'd" (w3-print-this-url nil "LaTeX'd") t]
+    )
+   (list
+    "Mail Document..."
+    ["HTML" (w3-mail-current-document nil "HTML Source") t]
+    ["Formatted Text" (w3-mail-current-document nil "Formatted Text") t]
+    ["PostScript" (w3-mail-current-document nil "PostScript") t]
+    ["LaTeX Source" (w3-mail-current-document nil "LaTeX Source") t]
+    )
+   (if w3-running-xemacs
+       "---:shadowDoubleEtchedIn"
+     "---")
+   ["Close" delete-frame (not (eq (next-frame) (selected-frame)))]
+   ["Exit"  save-buffers-kill-emacs t]
+   )
+  "W3 file menu list.")
+
+(defconst w3-menu-edit-menu
+  (list
+   "Edit"
+   ["Undo"                     advertised-undo            nil]
+   ["Cut"                      kill-region                nil]
+   ["Copy"                     copy-region-as-kill        t]
+   "----"
+   ["Search..."                        w3-search-forward       t]
+   ["Search Again..."          w3-search-again         w3-last-search-item]
+   "----"
+   (list
+    "Preferences"
+    (if (fboundp 'custom-menu-create)
+       (custom-menu-create 'w3)
+      ["W3" ignore nil])
+    (if (fboundp 'custom-menu-create)
+       (custom-menu-create 'url)
+      ["URL" ignore nil])
+    )
+   )
+  "W3 edit menu list.")
+
+(defconst w3-menu-view-menu
+  (list
+   "View"
+   ["Document Information" w3-document-information t]
+   ["Document Source" w3-source-document t]
+   ["Document Errors" w3-display-errors w3-current-badhtml]
+   ["Load Images" w3-load-delayed-images w3-delayed-images]
+   "----"
+   ["Refresh" w3-refresh-buffer w3-current-parse]
+   ["Reload" w3-reload-document (and (url-view-url t)
+                                    (not (equal (url-view-url t) "")))]
+   "----"
+   ["Show URL" url-view-url t]
+   ["Show URL At Point" w3-view-this-url t]
+   "----"
+   )
+  "W3 menu view list.")
+
+(defconst w3-menu-debug-menu
+  (list
+   "Debugging"
+   ["View Parse Tree" (w3-display-parse-tree w3-current-parse)
+    w3-current-parse]
+   ["View Stylesheet" w3-display-stylesheet w3-current-stylesheet]
+   ["Reload Stylesheets" w3-refresh-stylesheets t]
+   )
+  "W3 menu debug list.")
+
+(defconst w3-menu-go-menu
+  (list
+   "Go"
+   ["Forward" w3-history-forward (cdr (w3-history-find-url-internal 
(url-view-url t)))]
+   ["Back" w3-history-backward (car (w3-history-find-url-internal 
(url-view-url t)))]
+   ["Home" w3 w3-default-homepage]
+   ["View History..." w3-show-history-list url-keep-history]
+   "----"
+   (if w3-menu-filters-supported-p
+       '("Links" :filter w3-menu-links-constructor)
+     ["Links..." w3-menu-e19-show-links-menu t])
+   (if w3-menu-filters-supported-p
+       '("Navigate" :filter w3-menu-html-links-constructor)
+     ["Navigate..." w3-menu-e19-show-navigate-menu t])
+   )
+  "W3 menu go list.")
+
+(defconst w3-menu-bookmark-menu
+  (list
+   "Bookmark"
+   ["View Bookmarks..." w3-show-hotlist w3-hotlist]
+   ["Add Bookmark" w3-hotlist-add-document t]
+   ["Delete Bookmark" w3-hotlist-delete t]
+   ["Rename Bookmark" w3-hotlist-rename-entry t]
+   ["Append Bookmark List" w3-hotlist-append t]
+   "----"
+   ["Add Keyword" w3-hotindex-add-key t]
+   ["Remove Keyword" w3-hotindex-rm-key t]
+   ["Query Keyword" w3-hotindex-query t]
+   "----"
+   (if w3-menu-filters-supported-p
+       '("Bookmarks" :filter w3-menu-hotlist-constructor)
+     ["Bookmarks" w3-menu-e19-show-hotlist-menu t])
+   )
+  "W3 menu bookmark list.")
+
+(defconst w3-menu-options-menu
+  (list "Options"
+       ["Edit Preferences" (customize-browse 'w3) t]
+       "---"
+       ["Show Menubar" w3-toggle-menubar
+        :style toggle :selected (w3-menubar-active)]
+       (if (and w3-running-xemacs (featurep 'toolbar))
+           ["Show Toolbar" w3-toggle-toolbar
+            :style toggle :selected (w3-toolbar-active)]
+         ["Show Toolbar" w3-toggle-toolbar nil])
+       (if w3-running-xemacs
+           ["Show Location" w3-toggle-location
+            :style toggle :selected (w3-location-active)]
+         ["Show Location" w3-toggle-location nil])
+       (if w3-running-xemacs
+           ["Show Status Bar" w3-toggle-minibuffer
+            :style toggle
+            :selected (eq (frame-property (selected-frame) 'minibuffer) t)
+            ]
+         ["Show Status Bar" w3-toggle-minibuffer nil])
+       ["Incremental Display"
+        (setq w3-do-incremental-display (not w3-do-incremental-display))
+        :style toggle :selected w3-do-incremental-display]
+       "----"
+       ["Auto Load Images"
+        (setq w3-delay-image-loads (not w3-delay-image-loads))
+        :style toggle :selected (not w3-delay-image-loads)]
+       ["Flush Image Cache" (setq w3-graphics-list nil) w3-graphics-list]
+       "----"
+       ["Download to disk" (setq w3-dump-to-disk (not w3-dump-to-disk))
+        :style toggle :selected w3-dump-to-disk]
+       ["Caching" (setq url-automatic-caching (not url-automatic-caching))
+        :style toggle :selected url-automatic-caching]
+       ["Use Cache Only"
+        (setq url-standalone-mode (not url-standalone-mode))
+        :style toggle :selected url-standalone-mode]
+       "----"
+       ["Save Options" w3-menu-save-options t]
+       )
+  "W3 menu options list.")
+
+(defconst w3-menu-style-menu
+  (list
+   "Style"
+   ["Allow Document Stylesheets" (setq w3-honor-stylesheets
+                                      (not w3-honor-stylesheets))
+    :style toggle :selected w3-honor-stylesheets]
+   ["Honor Color Requests" (setq w3-user-colors-take-precedence
+                                (not w3-user-colors-take-precedence))
+    :style toggle :selected (not w3-user-colors-take-precedence)]
+   ["Honor Font Requests" (setq w3-user-fonts-take-precedence
+                                (not w3-user-fonts-take-precedence))
+    :style toggle :selected (not w3-user-fonts-take-precedence)]
+   "---"
+   ["Reload Stylesheets" w3-refresh-stylesheets t]
+   )
+  "W3 menu style list.")
+
+(defconst w3-menu-buffer-menu
+  (if w3-running-xemacs
+      '("Buffers"
+       :filter buffers-menu-filter
+       ["List All Buffers" list-buffers t]
+       "--!here")
+    nil)
+  "W3 menu buffer list.")
+
+(defconst w3-menu-search-menu
+  (list
+   "Search"
+   ["Yahoo!"    (w3-fetch "http://www.yahoo.com/";) t]
+   ["Excite"    (w3-fetch "http://www.excite.com/";) t]
+   ["AltaVista" (w3-fetch "http://www.altavista.digital.com/";) t]
+   ["FTP Search" (w3-fetch "http://ftpsearch.ntnu.no/home.html";) t]
+   "---"
+   )
+  "W3 search menu")
+
+(defconst w3-menu-emacs-button
+  (vector
+   (if w3-running-xemacs "XEmacs" "Emacs") 'w3-menu-toggle-menubar t))
+
+(defconst w3-menu-help-menu
+  (list
+   "Help"
+   ["About Emacs-w3" (w3-fetch "about:") t]
+   ["Manual" (w3-fetch (concat w3-documentation-root "docs/w3_toc.html")) t]
+   "---"
+   ["Version Information..."
+    (w3-fetch
+     (concat w3-documentation-root "help/version_" w3-version-number ".html"))
+    t]
+   ["On FAQ" (w3-fetch (concat w3-documentation-root "help/FAQ.html")) t]
+   "---"
+   ["Mail Developer(s)" w3-submit-bug t]
+   )
+  "W3 menu help list.")
+
+(defvar w3-mode-menu-map nil)
+
+(defun w3-menu-initialize-w3-mode-menu-map ()
+  (if (null w3-mode-menu-map)
+      (let ((map (make-sparse-keymap))
+           (dummy (make-sparse-keymap)))
+       (require 'easymenu)
+       ;; initialize all the w3-menu-fsfemacs-*-menu variables
+       ;; with the menus.
+       (easy-menu-define w3-menu-fsfemacs-bookmark-menu (list dummy) nil
+                         w3-menu-bookmark-menu)
+       (easy-menu-define w3-menu-fsfemacs-debug-menu (list dummy) nil
+                         w3-menu-debug-menu)
+       (easy-menu-define w3-menu-fsfemacs-edit-menu (list dummy) nil
+                         w3-menu-edit-menu)
+       (easy-menu-define w3-menu-fsfemacs-file-menu (list dummy) nil
+                         w3-menu-file-menu)
+       (easy-menu-define w3-menu-fsfemacs-go-menu (list dummy) nil
+                         w3-menu-go-menu)
+       (easy-menu-define w3-menu-fsfemacs-help-menu (list dummy) nil
+                         w3-menu-help-menu)
+       (easy-menu-define w3-menu-fsfemacs-view-menu (list dummy) nil
+                         w3-menu-view-menu)
+       (easy-menu-define w3-menu-fsfemacs-options-menu (list dummy) nil
+                         w3-menu-options-menu)
+       (easy-menu-define w3-menu-fsfemacs-style-menu (list dummy) nil
+                         w3-menu-style-menu)
+       (easy-menu-define w3-menu-fsfemacs-search-menu (list dummy) nil
+                         w3-menu-search-menu)
+
+       ;; block the global menubar entries in the map so that W3
+       ;; can take over the menubar if necessary.
+       (define-key map [rootmenu] (make-sparse-keymap))
+       (define-key map [rootmenu w3] (cons "W3" (make-sparse-keymap "W3")))
+       (define-key map [rootmenu w3 file] 'undefined)
+       (define-key map [rootmenu w3 files] 'undefined)
+       (define-key map [rootmenu w3 search] 'undefined)
+       (define-key map [rootmenu w3 edit] 'undefined)
+       (define-key map [rootmenu w3 options] 'undefined)
+       (define-key map [rootmenu w3 buffer] 'undefined)
+       (define-key map [rootmenu w3 tools] 'undefined)
+       (define-key map [rootmenu w3 help] 'undefined)
+       (define-key map [rootmenu w3 help-menu] 'undefined)
+       ;; now build W3's menu tree.
+       (let ((menu-alist
+              '(
+                (bookmark
+                 (cons "Bookmark" w3-menu-fsfemacs-bookmark-menu))
+                (debug
+                 (cons "Debug" w3-menu-fsfemacs-debug-menu))
+                (edit
+                 (cons "Edit" w3-menu-fsfemacs-edit-menu))
+                (file
+                 (cons "File" w3-menu-fsfemacs-file-menu))
+                (go
+                 (cons "Go" w3-menu-fsfemacs-go-menu))
+                (help
+                 (cons "Help" w3-menu-fsfemacs-help-menu))
+;;;             (buffers
+;;;              (cons "Buffers" (lookup-key global-map [menu-bar buffer])))
+                (options
+                 (cons "Options" w3-menu-fsfemacs-options-menu))
+                (view
+                 (cons "View" w3-menu-fsfemacs-view-menu))
+                (style
+                 (cons "Style" w3-menu-fsfemacs-style-menu))
+                (search
+                 (cons "Search" w3-menu-fsfemacs-search-menu))
+                (emacs
+                 ;; FIXME!!! Currently, win32 doesn't support buttons
+                 ;; in menubars, so we hack around it and ignore the
+                 ;; 'emacs keyword on that platform.  REMOVE THIS CODE
+                 ;; as soon as that is fixed.  19.35 timeframe?
+                 (if (eq (device-type) 'win32)
+                     nil
+                   (cons "[Emacs]" 'w3-menu-toggle-menubar)))))
+             cons
+             (vec (vector 'rootmenu 'w3 nil))
+             ;; menus appear in the opposite order that we
+             ;; define-key them.
+             (menu-list 
+              (if (consp w3-use-menus)
+                  (reverse w3-use-menus)
+                (list 'help nil 'emacs 'buffers 'options 'bookmark
+                      'go 'view 'edit 'file))))
+         (while menu-list
+           (if (null (car menu-list))
+               nil;; no flushright support in FSF Emacs
+             (aset vec 2 (intern (concat "w3-menu-fsfemacs-"
+                                         (symbol-name
+                                          (car menu-list)) "-menu")))
+             (setq cons (assq (car menu-list) menu-alist))
+             (if cons
+                 (define-key map vec (eval (car (cdr cons))))))
+           (setq menu-list (cdr menu-list))))
+       (setq w3-mode-menu-map map)
+       (run-hooks 'w3-menu-setup-hook))))
+
+(defun w3-menu-make-xemacs-menubar ()
+  (let ((menu-alist
+        '((bookmark . w3-menu-bookmark-menu)
+          (style    . w3-menu-style-menu)
+          (buffers  . w3-menu-buffer-menu)
+          (debug    . w3-menu-debug-menu)
+          (edit     . w3-menu-edit-menu)
+          (emacs    . w3-menu-emacs-button)
+          (file     . w3-menu-file-menu)
+          (go       . w3-menu-go-menu)
+          (help     . w3-menu-help-menu)
+          (options  . w3-menu-options-menu)
+          (search   . w3-menu-search-menu)
+          (view     . w3-menu-view-menu)
+          )
+        )
+       cons
+       (menubar nil)
+       (menu-list w3-use-menus))
+    (while menu-list
+      (if (null (car menu-list))
+         (setq menubar (cons nil menubar))
+       (setq cons (assq (car menu-list) menu-alist))
+       (if cons
+           (setq menubar (cons (symbol-value (cdr cons)) menubar))))
+      (setq menu-list (cdr menu-list)))
+    (nreverse menubar)))
+
+(defun w3-menu-install-menubar ()
+  (cond
+   (w3-running-xemacs
+    (cond
+     ((not (featurep 'menubar)) nil)   ; No menus available
+     ((featurep 'infodock) nil)                ; InfoDock does it automatically
+     (t
+      (setq w3-menu-w3-menubar (w3-menu-make-xemacs-menubar))
+      (set-buffer-menubar w3-menu-w3-menubar))))
+   ((not (fboundp 'w3-menu-fsfemacs-bookmark-menu))
+    (w3-menu-initialize-w3-mode-menu-map)
+    (define-key w3-mode-map [menu-bar]
+      (lookup-key w3-mode-menu-map [rootmenu w3])))))
+
+(defun w3-menu-install-menubar-item ()
+  (cond
+   (w3-running-xemacs
+    (if (not (featurep 'menubar))
+       nil                             ; No menus available
+      (set-buffer-menubar (copy-sequence (w3-menu-global-menubar)))
+      (add-menu nil "W3" (cdr w3-menu-w3-menubar))))
+   ((not (fboundp 'w3-menu-fsfemacs-edit-menu))
+    (w3-menu-initialize-w3-mode-menu-map)
+    (define-key w3-mode-map [menu-bar]
+      (lookup-key w3-mode-menu-map [rootmenu])))))
+
+(defun w3-menu-install-menus ()
+  (cond ((= emacs-minor-version 28)    ; Hey, get with the times people!!
+        nil)
+       ((consp w3-use-menus)
+        (w3-menu-install-menubar))
+       ((eq w3-use-menus 1)
+        (w3-menu-install-menubar-item))
+       (t nil)))
+
+(defun w3-menu-set-menubar-dirty-flag ()
+  (cond (w3-running-xemacs
+        (set-menubar-dirty-flag))
+       (t
+        (force-mode-line-update))))
+
+(defun w3-menu-toggle-menubar ()
+  (interactive)
+  (cond
+   ;;((eq w3-use-menus 1)
+   ;;nil)
+   (w3-running-xemacs
+    (if (null (car (find-menu-item current-menubar '("XEmacs"))))
+       (set-buffer-menubar w3-menu-w3-menubar)
+      (set-buffer-menubar (copy-sequence (w3-menu-global-menubar)))
+      (condition-case ()
+         (add-menu-button nil ["W3" w3-menu-toggle-menubar t] nil)
+       (void-function
+        (add-menu-item nil "W3" 'w3-menu-toggle-menubar t))))
+    (w3-menu-set-menubar-dirty-flag))
+   (t
+    (if (not (eq (lookup-key w3-mode-map [menu-bar])
+                (lookup-key w3-mode-menu-map [rootmenu w3])))
+       (define-key w3-mode-map [menu-bar]
+         (lookup-key w3-mode-menu-map [rootmenu w3]))
+      (define-key w3-mode-map [menu-bar]
+       (make-sparse-keymap))
+      (define-key w3-mode-map [menu-bar w3]
+       (cons "[W3]" 'w3-menu-toggle-menubar)))
+    (w3-menu-set-menubar-dirty-flag))))
+
+(defun w3-menu-save-options ()
+  (interactive)
+  (let ((output-buffer (find-file-noselect w3-default-configuration-file))
+       output-marker)
+    (save-excursion
+      (set-buffer output-buffer)
+      ;;
+      ;; Find and delete the previously saved data, and position to write.
+      ;;
+      (goto-char (point-min))
+      (if (re-search-forward "^;; W3 Options Settings *\n" nil 'move)
+         (let ((p (match-beginning 0)))
+           (goto-char p)
+           (or (re-search-forward
+                "^;; End of W3 Options Settings *\\(\n\\|\\'\\)"
+                nil t)
+               (error "can't find END of saved state in .emacs"))
+           (delete-region p (match-end 0)))
+       (goto-char (point-max))
+       (insert "\n"))
+      (setq output-marker (point-marker))
+      (let ((print-readably t)
+           (print-escape-newlines t)
+           (standard-output output-marker))
+       (princ ";; W3 Options Settings\n")
+       (princ ";; ===================\n")
+       (mapcar (function
+                (lambda (var)
+                  (princ "  ")
+                  (if (and (symbolp var) (boundp var))
+                      (prin1 (list 'setq-default var
+                                   (let ((val (symbol-value var)))
+                                     (if (or (memq val '(t nil))
+                                             (and (not (symbolp val))
+                                                  (not (listp val))))
+                                         val
+                                       (list 'quote val))))))
+                  (if var (princ "\n"))))
+               '(
+                 ps-print-color-p
+                 url-automatic-caching
+                 url-be-asynchronous
+                 url-honor-refresh-requests
+                 url-privacy-level
+                 url-cookie-confirmation
+                 url-proxy-services
+                 url-standalone-mode
+                 url-use-hypertext-gopher
+                 w3-default-homepage
+                 w3-default-stylesheet
+                 w3-delay-image-loads
+                 w3-do-incremental-display
+                 w3-dump-to-disk
+                 w3-honor-stylesheets
+                 w3-image-mappings
+                 w3-load-hook
+                 w3-mode-hook
+                 w3-netscape-compatible-comments
+                 w3-preferences-cancel-hook
+                 w3-preferences-default-hook
+                 w3-preferences-ok-hook
+                 w3-preferences-setup-hook
+                 w3-source-file-hook
+                 w3-toolbar-orientation
+                 w3-toolbar-type
+                 w3-use-menus
+                 w3-user-colors-take-precedence
+                 )
+               )
+       (princ ";; ==========================\n")
+       (princ ";; End of W3 Options Settings\n")))
+    (set-marker output-marker nil)
+    (save-excursion
+      (set-buffer output-buffer)
+      (save-buffer))
+    ))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Functions for emacs variations that do not support the :filter
+;;; keyword in menu items.  All versions of XEmacs that Emacs/W3 can
+;;; run on support this, but only really recent (20.3 or later)
+;;; versions of FSF Emacs support this.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-menu-e19-bogus-filter-constructor (name menu)
+  (let ((x nil)
+       (y nil))
+    (setq x (x-popup-menu t menu)
+         y (and x (lookup-key menu (apply 'vector x))))
+    (if (and x y)
+       (funcall y))))
+  
+(defun w3-menu-e19-show-hotlist-menu ()
+  (interactive)
+  (w3-menu-e19-bogus-filter-constructor "Hotlist"
+                                       (w3-menu-hotlist-constructor nil)))
+
+(defun w3-menu-e19-show-links-menu ()
+  (interactive)
+  (w3-menu-e19-bogus-filter-constructor "Links"
+                                       (w3-menu-links-constructor nil)))
+
+(defun w3-menu-e19-show-navigate-menu ()
+  (interactive)
+  (w3-menu-e19-bogus-filter-constructor "Navigate"
+                                       (w3-menu-html-links-constructor nil)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Context-sensitive popup menu
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(if (not (fboundp 'event-glyph))
+    (fset 'event-glyph 'ignore))
+
+(defun w3-menu-popup-menu (e menu)
+  (if w3-running-xemacs
+      (popup-menu menu)
+    (let ((bogus-menu nil))
+      (easy-menu-define bogus-menu nil nil menu)
+    (w3-menu-e19-bogus-filter-constructor "Popup" bogus-menu))))
+
+(defun w3-popup-menu (e)
+  "Pop up a menu of common w3 commands"
+  (interactive "e")
+  (if (not w3-popup-menu-on-mouse-3)
+      (call-interactively (lookup-key global-map (vector w3-mouse-button3)))
+    (mouse-set-point e)
+    (let* ((glyph (event-glyph e))
+          (widget (or (and glyph (glyph-property glyph 'widget))
+                      (widget-at (point))))
+          (parent (and widget (widget-get widget :parent)))
+          (href (or (and widget (widget-get widget :href))
+                    (and parent (widget-get parent :href))))
+          (imag (or (and widget (widget-get widget :src))
+                    (and parent (widget-get parent :src))))
+          (menu (copy-tree w3-popup-menu))
+          url val trunc-url)
+      (if href
+         (progn
+           (setq url href)
+           (if url (setq trunc-url (url-truncate-url-for-viewing
+                                    url
+                                    w3-max-menu-width)))
+           (setcdr menu (append (cdr menu)
+                                '("---")
+                                (mapcar
+                                 (function
+                                  (lambda (x)
+                                    (vector (format (car x) trunc-url)
+                                            (list (cdr x) url) t)))
+                                 w3-hyperlink-menu)))))
+      (if imag
+         (progn
+           (setq url imag
+                 trunc-url (url-truncate-url-for-viewing url
+                                                         w3-max-menu-width))
+           (setcdr menu (append (cdr menu)
+                                '("---")
+                                (mapcar
+                                 (function
+                                  (lambda (x)
+                                    (vector (format (car x) trunc-url)
+                                            (list (cdr x) url) t)))
+                                 w3-graphlink-menu)))))
+      (if (not (w3-menubar-active))
+         (setcdr menu (append (cdr menu)
+                              '("---" ["Show Menubar" w3-toggle-menubar t]))))
+      (w3-menu-popup-menu e menu))))
+
+(provide 'w3-menu)
diff --git a/lisp/w3-mouse.el b/lisp/w3-mouse.el
new file mode 100644
index 0000000..a7260d1
--- /dev/null
+++ b/lisp/w3-mouse.el
@@ -0,0 +1,92 @@
+;;; w3-menu.el --- Mouse specific functions for emacs-w3
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:11 $
+;; Version: $Revision: 1.1 $
+;; Keywords: mouse, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'w3-vars)
+
+(defun w3-follow-mouse-other-frame (e)
+  "Function suitable to being bound to a mouse key.  Follows the link under
+the mouse click, opening it in another frame."
+  (interactive "e")
+  (mouse-set-point e)
+  (w3-follow-link-other-frame))
+
+(defun w3-follow-inlined-image-mouse (e)
+  "Follow an inlined image from the mouse"
+  (interactive "e")
+  (mouse-set-point e)
+  (w3-follow-inlined-image))
+
+(defun w3-follow-inlined-image ()
+  "Follow an inlined image, regardless of whether it is a hyperlink or not."
+  (interactive)
+  (let ((widget (widget-at (point))))
+    (and (not widget) (error "No inlined image at point."))
+    (setq widget (widget-get widget :parent))
+    
+    (and (or (not widget)
+            (not (eq 'image (car widget))))
+        (error "No inlined image at point."))
+    (and (widget-get widget :src)
+        (w3-fetch (widget-get widget :src)))))
+
+(defvar w3-mouse-button1 (cond
+                         ((featurep 'infodock) nil)
+                         ((and w3-running-xemacs (featurep 'mouse)) 'button1)
+                         (w3-running-xemacs nil)
+                         (t 'down-mouse-1)))
+(defvar w3-mouse-button2 (cond
+                         ((featurep 'infodock) nil)
+                         ((and w3-running-xemacs (featurep 'mouse)) 'button2)
+                         (w3-running-xemacs nil)
+                         (t 'down-mouse-2)))
+(defvar w3-mouse-button3 (cond
+                         ((featurep 'infodock) nil)
+                         ((and w3-running-xemacs (featurep 'mouse)) 'button3)
+                         (w3-running-xemacs nil) 
+                         (t 'down-mouse-3)))
+
+(if w3-mouse-button3
+    (define-key w3-mode-map (vector w3-mouse-button3) 'w3-popup-menu))
+
+(if w3-mouse-button1
+    (define-key w3-netscape-emulation-minor-mode-map
+      (vector w3-mouse-button1) 'w3-widget-button-click))
+      
+(if w3-mouse-button2
+    (progn
+      (define-key w3-mode-map (vector (list 'meta w3-mouse-button2))
+       'w3-follow-mouse-other-frame)
+      (define-key w3-netscape-emulation-minor-mode-map
+       (vector w3-mouse-button2) 'w3-follow-mouse-other-frame)))
+
+(if (not w3-running-xemacs)
+    (progn
+      (define-key w3-mode-map [mouse-movement] 'w3-mouse-handler)
+      (if w3-popup-menu-on-mouse-3
+         (define-key w3-mode-map [down-mouse-3] 'w3-popup-menu))))
+  
+(provide 'w3-mouse)
diff --git a/lisp/w3-parse.el b/lisp/w3-parse.el
new file mode 100644
index 0000000..15f5b4b
--- /dev/null
+++ b/lisp/w3-parse.el
@@ -0,0 +1,2840 @@
+;; Created by: Joe Wells, address@hidden
+;; Created on: Sat Sep 30 17:25:40 1995
+;; Filename: w3-parse.el
+;; Purpose: Parse HTML and/or SGML for Emacs W3 browser.
+
+;; Copyright © 1995, 1996, 1997  Joseph Brian Wells
+;; Copyright © 1993, 1994, 1995 by William M. Perry <address@hidden>
+;; 
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2 of the License, or
+;; (at your option) any later version.
+;; 
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;; 
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+;;
+;; On November 13, 1995, the license was available at
+;; <URL:ftp://prep.ai.mit.edu/pub/gnu/COPYING-2.0>.  It may still be
+;; obtainable via that URL.
+
+
+;;;
+;;; Trying to make the best of an evil speed hack.
+;;;
+
+;; Explanation:
+
+;; Basically, this file provides one big function (w3-parse-buffer) and
+;; some data structures.  However, to avoid code redundancy, I have broken
+;; out some common subexpressions of w3-parse-buffer into separate
+;; functions.  I have declared these separate functions with "defsubst" so
+;; they will be inlined into w3-parse-buffer.  Also, I have defined them
+;; within eval-when-compile forms, so no definitions will be emitted into
+;; the .elc file for these separate functions.  (They will work normally
+;; when the uncompiled file is loaded.)
+
+;; Each of these subfunctions use some scratch variables in a purely local
+;; fashion.  In good software design, I would declare these variables as
+;; close to their use as possible with "let".  However, "let"-binding
+;; variables is *SLOW* in Emacs Lisp, even when compiled.  Since each of
+;; these functions is executed one or more time during each iteration of
+;; the main loop, I deemed this too expensive.  So the main function does
+;; the "let"-binding of these variables.  However, I still want to declare
+;; them close to their use, partially to keep the compiler from crying
+;; "Wolf!" when there is no danger (well, maybe a little danger :-), so I
+;; define some macros for this purpose.
+
+;; Also, there are some variables which are updated throughout the file
+;; (remember this is really all one function).  Some of the code which
+;; updates them is located inside the subfunctions.  So that the compiler
+;; will not complain, these variables are defined with defvar.
+
+(require 'w3-vars)
+(require 'mule-sysdp)
+
+(eval-when-compile
+  (defconst w3-p-s-var-list nil
+    "A list of the scratch variables used by functions called by
+w3-parse-buffer which it is w3-parse-buffer's responsibility to
+\"let\"-bind.")
+
+  (defmacro w3-p-s-var-def (var)
+    "Declare VAR as a scratch variable which w3-parse-buffer must
+\"let\"-bind."
+    (` (eval-when-compile
+         (defvar (, var))
+         (or (memq '(, var) w3-p-s-var-list)
+             (setq w3-p-s-var-list (cons '(, var) w3-p-s-var-list))))))
+
+  (defmacro w3-p-s-let-bindings (&rest body)
+    "\"let\"-bind all of the variables in w3-p-s-var-list in BODY."
+    (` (let (, w3-p-s-var-list)
+         (,@ body))))
+  (put 'w3-p-s-let-bindings 'lisp-indent-function 0)
+  (put 'w3-p-s-let-bindings 'edebug-form-spec t)
+
+  (defvar w3-p-d-current-element)
+  (put 'w3-p-d-current-element 'variable-documentation
+       "Information structure for the current open element.")
+  
+  (defvar w3-p-d-exceptions)
+  (put 'w3-p-d-exceptions 'variable-documentation
+       "Alist specifying elements (dis)allowed because of an (ex|in)clusion
+exception of some containing element (not necessarily the immediately
+containing element).  Each item specifies a transition for an element
+which overrides that specified by the current element's content model.
+Each item is of the form (TAG ACTION *same ERRORP).")
+  
+  (defvar w3-p-d-in-parsed-marked-section)
+  (put 'w3-p-d-in-parsed-marked-section 'variable-documentation
+       "Are we in a parsed marked section so that we have to scan for 
\"]]>\"?")
+
+  (defvar w3-p-d-non-markup-chars)
+  (put 'w3-p-d-non-markup-chars 'variable-documentation
+       "The characters that do not indicate the start of markup, in the format
+for an argument to skip-chars-forward.")
+
+  (defvar w3-p-d-null-end-tag-enabled)
+  (put 'w3-p-d-null-end-tag-enabled 'variable-documentation
+       "Is the null end tag (\"/\") enabled?")
+
+  (defvar w3-p-d-open-element-stack)
+  (put 'w3-p-d-open-element-stack 'variable-documentation
+       "A stack of the currently open elements, with the innermost enclosing
+element on top and the outermost on bottom.")
+
+  (defvar w3-p-d-shortrefs)
+  (put 'w3-p-d-shortrefs 'variable-documentation
+       "An alist of the magic entity reference strings in the current
+between-tags region and their replacements.  Each item is of the format
+\(REGEXP . REPLACEMENT-STRING\).  Although in SGML shortrefs normally name
+entities whose value should be used as the replacement, we have
+preexpanded the entities for speed.  We have also regexp-quoted the
+strings to be replaced, so they can be used with looking-at.  This should
+never be in an element's overrides field unless
+w3-p-d-shortref-chars is also in the field.")
+  
+  (defvar w3-p-d-shortref-chars)
+  (put 'w3-p-d-shortref-chars 'variable-documentation
+       "A string of the characters which can start shortrefs in the current
+between-tags region.  This must be in a form which can be passed to
+skip-chars-forward and must contain exactly the characters which start the
+entries in w3-p-d-shortrefs.  If this variable is mentioned in the
+overrides field of an element, its handling is magical in that the
+variable w3-p-d-non-markup-chars is saved to the element's undo-list and
+updated at the same time.  This should never be in an element's overrides
+field unless w3-p-d-shortrefs is also in the field.")
+  
+  (defvar w3-p-d-tag-name)
+  (put 'w3-p-d-tag-name 'variable-documentation
+       "Name of tag we are looking at, as an Emacs Lisp symbol.
+Only non-nil when we are looking at a tag.")
+
+  (defvar w3-p-d-end-tag-p)
+  (put 'w3-p-d-end-tag-p 'variable-documentation
+       "Is the tag we are looking at an end tag?
+Only non-nil when we are looking at a tag.")
+  
+  )
+
+
+;;;
+;;; HTML syntax error messages.
+;;;
+
+(eval-when-compile
+
+  (defvar w3-p-d-debug-url)
+  (put 'w3-p-d-debug-url 'variable-documentation
+       "Whether to print the URL being parsed before an error messages.
+Only true for the first error message.")
+
+  ;; The level parameter indicates whether the error is (1) very
+  ;; serious, must be displayed to all users, (2) invalid HTML, but the
+  ;; user should only be told if the user has indicated interest, or (3)
+  ;; valid HTML which is bad because it appears to rely on the way certain
+  ;; browsers will display it, which should only be displayed to the user
+  ;; if they have really asked for it.
+  
+  (defmacro w3-debug-html (&rest body)
+    "Emit a warning message.
+These keywords may be used at the beginning of the arguments:
+  :mandatory-if sexp -- force printing if sexp evaluates non-nil.
+  :bad-style         -- do not print unless w3-debug-html is 'style.
+  :outer             -- do not include the current element in the element
+                        context we report. 
+  :nocontext         -- do not include context where error detected.
+The remaining parameters are treated as the body of a progn, the value of
+which must be a string to use as the error message."
+    (let (mandatory-if bad-style outer nocontext condition)
+      (while (memq (car body) '(:mandatory-if :bad-style :outer :nocontext))
+        (cond ((eq ':mandatory-if (car body))
+               (setq mandatory-if (car (cdr body)))
+               (setq body (cdr (cdr body))))
+              ((eq ':bad-style (car body))
+               (setq bad-style t)
+               (setq body (cdr body)))
+              ((eq ':nocontext (car body))
+               (setq nocontext t)
+               (setq body (cdr body)))
+              ((eq ':outer (car body))
+               (setq outer t)
+               (setq body (cdr body)))))
+      (setq condition (if bad-style
+                          '(eq 'style w3-debug-html)
+                        'w3-debug-html))
+      (if mandatory-if
+          (setq condition
+                (` (or (, mandatory-if)
+                       (, condition)))))
+      (` (if (, condition)
+             (let ((message (progn (,@ body))))
+               (if message
+                   (w3-debug-html-aux message
+                                      (,@ (if nocontext
+                                              (list outer nocontext)
+                                            (if outer '(t)))))))))))
+
+  ;; This is unsatisfactory.
+  (put 'w3-debug-html 'lisp-indent-function 0)
+  
+  (put 'w3-debug-html 'edebug-form-spec
+       '([&rest &or ":nocontext" ":outer" [":mandatory-if" form] ":bad-style"]
+         &rest form))
+  )
+
+(defun w3-debug-html-aux (message &optional outer nocontext)
+  (push (if nocontext
+            message
+          (concat message
+                  ;; Display context information for each error
+                  ;; message.
+                  "\n  Containing elements: "
+                  (w3-open-elements-string (if outer 1))
+                  (concat
+                   "\n  Text around error: "
+                   (save-restriction
+                     (widen)
+                     (progn
+                       (insert "*ERROR*")
+                       (prog1
+                           (w3-quote-for-string
+                            (buffer-substring 
+                             (max (- (point) 27) (point-min))
+                             (min (+ (point) 20) (point-max))))
+                         (delete-char -7))))))) w3-current-badhtml))
+
+(defun w3-quote-for-string (string)
+  (save-excursion
+    (set-buffer (get-buffer-create " w3-quote-whitespace"))
+    (erase-buffer)
+    (insert string)
+    (goto-char (point-min))
+    (insert "\"")
+    (while (progn
+             (skip-chars-forward "^\"\\\t\n\r")
+             (not (eobp)))
+      (insert "\\" (cdr (assq (char-after (point)) '((?\" . "\"")
+                                                     (?\\ . "\\")
+                                                     (?\t . "t")
+                                                     (?\n . "n")
+                                                     (?\r . "r")))))
+      (delete-char 1))
+    (insert "\"")
+    (buffer-string)))
+
+
+;;;
+;;; General entity references and numeric character references.
+;;;
+
+;; *** MULE conversion?
+;; *** I18N HTML support?
+
+(let ((html-entities w3-html-entities))
+  (while html-entities
+    (put (car (car html-entities)) 'html-entity-expansion
+        (cons 'CDATA (if (integerp (cdr (car html-entities)))
+                          (char-to-string
+                           (mule-make-iso-character (cdr (car html-entities))))
+                       (cdr (car html-entities)))))
+    (setq html-entities (cdr html-entities))))
+
+;; These are handled differently than the normal HTML entities because
+;; we need to define the entities with 'nil instead of 'CDATA so
+;; that they are correctly scanned for new markup.
+;;
+;; from address@hidden
+;;
+;;> Of course, this differs from the specification a bit.  The W3C tech
+;;> report defines all of these as SYSTEM entities.  This potentially means
+;;> that they can be used in more contexts.  The method I outlined above
+;;> means "&smiley;" can only be used in contexts where IMG is a valid
+;;> element.  I am not sure exactly where it is okay to use a SYSTEM entity.
+;;> I think anywhere that data characters are accepted.
+;;
+;; I find this acceptable, as just what the hell are you supposed to do with
+;; &computer; as part of a value of a form input when you display it and/or
+;; submit it?!
+
+(let ((html-entities w3-graphic-entities)
+      (cur nil))
+  (while html-entities
+    (setq cur (car html-entities)
+          html-entities (cdr html-entities))
+    (put (nth 0 cur) 'html-entity-expansion
+        (cons 'nil (format "<img src=\"%s/%s%s\" alt=\"%s\">"
+                            w3-icon-directory
+                            (nth 1 cur)
+                            (if w3-icon-format
+                                (concat "." (symbol-name w3-icon-format))
+                              "")
+                            (or (nth 3 cur) (nth 2 cur)))))))
+
+;; These are the general entities in HTML 3.0 in terms of which the math
+;; shortrefs are defined:
+;; 
+;;   <!ENTITY REF1   STARTTAG   "SUP">
+;;   <!ENTITY REF2   ENDTAG     "SUP">
+;;   <!ENTITY REF3   STARTTAG   "SUB">
+;;   <!ENTITY REF4   ENDTAG     "SUB">
+;;   <!ENTITY REF5   STARTTAG   "BOX">
+;;   <!ENTITY REF6   ENDTAG     "BOX">
+;; 
+;; We're ignoring them because these names should really be local to the
+;; DTD and not visible in the document.  They might change at any time in
+;; future HTML standards.
+
+;; <!--Entities for language-dependent presentation (BIDI and contextual 
analysis) -->
+;; <!ENTITY zwnj CDATA "&#8204;"-- zero width non-joiner-->
+;; <!ENTITY zwj  CDATA "&#8205;"-- zero width joiner-->
+;; <!ENTITY lrm  CDATA "&#8206;"-- left-to-right mark-->
+;; <!ENTITY rlm  CDATA "&#8207;"-- right-to-left mark-->
+
+;; Entity names are case sensitive!
+
+;; & should only be recognized when followed by letter or # and
+;; digit or # and letter.
+
+(eval-when-compile
+
+  (w3-p-s-var-def w3-p-s-entity)
+  (w3-p-s-var-def w3-p-s-pos)
+  (w3-p-s-var-def w3-p-s-num)
+  ;; Destroys free variables:
+  ;;   w3-p-s-entity, w3-p-s-pos, w3-p-s-num
+  ;; Depends on case-fold-search being t.
+  (defsubst w3-expand-entity-at-point-maybe ()
+    ;; We are looking at a &.
+    ;; Only &A or &#1 or &#A syntax is special.
+    (cond
+     ((and (looking-at "&\\([a-z][-a-z0-9.]*\\)[\ ;\n]?") ; \n should be \r
+           ;; We are looking at a general entity reference, maybe undefined.
+           (setq w3-p-s-entity
+                 (get 
+                  (intern (buffer-substring (match-beginning 1) (match-end 1)))
+                  'html-entity-expansion)))
+
+      ;; If the reference was undefined, then for SGML, we should really
+      ;; issue a warning and delete the reference.  However, the HTML
+      ;; standard (contradicting the SGML standard) says to leave the
+      ;; undefined reference in the text.
+    
+      ;; We are looking at a defined general entity reference.
+      (replace-match "")
+      (cond ((eq 'CDATA (car w3-p-s-entity))
+             ;; Leave point after expansion so we don't rescan it.
+             (insert (cdr w3-p-s-entity)))
+            ((memq (car w3-p-s-entity) '(nil STARTTAG ENDTAG MS MD))
+             ;; nil is how I mark ordinary entities.
+             ;; The replacement text gets rescanned for all of these.
+             (setq w3-p-s-pos (point))
+             (insert (cdr (assq (car w3-p-s-entity)
+                                '((nil . "")
+                                  (STARTTAG . "<")
+                                  (ENDTAG . "</")
+                                  (MS . "<![")
+                                  (MD . "<!"))))
+                     (cdr w3-p-s-entity)
+                     (cdr (assq (car w3-p-s-entity)
+                                '((nil . "")
+                                  (STARTTAG . ">")
+                                  (ENDTAG . ">")
+                                  (MS . "]]>")
+                                  (MD . ">")))))
+             (goto-char w3-p-s-pos)
+             ;; *** Strictly speaking, if we parse anything from the
+             ;; replacement text, it must end before the end of the
+             ;; replacement text.
+             )
+            ((eq 'SDATA (car w3-p-s-entity))
+             (insert "[Unimplemented SDATA \"%s\"]" (cdr w3-p-s-entity)))
+            ((eq 'PI (car w3-p-s-entity))
+             ;; We are currently ignoring processing instructions.
+             ;; *** Strictly speaking, we should issue a warning if this
+             ;; occurs in a attribute value.
+             )
+            (t
+             ;; *** We don't handle external entities yet.
+             (error "[Unimplemented entity: \"%s\"]" w3-p-s-entity))))
+   
+     ((looking-at "&#[0-9][0-9]*\\([\   ;\n]?\\)") ; \n should be \r
+      ;; We are looking at a numeric character reference.
+      ;; Ensure the number is already terminated by a semicolon or carriage
+      ;; return so we can use "read" to get it as a number quickly.
+      (cond ((= (match-beginning 1) (match-end 1))
+             ;; This is very uncommon, so we don't have to be quick here but
+             ;; rather correct.
+             (save-excursion
+               (goto-char (match-end 0)) ; same as match-end 1
+               (insert ?\;))
+             ;; Set up the match data properly
+             (looking-at "&#[0-9][0-9]*;")))
+      (forward-char 2)
+      (setq w3-p-s-num (read (current-buffer)))
+      ;; Always leave point after the expansion of a numeric
+      ;; character reference, like it were a CDATA entity.
+      (replace-match "")
+      ;; char-to-string will hopefully do something useful with characters
+      ;; larger than 255.  I think in MULE it does.  Is this true?
+      ;; Bill wants to call w3-resolve-numeric-entity here, but I think
+      ;; that functionality belongs in char-to-string.
+      ;; The largest valid character in the I18N version of HTML is 65533.
+      ;; ftp://ds.internic.net/internet-drafts/draft-ietf-html-i18n-01.txt
+      ;; wrongo!  Apparently, mule doesn't do sane things with char-to-string
+      ;; -wmp 7/9/96
+      (let ((repl (cdr-safe (assq w3-p-s-num 
w3-invalid-sgml-char-replacement))))
+            (insert (or repl (mule-make-iso-character w3-p-s-num)))))
+     ((looking-at "&#\\(re\\|rs\\|space\\|tab\\)[\ ;\n]?") ; \n should be \r
+      (replace-match (assq (upcase (char-after (+ 3 (point))))
+                           '(;; *** Strictly speaking, record end should be
+                             ;; carriage return.
+                             (?E . "\n") ; RE
+                             ;; *** And record start should be line feed.
+                             (?S . "")  ; RS
+                             (?P . " ") ; SPACE
+                             (?A . "\t")))) ; TAB
+      ;; Leave point after the expansion of a character reference, so it
+      ;; doesn't get rescanned.
+      ;; *** Strictly speaking, we should issue a warning for &#foo; if foo
+      ;; is not a function character in the SGML declaration.
+      )
+   
+     ((eq ?& (char-after (point)))
+      ;; We are either looking at an undefined reference or a & that does
+      ;; not start a reference (in which case we should not have been called).
+      ;; Skip over the &.
+      (forward-char 1))
+   
+     (t
+      ;; What is the code doing calling us if we're not looking at a "&"?
+      (error "this should never happen"))))
+
+  )
+
+
+;;;
+;;; Syntax table used in markup declarations.
+;;;
+
+(defvar w3-sgml-md-syntax-table
+  (let ((table (make-syntax-table))
+        (items '(
+                 (0   "."    255)       ; clear everything
+                 (?\r " ")
+                 (?\t " ")
+                 (?\n " ")
+                 (32  " ")              ; space
+                 (?<  "\(>")
+                 (?>  "\)<")
+                 (?\( "\(\)")
+                 (?\) "\)\(")
+                 (?\[ "\(\]")
+                 (?\] "\)\[")
+                 (?\" "\"")
+                 (?\' "\"")
+                 (?a  "w"    ?z)
+                 (?A  "w"    ?Z)
+                 (?0  "w"    ?9)
+                 (?.  "w")
+                 ;; "-" can be a character in a NAME, but it is also used in
+                 ;; "--" as both a comment start and end within SGML
+                 ;; declarations ("<!"  ... ">").  In HTML, it is only used
+                 ;; as a NAME character in the parameter entities
+                 ;; Content-Type, HTTP-Method, and style-notations and in
+                 ;; the attribute name http-equiv and in the notation names
+                 ;; dsssl-lite and w3c-style.  We would like to be able to
+                 ;; train Emacs to skip over these kinds of comments with
+                 ;; forward-sexp and backward-sexp.  Is there any way to
+                 ;; teach Emacs how to do this?  It doesn't seem to be the
+                 ;; case.
+                 (?-  "w")
+                 )))
+    (while items
+      (let* ((item (car items))
+             (char (car item))
+             (syntax (car (cdr item)))
+             (bound (or (car-safe (cdr-safe (cdr item)))
+                        char)))
+        (while (<= char bound)
+          (modify-syntax-entry char syntax table)
+          (setq char (1+ char))))
+      (setq items (cdr items)))
+    table)
+  "A syntax table for parsing SGML markup declarations.")
+
+
+;;;
+;;; Element information data type.
+;;;
+
+;;   The element information data type is used in two ways:
+;;
+;;     * To store the DTD, there is one element record for each element in
+;;       the DTD.
+;;
+;;     * To store information for open elements in the current parse tree.
+;;       Each such element is initialized by copying the element record
+;;       from the DTD.  This means that values in the fields can not be
+;;       destructively altered, although of course the fields can be
+;;       changed.
+
+;;   The cells in this vector are:
+;;
+;;   name: the element's name (a generic identifier).
+;;
+;;   end-tag-name: a symbol whose name should be the result of prefixing
+;;   the generic-identifier with a slash.  This is a convenience value for
+;;   interfacing with the display engine which expects a stream of start
+;;   and end tags in this format rather than a tree.
+;;
+;;   content-model: a data structure describing what elements or character
+;;   data we expect to find within this element.  This is either a symbol
+;;   listed here:
+;;
+;;     EMPTY: no content, no end-tag allowed.
+;;     CDATA: all data characters until "</[a-z]" is seen.
+;;     XCDATA: special non-SGML-standard mode which includes all data
+;;       characters until "</foo" is seen where "foo" is the name of this
+;;       element. (for XMP and LISTING)
+;;     XXCDATA: special non-SGML-standard mode which includes all data
+;;       until end-of-entity (end-of-buffer for us). (for PLAINTEXT)
+;;     RCDATA: all data characters until "</[a-z]" is seen, except that
+;;       entities are expanded first, although the expansions are not
+;;       scanned for end-tags.
+;;     XINHERIT: special non-SGML-standard mode which means to use the
+;;       content model of the containing element instead.
+;;  
+;;   or a vector of this structure:
+;;
+;;     [(INCLUDES INCSPACEP (((TAG ...) . TRANSITION) ...) DEFAULT) ...]
+;;
+;;   where INCLUDES is of the format:
+;;
+;;     (TAG ...)
+;;
+;;   where each TRANSITION is one of these:
+;;
+;;     (ACTION NEW-STATE ERRORP)
+;;     (ACTION NEW-STATE)
+;;     (ACTION)
+;;    
+;;   where DEFAULT is one of these:
+;;
+;;     nil  or  TRANSITION
+;;
+;;   where the meaning of the components is:
+;;
+;;     INCLUDES is a list of tags for which the transition (*include *same
+;;     nil) applies.
+;;
+;;     DEFAULT if non-nil is a transition that should be taken when
+;;     matching any possibility not explicitly listed in another
+;;     TRANSITION, except for data characters containing only whitespace.
+;;
+;;     INCSPACEP specifies how to handle data characters which include
+;;     only whitespace characters.  The value is non-nil to indicate
+;;     (*include *same nil) or nil to indicate (*discard *same nil).
+;;    
+;;     TAG is a symbol corresponding to the start-tag we are looking at,
+;;     or *data when seeing character data that includes at least one
+;;     non-space character.
+;;
+;;     ACTION is one of:
+;;       *close: Close this element and try again using content model of
+;;           enclosing element.  (Note that this does not apply to the
+;;           case of an element being closed by its own end-tag.)
+;;       *include: Process new element as subelement of this one or
+;;           include data characters directly.
+;;       *discard: Discard a start-tag or data characters.
+;;       *retry: Try again after processing NEW-STATE and ERRORP.
+;;       ELEMENT: Open ELEMENT (with default attributes), then try again
+;;           using its content model. 
+;;
+;;     NEW-STATE (optional, default *same) is the index of the state to
+;;     move to after processing the element or one of these:
+;;       *same: no state change occurs.
+;;       *next: change the current state + 1.
+;;     The initial state is 0.  NEW-STATE does not matter if ACTION is
+;;     *close.
+;;    
+;;     ERRORP (optional, default nil) if non-nil indicates this transition
+;;     represents an error.  The error message includes this value if it
+;;     is a string.
+;;
+;;   If no matching transition is found, the default transition is
+;;   (*discard *same "not allowed here").
+;;
+;;   overrides: An alist of pairs of the form (VAR REPLACEP . VALUE).
+;;   When this element is opened, the old value of VAR is saved in the
+;;   undo-list.  If REPLACEP is non-nil, then VAR gets value VALUE,
+;;   otherwise VAR gets value (append VALUE (symbol-value VAR)).  Useful
+;;   values for VAR are:
+;;
+;;     w3-p-d-exceptions: See doc string.
+;;  
+;;     w3-p-d-shortrefs: See doc string.
+;;
+;;     w3-p-d-shortref-chars: See doc string.
+;;
+;;   end-tag-omissible: Whether it is legal to omit the end-tag of this
+;;   element.  If an end-tag is inferred for an element whose end tag is
+;;   not omissible, an error message is given.
+;;
+;;   state: The current state in the content model.  Preset to the initial
+;;   state of 0.
+;;
+;;   undo-list: an alist of of former values of local variables
+;;   of w3-parse-buffer to restore upon closing this element.  Each
+;;   item on the list is of the format (VAR . VALUE-TO-RESTORE). 
+;;
+;;   attributes: an alist of attributes and values.  Each item on
+;;   this list is of the format (ATTRIBUTE-NAME . VALUE).  Each
+;;   ATTRIBUTE-NAME is a symbol and each attribute value is a
+;;   string.
+;;
+;;   content: a list of the accumulated content of the element.  While the
+;;   element is open, the list is in order from latest to earliest,
+;;   otherwise it is in order from earliest to latest.  Each member is
+;;   either a string of data characters or a list of the form (NAME
+;;   ATTRIBUTES CONTENT), where NAME is the subelement's name, ATTRIBUTES
+;;   is an alist of the subelement's attribute names (lowercase symbols)
+;;   and their values (strings), and CONTENT is the subelement's content.
+
+(eval-when-compile
+
+  (defconst w3-element-fields
+    '(name end-tag-name content-model state overrides undo-list
+           content attributes end-tag-omissible deprecated))
+
+  (let* ((fields w3-element-fields)
+         (index (1- (length fields))))
+    (while fields
+      (let* ((field (symbol-name (car fields)))
+             (get-sym (intern (concat "w3-element-" field)))
+             (set-sym (intern (concat "w3-set-element-" field))))
+        (eval (` (progn
+                   (defmacro (, get-sym) (element)
+                     (list 'aref element (, index)))
+                   (defmacro (, set-sym) (element value)
+                     (list 'aset element (, index) value))))))
+      (setq fields (cdr fields))
+      (setq index (1- index))))
+
+  (defmacro w3-make-element ()
+    (list 'make-vector (length w3-element-fields) nil))
+
+  ;; *** move this to be with DTD declaration.
+  (defmacro w3-fresh-element-for-tag (tag)
+    (` (copy-sequence
+        (or (get (, tag) 'html-element-info)
+            (error "unimplemented element %s"
+                   (w3-sgml-name-to-string (, tag)))))))
+
+  ;; *** move this to be with DTD declaration.
+  (defmacro w3-known-element-p (tag)
+    (` (get (, tag) 'html-element-info)))
+  
+  (defsubst w3-sgml-name-to-string (sym)
+    (upcase (symbol-name sym)))
+  
+  )
+
+
+;;;
+;;; Parse tree manipulation.
+;;;
+
+;;    ;; Find the name of the previous element or a substring of the
+;;    ;; preceding data characters.
+;;    (let ((content (w3-element-content (car stack))))
+;;      (while content
+;;        (cond
+;;         ((and (stringp (car content))
+;;               (not (string-match "\\`[ \t\n\r]*\\'" (car content))))
+;;          (setq prior-item (car content))
+;;          ;; Trim trailing whitespace
+;;          (if (string-match "\\(.*[^ \t\n\r]\\)[ \t\n\r]*\\'" prior-item)
+;;              (setq prior-item (substring prior-item 0 (match-end 1))))
+;;          (if (> (length prior-item) 8)
+;;              (setq prior-item (concat "..." (substring prior-item -8))))
+;;          (setq prior-item (w3-quote-for-string prior-item))
+;;          (setq prior-item (concat "\(after " prior-item "\)"))
+;;          (setq content nil))
+;;         ((and (consp (car content))
+;;               (symbolp (car (car content))))
+;;          (setq prior-item
+;;                (concat "\(after "
+;;                        (w3-sgml-name-to-string (car (car content)))
+;;                        "\)"))
+;;          (setq content nil))
+;;         (t
+;;          (setq content (cdr content))))))
+
+;; Only used for HTML debugging.
+(defun w3-open-elements-string (&optional skip-count)
+  (let* ((stack (nthcdr (or skip-count 0)
+                        (cons w3-p-d-current-element
+                              w3-p-d-open-element-stack)))
+         ;;(prior-item "(at start)")
+         result)
+    ;; Accumulate the names of the enclosing elements.
+    (while stack
+      (let ((element (w3-element-name (car stack))))
+        (if (eq '*holder element)
+            nil
+          ;; Only include *DOCUMENT if there are no other elements.
+          (if (or (not (eq '*document element))
+                  (null result))
+              (setq result (cons (w3-sgml-name-to-string element)
+                                 result)))))
+      (setq stack (cdr stack)))
+    (setq result (mapconcat 'identity result ":"))
+    (if result
+        ;;(concat
+         result
+        ;; prior-item)
+      "[nowhere!]")))
+
+;; *** This doesn't really belong here, but where?
+(eval-when-compile
+  (defmacro w3-invalid-sgml-chars ()
+    "Characters not allowed in an SGML document using the reference
+concrete syntax (i.e. HTML).  Returns a string in the format expected by
+skip-chars-forward."
+    "\000-\010\013\014\016-\037\177-\237"))
+
+(eval-when-compile
+  ;; Uses:
+  ;;   w3-p-d-null-end-tag-enabled, w3-p-d-in-parsed-marked-section,
+  ;;   w3-p-d-shortref-chars
+  ;; Modifies free variable:
+  ;;   w3-p-d-non-markup-chars
+  (defsubst w3-update-non-markup-chars ()
+    (setq w3-p-d-non-markup-chars
+          (concat "^&<"
+                  (w3-invalid-sgml-chars)
+                  (if w3-p-d-null-end-tag-enabled "/" "")
+                  (if w3-p-d-in-parsed-marked-section "]" "")
+                  (or w3-p-d-shortref-chars ""))))
+)
+
+(eval-when-compile
+  (w3-p-s-var-def w3-p-s-overrides)
+  (w3-p-s-var-def w3-p-s-undo-list)
+  (w3-p-s-var-def w3-p-s-var)
+  ;; Uses free variables:
+  ;;   w3-p-d-non-markup-chars
+  ;; Modifies free variables:
+  ;;   w3-p-d-current-element, w3-p-d-open-element-stack
+  ;; Destroys free variables:
+  ;;   w3-p-s-overrides, w3-p-s-undo-list, w3-p-s-var
+  (defsubst w3-open-element (tag attributes)
+
+    ;; Push new element on stack.
+    (setq w3-p-d-open-element-stack (cons w3-p-d-current-element
+                                          w3-p-d-open-element-stack))
+    (setq w3-p-d-current-element (w3-fresh-element-for-tag tag))
+    
+    ;; Warn if deprecated or obsolete.
+    (if (w3-element-deprecated w3-p-d-current-element)
+        (w3-debug-html :outer
+          (format "%s element %s."
+                  (if (eq 'obsolete
+                          (w3-element-deprecated w3-p-d-current-element))
+                      "Obsolete"
+                    "Deprecated")
+                  (w3-sgml-name-to-string
+                   (w3-element-name w3-p-d-current-element)))))
+    
+    ;; Store attributes.
+    ;; *** we are not handling #CURRENT attributes (HTML has none).
+    (w3-set-element-attributes w3-p-d-current-element attributes)
+    ;; *** Handle default attribute values.
+    ;; *** Fix the attribute name for unnamed values.  Right now they will
+    ;; be in the attribute list as items of the format (VALUE . VALUE) where
+    ;; both occurrences of VALUE are the same.  The first one needs to be
+    ;; changed to the proper attribute name by consulting the DTD.
+    ;; ********************
+  
+    ;; Handle syntax/semantics overrides of new current element.
+    (cond ((w3-element-overrides w3-p-d-current-element)
+           (setq w3-p-s-overrides
+                 (w3-element-overrides w3-p-d-current-element))
+           (setq w3-p-s-undo-list nil)
+           (while w3-p-s-overrides
+             (setq w3-p-s-var (car (car w3-p-s-overrides)))
+             (setq w3-p-s-undo-list
+                   (cons (cons w3-p-s-var
+                               (symbol-value w3-p-s-var))
+                         w3-p-s-undo-list))
+             (set w3-p-s-var (if (car (cdr (car w3-p-s-overrides)))
+                                 (cdr (cdr (car w3-p-s-overrides)))
+                               (append (cdr (cdr (car w3-p-s-overrides)))
+                                       (symbol-value w3-p-s-var))))
+             ;; *** HACK HACK.
+             ;; Magic handling of w3-p-d-shortref-chars.
+             (cond ((eq 'w3-p-d-shortref-chars w3-p-s-var)
+                    (setq w3-p-s-undo-list
+                          (cons (cons 'w3-p-d-non-markup-chars
+                                      w3-p-d-non-markup-chars)
+                                w3-p-s-undo-list))
+                    (w3-update-non-markup-chars)))
+             (setq w3-p-s-overrides (cdr w3-p-s-overrides)))
+           (w3-set-element-undo-list w3-p-d-current-element
+                                     w3-p-s-undo-list)))
+  
+    ;; Handle content-model inheritance.  (Very non-SGML!)
+    (if (eq 'XINHERIT (w3-element-content-model w3-p-d-current-element))
+        (w3-set-element-content-model
+         w3-p-d-current-element 
+         (w3-element-content-model (car w3-p-d-open-element-stack))))
+  
+    )
+  )
+
+;; The protocol for handing items to the display engine is as follows.
+;;
+;; For an element, send (START-TAG . ATTS), each member of the content,
+;; and (END-TAG . nil) if the element is allowed to have an end tag.
+;;
+;; For data characters, send (text . DATA-CHARACTERS).
+;;
+;; Exceptions:
+;;
+;; For PLAINTEXT, STYLE, XMP, TEXTAREA send:
+;; (START-TAG . ((data . DATA-CHARACTERS) . ATTS)).
+;;
+;; *** This requires somehow eliminating any subelements of the TEXTAREA
+;; element.  TEXTAREA can contain subelements in HTML 3.0.
+;;
+;; For LISTING, send (text . DATA-CHARACTERS).  (Is this really correct or
+;; is this perhaps a bug in the old parser?)  I'm ignoring this for now.
+
+(eval-when-compile
+  (w3-p-s-var-def w3-p-s-undo-list)
+  (w3-p-s-var-def w3-p-s-content)
+  (w3-p-s-var-def w3-p-s-end-tag)
+  ;; Modifies free variables:
+  ;;   w3-p-d-current-element, w3-p-d-open-element-stack
+  ;; Accesses free variables:
+  ;;   w3-p-d-tag-name, w3-p-d-end-tag-p
+  ;; Destroys free variables:
+  ;;   w3-p-s-undo-list, w3-p-s-content, w3-p-s-end-tag
+  (defsubst w3-close-element (&optional inferred)
+    ;; inferred: non-nil if the end-tag of the current element is being
+    ;; inferred due to the presence of content not allowed in the current
+    ;; element.  If t, then the tag causing this is in w3-p-d-tag-name and
+    ;; w3-p-d-end-tag-p.
+    ;; (OLD: ... otherwise it is a symbol indicating the start-tag
+    ;; of an element or *data or *space indicating data characters.)
+    
+    (cond ((and inferred
+                (not (w3-element-end-tag-omissible w3-p-d-current-element)))
+           (w3-debug-html
+             (format "</%s> end-tag not omissible (required due to %s)"
+                     (w3-sgml-name-to-string
+                      (w3-element-name w3-p-d-current-element))
+                     (cond ((eq t inferred)
+                            (format (if w3-p-d-end-tag-p
+                                        "</%s> end-tag"
+                                      "start-tag for %s")
+                                    (w3-sgml-name-to-string
+                                     w3-p-d-tag-name)))
+                           ;; *** Delete this functionality?
+                           ((memq inferred '(*space *data))
+                            "data characters")
+                           ((symbolp inferred)
+                            (format "start-tag for %s"
+                                    (w3-sgml-name-to-string inferred)))
+                           )))))
+    
+    ;; Undo any variable bindings of this element.
+    (cond ((w3-element-undo-list w3-p-d-current-element)
+           (setq w3-p-s-undo-list
+                 (w3-element-undo-list w3-p-d-current-element))
+           (while w3-p-s-undo-list
+             (set (car (car w3-p-s-undo-list))
+                  (cdr (car w3-p-s-undo-list)))
+             (setq w3-p-s-undo-list (cdr w3-p-s-undo-list)))))
+  
+    (setq w3-p-s-end-tag
+          (w3-element-end-tag-name w3-p-d-current-element))
+  
+    ;; Fix up the content of the current element in preparation for putting
+    ;; it in the parent.
+    ;; Remove trailing newline from content, if there is one, otherwise send
+    ;; any trailing data character item to display engine.
+    (setq w3-p-s-content (w3-element-content w3-p-d-current-element))
+    (cond ((null w3-p-s-content))
+          ((equal "\n" (car w3-p-s-content))
+           (setq w3-p-s-content (cdr w3-p-s-content)))
+          )
+  
+    (cond ;; *** Handle LISTING the way the old parser did.
+          ((eq 'EMPTY (w3-element-content-model w3-p-d-current-element))
+           ;; Do nothing, can't have an end tag.
+           )
+          (t
+           ;; Normal case.
+           (if (null w3-p-s-content)
+               (w3-debug-html
+                 :bad-style :outer
+                 ;; Don't warn for empty TD elements or empty A elements
+                 ;; with no HREF attribute.
+                 ;; *** Crude hack that should really be encoded in the
+                 ;; element database somehow.
+                 (if (or (not (memq (w3-element-name w3-p-d-current-element)
+                                    '(a td)))
+                         (assq 'href
+                               (w3-element-attributes w3-p-d-current-element)))
+                     (format "Empty %s element."
+                             (w3-sgml-name-to-string
+                              (w3-element-name w3-p-d-current-element))))))))
+    
+    ;; Put the current element in the proper place in its parent.
+    ;; This will cause an error if we overpop the stack.
+    (w3-set-element-content
+     (car w3-p-d-open-element-stack) 
+     (cons (list (w3-element-name w3-p-d-current-element)
+                 (w3-element-attributes w3-p-d-current-element)
+                 (nreverse w3-p-s-content))
+           (w3-element-content (car w3-p-d-open-element-stack))))
+  
+    ;; Pop the stack.
+    (setq w3-p-d-current-element (car w3-p-d-open-element-stack))
+    (setq w3-p-d-open-element-stack (cdr w3-p-d-open-element-stack)))
+
+  )
+
+
+;;;
+;;; A pseudo-DTD for HTML.
+;;;
+
+(eval-when-compile
+  ;; This works around the following bogus compiler complaint:
+  ;;   While compiling the end of the data in file w3-parse.el:
+  ;;     ** the function w3-expand-parameters is not known to be defined.
+  ;; This is a bogus error.  Anything of this form will trigger this message:
+  ;;   (eval-when-compile (defun xyzzy () (xyzzy)))
+  (defun w3-expand-parameters (pars data) nil))
+
+(eval-when-compile
+  (defun w3-expand-parameters (pars data)
+    (cond ((null data)
+           nil)
+          ((consp data)
+           ;; This has to be written carefully to avoid exceeding the
+           ;; maximum lisp function call nesting depth.
+           (let (result)
+             (while (consp data)
+               (let ((car-exp (w3-expand-parameters pars (car data))))
+                 (setq result
+                       (if (and (symbolp (car data))
+                                (not (eq car-exp (car data)))
+                                ;; An expansion occurred.
+                                (listp car-exp))
+                           ;; The expansion was a list, which we splice in.
+                           (condition-case err
+                               (append (reverse car-exp) result)
+                             (wrong-type-argument
+                              (if (eq 'listp (nth 1 err))
+                                  ;; Wasn't really a "list" since the last
+                                  ;; cdr wasn't nil, so don't try to splice
+                                  ;; it in.
+                                  (cons car-exp result)
+                                (signal (car err) (cdr err)))))
+                         (cons car-exp result))))
+               (setq data (cdr data)))
+             (append (nreverse result)
+                     (w3-expand-parameters pars data))))
+          ((symbolp data)
+           (let ((sym-exp (cdr-safe (assq data pars))))
+             (if sym-exp
+                 (w3-expand-parameters pars sym-exp)
+               data)))
+          ((vectorp data)
+           (let ((i 0)
+                 (result (copy-sequence data)))
+             (while (< i (length data))
+               (aset result i
+                     (w3-expand-parameters pars (aref data i)))
+               (setq i (1+ i)))
+             result))
+          (t
+           data))))
+
+(eval-when-compile
+  (defun w3-unfold-dtd (items)
+    (let (result)
+      (while items
+        (let* ((item (car items))
+               (names (car item))
+               (content-model
+                (or (cdr-safe (assq 'content-model item))
+                    (error "impossible")))
+               (overrides (cdr-safe (assq 'overrides item)))
+               (end-tag-omissible
+                (or (cdr-safe (assq 'end-tag-omissible item))
+                    ;; *** Is this SGML standard?
+                    (eq 'EMPTY content-model)))
+               (deprecated (cdr-safe (assq 'deprecated item)))
+               element
+               name)
+          (while names
+            (setq name (car names))
+            (setq names (cdr names))
+
+            ;; Create and initialize the element information data
+            ;; structure.
+            (setq element (w3-make-element))
+            (w3-set-element-name element name)
+            (w3-set-element-end-tag-name
+             element 
+             (intern (concat "/" (symbol-name name))))
+            (w3-set-element-state element 0)
+            (w3-set-element-content-model element content-model)
+            (w3-set-element-end-tag-omissible element end-tag-omissible)
+            
+            (or (memq deprecated '(nil t obsolete))
+                (error "impossible"))
+            (w3-set-element-deprecated element deprecated)
+            
+            ;; Inclusions and exclusions are specified differently in the
+            ;; human-coded DTD than in the format the implementation uses.
+            ;; The human-coded version is designed to be easy to edit and to
+            ;; work with w3-expand-parameters while the internal version is
+            ;; designed to be fast.  We have to translate here.  This work
+            ;; is repeated for every element listed in `names' so that the
+            ;; exclusion exception error messages can be accurate.
+            (let ((inclusions (cdr-safe (assq 'inclusions item)))
+                  (exclusions (cdr-safe (assq 'exclusions item)))
+                  (exclusion-mode '*close)
+                  (exclusion-message 
+                   (format "%s exclusion" (w3-sgml-name-to-string name)))
+                  exceptions)
+              (while inclusions
+                (setq exceptions (cons (cons (car inclusions)
+                                             '(*include *same nil))
+                                       exceptions))
+                (setq inclusions (cdr inclusions)))
+              (while exclusions
+                (cond ((memq (car exclusions) '(*discard *include *close))
+                       (setq exclusion-mode (car exclusions)))
+                      ((stringp (car exclusions))
+                       (setq exclusion-message (car exclusions)))
+                      (t
+                       (setq exceptions (cons (list (car exclusions)
+                                                    exclusion-mode
+                                                    '*same
+                                                    exclusion-message)
+                                              exceptions))))
+                (setq exclusions (cdr exclusions)))
+              (let ((overrides (if exceptions
+                                   (cons (cons 'w3-p-d-exceptions
+                                               (cons nil exceptions))
+                                         overrides)
+                                 overrides)))
+                (w3-set-element-overrides element overrides)))
+            
+            (setq result (cons (cons name element) result))))
+        (setq items (cdr items)))
+      result)))
+
+;; Load the HTML DTD.
+;; <URL:ftp://ds.internic.net/rfc/rfc1866.txt>
+;; *** Be sure to incorporate rfc1867 when attribute-checking is added.
+;; *** Write function to check sanity of the content-model forms.
+;; *** I18N: Add Q, BDO, SPAN
+(mapcar
+ (function
+  (lambda (pair)
+    (put (car pair) 'html-element-info (cdr pair))))
+ ;; The purpose of this complexity is to speed up loading by
+ ;; pre-evaluating as much as possible at compile time.
+ (eval-when-compile
+   (w3-unfold-dtd
+    (w3-expand-parameters
+     '(
+       (%headempty . (link base meta range))
+       (%headmisc . (script))
+       (%head-deprecated . (nextid))
+
+       ;; client-side imagemaps
+       (%imagemaps . (area map))
+       (%input.fields . (input select textarea keygen label))
+       ;; special action is taken for %text inside %body.content in the
+       ;; content model of each element.
+       (%body.content . (%heading %block style hr div address %imagemaps))
+
+       (%heading . (h1 h2 h3 h4 h5 h6))
+
+       ;; Emacs-w3 extensions
+       (%emacsw3-crud  . (pinhead flame cookie yogsothoth hype peek))
+
+       (%block . (p %list dl form %preformatted 
+                    %blockquote isindex fn table fig note
+                    multicol center %block-deprecated %block-obsoleted))
+       (%list . (ul ol))
+       (%preformatted . (pre))
+       (%blockquote . (bq))
+       (%block-deprecated . (dir menu blockquote))
+       (%block-obsoleted . (xmp listing))
+       
+       ;; Why is IMG in this list?
+       (%pre.exclusion . (*include img *discard tab math big small sub sup))
+       
+       (%text . (*data b %notmath sub sup %emacsw3-crud %input.fields))
+       (%notmath . (%special %font %phrase %misc))
+       (%font . (i u s strike tt big small sub sup font
+                   roach secret wired)) ;; B left out for MATH
+       (%phrase . (em strong dfn code samp kbd var cite blink))
+       (%special . (a nobr img applet object font basefont br script style map 
math tab span bdo))
+       (%misc . (q lang au person acronym abbrev ins del))
+       
+       (%formula . (*data %math))
+       (%math . (box above below %mathvec root sqrt array sub sup
+                     %mathface))
+       (%mathvec . (vec bar dot ddot hat tilde))
+       (%mathface . (b t bt))
+
+       (%mathdelims . (over atop choose left right of))
+
+       ;; What the hell?  This takes BODYTEXT?????  No way!
+       (%bq-content-model . [(nil
+                              nil
+                              (((bodytext) *include *next))
+                              (bodytext *next))
+                             (nil
+                              nil
+                              (((credit) *include *next))
+                              nil)
+                             (nil nil nil nil)
+                             ])
+
+       ;; non-default bad HTML handling.
+       (%in-text-ignore . ((p %heading) *discard *same error))
+       )
+     '(
+       ;; A dummy element that will contain *document.
+       ((*holder)
+        (content-model . [(nil nil nil nil)]))
+       ;; The root of the parse tree.  We start with a pseudo-element
+       ;; named *document for convenience.
+       ((*document)
+        (content-model . [(nil nil (((html) *include *next)) (html *next))
+                          (nil
+                           nil
+                           nil
+                           (*include *same "after document end"))])
+        (end-tag-omissible . t))
+       ;; HTML O O (HEAD, BODY)
+       ((html)
+        (content-model . [(nil
+                           nil
+                           (((head) *include *next))
+                           (head *next))
+                          (nil
+                           nil
+                           (((body) *include *next)
+                            ;; Netscape stuff
+                            ((frameset) *include 4)
+                            )
+                           (body *next))
+                          (nil
+                           nil
+                           (((plaintext) *include *next))
+                           (*retry *next))
+                          (nil
+                           nil
+                           nil
+                           (*include *same "after BODY"))
+                          (nil
+                           nil
+                           nil
+                           (*include *same "after FRAMESET"))
+                          ])
+        (end-tag-omissible . t))
+       ((head)
+        (content-model . [((title isindex %headempty %headmisc
+                                  style %head-deprecated)
+                           nil
+                           nil
+                           ;; *** Should only close if tag can
+                           ;; legitimately follow head.  So many can that
+                           ;; I haven't bothered to enumerate them.
+                           (*close))])
+        (end-tag-omissible . t))
+       ;; SCRIPT - - (#PCDATA)
+       ((script)
+        (content-model . XCDATA         ; not official, but allows
+                                        ; comment hiding of script, and also
+                                        ; idiots that use '</' in scripts.
+                       ))
+       ;; TITLE - - (#PCDATA)
+       ((title)
+        (content-model . RCDATA         ; not official
+                       ;; [((*data) include-space nil nil)]
+                       ))
+       ;; STYLE - O (#PCDATA)
+       ;; STYLE needs to be #PCDATA to allow omitted end tag.  Bleagh.
+       ((style)
+        (content-model . CDATA)
+        (end-tag-omissible . t))
+       ((body)
+        (content-model . [((banner) nil nil (*retry *next))
+                          ((bodytext) nil nil (bodytext *next))
+                          (nil nil (((plaintext) *close)) nil)])
+        (inclusions . (spot))
+        (end-tag-omissible . t))
+       ;; Do I really want to include BODYTEXT?  It has something to do
+       ;; with mixed content screwing things up, and I don't understand
+       ;; it.  Wait!  It's used by BQ!
+       ((bodytext)
+        (content-model . [((%body.content)
+                           nil
+                           ;; Push <P> before data characters.  Non-SGML.
+                           (((%text) p)
+                            ;; Some stupid sites put meta tags in the
+                            ;; middle of their documents.  Sigh.
+                            ;; Allow it, but bitch and moan.
+                            ((meta) *include *same "not allowed here")
+                            ;; Closing when seeing CREDIT is a stupidity
+                            ;; caused by BQ's sharing of BODYTEXT.  BQ
+                            ;; should have its own BQTEXT.
+                            ((credit plaintext) *close))
+                           nil)
+                          ])
+        (end-tag-omissible . t))
+       ((div banner center multicol)
+        (content-model . [((%body.content)
+                           nil
+                           ;; Push <P> before data characters.  Non-SGML.
+                           (((%text) p))
+                           nil)]))
+       ((address)
+        (content-model . [((p)
+                           nil
+                           ;; Push <P> before data characters.  Non-SGML.
+                           (((%text) p))
+                           nil)]))
+       ((%heading)
+        (content-model . [((%text)
+                           include-space
+                           ((%in-text-ignore))
+                           nil)]))
+       ((span bdo)
+        (content-model . [((%text)
+                           include-space
+                           nil
+                           nil)])
+        )
+       ((p)
+        (content-model . [((%text)
+                           include-space
+                           nil
+                           ;; *** Should only close if tag can
+                           ;; legitimately follow P.  So many can that I
+                           ;; don't bother to enumerate here.
+                           (*close))])
+        (end-tag-omissible . t))
+       ((ul ol)
+        (content-model . [((lh)
+                           nil
+                           (((li) *include *next))
+                           (*retry *next))
+                          ((p)
+                           nil
+                           nil
+                           (*retry *next))
+                          ((li)
+                           nil
+                           ;; Push <LI> before data characters or block
+                           ;; elements.
+                           ;; Non-SGML.
+                           (;; ((p) b *same nil)
+                            ((%text %block) li *same error))
+                           nil)]))
+       ((lh)
+        (content-model . [((%text)
+                           include-space
+                           (((dd dt li) *close)
+                            (%in-text-ignore))
+                           nil)])
+        (end-tag-omissible . t))
+       ((dir menu)
+        (content-model . [((li)
+                           nil
+                           (((%text) li *same error))
+                           nil)])
+        (exclusions . (%block)))
+       ((li)
+        (content-model . [((%block)
+                           nil
+                           (((li) *close)
+                            ;; Push <P> before data characters.  Non-SGML.
+                            ((%text) p))
+                           nil)])
+        (end-tag-omissible . t)
+        ;; Better bad HTML handling.
+        ;; Technically, there are a few valid documents that this will
+        ;; hose, because you can have H1 inside FORM inside LI.  However,
+        ;; I don't think that should be allowed anyway.
+        (exclusions . (*discard "not allowed here" %heading)))
+       ((dl)
+        (content-model . [((lh)
+                           nil
+                           (((dt dd) *include *next))
+                           (*retry *next))
+                          ((dt dd)
+                           nil
+                           ;; Push <DD> before data characters or block
+                           ;; items.
+                           ;; Non-SGML.
+                           (((%text %block) dd *same error))
+                           nil)]))
+       ((dt)
+        (content-model . [((%text)
+                           include-space
+                           (((dd dt) *close)
+                            (%in-text-ignore))
+                           nil)])
+        (end-tag-omissible . t))
+       ;; DD is just like LI, but we treat it separately because it can be
+       ;; followed by a different set of elements.
+       ((dd)
+        (content-model . [((%block)
+                           nil
+                           (((dt dd) *close)
+                            ;; Push <P> before data characters.  Non-SGML.
+                            ((%text) p))
+                           nil)])
+        (end-tag-omissible . t)
+        ;; See comment with LI.
+        (exclusions . (*discard "not allowed here" %heading)))
+       ((pre)
+        (content-model . [((%text hr)
+                           include-space
+                           ((%in-text-ignore))
+                           nil)])
+        (exclusions . (%pre.exclusion)))
+       ;; BLOCKQUOTE deprecated, BQ okay
+       ((bq)
+        (content-model . %bq-content-model))
+       ((blockquote)
+        (content-model . %bq-content-model)
+        ;; BLOCKQUOTE is deprecated in favor of BQ in the HTML 3.0 DTD.
+        ;; However, BQ is not even mentioned in the HTML 2.0 DTD.  So I
+        ;; don't think we can enable this yet:
+        ;;(deprecated . t)
+        )
+       ((fn note)
+        (content-model . [((%body.content)
+                           nil
+                           ;; Push <P> before data characters.  Non-SGML.
+                           (((%text) p))
+                           nil)]))
+       ((fig)
+        (content-model . [((overlay) nil nil (*retry *next))
+                          (nil
+                           nil
+                           (((caption) *include *next))
+                           (*retry *next))
+                          (nil
+                           nil
+                           (((figtext) *include *next)
+                            ((credit) *retry *next))
+                           ;; *** Should only do this for elements that
+                           ;; can be in FIGTEXT.
+                           (figtext *next))
+                          (nil nil (((credit) *include *next)) nil)
+                          (nil nil nil nil)]))
+       ((caption credit)
+        (content-model . [((%text)
+                           nil
+                           ((%in-text-ignore))
+                           nil)]))
+       ((figtext)
+        (content-model . [((%body.content)
+                           nil
+                           ;; Push <P> before data characters.  Very non-SGML.
+                           (((%text) p)
+                            ((credit) *close))
+                           nil)])
+        (end-tag-omissible . t))
+       ((%emacsw3-crud basefont)
+        (content-model . EMPTY))
+       ;; FORM - - %body.content -(FORM) +(INPUT|KEYGEN|SELECT|TEXTAREA)
+       ((form)
+        ;; Same as BODY.  Ugh!
+        (content-model . [((%body.content %text)
+                           nil
+                           ;; Push <P> before data characters.  Non-SGML.
+                           nil
+                           nil)])
+        (exclusions . (form))
+        (inclusions . (input select textarea keygen label)))
+       ;; *** Where is the URL describing this?
+       ((label)
+        (content-model . [((%text)
+                           include-space
+                           nil
+                           nil)])
+        ;; *** These are already included, no need to repeat.
+        ;;(inclusions . (input select textarea))
+        ;; *** Is a LABEL allowed inside a LABEL?  I assume no.
+        (exclusions . (label))
+        ;; The next line just does the default so is unneeded:
+        ;;(end-tag-omissible . nil)
+        )
+       ;; SELECT - - (OPTION+) -(INPUT|KEYGEN|TEXTAREA|SELECT)>
+       ;; *** This should be -(everything).
+       ((select)
+        (content-model . [((option) nil nil nil)])
+        (exclusions . (input label select keygen textarea)))
+       ;; option - O (#PCDATA)
+       ;; needs to be #PCDATA to allow omitted end tag.
+       ((option)
+        ;; I'd like to make this RCDATA to avoid problems with inclusions
+        ;; like SPOT, but that would conflict with the omitted end-tag, I
+        ;; think.
+        (content-model . [((*data)
+                           include-space
+                           (((option) *close))
+                           nil)])
+        (end-tag-omissible . t))
+       ;; TEXTAREA - - (#PCDATA) -(INPUT|TEXTAREA|KEYGEN|SELECT)
+       ((textarea)
+        ;; Same comment as for OPTION about RCDATA.
+        (content-model . [((*data) include-space nil nil)])
+        (exclusions . (input select label keygen textarea)))
+       ((hr br img isindex input keygen overlay wbr spot tab
+            %headempty %mathdelims)
+        (content-model . EMPTY))
+       ((nextid)
+        (content-model . EMPTY)
+        (deprecated . t))
+       ((a)
+        (content-model . [((%text)
+                           include-space
+                           (((%heading)
+                             *include *same "deprecated inside A")
+                            ;; *** I haven't made up my mind whether this
+                            ;; is a good idea.  It can result in a lot of
+                            ;; bad formatting if the A is *never* closed.
+                            ;;((p) *discard *same error)
+                            )
+                           nil)])
+        (exclusions . (a)))
+       ((b font %font %phrase %misc nobr)
+        (content-model . [((%text)
+                           include-space
+                           ((%in-text-ignore))
+                           nil)]))
+       ((plaintext)
+        (content-model . XXCDATA)
+        (end-tag-omissible . t)
+        (deprecated . obsolete))
+       ((xmp listing)
+        (content-model . XCDATA)
+        (deprecated . obsolete))
+       ;; Latest table spec (as of Nov. 13 1995) is at:
+       ;; 
<URL:ftp://ds.internic.net/internet-drafts/draft-ietf-html-tables-03.txt>
+       ((table)
+        (content-model . [(nil
+                           nil
+                           (((caption) *include *next)
+                            ((%text) tr *same error)
+                            ((col colgroup thead tfoot tbody tr) *retry *next))
+                           (*retry *next)) ;error handling
+                          ((col colgroup)
+                           nil
+                           (((thead tfoot tbody tr) *retry *next))
+                           (*retry *next)) ;error handling
+                          (nil
+                           nil
+                           (((thead) *include *next)
+                            ((tfoot tbody tr) *retry *next))
+                           (*retry *next)) ;error handling
+                          (nil
+                           nil
+                           (((tfoot) *include *next)
+                            ((tbody tr) *retry *next))
+                           (*retry *next)) ;error handling
+                          ((tbody)
+                           nil
+                           (((tr) tbody *same)
+                            ((td th) tr *same)
+                            ;; error handling
+                            ((%body.content) tbody *same error))
+                           nil)]))
+       ((colgroup)
+        (content-model . [((col)
+                           nil
+                           (((colgroup thead tfoot tbody tr) *close))
+                           nil)])
+        (end-tag-omissible . t))
+       ((col)
+        (content-model . EMPTY))
+       ((thead)
+        (content-model . [((tr)
+                           nil
+                           (((tfoot tbody) *close)
+                            ;; error handling
+                            ((%body.content) tr *same error))
+                           nil)])
+        (end-tag-omissible . t))
+       ((tfoot tbody)
+        (content-model . [((tr)
+                           nil
+                           (((tbody) *close)
+                            ;; error handling
+                            ((td th) tr *same error)
+                            ((%body.content) tr *same error))
+                           nil)])
+        (end-tag-omissible . t))
+       ((tr)
+        (content-model . [((td th)
+                           nil
+                           (((tr tfoot tbody) *close)
+                            ;; error handling
+                            ((%body.content %text) td *same error))
+                           nil)])
+        (end-tag-omissible . t))
+       ((td th)
+        ;; Arrgh!  Another %body.content!!!  Stupid!!!
+        (content-model . [((%body.content)
+                           nil
+                           (((td th tr tfoot tbody) *close)
+                            ;; Push <P> before data characters.  Non-SGML.
+                            ((%text) p))
+                           nil)])
+        (end-tag-omissible . t))
+       ((math)
+        (content-model . [((*data) include-space nil nil)])
+        (overrides .
+                   ((w3-p-d-shortref-chars t . "\{_^")
+                    (w3-p-d-shortrefs t . (("\\^" . "<sup>")
+                                           ("_" . "<sub>")
+                                           ("{" . "<box>")))))
+        (inclusions . (%math))
+        (exclusions . (%notmath)))
+       ((sup)
+        (content-model . [((%text)
+                           include-space
+                           ((%in-text-ignore))
+                           nil)])
+        (overrides .
+                   ((w3-p-d-shortref-chars t . "\{_^")
+                    (w3-p-d-shortrefs t . (("\\^" . "</sup>")
+                                           ("_" . "<sub>")
+                                           ("{" . "<box>"))))))
+       ((sub)
+        (content-model . [((%text)
+                           include-space
+                           ((%in-text-ignore))
+                           nil)])
+        (overrides .
+                   ((w3-p-d-shortref-chars t . "\{_^")
+                    (w3-p-d-shortrefs t . (("\\^" . "<sup>")
+                                           ("_" . "</sub>")
+                                           ("{" . "<box>"))))))
+       ((box)
+        (content-model . [((%formula)
+                           include-space
+                           (((left) *include 1)
+                            ((over atop choose) *include 2)
+                            ((right) *include 3))
+                           nil)
+                          ((%formula)
+                           include-space
+                           (((over atop choose) *include 2)
+                            ((right) *include 3))
+                           nil)
+                          ((%formula)
+                           include-space
+                           (((right) *include 3))
+                           nil)
+                          ((%formula) include-space nil nil)])
+        (overrides .
+                   ((w3-p-d-shortref-chars t . "{}_^")
+                    (w3-p-d-shortrefs t . (("\\^" . "<sup>")
+                                           ("_" . "<sub>")
+                                           ("{" . "<box>")
+                                           ("}" . "</box>"))))))
+       ((above below %mathvec t bt sqrt)
+        (content-model . [((%formula) include-space nil nil)]))
+       ;; ROOT has a badly-specified content-model in HTML 3.0.
+       ((root)
+        (content-model . [((%formula)
+                           include-space
+                           (((of) *include *next))
+                           nil)
+                          ((%formula) include-space nil nil)]))
+       ((of)
+        (content-model . [((%formula) include-space nil nil)])
+        ;; There is no valid way to infer a missing end-tag for OF.  This
+        ;; is bizarre.
+        (end-tag-omissible . t))
+       ((array)
+        (content-model . [((row) nil nil nil)]))
+       ((row)
+        (content-model . [((item) nil (((row) *close)) nil)])
+        (end-tag-omissible . t))
+       ((item)
+        (content-model . [((%formula)
+                           include-space
+                           (((row item) *close))
+                           nil)])
+        (end-tag-omissible . t))
+       ;; The old parser would look for the </EMBED> end-tag and include
+       ;; the contents between <EMBED> and </EMBED> as the DATA attribute
+       ;; of the EMBED start-tag.  However, it did not require the
+       ;; </EMBED> end-tag and did nothing if it was missing.  This is
+       ;; completely impossible to specify in SGML.
+       ;;
+       ;; See
+       ;; 
<URL:http://www.eit.com/goodies/lists/www.lists/www-html.1995q3/0603.html>  
+       ;;
+       ;; Questions: Does EMBED require the end-tag?  How does NOEMBED fit
+       ;; into this?  Where can EMBED appear?
+       ;;
+       ;; Nov. 25 1995: a new spec for EMBED (also an I-D):
+       ;; <URL:http://www.cs.princeton.edu/~burchard/www/interactive/>
+       ;;
+       ;; Here is my guess how to code EMBED:
+       ((embed)
+        (content-model . [((noembed) nil nil (*close))]))
+       ((noembed)
+        (content-model . [((%body.content) ; hack hack hack
+                           nil
+                           (((%text) p))
+                           nil)]))
+       ;;
+       ;; FRAMESET is a Netscape thing.
+       ;; 
<URL:http://www.eit.com/goodies/lists/www.lists/www-html.1995q3/0588.html>
+       ((frameset)
+        (content-model . [((noframes frame frameset) nil nil nil)]))
+       ((noframes)
+        (content-model . [((%body.content)
+                           nil
+                           ;; Push <P> before data characters.  Non-SGML.
+                           (((%text) p))
+                           nil)]))
+       ((frame)
+        (content-model . EMPTY))
+       ;;
+       ;; APPLET is a Java thing.
+       ;; OBJECT is a cougar thing
+       ;; <URL:http://java.sun.com/JDK-beta/filesinkit/README>
+       ((applet object)
+        ;; I really don't want to add another ANY content-model.
+        (content-model . XINHERIT)
+        (inclusions . (param)))
+       ((param)
+        (content-model . EMPTY))
+       ;; backward compatibility with old Java.
+       ((app)
+        (content-model . EMPTY))
+       ;; Client-side image maps.
+       ;; 
<URL:ftp://ds.internic.net/internet-drafts/draft-seidman-clientsideimagemap-01.txt>
+       ;; *** The only problem is that I don't know in what elements MAP
+       ;; can appear, so none of this is reachable yet.
+       ((map)
+        (content-model . [((area) nil nil nil)]))
+       ((area)
+        (content-model . EMPTY))
+       )))))
+
+
+;;;
+;;; Omitted tag inference using state transition tables.
+;;;
+
+(eval-when-compile
+
+  (w3-p-s-var-def w3-p-s-includep)
+  (w3-p-s-var-def w3-p-s-state-transitions)
+  (w3-p-s-var-def w3-p-s-transition)
+  (w3-p-s-var-def w3-p-s-tran-list)
+  (w3-p-s-var-def w3-p-s-content-model)
+  (w3-p-s-var-def w3-p-s-except)
+  (w3-p-s-var-def w3-p-s-baseobject)
+  (w3-p-s-var-def w3-p-s-btdt)
+  ;; Uses free variables:
+  ;;   w3-p-d-current-element, w3-p-d-exceptions
+  ;; Destroys free variables:
+  ;;   w3-p-s-includep, w3-p-s-state-transitions, w3-p-s-transition,
+  ;;   w3-p-s-tran-list, w3-p-s-content-model, w3-p-s-except
+  ;; Returns t if the element or data characters should be included.
+  ;; Returns nil if the element or data characters should be discarded.
+  (defsubst w3-grok-tag-or-data (tag-name)
+    (while
+        (cond
+         ((symbolp (setq w3-p-s-content-model
+                         (w3-element-content-model w3-p-d-current-element)))
+          (or (and (memq w3-p-s-content-model
+                         '(CDATA RCDATA XCDATA XXCDATA))
+                   (memq tag-name '(*data *space)))
+              ;; *** Implement ANY.
+              (error "impossible content model lossage"))
+          (setq w3-p-s-includep t)
+          ;; Exit loop.
+          nil)
+         (t
+          ;; We have a complex content model.
+          ;; Cache some data from the element info structure.  Format is:
+          ;;   (INCLUDES INCSPACEP (((TAG ...) . TRANSITION) ...) DEFAULT)
+          (setq w3-p-s-state-transitions
+                (aref w3-p-s-content-model
+                      (w3-element-state w3-p-d-current-element)))
+        
+          ;; Optimize the common cases.
+          (cond
+           ((eq '*space tag-name)
+            ;; Optimizing the (*space *discard *same nil) transition.
+            (setq w3-p-s-includep (car (cdr w3-p-s-state-transitions)))
+            ;; Don't loop.
+            nil)
+           ((and (not (setq w3-p-s-except
+                            (assq tag-name w3-p-d-exceptions)))
+                 (memq tag-name (car w3-p-s-state-transitions)))
+            ;; Equivalent to a transition of (TAG *include *same nil).
+            ;; So we are done, return t to caller.
+            (setq w3-p-s-includep t)
+            ;; Exit loop.
+            nil)
+           (t
+            ;; The general case.
+            (cond
+             ;; Handle inclusions and exclusions.
+             (w3-p-s-except
+              (setq w3-p-s-transition (cdr w3-p-s-except)))
+             ;; See if the transition is in the complex transitions
+             ;; component.
+             ((progn
+                (setq w3-p-s-tran-list
+                      (car (cdr (cdr w3-p-s-state-transitions))))
+                (setq w3-p-s-transition nil)
+                (while w3-p-s-tran-list
+                  (cond ((memq tag-name (car (car w3-p-s-tran-list)))
+                         ;; We've found a transition.
+                         (setq w3-p-s-transition
+                               (cdr (car w3-p-s-tran-list)))
+                         (setq w3-p-s-tran-list nil))
+                        (t
+                         (setq w3-p-s-tran-list (cdr w3-p-s-tran-list)))))
+                ;; Check if we found it.
+                w3-p-s-transition)
+              ;; body of cond clause empty
+              )
+             ;; Try finding the transition in the DEFAULT component of the
+             ;; transition table, but avoid doing this for unknown elements,
+             ;; always use the default-default for them.
+             ((and (or (eq '*data tag-name)
+                       (w3-known-element-p tag-name))
+                   (setq w3-p-s-transition
+                         (nth 3 w3-p-s-state-transitions)))
+              ;; body of cond clause empty
+              )
+             (t
+              ;; Supply a default-default transition.
+              (if (not (or (eq '*data tag-name)
+                           (w3-known-element-p tag-name)))
+                  (setq w3-p-s-transition
+                        '(*discard *same "unknown element"))
+
+                ;; Decide whether to *close or *discard
+                ;; based on whether this element would be
+                ;; accepted as valid in an open ancestor.
+                (let ((open-list w3-p-d-open-element-stack)
+                      (all-end-tags-omissible
+                       (w3-element-end-tag-omissible w3-p-d-current-element))
+                      state-transitions tran-list)
+                  (if (catch 'found
+                        (while open-list
+                          (setq state-transitions
+                                (aref (w3-element-content-model
+                                       (car open-list))
+                                      (w3-element-state (car open-list))))
+                          (if (memq tag-name (car state-transitions))
+                              (throw 'found t))
+                          (setq tran-list (nth 2 state-transitions))
+                          (while tran-list
+                            (cond ((memq tag-name (car (car tran-list)))
+                                   (if (not (nth 3 (car tran-list)))
+                                       ;; Not an error transition.
+                                       (throw 'found t))
+                                   (setq tran-list nil))
+                                  (t
+                                   (setq tran-list (cdr tran-list)))))
+                          ;; The input item is not accepted in this
+                          ;; ancestor.  Try again in next ancestor.
+                          (or (w3-element-end-tag-omissible (car open-list))
+                              (setq all-end-tags-omissible nil))
+                          (setq open-list (cdr open-list)))
+                        nil)
+                      (setq w3-p-s-transition
+                            (if (w3-element-end-tag-omissible
+                                 w3-p-d-current-element)
+                                (if all-end-tags-omissible
+                                    ;; Probably indicates a need to debug
+                                    ;; the DTD state-transition tables.
+                                    '(*close *same
+                                             "missing transition in DTD?")
+                                  ;; Error will be reported later.
+                                  '(*close *same))
+                              '(*close *same "not allowed here")))
+                    (setq w3-p-s-transition
+                          '(*discard *same "not allowed here")))))))
+            
+            ;; We have found a transition to take.  The transition is of
+            ;; the format (ACTION NEW-STATE ERRORP) where the latter two
+            ;; items are optional.
+            
+            ;; First, handle any state-change.
+            (or (memq (car-safe (cdr w3-p-s-transition)) '(nil *same))
+                (w3-set-element-state
+                 w3-p-d-current-element 
+                 (if (eq '*next (car-safe (cdr w3-p-s-transition)))
+                     (1+ (w3-element-state w3-p-d-current-element))
+                   (car-safe (cdr w3-p-s-transition)))))
+          
+            ;; Handle any error message.
+            (if (car-safe (cdr-safe (cdr w3-p-s-transition)))
+                (w3-debug-html 
+                  :mandatory-if (and (eq '*data tag-name)
+                                     (eq '*discard (car w3-p-s-transition)))
+                  (format "Bad %s [%s], %s"
+                          (if (eq '*data tag-name)
+                              "data characters"
+                            (concat "start-tag "
+                                    (w3-sgml-name-to-string tag-name)))
+                          (if (stringp (car (cdr (cdr w3-p-s-transition))))
+                              (car (cdr (cdr w3-p-s-transition)))
+                            "not allowed here")
+                          (let ((action (car w3-p-s-transition)))
+                            (cond ((eq '*discard action)
+                                   "discarding bad item")
+                                  ((eq '*close action)
+                                   (concat "inferring </"
+                                           (w3-sgml-name-to-string
+                                            (w3-element-name
+                                             w3-p-d-current-element))
+                                           ">"))
+                                  ((eq '*include action)
+                                   "including bad item anyway")
+                                  ((eq '*retry action)
+                                   "*retry ??? you shouldn't see this")
+                                  (t
+                                   (concat "inferring <"
+                                           (w3-sgml-name-to-string action)
+                                           ">")))))))
+            
+            ;; Handle the action.
+            (cond
+             ((eq '*include (car w3-p-s-transition))
+              (setq w3-p-s-includep t)
+              ;; Exit loop.
+              nil)
+             ((eq '*close (car w3-p-s-transition))
+              ;; Perform end-tag inference.
+              (w3-close-element)        ; don't pass parameter
+              ;; Loop and try again in parent element's content-model.
+              t)
+             ((eq '*discard (car w3-p-s-transition))
+              (setq w3-p-s-includep nil)
+              ;; Exit loop.
+              nil)
+             ((eq '*retry (car w3-p-s-transition))
+              ;; Loop and try again after state change.
+              t)
+             ((symbolp (car w3-p-s-transition))
+              ;; We need to open another element to contain the text,
+              ;; probably a <P> (look in the state table).
+              (w3-open-element (car w3-p-s-transition) nil)
+              ;; Now we loop and try again in the new element's
+              ;; content-model.
+              t)
+             (t
+              (error "impossible transition")))))))
+    
+      ;; Empty while loop body.
+      )
+  
+    ;; Return value to user indicating whether to include or discard item:
+    ;;   t   ==> include
+    ;;   nil ==> discard
+    w3-p-s-includep)
+
+  )
+
+
+;;;
+;;; Main parser.
+;;;
+
+(defvar w3-last-parse-tree nil
+  "Used for debugging only.  Stores the most recently computed parse tree
+\(a tree, not a parse tag stream\).")
+
+(defvar w3-invalid-sgml-char-replacement
+  '(
+    ;; These characters are apparently from an M$ character set (cp1252)
+    (130 . ",")                      ; single low-9 quotation mark
+    (131 . "_f")             ; latin small letter f with hook
+    (132 . ",,")             ; double low-9 quotation mark
+    (133 . "...")            ; horizontal ellipsis
+    (134 . "(dagger)")       ; dagger
+    (135 . "(double dagger)") ; double dagger
+    (136 . "^")                      ; modifier letter circumflex accent
+    (137 . "%o")             ; per mille sign
+    (138 . "S\\v")           ; latin capital letter S with caron
+    (139 . "<")                      ; single left-pointing angle quotation 
mark
+    (140 . "OE")             ; latin capital ligature OE
+    (145 . "`")                      ; left single quotation mark
+    (146 . "'")                      ; right single quotation mark
+    (147 . "``")             ; left double quotation mark
+    (148 . "''")             ; right double quotation mark
+    (149 . "o")                      ; bullet
+    (150 . "--")             ; en dash
+    (151 . "---")            ; em dash
+    (152 . "~")                      ; small tilde
+    (153 . "(TM)")           ; trade mark sign
+    (154 . "s\\v")           ; latin small letter s with caron
+    (155 . ">")                      ; single right-pointing angle quotation 
mark
+    (156 . "oe")             ; latin small ligature oe
+    (157 . "Y\\..")          ; latin capital letter Y with diaeresis
+    )
+  "Replacement for invalid SGML characters")
+
+(defun w3-display-parse-tree (&optional ptree)
+  (interactive)
+  (with-output-to-temp-buffer "W3 HTML Parse Tree"
+    (set-buffer standard-output)
+    (emacs-lisp-mode)
+    (require 'pp)
+    (pp (or ptree w3-last-parse-tree))))
+
+(defalias 'w3-display-last-parse-tree 'w3-display-parse-tree)
+
+;; For compatibility with the old parser interface.
+(defalias 'w3-preparse-buffer 'w3-parse-buffer)
+
+;; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+;; %                                                    %
+;; % This is the *ONLY* valid entry point in this file! %
+;; %       DO NOT call any of the other functions!      %
+;; %                                                    %
+;; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+(defun w3-parse-buffer (&optional buff)
+  "Parse contents of BUFF as HTML.
+BUFF defaults to the value of url-working-buffer.
+Destructively alters contents of BUFF.
+Returns a data structure containing the parsed information."
+  (if (not w3-setup-done) (w3-do-setup))
+  (set-buffer (or buff url-working-buffer))
+  (setq buff (current-buffer))
+  (set-syntax-table w3-sgml-md-syntax-table)
+  (buffer-disable-undo (current-buffer))
+  (widen)                               ; sanity checking
+  (goto-char (point-max))
+  (insert "\n")
+  (goto-char (point-min))
+  (setq case-fold-search t)             ; allows smaller regexp patterns
+  
+  ;; This is for ethiopic text.  Unfortunately, old MULE and new MULE conflict
+  ;; on what exactly to call this function.
+  (condition-case ()
+      (let ((sera-being-called-by-w3 t))
+        (case mule-sysdep-version
+          (2.4
+           (sera-to-fidel-marker))
+          ((xemacs 3.0)
+           (ethio-sera-to-fidel-marker))
+          (4.0
+           (when default-enable-multibyte-characters
+             (ethio-sera-to-fidel-marker)))))
+    (error nil))
+  (goto-char (point-min))
+  
+  ;; *** Should premunge line boundaries.
+  ;; ********************
+  
+  (let* (
+         ;; Speed hack, see the variable doc string.
+         (gc-cons-threshold (if (> w3-gc-cons-threshold-multiplier 0)
+                                (* w3-gc-cons-threshold-multiplier
+                                   gc-cons-threshold)
+                              gc-cons-threshold))
+
+         ;; Used to determine if we made any progress since the last loop.
+         (last-loop-start (point-min))
+        
+         ;; How many iterations of the main loop have occurred.  Used only
+         ;; to send messages to the user periodically, since this function
+         ;; can take some time.
+         (loop-count 0)
+
+         ;; Precomputing the loop-invariant parts of this for speed.
+         (status-message-format
+          (if url-show-status
+              (format "Parsed %%3d%%%% of %d..." (- (point-max) (point-min)))))
+         
+         ;; Use a float value for 100 if possible, otherwise integer.
+         ;; Determine which we can use outside of the loop for speed.
+         (one-hundred (funcall (if (fboundp 'float) 'float 'identity) 100))
+         
+         ;; The buffer which contains the HTML we are parsing.  This
+         ;; variable is used to avoid using the more expensive
+         ;; save-excursion.
+         (parse-buffer (current-buffer))
+         
+         ;; Points to start of region of text since the previous tag.
+         (between-tags-start (point-min))
+         
+         ;; Points past end of region of text since the previous tag.  Only
+         ;; non-nil when the region has been completely determined and is
+         ;; ready to be processed.
+         between-tags-end
+         
+         ;; See doc string.
+         w3-p-d-tag-name
+         
+         ;; See doc string.
+         w3-p-d-end-tag-p
+         
+         ;; Is the tag we are looking at a null-end-tag-enabling
+         ;; start-tag?
+         net-tag-p
+         
+         ;; Attributes of the tag we are looking at.  An alist whose items
+         ;; are pairs of the form (SYMBOL . STRING).
+         tag-attributes
+         
+         ;; Points past end of attribute value we are looking at.  Points
+         ;; past the syntactic construct, not the value of the attribute,
+         ;; which may be at (1- attribute-value-end).
+         attribute-value-end
+         
+         ;; Points past end of tag we are looking at.
+         tag-end
+         
+         ;; See doc string.
+         (w3-p-d-current-element (w3-fresh-element-for-tag '*document))
+         
+         ;; See doc string.
+         (w3-p-d-open-element-stack (list (w3-fresh-element-for-tag '*holder)))
+         
+         ;; ***not implemented yet***
+         (marked-section-undo-stack nil)
+         
+         ;; See doc string.
+         (w3-p-d-debug-url t)
+         
+         ;; Any of the following variables with the comment ";*NESTED*"
+         ;; are syntactic or semantic features that were introduced by
+         ;; some containing element or marked section which will be undone
+         ;; when we close that element or marked section.
+         
+         ;; See doc string.
+         (w3-p-d-non-markup-chars nil) ;*NESTED*
+         
+         ;; See doc string.
+         (w3-p-d-null-end-tag-enabled nil) ;*NESTED*
+         
+         ;; See doc string.
+         (w3-p-d-in-parsed-marked-section nil) ;*NESTED*
+         
+         ;; See doc string.
+         (w3-p-d-shortrefs nil)                ;*NESTED*
+         
+         ;; See doc string.
+         (w3-p-d-shortref-chars nil)    ;*NESTED*
+         
+         ;; ******* maybe not needed.
+         ;; 
+         ;; ;; Are we recognizing start-tags?
+         ;; (recognizing-start-tags t)     ;*NESTED*
+         ;; 
+         ;; ;; Are we recognizing end-tags?  If this is non-nil and not t,
+         ;; ;; then only the end tag of the current open element is
+         ;; ;; recognized.
+         ;; (recognizing-end-tags t)       ;*NESTED*
+         
+         ;; See doc string.
+         (w3-p-d-exceptions nil)        ;*NESTED*
+         
+         ;; Scratch variables used in this function
+         ref attr-name attr-value content-model content open-list
+         )
+    ;; Scratch variables used by macros and defsubsts we call.
+    (w3-p-s-let-bindings
+      (w3-update-non-markup-chars)
+      (setq w3-p-s-baseobject (url-generic-parse-url (url-view-url t)))
+      ;; Main loop.  Handle markup as follows:
+      ;;
+      ;; non-empty tag: Handle the region since the previous tag as PCDATA,
+      ;; RCDATA, CDATA, if allowed by syntax.  Then handle the tag.
+      ;;
+      ;; general entity (&name;): expand it and parse the result.
+      ;;
+      ;; shortref (_, {, }, and ^ in math stuff): Expand it and parse the
+      ;; result.
+      ;;
+      ;; SGML marked section (<![ keywords [ conditional-text ]]>): Either
+      ;; strip the delimiters and parse the result or delete.
+      ;;
+      ;; comment: Delete.
+      ;;
+      ;; empty tag (<>, </>): Handle as the appropriate tag.
+      ;;
+      ;; markup declaration (e.g. <!DOCTYPE ...>): Delete.
+      ;;
+      ;; SGML processing instruction (<?name>): Delete.
+      ;;
+      (while
+          ;; Continue as long as we processed something last time and we
+          ;; have more to process.
+          (prog1 
+              (not (and (= last-loop-start (point))
+                        (eobp)))
+            (setq last-loop-start (point)))
+      
+        ;; Display progress messages if asked and/or do incremental display
+        ;; of results
+        (cond ((= 0 (% (setq loop-count (1+ loop-count)) 40))
+               (if status-message-format
+                   (message status-message-format
+                            ;; Percentage of buffer processed.
+                            (/ (* (point) one-hundred) (point-max))))))
+      
+        ;; Go to next interesting thing in the buffer.
+        (skip-chars-forward w3-p-d-non-markup-chars)
+      
+        ;; We are looking at a markup-starting character, and invalid
+        ;; character, or end of buffer.
+        (cond
+
+         ((eq ?< (char-after (point)))
+
+          ;; We are looking at a tag, comment, markup declaration, SGML marked
+          ;; section, SGML processing instruction, or non-markup "<".
+          (forward-char)
+          (cond
+
+           ((looking-at "/?\\([a-z][-a-z0-9.]*\\)")
+            ;; We are looking at a non-empty tag.
+
+            ;; Downcase it in the buffer, to save creation of a string
+            (downcase-region (match-beginning 1) (match-end 1))
+            (setq w3-p-d-tag-name
+                  (intern (buffer-substring (match-beginning 1)
+                                            (match-end 1))))
+            (setq w3-p-d-end-tag-p (eq ?/ (char-after (point)))
+                  between-tags-end (1- (point)))
+            (goto-char (match-end 0))
+          
+            ;; Read the attributes from a start-tag.
+            (if w3-p-d-end-tag-p
+                (if (looking-at "[ \t\r\n/]*[<>]")
+                    nil
+                  ;; This is in here to deal with those idiots who stick
+                  ;; attribute/value pairs on end tags.  *sigh*
+                  (w3-debug-html "Evil attributes on end tag.")
+                  (skip-chars-forward "^>"))
+           
+             ;; Attribute values can be:
+             ;;   "STRING"   where STRING does not contain the double quote
+             ;;   'STRING'   where STRING does not contain the single quote
+             ;;   name-start character, *name character
+             ;;   *name character
+             ;;   Digit, +name character
+             ;;   +Digit
+             ;; or a SPACE-separated list of one of the last four
+             ;; possibilities (there is a comment somewhere that this is a
+             ;; misinterpretation of the grammar, so we ignore this
+             ;; possibility).
+             (while
+                 (looking-at
+                  (eval-when-compile
+                    (concat
+                     ;; Leading whitespace.
+                     "[ \n\r\t]*"
+                     ;; The attribute name, possibly with a bad syntax
+                     ;; component.
+                     "\\([a-z_][-a-z0-9.]*\\(\\([_][-a-z0-9._]*\\)?\\)\\)"
+                     ;; Trailing whitespace and perhaps an "=".
+                     "[ \n\r\t]*\\(\\(=[ \n\r\t]*\\)?\\)")))
+               
+               (cond ((/= (match-beginning 2) (match-end 2))
+                      (w3-debug-html
+                        :nocontext
+                        (format "Bad attribute name syntax: %s"
+                                (buffer-substring (match-beginning 1)
+                                                  (match-end 1))))))
+
+               ;; Downcase it in the buffer, to save creation of a string
+               (downcase-region (match-beginning 1) (match-end 1))
+               (setq attr-name
+                     (intern (buffer-substring (match-beginning 1)
+                                               (match-end 1))))
+               (goto-char (match-end 0))
+               (cond
+                ((< (match-beginning 4) (match-end 4))
+                 ;; A value was specified (e.g. ATTRIBUTE=VALUE).
+                 (cond
+                  ((looking-at
+                    (eval-when-compile
+                      (concat
+                       ;; Comma separated list of literals with double quotes
+                       ;; (bad HTML).
+                       "\"\\([^\"]*\\(\"[ \n\r\t]*,[ \n\r\t]*\"[^\"]*\\)+\\)\""
+                       "\\|"
+                       ;; Comma separated list of literals with single quotes
+                       ;; (bad HTML).
+                       "'\\([^']*\\('[ \n\r\t]*,[ \n\r\t]*'[^']*\\)+\\)'"
+                       "\\|"
+                       ;; Literal with double quotes.
+                       "\"\\([^\"]*\\)\""
+                       "\\|"
+                       ;; Literal with single quotes.
+                       "'\\([^']*\\)'"
+                       "\\|"
+                       ;; Handle bad HTML conflicting with NET-enabling
+                       ;; start-tags.
+                       "\\([^ \t\n\r>]+/[^ \t\n\r>]+\\)[ \t\n\r>]"
+                       "\\|"
+                       ;; SGML NAME-syntax attribute value.
+                       "\\([-a-z0-9.]+\\)[ \t\n\r></]"
+                       )))
+                   (cond
+                    ((or (match-beginning 5)
+                         (match-beginning 6)
+                         (match-beginning 1)
+                         (match-beginning 3))
+                     (if (or (match-beginning 1)
+                             (match-beginning 3))
+                         (w3-debug-html
+                           :nocontext
+                           (format "Badly quoted attribute value: %s"
+                                   (match-string 0))))
+                     ;; We have an attribute value literal.
+                     (narrow-to-region (1+ (match-beginning 0))
+                                       (1- (match-end 0)))
+                     ;; Delete (bad) extra quotes from comma separated list.
+                     (cond
+                      ((match-beginning 1)
+                       (while (progn (skip-chars-forward "^\"") (not (eobp)))
+                         (delete-char 1))
+                       (goto-char (point-min)))
+                      ((match-beginning 3)
+                       (while (progn (skip-chars-forward "^'") (not (eobp)))
+                         (delete-char 1))
+                       (goto-char (point-min))))
+                     
+                     ;; In attribute value literals, EE and RS are ignored
+                     ;; and RE and SEPCHAR characters sequences are
+                     ;; replaced by SPACEs.
+                     ;;
+                     ;; (There is no way right now to get RS into one of
+                     ;; these so that it can be ignored.  This is due to
+                     ;; our using Unix line-handling conventions.)
+                     (skip-chars-forward "^&\t\n\r")
+                     (if (eobp)
+                         nil
+                       ;; We must expand entities and replace RS, RE,
+                       ;; and SEPCHAR.
+                       (goto-char (point-min))
+                       (while (progn
+                                (skip-chars-forward "^&")
+                                (not (eobp)))
+                         (w3-expand-entity-at-point-maybe))
+                       (subst-char-in-region (point-min) (point-max) ?\t ? )
+                       (subst-char-in-region (point-min) (point-max) ?\n ? ))
+                     ;; Set this after we have changed the size of the
+                     ;; attribute.
+                     (setq attribute-value-end (1+ (point-max))))
+                    ((match-beginning 8)
+                     (setq attribute-value-end (match-end 8))
+                     (narrow-to-region (point) attribute-value-end))
+                    ((match-beginning 7)
+                     (setq attribute-value-end (match-end 7))
+                     (narrow-to-region (point) attribute-value-end)
+                     ;; Horribly illegal non-SGML handling of bad
+                     ;; HTML on the net.  This can break valid HTML.
+                     (setq attr-value (buffer-substring (point)
+                                                        (match-end 7)))
+                     (w3-debug-html :nocontext
+                       (format "Evil attribute value syntax: %s"
+                               (buffer-substring (point-min) (point-max)))))
+                    (t
+                     (error "impossible attribute value"))))
+                  ((memq (char-after (point)) '(?\" ?'))
+                   ;; Missing terminating quote character.
+                   (narrow-to-region (point)
+                                     (progn
+                                       (forward-char 1)
+                                       (skip-chars-forward "^ \t\n\r'\"<>")
+                                       (setq attribute-value-end (point))))
+                   (w3-debug-html :nocontext
+                     (format "Attribute value missing end quote: %s"
+                             (buffer-substring (point-min) (point-max))))
+                   (narrow-to-region (1+ (point-min)) (point-max)))
+                  (t
+                   ;; We have a syntactically invalid attribute value.  Let's
+                   ;; make a best guess as to what the author intended.
+                   (narrow-to-region (point)
+                                     (progn
+                                       (skip-chars-forward "^ \t\n\r'\"<>")
+                                       (setq attribute-value-end (point))))
+                   (w3-debug-html :nocontext
+                     (format "Bad attribute value syntax: %s"
+                             (buffer-substring (point-min) (point-max))))))
+                 ;; Now we have isolated the attribute value.  We need to
+                 ;; munge the value depending on the syntax of the
+                 ;; attribute.
+                 ;; *** Right now, we only implement the necessary munging
+                 ;; for CDATA attributes, which is none.  I'm not sure why
+                 ;; this happens to work for other attributes right now.
+                 ;; For any other kind of attribute, we are supposed to
+                 ;; * smash case
+                 ;; * remove leading/trailing whitespace
+                 ;; * smash multiple space sequences into single spaces
+                 ;; * verify the syntax of each token
+                 (setq attr-value (buffer-substring (point-min) (point-max)))
+                 (case attr-name
+                   (class
+                    (setq attr-value (split-string attr-value "[ ,]+")))
+                   (align
+                    (if (string-match "^[ \t\r\n]*\\(.*\\)[ \t\r\n]*$"
+                                      attr-value)
+                        (setq attr-value (downcase
+                                          (substring attr-value
+                                                     (match-beginning 1)
+                                                     (match-end 1))))
+                      (setq attr-value (downcase attr-value)))
+                    (setq attr-value (intern attr-value)))
+                   ((src href)
+                    ;; I should expand URLs here
+                    )
+                   (otherwise nil)
+                   )
+                 (widen)
+                 (goto-char attribute-value-end))
+                (t
+                 ;; No value was specified, in which case NAME should be
+                 ;; taken as ATTRIBUTE=NAME where NAME is one of the
+                 ;; enumerated values for ATTRIBUTE.
+                 ;; We assume here that ATTRIBUTE is the same as NAME.
+                 ;; *** Another piece of code will fix the attribute name if it
+                 ;; is wrong.
+                 (setq attr-value (symbol-name attr-name))))
+             
+               ;; Accumulate the attributes.
+               (setq tag-attributes (cons (cons attr-name attr-value)
+                                          tag-attributes)))
+
+             (if (and (eq w3-p-d-tag-name 'img)
+                      (not (assq 'alt tag-attributes)))
+                 (w3-debug-html :bad-style
+                                :outer
+                                "IMG element has no ALT attribute"))
+             (cond
+              ((and (eq w3-p-d-tag-name 'base)
+                    (setq w3-p-s-baseobject
+                          (or (assq 'src tag-attributes)
+                              (assq 'href tag-attributes))))
+               (setq w3-p-s-baseobject (url-generic-parse-url
+                                        (cdr w3-p-s-baseobject))))
+              ((setq w3-p-s-btdt (or (assq 'src tag-attributes)
+                                     (assq 'background tag-attributes)
+                                     (assq 'href tag-attributes)
+                                     (assq 'action tag-attributes)))
+               (setcdr w3-p-s-btdt (url-expand-file-name (cdr w3-p-s-btdt)
+                                                         w3-p-s-baseobject))
+               (setq w3-p-s-btdt (if (url-have-visited-url (cdr w3-p-s-btdt))
+                                     ":visited"
+                                   ":link"))
+               (if (assq 'class tag-attributes)
+                   (setcdr (assq 'class tag-attributes)
+                           (cons w3-p-s-btdt
+                                 (cdr (assq 'class tag-attributes))))
+                 (setq tag-attributes (cons (cons 'class (list w3-p-s-btdt))
+                                            tag-attributes))))
+              )
+             (if (not (eq w3-p-d-tag-name 'input))
+                 nil
+               (setq w3-p-s-btdt (concat ":"
+                                         (downcase
+                                          (or (cdr-safe
+                                               (assq 'type tag-attributes))
+                                              "text"))))
+               (if (assq 'class tag-attributes)
+                   (setcdr (assq 'class tag-attributes)
+                           (cons w3-p-s-btdt
+                                 (cdr (assq 'class tag-attributes))))
+                 (setq tag-attributes (cons (cons 'class (list w3-p-s-btdt))
+                                            tag-attributes))))
+             )
+          
+            ;; Process the end of the tag.
+            (skip-chars-forward " \t\n\r")
+            (cond ((eq ?> (char-after (point)))
+                   ;; Ordinary tag end.
+                   (forward-char 1))
+                  ((and (eq ?/ (char-after (point)))
+                        (not w3-p-d-end-tag-p))
+                   ;; This is a NET-enabling start-tag.
+                   (setq net-tag-p t)
+                   (forward-char 1))
+                  ((eq ?< (char-after (point)))
+                   ;; *** Strictly speaking, the following text has to
+                   ;; lexically be STAGO or ETAGO, which means that it
+                   ;; can't match some other lexical unit.
+                   ;; Unclosed tag.
+                   nil)
+                  (t
+                   ;; Syntax error.
+                   (w3-debug-html
+                     (format "Bad unclosed %s%s tag"
+                             (if w3-p-d-end-tag-p "/" "")
+                             (w3-sgml-name-to-string w3-p-d-tag-name)))))
+            
+            (setq tag-end (point)))
+           
+           ((looking-at "/?>")
+            ;; We are looking at an empty tag (<>, </>).
+            (setq w3-p-d-end-tag-p (eq ?/ (char-after (point))))
+            (setq w3-p-d-tag-name (if w3-p-d-end-tag-p
+                               (w3-element-name w3-p-d-current-element)
+                             ;; *** Strictly speaking, if OMITTAG NO, then
+                             ;; we should use the most recently closed tag.
+                             ;; But OMITTAG YES in HTML and I'm lazy.
+                             (w3-element-name w3-p-d-current-element)))
+            (setq tag-attributes nil)
+            ;; *** Make sure this is not at top level.
+            (setq between-tags-end (1- (point)))
+            (setq tag-end (match-end 0)))
+         
+           ;; *** In SGML, <(doctype)element> is valid tag syntax.  This
+           ;; cannot occur in HTML because the CONCUR option is off in the
+           ;; SGML declaration.
+         
+           ((looking-at "!--")
+            ;; We found a comment, delete to end of comment.
+            (delete-region
+             (1- (point))
+             (progn
+               (forward-char 1)
+               ;; Skip over pairs of -- ... --.
+               ;;
+               ;; This can cause us to hit a stack overflow in the regexp
+               ;; engine.  And I'm not sure its correct anyway.  Lets just
+               ;; always fall back to the (semi) non-SGML way of dealing
+               ;; with comments.  WMP  12/24/97
+;;;               (if (looking-at "\\(--[^-]*\\(-[^-]+\\)*--[ \t\r\n]*\\)+>")
+;;;                   (goto-char (match-end 0))
+;;;                 ;; Syntax error!
+;;;                 (w3-debug-html
+;;;                   "Bad comment (unterminated or unbalanced \"--\" pairs)")
+;;;                 (forward-char 2)
+;;;                 (or (re-search-forward "--[ \t\r\n]*>" nil t)
+;;;                     (search-forward ">" nil t)))
+               (forward-char 2)
+               (or (re-search-forward "--[ \t\r\n]*>" nil t)
+                   (search-forward ">" nil t))
+               (point))))
+           
+           ((looking-at "!>\\|\\?[^>]*>")
+            ;; We are looking at an empty comment or a processing
+            ;; instruction.  Delete it.
+            (replace-match "")
+            (delete-char -1))
+
+           ((looking-at "![a-z]")
+            ;; We are looking at a markup declaration.  Delete it.
+            ;; *** Technically speaking, to handle valid HTML I think we
+            ;; need to handle "<!USEMAP ... >" declarations.  In the future,
+            ;; to handle general SGML, we should parse "<!DOCTYPE ... >"
+            ;; declarations as well (which can contain other declarations).
+            ;; In the very distant future, perhaps we will handle "<!SGML
+            ;; ... >" declarations.
+            ;; *** Should warn if it's not SGML, DOCTYPE, or USEMAP.
+            (backward-char 1)
+            (delete-region
+             (point)
+             (progn
+               (condition-case nil
+                   (forward-sexp 1)
+                 (error
+                  ;; *** This might not actually be bad syntax, but might
+                  ;; instead be a -- ... -- comment with unbalanced
+                  ;; parentheses somewhere inside the declaration.  Handling
+                  ;; this properly would require full parsing of markup
+                  ;; declarations, a goal for the future.
+                  (w3-debug-html "Bad <! syntax.")
+                  (skip-chars-forward "^>")
+                  (if (eq ?> (char-after (point)))
+                      (forward-char))))
+               (point))))
+         
+           ((looking-at "!\\\[\\(\\([ \t\n\r]*[a-z]+\\)+[ \t\n\r]*\\)\\\[")
+            ;; We are looking at a marked section.
+            ;; *** Strictly speaking, we should issue a warning if the
+            ;; keywords are invalid or missing or if the "[" does not follow.
+            ;; We must look at the keywords to understand how to parse it.
+            ;; *** Strictly speaking, we should perform parameter entity
+            ;; substitution on the keywords first.
+            (goto-char (match-beginning 1))
+            (insert ?\))
+            (goto-char (1- (match-beginning 0)))
+            (delete-char 3)
+            (insert ?\()
+            (backward-char 1)
+            (let* ((keywords (read (current-buffer)))
+                   ;; Multiple keywords may appear, but only the most
+                   ;; significant takes effect.  Rank order is IGNORE, CDATA,
+                   ;; RCDATA, INCLUDE, and TEMP.  INCLUDE and TEMP have the
+                   ;; same effect.
+                   (keyword (car-safe (cond ((memq 'IGNORE keywords))
+                                            ((memq 'CDATA keywords))
+                                            ((memq 'RCDATA keywords))
+                                            ((memq 'INCLUDE keywords))
+                                            ((memq 'TEMP keywords))))))
+              (or (eq ?\[ (char-after (point)))
+                  ;; I probably shouldn't even check this, since it is so
+                  ;; impossible.
+                  (error "impossible ??"))
+              (forward-char 1)
+              (delete-region (1- (match-beginning 0)) (point))
+              (cond ((eq 'IGNORE keyword)
+                     ;; Scan forward skipping over matching <![ ... ]]>
+                     ;; until we find an unmatched "]]>".
+                     (let ((ignore-nesting 1)
+                           (start-pos (point)))
+                       (while (> ignore-nesting 0)
+                         (if (re-search-forward "<!\\\\\[\\|\]\]>" nil t)
+                             (setq ignore-nesting
+                                   (if (eq ?> (preceding-char))
+                                       (1- ignore-nesting)
+                                     (1+ ignore-nesting)))
+                           (w3-debug-html
+                             "Unterminated IGNORE marked section.")
+                           (setq ignore-nesting 0)
+                           (goto-char start-pos)))
+                       (delete-region start-pos (point))))
+                    ((eq 'CDATA keyword)
+                     (error "***unimplemented***"))
+                    ((eq 'RCDATA keyword)
+                     (error "***unimplemented***"))
+                    ((memq keyword '(INCLUDE TEMP))
+                     (error "***unimplemented***")))))
+           ((and (looking-at "!")
+                 w3-netscape-compatible-comments)
+            ;; Horribly illegal non-SGML handling of bad HTML on the net.
+            ;; This can break valid HTML.
+            ;; This arises because Netscape discards anything looking like
+            ;; "<!...>".  So people expect they can use this construct as
+            ;; a comment.
+            (w3-debug-html "Evil <! comment syntax.")
+            (backward-char 1)
+            (delete-region
+             (point)
+             (progn
+               (skip-chars-forward "^>")
+               (if (eq ?> (char-after (point)))
+                   (forward-char))
+               (point))))
+           (t
+            ;; This < is not a markup character.  Pretend we didn't notice
+            ;; it at all.  We have skipped over the < already, so just loop
+            ;; again.
+            )))
+       
+         ((eq ?& (char-after (point)))
+          (w3-expand-entity-at-point-maybe))
+
+         ((and (eq ?\] (char-after (point)))
+               w3-p-d-in-parsed-marked-section
+               (looking-at "]]>"))
+          ;; *** handle the end of a parsed marked section.
+          (error "***unimplemented***"))
+
+         ((and (eq ?/ (char-after (point)))
+               w3-p-d-null-end-tag-enabled)
+          ;; We are looking at a null end tag.
+          (setq w3-p-d-end-tag-p t)
+          (setq between-tags-end (point))
+          (setq tag-end (1+ (point)))
+          (setq w3-p-d-tag-name (w3-element-name w3-p-d-current-element)))
+       
+         ;; This can be slow, since we'll hardly ever get here.
+         ;; *** Strictly speaking, I think we're supposed to handle
+         ;; shortrefs that begin with the same characters as other markup,
+         ;; preferring the longest match.
+         ;; I will assume that shortrefs never begin with <, &, \], /.
+         ((setq ref (catch 'found-shortref
+                      (let ((refs w3-p-d-shortrefs))
+                        (while refs
+                          (if (looking-at (car (car refs)))
+                              (throw 'found-shortref (cdr (car refs))))
+                          (setq refs (cdr refs))))))
+          ;; We are looking at a shortref for which there is an
+          ;; expansion defined in the current syntax.  Replace with the
+          ;; expansion, leaving point at the beginning so it will be parsed
+          ;; on the next loop.
+          ;; *** eek.  This is wrong if the shortref is for an entity with
+          ;; CDATA syntax which should not be reparsed for tags.
+          (replace-match "")
+          (let ((pt (point)))
+            (insert ref)
+            (goto-char pt)))
+         
+         ((looking-at (eval-when-compile
+                        (concat "[" (w3-invalid-sgml-chars) "]")))
+          (w3-debug-html
+            (format "Invalid SGML character: %c" (char-after (point))))
+          (insert (or (cdr-safe (assq (char-after (point))
+                                      w3-invalid-sgml-char-replacement)) ""))
+          (delete-char 1))
+         ((eobp)
+          ;; We have finished the buffer.  Make sure we process the last
+          ;; piece of text, if any.
+          (setq between-tags-end (point))
+          ;; We have to test what's on the element stack because this
+          ;; piece of code gets executed twice.
+          (cond ((not (eq '*holder (w3-element-name w3-p-d-current-element)))
+                 ;; This forces the calculation of implied omitted end tags.
+                 (setq w3-p-d-tag-name '*document)
+                 (setq w3-p-d-end-tag-p t)
+                 (setq tag-end (point)))))
+         
+         (t
+          (error "unreachable code, this can't happen")))
+        
+        ;; If we have determined the boundaries of a non-empty between-tags
+        ;; region of text, then handle it.
+        (cond
+         (between-tags-end
+          (cond
+           ((< between-tags-start between-tags-end)
+            ;; We have a non-empty between-tags region.
+
+            ;; We check if it's entirely whitespace, because we record the
+            ;; transitions for whitespace separately from those for
+            ;; data with non-whitespace characters.
+            (goto-char between-tags-start)
+            (skip-chars-forward " \t\n\r" between-tags-end)
+            (cond
+             ((w3-grok-tag-or-data (prog1 
+                                       (if (= between-tags-end (point))
+                                           '*space
+                                         '*data)
+                                     (goto-char between-tags-end)))
+              ;; We have to include the text in the current element's
+              ;; contents.  If this is the first item in the current
+              ;; element's contents, don't include a leading newline if
+              ;; there is one.  Add a trailing newline as a separate text
+              ;; item so that it can be removed later if it turns out to
+              ;; be the last item in the current element's contents when
+              ;; the current element is closed.
+              ;; *** We could perform this test before calling
+              ;; w3-grok-tag-or-data, but it's not clear which will be
+              ;; faster in practice.
+              (or (setq content (w3-element-content w3-p-d-current-element))
+                  ;; *** Strictly speaking, in SGML the record end is
+                  ;; carriage return, not line feed.
+                  (if (eq ?\n (char-after between-tags-start))
+                      (setq between-tags-start (1+ between-tags-start))))
+              (if (= between-tags-start (point))
+                  ;; Do nothing.
+                  nil
+                ;; We are definitely going to add data characters to the
+                ;; content.
+                (cond
+                 ((and (= ?\n (preceding-char))
+                       (/= between-tags-start (1- (point))))
+                  (setq content (cons (buffer-substring between-tags-start
+                                                        (1- (point)))
+                                      content))
+                  (setq content (cons "\n" content)))
+                 (t
+                  (setq content (cons (buffer-substring between-tags-start
+                                                        (point))
+                                      content))))
+                (w3-set-element-content w3-p-d-current-element content))))))
+          
+          (setq between-tags-end nil)))
+      
+        ;; If the previous expression modified (point), then it went to
+        ;; the value of between-tags-end.
+      
+        ;; If we found a start or end-tag, we need to handle it.
+        (cond
+         (w3-p-d-tag-name
+        
+          ;; Move past the tag and prepare for next between-tags region.
+          (goto-char tag-end)
+          (setq between-tags-start (point))
+        
+          (cond
+           (w3-p-d-end-tag-p
+            ;; Handle an end-tag.
+            (if (eq w3-p-d-tag-name (w3-element-name w3-p-d-current-element))
+                (w3-close-element)
+              ;; Handle the complex version.  We have to search up (down?)
+              ;; the open element stack to find the element that matches (if
+              ;; any).  Then we close all of the elements.  On a conforming
+              ;; SGML document this can do no wrong and it's not
+              ;; unreasonable on a non-conforming document.
+            
+              ;; Can't safely modify stack until we know the element we want
+              ;; to find is in there, so work with a copy.
+              (setq open-list w3-p-d-open-element-stack)
+              (while (and open-list
+                          (not (eq w3-p-d-tag-name
+                                   (w3-element-name (car open-list)))))
+                (setq open-list (cdr open-list)))
+              (cond (open-list
+                     ;; We found a match.  Pop elements.
+                     ;; We will use the following value as a sentinel.
+                     (setq open-list (cdr open-list))
+                     (while (not (eq open-list w3-p-d-open-element-stack))
+                       (w3-close-element t))
+                     (w3-close-element))
+                    (t
+                     ;; Bogus end tag.
+                     (w3-debug-html
+                       (format "Unmatched end-tag </%s>"
+                               (w3-sgml-name-to-string w3-p-d-tag-name)))))))
+           (t
+            ;; Handle a start-tag.
+            (cond
+             ;; Check if the new element is allowed in the current element's
+             ;; content model.
+             ((w3-grok-tag-or-data w3-p-d-tag-name)
+              (w3-open-element w3-p-d-tag-name tag-attributes)
+            
+              ;; Handle NET-enabling start tags.
+              (cond ((and net-tag-p
+                          (not w3-p-d-null-end-tag-enabled))
+                     ;; Save old values.
+                     (w3-set-element-undo-list 
+                      w3-p-d-current-element 
+                      (cons (cons 'w3-p-d-non-markup-chars
+                                  w3-p-d-non-markup-chars)
+                            (cons '(w3-p-d-null-end-tag-enabled . nil)
+                                  (w3-element-undo-list 
w3-p-d-current-element))))
+                     ;; Alter syntax.
+                     (setq w3-p-d-null-end-tag-enabled t)
+                     (w3-update-non-markup-chars)))
+            
+              (setq content-model
+                    (w3-element-content-model w3-p-d-current-element))
+            
+              ;; If the element does not have parsed contents, then we
+              ;; can find its contents immediately.
+              (cond
+               ((memq content-model '(EMPTY CDATA XCDATA XXCDATA RCDATA))
+                (cond
+                 ((eq 'EMPTY content-model)
+                  (w3-close-element))
+                 ((eq 'CDATA content-model)
+                  ;; CDATA: all data characters until an end-tag.  We'll
+                  ;; process the end-tag on the next loop.
+                  (if (re-search-forward (if w3-p-d-null-end-tag-enabled
+                                             "</[a-z>]\\|/"
+                                           "</[a-z>]")
+                                         nil 'move)
+                      (goto-char (match-beginning 0))))
+                 ((eq 'XCDATA content-model)
+                  ;; XCDATA: special non-SGML-standard mode which includes
+                  ;; all data characters until "</foo" is seen where "foo"
+                  ;; is the name of this element (for XMP and LISTING).
+                  (if (search-forward 
+                       (concat "</" (symbol-name
+                                     (w3-element-name w3-p-d-current-element)))
+                       nil 'move)
+                      (goto-char (match-beginning 0))))
+                 ((eq 'XXCDATA content-model)
+                  ;; XXCDATA: special non-SGML-standard mode which includes
+                  ;; all data until end-of-entity (end-of-buffer for us)
+                  ;; (for PLAINTEXT).
+                  (goto-char (point-max)))
+                 ((eq 'RCDATA content-model)
+                  ;; RCDATA: all data characters until end-tag is seen,
+                  ;; except that entities are expanded first, although the
+                  ;; expansions are _not_ scanned for end-tags, although the
+                  ;; expansions _are_ scanned for further entity
+                  ;; references.
+                  (while (progn
+                           (if (re-search-forward (if 
w3-p-d-null-end-tag-enabled
+                                                      "</[a-z>]\\|[/&]"
+                                                    "</[a-z>]\\|&")
+                                                  nil 'move)
+                               (goto-char (match-beginning 0)))
+                           (eq ?& (char-after (point))))
+                    (w3-expand-entity-at-point-maybe)))))))
+             (t
+              ;; The element is illegal here.  We'll just discard the start
+              ;; tag as though we never saw it.
+              ))))
+        
+          (setq w3-p-d-tag-name nil)
+          (setq w3-p-d-end-tag-p nil)
+          (setq net-tag-p nil)
+          (setq tag-attributes nil)
+          (setq tag-end nil)))
+        
+        ;; End of main while loop.
+        )
+    
+      ;; We have finished parsing the buffer!
+      (if status-message-format
+          (message "%sdone" (format status-message-format 100)))
+    
+      ;; *** For debugging, save the true parse tree.
+      ;; *** Make this look inside *DOCUMENT.
+      (setq w3-last-parse-tree
+            (w3-element-content w3-p-d-current-element))
+
+      (w3-element-content w3-p-d-current-element)
+      )))
+
+
+
+(provide 'w3-parse)
+
+;; Local variables:
+;; indent-tabs-mode: nil
+;; end:
diff --git a/lisp/w3-print.el b/lisp/w3-print.el
new file mode 100644
index 0000000..bf1c64e
--- /dev/null
+++ b/lisp/w3-print.el
@@ -0,0 +1,87 @@
+;;; w3-print.el --- Printing support for emacs-w3
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:11 $
+;; Version: $Revision: 1.1 $
+;; Keywords: faces, help, printing, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar w3-postscript-print-function 'ps-print-buffer-with-faces
+  "*Name of the function to use to print a buffer as PostScript.
+This should take no arguments, and act on the current buffer.
+Possible values include:
+ps-print-buffer-with-faces   - print immediately
+ps-spool-buffer-with-faces   - spool for later")
+
+(require 'mule-sysdp)
+
+;;;###autoload
+(defun w3-print-this-url (&optional url format)
+  "Print out the current document (in LaTeX format)"
+  (interactive)
+  (if (not url) (setq url (url-view-url t)))
+  (let* ((completion-ignore-case t)
+        (format (or format
+                    (completing-read
+                     "Format: "
+                     '(("HTML Source")         ; The raw HTML code
+                       ("Formatted Text")      ; Plain ASCII rendition
+                       ("PostScript")          ; Pretty PostScript
+                       ("LaTeX'd")             ; LaTeX it, then print
+                       )
+                     nil t))))
+    (save-excursion
+      (cond
+       ((equal "HTML Source" format)
+       (if w3-current-source
+           (let ((x w3-current-source))
+             (set-buffer (get-buffer-create url-working-buffer))
+             (erase-buffer)
+             (insert x))
+         (url-retrieve url))
+       (lpr-buffer))
+       ((or (equal "Formatted Text" format)
+           (equal "" format))
+       (lpr-buffer))
+       ((equal "PostScript" format)
+       (funcall w3-postscript-print-function))
+       ((equal "LaTeX'd" format)
+       (w3-parse-tree-to-latex w3-current-parse url)
+       (save-window-excursion
+         (mule-write-region-no-coding-system
+          (point-min) (point-max)
+          (expand-file-name "w3-tmp.latex"
+                            w3-temporary-directory) nil 5)
+         (shell-command
+          (format
+           "cd %s ; latex w3-tmp.latex ; latex w3-tmp.latex ; %s w3-tmp.dvi ; 
rm -f w3-tmp*"
+           w3-temporary-directory
+           w3-print-command))
+         (kill-buffer "*Shell Command Output*")))))))
+
+;;;###autoload
+(defun w3-print-url-under-point ()
+  "Print out the url under point (in LaTeX format)"
+  (interactive)
+  (w3-print-this-url (w3-view-this-url t)))
+
+(provide 'w3-print)
diff --git a/lisp/w3-props.el b/lisp/w3-props.el
new file mode 100644
index 0000000..49ce2e3
--- /dev/null
+++ b/lisp/w3-props.el
@@ -0,0 +1,93 @@
+;;; w3-props.el --- Additional text property stuff
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:11 $
+;; Version: $Revision: 1.1 $
+;; Keywords: faces
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1995, 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996, 1997 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; Additional text property functions.
+
+;; The following three text property functions are not generally available (and
+;; it's not certain that they should be) so they are inlined for speed.
+;; The case for `fillin-text-property' is simple; it may or not be generally
+;; useful.  (Since it is used here, it is useful in at least one place.;-)
+;; However, the case for `append-text-property' and `prepend-text-property' is
+;; more complicated.  Should they remove duplicate property values or not?  If
+;; so, should the first or last duplicate item remain?  Or the one that was
+;; added?  In our implementation, the first duplicate remains.
+
+(defsubst fillin-text-property (start end setprop markprop value &optional 
object)
+  "Fill in one property of the text from START to END.
+Arguments PROP and VALUE specify the property and value to put where none are
+already in place.  Therefore existing property values are not overwritten.
+Optional argument OBJECT is the string or buffer containing the text."
+  (let ((start (text-property-any start end markprop nil object)) next)
+    (while start
+      (setq next (next-single-property-change start markprop object end))
+      (put-text-property start next setprop value object)
+      (put-text-property start next markprop value object)
+      (setq start (text-property-any next end markprop nil object)))))
+
+(defsubst w3-props-unique (list)
+  "Uniquify LIST, deleting elements using `delq'.
+Return the list with subsequent duplicate items removed by side effects."
+  (let ((list list))
+    (while list
+      (setq list (setcdr list (delq (car list) (cdr list))))))
+  list)
+
+;; A generalisation of `facemenu-add-face' for any property, but without the
+;; removal of inactive faces via `facemenu-discard-redundant-faces' and special
+;; treatment of `default'.  Uses `unique' to remove duplicate property values.
+(defsubst prepend-text-property (start end prop value &optional object)
+  "Prepend to one property of the text from START to END.
+Arguments PROP and VALUE specify the property and value to prepend to the value
+already in place.  The resulting property values are always lists, and unique.
+Optional argument OBJECT is the string or buffer containing the text."
+  (let ((val (if (listp value) value (list value))) next prev)
+    (while (/= start end)
+      (setq next (next-single-property-change start prop object end)
+           prev (get-text-property start prop object))
+      (put-text-property
+       start next prop
+       (w3-props-unique (append val (if (listp prev) prev (list prev))))
+       object)
+      (setq start next))))
+
+(defsubst append-text-property (start end prop value &optional object)
+  "Append to one property of the text from START to END.
+Arguments PROP and VALUE specify the property and value to append to the value
+already in place.  The resulting property values are always lists, and unique.
+Optional argument OBJECT is the string or buffer containing the text."
+  (let ((val (if (listp value) value (list value))) next prev)
+    (while (/= start end)
+      (setq next (next-single-property-change start prop object end)
+           prev (get-text-property start prop object))
+      (put-text-property
+       start next prop
+       (w3-props-unique (append (if (listp prev) prev (list prev)) val))
+       object)
+      (setq start next))))
+
+(provide 'w3-props)
diff --git a/lisp/w3-script.el b/lisp/w3-script.el
new file mode 100644
index 0000000..a951cce
--- /dev/null
+++ b/lisp/w3-script.el
@@ -0,0 +1,100 @@
+;;; w3-script.el --- Scripting support
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:11 $
+;; Version: $Revision: 1.1 $
+;; Keywords: hypermedia, scripting
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1997, 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'cl)
+(require 'w3-elisp)
+(require 'w3-jscript)
+
+;; Event Handlers
+;; onclick              ; It was clicked on
+;; onchange            ; Text area was changed
+;; onselect            ; Menu choice changed
+;; onmouseover         ; Mouse is over us
+;; onmouseout          ; Mouse left us
+;; onblur              ; We lost focus
+;; onfocus             ; We gained focus
+;; onload              ; We got loaded
+;; onunload            ; We got unloaded
+;; onreset             ; Form got reset
+;; onsubmit            ; From is about to be submitted
+;; onabort             ; User cancelled loading an image
+;; onerror             ; Error occurred loading an image
+
+(defgroup w3-scripting nil
+  "When, where, how, and why to enable client-side scripting."
+  :group 'w3)
+
+(defcustom w3-do-scripting nil
+  "*Whether to handle client-side scripting or not.
+If you are adventurous, set this to `t'"
+  :group 'w3-scripting
+  :type 'boolean)
+
+(defvar w3-current-scripting-language 'elisp)
+(make-variable-buffer-local 'w3-current-scripting-language)
+
+(put 'form 'w3-event-handlers
+     '(onclick onchange onselect onblur onfocus onreset onsubmit))
+
+(put 'mouse 'w3-event-handlers '(onmouseover onmouseout))
+
+(put 'misc 'w3-event-handlers '(onload onunload))
+
+(put 'all 'w3-event-handlers (append (get 'form 'w3-event-handlers)
+                                    (get 'mouse 'w3-event-handlers)))
+
+(defun w3-script-find-event-handlers (pt type)
+  (if w3-do-scripting
+      (let* ((html-stack (get-text-property pt 'html-stack))
+            (args nil)
+            (rval nil)
+            (cur nil))
+       (while html-stack
+         (setq args (cdr (pop html-stack)))
+         (while (setq cur (pop args))
+           (if (memq (car cur) (get type 'w3-event-handlers))
+               (setq rval (cons cur rval)))))
+       (nreverse rval))))
+
+(defun w3-script-evaluate-form (f)
+  (if w3-do-scripting
+      (case w3-current-scripting-language
+       (elisp
+        (let ((st 0)
+              (form nil)
+              (max (length f)))
+          (condition-case ()
+              (while (and (< st max) (setq form (read-from-string f st)))
+                (setq st (cdr form)
+                      form (car form))
+                (w3-elisp-safe-eval form))
+            (error nil))))
+       (otherwise
+        (message "Unimplemented scripting language: %S"
+                 w3-current-scripting-language)))))
+
+(provide 'w3-script)
diff --git a/lisp/w3-speak-table.el b/lisp/w3-speak-table.el
new file mode 100644
index 0000000..cd25413
--- /dev/null
+++ b/lisp/w3-speak-table.el
@@ -0,0 +1,689 @@
+;;;$Id: w3-speak-table.el,v 1.1 1998/12/01 22:12:11 wmperry Exp $
+;;;Authors: Thierry Emery <address@hidden>, T.V. Raman <address@hidden>
+;;;Description: Speak W3 tables
+
+(require 'cl)
+;;{{{  inline functions
+
+(defsubst w3-table-inside-table-display-p ()
+  "Indicates by looking at `w3-table-structure' whether (point) is inside a W3 
table"
+  (loop for table-info in w3-table-structure
+    if (and (>= (point) (car table-info))
+           (<= (point) (cadr table-info)))
+    return t))
+
+(defmacro w3-within-cell (cell-info table-info &rest forms)
+  "Enables to recursively enter the current cell using `extract-rectangle'
+using CELL-INFO and TABLE-INFO and process FORMS inside it (for instance to 
process subtables)"
+  (` (let* ((cell-row (w3-cell-info-row (, cell-info)))
+           (cell-col (w3-cell-info-column (, cell-info)))
+           (cell-beg (w3-cell-info-start (, cell-info)))
+           (cell-end (w3-cell-info-end (, cell-info)))
+           (cell-contents (extract-rectangle cell-beg cell-end))
+           (cell-x (count-lines (save-excursion (goto-char cell-beg) 
(beginning-of-line) (point))
+                                (save-excursion (beginning-of-line) (point))))
+           (current-col (current-column))
+           (cell-y (save-excursion (forward-line (- cell-x))
+                                   (move-to-column current-col)
+                                   (- (point) cell-beg)))
+           cell-table-structure)
+       ;; really inside cell ?
+       (when (and (, cell-info)
+                 (>= (point) cell-beg)
+                 (<= (point) cell-end))
+        ;; find current subtables structure
+        (loop for subtable in (w3-table-info-subtables (, table-info))
+          if (and (= cell-row (car subtable))
+                  (= cell-col (cadr subtable)))
+          do (setq cell-table-structure (cons (cddr subtable) 
cell-table-structure)))
+        (with-temp-buffer
+          (mapc (lambda (s) (insert s ?\n)) cell-contents)
+          ;; remove end of line padding
+          (when cell-table-structure
+            (goto-char (point-min))
+            (end-of-line)
+            (while (not (eobp))
+              (delete-horizontal-space)
+              (forward-line 1)
+              (end-of-line)))
+          ;; reposition
+          (goto-char (point-min))
+          (forward-line cell-x)
+          (move-to-column cell-y)
+          (setq w3-table-structure (nreverse cell-table-structure))
+          (,@ forms))))))
+
+(put 'w3-within-cell 'lisp-indent-function 2)
+(put 'w3-within-cell 'edebug-form-spec '(sexp sexp &rest form))
+
+(defmacro w3-table-compute-relative-movement (&rest forms)
+  "Record a movement done by &rest FORMS (e.g. inside a temporary buffer)
+and return it as (horizontal-offset . vertical-offset)"
+  (` (let ((origin-line-beg (save-excursion (beginning-of-line) (point)))
+          (origin-char-col (current-column)))
+       (,@ forms)
+       (cons (- (current-column) origin-char-col)
+            (let* ((new-line-beg (save-excursion (beginning-of-line) (point)))
+                   (line-diff (count-lines new-line-beg origin-line-beg)))
+              (if (< new-line-beg origin-line-beg)
+                  (- line-diff)
+                line-diff))))))
+(put 'w3-table-compute-relative-movement 'lisp-indent-function 0)
+(put 'w3-table-compute-relative-movement 'edebug-form-spec '(&rest form))
+
+(defsubst w3-table-redo-relative-movement (movement)
+  "Redo a movement indicated as (horizontal-offset . vertical-offset)"
+  (when movement
+    (let ((to-col (+ (current-column) (car movement)))
+         (vertical (cdr movement)))
+      (forward-line vertical)
+      (move-to-column to-col))))
+
+(defmacro w3-table-move-within-cell (at-depth cell-info move-function)
+  "Move within a cell (in a temporary buffer) and reflect the same movement
+in the containing table in the original buffer"
+  (` (if (null (, cell-info))
+        (error "Not inside a W3 cell")
+       (let (table-movement)
+        (w3-within-cell (, cell-info) table-info
+                        (setq table-movement
+                              (w3-table-compute-relative-movement
+                               (funcall (, move-function) (1- at-depth)))))
+        (w3-table-redo-relative-movement table-movement)))))
+(put 'w3-table-move-within-cell 'lisp-indent-function 2)
+(put 'w3-table-move-within-cell 'edebug-form-spec '(sexp sexp &rest form))
+
+(defmacro w3-table-move-within-subtable (at-depth cell-info move-function)
+  "Move within a subtable (in a temporary buffer) and reflect the same movement
+in the containing table in the original buffer"
+  (` (if (null (, cell-info))
+        (error "Not inside a W3 cell")
+       (let ((subtable-info (w3-cell-info-current-subtable (, cell-info)))
+            table-movement)
+        (if (null subtable-info)
+            (error "Not inside a W3 table")
+          (w3-within-cell (, cell-info) table-info
+                          (setq table-movement
+                                (w3-table-compute-relative-movement
+                                 (funcall (, move-function) (1- at-depth) 
subtable-info))))
+          (w3-table-redo-relative-movement table-movement))))))
+
+(put 'w3-table-move-within-subtable 'lisp-indent-function 2)
+(put 'w3-table-move-within-subtable 'edebug-form-spec '(sexp sexp &rest form))
+
+;;}}}
+;;{{{  find a table
+
+(defun w3-find-table (&optional at-depth)
+  "Search forward for a table, go to its start and return (start . end)"
+  (interactive "p")
+  (let* ((table-info (w3-table-info 1 t))
+        (cell-info (and table-info (w3-table-info-current-cell table-info))))
+    (if (and (numberp at-depth) (> at-depth 1))
+       (if (null cell-info)
+           (error "Not inside a W3 table cell")
+         (w3-table-move-within-cell at-depth cell-info
+                                    'w3-find-table))
+      (if (or (not w3-table-structure)
+             (> (point) (car (car w3-table-structure))))
+         (error "No other W3 table")
+       (let (table-found)
+         (loop for table-info in w3-table-structure
+           until (> (point) (car table-info))
+           do (setq table-found table-info)
+           finally return (progn
+                            (goto-char (car table-found))
+                            (cons (car table-found) (cdr table-found)))))))))
+
+;;}}}
+;;{{{ table info
+
+;;; Return table info if inside a table cell.
+(defstruct w3-table-info
+  start                                        ; starting point in buffer
+  end                                  ; end point in buffer
+  subtables                            ; w3-table-structure extract
+  current-cell                         ; `w3-cell-info' struct
+  rows                                 ; number of rows
+  columns                              ; number of columns
+  row-heights
+  column-widths
+  rowspans
+  colspans)
+
+(defun w3-table-info (&optional to-depth noerror)
+  "Give table info as a `w3-table-info' struct, limited to TO-DEPTH if it is a 
number.
+TO-DEPTH = 0 means without current-cell info.
+TO-DEPTH = n > 0 means without nth subtable info in the nth current-cell info.
+If no table is found and NOERROR is nil, an error is signaled."
+  (let ((origin (point))
+       start end subtables dimensions)
+    (loop for info in w3-table-structure
+      if (and (>= origin (car info))
+             (<= origin (cadr info)))
+      do (setq start (car info)
+              end (cadr info)
+              subtables (caddr info)
+              dimensions (cdddr info)))
+    (if (not dimensions)
+       (unless noerror
+         (error "Not inside a W3 table"))
+      (let ((table-info (make-w3-table-info)))
+       (setf (w3-table-info-start table-info)
+             start)
+       (setf (w3-table-info-end table-info)
+             end)
+       (setf (w3-table-info-subtables table-info)
+             subtables)
+       (setf (w3-table-info-rows table-info)
+             (nth 0 dimensions))
+       (setf (w3-table-info-columns table-info)
+             (nth 1 dimensions))
+       (setf (w3-table-info-row-heights table-info)
+             (nth 2 dimensions))
+       (setf (w3-table-info-column-widths table-info)
+             (nth 3 dimensions))
+       (setf (w3-table-info-rowspans table-info)
+             (nth 4 dimensions))
+       (setf (w3-table-info-colspans table-info)
+             (nth 5 dimensions))
+       ;; current cell info
+       (when (or (null to-depth)
+                 (and (numberp to-depth) (> to-depth 0)))
+         (setf (w3-table-info-current-cell table-info)
+               (w3-cell-info table-info to-depth)))
+       table-info))))
+
+;;}}}
+;;{{{  Location
+
+(defun w3-table-current-row-number (&optional table-info)
+  "Return spanless row number"
+  (let* ((table-info (or table-info (w3-table-info 0)))
+        (start (w3-table-info-start table-info))
+        (line-count (1+ (count-lines (save-excursion (goto-char start) 
(beginning-of-line) (point))
+                                     (save-excursion (beginning-of-line) 
(point)))))
+        (num-rows (w3-table-info-rows table-info))
+        (row-heights (w3-table-info-row-heights table-info))
+        (row 0))
+    (while (and (< row num-rows)
+               (< (aref row-heights row) line-count))
+      (setq line-count (- line-count (aref row-heights row))
+           row (1+ row)))
+    (when (< row num-rows)
+      (1+ row))))
+
+(defun w3-table-current-column-number (&optional table-info)
+  "Return spanless column number"
+  (let* ((table-info (or table-info (w3-table-info 0)))
+        (start (w3-table-info-start table-info))
+        (char-col (current-column))
+        (num-cols (w3-table-info-columns table-info))
+        (col-widths (w3-table-info-column-widths table-info))
+        (col 0))
+    (while (and (< col num-cols)
+               (< (aref col-widths col) char-col))
+      (setq char-col (- char-col (aref col-widths col) 1)
+           col (1+ col)))
+    (when (< col num-cols)
+      (1+ col))))
+
+(defun w3-table-row-column-spans (&optional table-info)
+  "Return spanning cell ((row . rowspan) . (column . colspan))"
+  (let* ((table-info (or table-info (w3-table-info 0)))
+        (start (w3-table-info-start table-info))
+        (line-count (1+ (count-lines (save-excursion (goto-char start) 
(beginning-of-line) (point))
+                                     (save-excursion (beginning-of-line) 
(point)))))
+        (num-rows (w3-table-info-rows table-info))
+        (row-heights (w3-table-info-row-heights table-info))
+        (table-rowspans (w3-table-info-rowspans table-info))
+        (row 0)
+        (rowspan 0)
+        (char-col (current-column))
+        (num-cols (w3-table-info-columns table-info))
+        (col-widths (w3-table-info-column-widths table-info))
+        (table-colspans (w3-table-info-colspans table-info))
+        col colspan)
+    ;; look for spanning cell origin row
+    (while (and (< row num-rows)
+               (> line-count 0))
+      (setq row (+ row rowspan))
+      (when (< row num-rows)
+       (let ((row-rowspans (aref table-rowspans row))
+             (row-colspans (aref table-colspans row))
+             (row-char-col char-col))
+         (setq col 0
+               colspan 0)
+         ;; look for spanning cell origin column for this candidate spanning 
cell origin row
+         (while (and (< col num-cols)
+                     (> row-char-col -1))
+           (setq col (+ col colspan))
+           (when (< col num-cols)
+             (setq colspan (aref row-colspans col))
+             (loop for i from 0 to (1- colspan)
+               do (setq row-char-col (- row-char-col (aref col-widths (+ col 
i)) 1)))))
+         ;; take into account row-span from this candidate spanning cell 
origin column
+         (setq rowspan (if (< col num-cols)
+                           (aref row-rowspans col)
+                         1))
+         (loop for i from 0 to (1- rowspan)
+           do (setq line-count (- line-count (aref row-heights (+ row i))))))))
+    
+    (cons
+     (and (< row num-rows) (cons (1+ row) rowspan))
+     (and (< col num-cols) (cons (1+ col) colspan)))))
+
+;;}}}
+;;{{{  cell info
+
+;;; Return cell info if inside a table cell.
+(defstruct w3-cell-info
+  row                                  ; row number of this cell in its table
+  column                               ; column number of this cell in its 
table
+  rowspan
+  colspan
+  start                                        ; starting point of cell 
contents in buffer (for `extract-rectangle')
+  end                                  ; end point of cell contents in buffer 
(for `extract-rectangle')
+  current-subtable                     ; `w3-table-info' struct
+  )
+
+(defun w3-cell-info (&optional table-info to-depth)
+  "If inside a table, tell which cell it is in, its rowspan, colspan,
+start and end points, and its current subtable as a `w3-cell-info' struct.
+NB: row and col start from 1
+    beg and end delimit the interior of the cell, so they can be passed on
+    to `extract-rectangle' in order to get cell contents."
+  (let* ((origin (point))
+        (table-info (or table-info (w3-table-info 0)))
+        (table-row-col-spans (w3-table-row-column-spans table-info))
+        (table-row (caar table-row-col-spans))
+        (rowspan (cdar table-row-col-spans))
+        (table-col (cadr table-row-col-spans))
+        (colspan (cddr table-row-col-spans)))
+    (when (and table-row table-col)
+      (let* ((cell-info (make-w3-cell-info))
+            (start (w3-table-info-start table-info))
+            (table-row-heights (w3-table-info-row-heights table-info))
+            (table-col-widths (w3-table-info-column-widths table-info))
+            (table-width (+ (apply '+ (map 'list '1+ table-col-widths)) 2))
+            (table-row-index (1- table-row))
+            (table-col-index (1- table-col))
+            cell-beg
+            (cell-beg-offset 0)
+            cell-end
+            (cell-end-offset 0))
+       ;; determine beg
+       (goto-char start)
+       (loop for i from 0 to (1- table-row-index)
+             do (next-line (aref table-row-heights i)))
+       (loop for i from 0 to (1- table-col-index)
+             do (setq cell-beg-offset (+ cell-beg-offset (aref 
table-col-widths i) 1)))
+       (move-to-column (+ (current-column) cell-beg-offset))
+       (save-excursion
+         (next-line 1)
+         (move-to-column (1+ (current-column)))
+         (setq cell-beg (point)))
+       ;; determine end
+       (loop for i from 0 to (1- rowspan)
+             do (next-line (aref table-row-heights (+ table-row-index i))))
+       (loop for i from 0 to (1- colspan)
+             do (setq cell-end-offset
+                      (+ cell-end-offset (aref table-col-widths (+ 
table-col-index i)) 1)))
+       (move-to-column (+ (current-column) cell-end-offset))
+       (next-line -1)
+       (setq cell-end (point))
+       ;; result
+       (goto-char origin)
+       (setf (w3-cell-info-row cell-info) table-row)
+       (setf (w3-cell-info-column cell-info) table-col)
+       (setf (w3-cell-info-rowspan cell-info) rowspan)
+       (setf (w3-cell-info-colspan cell-info) colspan)
+       (setf (w3-cell-info-start cell-info) cell-beg)
+       (setf (w3-cell-info-end cell-info) cell-end)
+       ;; if inside cell, current subtable info (recursive call to 
w3-table-info)
+       (when (and (or (null to-depth)
+                      (and (numberp to-depth) (> to-depth 1)))
+                  (<= cell-beg (point)) (<= (point) cell-end))
+         (w3-within-cell cell-info table-info
+                         (when w3-table-structure
+                           (setf (w3-cell-info-current-subtable cell-info)
+                                 (w3-table-info (and (numberp to-depth) (1- 
to-depth)) t)))))
+       cell-info))))
+
+;;}}}
+;;{{{  extracting table elements
+
+(defun w3-table-this-cell-contents (&optional at-depth table-info)
+  "Return formatted contents of this cell as a list if strings.
+Prefix arg can be used to specify the desired table nesting."
+  (interactive "p")
+  (let* ((table-info (or table-info (w3-table-info at-depth)))
+        (cell-info (w3-table-info-current-cell table-info)))
+    (if (null cell-info)
+       (error "Not inside a W3 table cell")
+      (if (and (numberp at-depth) (> at-depth 1))
+         (let ((subtable-info (w3-cell-info-current-subtable cell-info)))
+           (if (null subtable-info)
+               (error "Not inside a W3 table")
+             (w3-within-cell cell-info table-info
+                             (w3-table-this-cell-contents (1- at-depth) 
subtable-info))))
+       (mapconcat 'identity
+                  (extract-rectangle (w3-cell-info-start cell-info)
+                                     (w3-cell-info-end cell-info))
+                  " ")))))
+
+(defun w3-table-speak-this-cell-info (&optional at-depth)
+  "Speak coordinates of current table cell.
+Prefix arg can be used to specify the desired table nesting."
+  (interactive "p")
+  (let*
+      ((table-info (w3-table-info at-depth))
+       (cell-info (w3-table-info-current-cell table-info)))
+    (message "Row %s Column %s of a %s by %s table %s"
+             (w3-cell-info-row cell-info)
+             (w3-cell-info-column cell-info)
+             (w3-table-info-rows table-info)
+             (w3-table-info-columns table-info)
+             (if at-depth
+                 (format " at nesting level %s" at-depth)
+               ""))))
+
+(defun w3-table-speak-this-cell (&optional at-depth)
+  "Speak contents of current table cell.
+Prefix arg can be used to specify the desired table nesting."
+  (interactive "p")
+  (dtk-speak (w3-table-this-cell-contents at-depth)))
+
+;;}}}
+;;{{{  Table navigation
+
+(defun w3-table-move-to-table-start (&optional at-depth table-info)
+  "If inside a table, move to its top left corner.
+Prefix arg can be used to specify the desired table nesting."
+  (interactive "p")
+  (let* ((table-info (or table-info (w3-table-info at-depth)))
+        (cell-info (w3-table-info-current-cell table-info)))
+    (if (and (numberp at-depth) (> at-depth 1))
+       (w3-table-move-within-subtable at-depth cell-info
+                                      'w3-table-move-to-table-start)
+      (goto-char (w3-table-info-start table-info))
+      (when (and (interactive-p)
+                (featurep 'emacspeak))
+       (emacspeak-auditory-icon 'large-movement)
+       (emacspeak-speak-line)))))
+
+(defun w3-table-move-to-table-end (&optional at-depth table-info)
+  "If inside a table, move to its bottom right corner.
+Prefix arg can be used to specify the desired table nesting."
+  (interactive "p")
+  (let* ((table-info (or table-info (w3-table-info at-depth)))
+        (cell-info (w3-table-info-current-cell table-info)))
+    (if (and (numberp at-depth) (> at-depth 1))
+       (w3-table-move-within-subtable at-depth cell-info
+                                      'w3-table-move-to-table-end)
+      (goto-char (1- (w3-table-info-end table-info)))
+      (when (and (interactive-p)
+                (featurep 'emacspeak))
+       (emacspeak-auditory-icon 'large-movement)
+       (emacspeak-speak-line)))))
+
+(defun w3-table-move-to-beginning-of-previous-table-row (&optional at-depth 
table-info)
+  "Move to previous table row. Prefix arg can be used to specify the desired 
table nesting."
+  (interactive "p")
+  (let* ((table-info (or table-info (w3-table-info at-depth)))
+        (cell-info (w3-table-info-current-cell table-info)))
+    (if (and (numberp at-depth) (> at-depth 1))
+       (w3-table-move-within-subtable at-depth cell-info
+                                      
'w3-table-move-to-beginning-of-previous-table-row)
+      (when (= 1 (w3-cell-info-row cell-info))
+       (error "First row"))
+      (goto-char (w3-cell-info-start cell-info))
+      (forward-line -2)
+      (beginning-of-line)
+      (forward-char 1)
+      (when (featurep 'emacspeak)
+       (dtk-speak (w3-table-this-cell-contents at-depth))
+       (emacspeak-auditory-icon 'select-object)))))
+
+(defun w3-table-move-to-beginning-of-next-table-row (&optional at-depth 
table-info)
+  "Move to next table row. Prefix arg can be used to specify the desired table 
nesting."
+  (interactive "p")
+  (let* ((table-info (or table-info (w3-table-info at-depth)))
+        (cell-info (w3-table-info-current-cell table-info)))
+    (if (and (numberp at-depth) (> at-depth 1))
+       (w3-table-move-within-subtable at-depth cell-info
+                                      
'w3-table-move-to-beginning-of-next-table-row)
+      (when (= (w3-table-info-rows table-info) (w3-cell-info-row cell-info))
+       (error "Last row"))
+      (goto-char (w3-cell-info-end cell-info))
+      (forward-line 2)
+      (beginning-of-line)
+      (forward-char 1)
+      (when (featurep 'emacspeak)
+       (dtk-speak (w3-table-this-cell-contents at-depth))
+       (emacspeak-auditory-icon 'select-object)))))
+
+(defun w3-table-move-to-previous-table-row (&optional at-depth table-info)
+  "Move to previous table row. Prefix arg can be used to specify the desired 
table nesting."
+  (interactive "p")
+  (let* ((table-info (or table-info (w3-table-info at-depth)))
+        (cell-info (w3-table-info-current-cell table-info)))
+    (if (and (numberp at-depth) (> at-depth 1))
+       (w3-table-move-within-subtable at-depth cell-info
+                                      'w3-table-move-to-previous-table-row)
+      (let ((char-col (current-column)))
+       (when (= 1 (w3-cell-info-row cell-info))
+         (error "First row"))
+       (goto-char (w3-cell-info-start cell-info))
+       (forward-line -2)
+       (move-to-column char-col)
+       (setq cell-info (w3-cell-info table-info))
+       (goto-char (w3-cell-info-start cell-info))
+       (when (featurep 'emacspeak)
+         (dtk-speak (w3-table-this-cell-contents at-depth))
+         (emacspeak-auditory-icon 'select-object))))))
+
+(defun w3-table-move-to-next-table-row (&optional at-depth table-info)
+  "Move to next table row. Prefix arg can be used to specify the desired table 
nesting."
+  (interactive "p")
+  (let* ((table-info (or table-info (w3-table-info at-depth)))
+        (cell-info (w3-table-info-current-cell table-info)))
+    (if (and (numberp at-depth) (> at-depth 1))
+       (w3-table-move-within-subtable at-depth cell-info
+                                      'w3-table-move-to-next-table-row)
+      (let ((char-col (current-column)))
+       (when (= (w3-table-info-rows table-info) (w3-cell-info-row cell-info))
+         (error "Last row"))
+       (goto-char (w3-cell-info-end cell-info))
+       (forward-line 1)
+       (move-to-column char-col)
+       (setq cell-info (w3-cell-info table-info))
+       (goto-char (w3-cell-info-start cell-info))
+       (when (featurep 'emacspeak)
+         (dtk-speak (w3-table-this-cell-contents at-depth))
+         (emacspeak-auditory-icon 'select-object))))))
+
+(defun w3-table-move-to-previous-table-column (&optional at-depth table-info)
+  "Moves to the start of the previous table column.
+Prefix arg can be used to specify the desired table nesting."
+  (interactive "p")
+  (let* ((table-info (or table-info (w3-table-info at-depth)))
+        (cell-info (w3-table-info-current-cell table-info)))
+    (if (and (numberp at-depth) (> at-depth 1))
+       (w3-table-move-within-subtable at-depth cell-info
+                                      'w3-table-move-to-previous-table-column)
+      (let* ((column (w3-table-current-column-number table-info))
+            (column-index (if (numberp column)
+                              (1- column)
+                            (w3-table-info-columns table-info)))
+            (position 0)
+            (widths (w3-table-info-column-widths table-info))
+            (c  1))
+       (when (= 0 column-index)
+         (error "First column"))
+       (loop for w across widths
+         while  (< c column-index)
+         do
+         (incf c)
+         (incf position (1+ w)))
+       (beginning-of-line)
+       (move-to-column (1+ position))
+       (when (featurep 'emacspeak)
+         (dtk-speak (w3-table-this-cell-contents at-depth))
+         (emacspeak-auditory-icon 'select-object))))))
+
+(defun w3-table-move-to-next-table-column (&optional at-depth table-info)
+  "Move to next column. Prefix arg can be used to specify the desired table 
nesting."
+  (interactive "p")
+  (let* ((table-info (or table-info (w3-table-info at-depth)))
+        (cell-info (w3-table-info-current-cell table-info)))
+    (if (and (numberp at-depth) (> at-depth 1))
+       (w3-table-move-within-subtable at-depth cell-info
+                                      'w3-table-move-to-next-table-column)
+      (let* ((current (current-column))
+            (column (w3-table-current-column-number table-info))
+            (column-index (if (numberp column)
+                              (1- column)
+                            (w3-table-info-columns table-info)))
+            (check 0)
+            (widths (w3-table-info-column-widths table-info)))
+       (when (= (1- (w3-table-info-columns table-info)) column-index)
+         (error "Last column"))
+       (loop for w across widths
+         until (> check current)
+         do
+         (setq check (+ check w 1 )))
+       (beginning-of-line)
+       (move-to-column (1+ check))
+       (when (featurep 'emacspeak)
+         (dtk-speak (w3-table-this-cell-contents at-depth))
+         (emacspeak-auditory-icon 'select-object))))))
+
+(defun w3-table-move-to-top-of-table-column (&optional at-depth table-info)
+  "Move to top of current column. Prefix arg can be used to specify the 
desired table nesting."
+  (interactive "p")
+  (let* ((table-info (or table-info (w3-table-info at-depth)))
+        (cell-info (w3-table-info-current-cell table-info)))
+    (if (and (numberp at-depth) (> at-depth 1))
+       (w3-table-move-within-subtable at-depth cell-info
+                                      'w3-table-move-to-top-of-table-column)
+      (let ((table-start nil)
+           (table-end nil)
+           (column (w3-table-current-column-number table-info))
+           (motion 0)
+           (top-left nil)
+           (widths (w3-table-info-column-widths table-info)))
+       (set-mark (point))
+       (save-excursion
+         (w3-table-move-to-table-start table-info)
+         (setq table-start (point)))
+       (goto-char  table-start)
+       (forward-line 1)
+       (loop for c from 1 to (1- column)
+         do
+         (incf motion  (1+ (aref widths (1- c)))))
+       (move-to-column (1+ motion))
+       (when (featurep 'emacspeak)
+         (emacspeak-auditory-icon 'large-movement)
+         (dtk-speak (w3-table-this-cell-contents at-depth)))))))
+
+;;}}}
+;;{{{  Column browsing
+
+;;;###autoload
+(defun w3-table-speak-current-table-column (&optional at-depth table-info)
+  "Speak current table column. Prefix arg can be used to specify the desired 
table nesting."
+  (interactive "p")
+  (let* ((table-info (or table-info (w3-table-info at-depth)))
+        (cell-info (w3-table-info-current-cell table-info)))
+    (if (and (numberp at-depth) (> at-depth 1))
+       (if (null cell-info)
+           (error "Not inside a W3 cell")
+         (let ((subtable-info (w3-cell-info-current-subtable cell-info)))
+           (if (null subtable-info)
+               (error "Not inside a W3 table")
+             (w3-within-cell cell-info table-info
+                'w3-table-speak-current-table-column))))
+      (let ((orig (point))
+           (table-start nil)
+           (table-end nil)
+           (column (w3-table-current-column-number table-info))
+           (top-left nil)
+           (bottom-right nil)
+           (widths (w3-table-info-column-widths table-info)))
+       (save-excursion
+         (save-restriction
+           (w3-table-move-to-table-start table-info)
+           (setq table-start (point))
+           (w3-table-move-to-table-end table-info)
+           (setq table-end (point))
+           (narrow-to-region table-start table-end)
+           (goto-char table-start)
+           (loop for c from 1 to (1- column)
+                  do
+                  (forward-char (1+ (aref widths (1- c)))))
+           (setq top-left (point))
+           (goto-char table-end)
+           (beginning-of-line)
+           (loop for c from 1 to column
+                  do
+                  (forward-char (1+ (aref widths (1- c)))))
+           (setq bottom-right (point))))
+       (emacspeak-speak-rectangle top-left bottom-right)))))
+
+;;}}}
+;;{{{  bind them to useful keys
+
+;;;###autoload
+
+(defun w3-table-setup-keys ()
+  "Setup emacspeak table browsing keys in w3 mode"
+  (declare (special emacspeak-prefix w3-mode-map))
+  (let ((key (make-vector 1 (aref emacspeak-prefix 0))))
+    (define-key w3-mode-map
+      (concat emacspeak-prefix "=")
+      'w3-table-move-to-top-of-table-column)
+    (define-key w3-mode-map "=" 'w3-table-speak-this-cell-info)
+    (define-key w3-mode-map
+      (concat emacspeak-prefix ".")
+      'w3-table-speak-this-cell)
+    (define-key w3-mode-map
+      (concat emacspeak-prefix "<")
+      'w3-table-move-to-table-start)
+    (define-key w3-mode-map
+      (concat emacspeak-prefix ">")
+      'w3-table-move-to-table-end)
+    (define-key w3-mode-map
+      (concatenate 'vector key "-")
+      'w3-table-move-to-beginning-of-previous-table-row)
+    (define-key w3-mode-map
+      (concatenate 'vector key "+")
+      'w3-table-move-to-beginning-of-next-table-row)
+    (define-key w3-mode-map
+      (concatenate 'vector key '[up])
+      'w3-table-move-to-previous-table-row)
+    (define-key w3-mode-map
+      "|"
+      'w3-table-speak-current-table-column)
+    (define-key w3-mode-map
+      (concatenate 'vector key '[down])
+      'w3-table-move-to-next-table-row)
+    (define-key w3-mode-map
+      (concatenate 'vector key '[left])
+      'w3-table-move-to-previous-table-column)
+    (define-key w3-mode-map
+      (concatenate 'vector key '[right])
+      'w3-table-move-to-next-table-column)
+    ))
+
+(add-hook 'w3-mode-hook 'w3-table-setup-keys)
+
+;;}}}
+(provide 'w3-structure)
+;;{{{ end of file 
+
+;;; local variables:
+;;; folded-file: t
+;;; end: 
+
+;;}}}
diff --git a/lisp/w3-speak.el b/lisp/w3-speak.el
new file mode 100644
index 0000000..cd5f4fa
--- /dev/null
+++ b/lisp/w3-speak.el
@@ -0,0 +1,178 @@
+;;; w3-speak.el,v --- Emacs-W3 speech interface
+;; Author: wmperry
+;; Original author: William Perry --<address@hidden>
+;; Cloned from emacspeak-w3.el
+;; Created: 1996/10/16 20:56:40
+;; Version: 1.14
+;; Keywords: hypermedia, speech
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 by T.V. Raman (address@hidden)
+;;; Copyright (c) 1996, 1997 by William M. Perry (address@hidden)
+;;; Copyright (c) 1997, 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; A replacement module for emacspeak-w3 that uses all the new functionality
+;;; of Emacs/W3 3.0.
+;;;
+;;; This file would not be possible without the help of
+;;; T.V. Raman (address@hidden) and his continued efforts to make Emacs/W3
+;;; even remotely useful. :)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; This conforms to http://www4.inria.fr/speech2.html
+
+(require 'widget)
+(require 'w3-forms)
+(require 'advice)
+;; This condition-case needs to be here or it completely chokes
+;; byte-compilation for people who do not have Emacspeak installed.
+;; *sigh*
+(condition-case ()
+    (progn
+      (require 'emacspeak)
+      (require 'dtk-voices)
+      (require 'emacspeak-speak)
+      (require 'emacspeak-sounds)
+      (eval-when (compile)
+                (require 'emacspeak-fix-interactive)))
+  (error (message "Emacspeak not found - speech will not work.")))
+
+
+;;{{{  speaking form fields 
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Now for the guts
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-speak-summarize-form-field ()
+  "Summarizes field under point if any."
+  (let ((widget (widget-at (point))))
+    (and widget (w3-form-summarize-field widget))))
+
+;;}}}
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Movement notification
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defadvice w3-widget-forward (after emacspeak pre act comp)
+  (when (interactive-p)
+    (emacspeak-auditory-icon 'large-movement)
+    (emacspeak-widget-summarize (widget-at  (point )))))
+
+(defadvice w3-widget-backward (after emacspeak pre act comp)
+  (when (interactive-p)
+    (emacspeak-auditory-icon 'large-movement)
+    (emacspeak-widget-summarize (widget-at  (point )))))
+
+(defadvice w3-scroll-up (after emacspeak pre act comp)
+  "Provide auditory feedback"
+  (when (interactive-p)
+       (let ((start (point )))
+         (emacspeak-auditory-icon 'scroll)
+         (save-excursion
+           (forward-line (window-height))
+           (emacspeak-speak-region start (point ))))))
+
+(defadvice w3-revert-form (after emacspeak pre act)
+  "Announce that you cleared the form. "
+  (dtk-speak "Cleared the form. "))
+
+(defadvice w3-finish-text-entry (after emacspeak pre act )
+  "Announce what the field was set to."
+  (when (interactive-p)
+    (w3-speak-summarize-form-field)))
+
+(defadvice w3-start-of-document (after emacspeak pre act)
+  "Produce an auditory icon.  Also speak the first line. "
+  (when (interactive-p)
+    (emacspeak-speak-line)
+    (emacspeak-auditory-icon 'large-movement)))
+
+(defadvice w3-end-of-document (after emacspeak pre act)
+  "Produce an auditory icon.  Also speak the first line."
+  (when (interactive-p)
+    (emacspeak-speak-line)
+    (emacspeak-auditory-icon 'large-movement)))
+
+(defadvice w3-goto-last-buffer (after emacspeak pre act)
+  "Speak the modeline so I know where I am."
+  (when (interactive-p)
+    (emacspeak-auditory-icon 'select-object)
+    (emacspeak-speak-mode-line)))
+
+(defadvice w3-quit (after emacspeak pre act)
+  "Speak the mode line of the new buffer."
+  (when (interactive-p)
+    (emacspeak-auditory-icon 'close-object)
+    (emacspeak-speak-mode-line)))
+
+(defadvice w3-fetch (around  emacspeak  act comp )
+  "First produce an auditory icon to indicate retrieval.
+After retrieval, 
+set  voice-lock-mode to t after displaying the buffer,
+and then speak the mode-line. "
+  (declare (special dtk-punctuation-mode))
+  (emacspeak-auditory-icon 'select-object)
+  ad-do-it)
+
+(defun w3-speak-mode-hook ()
+  (set (make-local-variable 'voice-lock-mode) t)
+  (setq dtk-punctuation-mode "some")
+  (emacspeak-auditory-icon 'open-object)
+  (emacspeak-speak-mode-line))
+
+;;; This is really the only function you should need to call unless
+;;; you are adding functionality.
+(defun w3-speak-use-voice-locking (&optional arg) 
+  "Tells w3 to start using voice locking.
+This is done by setting the w3 variables so that anchors etc are not marked by
+delimiters. We then turn on voice-lock-mode. 
+Interactive prefix arg does the opposite. "
+  (interactive "P")
+  (declare (special w3-echo-link))
+  (setq w3-echo-link 'text)
+  (if arg
+      (remove-hook 'w3-mode-hook 'w3-speak-mode-hook)
+    (add-hook 'w3-mode-hook 'w3-speak-mode-hook)))
+
+(defun w3-speak-browse-page ()
+  "Browse a WWW page"
+  (interactive)
+  (emacspeak-audio-annotate-paragraphs)
+  (emacspeak-execute-repeatedly 'forward-paragraph))
+
+(declaim (special w3-mode-map))
+(define-key w3-mode-map "." 'w3-speak-browse-page)
+
+(defvar url-speak-last-progress-indication 0
+  "Caches when we last produced a progress auditory icon")
+
+(defadvice url-lazy-message (around emacspeak pre act)
+  "Provide pleasant auditory feedback about progress"
+  (declare (special url-speak-last-progress-indication ))
+  (let ((now (nth 1 (current-time))))
+    (when (> now
+            (+ 3 url-speak-last-progress-indication))
+         (setq url-speak-last-progress-indication now)
+         (apply 'message (ad-get-args 0))
+         (emacspeak-auditory-icon 'progress))))
+
+(provide 'w3-speak)
diff --git a/lisp/w3-style.el b/lisp/w3-style.el
new file mode 100644
index 0000000..c4a435f
--- /dev/null
+++ b/lisp/w3-style.el
@@ -0,0 +1,76 @@
+;;; w3-style.el --- Emacs/W3 binding style sheet mechanism
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:11 $
+;; Version: $Revision: 1.1 $
+;; Keywords: faces, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; A style sheet mechanism for emacs-w3
+;;;
+;;; This will eventually be able to under DSSSL[-lite] as well as the
+;;; experimental W3C mechanism
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'font)
+(require 'w3-keyword)
+(require 'cl)
+(require 'css)
+
+
+
+;;;###autoload
+(defun w3-handle-style (&optional plist)
+  (let ((url (or (plist-get plist 'href)
+                (plist-get plist 'src)
+                (plist-get plist 'uri)))
+       (media (intern (downcase (or (plist-get plist 'media) "all"))))
+       (type (downcase (or (plist-get plist 'notation) "text/css")))
+       (url-working-buffer " *style*")
+       (stylesheet nil)
+       (defines nil)
+       (cur-sheet w3-current-stylesheet)
+       (string (plist-get plist 'data)))
+    (if (not (memq media (css-active-device-types)))
+       nil                             ; Not applicable to us!
+      (save-excursion
+       (set-buffer (get-buffer-create url-working-buffer))
+       (erase-buffer)
+       (setq url-be-asynchronous nil)
+       (cond
+        ((member type '("experimental" "arena" "w3c-style" "css" "text/css"))
+         (setq stylesheet (css-parse url string cur-sheet)))
+        (t
+         (w3-warn 'html "Unknown stylesheet notation: %s" type))))
+      (setq w3-current-stylesheet stylesheet))))
+
+;;;###autoload
+(defun w3-display-stylesheet (&optional sheet)
+  "Display the stylesheet for the current document."
+  (interactive)
+  (setq sheet (or sheet w3-current-stylesheet w3-user-stylesheet))
+  (if (not sheet)
+      (error "No stylesheet available!"))
+  (css-display sheet))
+
+(provide 'w3-style)
diff --git a/lisp/w3-sysdp.el b/lisp/w3-sysdp.el
new file mode 100644
index 0000000..5d28c7a
--- /dev/null
+++ b/lisp/w3-sysdp.el
@@ -0,0 +1,688 @@
+;;; sysdep.el --- consolidate Emacs-version dependencies in one file.
+
+;; Copyright (c) 1995 - 1997 Ben Wing.
+
+;; Author: Ben Wing <address@hidden>, William Perry <address@hidden>
+;; Keywords: lisp, tools
+;; Version: 0.003
+
+;; The purpose of this file is to eliminate the cruftiness that
+;; would otherwise be required of packages that want to run on multiple
+;; versions of Emacs.  The idea is that we make it look like we're running
+;; the latest version of XEmacs (currently 19.12) by emulating all the
+;; missing functions.
+
+;; #### This file does not currently do any advising but should.
+;; Unfortunately, advice.el is a hugely big package.  Is any such
+;; thing as `advice-lite' possible?
+
+;; #### - This package is great, but its role needs to be thought out a bit
+;; more.  Sysdep will not permit programs written for the old XEmacs API to
+;; run on new versions of XEmacs.  Sysdep is a backward-compatibility
+;; package for the latest and greatest XEmacs API.  It permits programmers
+;; to use the latest XEmacs functionality and still have their programs run
+;; on older versions of XEmacs...perhaps even on FSF Emacs.  It should NEVER
+;; ever need to be loaded in the newest XEmacs.  It doesn't even make sense
+;; to put it in the lisp/utils part of the XEmacs distribution because it's
+;; real purpose is to be distributed with packages like w3 which take
+;; advantage of the latest and greatest features of XEmacs but still need to
+;; be run on older versions.  --Stig
+
+;; Any packages that wish to use this file should load it using
+;; `load-library'.  It will not load itself if a version of sysdep.el
+;; that is at least as recent has already been loaded, but will
+;; load over an older version of sysdep.el.  It will attempt to
+;; not redefine functions that have already been custom-redefined,
+;; but will redefine a function if the supplied definition came from
+;; an older version of sysdep.el.
+
+;; Packages such as w3 that wish to include this file with the package
+;; should rename it to something unique, such as `w3-sysdep.el', and
+;; load it with `load-library'.  That will ensure that no conflicts
+;; arise if more than one package in the load path provides a version
+;; of sysdep.el.  If multiple packages load sysdep.el, the most recent
+;; version will end up loaded; as long as I'm careful not to
+;; introduce bugs in previously working definitions, this should work
+;; fine.
+
+;; You may well discover deficiencies in this file as you use it.
+;; The preferable way of dealing with this is to send me a patch
+;; to sysdep.el; that way, the collective body of knowledge gets
+;; increased.
+
+;; IMPORTANT: leave the version string in the format X.XXX (e.g. 1.001)
+;; so that string comparisons to other versions work properly.
+
+(defconst sysdep-potential-version "0.003")
+
+;; this macro means: define the function, but only if either it
+;; wasn't bound before, or the supplied binding comes from an older
+;; version of sysdep.el.  That way, user-supplied bindings don't
+;; get overridden.
+
+;; note: sysdep-defalias is often more useful than this function,
+;; esp. since you can do load-time conditionalizing and can
+;; optionally leave the function undefined. (e.g. frame functions
+;; in v18.)
+
+(defmacro sysdep-defun (function &rest everything-else)
+  (` (cond ((and (not (fboundp (quote (, function))))
+                (or
+                 (not
+                  (stringp (get (quote (, function)) 'sysdep-defined-this)))
+                 (and (get (quote (, function)) 'sysdep-defined-this)
+                      (string-lessp
+                       (get (quote (, function)) 'sysdep-defined-this)
+                       sysdep-potential-version))))
+           (put (quote (, function)) 'sysdep-defined-this
+                sysdep-potential-version)
+           (defun (, function) (,@ everything-else))))))
+
+(defmacro sysdep-defvar (function &rest everything-else)
+  (` (cond ((and (not (boundp (quote (, function))))
+                (or 
+                 (not
+                  (stringp (get (quote (, function)) 'sysdep-defined-this)))
+                 (and (get (quote (, function)) 'sysdep-defined-this)
+                      (string-lessp
+                       (get (quote (, function)) 'sysdep-defined-this)
+                       sysdep-potential-version))))
+           (put (quote (, function)) 'sysdep-defined-this t)
+           (defvar (, function) (,@ everything-else))))))
+
+(defmacro sysdep-defconst (function &rest everything-else)
+  (` (cond ((and (not (boundp (quote (, function))))
+                (or
+                 (not
+                  (stringp (get (quote (, function)) 'sysdep-defined-this)))
+                 (and (get (quote (, function)) 'sysdep-defined-this)
+                      (string-lessp
+                       (get (quote (, function)) 'sysdep-defined-this)
+                       sysdep-potential-version))))
+           (put (quote (, function)) 'sysdep-defined-this t)
+           (defconst (, function) (,@ everything-else))))))
+
+;; similar for fset and defalias.  No need to quote as the argument
+;; is already quoted.
+
+(defmacro sysdep-fset (function def)
+  (` (cond ((and (not (fboundp (, function)))
+                (or (not (stringp
+                          (get (, function) 'sysdep-defined-this)))
+                    (and (get (, function) 'sysdep-defined-this)
+                         (string-lessp
+                          (get (, function) 'sysdep-defined-this)
+                          sysdep-potential-version)))
+                (, def))
+           (put (, function) 'sysdep-defined-this t)
+           (fset (, function) (, def))))))
+
+(defmacro sysdep-defalias (function def)
+  (` (cond ((and (not (fboundp (, function)))
+                (or (not (stringp
+                          (get (, function) 'sysdep-defined-this)))
+                    (and (get (, function) 'sysdep-defined-this)
+                         (string-lessp
+                          (get (, function) 'sysdep-defined-this)
+                          sysdep-potential-version)))
+                (, def)
+                (or (listp (, def))
+                    (and (symbolp (, def))
+                         (fboundp (, def)))))
+           (put (, function) 'sysdep-defined-this t)
+           (defalias (, function) (, def))))))
+
+;; bootstrapping: defalias and define-function don't exist
+;; in older versions of lemacs
+
+(sysdep-fset 'defalias 'fset)
+(sysdep-defalias 'define-function 'defalias)
+
+;; useful ways of determining what version is running
+;; emacs-major-version and emacs-minor-version are
+;; already defined in recent versions of FSF Emacs and XEmacs
+
+(sysdep-defconst emacs-major-version
+                ;; will string-match ever fail?  If so, assume 19.0.
+                ;; (should we assume 18.something?)
+                (if (string-match "^[0-9]+" emacs-version)
+                    (string-to-int
+                     (substring emacs-version
+                                (match-beginning 0) (match-end 0)))
+                  19))
+
+(sysdep-defconst emacs-minor-version
+                (if (string-match "^[0-9]+\\.\\([0-9]+\\)" emacs-version)
+                    (string-to-int
+                     (substring emacs-version
+                                (match-beginning 1) (match-end 1)))
+                  0))
+
+(sysdep-defconst sysdep-running-xemacs
+                (or (string-match "Lucid" emacs-version)
+                    (string-match "XEmacs" emacs-version)))
+
+(sysdep-defconst window-system nil)
+(sysdep-defconst window-system-version 0)
+
+(sysdep-defvar list-buffers-directory nil)
+(sysdep-defvar x-library-search-path (`
+                                     ("/usr/X11R6/lib/X11/"
+                                      "/usr/X11R5/lib/X11/"
+                                      "/usr/lib/X11R6/X11/"
+                                      "/usr/lib/X11R5/X11/"
+                                      "/usr/local/X11R6/lib/X11/"
+                                      "/usr/local/X11R5/lib/X11/"
+                                      "/usr/local/lib/X11R6/X11/"
+                                      "/usr/local/lib/X11R5/X11/"
+                                      "/usr/X11/lib/X11/"
+                                      "/usr/lib/X11/"
+                                      "/usr/local/lib/X11/"
+                                      "/usr/X386/lib/X11/"
+                                      "/usr/x386/lib/X11/"
+                                      "/usr/XFree86/lib/X11/"
+                                      "/usr/unsupported/lib/X11/"
+                                      "/usr/athena/lib/X11/"
+                                      "/usr/local/x11r5/lib/X11/"
+                                      "/usr/lpp/Xamples/lib/X11/"
+                                      "/usr/openwin/lib/X11/"
+                                      "/usr/openwin/share/lib/X11/"
+                                      (, data-directory)
+                                      )
+                                     )
+  "Search path used for X11 libraries.")
+
+;; frame-related stuff.
+
+(sysdep-defalias 'buffer-dedicated-frame 'buffer-dedicated-screen)
+(sysdep-defalias 'deiconify-frame
+  (cond ((fboundp 'deiconify-screen) 'deiconify-screen)
+       ;; make-frame-visible will be defined as necessary
+       (t 'make-frame-visible)))
+(sysdep-defalias 'delete-frame 'delete-screen)
+(sysdep-defalias 'event-frame 'event-screen)
+(sysdep-defalias 'event-glyph-extent 'event-glyph)
+(sysdep-defalias 'find-file-other-frame 'find-file-other-screen)
+(sysdep-defalias 'find-file-read-only-other-frame
+  'find-file-read-only-other-screen)
+(sysdep-defalias 'frame-height 'screen-height)
+(sysdep-defalias 'frame-iconified-p 'screen-iconified-p)
+(sysdep-defalias 'frame-left-margin-width 'screen-left-margin-width)
+(sysdep-defalias 'frame-list 'screen-list)
+(sysdep-defalias 'frame-live-p
+  (cond ((fboundp 'screen-live-p) 'screen-live-p)
+       ((fboundp 'live-screen-p) 'live-screen-p)
+       ;; #### not sure if this is correct (this is for Epoch)
+       ;; but gnuserv.el uses it this way
+       ((fboundp 'screenp) 'screenp)))
+(sysdep-defalias 'frame-name 'screen-name)
+(sysdep-defalias 'frame-parameters 'screen-parameters)
+(sysdep-defalias 'frame-pixel-height 'screen-pixel-height)
+(sysdep-defalias 'frame-pixel-width 'screen-pixel-width)
+(sysdep-defalias 'frame-right-margin-width 'screen-right-margin-width)
+(sysdep-defalias 'frame-root-window 'screen-root-window)
+(sysdep-defalias 'frame-selected-window 'screen-selected-window)
+(sysdep-defalias 'frame-totally-visible-p 'screen-totally-visible-p)
+(sysdep-defalias 'frame-visible-p 'screen-visible-p)
+(sysdep-defalias 'frame-width 'screen-width)
+(sysdep-defalias 'framep 'screenp)
+(sysdep-defalias 'get-frame-for-buffer 'get-screen-for-buffer)
+(sysdep-defalias 'get-frame-for-buffer-noselect 
'get-screen-for-buffer-noselect)
+(sysdep-defalias 'get-other-frame 'get-other-screen)
+(sysdep-defalias 'iconify-frame 'iconify-screen)
+(sysdep-defalias 'lower-frame 'lower-screen)
+(sysdep-defalias 'mail-other-frame 'mail-other-screen)
+
+(sysdep-defalias 'make-frame
+  (cond ((fboundp 'make-screen)
+        (function (lambda (&optional parameters device)
+                    (make-screen parameters))))
+       ((fboundp 'x-create-screen)
+        (function (lambda (&optional parameters device)
+                    (x-create-screen parameters))))))
+
+(sysdep-defalias 'make-frame-invisible 'make-screen-invisible)
+(sysdep-defalias 'make-frame-visible
+  (cond ((fboundp 'make-screen-visible) 'make-screen-visible)
+       ((fboundp 'mapraised-screen) 'mapraised-screen)
+       ((fboundp 'x-remap-window)
+        (lambda (&optional x)
+          (x-remap-window)
+          (accept-process-output)))))
+(sysdep-defalias 'modify-frame-parameters 'modify-screen-parameters)
+(sysdep-defalias 'new-frame 'new-screen)
+(sysdep-defalias 'next-frame 'next-screen)
+(sysdep-defalias 'next-multiframe-window 'next-multiscreen-window)
+(sysdep-defalias 'other-frame 'other-screen)
+(sysdep-defalias 'previous-frame 'previous-screen)
+(sysdep-defalias 'previous-multiframe-window 'previous-multiscreen-window)
+(sysdep-defalias 'raise-frame
+  (cond ((fboundp 'raise-screen) 'raise-screen)
+       ((fboundp 'mapraise-screen) 'mapraise-screen)))
+(sysdep-defalias 'redraw-frame 'redraw-screen)
+(sysdep-defalias 'select-frame 'select-screen)
+(sysdep-defalias 'selected-frame 'selected-screen)
+(sysdep-defalias 'set-buffer-dedicated-frame 'set-buffer-dedicated-screen)
+(sysdep-defalias 'set-frame-height 'set-screen-height)
+(sysdep-defalias 'set-frame-left-margin-width 'set-screen-left-margin-width)
+(sysdep-defalias 'set-frame-position 'set-screen-position)
+(sysdep-defalias 'set-frame-right-margin-width 'set-screen-right-margin-width)
+(sysdep-defalias 'set-frame-size 'set-screen-size)
+(sysdep-defalias 'set-frame-width 'set-screen-width)
+(sysdep-defalias 'show-temp-buffer-in-current-frame 
'show-temp-buffer-in-current-screen)
+(sysdep-defalias 'switch-to-buffer-other-frame 'switch-to-buffer-other-screen)
+(sysdep-defalias 'visible-frame-list 'visible-screen-list)
+(sysdep-defalias 'window-frame 'window-screen)
+(sysdep-defalias 'x-create-frame 'x-create-screen)
+(sysdep-defalias 'x-set-frame-icon-pixmap 'x-set-screen-icon-pixmap)
+(sysdep-defalias 'x-set-frame-pointer 'x-set-screen-pointer)
+(sysdep-defalias 'x-display-color-p 'x-color-display-p)
+(sysdep-defalias 'x-display-grayscale-p 'x-grayscale-display-p)
+(sysdep-defalias 'menu-event-p 'misc-user-event-p)
+
+(sysdep-defun event-point (event)
+  (let ((posn (event-end event)))
+    (if posn 
+       (posn-point posn))))
+
+;; WMP - commenting these out so that Emacs 19 doesn't get screwed by them.
+;; In particular, this makes the 'custom' package blow up quite well.
+;;(sysdep-defun add-submenu (menu-path submenu &optional before)
+;;  "Add a menu to the menubar or one of its submenus.
+;;If the named menu exists already, it is changed.
+;;MENU-PATH identifies the menu under which the new menu should be inserted.
+;; It is a list of strings; for example, (\"File\") names the top-level 
\"File\"
+;; menu.  (\"File\" \"Foo\") names a hypothetical submenu of \"File\".
+;; If MENU-PATH is nil, then the menu will be added to the menubar itself.
+;;SUBMENU is the new menu to add.
+;; See the documentation of `current-menubar' for the syntax.
+;;BEFORE, if provided, is the name of a menu before which this menu should
+;; be added, if this menu is not on its parent already.  If the menu is already
+;; present, it will not be moved."
+;;  (add-menu menu-path (car submenu) (cdr submenu) before))
+
+;;(sysdep-defun add-menu-button (menu-path menu-leaf &optional before)
+;;  "Add a menu item to some menu, creating the menu first if necessary.
+;;If the named item exists already, it is changed.
+;;MENU-PATH identifies the menu under which the new menu item should be 
inserted.
+;; It is a list of strings; for example, (\"File\") names the top-level 
\"File\"
+;; menu.  (\"File\" \"Foo\") names a hypothetical submenu of \"File\".
+;;MENU-LEAF is a menubar leaf node.  See the documentation of 
`current-menubar'.
+;;BEFORE, if provided, is the name of a menu item before which this item should
+;; be added, if this item is not on the menu already.  If the item is already
+;; present, it will not be moved."
+;; (add-menu-item menu-path (aref menu-leaf 0) (aref menu-leaf 1)
+;;             (aref menu-leaf 2) before))
+
+(sysdep-defun make-glyph (&optional spec-list)
+  (if (and spec-list (cdr-safe (assq 'x spec-list)))
+      (make-pixmap (cdr-safe (assq 'x spec-list)))))
+
+(sysdep-defalias 'face-list 'list-faces)
+
+(sysdep-defun set-keymap-parent (keymap new-parent)
+  (let ((tail keymap))
+    (while (and tail (cdr tail) (not (eq (car (cdr tail)) 'keymap)))
+      (setq tail (cdr tail)))
+    (if tail
+       (setcdr tail new-parent))))
+
+;; Property list functions
+;;
+(sysdep-defun plist-put (plist prop val)
+  "Change value in PLIST of PROP to VAL.
+PLIST is a property list, which is a list of the form
+(PROP1 VALUE1 PROP2 VALUE2 ...).  PROP is a symbol and VAL is any object.
+If PROP is already a property on the list, its value is set to VAL,
+otherwise the new PROP VAL pair is added.  The new plist is returned;
+use `(setq x (plist-put x prop val))' to be sure to use the new value.
+The PLIST is modified by side effects."
+  (let ((node (memq prop plist)))
+    (if node
+       (setcar (cdr node) val)
+      (setq plist (cons prop (cons val plist))))
+    plist))
+
+(sysdep-defun plist-get (plist prop)
+  "Extract a value from a property list.
+PLIST is a property list, which is a list of the form
+(PROP1 VALUE1 PROP2 VALUE2...).  This function returns the value
+corresponding to the given PROP, or nil if PROP is not
+one of the properties on the list."
+  (while (and plist (not (eq (car plist) prop)))
+    (setq plist (cdr (cdr plist))))
+  (and plist (car (cdr plist))))
+
+;; Extent stuff
+(sysdep-fset 'delete-extent 'delete-overlay)
+(sysdep-fset 'extent-end-position 'overlay-end)
+(sysdep-fset 'extent-start-position 'overlay-start)
+(sysdep-fset 'set-extent-endpoints 'move-overlay)
+(sysdep-fset 'set-extent-property 'overlay-put)
+(sysdep-fset 'make-extent 'make-overlay)
+
+(sysdep-defun extent-property (extent property &optional default)
+  (or (overlay-get extent property) default))
+
+(sysdep-defun extent-at (pos &optional object property before at-flag)
+  (let ((tmp (overlays-at (point)))
+       ovls)
+    (if property
+       (while tmp
+         (if (extent-property (car tmp) property)
+             (setq ovls (cons (car tmp) ovls)))
+         (setq tmp (cdr tmp)))
+      (setq ovls tmp
+           tmp nil))
+    (car-safe
+     (sort ovls
+          (function
+           (lambda (a b)
+             (< (- (extent-end-position a) (extent-start-position a))
+                (- (extent-end-position b) (extent-start-position b)))))))))
+
+(sysdep-defun overlays-in (beg end)
+  "Return a list of the overlays that overlap the region BEG ... END.
+Overlap means that at least one character is contained within the overlay
+and also contained within the specified region.
+Empty overlays are included in the result if they are located at BEG
+or between BEG and END."
+  (let ((ovls (overlay-lists))
+       tmp retval)
+    (if (< end beg)
+       (setq tmp end
+             end beg
+             beg tmp))
+    (setq ovls (nconc (car ovls) (cdr ovls)))
+    (while ovls
+      (setq tmp (car ovls)
+           ovls (cdr ovls))
+      (if (or (and (<= (overlay-start tmp) end)
+                  (>= (overlay-start tmp) beg))
+             (and (<= (overlay-end tmp) end)
+                  (>= (overlay-end tmp) beg)))
+         (setq retval (cons tmp retval))))
+    retval))
+
+(sysdep-defun map-extents (function &optional object from to
+                                   maparg flags property value)
+  (let ((tmp (overlays-in (or from (point-min))
+                         (or to (point-max))))
+       ovls)
+    (if property
+       (while tmp
+         (if (extent-property (car tmp) property)
+             (setq ovls (cons (car tmp) ovls)))
+         (setq tmp (cdr tmp)))
+      (setq ovls tmp
+           tmp nil))
+    (catch 'done
+      (while ovls
+       (setq tmp (funcall function (car ovls) maparg)
+             ovls (cdr ovls))
+       (if tmp
+           (throw 'done tmp))))))
+
+;; misc
+(sysdep-fset 'make-local-hook 'make-local-variable)
+
+(sysdep-defun buffer-substring-no-properties (beg end)
+  "Return the text from BEG to END, without text properties, as a string."
+  (format "%s" (buffer-substring beg end)))
+  
+(sysdep-defun symbol-value-in-buffer (symbol buffer &optional unbound-value)
+  "Return the value of SYMBOL in BUFFER, or UNBOUND-VALUE if it is unbound."
+  (save-excursion
+    (set-buffer buffer)
+    (if (not (boundp symbol))
+       unbound-value
+      (symbol-value symbol))))
+
+(sysdep-defun insert-file-contents-literally
+  (file &optional visit beg end replace)
+  "Like `insert-file-contents', q.v., but only reads in the file.
+A buffer may be modified in several ways after reading into the buffer due
+to advanced Emacs features, such as file-name-handlers, format decoding,
+find-file-hooks, etc.
+  This function ensures that none of these modifications will take place."
+  (let ((file-name-handler-alist nil)
+       (find-file-hooks nil))
+    (insert-file-contents file visit beg end replace)))
+
+(sysdep-defun alist-to-plist (alist)
+  "Convert association list ALIST into the equivalent property-list form.
+The plist is returned.  This converts from
+
+\((a . 1) (b . 2) (c . 3))
+
+into
+
+\(a 1 b 2 c 3)
+
+The original alist is not modified.  See also `destructive-alist-to-plist'."
+  (let (plist)
+    (while alist
+      (let ((el (car alist)))
+       (setq plist (cons (cdr el) (cons (car el) plist))))
+      (setq alist (cdr alist)))
+    (nreverse plist)))
+
+(sysdep-defun add-minor-mode (toggle name &optional keymap after toggle-fun)
+  "Add a minor mode to `minor-mode-alist' and `minor-mode-map-alist'.
+TOGGLE is a symbol which is used as the variable which toggle the minor mode,
+NAME is the name that should appear in the modeline (it should be a string
+beginning with a space), KEYMAP is a keymap to make active when the minor
+mode is active, and AFTER is the toggling symbol used for another minor
+mode.  If AFTER is non-nil, then it is used to position the new mode in the
+minor-mode alists.  TOGGLE-FUN specifies an interactive function that
+is called to toggle the mode on and off; this affects what appens when
+button2 is pressed on the mode, and when button3 is pressed somewhere
+in the list of modes.  If TOGGLE-FUN is nil and TOGGLE names an
+interactive function, TOGGLE is used as the toggle function.
+
+Example:  (add-minor-mode 'view-minor-mode \" View\" view-mode-map)"
+  (if (not (assq toggle minor-mode-alist))
+      (setq minor-mode-alist (cons (list toggle name) minor-mode-alist)))
+  (if (and keymap (not (assq toggle minor-mode-map-alist)))
+      (setq minor-mode-map-alist (cons (cons toggle keymap)
+                                      minor-mode-map-alist))))
+
+(sysdep-defvar x-font-regexp-foundry-and-family
+  (let ((-             "[-?]")
+       (foundry                "[^-]+")
+       (family                 "[^-]+")
+       )
+    (concat "\\`[-?*]" foundry - "\\(" family "\\)" -)))
+
+(sysdep-defun match-string (num &optional string)
+  "Return string of text matched by last search.
+NUM specifies which parenthesized expression in the last regexp.
+ Value is nil if NUMth pair didn't match, or there were less than NUM pairs.
+Zero means the entire text matched by the whole regexp or whole string.
+STRING should be given if the last search was by `string-match' on STRING."
+  (if (match-beginning num)
+      (if string
+         (substring string (match-beginning num) (match-end num))
+       (buffer-substring (match-beginning num) (match-end num)))))
+
+(sysdep-defun add-hook (hook-var function &optional at-end)
+  "Add a function to a hook.
+First argument HOOK-VAR (a symbol) is the name of a hook, second
+ argument FUNCTION is the function to add.
+Third (optional) argument AT-END means to add the function at the end
+ of the hook list instead of the beginning.  If the function is already
+ present, this has no effect.
+Returns nil if FUNCTION was already present in HOOK-VAR, else new
+ value of HOOK-VAR."
+      (if (not (boundp hook-var)) (set hook-var nil))
+      (let ((old (symbol-value hook-var)))
+       (if (or (not (listp old)) (eq (car old) 'lambda))
+           (setq old (list old)))
+       (if (member function old)
+           nil
+         (set hook-var
+              (if at-end
+                  (append old (list function)) ; don't nconc
+                (cons function old))))))
+
+(sysdep-defalias 'valid-color-name-p
+  (cond
+   ((fboundp 'x-valid-color-name-p)    ; XEmacs/Lucid
+    'x-valid-color-name-p)
+   ((and window-system
+        (fboundp 'color-defined-p))    ; NS/Emacs 19
+    'color-defined-p)
+   ((and window-system
+        (fboundp 'pm-color-defined-p))
+    'pm-color-defined-p)
+   ((and window-system
+        (fboundp 'x-color-defined-p))  ; Emacs 19
+    'x-color-defined-p)
+   ((fboundp 'get-color)               ; Epoch
+    (function (lambda (color)
+               (let ((x (get-color color)))
+                 (if x
+                     (setq x (progn
+                               (free-color x)
+                               t)))
+                 x))))
+   (t 'identity)))                     ; All others
+
+;; Misc.
+;; NT doesn't have make-symbolic-link
+(sysdep-defalias 'make-symbolic-link 'copy-file)
+(sysdep-defalias 'insert-and-inherit 'insert)
+
+(sysdep-defun run-hook-with-args-until-success (hook &rest args)
+  "Run HOOK with the specified arguments ARGS.
+HOOK should be a symbol, a hook variable.  Its value should
+be a list of functions.  We call those functions, one by one,
+passing arguments ARGS to each of them, until one of them
+returns a non-nil value.  Then we return that value.
+If all the functions return nil, we return nil."
+  (let ((rval nil)
+       (todo (and (boundp hook) (symbol-value hook)))
+       (global (and (boundp hook) (default-value hook)))
+       (cur nil))
+    (while (and (setq cur (car todo)) (not rval))
+      (setq todo (cdr todo))
+      (if (eq cur t)
+         (if global
+             (setq todo (append global todo)))
+       (setq rval (apply cur args))))))
+
+(sysdep-defun split-string (string pattern)
+  "Return a list of substrings of STRING which are separated by PATTERN."
+  (let (parts (start 0))
+    (while (string-match pattern string start)
+      (setq parts (cons (substring string start (match-beginning 0)) parts)
+           start (match-end 0)))
+    (nreverse (cons (substring string start) parts))
+    ))
+
+(sysdep-defun member (elt list)
+  (while (and list (not (equal elt (car list))))
+    (setq list (cdr list)))
+  list)
+
+(sysdep-defun rassoc (key list)
+  (let ((found nil))
+    (while (and list (not found))
+      (if (equal (cdr (car list)) key) (setq found (car list)))
+      (setq list (cdr list)))
+    found))
+
+(sysdep-defun display-error (error-object stream)
+  "Display `error-object' on `stream' in a user-friendly way."
+  (funcall (or (let ((type (car-safe error-object)))
+                (catch 'error
+                  (and (consp error-object)
+                       (symbolp type)
+                       ;;(stringp (get type 'error-message))
+                       (consp (get type 'error-conditions))
+                       (let ((tail (cdr error-object)))
+                         (while (not (null tail))
+                           (if (consp tail)
+                               (setq tail (cdr tail))
+                             (throw 'error nil)))
+                         t)
+                       ;; (check-type condition condition)
+                       (get type 'error-conditions)
+                       ;; Search class hierarchy
+                       (let ((tail (get type 'error-conditions)))
+                         (while (not (null tail))
+                           (cond ((not (and (consp tail)
+                                            (symbolp (car tail))))
+                                  (throw 'error nil))
+                                 ((get (car tail) 'display-error)
+                                  (throw 'error (get (car tail)
+                                                     'display-error)))
+                                 (t
+                                  (setq tail (cdr tail)))))
+                         ;; Default method
+                         (function
+                          (lambda (error-object stream)
+                            (let ((type (car error-object))
+                                  (tail (cdr error-object))
+                                  (first t))
+                              (if (eq type 'error)
+                                  (progn (princ (car tail) stream)
+                                         (setq tail (cdr tail)))
+                                (princ (or (get type 'error-message) type)
+                                       stream))
+                              (while tail
+                                (princ (if first ": " ", ") stream)
+                                (prin1 (car tail) stream)
+                                (setq tail (cdr tail)
+                                      first nil)))))))))
+              (function
+               (lambda (error-object stream)
+                 (princ "Peculiar error " stream)
+                 (prin1 error-object stream))))
+          error-object stream))
+
+(sysdep-defun decode-time (&optional specified-time)
+  (let* ((date (current-time-string specified-time))
+        (dateinfo (and date (timezone-parse-date date)))
+        (timeinfo (and dateinfo (timezone-parse-time (aref dateinfo 3)))))
+    (list (aref timeinfo 2) (aref timeinfo 1)
+         (aref timeinfo 0) (aref dateinfo 2)
+         (aref dateinfo 1) (aref dateinfo 0)
+         "unknown" nil 0)))
+
+(sysdep-defun find-face (face)
+  (car-safe (memq face (face-list))))
+
+(sysdep-defun set-marker-insertion-type (marker type)
+  "Set the insertion-type of MARKER to TYPE.
+If TYPE is t, it means the marker advances when you insert text at it.
+If TYPE is nil, it means the marker stays behind when you insert text at it."
+  nil)
+
+;; window functions
+
+;; not defined in v18
+(sysdep-defun eval-buffer (bufname &optional printflag)
+  (interactive)
+  (save-excursion
+    (set-buffer bufname)
+    (eval-current-buffer)))
+
+(sysdep-defun window-minibuffer-p (window)
+  "Returns non-nil if WINDOW is a minibuffer window."
+  (eq window (minibuffer-window)))
+
+(sysdep-defun window-live-p (window)
+  "Returns t if OBJ is a window which is currently visible."
+  (and (windowp window)
+       (window-point window)))
+
+(provide 'w3-sysdp)
+;;; sysdep.el ends here
+
+;;;(sysdep.el) Local Variables:
+;;;(sysdep.el) eval: (put 'sysdep-defun 'lisp-indent-function 'defun)
+;;;(sysdep.el) eval: (put 'sysdep-defalias 'lisp-indent-function 'defun)
+;;;(sysdep.el) eval: (put 'sysdep-defconst 'lisp-indent-function 'defun)
+;;;(sysdep.el) eval: (put 'sysdep-defvar 'lisp-indent-function 'defun)
+;;;(sysdep.el) End:
diff --git a/lisp/w3-toolbar.el b/lisp/w3-toolbar.el
new file mode 100644
index 0000000..2850adf
--- /dev/null
+++ b/lisp/w3-toolbar.el
@@ -0,0 +1,344 @@
+;;; w3-toolbar.el --- Toolbar functions for emacs-w3
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:11 $
+;; Version: $Revision: 1.1 $
+;; Keywords: mouse, toolbar
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1995, 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996, 1997 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Toolbar specific function for XEmacs 19.12+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(condition-case ()
+    (progn
+      (require 'xpm-button)
+      (require 'xbm-button))
+  (error nil))
+
+(defvar w3-toolbar-icon-directory nil "Where the toolbar icons for w3 are.")
+(defvar w3-toolbar-back-icon nil "Toolbar icon for back")
+(defvar w3-toolbar-forw-icon nil "Toolbar icon for forward")
+(defvar w3-toolbar-home-icon nil "Toolbar icon for home")
+(defvar w3-toolbar-reld-icon nil "Toolbar icon for reload")
+(defvar w3-toolbar-imag-icon nil "Toolbar icon for images")
+(defvar w3-toolbar-open-icon nil "Toolbar icon for open url")
+(defvar w3-toolbar-print-icon nil "Toolbar icon for printing")
+(defvar w3-toolbar-find-icon nil "Toolbar icon for find")
+(defvar w3-toolbar-stop-icon nil "Toolbar icon for stop")
+(defvar w3-toolbar-help-icon nil "Toolbar icon for help")
+(defvar w3-toolbar-hotl-icon nil "Toolbar icon for hotlist")
+
+(defvar w3-link-toolbar-orientation 'bottom
+  "*Where to put the document specific toolbar.  Must be one of these symbols:
+
+default -- place at location specified by `default-toolbar-position'
+top     -- place along the top of the frame
+bottom  -- place along the bottom of the frame
+right   -- place along the right edge of the frame
+left    -- place along the left edge of the frame
+none    -- no toolbar")
+
+(defvar w3-toolbar-orientation 'default
+  "*Where to put the w3 toolbar.  Must be one of these symbols:
+
+default -- place at location specified by `default-toolbar-position'
+top     -- place along the top of the frame
+bottom  -- place along the bottom of the frame
+right   -- place along the right edge of the frame
+left    -- place along the left edge of the frame
+none    -- no toolbar")
+
+(defvar w3-toolbar-type 'both
+  "*What the toolbar looks like.  Must be one of these symbols:
+
+pictures -- Show icons (without captions if in XEmacs 19.13)
+both     -- Show icons (with captions if in XEmacs 19.13)
+text     -- Show only text buttons
+
+Only has any meaning in XEmacs 19.12 when w3-toolbar-orientation is
+not `none'.")
+
+(defvar w3-toolbar
+  '([w3-toolbar-back-icon w3-history-backward (car 
(w3-history-find-url-internal (url-view-url t))) "Back in history"]
+    [w3-toolbar-forw-icon w3-history-forward (cdr 
(w3-history-find-url-internal (url-view-url t))) "Forward in history"]
+    [w3-toolbar-home-icon w3 t "Go home"]
+    [:style 2d :size 5]
+    [w3-toolbar-reld-icon w3-reload-document t "Reload document"]
+    [w3-toolbar-hotl-icon w3-show-hotlist t "View hotlist"]
+    [w3-toolbar-imag-icon w3-load-delayed-images w3-delayed-images
+                         "Load images"]
+    [toolbar-file-icon w3-fetch t "Fetch a URL"]
+    [toolbar-printer-icon w3-mouse-print-this-url t "Print document"]
+    [w3-toolbar-find-icon w3-search-forward t "Search"]
+    ;;[w3-toolbar-stop-icon keyboard-quit t "Stop transaction"]
+    nil
+    [w3-toolbar-help-icon w3-show-info-node t "Help"])
+  "The toolbar for w3")
+
+(defun w3-toolbar-make-captioned-buttons ()
+  (mapcar
+   (function
+    (lambda (x)
+      (let* ((ext (if (featurep 'xpm) ".xpm" ".xbm"))
+            (base w3-toolbar-icon-directory)
+            (up (expand-file-name (concat x "-up" ext) base))
+            (dn (expand-file-name (concat x "-dn" ext) base))
+            (no (expand-file-name (concat x "-no" ext) base))
+            (cap-up (expand-file-name (concat x "-cap-up" ext) base))
+            (cap-dn (expand-file-name (concat x "-cap-dn" ext) base))
+            (cap-no (expand-file-name (concat x "-cap-no" ext) base))
+            (var (intern (concat "w3-toolbar-" x "-icon"))))
+       (set var
+            (toolbar-make-button-list up dn no cap-up cap-dn cap-no)))))
+   
+   '("back" "help" "find" "forw" "home"  "hotl" "stop" "imag" "reld")))
+
+(defun w3-make-text-toolbar-button (text)
+  (let ((bgcol (or
+               (cdr-safe (assq 'background-toolbar-color (frame-parameters)))
+               "#befbbefbbefb")))
+    (if (featurep 'xpm)
+       (mapcar 'make-glyph (xpm-button-create text 0 "black" bgcol))
+      (xbm-button-create text 0))))
+
+(defun w3-toolbar-make-text-buttons ()
+  (let ((bgcol (or (cdr-safe (assq 'background-toolbar-color
+                                  (frame-parameters)))
+                  "#befbbefbbefb")))
+    (setq w3-toolbar-back-icon (w3-make-text-toolbar-button "Back")
+         w3-toolbar-forw-icon (w3-make-text-toolbar-button "Forward")
+         w3-toolbar-home-icon (w3-make-text-toolbar-button "Home")
+         w3-toolbar-reld-icon (w3-make-text-toolbar-button "Reload")
+         w3-toolbar-hotl-icon (w3-make-text-toolbar-button "Hotlist")
+         w3-toolbar-imag-icon (w3-make-text-toolbar-button "Images")
+         w3-toolbar-open-icon (w3-make-text-toolbar-button "Open")
+         w3-toolbar-print-icon (w3-make-text-toolbar-button "Print")
+         w3-toolbar-find-icon (w3-make-text-toolbar-button "Find")
+         w3-toolbar-help-icon (w3-make-text-toolbar-button "Help!"))))
+
+(defun w3-toolbar-make-picture-buttons ()
+  (mapcar
+   (function
+    (lambda (x)
+      (let* ((ext (if (featurep 'xpm) ".xpm" ".xbm"))
+            (base w3-toolbar-icon-directory)
+            (up (expand-file-name (concat x "-cap-up" ext) base))
+            (dn (expand-file-name (concat x "-cap-dn" ext) base))
+            (no (expand-file-name (concat x "-cap-no" ext) base))
+            (var (intern (concat "w3-toolbar-" x "-icon"))))
+       (set var
+            (cond
+             ((and (file-exists-p up) (file-exists-p dn)
+                   (file-exists-p no))
+              (toolbar-make-button-list up dn no))
+             ((file-exists-p up)
+              (toolbar-make-button-list up))
+             (t nil))))))
+   '("back" "help" "find" "forw" "home" "hotl" "imag" "reld")))
+
+(defun w3-toolbar-make-buttons ()
+  (if (not w3-toolbar-icon-directory)
+      (setq w3-toolbar-icon-directory
+           (if (fboundp 'locate-data-directory)
+               (locate-data-directory "w3")
+             (file-name-as-directory
+              (expand-file-name "w3" data-directory)))))
+  (condition-case nil
+      (cond
+       ((not (fboundp 'toolbar-make-button-list))
+       nil)
+       ((or (eq w3-toolbar-type 'text)
+           (null w3-toolbar-icon-directory)
+           (not (file-directory-p w3-toolbar-icon-directory)))
+       (w3-toolbar-make-text-buttons))
+       ((boundp 'toolbar-buttons-captioned-p)
+       (w3-toolbar-make-captioned-buttons))
+       (t
+       (w3-toolbar-make-picture-buttons)))
+    (error nil)))
+
+(defun w3-link-is-defined (rel &optional rev)
+  (or
+   (cdr-safe (assoc rel (cdr-safe (assq 'rel w3-current-links))))
+   (cdr-safe (assoc (or rev rel) (cdr-safe (assq 'rev w3-current-links))))))
+
+;; Need to create w3-toolbar-glos-icon
+;;                w3-toolbar-toc-icon
+;;                w3-toolbar-copy-icon
+(defvar w3-link-toolbar
+  '([info::toolbar-prev-icon
+     (w3-fetch (w3-link-is-defined "previous" "next"))
+     (w3-link-is-defined "previous" "next")
+     "Back"]
+    [info::toolbar-next-icon
+     (w3-fetch (w3-link-is-defined "next" "previous"))
+     (w3-link-is-defined "next" "previous")
+     "Next"]
+    [info::toolbar-up-icon
+     (w3-fetch (w3-link-is-defined "up" "down"))     
+     (w3-link-is-defined "up" "down")
+     "Up"]
+    [w3-toolbar-home-icon
+     (w3-fetch (w3-link-is-defined "home"))
+     (w3-link-is-defined "home")
+     "Home"]
+    [w3-toolbar-toc-icon
+     (w3-fetch (w3-link-is-defined "toc"))
+     (w3-link-is-defined "toc")
+     "Contents"]
+    [w3-toolbar-find-icon
+     (w3-fetch (w3-link-is-defined "index"))
+     (w3-link-is-defined "index")
+     "Index"]
+    [w3-toolbar-glos-icon
+     (w3-fetch (w3-link-is-defined "glossary"))
+     (w3-link-is-defined "glossary")
+     "Glossary"]
+    [w3-toolbar-copy-icon
+     (w3-fetch (w3-link-is-defined "copyright"))
+     (w3-link-is-defined "copyright")
+     "Copyright"]
+    [w3-toolbar-hotl-icon
+     (w3-fetch (w3-link-is-defined "bookmark"))
+     (w3-link-is-defined "bookmark")
+     "Bookmarks"]
+    nil
+    [w3-toolbar-help-icon
+     (w3-fetch (w3-link-is-defined "help"))
+     (w3-link-is-defined "help")
+     "Help"]
+    ))
+
+(defun w3-toolbar-from-orientation (orientation)
+  (cond
+   ((eq 'default w3-toolbar-orientation) default-toolbar)
+   ((eq 'bottom w3-toolbar-orientation) bottom-toolbar)
+   ((eq 'top w3-toolbar-orientation) top-toolbar)
+   ((eq 'left w3-toolbar-orientation) left-toolbar)
+   ((eq 'right w3-toolbar-orientation) right-toolbar)))
+
+(defun w3-toolbar-dimension-from-orientation (orientation)
+  (cond
+   ((eq 'default w3-toolbar-orientation) nil)
+   ((eq 'bottom w3-toolbar-orientation) bottom-toolbar-height)
+   ((eq 'top w3-toolbar-orientation) top-toolbar-height)
+   ((eq 'left w3-toolbar-orientation) left-toolbar-width)
+   ((eq 'right w3-toolbar-orientation) right-toolbar-width)))
+
+(defun w3-ensure-toolbar-visible (orientation)
+  ;; Make sure a certain toolbar is visible if necessary
+  ;; This can modify frame parameters, so watch out.
+  (let ((dimension (w3-toolbar-dimension-from-orientation orientation))
+       (toolbar   (w3-toolbar-from-orientation orientation))
+       (dimensions nil)
+       (widths nil)
+       (heights nil)
+       (needs nil)
+       (has nil))
+    (if (and dimension toolbar
+            (setq toolbar (specifier-instance toolbar)))
+       (progn
+         (setq dimensions (mapcar
+                           (function
+                            (lambda (glyph)
+                              (and (glyphp glyph)
+                                   (cons (glyph-width glyph)
+                                         (glyph-height glyph)))))
+                           (mapcar 'car
+                                   (delq nil
+                                         (mapcar
+                                          (function (lambda (x)
+                                                      (and x
+                                                           (symbol-value
+                                                            (aref x 0)))))
+                                          toolbar))))
+               widths (sort (mapcar 'car dimensions) '>=)
+               heights (sort (mapcar 'cdr dimensions) '>=)
+               needs (+ 7 (if (memq orientation '(top bottom))
+                             (car heights)
+                           (car widths)))
+               has (specifier-instance dimension))
+         (if (<= has needs)
+             (set-specifier dimension (cons (selected-frame) needs)))))))
+                            
+(defun w3-toolbar-active ()
+  (interactive)
+  (let ((toolbar (w3-toolbar-from-orientation w3-toolbar-orientation)))
+    (if (and toolbar (specifier-instance toolbar))
+       t
+      nil)))
+
+(defun w3-toggle-link-toolbar ()
+  (interactive)
+  (require 'info)                      ; For some toolbar buttons
+  (let* ((w3-toolbar-orientation w3-link-toolbar-orientation)
+        (toolbar (w3-toolbar-from-orientation w3-toolbar-orientation)))
+    (if toolbar
+       (if (w3-toolbar-active)
+           (set-specifier toolbar (cons (current-buffer) nil))
+         (set-specifier toolbar w3-link-toolbar (current-buffer))))))
+
+(defun w3-toggle-toolbar ()
+  (interactive)
+  (if (eq major-mode 'w3-mode)
+      (let ((toolbar (w3-toolbar-from-orientation w3-toolbar-orientation)))
+       (cond
+        ((w3-toolbar-active)
+         (set-specifier toolbar (cons (current-buffer) nil)))
+        (toolbar
+         (set-specifier toolbar (cons (current-buffer) w3-toolbar)))
+        (t
+         (setq w3-toolbar-orientation 'default
+               toolbar (w3-toolbar-from-orientation w3-toolbar-orientation))
+         (and toolbar
+              (set-specifier toolbar (cons (current-buffer) w3-toolbar))))))
+    (if (not (eq w3-toolbar-orientation 'none))
+       (setq w3-toolbar-orientation 'none)
+      (setq w3-toolbar-orientation 'default))))
+
+(defun w3-show-info-node ()
+  (interactive)
+  (Info-goto-node "(w3.info)Top"))
+
+(defun w3-mouse-print-this-url (&optional e)
+  (interactive "e")
+  (let ((descr '("Print document as"
+                ["PostScript" (w3-print-this-url nil "PostScript") t]
+                ["Formatted Text" (w3-print-this-url nil "Formatted Text") t]
+                ["HTML Source" (w3-print-this-url nil "HTML Source") t]
+                ["LaTeX'd" (w3-print-this-url nil "LaTeX'd") t]
+                nil
+                ["Cancel" (beep) t])))
+    (popup-dialog-box descr)))
+
+(defun w3-add-toolbar-to-buffer ()
+  (if (or (not (featurep 'toolbar))
+         (featurep 'infodock))         ; InfoDock uses different toolbars
+      nil
+    (let ((toolbar (w3-toolbar-from-orientation w3-toolbar-orientation)))
+      (if toolbar
+         (set-specifier toolbar (cons (current-buffer) w3-toolbar))))
+    (set-specifier toolbar-buttons-captioned-p
+                  (cons (current-buffer) (eq w3-toolbar-type 'both)))))
+
+(provide 'w3-toolbar)
diff --git a/lisp/w3-vars.el b/lisp/w3-vars.el
new file mode 100644
index 0000000..63df7e0
--- /dev/null
+++ b/lisp/w3-vars.el
@@ -0,0 +1,619 @@
+;;; w3-vars.el,v --- All variable definitions for emacs-w3
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:11 $
+;; Version: $Revision: 1.1 $
+;; Keywords: comm, help, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Variable definitions for w3
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'w3-cus)                      ; Grab everything that is customized
+(require 'wid-edit)                    ; For `widget-keymap'
+
+(defconst w3-version-number
+  (let ((x "$State: Exp $"))
+    (if (string-match "State:[ \t\n]+.\\([^ \t\n]+\\)" x)
+       (setq x (substring x (match-beginning 1) (match-end 1)))
+      (setq x (substring x 1)))
+    (mapconcat
+     (function (lambda (x) (if (= x ?-) "." (char-to-string x)))) x ""))
+  "Version # of w3-mode.")
+
+(defconst w3-version-date (let ((x "$Date: 1998/12/01 22:12:11 $"))
+                           (if (string-match "Date: \\([^ \t\n]+\\)" x)
+                               (substring x (match-beginning 1) (match-end 1))
+                             x))
+  "Date this version of w3-mode was released.")
+
+(defconst w3-version
+  (format "WWW %s %s" w3-version-number w3-version-date)
+  "More descriptive version of w3-version-number.")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; General configuration variables
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar w3-dump-to-disk nil
+  "*If non-nil, all W3 pages loaded will be dumped to disk.")
+
+(defvar w3-fetch-with-default t
+  "*Whether `w3-fetch' should determine a good starting URL as a default.")
+
+(defvar w3-track-last-buffer nil
+  "*Whether to track the last w3 buffer to automatically switch to with
+ M-x w3.")
+
+(defvar w3-gc-cons-threshold-multiplier 1
+  "Amount to temporarily multiply gc-cons-threshold by when parsing HTML.
+Setting this to a number greater than 1 will result in less frequent
+garbage collections when parsing an HTML document, which may often speed
+up handling of a large document with many elements.  The disadvantage is
+that it allows Emacs's total memory usage to grow larger, which may result
+in later garbage collections taking more time.")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Figure out what flavor of emacs we are running
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar w3-running-xemacs (string-match "XEmacs\\|Lucid" emacs-version)
+  "*Got XEmacs?.")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Store the database of HTML general entities.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar w3-html-entities 
+  '(
+    (excl        .  33)
+    (quot        .  34)
+    (num         .  35)
+    (dollar      .  36)
+    (percent     .  37)
+    (amp         .  38)
+    (rsquo       .  39)
+    (apos        .  39)
+    (lpar        .  40)
+    (rpar        .  41)
+    (times       .  42)
+    (ast         .  42)
+    (plus        .  43)
+    (comma       .  44)
+    (period      .  46)
+    (colon       .  58)
+    (semi        .  59)
+    (lt          .  60)
+    (equals      .  61)
+    (gt          .  62)
+    (quest       .  63)
+    (commat      .  64)
+    (lsqb        .  91)
+    (rsqb        .  93)
+    (uarr        .  94)
+    (lowbar      .  95)
+    (lsquo       .  96)
+    (lcub        . 123)
+    (verbar      . 124)
+    (rcub        . 125)
+    (tilde       . 126)
+    (nbsp        . 160)
+    (iexcl       . 161)
+    (cent        . 162)
+    (pound       . 163)
+    (curren      . 164)
+    (yen         . 165)
+    (brvbar      . 166)
+    (sect        . 167)
+    (uml         . 168)
+    (copy        . 169)
+    (ordf        . 170)
+    (laquo       . 171)
+    (not         . 172)
+    (shy         . 173)
+    (reg         . 174)
+    (macr        . 175)
+    (deg         . 176)
+    (plusmn      . 177)
+    (sup2        . 178)
+    (sup3        . 179)
+    (acute       . 180)
+    (micro       . 181)
+    (para        . 182)
+    (middot      . 183)
+    (cedil       . 184)
+    (sup1        . 185)
+    (ordm        . 186)
+    (raquo       . 187)
+    (frac14      . 188)
+    (frac12      . 189)
+    (frac34      . 190)
+    (iquest      . 191)
+    (Agrave      . 192)
+    (Aacute      . 193)
+    (Acirc       . 194)
+    (Atilde      . 195)
+    (Auml        . 196)
+    (Aring       . 197)
+    (AElig       . 198)
+    (Ccedil      . 199)
+    (Egrave      . 200)
+    (Eacute      . 201)
+    (Ecirc       . 202)
+    (Euml        . 203)
+    (Igrave      . 204)
+    (Iacute      . 205)
+    (Icirc       . 206)
+    (Iuml        . 207)
+    (ETH         . 208)
+    (Ntilde      . 209)
+    (Ograve      . 210)
+    (Oacute      . 211)
+    (Ocirc       . 212)
+    (Otilde      . 213)
+    (Ouml        . 214)
+    (times       . 215)
+    (Oslash      . 216)
+    (Ugrave      . 217)
+    (Uacute      . 218)
+    (Ucirc       . 219)
+    (Uuml        . 220)
+    (Yacute      . 221)
+    (THORN       . 222)
+    (szlig       . 223)
+    (agrave      . 224)
+    (aacute      . 225)
+    (acirc       . 226)
+    (atilde      . 227)
+    (auml        . 228)
+    (aring       . 229)
+    (aelig       . 230)
+    (ccedil      . 231)
+    (egrave      . 232)
+    (eacute      . 233)
+    (ecirc       . 234)
+    (euml        . 235)
+    (igrave      . 236)
+    (iacute      . 237)
+    (icirc       . 238)
+    (iuml        . 239)
+    (eth         . 240)
+    (ntilde      . 241)
+    (ograve      . 242)
+    (oacute      . 243)
+    (ocirc       . 244)
+    (otilde      . 245)
+    (ouml        . 246)
+    (divide      . 247)
+    (oslash      . 248)
+    (ugrave      . 249)
+    (uacute      . 250)
+    (ucirc       . 251)
+    (uuml        . 252)
+    (yacute      . 253)
+    (thorn       . 254)
+    (yuml        . 255)
+
+    ;; Special handling of these
+    (frac56      . "5/6")
+    (frac16      . "1/6")
+    (frac45      . "4/5")
+    (frac35      . "3/5")
+    (frac25      . "2/5")
+    (frac15      . "1/5")
+    (frac23      . "2/3")
+    (frac13      . "1/3")
+    (frac78      . "7/8")
+    (frac58      . "5/8")
+    (frac38      . "3/8")
+    (frac18      . "1/8")
+    
+    ;; The following 5 entities are not mentioned in the HTML 2.0
+    ;; standard, nor in any other HTML proposed standard of which I
+    ;; am aware.  I am not even sure they are ISO entity names.  ***
+    ;; Hence, some arrangement should be made to give a bad HTML
+    ;; message when they are seen.
+    (ndash       .  45)
+    (mdash       .  45)
+    (emsp        .  32)
+    (ensp        .  32)
+    (sim         . 126)
+    (le          . "<=")
+    (agr         . "alpha")
+    (rdquo       . "''")
+    (ldquo       . "``")
+    (trade       . "(TM)")
+    ;; To be done
+    ;; (shy      . ????) ; soft hyphen
+    )
+  "*An assoc list of entity names and how to actually display them.")
+
+(defvar w3-graphic-entities
+  '(
+    (archive             "archive"                )
+    (audio               "audio"                  )
+    (binary.document     "binary.document"        )
+    (binhex.document     "binhex.document"        )
+    (calculator          "calculator"             )
+    (caution             "caution"                )
+    (cd.i                "cd.i"                   )
+    (cd.rom              "cd.rom"                 )
+    (clock               "clock"                  )
+    (compressed.document "compressed.document"    )
+    (disk.drive          "disk.drive"             )
+    (diskette            "diskette"               )
+    (document            "document"               )
+    (fax                 "fax"                    )
+    (filing.cabinet      "filing.cabinet"         )
+    (film                "film"                   )
+    (fixed.disk          "fixed.disk"             )
+    (folder              "folder"                 )
+    (form                "form"                   )
+    (ftp                 "ftp"                    )
+    (glossary            "glossary"               )
+    (gopher              "gopher"                 )
+    (home                "home"                   )
+    (html                "html"                   )
+    (image               "image"                  )
+    (index               "index"                  )
+    (keyboard            "keyboard"               )
+    (mail                "mail"                   )
+    (mail.in             "mail.in"                )
+    (mail.out            "mail.out"               )
+    (map                 "map"                    )
+    (mouse               "mouse"                  )
+    (new                 "new"                    )
+    (next                "next"                   )
+    (notebook            "notebook"               )
+    (parent              "parent"                 )
+    (play.fast.forward   "play.fast.forward"      )
+    (play.fast.reverse   "play.fast.reverse"      )
+    (play.pause          "play.pause"             )
+    (play.start          "play.start"             )
+    (play.stop           "play.stop"              )
+    (previous            "previous"               )
+    (prince              "prince" "the artist formerly known as prince")
+    (princesymbol        "prince" "the artist formerly known as prince")
+    (printer             "printer"                )
+    (sadsmiley           "sadsmiley"          ":(")
+    (smiley              "smiley"             ":)")
+    (stop                "stop"                   )
+    (summary             "summary"                )
+    (telephone           "telephone"              )
+    (telnet              "telnet"                 )
+    (text.document       "text.document"          )
+    (tn3270              "tn3270"                 )
+    (toc                 "toc"                    )
+    (trash               "trash"                  )
+    (unknown.document    "unknown.document"       )
+    (uuencoded.document  "uuencoded.document"     )
+    (work                "work"                   )
+    (www                 "www"                    )
+    )
+  "List of graphical entity names and the tail end of a URL for them.
+If there is a 3rd item in the list, it is the alternative text to use
+for the image.")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Menu definitions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar w3-popup-menu
+  '("Emacs-W3 Commands"
+    ["Back" w3-history-backward (car (w3-history-find-url-internal 
(url-view-url t)))]
+    ["Forward" w3-history-forward (cdr (w3-history-find-url-internal 
(url-view-url t)))]
+    "---"
+    ["Reload"       (w3-reload-document) t]
+    ["Show Images"  (w3-load-delayed-images) w3-delayed-images]
+    "---"
+    ["Add bookmark" (w3-hotlist-add-document nil) t]
+    )
+  "The shorter popup menu.")
+
+(defvar w3-graphlink-menu
+  '(("Open this Image (%s)"     . w3-fetch)
+    ("Save this Image As..."    . w3-download-url)
+    ("Copy this Image Location" . w3-save-url)
+    ("Information on this Image". w3-popup-image-info))
+  "An assoc list of function names and labels.  These will be displayed
+in a popup menu when the mouse is pressed on a hyperlink.  Format is
+( (label . function)), function is called with one argument, the URL of
+the link.  Each label can have exactly one `%s' that will be replaced by
+the URL of the link.")
+
+(defvar w3-hyperlink-menu
+  '(("Open this Link (%s)"        . w3-fetch)
+    ("Add Bookmark for this Link" . w3-hotlist-add-document-at-point)
+    ("New Window with this Link"  . w3-fetch-other-frame)
+    ("Save Link As..."            . w3-download-url)
+    ("Copy this Link Location to Clipboard" . w3-save-url)
+    ("Information on this Link"   . w3-popup-info))
+  "An assoc list of function names and labels.  These will be displayed
+in a popup menu when the mouse is pressed on a hyperlink.  Format is
+( (label . function)), function is called with one argument, the URL of
+the link.  Each label can have exactly one `%s' that will be replaced by
+the URL of the link.")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Variables internal to W3, you should not change any of these
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar w3-graphics-list nil
+  "*List of graphics already read in.")
+
+(defvar w3-delayed-images nil
+  "*A buffer-local variable holding positions and urls of images within
+the buffer.")
+
+(defvar w3-frameset-structure nil
+  "Frameset structure, heap of '(frameset ({cols|rows} \"<dimensions>\")) and 
'(<frame name> <href>)")
+
+(defvar w3-frame-name nil
+  "Frame name")
+
+(defvar w3-base-target nil
+  "Base target name")
+
+(defvar w3-target-window-distances nil
+  "Target window distances")
+
+(defvar w3-tty-char-width 8
+  "*Char width to use when in a tty")
+
+(defvar w3-tty-char-height 15
+  "*Char height to use when in a tty")
+
+(defvar w3-form-radio-elements nil "Internal variable - do not touch!")
+(defvar w3-form-elements nil "Internal variable - do not touch!")
+
+(defvar w3-user-stylesheet nil
+  "The global stylesheet for this user.")
+
+(defvar w3-current-stylesheet nil
+  "The stylesheet for this document.")
+
+(defvar w3-blinking-buffs nil
+  "A list of buffers with blinking text in them.
+This is used to optimize when we change a face so the entire display
+doesn't flash every second, whether we've run into a buffer that is
+displaying blinking text or not.")
+
+(defvar w3-last-fill-pos nil
+  "An internal variable for the new display engine that specifies the
+last character position that was correctly filled.")
+
+(defvar w3-active-faces nil "The list of active faces.")
+(defvar w3-active-voices nil "The list of active voices.")
+
+(defconst w3-bug-address "address@hidden"
+  "Address of current maintainer, where to send bug reports.")
+(defvar w3-continuation '(url-uncompress)
+  "List of functions to call to process a document completely.")
+(defvar w3-current-isindex nil "Is the current document a searchable index?")
+(defvar w3-current-buffer nil "Is the current W3 buffer")
+(defvar w3-current-last-buffer nil "Last W3 buffer seen before this one.")
+(defvar w3-current-links nil "An assoc list of <link> tags for this doc.")
+(defvar w3-current-metainfo nil "An assoc list of <meta> tags for this doc.")
+(defvar w3-current-source nil "Source of current document.")
+(defvar w3-current-parse nil "Parsed version of current document.")
+(defvar w3-current-badhtml nil "List of HTML warnings for this page.")
+(defconst w3-default-continuation '(url-uncompress) 
+  "Default action to start with - cleans text and uncompresses if necessary.")
+(defvar w3-find-this-link nil "Link to go to within a document.")
+(defvar w3-hidden-forms nil "List of hidden form areas and their info.")
+(defvar w3-hotlist nil "Default hotlist.")
+(defvar w3-icon-path-cache nil "Cache of where we found icons for entities.")
+(defvar w3-last-buffer nil "The last W3 buffer visited.")
+(defvar w3-print-next nil "Should we latex & print the next doc?")
+(defvar w3-roman-characters "ivxLCDMVX" "Roman numerals.")
+(defvar w3-setup-done nil "Have we been through setup code yet?")
+(defvar w3-source nil "Should we source the next document or not?")
+
+(defvar w3-strict-width nil
+  "*This variable will control how wide emacs thinks the current window is.
+This is useful when working in batch mode, and (window-width) returns the
+wrong value.  If the value is nil, it will use the value (window-width)
+returns.")
+
+(defvar w3-submit-button nil
+  "A widget object specifying what button was pressed to submit a form.")
+
+(defvar w3-meta-content-type-charset-regexp
+  (concat "<meta[ \t]+http-equiv=\"?Content-type\"?[ \t]+content=\"\\([^;]+\\)"
+         ";[ \t]*charset=\"?\\([^\"]+\\)\"?"
+         ">")
+  "Regexp used in parsing `<META HTTP-EQUIV=\"Content-Type\" 
content=\"...;charset=...\">
+for a charset indication")
+
+(defvar w3-meta-charset-content-type-regexp
+  (concat "<meta[ \t]+content=\"\\([^;]+\\)"
+         ";[ \t]*charset=\"?\\([^\"]+\\)\"?"
+         "[ \t]+http-equiv=\"?Content-type\"?>")
+  "Regexp used in parsing `<META content=\"...;charset=...\" 
HTTP-EQUIV=\"Content-Type\">
+for a charset indication")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; buffer-local variables to keep around when going into w3-mode
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar w3-id-positions nil "Internal use only.")
+(defvar w3-imagemaps nil "Internal use only.")
+
+(defvar w3-persistent-variables
+  '(
+    ;; So we can show the URL in the list-buffers listing
+    list-buffers-directory
+    ;; So widgets don't get lost
+    widget-field-new
+    w3-form-radio-elements
+    w3-form-elements
+    url-current-callback-func
+    url-current-content-length
+    url-current-mime-encoding
+    url-current-mime-headers
+    url-current-mime-type
+    url-current-mime-viewer
+    url-current-object
+    url-current-referer
+    w3-current-badhtml
+    w3-current-parse
+    w3-current-isindex
+    w3-current-last-buffer
+    w3-current-links
+    w3-current-metainfo
+    w3-current-source
+    w3-delayed-images
+    w3-hidden-forms
+    w3-current-stylesheet
+    w3-form-labels
+    w3-id-positions
+    w3-imagemaps
+    w3-base-target
+    w3-target-window-distances
+    w3-frameset-structure
+    buffer-file-coding-system
+    )
+  "A list of variables that should be preserved when entering w3-mode.")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Emulation stuff
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar w3-netscape-emulation-minor-mode nil
+  "Whether we are in the netscape emulation minor mode.")
+(defvar w3-netscape-emulation-minor-mode-map (make-sparse-keymap)
+  "Keymap for netscape emulation.")
+(defvar w3-lynx-emulation-minor-mode nil
+  "Whether we are in the lynx emulation minor mode.")
+(defvar w3-lynx-emulation-minor-mode-map (make-sparse-keymap)
+  "Keymap for lynx emulation.")
+(defvar w3-last-search-item nil)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Startup items
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar w3-form-labels nil "")
+(mapcar (function
+        (lambda (var)
+          (if (boundp var)
+              (make-variable-buffer-local var)))) w3-persistent-variables)
+
+(make-variable-buffer-local 'w3-last-fill-pos)
+(make-variable-buffer-local 'w3-frame-name)
+(make-variable-buffer-local 'w3-active-faces)
+(make-variable-buffer-local 'w3-netscape-emulation-minor-mode)
+(make-variable-buffer-local 'w3-lynx-emulation-minor-mode)
+(make-variable-buffer-local 'w3-last-search-item)
+
+(defvar w3-table-structure nil
+  "Structure to hold table info")
+(make-variable-buffer-local 'w3-table-structure)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;  Keymap definitions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar w3-mode-map (make-sparse-keymap) "Keymap to use in w3-mode.")
+(suppress-keymap w3-mode-map)
+(set-keymap-parent w3-mode-map widget-keymap)
+
+(define-key w3-mode-map "h" (make-sparse-keymap))
+(define-key w3-mode-map "H" (make-sparse-keymap))
+(define-key w3-mode-map "a" (make-sparse-keymap))
+
+(define-key w3-mode-map "ha"       'w3-hotlist-apropos)
+(define-key w3-mode-map "hd"       'w3-hotlist-delete)
+(define-key w3-mode-map "hi"       'w3-hotlist-add-document)
+(define-key w3-mode-map "hv"       'w3-show-hotlist)
+(define-key w3-mode-map "hr"       'w3-hotlist-rename-entry)
+(define-key w3-mode-map "hu"       'w3-use-hotlist)
+(define-key w3-mode-map "hA"       'w3-hotlist-append)
+(define-key w3-mode-map "hI"       'w3-hotlist-add-document-at-point)
+(define-key w3-mode-map "hR"       'w3-hotlist-refresh)
+
+(define-key w3-mode-map "x" (make-sparse-keymap))
+(define-key w3-mode-map "xa" 'w3-hotindex-add-key)
+(define-key w3-mode-map "xd" 'w3-hotindex-rm-key)
+(define-key w3-mode-map "xq" 'w3-hotindex-query)
+
+(define-key w3-mode-map "HF"       'w3-history-forward)
+(define-key w3-mode-map "HB"       'w3-history-backward)
+(define-key w3-mode-map "Hv"       'w3-show-history-list)
+
+(define-key w3-mode-map " "       'w3-scroll-up)
+(define-key w3-mode-map "<"        'beginning-of-buffer)
+(define-key w3-mode-map ">"        'end-of-buffer)
+(define-key w3-mode-map "?"        'w3-help)
+(define-key w3-mode-map "B"        'w3-history-backward)
+(define-key w3-mode-map "D"        'w3-download-url-at-point)
+(define-key w3-mode-map "F"        'w3-history-forward)
+(define-key w3-mode-map "G"        'w3-show-graphics)
+(define-key w3-mode-map "I"        'w3-popup-info)
+(define-key w3-mode-map "K"        'w3-save-this-url)
+(define-key w3-mode-map "P"        'w3-print-url-under-point)
+(define-key w3-mode-map "Q"        'w3-leave-buffer)
+(define-key w3-mode-map "R"        'w3-refresh-buffer)
+(define-key w3-mode-map "S"        'w3-source-document-at-point)
+(define-key w3-mode-map "U"        'w3-use-links)
+(define-key w3-mode-map "V"        'w3-view-this-url)
+(define-key w3-mode-map "\C-?"     'scroll-down)
+(define-key w3-mode-map [backspace] 'scroll-down)
+(define-key w3-mode-map "\C-c\C-b" 'w3-show-history-list)
+(define-key w3-mode-map "\C-c\C-v" 'w3-version)
+(define-key w3-mode-map "\C-o"     'w3-fetch)
+(define-key w3-mode-map "\M-M"     'w3-mail-document-under-point)
+(define-key w3-mode-map "\M-m"    'w3-mail-current-document)
+(define-key w3-mode-map "\M-s"    'w3-save-as)
+(define-key w3-mode-map "\M-\r"    'w3-follow-inlined-image)
+(define-key w3-mode-map "b"       'w3-widget-backward)
+(define-key w3-mode-map "c"        'w3-mail-document-author)
+(define-key w3-mode-map "d"        'w3-download-this-url)
+(define-key w3-mode-map "f"       'w3-widget-forward)
+(define-key w3-mode-map "g"        'w3-reload-document)
+(define-key w3-mode-map "i"        'w3-document-information)
+(define-key w3-mode-map "k"        'w3-save-url)
+(define-key w3-mode-map "l"        'w3-goto-last-buffer)
+(define-key w3-mode-map "m"        'w3-complete-link)
+(define-key w3-mode-map "n"        'w3-widget-forward)
+(define-key w3-mode-map "o"       'w3-open-local)
+(define-key w3-mode-map "p"        'w3-print-this-url)
+(define-key w3-mode-map "q"       'w3-quit)
+(define-key w3-mode-map "r"        'w3-reload-document)
+(define-key w3-mode-map "s"        'w3-source-document)
+(define-key w3-mode-map "u"        'w3-leave-buffer)
+(define-key w3-mode-map "v"       'url-view-url)
+(define-key w3-mode-map "w"        'w3-submit-bug)
+
+;; These are duplicated here instead of just inherited from widget-keymap
+;; due to some issues with Emacspeak.  FIXME.
+(define-key w3-mode-map [tab] 'w3-widget-forward)
+(define-key w3-mode-map [(shift tab)] 'w3-widget-backward)
+(define-key w3-mode-map [(meta tab)] 'w3-widget-backward)
+(define-key w3-mode-map [backtab] 'w3-widget-backward)
+
+;; Emulate some netscape stuff by default
+(define-key w3-mode-map [(control alt t)] 'url-list-processes)
+(define-key w3-mode-map [(control meta t)] 'url-list-processes)
+
+;; Have fun with document ordering
+(define-key w3-mode-map (read-kbd-macro "M-SPC") 'w3-next-document)
+(define-key w3-mode-map (read-kbd-macro "M-DEL") 'w3-prev-document)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Keyword definitions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'w3-keyword)
+(provide 'w3-vars)
diff --git a/lisp/w3-widget.el b/lisp/w3-widget.el
new file mode 100644
index 0000000..deffaf4
--- /dev/null
+++ b/lisp/w3-widget.el
@@ -0,0 +1,386 @@
+;;; w3-widget.el --- An image widget
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:11 $
+;; Version: $Revision: 1.1 $
+;; Keywords: faces, images
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996, 1997 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; This is a widget that will do the best it can with an image.
+;;;
+;;; It can handle all the common occurences of images on the world wide web
+;;; 1. A plain image - displays either a glyph of the image, or the
+;;;    alternative text
+;;; 2. A hyperlinked image - an image that is also a hypertext link to
+;;;    another page.  Displays either a glyph of the image, or the
+;;;    alternative text.  When activated with the mouse or the keyboard,
+;;;    the 'href' property of the widget is retrieved.
+;;; 3. Server side imagemaps - an image that has hotzones that lead to
+;;;    different areas.  Unfortunately, we cannot tell where the links go
+;;;    from the client - all processing is done by the server.  Displays
+;;;    either a glyph of the image, or the alternative text.  When activated
+;;;    with the mouse or the keyboard, the coordinates clicked on are
+;;;    sent to the remote server as HREF?x,y.  If the link is activated
+;;;    by the keyboard, then 0,0 are sent as the coordinates.
+;;; 4. Client side imagemaps - an image that has hotzones that lead to
+;;;    different areas.  All processing is done on the client side, so
+;;;    we can actually show a decent representation on a TTY.  Displays
+;;;    either a glyph of the image, or a drop-down-list of the destinations
+;;;    These are either URLs (http://foo/...) or alternative text.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'cl)
+(require 'widget)
+(require 'w3-keyword)
+
+(defvar widget-image-keymap (make-sparse-keymap)
+  "Keymap used over glyphs in an image widget")
+
+(defconst widget-mouse-button1 nil)
+(defconst widget-mouse-button2 nil)
+(defconst widget-mouse-button3 nil)
+
+(if (string-match "XEmacs" (emacs-version))
+    (if (featurep 'mouse)
+       (setq widget-mouse-button1 'button1
+             widget-mouse-button2 'button2
+             widget-mouse-button3 'button3)
+      (setq widget-mouse-button1 'return
+           widget-mouse-button2 'return
+           widget-mouse-button3 'return))
+  (setq widget-mouse-button1 'mouse-1
+       widget-mouse-button2 'mouse-2
+       widget-mouse-button3 'mouse-3))
+
+(defvar widget-image-inaudible-p nil
+  "*Whether to make images inaudible or not.")
+
+(define-key widget-image-keymap (vector widget-mouse-button1)
+  'widget-image-button-press)
+(define-key widget-image-keymap (vector widget-mouse-button2)
+  'widget-image-button-press)
+  
+(define-widget 'image 'default
+  "A fairly complex image widget."
+  :convert-widget 'widget-image-convert
+  :value-to-internal (lambda (widget value) value)
+  :value-to-external (lambda (widget value) value)
+  :value-set 'widget-image-value-set
+  :create 'widget-image-create
+  :delete 'widget-image-delete
+  :value-create 'widget-image-value-create
+  :value-delete 'widget-image-value-delete
+  :value-get 'widget-image-value-get
+  :notify 'widget-image-notify
+  )
+
+(defun widget-image-convert (widget)
+  (let ((args (widget-get widget :args)))
+    (widget-put widget :args nil)
+    (while args
+      (widget-put widget (car args) (cadr args))
+      (setq args (cddr args)))
+    widget))
+
+(defun widget-image-value-get (widget)
+  (let ((children (widget-get widget :children)))
+    (and (car children)
+        (widget-apply (car children) :value-get))))
+
+(defun widget-image-create (widget)
+  ;; Create an image widget at point in the current buffer
+  (let ((where (widget-get widget 'where)))
+    (cond
+     ((null where)
+      (setq where (set-marker (make-marker) (point))))
+     ((markerp where)
+      nil)
+     ((integerp where)
+      (setq where (set-marker (make-marker) where)))
+     (t
+      (error "IMPOSSIBLE position in widget-image-create: %s" where)))
+    (widget-put widget 'where where))
+  (widget-image-value-create widget))
+
+(defun widget-image-value-set (widget value)
+  ;; Recreate widget with new value.
+  (save-excursion
+    (widget-image-delete widget)
+    (if (widget-glyphp value)
+       (widget-put widget 'glyph value)
+      (widget-put widget :value value))
+    (put-text-property (point)
+                      (progn
+                        (widget-apply widget :create)
+                        (point))
+                      'inaudible
+                      widget-image-inaudible-p)))
+
+(defsubst widget-image-usemap (widget)
+  (let ((usemap (widget-get widget 'usemap)))
+    (if (listp usemap)
+       usemap
+      (if (and usemap (string-match "^#" usemap))
+         (setq usemap (substring usemap 1 nil)))
+      (cdr-safe (assoc usemap w3-imagemaps)))))
+
+(defun widget-image-callback (widget widget-ignore &optional event)
+  (if (widget-get widget :href)
+      (w3-fetch (widget-get widget :href) (widget-get widget :target))))
+
+(defmacro widget-image-create-subwidget (&rest args)
+  (` (widget-create (,@ args)
+                   :parent widget
+                   :help-echo 'widget-image-summarize
+                   'usemap (widget-get widget 'usemap)
+                   :href href
+                   :target target
+                   :src (widget-get widget :src)
+                   'ismap server-map)))
+
+(defun widget-image-value-create (widget)
+  ;; Insert the printed representation of the value
+  (let (
+       (href (widget-get widget :href))
+       (target (widget-get widget :target))
+       (face (widget-get widget :button-face))
+       (server-map (widget-get widget 'ismap))
+       (client-map (widget-image-usemap widget))
+       (where (or (widget-get widget 'where) (point)))
+       (glyph (widget-get widget 'glyph))
+       (alt (widget-get widget 'alt))
+       (real-widget nil)
+       (invalid-glyph nil)
+       )
+    (if target (setq target (intern (downcase target))))
+
+    ;; Specifier-instance will signal an error if we have an invalid
+    ;; image specifier, which would be the case if we get screwed up
+    ;; data back from a URL somewhere.
+    
+    (setq invalid-glyph (and glyph (condition-case ()
+                                      (if (specifier-instance
+                                           (glyph-image glyph))
+                                          nil)
+                                    (error t))))
+    (if (or (not glyph) invalid-glyph)
+       ;; Do a TTY or delayed image version of the image.
+       (save-excursion
+         (if (= 0 (length alt)) (setq alt nil))
+         (goto-char where)
+         (cond
+          (client-map
+           (let* ((default nil)
+                  (options (mapcar
+                            (function
+                             (lambda (x)
+                               (if (eq (aref x 0) 'default)
+                                   (setq default (aref x 2)))
+                               (if (and (not default) (stringp (aref x 2)))
+                                   (setq default (aref x 2)))
+                               (list 'choice-item
+                                     :tab-order -1
+                                     :delete 'widget-default-delete
+                                     :format "%[%t%]"
+                                     :tag (or (aref x 3) (aref x 2))
+                                     :value (aref x 2)))) client-map)))
+             (setq real-widget
+                   (apply 'widget-create 'menu-choice
+                          :tag (or (widget-get widget :tag) alt "Imagemap")
+                          :button-face face
+                          :format "%[%t:%v%]"
+                          :ignore-case t
+                          :notify (widget-get widget :notify)
+                          :delete 'widget-default-delete
+                          :action (widget-get widget :action)
+                          :value default
+                          :parent widget
+                          :help-echo 'widget-image-summarize
+                          options))))
+          ((and server-map (stringp href))
+           (setq real-widget
+                 (widget-image-create-subwidget
+                  'item :format "%[%t%]"
+                  :tag alt
+                  :button-face face
+                  :delete 'widget-default-delete
+                  :value href
+                  :action (widget-get widget :action)
+                  :notify (widget-get widget :notify))))
+          (href
+           (setq real-widget
+                 (widget-image-create-subwidget
+                  'item :format "%[%t%]"
+                  :tag (or alt "Image")
+                  :button-face face
+                  :value href
+                  :delete 'widget-default-delete
+                  :action (widget-get widget :action)
+                  :notify 'widget-image-callback)))
+          (alt
+           (setq real-widget
+                 (widget-image-create-subwidget
+                  'item :format "%[%t%]"
+                  :tag alt
+                  :button-face face
+                  :tab-order -1
+                  :delete 'widget-default-delete
+                  :action (widget-get widget :action)
+                  :notify 'widget-image-callback))))
+         (if (not real-widget)
+             nil
+           (widget-put widget :children (list real-widget))))
+      ;;; Actually use the image
+      (let ((extent (or (widget-get widget 'extent)
+                       (make-extent where where))))
+       (set-extent-endpoints extent where where)
+       (widget-put widget 'extent extent)
+       (widget-put widget :children nil)
+       (set-extent-property extent 'keymap widget-image-keymap)
+       (set-extent-property extent 'begin-glyph glyph)
+       (set-extent-property extent 'detachable t)
+       (set-extent-property extent 'help-echo (cond
+                                               ((and href (or client-map
+                                                              server-map))
+                                                (format "%s [map]" href))
+                                               (href href)
+                                               (t nil)))
+       (set-glyph-property glyph 'widget widget)))))
+
+(defun widget-image-delete (widget)
+  ;; Remove the widget from the buffer
+  (let ((extent (widget-get widget 'extent))
+       (child  (car (widget-get widget :children))))
+    (cond
+     (extent                           ; Remove a glyph
+      (delete-extent extent))
+     (child                            ; Remove a child widget
+      (widget-apply child :delete))
+     (t                                        ; Doh!  Do nothing.
+      nil))))     
+
+(if (fboundp 'mouse-event-p)
+    (fset 'widget-mouse-event-p 'mouse-event-p)
+  (fset 'widget-mouse-event-p 'ignore))
+
+(if (fboundp 'glyphp)
+    (fset 'widget-glyphp 'glyphp)
+  (fset 'widget-glyphp 'ignore))
+
+(defun widget-image-button-press (event)
+  (interactive "@e")
+  (let* ((glyph (and event (widget-mouse-event-p event) (event-glyph event)))
+        (widget (and glyph (glyph-property glyph 'widget))))
+    (widget-image-notify widget widget event)))    
+
+(defun widget-image-usemap-default (usemap)
+  (let ((rval (and usemap (car usemap))))
+    (while usemap
+      (if (equal (aref (car usemap) 0) "default")
+         (setq rval (car usemap)
+               usemap nil))
+      (setq usemap (cdr usemap)))
+    rval))
+
+(defun widget-image-summarize (widget)
+  (if (widget-get widget :parent)
+      (setq widget (widget-get widget :parent)))
+  (let* ((ismap  (widget-get widget 'ismap))
+        (usemap (widget-image-usemap widget))
+        (href   (widget-get widget :href))
+        (alt    (widget-get widget 'alt))
+        (value  (widget-value widget)))
+    (cond
+     (usemap
+      (setq usemap (widget-image-usemap-default usemap))
+      ;; Perhaps we should do something here with showing the # of entries
+      ;; in the imagemap as well as the default href?  Could get too long.
+      (format "Client side imagemap: %s" value))
+     (ismap
+      (format "Server side imagemap: %s" href))
+     ((stringp href)                   ; Normal hyperlink
+      (format "Image hyperlink: %s" href))
+     ((stringp alt)                    ; Alternate message was specified
+      (format "Image: %s" alt))
+     ((stringp value)
+      (format "Image: %s" value))
+     (t                                        ; Huh?
+      "A very confused image widget."))))
+
+(defvar widget-image-auto-retrieve 'ask
+  "*Whether to automatically retrieve the source of an image widget
+if it is not an active hyperlink or imagemap.
+If `nil', don't do anything.
+If `t', automatically retrieve the source.
+Any other value means ask the user each time.")
+
+(defun widget-image-notify (widget widget-changed &optional event)
+  ;; Happens when anything changes
+  (let* ((glyph (and event (widget-mouse-event-p event) (event-glyph event)))
+        (x (and glyph (event-glyph-x-pixel event)))
+        (y (and glyph (event-glyph-y-pixel event)))
+        (ismap  (widget-get widget 'ismap))
+        (usemap (widget-image-usemap widget))
+        (href   (widget-get widget :href))
+        (img-src (or (widget-get widget :src)
+                     (and widget-changed (widget-get widget-changed :src))))
+        (target (widget-get widget :target))
+        )
+    (if target (setq target (intern (downcase target))))
+    (cond
+     ((and glyph usemap)               ; Do the client-side imagemap stuff
+      (setq href (w3-point-in-map (vector x y) usemap nil))
+      (if (stringp href)
+         (w3-fetch href target)
+       (message "No destination found for %d,%d" x y)))
+     ((and glyph x y ismap)            ; Do the server-side imagemap stuff
+      (w3-fetch (format "%s?%d,%d" href x y) target))
+     (usemap                           ; Dummed-down tty client side imap
+      (let ((choices (mapcar (function
+                             (lambda (entry)
+                               (cons
+                                (or (aref entry 3) (aref entry 2))
+                                (aref entry 2)))) usemap))
+           (choice nil)
+           (case-fold-search t))
+       (setq choice (completing-read "Imagemap: " choices nil t)
+             choice (cdr-safe (assoc choice choices)))
+       (and (stringp choice) (w3-fetch choice target))))
+     (ismap                            ; Do server-side dummy imagemap for tty
+      (w3-fetch (concat href "?0,0") target))
+     ((stringp href)                   ; Normal hyperlink
+      (w3-fetch href target))
+     ((stringp img-src)
+      (cond
+       ((null widget-image-auto-retrieve) nil)
+       ((eq t widget-image-auto-retrieve)
+       (w3-fetch img-src))
+       ((funcall url-confirmation-func
+                (format "Retrieve image (%s)?"
+                        (url-truncate-url-for-viewing img-src)))
+       (w3-fetch img-src))))
+     (t                                        ; Huh?
+      nil))))
+
+(provide 'w3-widget)
diff --git a/lisp/w3-xem20.el b/lisp/w3-xem20.el
new file mode 100644
index 0000000..5a51280
--- /dev/null
+++ b/lisp/w3-xem20.el
@@ -0,0 +1,79 @@
+;;; w3-xem20.el -- XEmacs 20.0 with Mule specific functions
+;; Author: MORIOKA Tomohiko
+;; Created: $Date: 1998/12/01 22:12:11 $
+;; Version: $Revision: 1.1 $
+;; Keywords: faces, help, i18n, mouse, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1996 by MORIOKA Tomohiko
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Printing a mule buffer as postscript.  Requires m2ps
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(require 'mule-sysdp)
+
+(defun w3-m2ps-buffer (&optional buffer)
+  "Print a buffer by passing it through m2ps and lpr."
+  (or buffer (setq buffer (current-buffer)))
+  (let ((x (save-excursion (set-buffer buffer) tab-width)))
+    (save-excursion
+      (set-buffer (get-buffer-create " *mule-print*"))
+      (erase-buffer)
+      (insert-buffer buffer)
+      (if (/= x tab-width)
+         (progn
+           (setq tab-width x)
+           (message "Converting tabs")
+           (untabify (point-min) (point-max))))
+      (setq file-coding-system *internal*)
+      (shell-command-on-region (point-min) (point-max)
+                              "m2ps | lpr" t))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Multi-Lingual Emacs (MULE) Specific Functions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar attributed-region nil
+  "Bogus definition to get rid of compile-time warnings.")
+
+(defun w3-inhibit-code-conversion (proc buf)
+  "Inhibit Mule's subprocess PROC from code converting in BUF."
+  (save-excursion
+    (set-buffer buf)
+    (setq mc-flag nil))
+  (set-process-input-coding-system proc mule-no-coding-system)
+  (set-process-output-coding-system proc mule-no-coding-system))
+
+(defvar w3-mime-list-for-code-conversion
+  '("text/plain" "text/html")
+  "List of MIME types that require Mules' code conversion.")
+(make-variable-buffer-local 'w3-mime-list-for-code-conversion)
+
+(defun w3-convert-code-for-mule (mmtype)
+  "Convert current data into the appropriate coding system"
+  (and (or (not mmtype) (member mmtype w3-mime-list-for-code-conversion))
+       (let* ((c (detect-coding-region (point-min) (point-max)))
+             (code (or (and (listp c) (car c)) c)))
+        (setq mc-flag t)
+        (decode-coding-region (point-min) (point-max) code)
+        (set-file-coding-system code)
+        )))
+
+(provide 'w3-xem20)
diff --git a/lisp/w3-xemac.el b/lisp/w3-xemac.el
new file mode 100644
index 0000000..f722cca
--- /dev/null
+++ b/lisp/w3-xemac.el
@@ -0,0 +1,209 @@
+;;; w3-xemac.el --- XEmacs specific functions for emacs-w3
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:10 $
+;; Version: $Revision: 1.1 $
+;; Keywords: faces, help, mouse, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'w3-imap)
+(require 'images)
+(require 'w3-widget)
+(require 'w3-menu)
+(require 'w3-forms)
+(require 'w3-script)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Enhancements For XEmacs
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-mouse-handler (e)
+  "Function to message the url under the mouse cursor"
+  (interactive "e")
+  (if (equal (current-buffer) (event-buffer e))
+      (let* ((pt (event-point e))
+            (good (eq (event-window e) (selected-window)))
+            (mouse-events))
+       (if (not (and good pt (number-or-marker-p pt)))
+           nil
+         (if (and inhibit-help-echo w3-track-mouse)
+             (widget-echo-help pt))
+         (setq mouse-events (w3-script-find-event-handlers pt 'mouse))
+         (if (assq 'onmouseover mouse-events)
+             (w3-script-evaluate-form (cdr (assq 'onmouseover 
mouse-events))))))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Functions to build menus of urls
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-setup-version-specifics ()
+  "Set up routine for XEmacs 19.12 or later"
+  ;; Create the toolbar buttons
+  (and (featurep 'toolbar)
+       (w3-toolbar-make-buttons))
+
+  ;; Register the default set of image conversion utilities
+  (image-register-netpbm-utilities)
+
+  ;; Add our menus, but make sure that we do it to the global menubar
+  ;; not the current one, which could be anything, but usually GNUS or
+  ;; VM if not the default.
+  ;;
+  ;; InfoDock handles all of this for us, so we don't need to worry about
+  ;; it there.
+  (if (and (featurep 'menubar) (not (featurep 'infodock)))
+      (let ((current-menubar (default-value 'current-menubar)))
+       (if current-menubar
+           (add-submenu '("Help") (cons "WWW" (cdr w3-menu-help-menu))))))
+
+  ;; FIXME FIXME: Do sexy things to the default modeline for Emacs-W3
+  
+  ;; The following is a workaround for XEmacs 19.14 and XEmacs 20.0
+  ;; The text property implementation is badly broken - you could not have
+  ;; a text property with a `nil' value.  Bad bad bad.
+  (if (or (and (= emacs-major-version 20)
+              (= emacs-minor-version 0))
+         (and (= emacs-major-version 19)
+              (= emacs-minor-version 14)))
+      (defun text-prop-extent-paste-function (ext from to)
+       (let ((prop (extent-property ext 'text-prop nil))
+             (val nil))
+         (if (null prop)
+             (error "Internal error: no text-prop"))
+         (setq val (extent-property ext prop nil))
+         (put-text-property from to prop val nil)
+         nil))
+    )
+  )
+
+(defun w3-store-in-clipboard (str)
+  "Store string STR into the clipboard in X"
+  ;; If possible, let's use the builtin XEmacs device-independent version
+  ;; of this function.  This exists as of XEmacs 21.0, so we should still
+  ;; provide our own version in case we are not on the bleeding edge.
+  (if (fboundp 'own-selection)
+      (own-selection str)
+    (case (device-type)
+      (x
+       (x-own-selection str))
+      (mswindows
+       (mswindows-own-selection str))
+      (otherwise
+       nil))))
+
+(defun w3-mode-motion-hook (e)
+  (let* ((glyph  (event-glyph e))
+        (x      (and glyph (event-glyph-x-pixel e)))
+        (y      (and glyph (event-glyph-y-pixel e)))
+        (widget (and glyph (glyph-property glyph 'widget)))
+        (usemap (and widget (w3-image-widget-usemap widget)))
+        (ismap  (and widget (widget-get widget 'ismap)))
+        (echo   (and widget (widget-get widget 'href))))
+    (cond
+     (usemap
+      (setq echo (w3-point-in-map (vector x y) usemap t)))
+     (ismap
+      (setq echo (format "%s?%d,%d" echo x y)))
+     (t
+      nil))
+    (and echo (message "%s" echo))))
+
+(defun w3-mode-version-specifics ()
+  "XEmacs specific stuff for w3-mode"
+  (if (featurep 'mouse)
+      (progn
+       (if (not w3-track-mouse)
+           (setq inhibit-help-echo nil))
+       (setq mode-motion-hook 'w3-mouse-handler)))
+  (case (device-type)
+    ((tty stream)                      ; TTY or batch
+     nil)
+    (otherwise
+     (w3-add-toolbar-to-buffer)))
+  (setq mode-popup-menu w3-popup-menu))
+
+;; Some old versions of XEmacs have a dumped version of the widget and
+;; custom libraries that are too old for us to use, so we have to reload
+;; the new ones.
+(if (or (string-match "19\\.1[3456]" emacs-version)
+       (string-match "20\\.[0123]" emacs-version))
+    (mapc 'load '("wid-edit" "widget" "custom" "cus-edit" "cus-face"
+                 "cus-start" "cus-load")))
+
+(if (string-match "19\\.13" emacs-version)
+    ;; This is all from Vladimir Alexiev <address@hidden>
+    (progn
+      (require 'advice)
+      (declare (special widget-use-overlay-change))
+      (defadvice add-text-properties (before face-list activate)
+       "Allow a list of faces (ignore all but first one)."
+       (let ((faces (plist-get props 'face)))
+         (if (listp faces)
+             (plist-put props 'face (car faces)))))
+
+      (defadvice set-extent-property (before face-list activate)
+       "Allow a list of faces (ignore all but first one)."
+       (if (and (eq property 'face) (listp value))
+           (setq value (car value))))
+
+      (defadvice insert-char (before inherit-ignore 
+                                    (char &optional count inherit buffer)
+                                    activate)
+       "Accept and ignore a third arg INHERIT."
+       (or (bufferp inherit) (setq inherit buffer)))
+
+
+      (defun font-height (font) 1)
+      (defun font-width (font) 1)      ; works for tty
+      (defalias 'get-char-property 'get-text-property)
+      (defalias 'extent-object 'extent-buffer)
+      (defvar shell-command-switch "-c") ; for mm
+
+      ;; for x-overlay
+      (defun extent-list (&optional buffer from to)
+       "Return a list of all extents in BUFFER between FROM and TO 
+\(see mapcar-extents\)."
+       (mapcar-extents 'identity nil buffer from to))
+
+      ;; for custom/widget
+      (setq widget-use-overlay-change nil) ; slower, but works
+
+      (defadvice add-hook (before ignore 
+                                 (hook function &optional append ignore)
+                                 activate)
+       "Accept and ignore a fourth argument.")
+
+      (defadvice remove-hook (before ignore 
+                                    (hook function &optional ignore) activate)
+       "Accept and ignore a third argument.")
+
+      (defun valid-image-instantiator-format-p (format)
+       (valid-instantiator-p
+        (vector format :file (concat "foo." (symbol-name format)))
+        'image))
+
+      (defadvice make-sparse-keymap (before ignore (&optional name) activate)
+       "Accept and ignore an optional arg NAME.")
+      ))
+
+(require 'w3-toolbar)
+(provide 'w3-xemacs)
+(provide 'w3-xemac)
diff --git a/lisp/w3.el b/lisp/w3.el
new file mode 100644
index 0000000..957c1cf
--- /dev/null
+++ b/lisp/w3.el
@@ -0,0 +1,2511 @@
+;;; w3.el --- Main functions for emacs-w3 on all platforms/versions
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:07 $
+;; Version: $Revision: 1.1 $
+;; Keywords: faces, help, comm, news, mail, processes, mouse, hypermedia
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1993 - 1996 by William M. Perry <address@hidden>
+;;; Copyright (c) 1996 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is part of GNU Emacs.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; This is a major mode for browsing documents written in Hypertext Markup ;;;
+;;; Language (HTML).  These documents are typicallly part of the World Wide ;;;
+;;; Web (WWW), a project to create a global information net in hypertext    ;;;
+;;; format.                                                                ;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; first start by making sure the load path is properly set.  This code
+;;; is mostly taken from calc-2.02b
+;;;
+;;; this allows you to put the following in your .emacs file, instead of
+;;; having to know what the load-path for the w3 files is.
+;;;
+;;;     (autoload 'w3 "w3/w3" "WWW Browser" t)
+
+;;; If w3 files exist on the load-path, we're all set.
+(let ((name (and (fboundp 'w3)
+                (eq (car-safe (symbol-function 'w3)) 'autoload)
+                (nth 1 (symbol-function 'w3))))
+      (p load-path))
+  (while (and p (not (file-exists-p
+                     (expand-file-name "w3-vars.elc" (car p)))))
+    (setq p (cdr p)))
+  (or p
+;;; If w3 is autoloaded using a path name, look there for w3 files.
+;;; This works for both relative ("w3/w3.elc") and absolute paths.
+      (and name (file-name-directory name)
+          (let ((p2 load-path)
+                (name2 (concat (file-name-directory name)
+                               "w3-vars.elc")))
+            (while (and p2 (not (file-exists-p
+                                 (expand-file-name name2 (car p2)))))
+              (setq p2 (cdr p2)))
+            (if p2
+                (setq load-path (nconc load-path
+                                       (list
+                                        (directory-file-name
+                                         (file-name-directory
+                                          (expand-file-name
+                                           name (car p2)))))))))))
+  )
+
+
+(require 'w3-sysdp)
+(require 'w3-cfg)
+(require 'mule-sysdp)
+(require 'widget)
+
+(or (featurep 'efs)
+    (featurep 'efs-auto)
+    (condition-case ()
+       (require 'ange-ftp)
+      (error nil)))
+
+(require 'cl)
+(require 'css)
+(require 'url-vars)
+(require 'w3-vars)
+(eval-and-compile
+  (require 'w3-display))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Code for printing out roman numerals
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-decimal-to-roman (n)
+  ;; Convert from decimal to roman numerals
+  (let ((curmod 1000)
+       (str "")
+       (j 7)
+       i2 k curcnt)
+    (while (>= curmod 1)
+      (if (>= n curmod)
+         (progn
+           (setq curcnt (/ n curmod)
+                 n (- n (* curcnt curmod)))
+           (if (= 4 (% curcnt 5))
+               (setq i2 (+ j (if (> curcnt 5) 1 0))
+                     str (format "%s%c%c" str
+                                 (aref w3-roman-characters (1- j))
+                                 (aref w3-roman-characters i2)))
+             (progn
+               (if (>= curcnt 5)
+                   (setq str (format "%s%c" str (aref w3-roman-characters j))
+                         curcnt (- curcnt 5)))
+               (setq k 0)
+               (while (< k curcnt)
+                 (setq str (format "%s%c" str
+                                   (aref w3-roman-characters (1- j)))
+                       k (1+ k)))))))
+      (setq curmod (/ curmod 10)
+           j (- j 2)))
+    str))
+
+(defun w3-decimal-to-alpha (n)
+  ;; Convert from decimal to alphabetical (a, b, c, ..., aa, ab,...)
+  (cond
+   ((< n 1) (char-to-string ?Z))
+   ((<= n 26) (char-to-string (+ ?A (1- n))))
+   (t (concat (char-to-string (+ ?A (1- (/ n 27))))
+             (w3-decimal-to-alpha (% n 26))))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Functions to pass files off to external viewers
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-start-viewer (fname cmd &optional view)
+  "Start a subprocess, named FNAME, executing CMD.
+If third arg VIEW is non-nil, show the output in a buffer when
+the subprocess exits."
+  (if view (save-excursion
+            (set-buffer (get-buffer-create view))
+            (erase-buffer)))
+  (start-process fname view shell-file-name shell-command-switch cmd))
+
+(defun w3-viewer-filter (proc string)
+  ;; A process filter for asynchronous external viewers
+  (let ((buff (get-buffer-create (url-generate-new-buffer-name
+                                 (symbol-name
+                                  (read (nth 2 (process-command proc))))))))
+    (save-excursion
+      (set-buffer buff)
+      (erase-buffer)
+      (insert string)
+      (set-process-buffer proc buff)
+      (w3-notify-when-ready buff)
+      (set-process-filter proc nil))))
+
+(defun w3-viewer-sentinel (proc string)
+  ;; Delete any temp files left from a viewer process.
+  (let ((fname (process-name proc))
+       (buffr (process-buffer proc))
+       (status (process-exit-status proc)))
+    (and (/= 0 status)
+        (funcall url-confirmation-func
+                 (format "Viewer for %s failed... save to disk? " fname))
+        (copy-file fname (read-file-name "Save as: ") t))
+    (if (and (file-exists-p fname)
+            (file-writable-p fname))
+       (delete-file fname)))
+  ;; FSF Emacs doesn't do this after calling a process-sentinel
+  (set-buffer (window-buffer (selected-window))))
+
+(defun w3-notify-when-ready (buff)
+  "Notify the user when BUFF is ready.
+See the variable `w3-notify' for the different notification behaviors."
+  (if (stringp buff) (setq buff (get-buffer buff)))
+  (cond
+   ((null buff) nil)
+   ((eq w3-notify 'newframe)
+    ;; Since we run asynchronously, perhaps while Emacs is waiting for input,
+    ;; we must not leave a different buffer current.
+    ;; We can't rely on the editor command loop to reselect
+    ;; the selected window's buffer.
+    (save-excursion
+      (set-buffer buff)
+      (make-frame)))
+   ((eq w3-notify 'bully)
+    (pop-to-buffer buff)
+    (delete-other-windows))
+   ((eq w3-notify 'semibully)
+    (condition-case nil
+       (switch-to-buffer buff)
+      (error (message "W3 buffer %s is ready." (buffer-name buff)))))
+   ((eq w3-notify 'aggressive)
+    (pop-to-buffer buff))
+   ((eq w3-notify 'friendly)
+    (display-buffer buff 'not-this-window))
+   ((eq w3-notify 'polite)
+    (beep)
+    (message "W3 buffer %s is ready." (buffer-name buff)))
+   ((eq w3-notify 'quiet)
+    (message "W3 buffer %s is ready." (buffer-name buff)))
+   (t (message ""))))
+
+(defun w3-pass-to-viewer ()
+  ;; Pass a w3 buffer to a viewer
+  (set-buffer url-working-buffer)
+  (let* ((info  url-current-mime-viewer)          ; All the MIME viewer info
+        (view (cdr-safe (assoc "viewer" info))) ; How to view this file
+        (url (url-view-url t))
+        (fmt  (cdr-safe (assoc "nametemplate" info)))) ; Template for name
+    (cond
+     (fmt nil)
+     ((cdr-safe (assoc "type" info))
+      (setq fmt (mm-type-to-file (cdr-safe (assoc "type" info))))
+      (if fmt
+         (setq fmt (concat "%s" (car fmt)))
+       (setq fmt (concat "%s" (url-file-extension
+                               (url-filename url-current-object)))))))
+    (if (null view)
+       (setq view 'indented-text-mode))
+    (cond
+     ((symbolp view)
+      (if (not (memq view '(w3-prepare-buffer w3-print w3-source
+                                             w3-default-local-file
+                                             mm-multipart-viewer)))
+         (let ((bufnam (url-generate-new-buffer-name
+                        (file-name-nondirectory
+                         (or (url-filename url-current-object)
+                             "Unknown")))))
+           (if (string= bufnam "")
+               (setq bufnam (url-generate-new-buffer-name
+                             (url-view-url t))))
+           (rename-buffer bufnam)
+           ;; Make the URL show in list-buffers output
+           (make-local-variable 'list-buffers-directory)
+           (setq list-buffers-directory (url-view-url t))
+           (set-buffer-modified-p nil)
+           (buffer-enable-undo)
+           (funcall view)
+           (w3-notify-when-ready bufnam))
+       (setq w3-current-last-buffer w3-current-buffer)
+       (funcall view)))
+     ((stringp view)
+      (let ((fname (url-generate-unique-filename fmt))
+           (proc nil))
+       (if (url-file-directly-accessible-p (url-view-url t))
+           (make-symbolic-link (url-filename url-current-object) fname t)
+         (mule-write-region-no-coding-system (point-min) (point-max) fname))
+       (if (get-buffer url-working-buffer)
+           (kill-buffer url-working-buffer))
+       (setq view (mm-viewer-unescape view fname url))
+       (message "Passing to viewer %s " view)
+       (setq proc (w3-start-viewer fname view))
+       (set-process-filter proc 'w3-viewer-filter)
+       (set-process-sentinel proc 'w3-viewer-sentinel)))
+     ((listp view)
+      (set-buffer-modified-p nil)
+      (buffer-enable-undo)
+      (eval view))
+     (t
+      (message "Unknown viewer specified: %s" view)
+      (w3-notify-when-ready url-working-buffer)))))
+
+(defun w3-save-binary-file ()
+  "Save a buffer to disk - this is used when `w3-dump-to-disk' is non-nil"
+  ;; Ok, this is truly fucked.  In XEmacs, if you use the mouse to select
+  ;; a URL that gets saved via this function, read-file-name will pop up a
+  ;; dialog box for file selection.  For some reason which buffer we are in
+  ;; gets royally screwed (even with save-excursions and the whole nine
+  ;; yards).  SO, we just keep the old buffer name around and away we go.
+  (let ((old-buff (current-buffer))
+       (file (read-file-name "Filename to save as: "
+                             (or mm-download-directory "~/")
+                             (url-remove-compressed-extensions
+                              (file-name-nondirectory (url-view-url t)))
+                             nil
+                             (url-remove-compressed-extensions
+                              (file-name-nondirectory (url-view-url t)))))
+       (require-final-newline nil))
+    (set-buffer old-buff)
+    (mule-write-region-no-coding-system (point-min) (point-max) file)
+    (kill-buffer (current-buffer))))
+
+;;;###autoload
+(defun w3-open-local (fname)
+  "Find a local file, and interpret it as a hypertext document.
+It will prompt for an existing file or directory, and retrieve it as a
+hypertext document."
+  (interactive "FLocal file: ")
+  (setq fname (expand-file-name fname))
+  (if (not w3-setup-done) (w3-do-setup))
+  (w3-fetch (concat "file:" fname)))
+
+;;;###autoload
+(defun w3-find-file (fname)
+  "Find a local file, and interpret it as a hypertext document.
+It will prompt for an existing file or directory, and retrieve it as a
+hypertext document."
+  (interactive "FLocal file: ")
+  (w3-open-local fname))
+ 
+;;;###autoload
+(defun w3-fetch-other-frame (&optional url)
+  "Attempt to follow the hypertext reference under point in a new frame.
+With prefix-arg P, ignore viewers and dump the link straight
+to disk."
+  (interactive (list (w3-read-url-with-default)))
+  (cond
+   ((and (fboundp 'make-frame)
+        (fboundp 'select-frame)
+        (not (eq (device-type) 'tty)))
+    (let ((frm (make-frame)))
+      (select-frame frm)
+      (delete-other-windows)
+      (w3-fetch url)))
+   (t (w3-fetch url))))
+
+(defun w3-fetch-other-window (&optional url)
+  "Attempt to follow the hypertext reference under point in a new window.
+With prefix-arg P, ignore viewers and dump the link straight
+to disk."
+  (interactive (list (w3-read-url-with-default)))
+  (split-window)
+  (w3-fetch url))
+
+;; Ripped off from red gnus
+(defun w3-find-etc-directory (package &optional file)
+  "Go through the path and find the \".../etc/PACKAGE\" directory.
+If FILE, find the \".../etc/PACKAGE\" file instead."
+  (let ((path load-path)
+       dir result)
+    ;; We try to find the dir by looking at the load path,
+    ;; stripping away the last component and adding "etc/".
+    (while path
+      (if (and (car path)
+              (file-exists-p
+               (setq dir (concat
+                          (file-name-directory
+                           (directory-file-name (car path)))
+                          "etc/" package 
+                          (if file "" "/"))))
+              (or file (file-directory-p dir)))
+         (setq result dir
+               path nil)
+       (setq path (cdr path))))
+    result))
+
+(defun w3-url-completion-function (string predicate function)
+  (if (not w3-setup-done) (w3-do-setup))
+  (cond
+   ((eq function nil)
+    (let ((list nil))
+      (cl-maphash (function (lambda (key val)
+                             (setq list (cons (cons key val)
+                                              list))))
+                 url-global-history-hash-table)
+      (try-completion string (nreverse list) predicate)))
+   ((eq function t)
+    (let ((stub (concat "^" (regexp-quote string)))
+         (retval nil))
+      (cl-maphash
+       (function
+       (lambda (url time)
+         (if (string-match stub url)
+             (setq retval (cons url retval)))))
+       url-global-history-hash-table)
+      retval))
+   ((eq function 'lambda)
+    (and url-global-history-hash-table
+        (cl-gethash string url-global-history-hash-table)
+        t))
+   (t
+    (error "w3-url-completion-function very confused."))))
+
+(defun w3-read-url-with-default ()
+  (url-do-setup)
+  (let* ((completion-ignore-case t)
+        (default
+          (cond
+           ((null w3-fetch-with-default) nil)
+           ((eq major-mode 'w3-mode)
+            (or (and current-prefix-arg (w3-view-this-url t))
+                (url-view-url t)))
+           ((url-get-url-at-point)
+            (url-get-url-at-point))
+           (t "http://www.";)))
+        (url nil))
+    (setq url
+         (completing-read "URL: "  'w3-url-completion-function
+                          nil nil default))
+    (if (string= url "")
+       (setq url (if (eq major-mode 'w3-mode)
+                     (if (and current-prefix-arg (w3-view-this-url t))
+                         (w3-view-this-url t)
+                       (url-view-url t))
+                   (url-get-url-at-point))))
+    url))
+
+;;;###autoload
+(defun w3-fetch (&optional url target)
+  "Retrieve a document over the World Wide Web.
+Defaults to URL of the current document, if any.
+With prefix argument, use the URL of the hyperlink under point instead."
+  (interactive (list (w3-read-url-with-default)))
+  (if (not w3-setup-done) (w3-do-setup))
+  (if (boundp 'w3-working-buffer)
+      (setq w3-working-buffer url-working-buffer))
+  (if (and (boundp 'command-line-args-left)
+          command-line-args-left
+          (string-match url-nonrelative-link (car command-line-args-left)))
+      (setq url (car command-line-args-left)
+           command-line-args-left (cdr command-line-args-left)))
+  (if (equal url "") (error "No document specified!"))
+  ;; legal use for relative URLs ?
+  (if (string-match "^www:[^/].*" url)
+      (setq url (concat (file-name-directory (url-filename
+                                             url-current-object))
+                       (substring url 4))))
+  ;; In the common case, this is probably cheaper than searching.
+  (while (= (string-to-char url) ? )
+    (setq url (substring url 1)))
+  (or target (setq target w3-base-target))
+  (if (stringp target)
+      (setq target (intern (downcase target))))
+  (and target
+       (let ((window-distance (cdr-safe (assq target 
w3-target-window-distances))))
+        (if (numberp window-distance)
+            (other-window window-distance)
+          (case target
+            ((_blank external)
+             (w3-fetch-other-frame url))
+            (_top
+             (delete-other-windows))
+            (otherwise
+             (message "target %S not found." target))))))
+  (cond
+   ((= (string-to-char url) ?#)
+    (w3-relative-link url))
+   ((or (and (interactive-p) current-prefix-arg) w3-dump-to-disk)
+    (w3-download-url url))
+   (t
+    (let ((x (url-view-url t))
+         (lastbuf (current-buffer))
+         (w3-current-buffer (current-buffer))
+         (buf (url-buffer-visiting url)))
+      (if (or (not buf)
+             (cond
+              ((not (equal (downcase (or url-request-method "GET")) "get")) t)
+              ((memq w3-reuse-buffers '(no never reload)) t)
+              ((memq w3-reuse-buffers '(yes reuse always)) nil)
+              (t
+               (if (and w3-reuse-buffers (not (eq w3-reuse-buffers 'ask)))
+                   (progn
+                     (ding)
+                     (message
+                      "Warning: Invalid value for variable w3-reuse-buffers: 
%s"
+                      (prin1-to-string w3-reuse-buffers))
+                     (sit-for 2)))
+               (not (funcall url-confirmation-func
+                             (format "Reuse URL in buffer %s? "
+                                     (buffer-name buf)))))))
+         (let* ((status (url-retrieve url))
+                (cached (car status))
+                (url-working-buffer (cdr status)))
+           (if w3-track-last-buffer
+               (setq w3-last-buffer (get-buffer url-working-buffer)))
+           (if (get-buffer url-working-buffer)
+               (cond
+                ((and url-be-asynchronous (not cached))
+                 (save-excursion
+                   (set-buffer url-working-buffer)
+                   (w3-history-push x (url-view-url t))
+                   (setq w3-current-last-buffer lastbuf)))
+                (t
+                 (w3-history-push x url)
+                 (w3-sentinel lastbuf)))
+             (w3-history-push x url)))
+       (with-current-buffer buf
+         (setq w3-current-last-buffer lastbuf))
+       (w3-history-push x url)
+       (if w3-track-last-buffer
+           (setq w3-last-buffer buf))
+       (let ((w3-notify (if (memq w3-notify '(newframe bully 
+                                              semibully aggressive))
+                            w3-notify
+                          'aggressive)))
+         (w3-notify-when-ready buf))
+       (if (string-match "#\\(.*\\)" url)
+           (progn
+             (push-mark (point) t)
+             (w3-find-specific-link (url-match url 1))))
+       (or (w3-maybe-fetch-frames)
+           (message "Reusing URL.  To reload, type %s."
+                    (substitute-command-keys "\\[w3-reload-document]"))))))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; History for forward/back buttons
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defvar w3-history-stack nil
+  "History stack viewing history.
+This is an assoc list, with the oldest items first.
+Each element is a cons cell of (url . timeobj), where URL
+is the normalized URL (default ports removed, etc), and TIMEOBJ is
+a standard Emacs time.  See the `current-time' function documentation
+for information on this format.")
+
+(defun w3-history-find-url-internal (url)
+  "Search in the history list for URL.
+Returns a cons cell, where the car is the 'back' node, and
+the cdr is the 'next' node."
+  (let* ((node (assoc url w3-history-stack))
+        (next (cadr (memq node w3-history-stack)))
+        (last nil)
+        (temp nil)
+        (todo w3-history-stack))
+    ;; Last node is a little harder to find without using back links
+    (while (and (not last) todo)
+      (if (string= (caar todo) url)
+         (setq last (or temp 'none))
+       (setq temp (pop todo))))
+    (cons (if (not (symbolp last)) last)
+         next)))
+
+(defun w3-history-forward ()
+  "Go forward in the history from this page"
+  (interactive)
+  (let ((next (cadr (w3-history-find-url-internal (url-view-url t))))
+       (w3-reuse-buffers 'yes))
+    (if next
+       (w3-fetch next))))
+
+(defun w3-history-backward ()
+  "Go backward in the history from this page"
+  (interactive)
+  (let ((last (caar (w3-history-find-url-internal (url-view-url t))))
+       (w3-reuse-buffers 'yes))
+    (if last
+       (w3-fetch last))))
+
+(defun w3-history-push (referer url)
+  "REFERER is the url we followed this link from.  URL is the link we got to."
+  (if (not referer)
+      (setq w3-history-stack (list (cons url (current-time))))
+    (let ((node (memq (assoc referer w3-history-stack) w3-history-stack)))
+      (if node
+         (setcdr node (list (cons url (current-time))))
+       (setq w3-history-stack (append w3-history-stack
+                                      (list
+                                       (cons url (current-time)))))))))
+
+(defalias 'w3-add-urls-to-history 'w3-history-push)
+(defalias 'w3-backward-in-history 'w3-history-backward)
+(defalias 'w3-forward-in-history 'w3-history-forward)
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Miscellaneous functions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-describe-entities ()
+  "Show an DTD fragment listing all the entities currently defined."
+  (interactive)
+  (switch-to-buffer (get-buffer-create "W3 Entities"))
+  (let ((buffer-file-name (concat (make-temp-name "entities") ".dtd")))
+    (set-auto-mode))
+  (erase-buffer)
+  (let (entity)
+    (mapatoms
+     (function
+      (lambda (x)
+       (setq entity (get x 'html-entity-expansion))
+       (if entity
+           (insert (format "<!entity %s %s \"%s\">\n" x (car entity)
+                           (cdr entity))))))))
+  (goto-char (point-min)))
+
+(defun w3-executable-exists-in-path (exec &optional path)
+  (let ((paths (if (consp path)
+                  path
+                (mm-string-to-tokens (or path
+                                         (getenv "PATH")
+                                         (concat
+                                          "/usr/bin:/bin:/usr/local/bin:"
+                                          "/usr/bin/X11:"
+                                          (expand-file-name "~/bin"))) ?:)))
+       (done nil))
+    (while (and paths (not done))
+      (if (file-exists-p (expand-file-name exec (car paths)))
+         (setq done t))
+      (setq paths (cdr paths)))
+    done))
+
+(defun w3-document-information (&optional buff)
+  "Display information on the document in buffer BUFF"
+  (interactive)
+  (if (interactive-p)
+      (let ((w3-notify 'friendly))
+       (if (get-buffer "Document Information")
+           (kill-buffer (get-buffer "Document Information")))
+       (w3-fetch "about:document"))
+    (setq buff (or buff (current-buffer)))
+    (save-excursion
+      (set-buffer buff)
+      (let* ((url (url-view-url t))
+            (cur-links w3-current-links)
+            (title (buffer-name))
+            (case-fold-search t)
+            (possible-lastmod (save-excursion
+                                (goto-char (point-min))
+                                (if (re-search-forward "^Last 
modified:\\(.*\\)" nil t)
+                                    (buffer-substring (match-beginning 1)
+                                                      (match-end 1)))))
+            (attributes (url-file-attributes url))
+            (lastmod (or (cdr-safe (assoc "last-modified"
+                                          url-current-mime-headers))
+                         (nth 5 attributes)))
+            (hdrs url-current-mime-headers)
+            (size (or (cdr (assoc "content-length" url-current-mime-headers))
+                      (buffer-size)))
+            (info w3-current-metainfo))
+       (set-buffer (get-buffer-create url-working-buffer))
+       (setq url-current-can-be-cached nil)
+       (erase-buffer)
+       (cond
+        ((stringp lastmod) nil)
+        ((equal '(0 . 0) lastmod) (setq lastmod possible-lastmod))
+        ((consp lastmod) (setq lastmod (current-time-string lastmod)))
+        (t (setq lastmod possible-lastmod)))
+       (setq url-current-mime-type "text/html")
+       (insert "<html>\n"
+               " <head>\n"
+               "  <title>Document Information</title>\n"
+               " </head>\n"
+               " <body\n"
+               "  <table border>\n"
+               "   <tr><th colspan=2>Document Information</th></tr>\n"
+               "   <tr><td>Title:</td><td>" title "</td></tr>\n"
+               "   <tr><td>Location:</td><td>" url "</td></tr>\n"
+               "   <tr><td>Size:</td><td>" (url-pretty-length
+                                            (if (stringp size)
+                                                (string-to-int size)
+                                              size)) "</td></tr>\n"
+               "   <tr><td>Last Modified:</td><td>" (or lastmod "None Given")
+               "</td></tr>\n")
+       (if hdrs
+           (let* ((maxlength (car (sort (mapcar (function (lambda (x)
+                                                            (length (car x))))
+                                                hdrs)
+                                        '>)))
+                  (fmtstring (format "   <tr><td 
align=right>%%%ds:</td><td>%%s</td></tr>" maxlength)))
+             (insert "  <tr><th colspan=2>MetaInformation</th></tr>\n"
+                     (mapconcat
+                      (function
+                       (lambda (x)
+                         (if (/= (length (car x)) 0)
+                             (format fmtstring
+                                     (url-insert-entities-in-string
+                                      (capitalize (car x)))
+                                     (url-insert-entities-in-string
+                                      (if (numberp (cdr x))
+                                          (int-to-string (cdr x))
+                                        (cdr x)))))))
+                      (sort hdrs
+                            (function
+                             (lambda (x y) (string-lessp (car x) (car y)))))
+                      "\n"))))
+
+       ;; FIXME!!! Need to reimplement showing rel/rev links for the new
+       ;; storage format.
+       
+       (if info
+           (let* ((maxlength (car (sort (mapcar (function (lambda (x)
+                                                            (length (car x))))
+                                                info)
+                                        '>)))
+                  (fmtstring (format "   <tr><td>%%%ds:</td><td>%%s</td></tr>" 
maxlength)))
+             (insert "   <tr><th colspan=2>Miscellaneous 
Variables</th></tr>\n")
+             (while info
+               (if (and (caar info) (cdar info))
+                   (insert (format fmtstring
+                                   (url-insert-entities-in-string
+                                    (capitalize (caar info)))
+                                   (url-insert-entities-in-string
+                                    (cdar info))) "\n"))
+               (setq info (cdr info))
+               )
+             )
+         )
+       (insert "  </table>\n"
+               " </body>\n"
+               "</html>\n")))))
+
+(defun w3-truncate-menu-item (string)
+  (if (<= (length string) w3-max-menu-width)
+      string
+    (concat (substring string 0 w3-max-menu-width) "$")))
+
+(defun w3-insert-formatted-url (p)
+  "Insert a formatted url into a buffer.  With prefix arg, insert the url
+under point."
+  (interactive "P")
+  (let (buff str)
+    (cond
+     (p
+      (setq p (widget-at (point)))
+      (or p (error "No url under point"))
+      (setq str (format "<a href=\"%s\">%s</a>" (widget-get p :href)
+                       (read-string "Link text: "
+                                    (buffer-substring
+                                      (widget-get p :from)
+                                      (widget-get p :to))))))
+     (t
+      (setq str (format "<a href=\"%s\">%s</a>" (url-view-url t)
+                       (read-string "Link text: " (buffer-name))))))
+    (setq buff (read-buffer "Insert into buffer: " nil t))
+    (if buff
+       (save-excursion
+         (set-buffer buff)
+         (insert str))
+      (message "Cancelled."))))
+
+(defun w3-first-n-items (l n)
+  "Return the first N items from list L"
+  (let ((x 0)
+       y)
+    (if (> n (length l))
+       (setq y l)
+      (while (< x n)
+       (setq y (nconc y (list (nth x l)))
+             x (1+ x))))
+    y))
+
+(defun w3-widget-button-press ()
+  (interactive)
+  (if (widget-at (point))
+      (widget-button-press (point))))
+
+(defun w3-widget-button-click (e)
+  (interactive "@e")
+  (cond
+   ((and (event-point e)
+        (widget-at (event-point e)))
+    (widget-button-click e))
+   ((and (fboundp 'event-glyph)
+        (event-glyph e)
+        (glyph-property (event-glyph e) 'widget))
+    (widget-button-click e))))
+   
+;;;###autoload
+(defun w3-maybe-follow-link-mouse (e)
+  "Maybe follow a hypertext link under point.
+If there is no link under point, this will try using
+url-get-url-at-point"
+  (interactive "e")
+  (save-excursion
+    (mouse-set-point e)
+    (w3-maybe-follow-link)))
+
+;;;###autoload
+(defun w3-maybe-follow-link ()
+  "Maybe follow a hypertext link under point.
+If there is no link under point, this will try using
+url-get-url-at-point"
+  (interactive)
+  (require 'w3)
+  (if (not w3-setup-done) (w3-do-setup))
+  (let* ((widget (widget-at (point)))
+         (url1 (and widget (widget-get widget :href)))
+         (url2 (url-get-url-at-point)))
+    (cond
+      (url1 (widget-button-press))
+      ((and url2 (string-match url-nonrelative-link url2)) (w3-fetch url2))
+      (t (message "No URL could be found!")))))
+
+;;;###autoload
+(defun w3-follow-url-at-point-other-frame (&optional pt)
+  "Follow the URL under PT, defaults to link under (point)"
+  (interactive "d")
+  (let ((url (url-get-url-at-point pt)))
+    (and url (w3-fetch-other-frame url))))
+
+;;;###autoload
+(defun w3-follow-url-at-point (&optional pt)
+  "Follow the URL under PT, defaults to link under (point)"
+  (interactive "d")
+  (let ((url (url-get-url-at-point pt)))
+    (and url (w3-fetch url))))
+
+(defun w3-fix-spaces (x)
+  "Remove spaces/tabs at the beginning of a string,
+and convert newlines into spaces."
+  (url-convert-newlines-to-spaces
+   (url-strip-leading-spaces
+    (url-eat-trailing-space x))))
+
+(defun w3-reload-all-files ()
+  "Reload all w3 files"
+  (interactive)
+  (setq w3-setup-done nil
+       url-setup-done nil
+       w3-hotlist nil
+       url-mime-accept-string nil)
+  (let ((x '(w3 base64 css mule-sysdp w3-e19 mm url w3-xemac
+               w3-e20 dsssl dsssl-flow font images ssl url-auth
+               url-cache url-cookie url-file url-gopher url-gw
+               url-http url-mail url-misc url-news url-ns url-parse
+               url-vars w3-about w3-cus w3-display w3-e20 w3-elisp
+               w3-emulate w3-forms w3-hot w3-imap w3-jscript
+               w3-keyword w3-latex w3-menu w3-mouse w3-parse
+               w3-prefs w3-print w3-props w3-script w3-speak w3-style
+               w3-sysdp w3-toolbar w3-vars w3-widget w3-xemac w3
+               w3-toolbar font)))
+    (while x
+      (setq features (delq (car x) features)
+           x (cdr x)))
+    (require 'w3))
+  (mapatoms (function
+            (lambda (sym)
+              (if (or (string-match "^w3-" (symbol-name sym))
+                      (string-match "^url-" (symbol-name sym))
+                      (string-match "^ssl-" (symbol-name sym))
+                      (string-match "^base64-" (symbol-name sym))
+                      (string-match "^dsssl-" (symbol-name sym))
+                      (string-match "^mm-" (symbol-name sym)))
+                  (progn
+                    (fmakunbound sym)
+                    (makunbound sym))))))
+  (require 'w3))
+
+(defun w3-source-document-at-point ()
+  "View source to the document pointed at by link under point"
+  (interactive)
+  (w3-source-document t))
+
+(defun w3-source-document (under)
+  "View this document's source"
+  (interactive "P")
+  (let* ((url (if under (w3-view-this-url) (url-view-url t)))
+        (src
+         (cond
+          ((null url)
+           (error "No URL found!"))
+          ((and under (null url)) (error "No link at point!"))
+          ((and (not under) (equal url-current-mime-type "text/plain"))
+           (buffer-string))
+          ((and (not under) w3-current-source) w3-current-source)
+          (t
+           (prog2
+               (url-retrieve url)
+               (buffer-string)
+             (kill-buffer (current-buffer))))))
+        (tmp (url-generate-new-buffer-name url)))
+    (if (and url (get-buffer url))
+       (cond
+        ((memq w3-reuse-buffers '(no never reload))
+         (kill-buffer url))
+        ((memq w3-reuse-buffers '(yes reuse always))
+         (w3-notify-when-ready (get-buffer url))
+         (setq url nil))
+        ((funcall url-confirmation-func
+                  (concat "Source for " url " found, reuse? "))
+         (w3-notify-when-ready (get-buffer url)))))
+    (if (not url) nil
+      (set-buffer (get-buffer-create tmp))
+      (insert src)
+      (put-text-property (point-min) (point-max) 'w3-base url)
+      (goto-char (point-min))
+      (setq buffer-file-truename url
+           buffer-file-name url)
+      ;; Null filename bugs `set-auto-mode' in Mule ...
+      (condition-case ()
+         (set-auto-mode)
+       (error nil))
+      (setq buffer-file-truename nil
+           buffer-file-name nil)
+      (buffer-enable-undo)
+      (set-buffer-modified-p nil)
+      (w3-notify-when-ready (get-buffer tmp))))
+  (run-hooks 'w3-source-file-hook))
+
+(defun w3-mail-document-under-point ()
+  "Mail the document pointed to by the hyperlink under point."
+  (interactive)
+  (w3-mail-current-document t))
+
+(defun w3-mail-current-document (under &optional format)
+  "Mail the current-document to someone"
+  (interactive "P")
+  (let* ((completion-ignore-case t)
+        (format (or format
+                    (completing-read
+                     "Format: "
+                     '(("HTML Source")
+                       ("Formatted Text")
+                       ("PostScript")
+                       ("LaTeX Source")
+                       )
+                 nil t)))
+        (case-fold-search t)
+        (url (cond
+              ((stringp under) under)
+              (under (w3-view-this-url t))
+              (t (url-view-url t))))
+        (content-charset (or (and (boundp 'buffer-file-coding-system)
+                                  (symbol-value buffer-file-coding-system)
+                                  (symbol-name buffer-file-coding-system))
+                             "iso-8859-1"))
+        (content-type (concat "text/plain; charset=" content-charset))
+        (str
+         (save-excursion
+           (cond
+            ((and (equal "HTML Source" format) under)
+             (setq content-type (concat "text/html; charset=" content-charset))
+             (let ((url-source t))
+               (url-retrieve url)))
+            ((equal "HTML Source" format)
+             (setq content-type (concat "text/html; charset=" content-charset))
+             (if w3-current-source
+                 (let ((x w3-current-source))
+                   (set-buffer (get-buffer-create url-working-buffer))
+                   (erase-buffer)
+                   (insert x))
+               (url-retrieve url)))
+            ((and under (equal "PostScript" format))
+             (setq content-type "application/postscript")
+             (w3-fetch url)
+             (require 'ps-print)
+             (let ((ps-spool-buffer-name " *w3-temp*"))
+               (if (get-buffer ps-spool-buffer-name)
+                   (kill-buffer ps-spool-buffer-name))
+               (ps-spool-buffer-with-faces)
+               (set-buffer ps-spool-buffer-name)))
+            ((equal "PostScript" format)
+             (require 'ps-print)
+             (let ((ps-spool-buffer-name " *w3-temp*"))
+               (if (get-buffer ps-spool-buffer-name)
+                   (kill-buffer ps-spool-buffer-name))
+               (setq content-type "application/postscript")
+               (ps-spool-buffer-with-faces)
+               (set-buffer ps-spool-buffer-name)))
+            ((and under (equal "Formatted Text" format))
+             (setq content-type (concat "text/plain; charset=" 
content-charset))
+             (w3-fetch url))
+            ((equal "Formatted Text" format)
+             (setq content-type (concat "text/plain; charset=" 
content-charset)))
+            ((and under (equal "LaTeX Source" format))
+             (let ((old-asynch (default-value 'url-be-asynchronous)))
+               (setq content-type (concat "application/x-latex; charset=" 
content-charset))
+               (unwind-protect
+                   (progn
+                     (setq-default url-be-asynchronous nil)
+                     (url-retrieve url))
+                 (setq-default url-be-asynchronous old-asynch))
+               (w3-parse-tree-to-latex (w3-parse-buffer (current-buffer))
+                                       url)))
+            ((equal "LaTeX Source" format)
+             (setq content-type (concat "application/x-latex; charset=" 
content-charset))
+             (w3-parse-tree-to-latex w3-current-parse url)))
+           (buffer-string))))
+    (funcall url-mail-command)
+    (mail-subject)
+    (if (and (boundp 'mime/editor-mode-flag) mime/editor-mode-flag)
+        (insert format " from <URL: " url ">")
+      (insert format " from <URL: " url ">\n"
+              "Mime-Version: 1.0\n"
+              "Content-transfer-encoding: 8bit\n"
+              "Content-type: " content-type))
+    (re-search-forward mail-header-separator nil)
+    (forward-char 1)
+    (if (and (boundp 'mime/editor-mode-flag) mime/editor-mode-flag)
+        (insert (format mime-tag-format content-type) "\n"))
+    (save-excursion
+      (insert str))
+    (cond ((equal "HTML Source" format)
+           (if (or (search-forward "<head>" nil t)
+                  (search-forward "<html>" nil t))
+              (insert "\n"))
+           (insert (format "<base href=\"%s\">" url))))
+    (mail-to)))
+
+(defun w3-internal-use-history (hist-item)
+  ;; Go to the link in the history
+  (let ((url (nth 0 hist-item))
+       (buf (nth 1 hist-item))
+       (pnt (nth 2 hist-item)))
+    (cond
+     ((null buf)                       ; Find a buffer with same url
+      (let ((x (buffer-list))
+           (found nil))
+       (while (and x (not found))
+         (save-excursion
+           (set-buffer (car x))
+           (setq found (string= (url-view-url t) url))
+           (if (not found) (setq x (cdr x)))))
+       (cond
+        (found
+         (switch-to-buffer (car x))
+         (if (number-or-marker-p pnt) (goto-char pnt)))
+        (t
+         (w3-fetch url)))))
+     ((buffer-name buf)                        ; Reuse the old buffer if 
possible
+      (switch-to-buffer buf)
+      (if (number-or-marker-p pnt) (goto-char pnt))
+      (if (and url (= ?# (string-to-char url)))        ; Destination link
+         (progn
+           (goto-char (point-min))
+           (w3-find-specific-link (substring url 1 nil)))))
+     (url (url-maybe-relative url))            ; Get the link
+     (t (message "Couldn't understand whats in the history.")))))
+
+(defun w3-relative-link (url)
+  (if (equal "#" (substring url 0 1))
+      (progn
+       (push-mark (point) t)
+       (goto-char (point-min))
+       (w3-find-specific-link (substring url 1 nil)))
+    (w3-fetch (url-expand-file-name url))))
+
+(defun w3-maybe-eval ()
+  ;; Maybe evaluate a buffer of emacs lisp code
+  (if (funcall url-confirmation-func "This is emacs-lisp code, evaluate it?")
+      (eval-buffer (current-buffer))
+    (emacs-lisp-mode)))
+
+(defun w3-build-continuation ()
+  ;; Build a series of functions to be run on this file
+  (save-excursion
+    (set-buffer url-working-buffer)
+    (let ((cont w3-default-continuation)
+         (extn (url-file-extension
+                (url-filename url-current-object))))
+      (if (assoc extn url-uncompressor-alist)
+         (setq extn (url-file-extension
+                     (substring (url-filename url-current-object)
+                                0 (- (length extn))))))
+      (if w3-source
+         (setq url-current-mime-viewer '(("viewer" . w3-source))))
+      (if (not url-current-mime-viewer)
+         (setq url-current-mime-viewer
+               (mm-mime-info (or url-current-mime-type
+                                 (mm-extension-to-mime extn)) nil 5)))
+      (if url-current-mime-viewer
+         (setq cont (append cont '(w3-pass-to-viewer)))
+       (setq cont (append cont (list 'w3-prepare-buffer))))
+      cont)))
+
+(defun w3-use-links ()
+  "Select one of the <LINK> tags from this document and fetch it."
+  (interactive)
+  (and (not w3-current-links)
+       (error "No links defined for this document."))
+  (w3-fetch "about:document"))
+
+(defun w3-find-this-file ()
+  "Do a find-file on the currently viewed html document if it is a file: or
+ftp: reference"
+  (interactive)
+  (or url-current-object
+      (error "Not a URL-based buffer"))
+  (let ((type (url-type url-current-object)))
+    (cond
+     ((equal type "file")
+      (find-file (url-filename url-current-object)))
+     ((equal type "ftp")
+      (find-file
+       (format "/address@hidden:%s"
+              (url-user url-current-object)
+              (url-host url-current-object)
+              (url-filename url-current-object))))
+     (t (message "Sorry, I can't get that file so you can alter it.")))))
+
+(defun w3-insert-this-url (pref-arg)
+  "Insert the current url in another buffer, with prefix ARG,
+insert URL under point"
+  (interactive "P")
+  (let ((thebuf (get-buffer (read-buffer "Insert into buffer: ")))
+       (oldbuf (current-buffer))
+       (url (if pref-arg (w3-view-this-url t) (url-view-url t))))
+    (if (and url (not (equal "Not on a link!" url)))
+       (progn
+         (set-buffer thebuf)
+         (insert url)
+         (set-buffer oldbuf))
+      (message "Not on a link!"))))
+
+(defun w3-show-hotlist ()
+  "View the hotlist in hypertext form"
+  (interactive)
+  (if (not w3-setup-done) (w3-do-setup))
+  (if (not w3-hotlist)
+      (error "Sorry, no hotlist is in memory.")
+    (let ((x (url-buffer-visiting "www:/auto/hotlist")))
+      (while x
+       (kill-buffer x)
+       (setq x (url-buffer-visiting "www:/auto/hotlist"))))
+    (w3-fetch "www://auto/hotlist")))
+
+(defun url-maybe-relative (url)
+  "Take a url and either fetch it, or resolve relative refs, then fetch it"
+  (cond
+   ((not
+     (string-match url-nonrelative-link url))
+    (w3-relative-link url))
+   (t (w3-fetch url))))
+
+(defun w3-in-assoc (elt list)
+  "Check to see if ELT matches any of the regexps in the car elements of LIST"
+  (let (rslt)
+    (while (and list (not rslt))
+      (and (car (car list))
+          (stringp (car (car list)))
+          (not (string= (car (car list)) ""))
+          (string-match (car (car list)) elt)
+          (setq rslt (car list)))
+      (setq list (cdr list)))
+    rslt))
+
+(defun w3-goto-last-buffer ()
+  "Go to last WWW buffer visited"
+  (interactive)
+  (if w3-current-last-buffer
+      (if w3-frame-name
+         (progn
+           (delete-other-windows)
+           (set-buffer w3-current-last-buffer)
+           (w3-goto-last-buffer))
+       (w3-notify-when-ready w3-current-last-buffer))
+    (message "No previous buffer found.")))
+
+(fset 'w3-replace-regexp 'url-replace-regexp)
+
+;;;###autoload
+(defun w3-preview-this-buffer ()
+  "See what this buffer will look like when its formatted as HTML.
+HTML is the HyperText Markup Language used by the World Wide Web to
+specify formatting for text.  More information on HTML can be found at
+ftp.w3.org:/pub/www/doc."
+  (interactive)
+  (w3-fetch (concat "www://preview/" (buffer-name))))
+
+(defun w3-source ()
+  "Show the source of a file"
+  (let ((tmp (buffer-name (generate-new-buffer "Document Source"))))
+    (set-buffer url-working-buffer)
+    (kill-buffer tmp)
+    (rename-buffer tmp)
+    ;; Make the URL show in list-buffers output
+    (make-local-variable 'list-buffers-directory)
+    (setq list-buffers-directory (url-view-url t))
+    (set-buffer-modified-p nil)
+    (buffer-enable-undo)
+    (w3-notify-when-ready (get-buffer tmp))))
+
+(defvar w3-mime-list-for-code-conversion
+  '("text/plain" "text/html")
+  "List of MIME types that require Mules' code conversion.")
+
+(defvar w3-compression-encodings
+  '("x-gzip" "gzip" "x-compress" "compress")
+  "List of MIME encodings that denote compression")
+
+(defvar w3-no-conversion-encodings
+  w3-compression-encodings
+  "List of MIME encodings that require Mule not to convert
+even though the MIME type is nil or listed in 
`w3-mime-list-for-code-conversion'.")
+
+(defvar w3-explicit-coding-system nil
+  "Coding system to decode documents.
+
+The global value is usually nil.  It will be bound locally if a user
+invokes some commands which read a coding system from the user.")
+
+(defun w3-convert-code-for-mule (mmtype mmcharset mmencoding)
+  "Decode current data by an appropriate coding system."
+  (and (or (not mmtype)
+          (member mmtype w3-mime-list-for-code-conversion))
+       (not (member mmencoding w3-no-conversion-encodings))
+       (let (charset-symbol coding-system)
+        (cond (;; explicit coding system ? (through C-u [w3-reload-document])
+               (and w3-explicit-coding-system
+                    (coding-system-p w3-explicit-coding-system))
+               (setq coding-system w3-explicit-coding-system))
+              (;; explicit charset ? (through MIME headers or META tag)
+               (and (stringp mmcharset)
+                    (setq coding-system (w3-coding-system-for-mime-charset 
mmcharset))))
+              ;; forced conversion ? (through user option 
w3-force-conversion-alist)
+              ((and (url-filename url-current-object)
+                    (let ((force-alist w3-force-conversion-alist)
+                          (url (concat (url-host url-current-object)
+                                       (url-filename url-current-object))))
+                      (while (and force-alist (not coding-system))
+                        (if (string-match (car (car force-alist)) url)
+                            (setq coding-system (cdr (car force-alist))))
+                        (setq force-alist (cdr force-alist)))
+                      coding-system))
+               coding-system)
+              (t;; otherwise try to detect coding-system
+               (setq coding-system
+                     (mule-detect-coding-version (url-host url-current-object)
+                                                 (point-min) (point-max)))))
+        (mule-code-convert-region coding-system)
+        (if (w3-coding-system-with-invalid-chars coding-system)
+            (w3-replace-invalid-chars)))))
+
+(defun w3-coding-system-for-mime-charset (mmcharset)
+  (let ((coding-system nil)
+       (l w3-mime-charset-coding-alist))
+    (while l
+      (if (string-match (car (car l)) mmcharset)
+         (setq coding-system (if (coding-system-p (cdr (car l)))
+                                 (cdr (car l)))
+               l nil)
+       (setq l (cdr l))))
+    coding-system))
+
+(defun w3-coding-system-with-invalid-chars (coding-system)
+  (or (null coding-system)
+      (let* ((coding-system (if (listp coding-system) (car coding-system) 
coding-system))
+            (base (coding-system-base coding-system)))
+       (memq base '(raw-text iso-latin-1)))))
+
+(defun w3-replace-invalid-chars ()
+  (let ((invalid-char-alist w3-invalid-sgml-char-replacement))
+    (while invalid-char-alist
+      (goto-char (point-min))
+      (if (< (caar invalid-char-alist) 256)
+         (let ((str (char-to-string (caar invalid-char-alist)))
+               (repl (cdar invalid-char-alist)))
+           (while (search-forward str nil t)
+             (replace-match repl))))
+      (setq invalid-char-alist (cdr invalid-char-alist)))))
+
+(defun w3-sentinel (&optional proc string)
+  (let ((minibuffer-window (active-minibuffer-window)))
+    (unwind-protect
+       (progn
+         (if minibuffer-window
+             (other-window 1))
+         (set-buffer url-working-buffer)
+         (if (or (stringp proc)
+                 (bufferp proc)) (setq w3-current-last-buffer proc))
+         (remove-hook 'after-change-functions 'url-after-change-function)
+         (if url-be-asynchronous
+             (progn
+               (cond
+                ((not (get-buffer url-working-buffer)) nil)
+                ((url-mime-response-p) (url-parse-mime-headers)))
+               (if (not url-current-mime-type)
+                   (setq url-current-mime-type (or (mm-extension-to-mime
+                                                    (url-file-extension
+                                                     (url-filename
+                                                      url-current-object)))
+                                                   "text/html")))))
+         ;; hack for charset not indicated in MIME headers but in a META tag 
...
+         (if (not url-current-mime-charset)
+             (save-excursion
+               (goto-char (point-min))
+               (if (or (re-search-forward w3-meta-content-type-charset-regexp 
nil t)
+                       (re-search-forward w3-meta-charset-content-type-regexp 
nil t))
+                   (setq url-current-mime-type
+                         (buffer-substring-no-properties (match-beginning 1) 
(match-end 1))
+                         url-current-mime-charset
+                         (buffer-substring-no-properties (match-beginning 2) 
(match-end 2))))))
+         (if (not (string-match "^www:" (or (url-view-url t) "")))
+             (w3-convert-code-for-mule (and (stringp url-current-mime-type)
+                                            (downcase url-current-mime-type))
+                                       (and (stringp url-current-mime-charset)
+                                            (downcase 
url-current-mime-charset))
+                                       (and (stringp url-current-mime-encoding)
+                                            (downcase 
url-current-mime-encoding))))
+         (let ((x (w3-build-continuation))
+               (url (url-view-url t)))
+           (while x
+             (funcall (pop x)))))
+      (if minibuffer-window
+         (set-frame-selected-window (selected-frame) minibuffer-window)))))
+
+(defun w3-show-history-list ()
+  "Format the url-history-list prettily and show it to the user"
+  (interactive)
+  (w3-fetch "www://auto/history"))
+
+(defun w3-save-as (&optional type)
+  "Save a document to the local disk"
+  (interactive)
+  (save-excursion
+    (let* ((completion-ignore-case t)
+          (format (or type (completing-read
+                            "Format: "
+                            '(("HTML Source")
+                              ("Formatted Text")
+                              ("LaTeX Source")
+                              ("PostScript")
+                              ("Binary"))
+                            nil t)))
+          (fname (expand-file-name
+                  (read-file-name "File name: " default-directory)))
+          (url (url-view-url t)))
+      (cond
+       ((equal "Binary" format)
+       (if (not w3-current-source)
+           (let ((url-be-asynchronous nil))
+             (url-retrieve url))))
+       ((equal "HTML Source" format)
+       (if (not w3-current-source)
+           (let ((url-be-asynchronous nil))
+             (url-retrieve url))       ; Get the document if necessary
+         (let ((txt w3-current-source))
+           (set-buffer (get-buffer-create url-working-buffer))
+           (erase-buffer)
+           (insert txt)))
+       (goto-char (point-min))
+       (if (re-search-forward "<head>" nil t)
+           (insert "\n"))
+       (insert (format "<BASE HREF=\"%s\">\n" url)))
+       ((or (equal "Formatted Text" format)
+           (equal "" format))
+       nil)                            ; Do nothing - we have the text already
+       ((equal "PostScript" format)
+       (require 'ps-print)
+       (let ((ps-spool-buffer-name " *w3-temp*"))
+         (if (get-buffer ps-spool-buffer-name)
+             (kill-buffer ps-spool-buffer-name))
+         (ps-spool-buffer-with-faces)
+         (set-buffer ps-spool-buffer-name)))
+       ((equal "LaTeX Source" format)
+       (w3-parse-tree-to-latex w3-current-parse url)))
+      (mule-write-region-no-coding-system (point-min) (point-max) fname))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Functions to parse out <A> tags and replace it with a hyperlink zone
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-popup-image-info (url)
+  (interactive)
+  (let* ((glyph (cdr-safe (assoc url w3-graphics-list)))
+       image w h d info)
+    (save-excursion
+      (if (or (not glyph) (not (glyphp glyph)))
+        (error "No information available."))
+      (setq image (glyph-image-instance glyph))
+      (if (or (not image) (not (image-instance-p image)))
+        (error "No information available."))
+      (setq w (glyph-width glyph)
+          h (glyph-height glyph)
+          d (image-instance-depth image)
+          info (url-popup-info url)
+          )
+      (set-buffer (get-buffer-create "*Image Info*"))
+      (erase-buffer)
+      (insert
+       "Information for: " url "\n"
+       (make-string (1- (window-width)) ?-)
+       (format "\n%-20s: %s\n" "Type" (image-instance-type image))
+       (format "%-20s: %d x %d\n" "Dimensions" w h)
+       (format "%-20s: %d-bit\n" "Color" d))
+      (set-extent-begin-glyph (make-extent (point) (point)) glyph)
+      (insert
+       "\n"
+       (make-string (1- (window-width)) ?-)
+       (or info ""))
+      (display-buffer (current-buffer) t))))
+               
+(defun w3-popup-info (&optional url)
+  "Show information about the link under point. (All SGML attributes)"
+  (interactive (list (or (w3-view-this-url t)
+                        (w3-read-url-with-default))))
+  (let (dat widget)
+    (if (interactive-p)
+       nil
+      (setq widget (widget-at (point))
+           dat (and widget (widget-get widget 'attributes))))
+    (if url
+       (save-excursion
+         (set-buffer (get-buffer-create "*Header Info*"))
+         (erase-buffer)
+         (insert "URL: " url "\n" (make-string (1- (window-width)) ?-) "\n")
+         (if (and dat (listp dat))
+             (insert
+              "Link attributes:\n"
+              (make-string (1- (window-width)) ?-) "\n"
+              (mapconcat
+               (function
+                (lambda (info)
+                  (format "%20s :== %s" (car info) (or (cdr info) "On"))))
+               dat "\n")
+              "\n" (make-string (1- (window-width)) ?-) "\n"))
+         (insert (save-excursion (url-popup-info url)))
+         (goto-char (point-min))
+         (display-buffer (current-buffer) t))
+      (message "No URL to get information on!"))))
+
+(fset 'w3-document-information-this-url 'w3-popup-info)
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Functions for logging of bad HTML
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-reconstruct-tag (tagname desc)
+  (concat "<" tagname " "
+         (mapconcat
+          (function (lambda (x)
+                      (if (cdr x)
+                          (concat (car x) "=\"" (cdr x) "\"")
+                        (car x)))) desc " ") ">"))
+
+(defun w3-debug-if-found (regexp type desc)
+  (and w3-debug-html
+       (save-excursion
+        (if (re-search-forward regexp nil t)
+            (w3-log-bad-html type desc)))))
+
+(defun w3-log-bad-html (type desc)
+  ;; Log bad HTML to the buffer specified by w3-debug-buffer
+  (if w3-debug-html
+      (save-excursion
+       (set-buffer (get-buffer-create w3-debug-buffer))
+       (goto-char (point-max))
+       (insert (make-string (1- (window-width)) w3-horizontal-rule-char) "\n")
+       (cond
+        ((stringp type) (insert type "\n" desc "\n"))
+        ((eq type 'bad-quote)
+         (insert "Unterminated quoting character in SGML attribute value.\n"
+                 desc "\n"))
+        ((eq type 'no-quote)
+         (insert "Unquoted SGML attribute value.\n" desc "\n"))
+        ((eq type 'no-textarea-end)
+         (insert "Unterminated <textarea> tag.\n"
+                 (w3-reconstruct-tag "textarea" desc) "\n"))
+        ((eq type 'bad-link-tag)
+         (insert "Must specify either REL or REV with a <link> tag.\n"
+                 (w3-reconstruct-tag "link" desc) "\n"))
+        ((eq type 'no-a-end)
+         (insert "Unterminated <a> tag.\n"
+                 (w3-reconstruct-tag "a" desc) "\n"))
+        ((eq type 'no-form-end)
+         (insert "Unterminated <form> tag.\n"
+                 (w3-reconstruct-tag "form" desc) "\n"))
+        ((eq type 'bad-base-tag)
+         (insert "Malformed <base> tag.\n"
+                 (w3-reconstruct-tag "base" desc) "\n"))))))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Functions to handle formatting an html buffer
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-add-delayed-graphic (widget)
+  ;; Add a delayed image for the current buffer.
+  (setq w3-delayed-images (cons widget w3-delayed-images)))
+
+
+(defun w3-load-flavors ()
+  ;; Load the correct emacsen specific stuff
+  (cond
+   (w3-running-xemacs (require 'w3-xemac))
+   (t                                  ; Assume we are the FSF variant
+    (require (intern (format "w3-e%d" emacs-major-version)))))
+  (if (featurep 'emacspeak)
+      (condition-case ()
+         (progn
+           (require 'dtk-css-speech)
+           (require 'w3-speak))))
+  (condition-case ()
+      (require 'w3-site-init)
+    (error nil)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Automatic bug submission.                                               ;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-submit-bug ()
+  "Submit a bug on Emacs-w3"
+  (interactive)
+  (require 'reporter)
+  (and (yes-or-no-p "Do you really want to submit a bug on Emacs-w3? ")
+       (let ((url (url-view-url t))
+            (vars '(window-system
+                    window-system-version
+                    system-type
+                    ange-ftp-version
+                    url-gateway-method
+                    efs-version
+                    ange-ftp-version
+                    url-version
+                    url-be-asynchronous
+                    url)))
+        (if (and url (string= url "file:nil")) (setq url nil))
+        (mapcar
+         (function
+          (lambda (x)
+            (if (not (and (boundp x) (symbol-value x)))
+                (setq vars (delq x vars))))) vars)
+        (reporter-submit-bug-report w3-bug-address
+                                    (concat "WWW v" w3-version-number " of "
+                                            w3-version-date)
+                                    vars
+                                    nil nil
+                                    "Description of Problem:"))))
+
+(defalias 'w3-bug 'w3-submit-bug)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Support for searching                                                  ;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-nuke-spaces-in-search (x)
+  "Remove spaces from search strings . . ."
+  (let ((new ""))
+    (while (not (equal x ""))
+      (setq new (concat new (if (= (string-to-char x) 32) "+"
+                             (substring x 0 1)))
+           x (substring x 1 nil)))
+    new))
+
+(defun w3-search ()
+  "Perform a search, if this is a searchable index."
+  (interactive)
+  (let* (querystring                   ; The string to send to the server
+        (data
+         (cond
+          ((null w3-current-isindex)
+           (let ((rels (cdr-safe (assq 'rel w3-current-links)))
+                 val cur)
+             (while rels
+               (setq cur (car rels)
+                     rels (cdr rels))
+               (if (and (or (string-match "^isindex$" (car cur))
+                            (string-match "^index$" (car cur)))
+                        (plist-get (cadr cur) 'href))
+                   (setq val (plist-get (cadr cur) 'href)
+                         rels nil))
+               )
+             (if val
+                 (cons val "Search on (+ separates keywords): "))))
+          ((eq w3-current-isindex t)
+           (cons (url-view-url t) "Search on (+ separates keywords): "))
+          ((consp w3-current-isindex)
+           w3-current-isindex)
+          (t nil)))
+        index)
+    (if (null data) (error "Not a searchable index!"))
+    (setq index (car data))
+    (setq querystring (w3-nuke-spaces-in-search (read-string (cdr data))))
+    (if (string-match "\\(.*\\)\\?.*" index)
+       (setq index (url-match index 1)))
+    (w3-fetch
+     (concat index (if (= ?? (string-to-char (substring index -1 nil)))
+                      "" "?") querystring))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Auto documentation, etc                                                 ;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-help ()
+  "Print documentation on w3 mode."
+  (interactive)
+  (w3-fetch "about:"))
+
+;;;###autoload
+(defun w3-version (&optional here)
+  "Show the version number of W3 in the minibuffer.
+If optional argument HERE is non-nil, insert info at point."
+  (interactive "P")
+  (let ((version-string 
+         (format "WWW %s, URL %s, MM %s" 
+                 w3-version-number 
+                 url-version
+                 mm-version)))
+    (if here 
+        (insert version-string)
+      (if (interactive-p)
+          (message "%s" version-string)
+        version-string))))
+
+;;;###autoload
+(defun w3 ()
+  "Retrieve the default World Wide Web home page.
+The World Wide Web is a global hypertext system started by CERN in
+Switzerland in 1991.
+
+The home page is specified by the variable w3-default-homepage.  The
+document should be specified by its fully specified Uniform Resource
+Locator.  The document will be parsed as HTML (if appropriate) and
+displayed in a new buffer."
+  (interactive)
+  (if (not w3-setup-done) (w3-do-setup))
+  (if (and w3-track-last-buffer
+          (bufferp w3-last-buffer)
+          (buffer-name w3-last-buffer))
+      (progn
+       (switch-to-buffer w3-last-buffer)
+       (message "Reusing buffer.  To reload, type %s."
+                (substitute-command-keys "\\[w3-reload-document]")))
+    (cond
+     ((null w3-default-homepage) (call-interactively 'w3-fetch))
+     ((not (stringp w3-default-homepage))
+      (error "Invalid setting for w3-default-homepage: %S"
+            w3-default-homepage))
+     ((not (string-match ".*:.*" w3-default-homepage))
+      (w3-fetch (concat "file:" w3-default-homepage)))
+     (t
+      (w3-fetch w3-default-homepage)))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Leftover stuff that didn't quite fit into url.el
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun w3-generate-error (type data)
+  ;; Generate an HTML error buffer for error TYPE with data DATA.
+  (setq url-current-mime-type "text/html")
+  (cond
+   ((equal type "nofile")
+    (let ((error (save-excursion
+                 (set-buffer (get-buffer-create " *url-error*"))
+                 (buffer-string))))
+      (if (string= "" error)
+         (setq error
+               (format (concat "The file %s could not be found.  "
+                               "Either it does not exist, or it "
+                               "is unreadable.") data)))
+      (insert "<html>\n <head>\n"
+           "  <title>Error</title>\n"
+           " </head>\n <body>\n"
+           "  <h1>Error accessing " data "</h1>\n"
+           "  <hr>\n  <p>"
+           error
+           "\n  </p>\n")))
+   ((equal type "nobuf")
+    (insert "<title>Error</title>\n"
+           "<H1>No buffer " data " found</h1>\n"
+           "<HR>\n"
+           "The buffer " data " could not be found.  It has either\n"
+           "been killed or renamed.\n"))
+   ((equal type "nohist")
+    (insert "<TITLE>Error</TITLE>\n"
+           "<H1>No history items found.</H1>\n"
+           "<HR>\n"
+           "There is no history list available at this time.  Either\n"
+           "you have not visited any nodes, or the variable <i>\n"
+           "url-keep-history</i> is nil.\n"))
+   )
+  (insert "<hr>\n"
+         "If you feel this is a bug in Emacs-W3, <a href=\"mailto:";
+         w3-bug-address "\">send mail to " w3-bug-address
+         "</a>\n<hr>"))
+
+(defun w3-generate-auto-html (type)
+  ;; Generate one of several automatic html pages
+  (setq url-current-mime-type "text/html"
+       url-current-mime-headers '(("content-type" . "text/html")))
+  (cond
+   ((equal type "hotlist")
+    (let ((tmp (reverse w3-hotlist)))
+      (insert "<html>\n\t<head>\n\t\t"
+             "<title> Hotlist </title>\n\t</head>\n"
+             "\t<body>\n\t\t<div>\n\t\t\t<h1>Hotlist from " w3-hotlist-file
+             "</h1>\n\t\t\t<ol>\n")
+      (while tmp
+       (insert  "\t\t\t\t<li> <a href=\"" (car (cdr (car tmp)))
+                "\">" (url-insert-entities-in-string
+                       (car (car tmp))) "</a></li>\n")
+       (setq tmp (cdr tmp)))
+      (insert "\n\t\t\t</ol>\n\t\t</div>\n\t</body>\n</html>\n")))
+   ((equal type "history")
+    (if (not url-history-list)
+       (url-retrieve "www://error/nohist")
+      (insert "<html>\n\t<head>\n\t\t"
+             "<title> History List For This Session of W3</title>"
+             "\n\t</head>\n\t<body>\n\t\t<div>\n\t\t\t<h1>"
+             "History List For This Session of W3</h1>\n\t\t\t<ol>\n")
+      (cl-maphash
+       (function
+       (lambda (url desc)
+         (insert (format "\t\t\t\t<li> <a href=\"%s\">%s</a>\n"
+                         url (url-insert-entities-in-string desc)))))
+       url-history-list)
+      (insert "\n\t\t\t</ol>\n\t\t</div>\n\t</body>\n</html>\n")))))
+
+(defun w3-internal-handle-preview (buffer)
+  (setq buffer (get-buffer buffer))
+  (let ((base (get-text-property (point-min) 'w3-base buffer)))
+    (if base
+       (setq base (url-generic-parse-url base)))
+    (insert-buffer buffer)
+    (let ((inhibit-read-only t))
+      (set-text-properties (point-min) (point-max) nil))
+    (cond
+     (base
+      (setq url-current-object base))      
+     ((buffer-file-name buffer)
+      (let ((path (buffer-file-name buffer)))
+       (if (string-match "^//" path)
+           (setq path (concat "/%2f" (substring path 2))))
+       (setq url-current-object
+             (url-generic-parse-url (concat "file:" path)))))
+     (t
+      (setq url-current-object
+           (url-generic-parse-url "file:/")
+           url-current-mime-type "text/html")))))
+
+(defun w3-internal-url (url)
+  ;; Handle internal urls (previewed buffers, etc)
+  (if (not (string-match "www:/+\\([^/]+\\)/\\(.*\\)" url))
+      (w3-fetch "www://error/")
+    (let ((type (url-match url 1))
+         (data (url-match url 2)))
+      (set-buffer (get-buffer-create url-working-buffer))
+      (cond
+       ((equal type "preview")         ; Previewing a document
+       (if (get-buffer data)           ; Buffer still exists
+           (w3-internal-handle-preview data)
+         (url-retrieve (concat "www://error/nobuf/" data))))
+       ((equal type "error")           ; Error message
+       (if (string-match "\\([^/]+\\)/\\(.*\\)" data)
+           (w3-generate-error (url-match data 1) (url-match data 2))
+         (w3-generate-error data "")))
+       ((equal type "auto")            ; Hotlist or help stuff
+       (w3-generate-auto-html data))))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Stuff for good local file handling
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-ff (file)
+  "Find a file in any window already displaying it, otherwise just as
+display-buffer, and using this function"
+  (if (not (eq 'tty (device-type)))
+      (let ((f (window-frame (display-buffer (find-file-noselect file)))))
+       (set-mouse-position f 1 0)
+       (raise-frame f)
+       (unfocus-frame))
+    (display-buffer (find-file-noselect file))))
+
+(defun w3-default-local-file()
+  "Use find-file to open the local file"
+  (w3-ff (url-filename url-current-object)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Mode definition                                                        ;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(defun w3-search-forward (string)
+  (interactive "sSearch: ")
+  (setq w3-last-search-item string)
+  (if (and (not (search-forward string nil t))
+          (funcall url-confirmation-func
+                   "End of document reached; continue from beginning? "))
+      (progn
+       (goto-char (point-min))
+       (w3-search-forward string))))
+
+(defun w3-search-again ()
+  (interactive)
+  (if (and w3-last-search-item
+          (stringp w3-last-search-item))
+      (if (and (not (search-forward w3-last-search-item nil t))
+              (funcall url-confirmation-func
+                       "End of document reached; continue from beginning? "))
+         (progn
+           (goto-char (point-min))
+           (w3-search-again)))))
+
+(defun w3-find-specific-link (link)
+  (let ((pos (assq (intern link) w3-id-positions)))
+    (if pos
+       (progn
+         (goto-char (cdr pos))
+         (if (and (eolp) (not (eobp)))
+             (forward-char 1)))
+      (message "Link #%s not found." link))))
+
+(defun w3-force-reload-document ()
+  "Reload the current document.  Take it from the network, even if
+cached and in local mode."
+  (let ((url-standalone-mode nil))
+    (w3-reload-document)))
+
+(defun w3-reload-document (&optional explicit-coding-system)
+  "Reload the current document.
+With prefix argument, it reads a coding system to decode the document."
+  (interactive "ZCoding system: ")
+  (let ((tmp (url-view-url t))
+       (pnt (point))
+       (window-start (progn
+                       (move-to-window-line 0)
+                       (point)))
+       (url-request-extra-headers '(("Pragma" . "no-cache")))
+       (w3-explicit-coding-system explicit-coding-system))
+    (kill-buffer (current-buffer))
+    (w3-fetch tmp)
+    (goto-char pnt)
+    (set-window-start (selected-window) (min window-start (point-max)))))
+
+(defun w3-leave-buffer ()
+  "Bury this buffer, but don't kill it."
+  (interactive)
+  (let ((x w3-current-last-buffer))
+    (if w3-frame-name
+       (w3-leave-or-quit-frameset x nil)
+      (progn
+       (bury-buffer nil)
+       (if (and (bufferp x) (buffer-name x))
+           (w3-notify-when-ready x))))))
+
+(defun w3-quit (&optional mega)
+  "Quit WWW mode"
+  (interactive "P")
+  (if mega
+      (mapcar
+       (function
+       (lambda (x)
+         (save-excursion
+           (set-buffer (get-buffer x))
+           (if (eq major-mode 'w3-mode)
+               (w3-quit nil)))))
+       (buffer-list))
+    (let ((x w3-current-last-buffer))
+      (if w3-frame-name
+         (w3-leave-or-quit-frameset x t)
+       (progn
+         (kill-buffer (current-buffer))
+         (if (and (bufferp x) (buffer-name x))
+             (w3-notify-when-ready x)))))))
+
+(defun w3-leave-or-quit-frameset (x quit-p &optional top-down-p)
+  (set-buffer x)
+  (delete-other-windows)
+  (let ((structure (reverse w3-frameset-structure)))
+    (while structure
+      (let ((elt (car structure)))
+       (if (eq (car elt) 'frame)
+           (let* ((url (nth 2 elt))
+                  (buf (url-buffer-visiting url)))
+             (if buf
+                 (progn
+                   (set-buffer buf)
+                   (if w3-frameset-structure
+                       (w3-leave-or-quit-frameset buf quit-p t)
+                     (if quit-p
+                         (kill-buffer buf)
+                       (bury-buffer buf))))))))
+      (pop structure)))
+  (if top-down-p
+      (if quit-p
+         (kill-buffer x)
+       (bury-buffer x))
+    (progn
+      (set-buffer x)
+      (if quit-p
+         (w3-quit nil)
+       (w3-leave-buffer)))))
+
+(defun w3-view-this-url (&optional no-show)
+  "View the URL of the link under point"
+  (interactive)
+  (let* ((widget (widget-at (point)))
+        (parent (and widget (widget-get widget :parent)))
+        (href (or (and widget (widget-get widget :href))
+                  (and parent (widget-get parent :href)))))
+    (cond
+     ((and no-show href)
+      href)
+     (href
+      (message "%s" (url-truncate-url-for-viewing href)))
+     (no-show
+      nil)
+     (widget
+      (widget-echo-help (point)))
+     (t
+      nil))))
+
+(defun w3-load-delayed-images ()
+    "Load inlined images that were delayed, if any."
+  (interactive)
+  (let ((w3-delay-image-loads nil)
+       (todo w3-delayed-images))
+    (setq w3-delayed-images nil)
+    (while todo
+      (w3-maybe-start-image-download (car todo))
+      (setq todo (cdr todo)))))
+
+(defun w3-save-this-url ()
+  "Save url under point in the kill ring"
+  (interactive)
+  (w3-save-url t))
+
+(defun w3-save-url (under-pt)
+  "Save current url in the kill ring"
+  (interactive "P")
+  (let ((x (cond
+           ((stringp under-pt) under-pt)
+           (under-pt (w3-view-this-url t))
+           (t (url-view-url t)))))
+    (if x
+       (progn
+         (setq kill-ring (cons x kill-ring))
+         (setq kill-ring-yank-pointer kill-ring)
+         (message "Stored URL in kill-ring.")
+         (if (fboundp 'w3-store-in-clipboard)
+             (w3-store-in-clipboard x)))
+      (error "No URL to store."))))
+
+(fset 'w3-end-of-document 'end-of-buffer)
+(fset 'w3-start-of-document 'beginning-of-buffer)
+
+(defun w3-scroll-up (&optional lines)
+  "Scroll forward in View mode, or exit if end of text is visible.
+No arg means whole window full.  Arg is number of lines to scroll."
+  (interactive "P")
+  (if (and (pos-visible-in-window-p (point-max))
+          ;; Allow scrolling backward at the end of the buffer.
+          (or (null lines)
+              (> lines 0)))
+      nil
+    (let ((view-lines (1- (window-height))))
+      (setq lines
+           (if lines (prefix-numeric-value lines)
+             view-lines))
+      (if (>= lines view-lines)
+         (scroll-up nil)
+       (if (>= (- lines) view-lines)
+           (scroll-down nil)
+         (scroll-up lines)))
+      (cond ((pos-visible-in-window-p (point-max))
+            (goto-char (point-max))
+            (recenter -1)))
+      (move-to-window-line -1)
+      (beginning-of-line))))
+
+(defun w3-mail-document-author ()
+  "Send mail to the author of this document, if possible."
+  (interactive)
+  (let ((x w3-current-links)
+       (y nil)
+       (found nil))
+    (setq found (cdr-safe (assoc "reply-to" url-current-mime-headers)))
+    (if (and found (not (string-match url-nonrelative-link found)))
+       (setq found (list (concat "mailto:"; found))))
+    (while (and x (not found))
+      (setq y (car x)
+           x (cdr x)
+           found (cdr-safe (assoc "made" y))))
+    (if found
+       (let ((possible nil)
+             (href nil))
+         (setq x (car found))          ; Fallback if no mail(to|server) found
+         (while found
+           (setq href (plist-get (pop found) 'href))
+           (if (and href (string-match "^mail[^:]+:" href))
+               (setq possible (cons href possible))))
+         (case (length possible)
+           (0                          ; No mailto links found
+            (w3-fetch x))              ; fall back onto first 'made' link
+           (1                          ; Only one found, get it
+            (w3-fetch (car possible)))
+           (otherwise
+            (w3-fetch (completing-read "Choose an address: "
+                                       (mapcar 'list possible)
+                                       nil t (car possible))))))
+      (message "Could not automatically determine authors address, sorry."))))
+
+(defun w3-kill-emacs-func ()
+  "Routine called when exiting emacs.  Do miscellaneous clean up."
+  (and (eq url-keep-history t)
+       url-global-history-hash-table
+       (url-write-global-history))
+  (message "Cleaning up w3 storage...")
+  (let ((x (nconc
+           (and (file-exists-p w3-temporary-directory)
+                (directory-files w3-temporary-directory t "url-tmp.*"))
+           (and (file-exists-p url-temporary-directory)
+                (directory-files url-temporary-directory t
+                                 (concat "url"
+                                         (int-to-string
+                                          (user-real-uid)) ".*")))
+           (and (file-exists-p url-temporary-directory)
+                (directory-files url-temporary-directory t "url-tmp.*")))))
+    (while x
+      (condition-case ()
+         (delete-file (car x))
+       (error nil))
+      (setq x (cdr x))))
+  (message "Cleaning up w3 storage... done."))
+
+(cond
+ ((fboundp 'display-warning)
+  (fset 'w3-warn 'display-warning))
+ ((fboundp 'warn)
+  (defun w3-warn (class message &optional level)
+    (if (and (eq class 'html)
+            (not w3-debug-html))
+       nil
+      (warn "(%s/%s) %s" class (or level 'warning) message))))
+ (t
+  (defun w3-warn (class message &optional level)
+    (if (and (eq class 'html)
+            (not w3-debug-html))
+       nil
+      (save-excursion
+       (set-buffer (get-buffer-create "*W3-WARNINGS*"))
+       (goto-char (point-max))
+       (save-excursion
+         (insert (format "(%s/%s) %s\n" class (or level 'warning) message)))
+       (display-buffer (current-buffer)))))))
+
+(defun w3-internal-expander (urlobj defobj)
+  ;; URL Expansion routine for internally handled routines
+  (url-identity-expander urlobj defobj))
+
+(defun w3-map-links (function &optional buffer from to maparg)
+  "Map FUNCTION over the hypertext links which overlap region in BUFFER,
+starting at FROM and ending at TO.  FUNCTION is called with the arguments
+WIDGET and MAPARG.
+The arguments FROM, TO, MAPARG, and BUFFER default to the beginning of
+BUFFER, the end of BUFFER, nil, and (current-buffer), respectively."
+  (let ((parent)
+       (highly-unlikely-name-for-a-variable-holding-a-function function))
+    (widget-map-buttons
+     (function
+      (lambda (widget arg)
+       (setq parent (and widget (widget-get widget :parent)))
+       ;; Check to see if its got a URL tacked on it somewhere
+       (cond
+        ((and widget (widget-get widget :href))
+         (funcall highly-unlikely-name-for-a-variable-holding-a-function
+                  widget maparg))
+        ((and parent (widget-get parent :href))
+         (funcall highly-unlikely-name-for-a-variable-holding-a-function
+                  widget maparg))
+        (t nil))
+       nil)))))
+
+(defun w3-emit-image-warnings-if-necessary ()
+  (if (and (not w3-delay-image-loads)
+          (fboundp 'w3-insert-graphic)
+          (or (not (featurep 'gif))
+              (not (featurep 'jpeg)))
+          (not (w3-executable-exists-in-path "ppmtoxpm"))
+          (not (or
+                (w3-executable-exists-in-path "pbmtoxbm")
+                (w3-executable-exists-in-path "ppmtoxbm"))))
+      (w3-warn
+       'image
+       (concat
+       "Could not find some vital ppm utilities in exec-path.\n"
+       "This probably means that you will be unable to view any\n"
+       "inlined images other than: "
+       (mapconcat
+        (function
+         (lambda (x)
+           (if (featurep x) (concat (symbol-name x) ",\n"))))
+        '(png jpg gif xpm xbm) "")
+       "\n\n"
+       "If you do not have the PPM utilities from either the PBMPLUS\n"
+       "or NETPBM distributions installed on your machine, then\n"
+       "please set the variable `w3-delay-image-loads' to t with a\n"
+       "line like:\n\n"
+       "\t(setq w3-delay-image-loads t)\n\n"
+       "in your ~/.emacs file.\n\n"
+       "You can find the NETPBM utilities in:\n"
+       "\tftp://ftp.cs.indiana.edu/pub/elisp/w3/images/\n";
+       ))))
+
+(defun w3-refresh-stylesheets ()
+  "Reload all stylesheets."
+  (interactive)
+  (setq w3-user-stylesheet nil
+       w3-face-cache nil)
+  (w3-find-default-stylesheets)
+  )
+
+(defvar w3-loaded-stylesheets nil
+  "A list of all the stylesheets Emacs-W3 loaded at startup.")
+
+(defun w3-find-default-stylesheets ()
+  (setq w3-loaded-stylesheets nil)
+  (let* ((lightp (css-color-light-p 'default))
+        (longname (if lightp "stylesheet-light" "stylesheet-dark"))
+        (shortname (if lightp "light.css" "dark.css"))
+        (w3-lisp (file-name-directory (locate-library "w3")))
+        (w3-root (expand-file-name "../.." w3-lisp))
+        (no-user-init (= 0 (length user-init-file)))
+        (w3-configuration-directory (if no-user-init
+                                        
"/this/is/a/highly/unlikely/directory/name"
+                                      w3-configuration-directory))
+        (directories (list
+                      (if (fboundp 'locate-data-directory)
+                          (locate-data-directory "w3"))
+                      data-directory
+                      (concat data-directory "w3/")
+                      (expand-file-name "../../w3" data-directory)
+                      w3-lisp
+                      w3-root
+                      (w3-configuration-data 'datadir)
+                      (expand-file-name "w3" w3-root)
+                      (expand-file-name "etc" w3-root)
+                      (expand-file-name "etc/w3" w3-root)
+                      (expand-file-name "../" w3-lisp)
+                      (expand-file-name "../w3" w3-lisp)
+                      (expand-file-name "../etc" w3-lisp)
+                      w3-configuration-directory))
+        (total-found 0)
+        (possible (append
+                   (apply
+                    'append
+                    (mapcar
+                     (function
+                      (lambda (dir)
+                        (list
+                         (expand-file-name shortname dir)
+                         (expand-file-name longname dir)
+                         (expand-file-name "stylesheet" dir)
+                         (expand-file-name "default.css" dir))))
+                     directories))
+                   (and (not no-user-init)
+                        (list w3-default-stylesheet))))
+        (remember possible)
+        (old-asynch (default-value 'url-be-asynchronous))
+        (found nil)
+        (cur nil)
+        (url nil))
+    (unwind-protect
+       (progn
+         (setq-default url-be-asynchronous nil)
+         (while possible
+           (setq cur (car possible)
+                 possible (cdr possible)
+                 found (and cur (file-exists-p cur) (file-readable-p cur)
+                            (not (file-directory-p cur)) cur))
+           (if found
+               (setq total-found (1+ total-found)
+                     w3-loaded-stylesheets (cons cur w3-loaded-stylesheets)
+                     w3-user-stylesheet (css-parse (concat "file:" cur) nil
+                                                   w3-user-stylesheet)))))
+      (setq-default url-be-asynchronous old-asynch))
+    (if (= 0 total-found)
+       (progn
+         (w3-warn
+          'style
+          (concat
+           "No stylesheets found!  Check configuration! DANGER DANGER!\n"
+           "Emacs-W3 checked for its stylesheet in the following places\n"
+           "and did not find one.  This means that some formatting will\n"
+           "be wrong, and most colors and fonts will not be set up 
correctly.\n"
+           "------\n"
+           (mapconcat 'identity remember "\n")
+           "------"))
+         (error "No stylesheets found!  Check configuration! DANGER 
DANGER!")))))
+
+(defvar w3-widget-global-map nil)
+
+;;;###autoload
+(defun w3-do-setup ()
+  "Do setup - this is to avoid conflict with user settings when W3 is
+dumped with emacs."
+  (url-do-setup)
+  (url-register-protocol 'about 'w3-about 'url-identity-expander)
+  (url-register-protocol 'www 'w3-internal-url 'w3-internal-expander)
+  (w3-load-flavors)
+  (w3-setup-version-specifics)
+  (setq w3-default-configuration-file (expand-file-name 
+                                      (or w3-default-configuration-file
+                                          "profile")
+                                      w3-configuration-directory))
+  (if (and init-file-user
+          w3-default-configuration-file
+          (file-exists-p w3-default-configuration-file))
+      (condition-case e
+         (load w3-default-configuration-file nil t)
+       (error
+        (let ((buf-name " *Configuration Error*"))
+          (if (get-buffer buf-name)
+              (kill-buffer (get-buffer buf-name)))
+          (display-error e (get-buffer-create buf-name))
+          (save-excursion
+            (switch-to-buffer-other-window buf-name)
+            (shrink-window-if-larger-than-buffer))
+          (w3-warn 'configuration
+                   (format (eval-when-compile
+                             (concat
+                              "Configuration file `%s' contains an error.\n"
+                              "Please consult the `%s' buffer for details."))
+                           w3-default-configuration-file buf-name))))))
+              
+  (if (and (eq w3-user-colors-take-precedence 'guess)
+          (not (eq (device-type) 'tty))
+          (not (eq (device-class) 'mono)))
+      (progn
+       (setq w3-user-colors-take-precedence t)
+       (w3-warn
+        'html
+        "Disabled document color specification because of mono display.")))
+
+  (w3-refresh-stylesheets)
+  (setq w3-setup-done t)
+  (if (not url-global-history-file)
+      (setq url-global-history-file
+           (expand-file-name "history"
+                             w3-configuration-directory)))
+
+  (add-minor-mode 'w3-netscape-emulation-minor-mode " NS"
+                 w3-netscape-emulation-minor-mode-map)
+  (add-minor-mode 'w3-lynx-emulation-minor-mode " Lynx"
+                 w3-lynx-emulation-minor-mode-map)
+  
+  (setq url-package-version w3-version-number
+       url-package-name "Emacs-W3")
+
+  (w3-setup-terminal-chars)
+
+  (w3-emit-image-warnings-if-necessary)
+                  
+  (cond
+   ((memq system-type '(ms-dos ms-windows))
+    (setq w3-hotlist-file (or w3-hotlist-file
+                             (expand-file-name "~/mosaic.hot"))
+         ))
+   ((memq system-type '(axp-vms vax-vms))
+    (setq w3-hotlist-file (or w3-hotlist-file
+                             (expand-file-name "~/mosaic.hotlist-default"))
+         ))
+   (t 
+    (setq w3-hotlist-file (or w3-hotlist-file
+                             (expand-file-name "~/.mosaic-hotlist-default"))
+         )))
+  
+  ; Set up a hook that will save the history list when
+  ; exiting emacs
+  (add-hook 'kill-emacs-hook 'w3-kill-emacs-func)
+
+  (mm-parse-mailcaps)
+  (mm-parse-mimetypes)
+
+  ; Load in the hotlist if they haven't set it already
+  (or w3-hotlist (w3-parse-hotlist))
+
+  ; Set the default home page, honoring their defaults, then
+  ; the standard WWW_HOME, then default to the documentation @ IU
+  (or w3-default-homepage
+      (setq w3-default-homepage
+           (or (getenv "WWW_HOME")
+               "http://www.cs.indiana.edu/elisp/w3/docs.html";)))
+
+  (run-hooks 'w3-load-hook))
+
+(defun w3-mark-link-as-followed (ext dat)
+  ;; Mark a link as followed
+  (message "Reimplement w3-mark-link-as-followed"))
+
+(defun w3-only-links ()
+  (let* (result temp)
+    (w3-map-links (function
+                  (lambda (x y)
+                    (setq result (cons x result)))))
+    result))
+
+(defun w3-download-callback (fname buff)
+  (if (and (get-buffer buff) (buffer-name buff))
+      (save-excursion
+       (set-buffer buff)
+       (mule-write-region-no-coding-system (point-min) (point-max) fname)
+       (message "Download of %s complete." (url-view-url t))
+       (sit-for 3)
+       (kill-buffer buff))))
+
+(defun w3-download-url-at-point ()
+  "Download the URL under point."
+  (interactive)
+  (w3-download-url-wrapper t))
+
+(defun w3-download-this-url ()
+  "Download the current URL."
+  (interactive)
+  (w3-download-url-wrapper nil))
+  
+(defun w3-download-url-wrapper (under-pt)
+  "Download current URL."
+  (let ((x (if under-pt (w3-view-this-url t) (url-view-url t))))
+    (if x
+       (w3-download-url x)
+      (error "No link found."))))
+            
+(defun w3-download-url (url &optional file-name)
+  (interactive (list (w3-read-url-with-default)))
+  (let* ((old-asynch (default-value 'url-be-asynchronous))
+        (url-inhibit-uncompression t)
+        (url-mime-accept-string "*/*")
+        (urlobj (url-generic-parse-url url))
+        (url-working-buffer
+         (generate-new-buffer (concat " *" url " download*")))
+        (stub-fname (url-basepath (or (url-filename urlobj) "") t))
+        (dir (or mm-download-directory "~/"))
+        (fname (or file-name
+                   (expand-file-name
+                    (read-file-name "Filename to save as: "
+                                    dir
+                                    stub-fname
+                                    nil
+                                    stub-fname) dir))))
+    (unwind-protect
+       (progn
+         (or file-name
+             (setq-default url-be-asynchronous t))
+         (save-excursion
+           (set-buffer url-working-buffer)
+           (or file-name
+               (setq url-current-callback-data (list fname (current-buffer))
+                     url-be-asynchronous t
+                     url-current-callback-func 'w3-download-callback))
+           (url-retrieve url)
+           (and file-name
+                (w3-download-callback fname (current-buffer)))))
+      (or file-name
+         (setq-default url-be-asynchronous old-asynch)))))
+
+;;;###autoload
+(defun w3-follow-link-other-frame (&optional p)
+  "Attempt to follow the hypertext reference under point in a new frame.
+With prefix-arg P, ignore viewers and dump the link straight
+to disk."
+  (cond
+   ((and (fboundp 'make-frame)
+        (fboundp 'select-frame))
+    (let ((frm (make-frame)))
+      (select-frame frm)
+      (w3-follow-link p)))
+   (t (w3-follow-link p))))
+
+;;;###autoload
+(defun w3-follow-link (&optional p)
+  "Attempt to follow the hypertext reference under point.
+With prefix-arg P, ignore viewers and dump the link straight
+to disk."
+  (interactive "P")
+  (let* ((widget (widget-at (point)))
+        (href (and widget (widget-get widget :href))))
+    (cond
+     ((null href) nil)
+     ((or p w3-dump-to-disk)
+      (w3-download-url href))
+     (t
+      (w3-fetch href)))))
+
+;;;###autoload
+(defun w3-next-document ()
+  (interactive)
+  (let ((link (or (let ((rel (assq 'rel w3-current-links)))
+                    (and rel (assoc "next" rel)))
+                  (let ((rev (assq 'rev w3-current-links)))
+                    (and rev (or (assoc "previous" rev)
+                                 (assoc "prev" rev))))))
+        href)
+    (and link (setq link (cdr link)))
+    (while (and link (null href))
+      (setq href (plist-get (car link) 'href))
+      (setq link (cdr link)))
+    (if href
+        (w3-fetch href)
+      (error "No NEXT document"))))
+
+;;;###autoload
+(defun w3-prev-document ()
+  (interactive)
+  (let ((link (or (let ((rel (assq 'rel w3-current-links)))
+                    (and rel (or (assoc "previous" rel)
+                                 (assoc "prev" rel))))
+                  (let ((rev (assq 'rev w3-current-links)))
+                    (and rev (assoc "next" rev)))))
+        href)
+    (and link (setq link (cdr link)))
+    (while (and link (null href))
+      (setq href (plist-get (car link) 'href))
+      (setq link (cdr link)))
+    (if href
+        (w3-fetch href)
+      (error "No PREVIOUS document"))))
+
+(defun w3-widget-forward (arg)
+  "Move point to the next field or button.
+With optional ARG, move across that many fields."
+  (interactive "p")
+  (widget-forward arg))
+
+(defun w3-widget-backward (arg)
+  "Move point to the previous field or button.
+With optional ARG, move across that many fields."
+  (interactive "p")
+  (w3-widget-forward (- arg)))
+
+(defun w3-complete-link ()
+  "Choose a link from the current buffer and follow it"
+  (interactive)
+  (let (links-alist
+       link-at-point
+       choice
+       (completion-ignore-case t))
+    (setq link-at-point (widget-at (point))
+         link-at-point (and
+                        link-at-point
+                        (widget-get link-at-point :href)
+                        (widget-get link-at-point :from)
+                        (widget-get link-at-point :to)
+                        (w3-fix-spaces
+                         (buffer-substring-no-properties
+                          (widget-get link-at-point :from)
+                          (widget-get link-at-point :to)))))
+    (w3-map-links (function
+                  (lambda (widget arg)
+                    (if (and (widget-get widget :from)
+                             (widget-get widget :to))
+                        (setq links-alist (cons
+                                           (cons
+                                            (w3-fix-spaces
+                                             (buffer-substring-no-properties
+                                              (widget-get widget :from)
+                                              (widget-get widget :to)))
+                                            (widget-get widget :href))
+                                           links-alist))))))
+    (if (not links-alist) (error "No links in current document."))
+    (setq links-alist (sort links-alist (function
+                                        (lambda (x y)
+                                          (string< (car x) (car y))))))
+    ;; Destructively remove duplicate entries from links-alist.
+    (let ((remaining-links links-alist))
+      (while remaining-links
+       (if (equal (car remaining-links) (car (cdr remaining-links)))
+           (setcdr remaining-links (cdr (cdr remaining-links)))
+         (setq remaining-links (cdr remaining-links)))))
+    (setq choice (completing-read
+                 (if link-at-point
+                     (concat "Link (default "
+                             (if (< (length link-at-point) 20)
+                                 link-at-point
+                               (concat
+                                (substring link-at-point 0 17) "..."))
+                             "): ")
+                   "Link: ") links-alist nil t))
+    (if (and (string= choice "") link-at-point)
+       (setq choice link-at-point))
+    (let ((match (try-completion choice links-alist)))
+      (cond
+       ((eq t match)                   ; We have an exact match
+       (setq choice (cdr (assoc choice links-alist))))
+       ((stringp match)
+       (setq choice (cdr (assoc match links-alist))))
+       (t (setq choice nil)))
+      (if choice
+         (w3-fetch choice)))))
+
+(defun w3-display-errors ()
+  "Display any HTML errors for the current page."
+  (interactive)
+  (let ((w3-notify 'friendly)
+       (inhibit-read-only t)
+       (buffer nil)
+       (todo w3-current-badhtml)
+       (url (url-view-url t)))
+    (if (not todo)
+       (error "No HTML errors on this page!  Amazing, isn't it?"))
+    (save-excursion
+      (set-buffer
+       (get-buffer-create (concat "HTML Errors for: " (or url "???"))))
+      (setq buffer (current-buffer))
+      (erase-buffer)
+      (while todo
+       (goto-char (point-min))
+       (insert "\n" (car todo))
+       (setq todo (cdr todo)))
+      (if url
+         (progn
+           (goto-char (point-min))
+           (insert (format "HTML Errors for: <URL:%s>\n" url))))
+      (set (make-local-variable 'font-lock-keywords) 
w3-html-errors-font-lock-keywords)
+      (set (make-local-variable 'font-lock-keywords-only) nil)
+      (set (make-local-variable 'font-lock-keywords-case-fold-search) nil)
+      (set (make-local-variable 'font-lock-syntax-table) nil)
+      (set (make-local-variable 'font-lock-beginning-of-syntax-function) 
'beginning-of-line)
+      (run-hooks 'w3-display-errors-hook))
+    (w3-notify-when-ready buffer)))
+
+(defun w3-mode ()
+  "Mode for viewing HTML documents.  If called interactively, will
+display the current buffer as HTML.
+
+Current keymap is:
+\\{w3-mode-map}"
+  (interactive)
+  (or w3-setup-done (w3-do-setup))
+  (if (interactive-p)
+      (w3-preview-this-buffer)
+    (let ((tmp (mapcar (function (lambda (x) (cons x (and (boundp x) 
(symbol-value x)))))
+                      w3-persistent-variables)))
+      ;; Oh gross, this kills buffer-local faces in XEmacs
+      ;;(kill-all-local-variables)
+      (use-local-map w3-mode-map)
+      (setq mode-name "WWW")
+      (mapcar (function (lambda (x) (if (boundp (car x))
+                                       (set-variable (car x) (cdr x))))) tmp)
+      (setq major-mode 'w3-mode)
+      (w3-mode-version-specifics)
+      (w3-menu-install-menus)
+      (setq url-current-passwd-count 0
+           truncate-lines t
+           mode-line-format w3-modeline-format)
+      (run-hooks 'w3-mode-hook)
+      (widget-setup))))
+
+(require 'mm)
+(require 'url)
+(require 'w3-parse)
+(require 'w3-display)
+(require 'w3-auto)
+(require 'w3-emulate)
+(require 'w3-menu)
+(require 'w3-mouse)
+(provide 'w3)
diff --git a/lisp/xml.el b/lisp/xml.el
new file mode 100644
index 0000000..98aad10
--- /dev/null
+++ b/lisp/xml.el
@@ -0,0 +1,66 @@
+;;; xml.el --- XML parser
+;; Author: $Author: wmperry $
+;; Created: $Date: 1998/12/01 22:12:12 $
+;; Version: $Revision: 1.1 $
+;; Keywords: 
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Copyright (c) 1997 - 1998 Free Software Foundation, Inc.
+;;;
+;;; This file is not part of GNU Emacs, but the same permissions apply.
+;;;
+;;; GNU Emacs is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2, or (at your option)
+;;; any later version.
+;;;
+;;; GNU Emacs is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;;; Boston, MA 02111-1307, USA.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(require 'cl)
+(require 'custom)
+
+(defgroup xml nil
+  "XML parsing options"
+  :group 'w3)
+
+(defcustom xml-parsing-program "xmlelisp"
+  "External program to parse XML documents."
+  :group 'xml
+  :type 'file)
+
+(defun xml-parse (&optional buffer)
+  "Parse contents of BUFFER as XML.
+BUFFER defaults to the current buffer.
+Destructively alters contents of BUFFER.
+Returns a data structure containing the parsed information."
+  (save-excursion
+    (let ((parse-buffer (generate-new-buffer " *xml*"))
+         (proc nil)
+         (marker (make-marker))
+         (done nil))
+      (if buffer (set-buffer buffer))
+      (unwind-protect
+         (progn
+           (setq proc (start-process "xml" parse-buffer xml-parsing-program 
"-"))
+           (if (not (eq (process-status proc) 'run))
+               (error "Could not start parsing process"))
+           (set-process-sentinel proc (lambda (proc string) (setq done t)))
+           (accept-process-output proc 0.5)
+           (process-send-string proc (buffer-substring (point-min) 
(point-max)))
+           (process-send-eof proc)
+           (while (not done)
+             (accept-process-output proc 1))
+           (set-buffer parse-buffer)
+           (goto-char (point-min))
+           (read parse-buffer))
+       (kill-buffer parse-buffer)))))
+       
diff --git a/texi/Makefile.in b/texi/Makefile.in
new file mode 100644
index 0000000..61a4bd5
--- /dev/null
+++ b/texi/Makefile.in
@@ -0,0 +1,73 @@
+srcdir  = @srcdir@
+prefix  = @prefix@
+infodir = @infodir@
+top_srcdir = @top_srcdir@
+
+VPATH     = $(srcdir)
+EMACS     = @EMACS@
+INSTALL   = @INSTALL@
+RM        = rm -f
+MAKEINFO  = @MAKEINFO@
+TEXI2HTML = @TEXI2HTML@
+TEXI2HTML_FLAGS = @TEXI2HTML_FLAGS@
+INSTALLINFO = @INSTALLINFO@
+DVIPS     = dvips
+
+.SUFFIXES: .txi .dvi .info .html
+
+%.txi: %.txi,v
+       co -q $@
+
+%.html: %.txi
+       $(TEXI2HTML) $(TEXI2HTML_FLAGS) $<
+
+%.dvi: %.txi
+       $(TEXI2DVI) $(TEXI2DVI_FLAGS) $<
+       $(RM)   $(*).cp  $(*).fn  $(*).ky  $(*).pg  $(*).tp  $(*).vr    \
+               $(*).cps $(*).fns $(*).kys $(*).pgs $(*).tps $(*).vrs   \
+               $(*).log $(*).toc $(*).aux
+
+%.ps: %.dvi
+       $(DVIPS) -o $@ $<
+
+%.info: %.txi
+#      $(EMACS) -batch -q -no-site-file -eval '(find-file "$<")' -l texinfmt 
-f texinfo-every-node-update -f save-buffer
+       $(MAKEINFO) $<
+
+MANUALS=w3.txi w3-faq.txi
+
+all: info dvi
+
+install:
+       ( if [ ! -d $(infodir) ]; then mkdir -p $(infodir); fi )
+       for x in *.info*; do $(INSTALL) $$x $(infodir); done
+       -for x in *.info; do $(INSTALLINFO) $$x $(infodir)/dir; done
+
+distclean: clean
+       $(RM) Makefile
+
+clean:
+       $(RM) *.dvi *.info* *.html *.ps
+
+dvi: $(MANUALS:.txi=.dvi)
+
+info: $(MANUALS:.txi=.info)
+
+html: $(MANUALS:.txi=.html)
+
+ps: $(MANUALS:.txi=.ps)
+
+version: $(MANUALS) descrip.mms clean
+       test -d $(DIRNAME)/texi || mkdir -p $(DIRNAME)/texi
+       $(MAKE) info
+       for x in descrip.mms $(MANUALS) *info* Makefile.in; do $(INSTALL) -m 
644 $$x $(DIRNAME)/texi; done
+
+# Automatic makefile rebuilding, etc.
+Makefile: $(srcdir)/Makefile.in ../config.status
+       (cd .. ; CONFIG_FILES=texi/Makefile ./config.status)
+
+$(top_srcdir)/configure: $(top_srcdir)/configure.in $(top_srcdir)/aclocal.m4
+       cd $(top_srcdir) && autoreconf
+
+../config.status: $(top_srcdir)/configure
+       cd .. && ./config.status --recheck
diff --git a/texi/descrip.mms b/texi/descrip.mms
new file mode 100644
index 0000000..9fdbe44
--- /dev/null
+++ b/texi/descrip.mms
@@ -0,0 +1,47 @@
+# where the w3 lisp files should go
+prefix  = gnu_root
+datadir = $(prefix):[lib]
+infodir = $(prefix):[info]
+
+ECHO       = write sys$output
+MAKEINFO   = makeinfo
+TEXI2HTML  = texi2html
+TEXI2HTML_FLAGS = 
+RM         = delete
+MKDIR      = create/dir
+
+############## no user servicable parts beyond this point ###################
+.SUFFIXES: .txi .dvi .info .html
+
+%.html: %.txi
+       $(TEXI2HTML) $(TEXI2HTML_FLAGS) $(MMS$SOURCE)
+
+%.dvi: %.txi
+        tex $(MMS$SOURCE)
+       texindex *.cp *.fn *.ky *.pg *.tp *.vr
+       tex $(MMS$SOURCE)
+       $(RM)   *.cp  *.fn  *.ky  *.pg  *.tp  *.vr      \
+               *.cps *.fns *.kys *.pgs *.tps *.vrs     \
+               *.log *.toc *.aux
+
+%.info: %.txi
+       $(MAKEINFO) $(MMS$SOURCE)
+
+all: info
+
+install:
+       if f$parse("$(infodir)") .eqs. "" then $(MKDIR) $(infodir)
+       copy/log *.info* $(infodir)
+       - purge/log $(infodir)
+
+distclean: clean
+       $(RM) Makefile
+
+clean:
+       $(RM) *.dvi *.info* *.html
+
+html: $(MANUALS:.txi=_toc.html)
+
+dvi: $(MANUALS:.txi=.dvi)
+
+info: $(MANUALS:.txi=.info)
diff --git a/texi/w3-faq.txi b/texi/w3-faq.txi
new file mode 100644
index 0000000..5721962
--- /dev/null
+++ b/texi/w3-faq.txi
@@ -0,0 +1,377 @@
+\input texinfo
address@hidden -*-texinfo-*-
address@hidden Copyright (C) 1997 Free Software Foundation, Inc.
address@hidden w3-faq.info
address@hidden FAQs
address@hidden GNU Emacs Lisp
address@hidden
+* Emacs/W3 FAQ: (w3-faq).          FAQ for Emacs/W3 World Wide Web browser.
address@hidden direntry
+
address@hidden Top, Installation FAQ, (dir), (dir)
address@hidden Frequently Asked Questions
+
+This is the Emacs/W3 Frequently Asked Questions list.
+
address@hidden
+* Installation FAQ::      Installation of Emacs/W3.
+* Runtime FAQ::           Running Emacs/W3.
+* Arcana::                Obscure, but cool.
+* Customization FAQ::     Customizing Emacs/W3.
address@hidden menu
+
address@hidden Installation FAQ, Runtime FAQ, Top, Top
address@hidden Installation
+
address@hidden @bullet
address@hidden
+Q1.1  What is the latest version of Emacs/W3?
+
+The latest version is $State: Exp $.
+
address@hidden
+Q1.2  Where do I get Emacs/W3?
+
+Any of the following locations:
+
address@hidden @minus
address@hidden
address@hidden://www.cs.indiana.edu/elisp/w3/download.html}
address@hidden
address@hidden://ftp.cs.indiana.edu/pub/elisp/w3/}
address@hidden itemize
+
address@hidden
+Q1.3  Which version of Emacs do I need?
+
+At least GNU Emacs 19.34, or XEmacs 19.14 is recommended.  GNU Emacs
+19.28 has been known to work, but highlighting will not work due to
+differences in how faces are handled in newer Emacs versions.
+
address@hidden
+Q1.4  I get './configure: sh internal 2K buffer overflow' when configuring.
+
+On some systems (notably HP-UX 9.x), the standard /bin/sh is not quite
+up to snuff.  You should use bash to run configure if you possibly can,
+ie: bash ./configure [standard-arguments]
+
+If anyone has ideas about how I could fix my autoconf sources, please
+contact @url{mailto:wmperry@@aventail.com}.
+
address@hidden
+Q1.5  How can I build Emacs/W3 under Windows 95 or Windows NT?
+
address@hidden
+Q1.6  How can I build Emacs/W3 under VMS?
+
address@hidden
+Q1.7  I still want to use Emacs 19, are there any special problems?
+
+Since Emacs 19.x does not include a suitably `new' version of the custom
+and widget libraries, you will need to install them yourself.  Please
+see @url{http://www.dina.kvl.dk/~abraham/custom/} for more information
+on installing.  After this, you will need to re-run your configure
+script, including the --with-custom=/path/to/custom/library/directory.
+
address@hidden itemize
+
address@hidden Runtime FAQ, Arcana, Installation FAQ, Top
address@hidden Runtime
+
address@hidden @bullet
address@hidden
+Q2.1  The options menu is ugly under Emacs 19
+
+In Emacs 19, Emacs/W3 uses the 'easymenu' package to define menus.
+Unfortunately, this package does not show the current state of a boolean
+menu entry, it just shows as 'Toggle xxxx'.
+
+This feature-lack will be fixed in Emacs 19.35 or Emacs 20.1 when they
+are released.
+
address@hidden
+Q2.2  Animated GIFs cause XEmacs 19.14 or 20.0 to crash.
+
+There was a bug in the GIF decoding routines in XEmacs 19.14 and 20.0 -
+please update to XEmacs 19.15 or 20.1 respectively.
+
address@hidden
+Q2.3  I get an error when starting up about custom-declare-group
+
+This usually means you compiled Emacs/W3 in an emacs that could not find
+the 'custom' package (or found an old version), but you are running it
+in an emacs that finds the new one.  This is usually the case if you
+have a recent version of GNUS installed in a non-standard place.
+
+Make sure that you can load the custom library when compiling emacs.
+Set the environment variable WIDGETDIR to where your custom library
+lives (ie: ~/lisp/gnus/lisp), or rerun configure with the
+'--with-custom=/full/path/to/custom/lisp/' command line argument and
+then remake with a 'make clean all'.
+
address@hidden
+Q2.4  It is incredibly slow under OS/2
+
+This appears to be a problem with how fonts are looked up.  Thanks to
+chang@@wsu.edu for this analysis.
+
+In OS/2, the font name default to forms like
+
address@hidden
+"-*-Courier-medium-r-normal--*-100-*-*-m-*-cp850" ......
+or
+"10.Courier"
address@hidden example
+
+In these two cases, font detection fails because this does not match
+x-font-regexp.
+
+To solve this, set the default font as
+"-*-Courier-medium-r-normal--*-100-*-*-m-*-cp850-1"
+
address@hidden
+Q2.5  How do I make emacs scroll the window horizontally when moving?
+
+In XEmacs, you should simply put something like this in your .emacs
+file:
+
address@hidden
+   (add-hook 'w3-mode-hook '(lambda () (auto-show-mode 1)))
address@hidden example
+
+Under Emacs 19, there are a variety of different packages that provide
+this functionality.  The one I have seen used the most is 'hscroll.el',
+from @url{http://reality.sgi.com/wmesard/ftp/emacs/hscroll.el} - to turn
+it on, add this to your .emacs file:
+
address@hidden
+   (autoload 'turn-on-hscroll "hscroll" nil t)
+   (add-hook 'w3-mode-hook 'turn-on-hscroll)
address@hidden example
+
address@hidden
+Q2.6  I like being warned about invalid HTML on my own pages, but how
+      can I make Emacs/W3 stop telling me almost everything on the Web
+      is invalid?
+
+Snide answer: Make everyone start writing valid HTML pages. :)
+
+Real answer: You can use the file preparation hook, which is run before
+any parsing is done.  Something like this should work.
+
address@hidden
+(defun my-w3-file-prepare-hook ()
+  (make-local-variable 'w3-debug-html)
+  (setq w3-debug-html
+      (if (or (string= (url-type url-current-object) "file")
+              (string-match ".*\\.some\\.domain\\.name"
+                            (or (url-host url-current-object) "")))
+          'style
+        nil)))
+(add-hook 'w3-file-prepare-hook 'my-w3-file-prepare-hook)
address@hidden example
+This will turn on stylistic warnings for any local HTML files or files
+loaded from the `*.some.domain.name' domain.
+
address@hidden
+Q2.7  I get an error restarting Emacs after using the preferences menu
+      in Emacs/W3:
+      @samp{Symbol's function definition is void: custom-set-variables}
+
+Typically this happens if you are running GNU Emacs 19.  Because the
+custom libraries are not bundled with Emacs, you need to make sure that
+you load it from within your .emacs file.   Place the following line
+before any of the calls to @code{custom-set-variables}:
+
address@hidden
+(require 'custom)
address@hidden example
+
address@hidden
+Q2.8  When using Emacs 20.x, a \201 character appears in the buffer
+      before every character above ASCII 127?
+
+You should install the LEIM package and put the following lines in your
+.emacs file:
+
address@hidden
+(set-language-environment 'Latin-1)
+(standard-display-european t 'iso-latin-1)
address@hidden example
+
+LEIM packages for Emacs 20.x are located at
address@hidden://prep.ai.mit.edu/pub/gnu/}, filename is
address@hidden, where XX.Y matches the Emacs version you are
+currently running.
+
address@hidden
+Q2.9  All my FTP directory listings show up as HTML!  I HATE THAT!
+
+This will happen if you are going through a web-based proxy server.  To
+use the normal ftp support that Emacs provides, you will need to set up
+the no-proxy section of your proxy services to not include @b{any} ftp
+traffic  @xref{Proxy Gateways, , Proxy Gateways, w3, Emacs/W3 User's
+Manual}.  You must then also configure Ange-FTP or EFS to know about
+your specific proxy setup.
+
+After all this pain and anguish, you will see your FTP directories in
+dired as the gods intended.
+
address@hidden
+Q2.10 Why can't I choose an option in an HTML form using the minibuffer
+      instead of the #%!@@ing 'widget choose' buffer?
+
+This is in the hands of the @b{widget} library.  Thankfully, there is a
+way to change this behaviour.  Set the variable
address@hidden to @code{t} in your @file{~/.emacs}
+file, and you will get the expected behaviour.
+
address@hidden itemize
+
address@hidden Arcana, Customization FAQ, Runtime FAQ, Top
address@hidden Arcana
+
address@hidden @bullet
address@hidden
+Q3.2  How do i get Shift-Tab to go backwards on a text terminal or XTerm?
+
+aka: I hate the new text widgets, I can't go through the links with n and b
+     I can go forward using TAB but how do i go backward on a terminal? 
+
+Thanks to Greg Stark <gsstark@@mit.edu> for this incredibly thorough
+answer.  I have verified that this works on my Linux laptop.
+
+Not all terminals can distinguish between a shifted tab and an unshifted
+tab at all. Tab is indicated on a text terminal by a control-i. There is
+no such thing as capital control characters, so if the terminal is going
+to indicate a shift-tab somehow it has to be completely differently. The
+most appropriate thing to use is probably "backtab" which on old text
+terminals was sometimes a separate key and Emacs is already set up to
+recognize automatically if it exists.
+
+Making "backtab" work involves several steps. First you have to make
+sure your console generates some character sequence to indicate the key
+you want to generate a "backtab". Then you have to configure termcap or
+terminfo to recognize that key sequence. Then you may have to make your
+programs do useful things when they get a "backtab", Emacs for example
+will recognize it automatically but except for the Widget and W3
+commands nothing is ever bound it it.
+
+Step 1 On An XTerm: XTerm obeys standard X Toolkit translations which
+you can use to specify what character sequence Shift-Tab generates. The
+following X Resources will cause Shift-Tab and Meta-Shift-Tab to
+generate reasonable character sequences. You can either put this in your
+.Xresources or .Xdefaults file, or you can put it in
+/usr/lib/X11/app-defaults/XTerm to make it a site-wide default. (On
+Debian systems you should put it in /etc/X11/Xresources, not the
+app-defaults files):
+
address@hidden
+XTerm*VT100.translations: #override \
+   ~Meta Shift<Key>Tab: string(\033[Z) \n\
+    Meta Shift<Key>Tab: string(\033\033[Z) \n
address@hidden example
+
+I recommend these sequences, they are based on what seems to be a more
+or less standard sequence ^[[Z for backtab.
+
+Step 1 On Rxvt: By default Rxvt sends ^[[Z for Shift-Tab.  However, if
+Shift-Tab generates another keysym, like for example in XFree86 3.2
+where it's bound to ISO_Left_Tab then Rxvt will just ignore it. You
+would need to defeat this feature to make rxvt work again by doing
+something like:
+
address@hidden
+xmodmap -e 'keysym Tab = Tab'
address@hidden example
+
+or adding that command to some global X configuration file (On Debian
+systems adding ``Keysym Tab = Tab'' to /etc/X11/Xmodmap or ~/.Xmodmap is
+sufficient)
+
+Step 1 On A Linux Virtual Console: on a Linux virtual console you can
+configure what character sequences are generated by which keys using the
+loadkeys command. Many systems are set up to run loadkeys automatically on
+startup with some keymap file. On Debian systems this is true, the keymap file
+is specified in /etc/kbd/config and usually lives in the
+/usr/lib/kbd/keytables directory. You want to put something like the following
+in your keytable file:
+
address@hidden
+keycode  15 = Tab   F91
+       alt     keycode  15 = Meta_Tab        
+       shift   alt     keycode  15 = F92
address@hidden example
+
+where keycode 15 is Tab on my keyboard (and probably any keyboard). This
+defines Tab and Alt-Tab normally, and also defines Shift-Tab to be F91
+and Shift-Alt-Tab to be F92.
+
+Then put something like this:
+
address@hidden
+# backtab and M-backtab
+string F91 = "\033[Z"
+string F92 = "\033\033[Z"
address@hidden example
+
+later in the file. This defines what character sequence F91 (Shift-Tab)
+and F92 (Alt-Shift-Tab) should generate. I recommend these sequences,
+they are based on what seems to be a more or less standard sequence ^[[Z
+for backtab.
+
+Step 2 On A Termcap System:
+
+The termcap capability is kB, i'm not familiar with termcap tools, i think you
+just need to add it to the /etc/termcap file for the terminal you're concerned
+with as kB=\E[Z.
+
+Step 2 On A Terminfo System:
+
+The terminfo capability is kcbt (the long name is key_btab). You want to
+run infocmp to generate an edittable copy of the terminal info. Add the
+capability, then use tic to compile that information. Something like
+this:
+
+infocmp $TERM > info
+emacs info & # add kcbt=\E[Z, to the file
+tic info
+
+If you do this as root it should add the new definition to the system
+wide terminfo database. If you do it as a normal user it should create a
+~/.terminfo database with a local terminfo info definition for that
+terminal.
+
+Step 3 On Emacs:
+
+The standard terminal initialization should recognize the backtab
+capability automatically. To test it try C-h c Shift-Tab and see what it
+calls the key.  To bind commands to it just use [backtab] in
+local-set-key or global-set-key as in:
+
address@hidden
+(local-set-key [backtab] 'hippie-expand)
+or
+(global-set-key [backtab] 'hippie-expand)
address@hidden example
+
+In the interest of maintaining a single consistent set of key bindings
+between X and tty emacsen you may want to make equivalent X keystroke
+generate "backtab" as well, you can do this by doing this:
+
+(define-key function-key-map [S-tab] [backtab])
+or
+(define-key function-key-map [iso-lefttab] [backtab])
+
+To make S-tab or whatever keystroke you made generate backtab on a
+terminal be recognized as backtab under X11 as well. You can check how
+Emacs recognizes this keystroke currently by doing C-h c <keystroke>.
+
address@hidden itemize
+
address@hidden Customization FAQ,  , Arcana, Top
address@hidden Customization
address@hidden @bullet
address@hidden itemize
+
address@hidden
diff --git a/texi/w3.txi b/texi/w3.txi
new file mode 100644
index 0000000..a102b7b
--- /dev/null
+++ b/texi/w3.txi
@@ -0,0 +1,4941 @@
+\input texinfo
address@hidden
address@hidden Please note that this file uses some constructs not supported by 
earlier 
address@hidden versions of TeX-info.  You must be running one of the newer 
TeX-info 
address@hidden releases (I currently use version 3.9 from 
ftp://prep.ai.mit.edu/pub/gnu/)
address@hidden
address@hidden Please do not send in bug reports about not being able to format 
the
address@hidden document with 'makeinfo' or 'tex', just upgrade your 
installation.
address@hidden
address@hidden Info formatted files are provided in the distribution, and you 
can
address@hidden retrieve dvi, postscript, and PDF versions from the web site or 
FTP 
address@hidden site: http://www.cs.indiana.edu/elisp/w3/docs.html
address@hidden
address@hidden w3.info
address@hidden Emacs/W3 $State: Exp $ User's Manual
address@hidden
address@hidden
address@hidden iftex
address@hidden @setchapternewpage odd
address@hidden @smallbook
address@hidden
+\overfullrule=0pt
+%\global\baselineskip 30pt      % for printing in double space
address@hidden tex
address@hidden cp fn
address@hidden vr fn
address@hidden World Wide Web
address@hidden GNU Emacs Lisp
address@hidden
+* Emacs/W3: (w3).                 Emacs/W3 World Wide Web browser.
address@hidden direntry
address@hidden
+This file documents the Emacs/W3 World Wide Web browser.
+
+Copyright (C) 1993, 1994, 1995, 1996 William M. Perry
+Copyright (C) 1996, 1997 Free Software Foundation
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
address@hidden
+Permission is granted to process this file through Tex and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual).
+
address@hidden ignore
address@hidden ifinfo
address@hidden
address@hidden
address@hidden 6
address@hidden @titlefont{Emacs/W3}
address@hidden @titlefont{User's Manual}
address@hidden 4
address@hidden Third Edition, Emacs/W3 Version 4.0
address@hidden 1
address@hidden June 1998
address@hidden 5
address@hidden William M. Perry
address@hidden @i{wmperry@@cs.indiana.edu}
address@hidden
address@hidden 0pt plus 1filll
+Copyright @copyright{} 1993 - 1995 William M. address@hidden
+Copyright @copyright{} 1996 - 1998 Free Software Foundation
+
+Permission is granted to make and distribute verbatim copies address@hidden
+this manual provided the copyright notice and this permission address@hidden
+are preserved on all copies.
+
address@hidden titlepage
address@hidden
address@hidden
address@hidden Top, Getting Started, (dir), (dir)
address@hidden W3
+
+Users can browse the World Wide Web from within Emacs by using Emacs/W3.
+All of the widely used (and even some not very widely used) @sc{url}
+schemes are supported, and it is very easy to add new methods as the
+need arises.
+
+Emacs/W3 provides some core functionality that can be readily re-used
+from any program in Emacs.  Users and other package writers are
+encouraged to @i{Web-enable} their applications and daily work routines
+with the library.
+
+Emacs/W3 is completely customizable, both from Emacs-Lisp and from
+stylesheets @xref{Stylesheets}  If there is any aspect of Emacs/W3 that
+cannot be modified to your satisfaction, please send mail to the
address@hidden@@indiana.edu} mailing list with any suggestions.
address@hidden Bugs}
+
+This manual corresponds to Emacs/W3 $State: Exp $
+
address@hidden
+* Getting Started::             Getting up and running with Emacs/W3
+* Basic Usage::                 Basic movement and usage of Emacs/W3.
+* Compatibility::               Explanation of compatibility with
+                                other browsers.
+* Stylesheets::                 How to control the look of web pages
+* Display::                     How to control Emacs/W3's look.
+* Supported URLs::              What @sc{URL} schemes are supported.
+* MIME Support::                Support for @sc{mime}
+* Security::                    Various security methods supported
+* Cookies::                     Emacs/W3 and cookies.
+* Non-Unix Operating Systems::  Special considerations necessary to get
+                                up and running correctly under non-unix
+                                OS's.
+* Speech Integration::          Outputting to a speech synthesizer.
+* Advanced Features::           Some of the more arcane features.
+* More Help::                   How to get more help---mailing lists,
+                                newsgroups, etc.
+* Future Directions::           Plans for future revisions
+
+Appendices:
+* Reporting Bugs::              How to report a bug in Emacs/W3.
+* Dealing with Firewalls::      How to get around your firewall.
+* Proxy Gateways::              Using a proxy gateway with Emacs/W3.
+* Installing SSL::              Turning on @sc{ssl} support.
+* Mailcap Files::               An explanation of Mailcap files.
+* Down with DoubleClick::       Annoyed by advertisements?  Read this!
+* Temporary::                   Temporary node.
+
+Indices:
+* General Index::               General Index.
+* Key Index::                   Menus of command keys and their references.
address@hidden menu
address@hidden ifinfo
+
address@hidden Getting Started, Basic Usage, Top, Top
address@hidden Getting Started
address@hidden Clueless in Seattle
address@hidden Getting Started
address@hidden M-x w3
address@hidden w3-default-homepage
address@hidden w3
+If installed correctly, starting Emacs/W3 is quite painless.  Just type
address@hidden w3} in a running Emacs session.  This will retrieve the default
+page that has been configured --- by default the documentation for
+Emacs/W3 at Indiana University.  The default homepage is specified by
+the @code{w3-default-homepage} variable.
+
+If the default page is not retrieved correctly at startup, you will have
+to do some customization.
+
+Once started, you can use the mouse and the menu or use the following
+key commands (for more commands and more detail, @pxref{Basic Usage, ,
+Basic Usage}).
+
address@hidden @asis
address@hidden move forward 
+press the space bar, 
+
address@hidden move backwards
+press the backspace key, 
+
address@hidden move to the next HTML reference on the page
+press the @kbd{TAB} key,
+
address@hidden move to the previous HTML reference on the page
+press the @kbd{SHIFT} and @kbd{TAB} keys at the same time.  If this does
+not work (some text terminals cannot distinguish between @kbd{TAB} and
address@hidden, pressing the @kbd{ALT} and @kbd{TAB} keys should also
+work.
+
address@hidden follow a link 
+put the cursor over it
+and press the @kbd{RETURN} key, or @*
+click the left mouse button on it,
+
address@hidden fetch a @sc{url}
+press the @kbd{Control} and @kbd{o} keys at the same time,@*
+type the @sc{url}, and then press the @kbd{RETURN} key,
+
address@hidden return to the last URL you were at 
+press the @kbd{l} key,
+
address@hidden quit W3 mode 
+press the @kbd{q} key.
address@hidden table
+
address@hidden
+* Downloading::                 Where to download Emacs/W3.
+* Building and Installing::     Compiling and installing from source.
+* Startup Files::               What is where, and why.
address@hidden menu
+
address@hidden Downloading, Building and Installing, Getting Started, Getting 
Started
address@hidden Downloading
+
+Emacs/W3 will work with Emacs 19.29 and later and XEmacs 19.14 and later,
+but if you're using a 19.x Emacs then you will need to get the
+latest custom and widget libraries.
+
+If you want to get hold of Emacs then the latest version will be
+available from the GNU archive @uref{ftp://prep.ai.mit.edu/pub/gnu} or
+one of it's many mirrors.  @uref{http://www.xemacs.org/} will tell you
+how to get hold of the latest version of XEmacs --- once again there are
+plenty of sites that have mirrors.
+
address@hidden info: find better url
+Emacs/W3 itself is available from
address@hidden://ftp.cs.indiana.edu/pub/elisp/w3/.betas/w3.tar.gz} and up to
+date information can be found at
address@hidden://www.cs.indiana.edu/elisp/w3/docs.html}.  The latest custom
+and widget libraries are available from
address@hidden://ftp.cs.indiana.edu/pub/elisp/w3/custom.tar.gz}.
+
+:: WORK :: Where to download related utilities (netpbm, xv, gimp, etc.)
address@hidden info: Why are these useful?
+
+http://www.research.digital.com/CRL/personal/raman/emacspeak/emacspeak.html
+
address@hidden Building and Installing, Startup Files, Downloading, Getting 
Started
address@hidden Building and Installing
+
+Emacs/W3 uses GNU @samp{configure} (@pxref{Top, , ,configure}) to control
+installation.  @samp{configure} will attempt to find what Emacsen you have and
+where they live.  If it finds both Emacs and XEmacs, then XEmacs is used
+(but see below for how to change this).  Apart from the usual options,
+the following options are accepted:
+
address@hidden @samp
address@hidden --with-xemacs
+Use XEmacs.
address@hidden --with-emacs
+Use Emacs.
address@hidden address@hidden
+Put lisp files (*.el and *.elc) in @var{dir}.  If this isn't specified,
+and nor is @samp{--with-package-dir}, then the lisp files go into
address@hidden@var{EMACS}/site-lisp}.
address@hidden address@hidden
+If using XEmacs, install Emacs/W3 as a package in @var{dir}.  Please
+note that this and the @samp{--prefix} argument are mutually exclusive.
address@hidden address@hidden
+Use @var{makeinfo} to build info files from Texinfo files.
address@hidden will normally find makeinfo if it's available, you
+should only need to specify this if it's not called makeinfo or if it
+isn't in a directory in your @samp{PATH}.
address@hidden address@hidden
+Use the custom package in @var{dir}.  @samp{configure} will attempt to
+find a suitable custom package, you should not need to specify this
+yourself if the custom package is in Emacs's @code{load-path}.
address@hidden --enable-site-install
+Install Emacs/W3 for the site, rather than just yourself.  This only
+affects whether @samp{make dotemacs} affects @file{~/.emacs} or
address@hidden/default.el}.
+
address@hidden table
+
+These are the most useful of the normal @samp{configure} options.
+
address@hidden @samp
address@hidden address@hidden
+This is the top level directory and by default everything is installed
+somewhere below this.  This is @file{/usr/local} by default.
address@hidden address@hidden
+Where to put the info files.  This is @address@hidden/info} by
+default unless @address@hidden was given in
+which case it is @address@hidden/info}.
address@hidden address@hidden
+Where to put date files (default stylesheets).  This is @address@hidden/share} 
by
+default unless @address@hidden was given in
+which case they go into @address@hidden/etc/w3}.
address@hidden table
+
+The directory that the byte-compiled lisp files will be installed into
+is controlled by the @samp{--prefix}, @samp{--with-package-dir} and
address@hidden options.  The directory for the info and data files is
+likewise controlled by the @samp{--prefix}, @samp{--with-package-dir}
+and @samp{--infodir} or @samp{--data-dir} options.
+
+Normally these are the only things that need to be installed, they can
+by compiled by @samp{make all}, or @samp{make w3} and @samp{make info}.
address@hidden install} will install the lisp, info and data files.
address@hidden all} in the @file{texi} directory will create the info files
+and also dvi files.  @sc{html} and postscript can be generated by @samp{make
+html} and @samp{make ps} respectively.
+
address@hidden gdj1: document the other targets, fast etc.?
+
address@hidden Startup Files, , Building and Installing, Getting Started
address@hidden Startup Files
address@hidden Startup files
address@hidden .w3
+
address@hidden w3-configuration-directory
+Emacs/W3 needs a directory for each user to store options, history and
+the cache.  @code{w3-configuration-directory} controls this directory,
+which is @file{~/.w3} by default.
+
address@hidden Emacs/W3 profile
address@hidden profile
address@hidden w3-default-configuration-file
+Emacs/W3 keeps a file called @file{profile} in your configuration
+directory that sets many variables.  @strong{Warning}: this file will
+overide any options that you set in your @file{.emacs}.  You @emph{must} either
+edit @file{profile} directly or use @code{w3-menu-save-options} to save
+your settings.
+
+If you prefer, you can set @code{w3-default-configuration-file} to
+specify a different configuration file.  This file does not need to be
+dedicated to Emacs/W3 because Emacs/W3 will delimit its part of the file
+so you can set this to @file{.emacs} if you want.  However, while
+Emacs/W3 will save it's options to the correct part of the file, it will
+read (and execute) the entire file when starting.
+
address@hidden Default stylesheets
address@hidden Default stylesheet
address@hidden w3-default-stylesheet
+Emacs/W3 will look for style-sheets in @code{w3-configuration-directory}
+as well as the site-wide directories.  In particular it will look for
address@hidden or @file{stylesheet-dark} if you're using a dark
+background and @file{light.css} or @file{stylesheet-light} if you're
+using a light background as well as @file{stylesheet} and
address@hidden  If @code{w3-default-stylesheet} is not @code{nil}
+then the file that it names will be used as well.  @xref{Stylesheets}
+for more information.
+
address@hidden History
address@hidden history
address@hidden url-global-history-file
address@hidden url-global-history-save-interval
address@hidden url-keep-history
+Emacs/W3 keeps a file called @file{history} in the configuration
+directory.  This is a list of all the links you have visited.  You can
+change the file where the history is stored by setting
address@hidden to the name of the file you'd prefer.
address@hidden History}.
+
address@hidden Hotlists
address@hidden w3-hotlist-file
address@hidden (sometimes called bookmarks, but not to be confused with
+Emacs's bookmarks) are a list of @sc{url}s.  Emacs/W3 supports mosaic's
+hotlist format which associates an alias with each @sc{url} ---
address@hidden Handling}.
address@hidden gdj1:
address@hidden --- and also the @sc{html} style hotlists used by
address@hidden lynx and netscape.
address@hidden And others?
+The @code{w3-hotlist-file} variable specifies
+the hotlist file.  It defaults to @file{.mosaic-hotlist-default}.
+
address@hidden Basic Usage, Compatibility, Getting Started, Top
address@hidden Basic Usage
address@hidden Basic Usage
address@hidden space
address@hidden backspace
address@hidden return
address@hidden tab
address@hidden M-tab
+Emacs/W3 is similar to the Info package all Emacs users hold near and
+dear to their hearts (@xref{Top,,Info,info, The Info Manual}, for a
+description of Info).  Basically, @kbd{space} and @kbd{backspace}
+control scrolling, and @kbd{return} or the middle mouse button follows a
+hypertext link.  The @kbd{tab} and @kbd{Meta-tab} keys maneuver around the
+various links on the page.
+
address@hidden:} Starting with Emacs/W3 4.0, form entry areas in a page can be
+typed directly into.  This is one of the main differences in navigation
+from version 2.0.  If you are used to using the @kbd{f} and @kbd{b} keys
+to navigate around a buffer, I suggest training yourself to always use
address@hidden and @kbd{M-tab} --- it will save time and frustration on pages
+with lots of form fields.
+
+By default, hypertext links are surrounded by '[[' and ']]' on
+non-graphic terminals (VT100, DOS window, etc.).  On a graphics
+terminal, the links are in shown in different colors.
address@hidden for information on how to change this.
+
+There are approximately 50 keys bound to special Emacs/W3 functions.
+The basic rule of thumb regarding keybindings in Emacs/W3 is that a
+lowercase key takes an action on the @b{current document}, and an
+uppercase key takes an action on the document pointed to by the
+hypertext link @b{under the cursor}.
+
+There are several areas that the keybindings fall into: movement,
+information, action, and miscellaneous.
+
address@hidden
+* Movement::                    Moving around in the buffer.
+* Information::                 Getting information about a document.
+* Action::                      Following links, printing, etc.
+* Miscellaneous::               Everything else.
address@hidden menu
+
address@hidden Movement, Information, Basic Usage, Basic Usage
address@hidden Movement
+
+All the standard Emacs bindings for movement are still in effect, with a
+few additions for convenience.
+
address@hidden @kbd
address@hidden w3-scroll-up
address@hidden space
address@hidden space
+Scroll downward in the buffer.  With prefix arg, scroll down that many
+screenfuls (@code{w3-scroll-up}).
address@hidden M-space
address@hidden M-space
address@hidden w3-next-document
+Goes to next document.
address@hidden gdj1: check
+
address@hidden M-del
address@hidden M-del
address@hidden w3-prev-document
+Goes to previous document.
address@hidden gdj1: check
+
address@hidden backspace
address@hidden C-?
address@hidden scroll-down
address@hidden backspace, C-?
+Scroll upward in the buffer.  With prefix arg, scroll up that many
+screenfuls (@code{scroll-down}).
address@hidden <
address@hidden w3-start-of-document
address@hidden <
+Goes to the start of document (@code{w3-start-of-document}).
address@hidden >
address@hidden w3-end-of-document
address@hidden >
+Goes to the end of document (@code{w3-end-of-document}).
address@hidden b
address@hidden Meta-tab
address@hidden w3-widget-backward
address@hidden Meta-tab, Shift-tab, b
+Attempts to move backward one link area in the current document
+(@code{w3-widget-backward}).  Signals an error if no previous links are
+found.
address@hidden f
address@hidden tab
address@hidden n
address@hidden w3-widget-forward
address@hidden tab, f, n
+Attempts to move forward one link area in the current document
+(@code{w3-widget-forward}).  Signals an error if no more links are
+found.
address@hidden B
address@hidden HB
address@hidden w3-backward-in-history
address@hidden w3-history-backward
address@hidden B, HB
+Takes one step back along the path in the current history
+(@code{w3-history-backward}).  Has no effect if at the beginning of the
+session history.
address@hidden F
address@hidden H F
address@hidden w3-forward-in-history
address@hidden w3-history-forward
address@hidden F, HF
+Takes one step forward along the path in the current history
+(@code{w3-history-forward}).  Has no effect if at the end of the session
+history.
address@hidden l
address@hidden w3-goto-last-buffer
address@hidden l
+Return to the last buffer shown before this buffer
+(@code{w3-goto-last-buffer}).
address@hidden q
address@hidden w3-quit
address@hidden q
+Kill this buffer (@code{w3-quit}).
address@hidden Q, u
address@hidden w3-leave-buffer
address@hidden Q, u
+Bury this buffer, but don't kill it (@code{w3-leave-buffer}).
address@hidden table
+
address@hidden Information, Action, Movement, Basic Usage
address@hidden Information
+
+These functions relate information about one or more links on the
+current document.
+
address@hidden @kbd
address@hidden v
address@hidden url-view-url
address@hidden v
+This shows the @sc{url} of the current document in the minibuffer
+(@code{url-view-url}).
address@hidden V
address@hidden w3-view-this-url
address@hidden V
+This shows the @sc{url} of the hypertext link under point in the
+minibuffer (@code{w3-view-this-url}).
address@hidden i
address@hidden w3-document-information
address@hidden i
+Shows miscellaneous information about the currently displayed document
+(@code{w3-document-information}).  This includes the @sc{url}, the last
+modified date, @sc{mime} headers, the @sc{http} response code, and any
+relationships to other documents.  Any security information is also
+displayed.
address@hidden I
address@hidden w3-popup-info
address@hidden I
+Shows information about the @sc{url} at point (@code{w3-popup-info}).
address@hidden s
address@hidden w3-source-document
address@hidden s
+This shows the @sc{html} source of the current document in a separate
+buffer (@code{w3-source-document}).  The buffer's name is based on the
+document's @sc{url}.
address@hidden S
address@hidden w3-source-document-at-point
address@hidden S
+Shows the @sc{html} source of the hypertext link under point in a
+separate buffer (@code{w3-source-document-at-point}).  The buffer's name
+is based on the document's @sc{url}.
address@hidden k
address@hidden w3-save-url
address@hidden k
+This stores the current document's @sc{url} in the kill ring, and also in the
+current window-system's clipboard, if possible (@code{w3-save-url}).
address@hidden K
address@hidden w3-save-this-url
address@hidden K
+Stores the @sc{url} of the document under point in the kill ring, and also in
+the current window-system's clipboard, if possible (@code{w3-save-this-url}).
address@hidden table
+
address@hidden Action, Miscellaneous, Information, Basic Usage
address@hidden Action
+
+First, here are the keys and functions that bring up a new hypertext
+page, usually creating a new buffer.
address@hidden @kbd
address@hidden m
address@hidden w3-complete-link
address@hidden m
+Choose a link from the current buffer and follow it
+(@code{w3-complete-link}).  A completing-read is done on all the links,
+so @kbd{space} and @kbd{TAB} can be used for completion.
address@hidden return
address@hidden w3-follow-link
address@hidden return 
+Pressing return when over a hyperlink attempts to follow the link
+under the cursor (@code{w3-follow-link}).
+
+Pressing return when over a form input field can cause auto-submission
+of the form.  This is for Mosaic and Netscape compatibility.  If there
+is only one item in the form other than submit or reset buttons, then
+the form will be submitted.
+
address@hidden Middle Mouse Button
address@hidden w3-follow-mouse
address@hidden Middle Mouse Button
+Attempt to follow a hypertext link under the mouse cursor
+(@code{w3-follow-mouse}).  Clicking on a form input field will prompt in
+the minibuffer for the data to insert into the input field.  Type
+checking is done, and the data is only entered into the form when data
+of the correct type is entered (ie: cannot enter 44 for 'date' field,
+etc).
+
address@hidden Control Middle Mouse Button
address@hidden Meta return
address@hidden w3-follow-inlined-image
address@hidden Control Middle Mouse Button, Meta return
+Tries to retrieve the inlined image that is under point
+(@code{w3-follow-inlined-image}).  It ignores any form entry areas or
+hyperlinks, and blindly follows any inlined image.  Useful for seeing
+images that are meant to be used as hyperlinks when not on a terminal
+capable of displaying graphics.
+
address@hidden D
address@hidden w3-download-url-at-point
address@hidden D
+Download the @sc{url} at point (@code{w3-download-url-at-point}).
address@hidden d
address@hidden w3-download-this-url
address@hidden d
+Download the current @sc{url} (@code{w3-download-this-url}).
address@hidden @kindex G
address@hidden @findex w3-show-graphics
address@hidden @c @item G
address@hidden gdj1: Bound to w3-show-graphics which isn't defined.
address@hidden @kindex p
address@hidden m
address@hidden w3-complete-link
address@hidden m
+Selects a destination from a list of all the hyperlinks in the current
+buffer (@code{w3-complete-link}).  Use @kbd{space} and @kbd{tab} to
+complete on the links.
+
address@hidden r
address@hidden g
address@hidden w3-reload-document
address@hidden r, g
+Reloads the current document (@code{w3-reload-document}).  The position
+within the buffer remains the same (unless the document has changed
+since it was last retrieved, in which case it should be relatively
+close).  This causes an unconditional reload from the remote server ---
+the locally cached copy is not consulted.
address@hidden R
address@hidden w3-refresh-buffer
address@hidden R
+Redraws the buffer without reloading document (@code{w3-refresh-buffer}).
address@hidden C-o
address@hidden w3-fetch
address@hidden C-o
+Prompts for a @sc{url} in the minibuffer, and attempts to fetch it
+(@code{w3-fetch}).  If there are any errors, or Emacs/W3 cannot
+understand the type of link requested, the errors are displayed in a
+hypertext buffer.
address@hidden o
address@hidden w3-open-local
address@hidden url-use-hypertext-dired
address@hidden o
+Opens a local file, interactively (@code{w3-open-local}).  This prompts
+for a local file name to open.  The file must exist, and may be a
+directory.  If the requested file is a directory and
address@hidden is @code{nil}, then a dired-mode buffer
+is displayed.  If address@hidden, then Emacs/W3 automatically generates a
+hypertext listing of the directory.  The hypertext mode is the default,
+so that all the keys and functions remain the same.
+
address@hidden M-s
address@hidden w3-save-as
address@hidden M-s
+Save a document to the local disk as HTML Source, Formatted Text, LaTeX
+Source, or Binary (@code{w3-save-as}).
+
address@hidden Hv
address@hidden C-c C-b
address@hidden w3-show-history-list
address@hidden Hv, C-c C-b
+Show the current session's history list (@code{w3-show-history-list}).
+This takes all the links that are in that internal list, and formats
+them as hypertext links in a list, @ref{Global History}
address@hidden table
+
address@hidden Buffer movement
+And here are the commands to move around between Emacs/W3 buffers:
+
address@hidden @kbd
address@hidden l
address@hidden w3-goto-last-buffer
address@hidden l
+Goes to the last WWW buffer seen (@code{w3-goto-last-buffer}).
address@hidden p
address@hidden w3-print-this-url
address@hidden p
+Prints the current document (@code{w3-print-this-url}).  Choose from several 
different formats to
+print: formatted text, @sc{html} source, PostScript (with ps-print), or by 
using
+LaTeX and dvips).  @ref{Printing}.
address@hidden P
address@hidden w3-print-url-under-point
address@hidden P
+Prints out the @sc{url} under point in a variety of formats
+(@code{w3-print-url-under-point}).  @ref{Printing}.
address@hidden q
address@hidden w3-quit
address@hidden q
+Quits WWW mode (@code{w3-quit}).  This kills the current buffer and goes
+to the most recently visited buffer.
address@hidden Q
address@hidden u
address@hidden w3-leave-buffer
address@hidden u, Q
+This (@code{w3-leave-buffer}) is similar to @code{w3-quit}, but the
+buffer is not killed, it is moved to the bottom of the buffer list (so
+it is the least likely to show up as the default with switch-to-buffer).
+This is different from @code{w3-goto-last-buffer} in that it does not
+return to the last @sc{WWW} page visited --- it is the same as using
address@hidden --- the buffer left in the window is fairly
+random.
address@hidden table
+
address@hidden Miscellaneous,  , Action, Basic Usage
address@hidden Miscellaneous
+
address@hidden @kbd
address@hidden ?
address@hidden w3-help
address@hidden ?
+Shows help for Emacs/W3 (@code{w3-help}).
address@hidden C-c C-v
address@hidden w3-version
address@hidden C-c C-v
+Show what version of Emacs/W3 you're running (@code{w3-version}).
address@hidden M-m
address@hidden w3-mail-current-document
address@hidden M-m
+Mails the current document to someone (@code{w3-mail-current-document}).
+Choose from several different formats to mail: formatted text, @sc{html}
+source, PostScript, or LaTeX source.  When the @sc{html} source is
+mailed, then an appropriate <base> tag is inserted at the beginning of
+the document so that relative links may be followed correctly by whoever
+receives the mail.
address@hidden M-M
address@hidden w3-mail-document-under-point
address@hidden M-M
+Mails the document pointed to by the hypertext link under point to
+someone (@code{w3-mail-document-under-point}).  Choose from several
+different formats to mail: formatted text, @sc{html} source, PostScript,
+or LaTeX source.  When the @sc{html} source is mailed, then an
+appropriate <base> tag is inserted at the beginning of the document so
+that relative links may be followed correctly by whoever receives the
+mail.
address@hidden A-t
address@hidden M-t
address@hidden url-list-processes
address@hidden M-t, A-t
+gdj1: bound to url-list-processes.  What does this do?
address@hidden c
address@hidden w3-mail-document-author
address@hidden c
+Send a mail to the author of the current document
+(@code{w3-mail-document-author}).
+
address@hidden M-x w3-insert-formatted-url
address@hidden w3-insert-formatted-url
address@hidden M-x w3-insert-formatted-url
+Insert a fully formatted @sc{html} link into another buffer
+(@code{w3-insert-formatted-url}).  This gets the name and @sc{url} of
+either the current buffer, or, with a prefix arg, of the link under
+point, and construct the appropriate <a...>...</a> markup and insert it
+into the desired buffer.
address@hidden M-tab
address@hidden w3-insert-this-url
address@hidden M-tab
+Inserts the @sc{url} of the current document into another buffer
+(@code{w3-insert-this-url'}).  Buffer is prompted for in the minibuffer.
+With prefix arg, uses the @sc{url} of the link under point.
address@hidden U
address@hidden w3-use-links
address@hidden U
+Selects one of the <LINK> tags from this document and fetch it
+(@code{w3-use-links}).  Links are attributes of a specific document, and
+can tell such things as who made the document, where a table of contents
+is located, etc.
+
+Link tags specify relationships between documents in two ways.  Normal
+(forward) relationships (where the link has a REL="xxx" attribute), and
+reverse relationships (where the link has a REV="xxx" attribute).  This
+first asks what type of link to follow (Normal or Reverse), then does
+a @code{completing-read} on only the links that have that type of
+relationship.
address@hidden table
+
address@hidden Compatibility, Display, Basic Usage, Top
address@hidden Compatibility with other Browsers
+Due to the popularity of several other browsers, Emacs/W3 offers an easy
+transition to its much better way of life.  This ranges from being able
+to share the same preferences files and disk cache to actually emulating
+the keybindings used in other browsers.
+
address@hidden
+* Emulation::                   Emacs/W3 can emulate the keybindings and
+                               other behaviours of other browsers.
+* Hotlist Handling::            A hotlist is an easy way to keep track of
+                               interesting Web pages without having to
+                               remember the exact path to get there.
+* Session History::             Keeping a history of documents visited
+                               in one Emacs sessions allows the use of
+                               'forward' and 'back' buttons easily.
+* Global History::              Keeping a history of all the places ever
+                               visited on the web.
address@hidden menu
+
address@hidden Emulation, Hotlist Handling, Compatibility, Compatibility
address@hidden Emulation
+
address@hidden Browser emulation
address@hidden Emulation of other browsers
address@hidden w3-mode-hook
+Emacs/W3 can emulate the keybindings of lynx and netscape, but only one
+at a time.  If you want emulation permanantly turned on, then you should
+add @code{turn-on-lynx-emulation} or @code{turn-on-netscape-emulation}
+to @code{w3-mode-hook}.
+
address@hidden
+* lynx::                        Emulate lynx.
+* netscape::                    Emulate netscape.
+* Masquerading::                Emacs/W3 can masquerade as another
+                                browser.
address@hidden menu
+
address@hidden lynx, netscape, Emulation, Emulation
address@hidden Lynx emulation
address@hidden Lynx emulation
address@hidden turn-on-lynx-emulation
address@hidden w3-lynx-emulation-minor-mode
+
address@hidden turns on lynx emulation and turns off
+netscape emulation.  lynx emulation is handled by the
address@hidden minor mode.  @xref{Hotlist Handling}
+for more information about lynx style hotlists.
+
+:: work :: Document lynx address@hidden
address@hidden @kbd
address@hidden down
address@hidden Down arrow
+Highlight next topic
address@hidden up
address@hidden Up arrow
+Highlight previous topic
address@hidden right
address@hidden return
address@hidden Right arrow, Return, Enter
+Jump to highlighted topic
address@hidden left
address@hidden Left arrow
+Return to previous topic.  gdj1: actually, this doesn't seem to work
+quite right.
address@hidden +
address@hidden +
+Scroll down to next page (Page-Down)
address@hidden -
address@hidden -
+Scroll up to previous page (Page-Up)
address@hidden space
address@hidden SPACE
+Scroll down to next page (Page-Down)
address@hidden b
address@hidden b
+Scroll up to previous page (Page-Up)
address@hidden C-a
address@hidden C-a
+Go to first page of the current document (Home)
address@hidden C-b
address@hidden C-e
+Go to last page of the current document (End)
address@hidden C-b
address@hidden C-b
+Scroll up to previous page (Page-Up)
address@hidden C-f
address@hidden C-f
+Scroll down to next page (Page-Down)
address@hidden C-n
address@hidden C-n
+Go forward two lines in the current document
address@hidden C-p
address@hidden C-p
+Go back two lines in the current document
address@hidden )
address@hidden )
+Go forward half a page in the current document (ignored)
address@hidden (
address@hidden (
+Go back half a page in the current document (ignored)
address@hidden #
address@hidden #
+Go to Toolbar or Banner in the current document, only works in XEmacs.
+gdj1: is this what is meant by toolbar?
address@hidden ?
address@hidden h
address@hidden ?, h
+Help (this screen)
address@hidden a
address@hidden a
+Add the current link to a bookmark file
address@hidden c
address@hidden c
+Send a comment to the document owner 
address@hidden d
address@hidden d
+Download the current link
address@hidden e
address@hidden e
+Edit the current file (ignored)
address@hidden g
address@hidden g
+Goto a user specified @sc{url} or file
address@hidden i
address@hidden i
+Show an index of documents (ignored)
address@hidden j
address@hidden j
+Execute a jump operation (using hotlist)
address@hidden k
address@hidden k
+Show a list of key mappings
address@hidden l
address@hidden l
+List references (links) in current document
address@hidden m
address@hidden m
+Return to main screen
address@hidden n
address@hidden n
+Go to the next search string
address@hidden o
address@hidden o
+Set your options
address@hidden p
address@hidden p
+Print the current document
address@hidden q
address@hidden q
+Quit
address@hidden r
address@hidden r
+Delete hotlist entry
address@hidden s
address@hidden s
+Enter a search string for an external search gdj1: really?
address@hidden u
address@hidden u
+Go backwards in history
address@hidden /
address@hidden /
+Search for a string within the current document
address@hidden v
address@hidden v
+View a bookmark file
address@hidden V
address@hidden V
+Go to the Visited Links Page
address@hidden x
address@hidden x
+Force submission of form or link with no-cache
address@hidden z
address@hidden z
+Cancel transfer in progress
address@hidden backspace
address@hidden [backspace]
+Go to the history Page gdj1: really?
address@hidden =
address@hidden =
+Show file and link info
address@hidden \
address@hidden \
+Toggle document source/rendered view
address@hidden !
address@hidden !
+Spawn your default shell
address@hidden *
address@hidden *
+Toggle image_links mode on and off (ignored)
address@hidden [
address@hidden [
+Toggle pseudo_inlines mode on and off (ignorged)
address@hidden ]
address@hidden ]
+Send an @sc{http} @sc{head} request for the current doc or link (ignored)
address@hidden C-r
address@hidden C-r
+Reload current file and refresh the screen
address@hidden C-w
address@hidden C-w
+Refresh the screen
address@hidden C-u
address@hidden C-u
+Erase input line (ignored)
address@hidden C-g
address@hidden C-g
+Cancel input or transfer
address@hidden C-t
address@hidden C-t
+Toggle trace mode on and off (ignored)
address@hidden C-k
address@hidden C-k
+Invoke the Cookie Jar Page (ignored)
address@hidden table
+
address@hidden netscape, Masquerading, lynx, Emulation
address@hidden Netscape emulation
address@hidden Netscape emulation
address@hidden turn-on-netscape-emulation
address@hidden w3-netscape-emulation-minor-mode
+
address@hidden turns on netscape emulation and turns off
+lynx emulation.  netscape emulation is handled by the
address@hidden minor mode.  @xref{Hotlist Handling}
+for more information about netscape style hotlists.
+
+
address@hidden @kbd
address@hidden M-a
address@hidden M-a
+Add the current link to a bookmark file
+
address@hidden M-b
address@hidden M-b
+Show hotlist file.
+
address@hidden M-f
address@hidden M-f
+Search forward in document
+
address@hidden M-g
address@hidden M-g
+Reapeat last search
+
address@hidden M-h
address@hidden M-h
+Show history window
+
address@hidden M-i
address@hidden M-i
+Load images
+
address@hidden M-l
address@hidden M-l
+Goto a user specified @sc{url} or file
+
address@hidden M-m
address@hidden M-m
+Send mail
+
address@hidden M-n
address@hidden M-n
+Open new frame
+
address@hidden M-o
address@hidden M-o
+Open a local file
+
address@hidden M-p
address@hidden M-p
+Print current document
+
address@hidden M-q
address@hidden M-q
+Quit current document
+
address@hidden M-r
address@hidden M-r
+Reload document and redraw
+
address@hidden M-s
address@hidden M-s
+Save current document
+
address@hidden M-left
address@hidden M-[left]
+Go back in history list
+
address@hidden M-right
address@hidden M-[right]
+Go forward in history list
+
address@hidden left
address@hidden [left]
+Scroll left
+
address@hidden right
address@hidden [right]
+Scroll right
+
address@hidden up
address@hidden [up]
+Scroll up
+
address@hidden down
address@hidden [down]
+Scroll down
address@hidden table
+
address@hidden Masquerading, , netscape, Emulation
address@hidden Masquerading
address@hidden Browser masquerading
address@hidden Masquerading as other browsers
address@hidden turn-on-lynx-masquerade-mode
address@hidden turn-on-netscape-masquerade-mode
address@hidden turn-on-ie-masquerade-mode
address@hidden turn-on-arena-masquerade-mode
address@hidden turn-off-lynx-masquerade-mode
address@hidden turn-off-netscape-masquerade-mode
address@hidden turn-off-ie-masquerade-mode
address@hidden turn-off-arena-masquerade-mode
address@hidden w3-arena-masquerade-mode
address@hidden w3-ie-masquerade-mode
address@hidden w3-netscape-masquerade-mode
address@hidden w3-lynx-masquerade-mode
address@hidden allows servers to ask browsers what browser they are, and what
+version they are.  Emacs/W3 allows you to choose the reply.  There are
+functions to masquerade as lynx, netscape, @sc{ie} or arena.  For each
address@hidden there are three functions,
address@hidden@var{browser}-masquerade-mode},
address@hidden@var{browser}-masquerade-mode} and
address@hidden@var{browser}-masquerade-mode}.  The purpose of the first two
+is clear, @address@hidden takes an optional
+argument which toggles the mode if it's @code{nil}, turns off the mode
+if it's 0 and turns the mode on otherwise.
+
+If you'd prefer to masquerade as another browser, then you should call
address@hidden with three arguments: @var{arg}, @var{app} and
address@hidden  @var{arg} has the same function as for
address@hidden@var{browser}-masquerade-mode}, @var{app} is the name of the
+browser to masquerade as and @var{version} is the version.
+
+Why would you want to masquerade as another browser when you could be
+advertising Emacs/W3?  Well, some servers will only let certain browsers
+connect with them.  This is cleary evil.  Also some servers may alter
+what they present depending on the browser, this is probably a Good
+Thing but they might not know about Emacs/W3.  Also one could argue that
+demanding the USER_AGENT field is a breach of privacy, Emacs/W3 doesn't
+have to send it (@pxref{Security}), but the server doesn't have
+to let you connect either.
+
+
address@hidden Hotlist Handling, Session History, Emulation, Compatibility
address@hidden Hotlist Handling
+
+Emacs/W3 supports two types of hotlist, mosaic hotlists and @sc{html} as
+used by lynx and netscape (which both call hotlists bookmarks).
+Unfortunately, not all hotlist operations are supported for @sc{html}
+files at the moment.
+
+In order to avoid having to traverse many documents to get to the same
+document over and over, Emacs/W3 supports a ``hotlist'' like Mosaic.  This is
+a file that contains @sc{url}s and aliases.  Hotlists allow quick access to any
+document in the Web, providing it has been visited and added to the hotlist.
+The variable @code{w3-hotlist-file} determines where this information
+is saved.  The structure of the file is compatible with Mosaic's
+hotlist file, so this defaults to @file{~/.mosaic-hotlist-default}.
+
+Hotlist commands are:
address@hidden @kbd
address@hidden ha
address@hidden ha
address@hidden w3-hotlist-apropos
+Shows the hotlist entries matching a regular expression.
+
address@hidden hi
address@hidden w3-hotlist-add-document
address@hidden w3-hotlist-file
address@hidden hi
+Adds the current document to the hotlist, with the buffer name as its
+identifier.  Modifies the file specified by @code{w3-hotlist-file}.  If
+this is given a prefix-argument (via @kbd{C-u}), the title is prompted
+for instead of automatically defaulting to the document title.
+
address@hidden w3-hotlist-delete
address@hidden w3-hotlist-file
address@hidden hd
address@hidden hd
+Prompts for the alias of the entry to kill.  Pressing the spacebar or
+tab will list out partial completions.  The internal representation of
+the hotlist and the file specified by @code{w3-hotlist-file} are
+updated. 
+
address@hidden hr
address@hidden hr
address@hidden w3-hotlist-rename-entry
address@hidden w3-hotlist-file
+Some hotlist item names can be very unwieldy (`Mosaic for X level 2 fill
+out form support'), or uninformative (`Index of /').  Prompts for the
+item to rename in the minibuffer---use the spacebar or tab key for
+completion.  After having chosen an item to rename, prompts for a new
+title until a unique title is entered.  Modifies the file specified by
address@hidden
+
address@hidden hu
address@hidden hu
address@hidden w3-use-hotlist
+Prompts for the alias to jump to.  Pressing the @key{spacebar} or
address@hidden key shows partial completions.
+
address@hidden hv
address@hidden hv
address@hidden w3-show-hotlist
+Converts the hotlist into @sc{html} and displays it.
+
address@hidden hA
address@hidden hA
address@hidden w3-hotlist-append
+Appends another hotlist file to the one currently in memory.
+
address@hidden hI
address@hidden hI
address@hidden w3-hotlist-add-document-at-point
+Add the document pointed to by the hyperlink under point to the hotlist.
+
address@hidden w3-hotlist-refresh
address@hidden w3-hotlist-file
address@hidden hR
address@hidden hR
+This rereads the default hostlist file specified by
address@hidden
+
address@hidden table
+
+
address@hidden Session History, Global History, Hotlist Handling, Compatibility
address@hidden History
address@hidden History Lists
+
+Almost all web browsers keep track of the @sc{url}s followed from a page, so
+that it can provide @b{forward} and @b{back} buttons to keep a @i{path}
+of @sc{url}s that can be traversed easily.
+
address@hidden url-keep-history
+If @code{url-keep-history} is address@hidden, then Emacs/W3 keeps track
+of all the @sc{url}s visited in an Emacs session.  If @code{t} then
+Emacs/W3 will save the history list at the end of each session to the
address@hidden file.  The history list is simply a list
+of all the @sc{url}s visited in the session.
+
address@hidden w3-show-history-list
+To view a listing of the history for this session of Emacs/W3, use
address@hidden w3-show-history-list} (@kbd{Hv}) from any buffer, and Emacs/W3
+generates an @sc{html} document showing every @sc{url} visited since
+Emacs started (or cleared the history list), and then format it.  Any of
+the links can be chosen and followed to the original document.  To clear
+the history list, choose 'Clear History' from the 'Options' menu.
+
address@hidden w3-forward-in-history
address@hidden w3-backward-in-history
address@hidden w3-fetch
+Another twist on the history list mechanism is the fact that all
+Emacs/W3 buffers remember what @sc{url}, buffer, and buffer position of the
+last document, and also keeps track of the next location jumped @b{to}
+from that buffer.  This means that the user can go forwards and
+backwards very easily along the path taken to reach a particular
+document.  To go forward, use the function @code{w3-forward-in-history} 
(@kbd{F}),
+to go backward, use the function @code{w3-backward-in-history}
+(@kbd{B}).  To view the entire history, use @code{w3-show-history-list}
+(@kbd{Hv}).
+
+
address@hidden Global History,  , Session History, Compatibility
address@hidden Global History
+
+Most web browsers also support the idea of a ``history'' of @sc{url}s
+the user has visited, and it displays them in a different style than
+normal @sc{url}s.  Emacs/W3 will read and write history files generated
+by Emacs/W3, Mosaic v1 and v2 or netscape.  Emacs/W3 looks at the file
+contents to determine the type of history.
+
address@hidden url-keep-history
address@hidden url-global-history-file
address@hidden url-global-history-save-interval
+If the variable @code{url-keep-history} is @code{t}, then Emacs/W3 keeps
+a list of all the @sc{url}s visited in a session.  The file is
+automatically written to disk every
address@hidden seconds and when exiting emacs.
+The list is added to those already in the file specified by
address@hidden, which defaults to @file{~/mosaic.hst}
+for MS operating systems, @file{~/mosaic.global-history} for @sc{VMS} and
address@hidden/.w3/history} for everything else.
+
+If any @sc{url} in the list is found in the file, it is not saved, but new
+ones are added at the end of the file.
+
+The function that saves the global history list is smart enough to
+notice what style of history list is being used (Netscape, Emacs/W3, or
+XMosaic), and writes out the new additions appropriately.
+
address@hidden Completion of URLs
address@hidden Usefulness of global history
+One of the nice things about keeping a global history files is that Emacs/W3
+can use it as a completion table.  When doing @kbd{M-x w3-fetch}, pressing
+the @kbd{tab} or @kbd{space} key will show all completions for a
+partial @sc{url}.  This is very useful, especially for very long @sc{url}s that
+are not in a hotlist, or for seeing all the pages from a particular web
+site before choosing which to retrieve.
+
address@hidden Display, Stylesheets, Compatibility, Top
address@hidden Display
+
+Emacs/W3 has many variable for you to fiddle with to get the display
+just right.
+
address@hidden @code
address@hidden w3-display-frames
address@hidden w3-display-frames
+You can control what Emacs/W3 does with frame by setting
address@hidden  It can be
address@hidden @code
address@hidden nil
+Emacs/W3 will pretend not to understand frames at all.
address@hidden as-nil
+Emacs/W3 will show hyperlinks to frames but will not fetch them (the same
+behaviour as lynx).
address@hidden ask
+This is similar to @code{as-nil}, but Emacs/W3 will ask if you want to
+retrieve the frames.
address@hidden t
+Emacs/W3 will dispaly the hyperlinks and fetch the frames.
address@hidden table
+
address@hidden w3-bullets
address@hidden w3-bullets
+Emacs/W3 lets @emph{you} decide what characters to use for bullets in
+unordered lists by setting @code{w3-bullets}.  It is a association list,
+mapping list types to characters.  By default it is @code{((disc . ?*)
+(circle . ?o) (square . ?#) (none . ? ))}.
+
address@hidden w3-echo-link
address@hidden w3-echo-link
+You can decide what should be displayed when tabbing through links by
+setting the @code{w3-echo-link} variable.  It is a list and may contain
+the following symbols,
address@hidden @code
address@hidden url
+Display the @sc{url} of the target.
address@hidden text
+Display the text of the link.
address@hidden title
+Display the title attribute of the link.
address@hidden name
+Display the name or id attribute of the link.
address@hidden table
+
+The default is @code{(title url text name)}.
+
address@hidden w3-horizontal-rule-char
address@hidden w3-horizontal-rule-char
+Many @sc{html} pages use horizontal lines (rules) to seperate sections
+of the page.  You can control what character Emacs/W3 will use to draw
+these by setting @code{w3-horizontal-rule-char}.  If it is a character
+(@emph{not} a string) then Emacs/W3 will replicate that character across
+the screen, if it is @code{nil} then Emacs/W3 will use a terminal
+graphics character if possible.  It is @code{nil by default}.
+
address@hidden w3-use-terminal-characters
address@hidden w3-use-terminal-characters
+When Emacs/W3 draws table and rules, it needs to approximate line
+somehow.  If @code{w3-use-terminal-characters} it @code{non-nil} (the
+default) then Emacs/W3 will use terminal graphics characters if they are
+available.
+
address@hidden w3-use-terminal-characters-on-tty
address@hidden w3-use-terminal-characters-on-tty
+Using terminal graphics characters on ttys will trigger display bugs in
+both XEmacs and FSF Emacs, but the display is usually readable with FSF
+Emacs.  @code{w3-use-terminal-characters-on-tty} controls whether to use
+terminal graphics characters on ttys, it is @code{nil} by default.
+
address@hidden w3-use-terminal-glyphs
address@hidden w3-use-terminal-glyphs
+Emacs/W3 can use glyphs rather than text properties for terminal
+graphics characters.  Glyphs do not work with the most recent versions
+of XEmacs.  This is @code{t} by default.
+
address@hidden w3-defined-link-types
address@hidden w3-defined-link-types
address@hidden is a list of names that have special
+significance as the values of @samp{REL} or @samp{REV} attributes of
+<link> elements.  All members should be in lowercase.
+
address@hidden w3-auto-image-alt
address@hidden w3-auto-image-alt
+Some people do not feel it's worth their time to add @code{alt} tags to
+their images, but Emacs/W3 can create @code{alt} tags on the fly for
+images that do not have them.  To control this you can set
address@hidden to one of the following:
address@hidden @asis
address@hidden @code{nil}
+Do not create @code{alt} tags
address@hidden string
+The string will be run through format with the filename of the image and
+so may have a single @code{%s}, for example @code{"[IMAGE(%s)]"} 
address@hidden function
+The function will be called with the filename of the images as the
+argument.  This is the default, with @code{w3-default-image-alt-func}
+being the function.
address@hidden table
+
address@hidden w3-min-img-size, w3-default-image-alt-func, w3-dummy-img-alt-repl
address@hidden w3-min-img-size
address@hidden w3-dummy-img-alt-repl
address@hidden w3-default-image-alt-func
address@hidden returns @code{w3-dummy-img-alt-repl}
+(@samp{*} by default) if the image's height and width are both less than
address@hidden pixels (15 by default) and if the filename
+matches the @code{w3-dummy-img-re} regular expression
+(@samp{"\\b\\(boule\\|bullet\\|dot\\|pebble[0-9]*[a-z]?[0-9]*\\|pixel\\)\\b"}
+by default).  Otherwise, @code{w3-default-image-alt-func} returns the
+filename enclosed in a @samp{[]} pair.
+
address@hidden w3-icon-directory
address@hidden w3-icon-directory
+Emacs/W3 will look for standard icons in the directory specified by
address@hidden  It must end in a slash and is
address@hidden://cs.indiana.edu/elisp/w3/icons/} by default.
+
address@hidden w3-icon-format
address@hidden w3-icon-format
+Emacs/W3 will expect the standard icons to be in the format specified by
address@hidden  This is @code{gif} by default, but could be
address@hidden, @code{xbm} or any other format for that matter.  It is added
+as a file extension to the icon name, but the variable's value must be a
+symbol.  If @code{nil}, then the server decides.
+
address@hidden w3-delay-image-loads
address@hidden w3-delay-image-loads
+You can choose whether Emacs/W3 retrieves images with the document, or
+delays loading them by setting @code{w3-delay-image-loads}.  By default
+this is @code{t} if you compiled XEmacs with support for gifs, jpegs,
+pngs or imagick and @code{nil} otherwise.
+
address@hidden w3-image-mappings
address@hidden w3-image-mappings
address@hidden controls the mapping of @sc{mime} types to
+image types for the @samp{image} package.  Each entry is a cons cell of
+a @sc{mime} type string and an image-type symbol.
+
address@hidden w3-max-menu-length
address@hidden w3-max-menu-length
+Emacs/W3 will split menus into smaller submenus if they are longer than
address@hidden
+
address@hidden w3-max-menu-width
address@hidden w3-max-menu-width
+The maximum width of a pulldown menu choice.
+
address@hidden w3-right-margin
address@hidden w3-right-margin
+Emacs/W3's right margin is controlled by @code{w3-right-margin}.  This
+is subtracted from @code{(window-width)} for each Emacs/W3 buffer and
+used as the fill-column.  It is 2 by default.
+
address@hidden w3-maximum-line-length
address@hidden w3-maximum-line-length
+The maximum length of a line.  If @code{nil} (the default) then lines
+can extend to the window margin.
+
address@hidden w3-modeline-format
address@hidden w3-modeline-format
+You can specify the modeline to use in @samp{w3-mode} by setting this.
+
address@hidden w3-honor-stylesheets
address@hidden w3-honor-stylesheets
+If this is address@hidden (the default) then Emacs/W3 will let a
+document specify a @sc{css} stylesheet.
+
address@hidden w3-user-colors-take-precedence
address@hidden w3-user-colors-take-precedence
+Emacs/W3 will ignore a document's attempts to define certain colours if
address@hidden it address@hidden  The default is @code{nil}.
+
address@hidden w3-user-fonts-take-precedence
address@hidden w3-user-fonts-take-precedence
+Emacs/W3 will ignore attempts by stylesheets or font tags to change
+certain fonts if this is address@hidden
+
address@hidden Asynchronous behaviour
+
address@hidden url-be-asynchronous
address@hidden url-be-asynchronous
+If this is address@hidden then document retrievals over @sc{http} will
+be down in the background.
+
address@hidden url-default-retrieval-proc
address@hidden url-default-retrieval-proc
+This controls what happens when an asynchronous retrievel completes.  It
+is @code{url-default-callback} by default but can be any function taking
+one argument.  The argument specifies the file that has been retrieved.
+If there is no buffer associated with the file, then
address@hidden just puts a message in the minibuffer saying
+that the retrieval is complete, otherwise the action depends on the
+buffer.
+
address@hidden w3-do-incremental-display
address@hidden w3-do-incremental-display
+Emacs/W3 can de incremental display of pages if
address@hidden is @code{t}.  It is @code{nil} by default.
+
address@hidden w3-notify
address@hidden w3-notify
+You might want Emacs/W3 to notify you discreetly when it has finished
+preparing a page for your reading pleasure.  You can control Emacs/W3's
+behaviour in this situation by way of the @code{w3-notify} variable.  It
+may take the following values:
address@hidden @code
address@hidden newframe
+Puts the Emacs/W3 page in its own frame.
address@hidden bully
+Make the Emacs/W3 page the current buffer and only window.
address@hidden semibully
+Make the Emacs/W3 page the current buffer in the same window.  This is
+the default.
address@hidden aggressive
+Make the Emacs/W3 page the current buffer in the other window.
address@hidden friendly
+Display the Emacs/W3 page in the other window, but don't make it the
+current buffer.
address@hidden polite
+Don't display Emacs/W3 page, but print a message when ready and beep.
address@hidden quiet
+The same as @code{polite}, but don't beep.
address@hidden meek
+Make no indication that the page is ready, in fact any other value is
+equivalent to meek.
address@hidden table
+
address@hidden table
+
+
address@hidden Stylesheets, Supported URLs, Display, Top
address@hidden Stylesheets
+The way in which Emacs/W3 formats a document is very customizable.  All
+formatting is now controlled by a default stylesheet set by the user
+with the @code{w3-default-stylesheet} variable.  Emacs/W3 currently
+supports the @sc{W3C} recommendation for Cascading Style Sheets, Level 1
+(commonly known as @sc{CSS1}) with a few experimental items from other
+W3C proposals.  Wherever Emacs/W3 diverges from the specification, it
+will be clearly documented, and will be changed once a full standard is
+available.
+
+Support for @sc{DSSSL} is progressing, but spare time is at an all-time
+low.  If anyone would like to help, please contact the author.
+
+The following sections closely parallel the @sc{CSS1} specification so
+it should be very easy to look up what Emacs/W3 supports when browsing
+through the @sc{CSS1} specification.  Please note that a lot of the text
+in the following sections comes directly from the specification as
+well.
+
address@hidden
+* Terminology::                 Terms used in the rest of this chapter.
+* Basic Concepts::              Why are stylesheets useful?  Getting started.
+* Pseudo-Classes/Elements::     Special classes for elements.
+* The Cascade::                 How stylesheets are combined.
+* Properties::                  What properties you can set on elements.
+* Units::                       What you can set them to.
address@hidden menu
+
address@hidden Terminology, Basic Concepts, Stylesheets, Stylesheets
address@hidden Terminology
+
address@hidden @dfn
address@hidden attribute
+HTML attribute, ie: @samp{align=center} --- align is the attribute.
address@hidden author
+The author of an HTML document.
address@hidden block-level element
+An element which has a line break before and after (e.g. 'H1' in @sc{HTML}).
address@hidden canvas
+The part of the UA's drawing surface onto which documents are rendered.
address@hidden child element
+A subelement in @sc{sgml} terminology.
address@hidden contextual selector
+A selector that matches elements based on their position in the document
+structure. A contextual selector consists of several simple
+selectors. E.g., the contextual selector 'H1.initial B' consists of two
+simple selectors, 'H1.initial' and 'B'.
address@hidden @sc{css}
+Cascading Style Sheets.
address@hidden declaration
+A property (e.g. 'font-size') and a corresponding value (e.g. '12pt').
address@hidden designer
+The designer of a style sheet.
address@hidden document
address@hidden document.
address@hidden element
address@hidden element.
address@hidden element type
+A generic identifier in @sc{sgml} terminology.
address@hidden fictional tag sequence
+A tool for describing the behavior of pseudo-classes and pseudo-elements.
address@hidden font size
+The size for which a font is designed. Typically, the size of a font is
+approximately equal to the distance from the bottom of the lowest letter
+with a descender to the top of the tallest letter with an ascender and
+(optionally) with a diacritical mark.
address@hidden @sc{html} extension
+Markup introduced by UA vendors, most often to support certain visual
+effects. The @sc{font}, @sc{center} and @sc{blink} elements are examples
+of HTML extensions, as is the @sc{bgcolor} attribute. One of the goals
+of @sc{css} is to provide an alternative to @sc{html} extensions.
address@hidden inline element
+An element which does not have a line break before and after
+(e.g. '@sc{strong}' in @sc{html})
address@hidden intrinsic dimensions
+The width and height as defined by the element itself, not imposed by
+the surroundings. In this specification it is assumed that all replaced
+elements -- and only replaced elements -- come with intrinsic
+dimensions.
address@hidden parent element
+The containing element in @sc{sgml} terminology.
address@hidden pseudo-element
+Pseudo-elements are used in @sc{css} selectors to address typographical
+items (e.g. the first line of an element) rather than structural
+elements.
address@hidden pseudo-class
+Pseudo-classes are used in @sc{css} selectors to allow information
+external to the @sc{html} source (e.g. the fact that an anchor has been
+visited or not) to classify elements.
address@hidden property
+A stylistic parameter that can be influenced through @sc{css}.
address@hidden reader
+The person for whom the document is rendered.
address@hidden replaced element
+An element that the @sc{css} formatter only knows the intrinsic
+dimensions of. In @sc{html}, @sc{img}, @sc{input}, @sc{textarea},
address@hidden and @sc{object} elements can be examples of replaced
+elements. E.g., the content of the @sc{img} element is often replaced by
+the image that the @sc{src} attribute points to.  @sc{css1} does not
+define how the intrinsic dimensions are found.
address@hidden rule
+A declaration (e.g. 'font-family: helvetica') and its selector
+(e.g. @sc{'H1'}).
address@hidden selector
+A string that identifies what elements the corresponding rule applies
+to. A selector can either be a simple selector (e.g. 'H1') or a
+contextual selector (e.g. @sc{'h1 b'}) which consists of several simple
+selectors.
address@hidden @sc{sgml}
+Standard Generalized Markup Language, of which @sc{html} is an
+application.
address@hidden simple selector
+A selector that matches elements based on the element type and/or
+attributes, and not the element's position in the document
+structure. E.g., 'H1.initial' is a simple selector.
address@hidden style sheet
+A collection of rules.
address@hidden @sc{ua}
+User Agent, often a web browser or web client.
address@hidden user
+Synonymous with reader.
address@hidden weight
+The priority of a rule.
address@hidden table
+
address@hidden Basic Concepts, Pseudo-Classes/Elements, Terminology, Stylesheets
address@hidden Basic Concepts
+
+Designing simple style sheets is easy. One needs only to know a little
+HTML and some basic desktop publishing terminology. E.g., to set the
+text color of 'H1' elements to blue, one can say:
+
address@hidden 
+  H1 @{ color: blue @}
address@hidden example
+
+The example above is a simple CSS rule. A rule consists of two main
+parts: selector ('H1') and declaration ('color: blue'). The declaration
+has two parts: property ('color') and value ('blue'). While the example
+above tries to influence only one of the properties needed for rendering
+an HTML document, it qualifies as a style sheet on its own. Combined
+with other style sheets (one fundamental feature of CSS is that style
+sheets are combined) it will determine the final presentation of the
+document.
+
+The selector is the link between the HTML document and the style sheet, and
+all HTML element types are possible selectors.
+
address@hidden Pseudo-Classes/Elements, The Cascade, Basic Concepts, Stylesheets
address@hidden Pseudo-Classes/Elements
+
+In @sc{css1}, style is normally attached to an element based on its
+position in the document structure. This simple model is sufficient for
+a wide variety of styles, but doesn't cover some common effects. The
+concept of pseudo-classes and pseudo-elements extend addressing in
address@hidden to allow external information to influence the formatting
+process.
+
+Pseudo-classes and pseudo-elements can be used in @sc{css} selectors,
+but do not exist in the @sc{html} source. Rather, they are "inserted" by
+the @sc{ua} under certain conditions to be used for addressing in style
+sheets. They are referred to as "classes" and "elements" since this is a
+convenient way of describing their behavior. More specifically, their
+behavior is defined by a fictional tag sequence.
+
+Pseudo-elements are used to address sub-parts of elements, while
+pseudo-classes allow style sheets to differentiate between different
+element types.
+
+The only support pseudo-classes in Emacs/W3 are on the anchor tag
+(<a>...</a>).
+
+User agents commonly display newly visited anchors differently from
+older ones. In @sc{css1}, this is handled through pseudo-classes on the
+'A' element:
+
address@hidden
+  A:link @{ color: red @}       /* unvisited link */
+  A:visited @{ color: blue @}   /* visited links */
+  A:active @{ color: lime @}    /* active links */
address@hidden example
+
+All 'A' elements with an 'HREF' attribute will be put into one and only
+one of these groups (i.e. target anchors are not affected). UAs may
+choose to move an element from 'visited' to 'link' after a certain
+time. An 'active' link is one that is currently being selected (e.g. by
+a mouse button press) by the reader.
+
+The formatting of an anchor pseudo-class is as if the class had been
+inserted manually. A @sc{ua} is not required to reformat a currently
+displayed document due to anchor pseudo-class transitions. E.g., a style
+sheet can legally specify that the 'font-size' of an 'active' link
+should be larger that a 'visited' link, but the UA is not required to
+dynamically reformat the document when the reader selects the 'visited'
+link.
+
+Pseudo-class selectors do not match normal classes, and vice versa. The
+style rule in the example below will therefore not have any influence:
+
address@hidden
+  A:link @{ color: red @}
+
+  <A CLASS=link NAME=target5> ... </A>
address@hidden example
+
+In @sc{css1}, anchor pseudo-classes have no effect on elements other
+than 'A'. Therefore, the element type can be omitted from the selector:
+
address@hidden
+  A:link @{ color: red @}
+  :link @{ color: red @}
address@hidden example
+
+The two selectors above will select the same elements in CSS1.
+
+Pseudo-class names are case-insensitive.
+
+Pseudo-classes can be used in contextual selectors:
+
address@hidden
+  A:link IMG @{ border: solid blue @}
address@hidden example
+
+Also, pseudo-classes can be combined with normal classes:
+
address@hidden
+  A.external:visited @{ color: blue @}
+
+  <A CLASS=external HREF="http://out.side/";>external link</A>
address@hidden example
+
+If the link in the above example has been visited, it will be rendered
+in blue. Note that normal class names precede pseudo-classes in the
+selector.
+
address@hidden The Cascade, Properties, Pseudo-Classes/Elements, Stylesheets
address@hidden The Cascade
+
+In @sc{css}, more than one style sheet can influence the presentation
+simultaneously. There are two main reasons for this feature: modularity
+and author/reader balance.
+
address@hidden @i
address@hidden modularity
+A style sheet designer can combine several (partial) style sheets to
+reduce redundancy:
+
address@hidden
+  @@import url(http://www.style.org/pastoral);
+  @@import url(http://www.style.org/marine);
+
+  H1 @{ color: red @}     /* override imported sheets */
address@hidden example
address@hidden author/reader balance
+Both readers and authors can influence the presentation through style
+sheets. To do so, they use the same style sheet language thus reflecting
+a fundamental feature of the web: everyone can become a publisher. The
address@hidden is free to choose the mechanism for referencing personal style
+sheets.
address@hidden table
+
+Sometimes conflicts will arise between the style sheets that influence
+the presentation. Conflict resolution is based on each style rule having
+a weight. By default, the weights of the reader's rules are less than
+the weights of rules in the author's documents. I.e., if there are
+conflicts between the style sheets of an incoming document and the
+reader's personal sheets, the author's rules will be used. Both reader
+and author rules override the @sc{ua}'s default values.
+
+The imported style sheets also cascade with each other, in the order
+they are imported, according to the cascading rules defined below. Any
+rules specified in the style sheet itself override rules in imported
+style sheets. That is, imported style sheets are lower in the cascading
+order than rules in the style sheet itself. Imported style sheets can
+themselves import and override other style sheets, recursively.
+
+In @sc{css1}, all '@@import' statements must occur at the start of a
+style sheet, before any declarations. This makes it easy to see that
+rules in the style sheet itself override rules in the imported style
+sheets.
+
+NOTE: The use of !important in @sc{css} stylesheets is unsupported at
+this time.
+
+Conflicting rules are intrinsic to the CSS mechanism. To find the value
+for an element/property combination, the following algorithm must be
+followed:
+
address@hidden
address@hidden
+Find all declarations that apply to the element/property in
+question. Declarations apply if the selector matches the element in
+question. If no declarations apply, the inherited value is used. If
+there is no inherited value (this is the case for the 'HTML' element and
+for properties that do not inherit), the initial value is used.
address@hidden 
+Sort the declarations by explicit weight: declarations marked
+'!important' carry more weight than unmarked (normal) declarations.
address@hidden
+Sort by origin: the author's style sheets override the reader's style
+sheet which override the UA's default values. An imported style sheet
+has the same origin as the style sheet from which it is imported.
address@hidden
+Sort by specificity of selector: more specific selectors will override
+more general ones. To find the specificity, count the number of ID
+attributes in the selector (a), the number of CLASS attributes in the
+selector (b), and the number of tag names in the selector
+(c). Concatenating the three numbers (in a number system with a large
+base) gives the specificity. Some examples:
address@hidden
+  LI            @address@hidden  /* a=0 b=0 c=1 -> specificity =   1 */
+  UL LI         @address@hidden  /* a=0 b=0 c=2 -> specificity =   2 */
+  UL OL LI      @address@hidden  /* a=0 b=0 c=3 -> specificity =   3 */
+  LI.red        @address@hidden  /* a=0 b=1 c=1 -> specificity =  11 */
+  UL OL LI.red  @address@hidden  /* a=0 b=1 c=3 -> specificity =  13 */ 
+  #x34y         @address@hidden  /* a=1 b=0 c=0 -> specificity = 100 */ 
address@hidden example
+Pseudo-elements and pseudo-classes are counted as normal elements and
+classes, respectively.
address@hidden
+Sort by order specified: if two rules have the same weight, the latter
+specified wins. Rules in imported style sheets are considered to be
+before any rules in the style sheet itself.
address@hidden enumerate
+
+The search for the property value can be terminated whenever one rule
+has a higher weight than the other rules that apply to the same
+element/property combination.
+
+This strategy gives author's style sheets considerably higher weight
+than those of the reader. It is therefore important that the reader has
+the ability to turn off the influence of a certain style sheet,
+e.g. through a pull-down menu.
+
+A declaration in the 'STYLE' attribute of an element has the same weight
+as a declaration with an ID-based selector that is specified at the end
+of the style sheet:
+
address@hidden
+<STYLE TYPE="text/css">
+  #x97z @{ color: blue @}
+</STYLE>
+
+<P ID=x97z STYLE="color: red">
address@hidden example
+
+In the above example, the color of the 'P' element would be
+red. Although the specificity is the same for both declarations, the
+declaration in the 'STYLE' attribute will override the one in the
+'STYLE' element because of cascading rule number 5.
+
+The @sc{ua} may choose to honor other stylistic @sc{html} attributes,
+for example 'ALIGN'. If so, these attributes are translated to the
+corresponding @sc{css} rules with specificity equal to 1. The rules are
+assumed to be at the start of the author style sheet and may be
+overridden by subsequent style sheet rules. In a transition phase, this
+policy will make it easier for stylistic attributes to coexist with
+style sheets.
+
address@hidden Properties, Units, The Cascade, Stylesheets
address@hidden Properties
+
+In the text below, the allowed values for each property are listed
+with a syntax like the following:
+
address@hidden
+      Value: N | NW | NE
+      Value: [ <length> | thick | thin address@hidden,address@hidden
+      Value: <uri>? <color> [ / <color> ]?
+      Value: <uri> || <color>
address@hidden example
+
+The words between < and > give a type of value. The most common types
+are <length>, <percentage>, <url>, <number>and <color> these are
+described in the section on [[units]]. The more specialized types
+(e.g. <font-family>and <border-style>) are described under the property
+where they appear.
+
+Other words are keywords that must appear literally, without quotes. The
+slash (/) and the comma (,) must also appear literally.
+
+Several things juxtaposed mean that all of them must occur, in the given
+order. A bar (|) separates alternatives: one of them must occur. A
+double bar (A || B) means that either A or B or both must occur, in any
+order. Brackets ([]) are for grouping. Juxtaposition is stronger than
+the double bar, and the double bar is stronger than the bar. Thus "a b |
+c || d e" is equivalent to "[ a b ] | [ c || [ d e ]]".
+
+Every type, keyword, or bracketed group may be followed by one of the
+following modifiers:
+
address@hidden @bullet
address@hidden
+An asterisk (*) indicates that the preceding type, word or group is
+repeated zero or more times.
address@hidden
+A plus (+) indicates that the preceding type, word or group is repeated
+one or more times.
address@hidden
+A question mark (?) indicates that the preceding type, word or group is
+optional.
address@hidden
+A pair of numbers in curly braces (@{A,address@hidden) indicates that the 
preceding
+type, word or group is repeated at least A and at most B times.
address@hidden itemize
+
+Other than the value the following information is also shown.
+
address@hidden @columnfractions .20 .8
address@hidden Supported Values: @tab If this is present, it lists the parts of
+the specification that Emacs/W3 currently supports.
address@hidden Unsupported Values: @tab If this is present, it represents the
+parts of the specifcation that Emacs/W3 does not support.
address@hidden Initial: @tab The default value for the property, unless
+explicitly set in a stylesheet.
address@hidden Applies to: @tab What type of elements this property can be 
attached to.
address@hidden Inherited: @tab Yes or no
address@hidden Percentage values: @tab What a percentage value applies to when 
given.
address@hidden multitable
+
address@hidden
+* Font Properties::             Selecting fonts, styles, and sizes.
+* Colors and Backgrounds::      Controlling colors, front and back.
+* Text Properties::             Alignment, decoration, and more!
+* Box Properties::              Borders, padding, and margins, oh my!
+* Classification::              Changing whitespace and display policies.
+* Media Selection::             Conditionalize stylesheets on media-type.
+* Speech Properties::           Speech output controlled by stylesheets.
address@hidden menu
+
address@hidden Font Properties, Colors and Backgrounds, Properties, Properties
address@hidden Font Properties
+
+Setting font properties will be among the most common uses of style
+sheets.  Unfortunately, there exists no well-defined and universally
+accepted taxonomy for classifying fonts, and terms that apply to one
+font family may not be appropriate for others. E.g. 'italic' is commonly
+used to label slanted text, but slanted text may also be labeled as
+being @b{Oblique}, @b{Slanted}, @b{Incline}, @b{Cursive} or
address@hidden Therefore it is not a simple problem to map typical font
+selection properties to a specific font.
+
+The properties defined by CSS1 are described in the following sections.
address@hidden
+* font-family::                 Groups of fonts.
+* font-style::                  Normal, italic, or oblique?
+* font-variant::                Small-caps, etc.
+* font-weight::                 How bold can you go?
+* font-size::                   How big is yours?
+* font::                        Shorthand for all of the above.
address@hidden menu
+
address@hidden font-family, font-style, Font Properties, Font Properties
address@hidden font-family
+
address@hidden @columnfractions .20 .8
address@hidden Supported Values: @tab [[<family-name> | <generic-family>],]* 
[<family-name> | <generic-family>]
address@hidden Initial: @tab User specific
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab yes
address@hidden Percentage values: @tab N/A
address@hidden multitable
+The value is a prioritized list of font family names and/or generic
+family names. Unlike most other CSS1 properties, values are separated
+by a comma to indicate that they are alternatives:
+
address@hidden
+  BODY @{ font-family: gill, helvetica, sans-serif @}
address@hidden example
+
+There are two types of list values:
+
address@hidden @b
address@hidden <family-name>
+The name of a font family of choice. In the last example, "gill" and
+"helvetica" are font families.
address@hidden <generic-family>
+In the example above, the last value is a generic family name. The
+following generic families are defined:
address@hidden @bullet
address@hidden
+'serif' (e.g. Times)
address@hidden
+'sans-serif' (e.g. Helvetica)
address@hidden
+'cursive' (e.g. Zapf-Chancery)
address@hidden
+'fantasy' (e.g. Western)
address@hidden
+'monospace' (e.g. Courier)
address@hidden itemize
address@hidden table
+
+Style sheet designers are encouraged to offer a generic font family as a
+last alternative.
+
+Font names containing whitespace should be quoted:
+
address@hidden
+  BODY @{ font-family: "new century schoolbook", serif @}
+  
+  <BODY STYLE="font-family: 'My own font', fantasy">
address@hidden example
+
+If quoting is omitted, any whitespace characters before and after the
+font name are ignored and any sequence of whitespace characters inside
+the font name is converted to a single space.
+
address@hidden font-style, font-variant, font-family, Font Properties
address@hidden font-style
+
address@hidden @columnfractions .2 .8
address@hidden Supported Values: @tab normal | italic | oblique
address@hidden Initial: @tab normal
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab yes
address@hidden Percentage values: @tab N/A
address@hidden multitable
+
+The 'font-style' property selects between normal (sometimes referred to
+as "roman" or "upright"), italic and oblique faces within a font family.
+
+A value of 'normal' selects a font that is classified as 'normal' in the
+UA's font database, while 'oblique' selects a font that is labeled
+'oblique'. A value of 'italic' selects a font that is labeled 'italic',
+or, if that is not available, one labeled 'oblique'.
+
+The font that is labeled 'oblique' in the UA's font database may
+actually have been generated by electronically slanting a normal font.
+
+Fonts with Oblique, Slanted or Incline in their names will typically be
+labeled 'oblique' in the UA's font database. Fonts with Italic, Cursive
+or Kursiv in their names will typically be labeled 'italic'.
+
address@hidden
+  H1, H2, H3 @{ font-style: italic @}
+  H1 EM @{ font-style: normal @}
address@hidden example
+
+In the example above, emphasized text within 'H1' will appear in a
+normal face.
+
address@hidden font-variant, font-weight, font-style, Font Properties
address@hidden font-variant
+
address@hidden @columnfractions .2 .8
address@hidden Value:             @tab normal | small-caps
address@hidden Initial:           @tab normal
address@hidden Applies to:        @tab all elements
address@hidden Inherited:         @tab yes
address@hidden Percentage values: @tab N/A
address@hidden multitable
+
+Another type of variation within a font family is the small-caps. In a
+small-caps font the lower case letters look similar to the uppercase
+ones, but in a smaller size and with slightly different proportions. The
+'font-variant' property selects that font.
+
+A value of 'normal' selects a font that is not a small-caps font,
+'small-caps' selects a small-caps font. It is acceptable (but not
+required) in CSS1 if the small-caps font is a created by taking a normal
+font and replacing the lower case letters by scaled uppercase
+characters. As a last resort, uppercase letters will be used as
+replacement for a small-caps font.
+
+The following example results in an 'H3' element in small-caps, with
+emphasized words in oblique small-caps:
+
address@hidden
+  H3 @{ font-variant: small-caps @}
+  EM @{ font-style: oblique @}
address@hidden example
+
+There may be other variants in the font family as well, such as fonts
+with old-style numerals, small-caps numerals, condensed or expanded
+letters, etc. CSS1 has no properties that select those.
+
address@hidden font-weight, font-size, font-variant, Font Properties
address@hidden font-weight
+
address@hidden @columnfractions .2 .8
address@hidden Supported Values: @tab normal | bold | 100 | 200 | 300 | 400 | 
500 | 600 | 700 | 800 | 900
address@hidden Unsupported Values: @tab bolder | lighter
address@hidden Initial: @tab normal
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab yes
address@hidden Percentage values: @tab N/A
address@hidden multitable
+
+The 'font-weight' property selects the weight of the font. The values
+'100' to '900' form an ordered sequence, where each number indicates a
+weight that is at least as dark as its predecessor. The keyword 'normal'
+is synonymous with '400', and 'bold' is synonymous with '700'. Keywords
+other than 'normal' and 'bold' have been shown to be often confused with
+font names and a numerical scale was therefore chosen for the 9-value
+list.
+
address@hidden
+  P @{ font-weight: normal @}   /* 400 */
+  H1 @{ font-weight: 700 @}     /* bold */
address@hidden example
+
+The 'bolder' and 'lighter' values select font weights that are relative
+to the weight inherited from the parent:
+
address@hidden
+  STRONG @{ font-weight: bolder @}
address@hidden example
+
+There is no guarantee that there will be a darker face for each of the
+'font-weight' values; for example, some fonts may have only a normal and
+a bold face, others may have eight different face weights. There is no
+guarantee on how a UA will map font faces within a family to weight
+values. The only guarantee is that a face of a given value will be no
+less dark than the faces of lighter values.
+
address@hidden font-size, font, font-weight, Font Properties
address@hidden font-size
+
address@hidden @columnfractions .2 .8
address@hidden Supported Values: @tab <absolute-size> | <length>
address@hidden Unsupported Values: @tab <percentage> | <relative-size>
address@hidden Initial: @tab medium
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab yes
address@hidden Percentage values: @tab relative to parent element's font size
address@hidden multitable
+
address@hidden @b
address@hidden <absolute-size>
+An <absolute-size> keyword is an index to a table of font sizes computed
+and kept by the UA. Possible values are:
address@hidden @bullet
address@hidden
+xx-small
address@hidden
+x-small
address@hidden
+small
address@hidden
+medium
address@hidden
+large
address@hidden
+x-large
address@hidden
+xx-large
address@hidden itemize
+
+On a computer screen a scaling factor of 1.5 is suggested between
+adjacent indexes; if the 'medium' font is 10pt, the 'large' font could
+be 15pt. Different media may need different scaling factors. Also, the
+UA should take the quality and availability of fonts into account when
+computing the table. The table may be different from one font family to
+another.
address@hidden <relative-size>
+A <relative-size> keyword is interpreted relative to the table of font
+sizes and the font size of the parent element. Possible values are
address@hidden or @b{smaller}. For example, if the parent element has a font
+size of 'medium', a value of 'larger' will make the font size of the
+current element be 'large'. If the parent element's size is not close to
+a table entry, the UA is free to interpolate between table entries or
+round off to the closest one. The UA may have to extrapolate table
+values if the numerical value goes beyond the keywords.
address@hidden table
+
+Length and percentage values should not take the font size table into
+account when calculating the font size of the element.
+
+Negative values are not allowed.
+
+On all other properties, 'em' and 'ex' length values refer to the font
+size of the current element. On the 'font-size' property, these length
+units refer to the font size of the parent element.
+
+Note that an application may reinterpret an explicit size, depending on
+the context. E.g., inside a VR scene a font may get a different size
+because of perspective distortion.
+
+Examples:
+
address@hidden
+  P @{ font-size: 12pt; @}
+  BLOCKQUOTE @{ font-size: larger @}
+  EM @{ font-size: 150% @}
+  EM @{ font-size: 1.5em @}
address@hidden example
+
+If the suggested scaling factor of 1.5 is used, the last three
+declarations are identical.
+
address@hidden font,  , font-size, Font Properties
address@hidden font
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab [ <font-style> || <font-variant> || <font-weight> ]? 
<font-size> [ / <line-height> ]? <font-family>
address@hidden Initial: @tab not defined for shorthand properties
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab yes
address@hidden Percentage values: @tab allowed on <font-size> and <line-height>
address@hidden multitable
+The 'font' property is a shorthand property for setting 'font-style'
+'font-variant' 'font-weight' 'font-size', 'line-height' and
+'font-family' at the same place in the style sheet. The syntax of this
+property is based on a traditional typographical shorthand notation to
+set multiple properties related to fonts.
+
+For a definition of allowed and initial values, see the previously
+defined properties. Properties for which no values are given are set to
+their initial value.
+
address@hidden
+  P @{ font: 12pt/14pt sans-serif @}
+  P @{ font: 80% sans-serif @}
+  P @{ font: x-large/110% "new century schoolbook", serif @}
+  P @{ font: bold italic large Palatino, serif @}
+  P @{ font: normal small-caps 120%/120% fantasy @}
address@hidden example
+
+In the second rule, the font size percentage value ('80%') refers to the
+font size of the parent element. In the third rule, the line height
+percentage refers to the font size of the element itself.
+
+In the first three rules above, the 'font-style', 'font-variant' and
+'font-weight' are not explicitly mentioned, which means they are all
+three set to their initial value ('normal'). The fourth rule sets the
+'font-weight' to 'bold', the 'font-style' to 'italic' and implicitly
+sets 'font-variant' to 'normal'.
+
+The fifth rule sets the 'font-variant' ('small-caps'), the 'font-size'
+(120% of the parent's font), the 'line-height' (120% times the font
+size) and the 'font-family' ('fantasy'). It follows that the keyword
+'normal' applies to the two remaining properties: 'font-style' and
+'font-weight'.
+
address@hidden Colors and Backgrounds, Text Properties, Font Properties, 
Properties
address@hidden Colors and Backgrounds
+
+These properties describe the color (often called foreground color) and
+background of an element (i.e. the surface onto which the content is
+rendered). One can set a background color and/or a background image. The
+position of the image, if/how it is repeated, and whether it is fixed or
+scrolled relative to the canvas can also be set.
+
+The 'color' property inherits normally. The background properties do not
+inherit, but the parent element's background will shine through by
+default because of the initial 'transparent' value on
+'background-color'.
+
+NOTE: Currently, Emacs/W3 can only show background images under XEmacs.
+Emacs 19 doesn't have the support in its display code yet.
+
address@hidden
+* color::                       Foreground colors.
+* background-color::            Background colors.
+* background-image::            Background images.
+* background-repeat::           Controlling repeating of background images.
+* background-attachment::       Where background images are drawn.
+* background-position::         Where background images are drawn.
+* background::                  Shorthand for all background properties.
address@hidden menu
+
address@hidden color, background-color, Colors and Backgrounds, Colors and 
Backgrounds
address@hidden color
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab <color>
address@hidden Initial: @tab User specific
address@hidden Applies to: @tab  all elements
address@hidden Inherited: @tab yes
address@hidden Percentage values: @tab N/A
address@hidden multitable
+
+This property describes the text color of  an element (often referred to
+as the foreground color). There are different ways to specify red:
+
address@hidden
+  EM @{ color: red @}              /* natural language */
+  EM @{ color: rgb(255,0,0) @}     /* RGB range 0-255   */
address@hidden example
+
+See @ref{Color Units} for a description of possible color values.
+
address@hidden background-color, background-image, color, Colors and Backgrounds
address@hidden background-color
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab <color> | transparent
address@hidden Initial: @tab transparent
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab no
address@hidden Percentage values: @tab N/A
address@hidden multitable
+
+This property sets the background color of an element.
+
address@hidden
+  H1 @{ background-color: #F00 @}
address@hidden example
+
address@hidden background-image, background-repeat, background-color, Colors 
and Backgrounds
address@hidden background-image
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab <url> | none
address@hidden Initial: @tab none
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab no
address@hidden Percentage values: @tab N/A
address@hidden multitable
+
+This property sets the background image of an element. When setting a
+background image, one should also set a background color that will be
+used when the image is unavailable. When the image is available, it is
+overlaid on top of the background color.
+
address@hidden
+  BODY @{ background-image: url(marble.png) @}
+  P @{ background-image: none @}
address@hidden example
+
address@hidden background-repeat, background-attachment, background-image, 
Colors and Backgrounds
address@hidden background-repeat
+
+This property is not supported at all under Emacs/W3.
+
address@hidden background-attachment, background-position, background-repeat, 
Colors and Backgrounds
address@hidden background-attachment
+
+This property is not supported at all under Emacs/W3.
+
address@hidden background-position, background, background-attachment, Colors 
and Backgrounds
address@hidden background-position
+
+This property is not supported at all under Emacs/W3.
+
address@hidden background,  , background-position, Colors and Backgrounds
address@hidden background
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab <background-color> || <background-image> || 
<background-repeat> || <background-attachment> || <background-position>
address@hidden Initial: @tab not defined for shorthand properties
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab no
address@hidden Percentage values: @tab allowed on <background-position>
address@hidden multitable
+
+The 'background' property is a shorthand property for setting the
+individual background properties (i.e., 'background-color',
+'background-image', 'background-repeat', 'background-attachment' and
+'background-position') at the same place in the style sheet.
+
+Possible values on the 'background' properties are the set of all
+possible values on the individual properties.
+
address@hidden 
+  BODY @{ background: red @}
+  P @{ background: url(chess.png) gray 50% repeat fixed @}
address@hidden example
+
+The 'background' property always sets all the individual background
+properties. In the first rule of the above example, only a value for
+'background-color' has been given and the other individual properties
+are set to their initial value. In the second rule, all individual
+properties have been specified.
+
address@hidden Text Properties, Box Properties, Colors and Backgrounds, 
Properties
address@hidden Text Properties
+
address@hidden
+* word-spacing::                
+* letter-spacing::              
+* text-decoration::             
+* vertical-align::              
+* text-transform::              
+* text-align::                  
+* text-indent::                 
+* line-height::                 
address@hidden menu
+
address@hidden word-spacing, letter-spacing, Text Properties, Text Properties
address@hidden word-spacing
+
address@hidden @columnfractions .2 .8
address@hidden Supported Values: @tab normal
address@hidden Unsupported Values: @tab <length>
address@hidden Initial: @tab normal
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab yes
address@hidden Percentage values: @tab N/A
address@hidden multitable
+
+The length unit indicates an addition to the default space between
+words. Values can be negative, but there may be implementation-specific
+limits. The UA is free to select the exact spacing algorithm. The word
+spacing may also be influenced by justification (which is a value of the
+'align' property).
+
address@hidden
+  H1 @{ word-spacing: 0.4em @}
address@hidden example
+
+Here, the word-spacing between each word in 'H1' elements would be
+increased by '1em'.
+
+NOTE: Emacs/W3 cannot currently support this, due to limitations in
+Emacs.  It may  be implemented in the future.
+
address@hidden letter-spacing, text-decoration, word-spacing, Text Properties
address@hidden letter-spacing
+
address@hidden @columnfractions .2 .8
address@hidden Supported Values: @tab normal
address@hidden Unsupported Values: @tab <length>
address@hidden Initial: @tab normal
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab yes
address@hidden Percentage values: @tab N/A
address@hidden multitable
+
+The length unit indicates an addition to the default space between
+characters. Values can be negative, but there may be
+implementation-specific limits. The UA is free to select the exact
+spacing algorithm. The letter spacing may also be influenced by
+justification (which is a value of the 'align' property).
+
address@hidden
+  BLOCKQUOTE @{ letter-spacing: 0.1em @}
address@hidden example
+
+Here, the letter-spacing between each character in 'BLOCKQUOTE' elements
+would be increased by '0.1em'.
+
+NOTE: Emacs/W3 cannot currently support this, due to limitations in
+Emacs.  It may be implemented in the future.
+
address@hidden text-decoration, vertical-align, letter-spacing, Text Properties
address@hidden text-decoration
+
address@hidden @columnfractions .2 .8
address@hidden Supported Values: @tab none | underline | line-through | blink
address@hidden Unsupported Values: @tab overline 
address@hidden Initial: @tab none
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab no, but see clarification below
address@hidden Percentage values: @tab N/A
address@hidden multitable
+
+This property describes decorations that are added to the text of an
+element. If the element has no text (e.g. the 'IMG' element in HTML) or
+is an empty element (e.g. '<EM></EM>'), this property has no effect. A
+value of 'blink' causes the text to blink.
+
+The color(s) required for the text decoration should be derived from the
+'color' property value.
+
+This property is not inherited, but elements should match their
+parent. E.g., if an element is underlined, the line should span the
+child elements. The color of the underlining will remain the same even
+if descendant elements have different 'color' values.
+
address@hidden
+  A:link, A:visited, A:active @{ text-decoration: underline @}
address@hidden example
+
+The example above would underline the text of all links (i.e., all 'A'
+elements with a 'HREF' attribute).
+
+NOTE: The 'line-through' property is only supported under XEmacs
+currently.  A patch has been sent to the Emacs maintainers to add
+support for this, but it has not made it into the main distribution
+yet.
+
address@hidden vertical-align, text-transform, text-decoration, Text Properties
address@hidden vertical-align
+
+This is currently unsupported in Emacs/W3.
+
address@hidden text-transform, text-align, vertical-align, Text Properties
address@hidden text-transform
+
address@hidden @columnfractions .2 .8
address@hidden Supported Values: @tab none
address@hidden Unsupported Values: @tab capitalize | uppercase | lowercase
address@hidden Initial: @tab none
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab yes
address@hidden Percentage values: @tab N/A
address@hidden multitable
+
address@hidden @b
address@hidden 'capitalize'
+Uppercases the first character of each word.
address@hidden 'uppercase'
+Uppercases all letters of the element.
address@hidden 'lowercase'
+Lowercases all letters of the element.
address@hidden 'none'
+Neutralizes inherited value.
address@hidden table
+
+The actual transformation in each case is human language dependent.
+
address@hidden
+  H1 @{ text-transform: uppercase @}
address@hidden example
+
+The example above would put 'H1' elements in uppercase text.
+
+NOTE: This capability was in the previous version of Emacs/W3, but has
+not been reimplemented in the new display code yet.  Please feel free to
+send me patches.
+
address@hidden text-align, text-indent, text-transform, Text Properties
address@hidden text-align
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab left | right | center | justify
address@hidden Initial: @tab User specific
address@hidden Applies to: @tab block-level elements
address@hidden Inherited: @tab yes
address@hidden Percentage values: @tab N/A
address@hidden multitable
+
+This property describes how text is aligned within the element. The
+actual justification algorithm used is UA and human language dependent.
+
+Example:
address@hidden
+  DIV.center @{ text-align: center @}
address@hidden example
+
+Since 'text-align' inherits, all block-level elements inside the 'DIV'
+element with 'CLASS=center' will be centered. Note that alignments are
+relative to the width of the element, not the canvas.
+
address@hidden text-indent, line-height, text-align, Text Properties
address@hidden text-indent
+
+Not currently implemented in Emacs/W3.
+
address@hidden line-height,  , text-indent, Text Properties
address@hidden line-height
+
+Not currently implemented in Emacs/W3.
+
address@hidden Box Properties, Classification, Text Properties, Properties
address@hidden Box Properties
+
address@hidden @columnfractions .2 .8
address@hidden multitable
+
address@hidden Classification, Media Selection, Box Properties, Properties
address@hidden Classification
+
+These properties classify elements into categories more than they set
+specific visual parameters.
+
+The list-style properties describe how list items (i.e. elements with a
+'display' value of 'list-item') are formatted. The list-style properties
+can be set on any element, and it will inherit normally down the
+tree. However, they will only be have effect on elements with a
+'display' value of 'list-item'. In HTML this is typically the case for
+the 'LI' element.
+
address@hidden
+* display::                     
+* white-space::                 
+* list-style-type::             
+* list-style-image::            
+* list-style-position::         
+* list-style::                  
address@hidden menu
+
address@hidden display, white-space, Classification, Classification
address@hidden display
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab block | inline | list-item | none
address@hidden Extensions: @tab line
address@hidden Initial: @tab inline
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab no
address@hidden Percentage values: @tab N/A
address@hidden multitable
+
+This property describes how/if an element is displayed on the canvas
+(which may be on a printed page, a computer display etc.).
+
+An element with a 'display' value of 'block' opens whitespace suitable
+for a paragraph break.  Typically, elements like 'H1' and 'P' are of
+type 'block'. A value of 'list-item' is similar to 'block' except that a
+list-item marker is added. In HTML, 'LI' will typically have this value.
+
+An element with a 'display' value of 'inline' results in a new inline
+box on the same line as the previous content.
+
+A value of 'none' turns off the display of the element, including
+children elements and the surrounding box.
+
address@hidden
+  P @{ display: block @}
+  EM @{ display: inline @}
+  LI @{ display: list-item @}
+  IMG @{ display: none @}
address@hidden example
+
+The last rule turns off the display of images.
+
+A value of 'line' results in a single line break.  Emacs/W3 needs this
+extension to be able to fully specify the behaviour of @sc{br} and
address@hidden elements within a stylesheet.
+
+NOTE: Emacs/W3 defaults to using 'inline' for this property, which is a
+slight deviation from the specification.
+
address@hidden white-space, list-style-type, display, Classification
address@hidden white-space
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab normal | pre | nowrap
address@hidden Initial: @tab normal
address@hidden Applies to: @tab block-level elements
address@hidden Inherited: @tab yes
address@hidden Percentage values: @tab N/A
address@hidden multitable
+
+This property declares how whitespace inside the element is handled: the
+'normal' way (where whitespace is collapsed), as 'pre' (which behaves
+like the 'PRE' element in HTML) or as 'nowrap' (where wrapping is done
+only through BR elements):
+
address@hidden
+  PRE @{ white-space: pre @}
+  P   @{ white-space: normal @}
address@hidden example
+
address@hidden list-style-type, list-style-image, white-space, Classification
address@hidden list-style-type
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab disc | circle | square | decimal | lower-roman | 
upper-roman | lower-alpha | upper-alpha | none
address@hidden Initial: @tab disc
address@hidden Applies to: @tab elements with 'display' value 'list-item'
address@hidden Inherited: @tab yes
address@hidden Percentage values: @tab N/A
address@hidden multitable
+
+This property is used to determine the appearance of the list-item
+marker if 'list-style-image' is 'none' or if the image pointed to by the
+URL cannot be displayed.
+
+Fo example:
address@hidden
+  OL @{ list-style-type: decimal @}       /* 1 2 3 4 5 etc. */
+  OL @{ list-style-type: lower-alpha @}   /* a b c d e etc. */
+  OL @{ list-style-type: lower-roman @}   /* i ii iii iv v etc. */
address@hidden example
+
address@hidden list-style-image, list-style-position, list-style-type, 
Classification
address@hidden list-style-image
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab <url> | none
address@hidden Initial: @tab none
address@hidden Applies to: @tab elements with 'display' value 'list-item'
address@hidden Inherited: @tab yes
address@hidden Percentage values: @tab N/A
address@hidden multitable
+
+This property sets the image that will be used as the list-item
+marker. When the image is available it will replace the marker set with
+the 'list-style-type' marker.
+
+NOTE: This is currently unimplemented in Emacs/W3.
+
address@hidden
+  UL @{ list-style-image: url(http://png.com/ellipse.png) @}
address@hidden example
+
address@hidden list-style-position, list-style, list-style-image, Classification
address@hidden list-style-position
+
address@hidden @columnfractions .2 .8
address@hidden Supported Values: @tab outside
address@hidden Unsupported Values: @tab inside
address@hidden Initial: @tab outside
address@hidden Applies to: @tab elements with 'display' value 'list-item'
address@hidden Inherited: @tab yes
address@hidden Percentage values: @tab N/A
address@hidden multitable
+
+The value of 'list-style-position' determines how the list-item marker
+is drawn with regard to the content. For a formatting example see
+section 4.1.3.
+
address@hidden list-style,  , list-style-position, Classification
address@hidden list-style
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab <keyword> || <position> || <url>
address@hidden Initial: @tab not defined for shorthand properties
address@hidden Applies to: @tab elements with 'display' value 'list-item'
address@hidden Inherited: @tab yes
address@hidden Percentage values: @tab N/A
address@hidden multitable
+
+The 'list-style' property is a shorthand notation for setting the three
+properties 'list-style-type', 'list-style-image' and
+'list-style-position' at the same place in the style sheet.
+
address@hidden
+  UL @{ list-style: upper-roman inside @}
+  UL UL @{ list-style: circle outside @}
+  LI.square @{ list-style: square @}
address@hidden example
+
+Setting 'list-style' directly on 'LI' elements can have unexpected
+results. Consider:
+
address@hidden
+  <STYLE TYPE="text/css">
+    OL.alpha LI  @{ list-style: lower-alpha @}
+    UL LI        @{ list-style: disc @}
+  </STYLE>
+  <BODY>
+    <OL CLASS=alpha>
+      <LI>level 1
+      <UL>
+         <LI>level 2
+      </UL>
+    </OL>
+  </BODY>
address@hidden example
+
+Since the specificity (as defined in the cascading order) is higher for
+the first rule in the style sheet in the example above, it will override
+the second rule on all 'LI' elements and only 'lower-alpha' list styles
+will be used. It is therefore recommended to set 'list-style' only on
+the list type elements:
+
address@hidden
+  OL.alpha  @{ list-style: lower-alpha @}
+  UL        @{ list-style: disc @}
address@hidden example
+
+In the above example, inheritance will transfer the 'list-style' values
+from 'OL' and 'UL' elements to 'LI' elements.
+
+A URL value can be combined with any other value:
+
address@hidden
+  UL @{ list-style: url(http://png.com/ellipse.png) disc @}
address@hidden example
+
+In the example above, the 'disc' will be used when the image is
+unavailable.
+
address@hidden Media Selection, Speech Properties, Classification, Properties
address@hidden Media Selection
+
+To specify that a stylesheet declaration should only apply when using a
+certain media type (ie: different font families preferred when printing
+versus on-screen presentation), the declarations should be wrapped in
+the proposed @b{@@media} directive.
+
+The @@media directive takes two arguments, the media type, and a block
+of style declarations.
+
address@hidden
+  @@media print @{ 
+    BODY @{ font-size: 10pt @}
+    H1 @{ font-size: 14pt @}
+  @}
address@hidden example
+The '@@media' construct also allows to put include style sheet rules
+for various media in the same style sheet:
+
address@hidden
+  @@media print @{
+    BODY @{ font-size: 10pt @}
+  @}
+  @@media screen @{
+    BODY @{ font-size: 12pt @}
+  @}
address@hidden example
+
+Currently, the following media types are defined.
address@hidden @b
address@hidden Print
+Output for paged opaque material, and for documents viewed on screen in
+print preview mode.
address@hidden Screen
+A continuous presentation for computer screens.
address@hidden Projector
+Paged presentation for projected presentations.
address@hidden Braille
+For braille tactile feedback devices.
address@hidden Speech
+Aural presentation.
address@hidden Light
+The stylesheet will only be applied if the user is using a light background.
address@hidden Dark
+The stylesheet will only be applied if the user is using a dark background.
address@hidden Emacs
+The stylesheet will only be applied if the user is running in Emacs 19.
address@hidden XEmacs
+The stylesheet will only be applied if the user is running in XEmacs 19.
address@hidden All
+The default value, the style sheet applies to all output devices.
address@hidden table
+
address@hidden Speech Properties,  , Media Selection, Properties
address@hidden Speech Properties
+
+Those of us who are sighted are accustomed to visual presentation of
address@hidden documents, frequently on a bitmapped display. This is not the
+only possible presentation method, however. Aural presentation, using a
+combination of speech synthesis and 'audio icons', provides an
+alternative presentation. This form of presentation is in current use by
+the blind and print-impaired communities.
+
+Often such aural presentation occurs by converting the document to plain
+text and feeding this to a 'screen reader' -- software or hardware that
+simply reads all the characters on the screen. This results in less
+effective presentation than would be the case if the document structure
+were retained.
+
+There are other large markets for aural presentation, including in-car
+and home entertainment use; aurual or mixed aural/visual presentation is
+thus likely to increase in importance over the next few years. Realizing
+that that the aural rendering is essentially independent of the visual
+rendering:
+
address@hidden @bullet
address@hidden
+Allows orthogonal aural and visual views.
address@hidden
+Allows browsers to optionally implement both aural and visual views to
+produce truly multimodal documents.
address@hidden itemize
+
address@hidden
+* volume::                      
+* pause-before::                
+* pause-after::                 
+* pause::                       
+* cue-before::                  
+* cue-after::                   
+* cue::                         
+* play-during::                 
+* speed::                       
+* voice-family::                
+* pitch::                       
+* pitch-range::                 
+* stress::                      
+* richness::                    
+* speak-punctuation::           
+* speak-date::                  
+* speak-numeral::               
+* speak-time::                  
address@hidden menu
+
address@hidden volume, pause-before, Speech Properties, Speech Properties
address@hidden volume
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab <percentage> | mute | x-soft | soft | medium | loud 
| x-loud
address@hidden Initial: @tab medium
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab yes
address@hidden Percentage values: @tab relative to user-specified mapping
address@hidden multitable
+
+The legal range of percentage values is 0% to 100%. There is a fixed
+mapping between keyword values and percentages:
+
address@hidden @bullet
address@hidden
+'x-soft' = '0%'
address@hidden
+'soft' = '25%'
address@hidden
+'medium' = '50%'
address@hidden
+'loud' = '75%'
address@hidden
+'x-loud' = '100%'
address@hidden itemize
+
+Volume refers to the median volume of the waveform. In other words, a
+highly inflected voice at a volume of 50 might peak well above
+that. Note that '0%' does not mean the same as "mute". 0% represents the
+minimum audible volume level and 100% corresponds to the maximum
+comfortable level. The UA should allow the values corresponding to 0%
+and 100% to be set by the user. Suitable values depend on the equipment
+in use (speakers, headphones), the environment (in car, home theater,
+library) and personal preferences. Some examples:
+
address@hidden @bullet
address@hidden
+A browser for in-car use has a setting for when there is lots of
+background noise . 0% would map to a fairly high level and 100% to a
+quite high level. The overall values are likely to be human adjustable
+for comfort, for example with a physical volume control: what this
+proposal does is adjust the dynamic range.
address@hidden
+Another speech browser is being used in the home, late at night, (don't
+annoy the neighbors) or in a shared study room. 0% is set to very quiet
+and 100% to a fairly quiet level, too. As with the first example, there
+is a low slope; the dynamic range is reduced. The actual volumes are low
+here, wheras they were high in the first example.
address@hidden
+In a quiet and isolated house, an expensive hifi home theatre setup. 0%
+is set fairly low and 100% to quite high; there is wide dynamic range.
address@hidden itemize
+
+The same authors stylesheet could be used in all cases, simply by
+mapping the 0 and 100 points suitably at the client side.
+
address@hidden pause-before, pause-after, volume, Speech Properties
address@hidden pause-before
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab <time> | <percentage>
address@hidden Initial: @tab UA specific
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab no
address@hidden Percentage values: @tab speed
address@hidden multitable
+
+This property specifies the pause before elements. It may be given in an
+absolute units (seconds, milliseconds) or as a relative value in which
+case it is relative to the reciprocal of the 'speed' property: if speed
+is 120 words per minute (ie a word takes half a second -- 500
+milliseconds) then a pause-before of 100% means a pause of 500 ms and a
+pause-before of 20% means 100ms.
+
+Using relative units gives more robust stylesheets in the face of large
+changes in speed.
+
address@hidden pause-after, pause, pause-before, Speech Properties
address@hidden pause-after
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab <time> | <percentage>
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab no
address@hidden Percentage values: @tab speed
address@hidden multitable
+
+This property specifies the pause after elements. Values are specified
+the same way as 'pause-before'.
+
address@hidden pause, cue-before, pause-after, Speech Properties
address@hidden pause
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab [<time> | <percentage> address@hidden,address@hidden;
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab no
address@hidden Percentage values: @tab speed
address@hidden multitable
+
+The 'pause' property is a shorthand for setting 'pause-before' and
+'pause-after'. The first value is pause-before and the second is
+pause-after. If only one value is given, it applies to both properties.
+
+Examples:
+
address@hidden
+  H1 @{ pause: 20ms @}       /* pause-before: 20ms; pause-after: 20ms */
+  H2 @{ pause: 30ms 40ms @}  /* pause-before: 30ms; pause-after: 40ms */
+  H3 @{ pause-after: 10ms @} /* pause-before: ?;    pause-after: 10ms */
address@hidden example
+
address@hidden cue-before, cue-after, pause, Speech Properties
address@hidden cue-before
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab <url> | none
address@hidden Initial: @tab none
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab no
address@hidden multitable
+Auditory icons are another way to distinguish semantic elements. Sounds
+may be played before, and/or after the element to delimit it. The same
+sound can be used both before and after, using the cue property.
+
+Examples:
+
address@hidden
+  A  @{ cue-before: url(bell.aiff); cue-after: url(dong.wav) @}
+  H1 @{ cue-before: url(pop.au); cue-after: url(pop.au) @}
+  H1 @{ cue: url(pop.au) @}  /* same as previous */
address@hidden example
+
address@hidden cue-after, cue, cue-before, Speech Properties
address@hidden cue-after
+
address@hidden
+
address@hidden cue, play-during, cue-after, Speech Properties
address@hidden cue
+
address@hidden
+
address@hidden play-during, speed, cue, Speech Properties
address@hidden cue-during
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab <url> | mix | none
address@hidden Initial: @tab mix
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab no
address@hidden multitable
+Similar to the cue-before and cue-after properties, this indicates sound
+to be played during an element as a background (ie the sound is mixed in
+with the speech).
+
+Examples:
+
address@hidden
+  BLOCKQUOTE.sad @{ cue-during: url(violins.aiff) @}
address@hidden example
+
address@hidden speed, voice-family, play-during, Speech Properties
address@hidden speed
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab <words-per-minute> | x-slow | slow | medium | fast | 
x-fast | faster | slower
address@hidden Initial: @tab medium
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab yes
address@hidden multitable
+
+Specifies the speaking rate. Note that both absolute and relative
+keyword values are allowed (compare with @ref{font-weight}).
+
address@hidden voice-family, pitch, speed, Speech Properties
address@hidden voice-family
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab [[<specific-voice> | <generic-voice>],]* 
[<specific-voice> | <generic-voice>]
address@hidden Initial: @tab device-specific
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab yes
address@hidden multitable
+
+The value is a prioritized list of voice family names. Generic families
+are male, female, and child.
+
+Examples of specific voice families are: comedian, paul, lisa
+
+Examples
+
address@hidden
+  H1 @{ voice-family: announcer, male @}
+  P.part.romeo @{ voice-family: romeo, male @}
+  P.part.juliet @{ voice-family: juliet, female @}
address@hidden example
+
address@hidden pitch, pitch-range, voice-family, Speech Properties
address@hidden pitch
+
address@hidden @columnfractions .2 .8
address@hidden multitable
+
address@hidden pitch-range, stress, pitch, Speech Properties
address@hidden pitch-range
+
address@hidden @columnfractions .2 .8
address@hidden multitable
+
address@hidden stress, richness, pitch-range, Speech Properties
address@hidden stress
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab <percentage>
address@hidden Initial: @tab medium
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab yes
address@hidden multitable
+
+Specifies the level of stress (assertiveness or emphasis) of the
+speaking voice. English is a stressed language, and different parts of a
+sentence are assigned primary, secondary or tertiary stress. The value
+of property 'stress' controls the amount of inflection that results from
+these stress markers.
+
+Increasing the value of this property results in the speech being more
+strongly inflected. It is in a sense dual to property 'pitch-range' and
+is provided to allow developers to exploit higher-end auditory displays.
+
address@hidden richness, speak-punctuation, stress, Speech Properties
address@hidden richness
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab <percentage>
address@hidden Initial: @tab medium (50%)
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab yes
address@hidden multitable
+
+Specifies the richness (brightness) of the speaking voice. Different
+speech devices may require the setting of one or more device-specific
+parameters to achieve this effect.
+
+The effect of increasing richness is to produce a voice that carries --
+reducing richness produces a soft, mellifluous voice.
+
address@hidden speak-punctuation, speak-date, richness, Speech Properties
address@hidden speak-punctuation
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab code | none
address@hidden Initial: @tab none
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab yes
address@hidden multitable
+
+'code' indicates that punctuation such as semicolons, braces, and so on
+are to be spoken literally. The default value of 'none' means that
+punctuation is not spoken but instead is rendered naturally as various
+pauses.
+
address@hidden speak-date, speak-numeral, speak-punctuation, Speech Properties
address@hidden speak-date
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab myd | dmy | ymd | none
address@hidden Initial: @tab none
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab no
address@hidden multitable
+
+This is a hint that the element contains a date and also how that date
+should be spoken. month-day-year is common in the USA, while
+day-month-year is common in Europe and year-month-day is also used.
+
+This should really be an HTML tag not a stylesheet property, since it
+gives semantic information about the content.
+
address@hidden speak-numeral, speak-time, speak-date, Speech Properties
address@hidden speak-numeral
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab digits | continous
address@hidden Initial: @tab none
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab yes
address@hidden multitable
+
address@hidden speak-time,  , speak-numeral, Speech Properties
address@hidden speak-time
+
address@hidden @columnfractions .2 .8
address@hidden Value: @tab 24 | 12 | none
address@hidden Initial: @tab none
address@hidden Applies to: @tab all elements
address@hidden Inherited: @tab yes
address@hidden multitable
+
address@hidden Units,  , Properties, Stylesheets
address@hidden Units
+
address@hidden
+* Length Units::                
+* Percentage Units::            
+* Color Units::                 
+* URLs::                        
+* Angle Units::                 
+* Time Units::                  
address@hidden menu
+
address@hidden Length Units, Percentage Units, Units, Units
address@hidden Length Units
+
address@hidden Percentage Units, Color Units, Length Units, Units
address@hidden Percentage Units
+
address@hidden Color Units, URLs, Percentage Units, Units
address@hidden color Units
+
address@hidden URLs, Angle Units, Color Units, Units
address@hidden URLs
+
address@hidden Angle Units, Time Units, URLs, Units
address@hidden Angle Units
+
+These are the legal angle units:
address@hidden @bullet
address@hidden
+deg: degrees
address@hidden
+grad
address@hidden
+rad: radians
address@hidden itemize
+
address@hidden Time Units,  , Angle Units, Units
address@hidden Time Units
+
+These are the legal time units:
+
address@hidden @bullet
address@hidden
+ms: milliseconds
address@hidden
+s: seconds
address@hidden itemize
+
address@hidden Supported URLs, MIME Support, Stylesheets, Top
address@hidden Supported URLs
+
+::WORK:: List supported URL types, specific RFCs, etc.
+
address@hidden Resource Locators} (@sc{url}s) are a specific form of
address@hidden Resource Identifiers} (@sc{uri}) described in @sc{rfc}2396
+which updates @sc{rfc}1738 and @sc{rfc}1808.
+
address@hidden defines uniform resource agents.
+
address@hidden have the form @var{scheme}:@var{scheme-specific-part}, where 
@var{scheme}
+appears in the menu below for @sc{url}s supported by Emacs/W3.
+
address@hidden, nfs, http, https}, @code{rlogin}, @code{telnet}, tn3270,
address@hidden and gopher @sc{url}s all have the form
address@hidden://address@hidden@@address@hidden:@var{port}][/@var{path}]
+where @samp{[} and @samp{]} delimit optional parts.  @var{userinfo}
+sometimes takes the form @var{userinfo}:@var{password} but you should
+beware of the security risks of sending cleartext passwords.
address@hidden may be a domain name or a dotted decimal address.  If the
address@hidden:@var{port}} is omitted then Emacs/W3 will use the well known port
+for that service.  With the possible exception of @code{telnet}, it is
+very rare for ports to be specified, and it is possible using a
+non-standard port may have undesired consequences if a different service
+is listening on that port (eg. a gopher @sc{url} specifying the
address@hidden port can cause mail to be sent), but @xref{Other Variables,
+url-bad-port-list}.  The meaning of the @var{path} component depends on
+the service.
+
address@hidden
+* file::                        Local file access.
+* ftp::                         Remote file access via ftp.
+* nfs::                         Remote file access via NFS.
+* info::                        Access to the Emacs Info system.
+* http/https::                  @sc{http/1.0} support.
+* mailto::                      Sending simple electronic mail.
+* mailserver::                  Slightly more complicated electronic mail.
+* news/nntp/snews::             Reading and sending Usenet news.
+* rlogin/telnet/tn3270::        Legacy host connections.
+* irc::                         Internet Relay Chat.
+* data::                        Embedding the data within the URL itself.
+* gopher::                      Gopher and Gopher+.
+* finger::                      The old favorite.
+* netrek::                      netrek.
address@hidden menu
+
address@hidden file, ftp, Supported URLs, Supported URLs
address@hidden File @sc{url}s
address@hidden files
address@hidden File @sc{url}s
+
address@hidden url-directory-index-file
+This allows Emacs/W3 to read arbitary files from hosts.  Compressed
+files are handled, but support is hard-coded so that
address@hidden and so on have no affect.
+Suffixes recognized are @samp{.z}, @samp{.gz} and @samp{.Z}.  If the
address@hidden points to a directory, then it will try to retrieve a file
+named by @code{url-directory-index-file} (@file{index.html} by default)
+and parse it, otherwise you get a directory listing in @samp{dired}
+mode.  If the @sc{url} refers to a file on a remote host, then Emacs/W3
+uses @samp{ange-ftp} (@pxref{Top, , ange-ftp}) or @samp{efs}
+(@pxref{Top, , efs}) to retrive the file.  ftp:// and file:// are
+synonymous for Emacs/W3.
+
address@hidden ftp, nfs, file, Supported URLs
address@hidden @sc{ftp} @sc{url}s
address@hidden @sc{ftp}
+
+For details of usage see @ref{file}.  In Emacs/W3 file and @sc{ftp} @sc{url}s
+are synonymous and files on the localhost are retrieved directly rather
+than by @sc{ftp}.  Emacs/W3 relies on @samp{ange-ftp}
+(@pxref{Top, , ange-ftp}) or @samp{efs} (@pxref{Top, , efs}) to do the actual
+transfers.
+
address@hidden nfs, info, ftp, Supported URLs
address@hidden @sc{nfs} @sc{url}s
address@hidden @sc{nfs}
address@hidden @sc{nfs} @sc{url}s
+
address@hidden url-nfs-automounter-directory-spec
+gdj1: have I misunderstood the point of this?
+Since @sc{nfs} is fairly transparent to the user (at least when it's
+working), there isn't very much to say here.  An nfs @sc{url} is similar
+to a file @sc{url} except that it points to a file on a remote host that
+is handled by the automounter on the local host.  The variable
address@hidden may need to be tweaked
+depending on local configuration.  The @sc{nfs} @sc{url} is defined in
address@hidden
+
address@hidden info, http/https, nfs, Supported URLs
address@hidden info
address@hidden info
address@hidden info @sc{url}s
+Info @sc{url}s are not an officially recognised @sc{url} (gdj1: is this
+right?), but Emacs/W3 will parse them to produce a reference to a
+TeXinfo node, or @samp{Top} if one is not specified.  @samp{Info-mode}
+will be used to browse the document.
+
address@hidden http/https, mailto, info, Supported URLs
address@hidden http/https
address@hidden @sc{http}
address@hidden @sc{https}
address@hidden url-honor-refresh-requests
address@hidden url-be-anal-about-file-attributes
+The HyperText Transfer Protocol is the protocol used to get documents
+from the World Wide Web.  Emacs/W3 supports @sc{http} version 1.0 as
+defined in @sc{rfc}1945 --- now superseded by version 1.1 defined in
address@hidden
+
+If @code{url-honor-refresh-requests} is @code{nil} then @samp{Refresh}
+headers will not be honoured, if @code{t} then they will always be
+honoured, otherwise the user will be asked for each request.  The
+default is @code{t}.  @code{url-be-anal-about-file-attributes} controls
+whether @sc{http} is used to discover file attributes, or whether
+they're just guessed.  The default is @code{nil} which means that
+Emacs/W3 will make educated guesses.
+
address@hidden is a secure version of @sc{http} defined in @sc{rfc}2069
+(gdj1: ?).  Emacs/W3 requires @sc{ssl} to handle this, @xref{Installing SSL}.
+
address@hidden mailto, mailserver, http/https, Supported URLs
address@hidden mailto
address@hidden url-mail-command
address@hidden mailto
address@hidden mailto @sc{url}s
+A mailto @sc{url} will send an email message to the address in the
address@hidden, for example @samp{mailto:foo@@bar.com} would compose a
+message to foo@@bar.com.  Emacs/W3 uses the command specified by the
address@hidden variable to compose the email, this is @code{url-mail} by
+default which uses Gnu's @samp{message} mode (@pxref{Top, Message, , message}) 
if
+available, otherwise the standard @code{mail} command.  An X-Url-From
+header field containing the @sc{url} of the document that contained the
+mailto @sc{url} is added, as is an X-Mailer header field containing the
+version of Emacs/W3 being used.
+
address@hidden extends the definition of mailto @sc{url}s in @sc{rfc1738}.
+The form of a mailto @sc{url} is
address@hidden:@address@hidden@var{contents}[&@address@hidden
+where an arbitary number of @var{header}s can be added.  If the
address@hidden is @samp{body}, then @var{contents} is put in the body
+otherwise a @var{header} header field is created with @var{contents} as its
+contents.  Note that Emacs/W3 does not consider any headers as
+`dangerous' so you should check them before sending the message.
+
+Email messages are defined in @sc{rfc}822.
+
address@hidden mailserver, news/nntp/snews, mailto, Supported URLs
address@hidden mailserver
address@hidden mailserver
address@hidden mailserver @sc{url}s
+A mailserver @sc{url} allows you to send an email to a person, but this
address@hidden optionly specifies a subject and a body; thus
address@hidden:address@hidden/@var{subject}[/@var{body}]}
address@hidden:foo@@bar.com/wibble/flibble} will compose a message to
+foo@@bar.com with @var{subject} as the subject and @var{body} already in
+the body of the email.  Note that both the subject and the body are
address@hidden, but the subject cannot contain newlines.
+
address@hidden news/nntp/snews, rlogin/telnet/tn3270, mailserver, Supported URLs
address@hidden news/nntp/snews
address@hidden news
address@hidden nntp
address@hidden snews
address@hidden news @sc{url}s
address@hidden url-news-use-article-mode
address@hidden url-news-server
address@hidden url-default-ports
+If the @sc{url} doesn't specify a host, then the host in
address@hidden will be used, and unless the @sc{url} has a port
+the news port as defined in @code{url-default-ports} (119) will be used.
+The username and password specified in the @sc{url} will be used if
+present.  The @sc{url} may contain a message-id, in which case that
+article is displayed; it may contain a newsgroup in which case Gnus is
+used to display the newsgroup; or it may by empty in which case Gnus is
+called with no arguments.  Emacs/W3 requires Gnus v5.x or Red, Quassia
+or Pterodactyl Gnus, @xref{Top, , ,gnus, Gnus}.  The variable
address@hidden controls the displaying of news
+articles; if address@hidden then articles are displayed in Gnus article
+mode, otherwise they are turned into @sc{html} and rendered by Emacs/W3.
+
+An @sc{nntp url} is the same as a news @sc{url}, except that the
address@hidden may specify an article by its number.
+
address@hidden rlogin/telnet/tn3270, irc, news/nntp/snews, Supported URLs
address@hidden rlogin/telnet/tn3270
address@hidden rlogin
address@hidden telnet
address@hidden tn3270
address@hidden rlogin @sc{url}s
address@hidden telnet @sc{url}s
address@hidden tn3270 @sc{url}s
+To handle rlogin, telnet and tn3270 @sc{url}s, Emacs/W3 runs an
address@hidden, @code{telnet} or @code{tn3270} session (the program names
+and arguments are hardcoded) in a @code{terminal-emulator} buffer.
+Well-known ports are used if the @sc{url} does not specify a port.
+
+
address@hidden irc, data, rlogin/telnet/tn3270, Supported URLs
address@hidden irc
address@hidden @sc{irc}
address@hidden @sc{irc url}s
address@hidden url-irc-function
address@hidden Relay Chat} (@sc{irc}) is handled by handing off the @sc{irc}
+session to a function named in @code{url-irc-function}.  This function
+must take five argumenst, @var{host}, @var{port}, @var{channel},
address@hidden and @var{password}.  The @var{channel} argument specifies the
+channel to join immediately, this can be @code{nil}.  By default this is
address@hidden which processes the arguments and lets
address@hidden handle the session.
+
address@hidden data, gopher, irc, Supported URLs
address@hidden data @sc{url}s
address@hidden data
+
+Data @sc{url}s contain @sc{mime} data in the @sc{url} itself, by default
+the data is 8bit encoded @samp{text/plain}, but the @sc{url} can specify either
+or both the content-type and the encoding.  Emacs/W3 will parse the
address@hidden's data as @sc{mime} and display it appropriately.  @xref{MIME 
Support}.
+
address@hidden gopher, finger, data, Supported URLs
address@hidden gopher
address@hidden gopher
address@hidden gopher @sc{url}s
address@hidden url-gopher-labels
address@hidden url-gopher-icons
address@hidden url-gopher-to-mime
address@hidden url-use-hypertext-gopher
address@hidden (Go for) was in someways the precurser to the world wide
+web and is becoming rarer as the web becomes more powerful.
+Nevertheless, there are still many gopher sites around and Emacs/W3
+supports this protocol (of course).  The variable
address@hidden maps gopher types to something else (gdj: ?)
+for displaying the gopher menus.  @code{url-gopher-icons} maps gopher
+types to pictures.  @code{url-gopher-to-mime} maps gopher types to
address@hidden types.  If @code{url-use-hypertext-gopher} is address@hidden,
+then gopher pages will be turned into @sc{html} for Emacs/W3 to parse
+and display normally, otherwise Emacs/W3 will let @samp{gopher.el}
+handle all gopher requests which will lose gopher+ support and inlined
+searching.  This is @code{t} by default.
+
address@hidden finger,  netrek, gopher, Supported URLs
address@hidden finger
address@hidden finger
address@hidden finger @sc{url}s
+Finger @sc{url}s will finger a given user at a given host, or @samp{localhost}
+if no host is specified, processing the results to create an @sc{html}
+page for Emacs/W3 to display.
+
address@hidden netrek, , finger, Supported URLs
address@hidden netrek
+This is unsupported at present.
+
+
address@hidden MIME Support, Security, Supported URLs, Top
address@hidden MIME Support
address@hidden is an emerging standard for multimedia mail.  It offers a very
+flexible typing mechanism.  The type of a file or message is specified
+in two parts, separated by a '/'.  The first part is the general
+category of the data (text, application, image, etc.).  The second part
+is the specific type of data (postscript, png, jpeg, etc.).  So
address@hidden/html} specifies an @sc{html} document, whereas
address@hidden/x-xwindowdump} specifies an image of an Xwindow taken with
+the @file{xwd} program.
+
+
+This typing allows much more flexibility in naming files.  @sc{http}/1.0
+servers can now send back content-type headers in response to a request,
+and not have the client second-guess it based on file extensions.  @sc{html}
+files can now be named @file{something.png} (not a great idea, but
+possible).
+
address@hidden
+* Adding MIME types based on file extensions::  How to map file
+                                                extensions onto MIME
+                                                types (e.g., @samp{.png ->
+                                                image/png)}.
+* Specifying Viewers::          How to specify external and internal viewers
+                        for files that Emacs/W3 cannot handle natively.
address@hidden menu
+
address@hidden Adding MIME types based on file extensions, Specifying Viewers, 
MIME Support, MIME Support
address@hidden Adding MIME types based on file extensions
+
address@hidden mm-mime-extensions
+For some protocols however, it is still necessary to guess the content
+of a file based on the file extension.  This type of guess-work should
+only be needed when accessing files via @sc{ftp}, local file access, or old
address@hidden/0.9 servers.
+
+Instead of specifying how to view things twice, once based on
+content-type and once based on the file extension, it is easier to map
+file extensions to MIME content-types.  The variable that controls this
+is @code{mm-mime-extensions}.
+
+This variable is an assoc list of file extensions and the corresponding
+MIME content-type.  A sample entry looks like: @samp{(".movie"
+. "video/x-sgi-movie")} This makes all files that end in @file{.movie}
+(@file{foo.movie} and @file{bar.movie}) be interpreted as SGI animation
+files.  If a content-type is defined for the document, then this is
+over-ridden.  Regular expressions can @b{NOT} be used.
+
address@hidden mime-types file
address@hidden mm-parse-mimetypes
+Both Mosaic and the NCSA @sc{http} daemon rely on a separate file for mapping
+file extensions to MIME types.  Instead of having the users of Emacs/W3
+duplicate this in lisp, this file can be parsed using the
address@hidden function.  This function is called each time
+w3 is loaded.  It tries to locate mimetype files in several places. If
+the environment variable @code{MIMETYPES} is nonempty, then this is
+assumed to specify a UNIX-like path of mimetype files (this is a colon
+separated string of pathnames).  If the @code{MIMETYPES} environment
+variable is empty, then Emacs/W3 looks for these files:
+
address@hidden
address@hidden
address@hidden/.mime-types}
address@hidden
address@hidden/etc/mime-types}
address@hidden
address@hidden/usr/etc/mime-types}
address@hidden
address@hidden/usr/local/etc/mime-types}
address@hidden
address@hidden/usr/local/www/conf/mime-types}
address@hidden enumerate
+
+Each line contains information for one @sc{http} type.  These types resemble
+MIME types.  To add new ones, use subtypes beginning with x-, such as
+application/x-myprogram.  Lines beginning with # are comment lines, and
+suitably ignored.  Each line consists of:
+
+type/subtype ext1 ext2 ...  address@hidden
+
+type/subtype is the MIME-like type of the document. ext* is any number
+of space-separated filename extensions which correspond to the MIME
+type.
+
address@hidden Specifying Viewers,  , Adding MIME types based on file 
extensions, MIME Support
address@hidden Specifying Viewers
+
+Not all files look as they should when parsed as an @sc{html} document
+(whitespace is stripped, paragraphs are reformatted, and lots of little
+changes that make the document look unrecognizable).  Files may be
+passed to external programs or Emacs Lisp functions to be viewed.
+
+Not all files can be viewed accurately from within an Emacs session (PNG
+files for example, or audio files).  For this reason, the user can
+specify file "viewers" based on MIME content-types.  This is done with
+a standard mailcap file.  @xref{Mailcap Files}
+
address@hidden mm-add-mailcap-entry
+As an alternative, the function @code{mm-add-mailcap-entry} can also be
+used from an appropriate address@hidden  This functions takes three
+arguments, the major type ("@i{image}"), the minor type ("@i{png}"), and
+an assoc list of information about the viewer.  Please see the @sc{url}
+documentation for more specific information on what this assoc list
+should look like.
+
address@hidden Security, Cookies, MIME Support, Top
address@hidden Security
address@hidden Security
address@hidden Paranoia
+There are an increasing number of ways to authenticate a user to a web
+service.  Emacs/W3 tries to support as many as possible.  Emacs/W3
+currently supports:
+
address@hidden @b
address@hidden Basic Authentication
address@hidden Security, Basic
address@hidden HTTP/1.0 Authentication
address@hidden Authentication, Basic
+The weakest authentication available, not recommended if serious
+security is necessary.  This is simply a string that looks like
address@hidden:password} that has been Base64 encoded, as defined in RFC
+1421.
address@hidden Digest Authentication
address@hidden Security, Digest
address@hidden HTTP/1.0 Authentication
address@hidden Authentication, Digest
+Jeffery L. Hostetler, John Franks, Philip Hallam-Baker, Ari Luotonen,
+Eric W. Sink, and Lawrence C. Stewart have an internet draft for a new
+authentication mechanism.  For the complete specification, please see
+draft-ietf-http-digest-aa-01.txt in the nearest internet drafts
address@hidden is ftp://ds.internic.net/internet-drafts}.
address@hidden SSL Encryption
address@hidden HTTP/1.0 Authentication
address@hidden Secure Sockets Layer
address@hidden SSL
address@hidden Gag Puke Retch
address@hidden Exportability
address@hidden Export Restrictions
+SSL is the @code{Secure Sockets Layer} interface developed by Netscape
+Communications @footnote{http://www.netscape.com/}.  Emacs/W3 supports
address@hidden transfers over an SSL encrypted channel, if the appropriate files
+have been address@hidden SSL}
address@hidden table
+
address@hidden Privacy
address@hidden url-privacy-level
+Sometimes you don't want people to know who you are, or where you've
+been.  @sc{http} is quite happy to tell everyone it meets who you are
+and where you've come from.  @code{url-privacy-level} can be used to set
+how much information is given, it can be a list of the following symbols
+
address@hidden @samp
address@hidden email
+Do not send email address.  This just sets
address@hidden to @code{nil}.
address@hidden os
+Do not send operating system
address@hidden lastloc
+Do not send the last location
address@hidden agent
+Do not send the User-Agent string (for an alternative approach,
address@hidden).
address@hidden cookie
+Never accept cookies (@pxref{Cookies})
address@hidden table
+
+Alternatively @code{url-privacy-level} can be a single symbol,
address@hidden @samp
address@hidden none
+Send all information.
address@hidden low
+Don't send the last location.  Equivalent to @code{(lastloc)}
address@hidden high
+Don't send the email address or last location.  Equivalent to
address@hidden(email lastloc)}
address@hidden paranoid
+Don't send anything.  Equivalent to @code{(email os lastloc agent cookie)}
address@hidden table
+
+If you change @code{url-privacy-level} then you should also call
address@hidden to make sure that the changes propogate.
+
address@hidden Cookies, Non-Unix Operating Systems, Security, Top
address@hidden Cookies
address@hidden Cookies
+
address@hidden is a stateless protocol which means that the server sees every
+request for pages independently with no idea of how it relates to any
+other request.  Therefore the server has no idea whether or not you've
+seen a page before, or whether you've registered (if that's an option).
address@hidden computer terms a @dfn{cookie} is data that a
+program holds but which has no meaning in itself.  Cookies are not
+processed by the program (indeed the program may not even know
+what data they hold or what format it's in) but is passed to libraries or
+servers which do understand it.} are used to add state to @sc{http}
+sessions.  Cookies are defined in @sc{rfc2109}.
address@hidden gdj1: but does Emacs/W3 only support Netscape cookies?
+
address@hidden url-cookie-file
+Cookies are saved in a file in @code{url-cookie-file}, which is
address@hidden@var{w3-configuration-directory}/cookies} by default.  Note that
+this file should probably not be world writable, and possibly not even
+world readable.
+
address@hidden url-cookie-untrusted-urls
address@hidden url-cookie-trusted-urls
address@hidden url-cookie-confirmation
+Some people see cookies as an invasion of privacy while others see them
+as a product of badly designed websites and buggy servers.  Emacs/W3
+lets you unconditionally reject all cookies by adding @code{cookie} to
address@hidden or setting it to @code{paranoid}
+(@pxref{Security}) but for those who want finer control over what to
+accept and reject, Emacs/W3 offers @code{url-cookie-trusted-urls} and
address@hidden which are lists of regular expressions
+that match @sc{url}s from which cookies should be accepted and rejected
+respectively.  If a @sc{url} matches patterns in both of these, then
+Emacs/W3 decides whether to accept or not based on the most specific
+match (the most specific match being the shortest match).
address@hidden gdj1: This doesn't seem right.
+Note that Emacs/W3 only considers the first match for each variable, so
+the regular expressions should be in increasing order of generality.
+
+For even more control over which cookies are accepted, you can set
address@hidden to address@hidden, in which case every
+time a cookie is offered Emacs/W3 will ask if you want to accept it.
+This only applies to cookies that would otherwise be accepted, Emacs/W3
+will still reject cookies from @sc{url}s matched in
address@hidden
+
address@hidden Non-Unix Operating Systems, Speech Integration, Cookies, Top
address@hidden Non-Unix Operating Systems
address@hidden Non-Unix Operating Systems
+
address@hidden
+* VMS::                         The wonderful world of VAX|AXP-VMS!
+* OS/2::                        The next-best thing to Unix.
+* MS-DOS::                      The wonderful world of MS-DOG!
+* Windows::                     Windows NT, Chicago/Windows 95.
address@hidden menu
+
address@hidden VMS, OS/2, Non-Unix Operating Systems, Non-Unix Operating Systems
address@hidden VMS
address@hidden VAX-VMS
address@hidden AXP-VMS
address@hidden Digital VMS
address@hidden VMS
+
+:: WORK :: VMS Specific instriuctions
+
address@hidden OS/2, MS-DOS, VMS, Non-Unix Operating Systems
address@hidden OS/2
address@hidden OS/2
address@hidden Warp
+
+:: WORK :: OS/2 Specific instructions
+
address@hidden MS-DOS, Windows, OS/2, Non-Unix Operating Systems
address@hidden MS-DOS
address@hidden MS-DOS
address@hidden Microsloth
address@hidden DOS
address@hidden MS-DOG
+
+:: WORK :: DOS Specific instructions
+
address@hidden Windows,  , MS-DOS, Non-Unix Operating Systems
address@hidden Windows
address@hidden Windows (32-Bit)
address@hidden 32-Bit Windows
address@hidden Microsloth
address@hidden Windows '95
+
+:: WORK :: 32bit Windows Specific instructions
+
address@hidden Speech Integration, Advanced Features, Non-Unix Operating 
Systems, Top
address@hidden Speech Integration
+
+:: WORK :: Emacspeak integration
+
address@hidden Advanced Features, More Help, Speech Integration, Top
address@hidden Advanced Features
+
address@hidden
+* Disk Caching::                Improving performance by using a local disk 
cache
+* Printing::                    Emacs/W3 can print @sc{html} by various 
methods.
+* Interfacing to Mail/News::    How to make VM understand hypertext links
+* Debugging HTML::              How to make Emacs/W3 display warnings about 
invalid
+                                @sc{html}/@sc{html}+ constructs.
+* Hooks::                       Various hooks to use throughout Emacs/W3
+* Other Variables::             Miscellaneous variables that control the real
+                                guts of Emacs/W3.
address@hidden menu
+
address@hidden Disk Caching, Printing, Advanced Features, Advanced Features
address@hidden Disk Caching
address@hidden Caching
address@hidden Persistent Cache
address@hidden Disk Cache
+
+A cache stores the information on a page on the local machine.  When
+requesting a page that is in the cache, Emacs/W3 can retrieve the page
+from the cache more quickly than retrieving the page again from its
+location out on the network.  With a well-populated cache, browsing the
+web is dramatically faster.
+
+The first time a page is requested, Emacs/W3 retrieves the page from the
+network.  When requesting a page that is in the cache, Emacs/W3 checks
+to see if the page has changed since it was last retrieved from the
+remote machine.  If it has not changed, the local copy is used, saving
+the transmission of the file over the network.
+
address@hidden url-automatic-caching
address@hidden Turning on caching
address@hidden Cleaning the cache
address@hidden Clearing the cache
address@hidden Cache cleaning
address@hidden Limiting the size of the cache
+To turn on disk caching, set the variable @code{url-automatic-caching}
+to address@hidden, or choose the 'Caching' menu item (under `Options').
+That is all there is to it.  Running the @code{clean-cache} shell script
+fist is recommended, to allow for future cleaning of the cache.  This
+shell script will remove all files that have not been accessed since it
+was last run.  To keep the cache pared down, it is recommended that this
+script be run from @i{at} or @i{cron} (see the manual pages for
+crontab(5) or at(1) for more information)
+
+
address@hidden Relying on cache
address@hidden Cache only mode
address@hidden Standalone mode
address@hidden Browsing with no network connection
address@hidden Netless browsing
address@hidden url-standalone-mode
+With a large cache of documents on the local disk, it can be very handy
+when traveling, or any other time the network connection is not active
+(a laptop with a dial-on-demand PPP connection, etc).  Emacs/W3 can rely
+solely on its cache, and avoid checking to see if the page has changed
+on the remote server.  In the case of a dial-on-demand PPP connection,
+this will keep the phone line free as long as possible, only bringing up
+the PPP connection when asking for a page that is not located in the
+cache.  This is very useful for demonstrations as well.  To turn this
+feature on, set the variable @code{url-standalone-mode} to
address@hidden, or choose the `Use Cache Only' menu item (under
+`Options')
+
address@hidden url-cache-expired
address@hidden url-cache-ignored-protocols
address@hidden url-cache-directory
address@hidden url-cache-creation-function
address@hidden decides whether or not a cache entry has
+expired.  It is a function that take two times as it parameters and
+returns address@hidden if the second time is ``too old'' when compared
+with the first time.  @code{url-cache-ignored-protocols} is a list of
+protocols that will never be cached, this is @code{'("www" "about"
+"https" "mailto")} by default. @code{url-cache-directory} sets the
+directory to store the cache files,
address@hidden"@var{w3-configuration-directory}cache/"} by default.
address@hidden sets the type of cache to use, it is
+a function that takes a @sc{url} as an argument and returns the absolute
+pathname of the cache-file corresponding to that @sc{url}.  You may
+write your own function or use one of the two ready built functions, 
address@hidden and
address@hidden  The advantage of
address@hidden is that there are very few
+cache collisions but is only ``suitably fast'' if you're not using
+XEmacs.  @code{url-cache-create-filename-human-readable} will give a
+filename more obviously connected to the @sc{url}, but it is more likely
+to conflict with other files.
+
address@hidden Printing, Interfacing to Mail/News, Disk Caching, Advanced 
Features
+
address@hidden Printing
address@hidden Printing
address@hidden LaTeX
address@hidden Postscript
+
+If you want to print an @sc{html} document, then Emacs/W3 needs to
+convert it into something that can be printed.  You can choose from
+
address@hidden @asis
address@hidden @sc{html} source
+This will simply print the raw @sc{html} source code using
address@hidden  An appropriate <base> tag is inserted at the
+beginning of the document. @c gdj1: really?
+
address@hidden Formatted text
+This will print the rendered document using @code{lpr-buffer}; so the
+conversion is handled by Emacs.  This will print plain ASCII.
+
address@hidden Postscript
address@hidden w3-postscript-print-function
+This will call the function in @code{w3-postscript-print-function},
+which is @code{ps-print-buffer-with-faces} by default.  This just tells
+Emacs to generate postscript as best it can.
+
address@hidden LaTeX
+Emacs/W3 can generate a LaTeX equivalent of the @sc{html} document.
+
address@hidden w3-print-command
address@hidden contains a command string to print @file{dvi}
+files.  It is @samp{lpr -h -d} by default.
+
+
+There are several variables controlling what the final LaTeX document looks 
like.
+
+:: WORK :: Document the new LaTeX backend
+
+
address@hidden @code
address@hidden w3-latex-use-latex2e
address@hidden w3-latex-use-latex2e
+If address@hidden, configures the LaTeX engine to use the LaTeX2e
+syntax.  A @code{nil} value indicates that LaTeX 2.0.9 compabibility
+will be used instead.
address@hidden w3-latex-docstyle
address@hidden w3-latex-docstyle
+The document style to use when printing or mailing converted @sc{html} files
+in LaTeX.  Good defaults are: @address@hidden, [psfig,address@hidden@},
+etc.
address@hidden w3-latex-packages
address@hidden w3-latex-packages
+List of LaTeX packages to include.  Currently this is only used if 
address@hidden is address@hidden
address@hidden w3-latex-use-maketitle
address@hidden w3-latex-use-maketitle
+If address@hidden, the LaTeX engine will use real LaTeX title pages for
+document titles.
address@hidden w3-latex-print-links
address@hidden w3-latex-print-links
+If address@hidden, prints the @sc{url}s of hypertext links as endnotes at the
+end of the document.  If set to @code{footnote}, prints the @sc{url}'s as
+footnotes on each page.
address@hidden table
address@hidden table
+
+
address@hidden Interfacing to Mail/News, Debugging HTML, Printing, Advanced 
Features
address@hidden Interfacing to Mail/News
address@hidden Interfacing to Mail/News
address@hidden VM
address@hidden Using Emacs/W3 with VM
address@hidden GNUS
address@hidden Using Emacs/W3 with Gnus
address@hidden RMAIL
address@hidden Using Emacs/W3 with RMAIL
+
+More and more people are including @sc{url}s in their signatures, and within
+the body of mail messages.  It can get quite tedious to type these into
+the minibuffer to follow one. 
+
address@hidden browse-url-browser-function
+With the latest versions of VM (the 5.9x series of betas) and Gnus
+(5.x), @sc{url}s are automatically highlighted, and can be followed with the
+mouse or the return key.  How the @sc{url}s are viewed is determined by the
+variable @code{browse-url-browser-function}, and it should be set to the
+symbol @code{browse-url-w3}.
+
+To access @sc{url}s from within RMAIL, the following hook should do the
+trick.
address@hidden
+(add-hook 'rmail-mode-hook
+         (function
+          (lambda ()
+            (define-key rmail-mode-map [mouse-2] 'w3-maybe-follow-link-mouse)
+            (define-key rmail-mode-map "\r"      'w3-maybe-follow-link))))
address@hidden example
+
address@hidden Debugging HTML, Hooks, Interfacing to Mail/News, Advanced 
Features
address@hidden Debugging HTML
address@hidden Debugging
address@hidden Invalid HTML
address@hidden Bad HTML
address@hidden w3-debug-buffer
address@hidden w3-debug-html
address@hidden w3-display-errors-hook
address@hidden w3-html-errors-font-lock-keywords
+For those people that are adventurous, or are just as anal as I am about
+people writing valid @sc{html}, set the variable @code{w3-debug-html} to
address@hidden and see what happens.  Alternatively, you can set it to
address@hidden to warn about stylistic issues as well.  The debugging
+information will be written to the buffer named by
address@hidden, @file{*HTML Debug*} by default.  To control
+font-lock highlighting in the @sc{html} error buffer, use
address@hidden  After Emacs/W3 has displayed
address@hidden errors for a page, it runs @code{w3-display-errors-hook}.
+
+
+If a Emacs/W3 thinks it has encountered invalid @sc{html}, then a debugging
+message is displayed.
+
+:: WORK :: Need to list the different values w3-debug-html can have, 
address@hidden
+:: WORK :: what they do ::
+
+gdj1: Does this refer to the macro?  And if so, why?
+
address@hidden Hooks, Other Variables, Debugging HTML, Advanced Features
address@hidden Hooks
address@hidden Hooks
+
+These are the various hooks that can be used to customize some of
+Emacs/W3's behavior.  They are arranged in the order in which they would
+happen when retrieving a document.  These are all 'normal hooks' in
+standard Emacs-terminology, meaning they are functions (or lists of
+functions) that are called consecutively.
+
address@hidden @code
address@hidden w3-load-hook
address@hidden w3-load-hook
+These hooks are run the first time a @sc{url} is fetched.  All the
+Emacs/W3 variables are initialized before this hook is run.
address@hidden w3-mode-hook
+These hooks are run after a buffer has been parsed and displayed, but
+before any inlined images are downloaded and converted.
address@hidden w3-source-file-hook
+These hooks are run after displaying a document's source.
address@hidden table
+
address@hidden Other Variables,  , Hooks, Advanced Features
address@hidden Miscellaneous variables
+
+There are lots of variables that control the real nitty-gritty of Emacs/W3
+that the beginning user probably shouldn't mess with.  Here they are.
+
address@hidden @code
address@hidden url-bad-port-list
address@hidden url-bad-port-list
+List of ports to warn the user about connecting to.  Defaults to just
+the mail, @sc{nntp} and chargen ports so a malicious @sc{html} author
+cannot spoof mail or news to other people.
address@hidden url-confirmation-func
address@hidden url-confirmation-func
+What function to use for asking yes or no functions.  Possible values
+are @code{'yes-or-no-p} or @code{'y-or-n-p}, or any function that takes
+a single argument (the prompt), and returns @code{t} only if a positive
+answer is gotten.  Defaults to @code{'yes-or-no-p}.
+
address@hidden url-passwd-entry-func
address@hidden url-passwd-entry-func
+This is a symbol indicating which function to call to read in a
+password.  If this variable is @code{nil} at startup, it is initialized
+depending on whether @dfn{EFS} or @dfn{ange-ftp} is being used.  This
+function should accept the prompt string as its first argument, and the
+default value as its second argument.
+
address@hidden url-max-password-attempts
address@hidden url-max-password-attempts
+When a protected document is requested, Emacs/W3 will prompt for a
+password.  @code{url-max-password-attempts} controls how many attempts
+should be allowed, it is 5 by default.
+
address@hidden w3-reuse-buffers
address@hidden w3-reuse-buffers
+Determines what happens when @code{w3-fetch} is called on a document
+that has already been loaded into another buffer.  Possible values are:
address@hidden, @code{yes}, and @code{no}.  @code{nil} will ask the user if
+Emacs/W3 should reuse the buffer (this is the default value).  A value of
address@hidden means assume the user wants to always reuse the buffer.  A
+value of @code{no} means assume the user always wants to re-fetch the
+document.
+
address@hidden url-show-status
address@hidden url-show-status
+Whether to show progress messages in the minibuffer.
address@hidden controls if a running total of the
+number of bytes transferred is displayed.  This Can cause a large
+performance hit if using a remote X display over a slow link, or a
+terminal with a slow modem.
+
address@hidden mm-content-transfer-encodings
address@hidden mm-content-transfer-encodings
+An assoc list of @var{Content-Transfer-Encodings} or
address@hidden and the appropriate decoding algorithms for each.
+If the @code{cdr} of a node is a list, then this specifies the decoder is
+an external program, with the program as the first item in the list, and
+the rest of the list specifying arguments to be passed on the command line.
+If using an external decoder, it must accept its input from @code{stdin}
+and send its output to @code{stdout}.
+
+If the @code{cdr} of a node is a symbol whose function definition is
address@hidden, then that encoding can be handled internally.  The function
+is called with 2 arguments, buffer positions bounding the region to be
+decoded.  The function should completely replace that region with the
+unencoded information.
+
+Currently supported transfer encodings are: base64, x-gzip, 7bit, 8bit,
+binary, x-compress, x-hqx, and quoted-printable.
+
address@hidden url-uncompressor-alist
address@hidden url-uncompressor-alist
+An assoc list of file extensions and the appropriate uncompression
+programs for each.  This is used to build the Accept-encoding header for
address@hidden/1.0 requests.
+
address@hidden w3-do-scripting
address@hidden w3-do-scripting
+If this is address@hidden then Emacs/W3 will do clien-side scripting.
+This is @code{nil} by default.
+
address@hidden url-external-retrieval-program, url-external-retrieval-args
address@hidden url-external-retrieval-program
address@hidden url-external-retrieval-args
address@hidden gdj1: Find out what this means.
address@hidden names the external program that is
+run to retrieve @sc{url}s.  It is @file{www} by default.
address@hidden specifies the arguments that will be
+passed to it, @samp{("-source")} by default.
+
address@hidden w3-netscape-compatible-comments
address@hidden w3-netscape-compatible-comments
+Not everyone uses proper @sc{html} comments.  To allow for the presence
+of lesser browsers, Emacs/W3 will honour the incorrect netscape-style
+comments (@samp{<! >}) if @code{w3-netscape-compatible-comments} is
address@hidden  This is @code{t} by default, but it shouldn't need to
+be.
+
address@hidden font-blink-interval
address@hidden font-blink-interval
+This controls how often blinks occur for text inside @samp{<blink>}
+tags.  It is 0.5 seconds by default.
+
address@hidden url-inhibit-mime-parsing
address@hidden url-inhibit-mime-parsing
+This controls whether to parse @sc{mime} headers in a message.  If it is
address@hidden then the headers are parsed and deleted.
+
address@hidden url-mime-language-string
address@hidden url-mime-language-string
+This is used to set the contents of the @samp{Accept-language:} field in
address@hidden/1.0} requests.  If it is @code{nil} then the field isn't added
+and the server's default language version is retrieved, if it is
address@hidden then the first available langauge version is retrieved.  If it
+is a string, then it should be the desired language.
address@hidden gdj1: find out how http/1.0 differs from http/1.1 here.
+
address@hidden url-multiple-p
address@hidden url-multiple-p
+If this is address@hidden then multiple queries are possible through
address@hidden *URL-<i>*} buffers.
+
address@hidden url-personal-mail-address
address@hidden url-personal-mail-address
address@hidden contains your full email address.  This
+is sent in the @sc{from} field in an @sc{http/1.0} request, but
address@hidden for how to prevent this.  If @code{nil} (the default),
+then it will be set to @code{user-mail-address} if address@hidden, else
+it will be @code{(user-real-login-name)} at @code{(system-name)}.
+
address@hidden url-temporary-directory, w3-temporary-directory
address@hidden url-temporary-directory
address@hidden w3-temporary-directory
address@hidden and @code{w3-temporary-directory} control
+where temporary files are placed.  If @samp{TMPDIR} is set then they
+default to that, otherwise @file{/tmp}.
+
address@hidden w3-documentation-root
address@hidden w3-documentation-root
+This specifies the location of the Emacs/W3 documentation, it is
address@hidden://www.cs.indiana.edu/elisp/w3/} by default and @emph{must} end
+in a slash.
+
address@hidden w3-popup-menu-on-mouse-3
address@hidden w3-popup-menu-on-mouse-3
+If you like context-sensitive menus then you're bound to like
address@hidden  If address@hidden (the default) then
+Emacs/W3 will bind mouse-3 to provide context-sensitive menus.  This
+might not work at the moment.  If @code{w3-popup-menu-on-mouse-3} is
address@hidden, then Emacs/W3 will not change the binding of mouse-3.
+
address@hidden w3-track-mouse
address@hidden w3-track-mouse
+If @code{w3-track-mouse} is address@hidden (the default) then Emacs/W3
+will display the @sc{url} under the mouse in the echo-area.
+
address@hidden w3-use-menus
address@hidden w3-use-menus
+If @code{w3-use-menus} is @code{nil} then Emacs/W3 will not provide a
+menu interface.  If it is @samp{1}, then Emacs/W3 will add a @samp{W3}
+item to the Emacs menubar.  If it is a list then Emacs/W3 will add its
+own menubar.  The following symbols may appear in the list to control
+what Emacs/W3 puts in its menubar.
address@hidden @code
address@hidden file
+A list of file related commands
address@hidden edit
+Various standard editing commands (copy/paste)
address@hidden view
+Controlling various things about the document view
address@hidden go
+Navigation control
address@hidden bookmark
+Bookmark / hotlist control
address@hidden options
+Various options
address@hidden buffers
+The standard buffers menu
address@hidden emacs
+A toggle button to switch back to normal emacs menus
address@hidden style
+Control style information and who gets to set what
address@hidden search
+Various search engines
address@hidden help
+The help menu
address@hidden nil
+This may appear once in the list.  All menus after this will be
+displayed flush right.
address@hidden table
+
address@hidden table
+
address@hidden More Help, Future Directions, Advanced Features, Top
address@hidden More Help
address@hidden Relevant Newsgroups
address@hidden Newsgroups
address@hidden Support
+For more help on Emacs/W3, please send me mail
+(@i{wmperry+w3@@cs.indiana.edu}).  Several discussion lists have also been
+created for Emacs/W3.  To subscribe, send mail to
address@hidden@@indiana.edu}, with the body of the message 'subscribe
address@hidden @var{<email addres>}'.  All other mail should go to
address@hidden<listname>@@indiana.edu}.
+
+
address@hidden @bullet
address@hidden
+w3-announce -- this list is for anyone interested in Emacs/W3, and
+should in general only be used by me.  The gnu.emacs.sources newsgroup
+and a few other mailing lists are included on this.  Please only use
+this list for major package releases related to Emacs/W3.
+(@i{www-announce@@w3.org} is included on this list).
address@hidden
+w3-beta -- this list is for beta testers of Emacs/W3.  These brave souls test
+out not-quite stable code.
address@hidden
+w3-dev -- a list consisting of myself and a few other people who are
+interested in the internals of Emacs/W3, and doing active development work.
+Pretty dead right now, but I hope it will grow.
address@hidden itemize
+
+For more help on the World Wide Web in general, please refer to the
+comp.infosystems.www.* newsgroups.  There are also several discussion
+lists concerning the Web.  Send mail to @i{<listname>-request@@w3.org}
+with a subject line of 'subscribe <listname>'.  All mail should go to
address@hidden<listname>@@w3.org}.  Administrative mail should go to
address@hidden@@w3.org}.  The lists are:
+
+
address@hidden @bullet
address@hidden
+www-talk -- for general discussion of the World Wide Web, where its
+going, new features, etc.  All the major developers are subscribed to
+this list.
address@hidden
+www-announce -- for announcements concerning the World Wide Web.  Server
+changes, new servers, new software, etc.
address@hidden itemize
+
+As a last resort, mail me.  I'll try to answer as quickly as I can.
+
address@hidden Future Directions, Reporting Bugs, More Help, Top
address@hidden Future Directions
+Changes are constantly being made to the Emacs browser (hopefully all
+for the better).  This is a list of the things that are being worked on
+right now.
+
+BUGS (4.0):
address@hidden @minus
address@hidden
+need to support HTTP/0.9 (http://c2.com:8080) responses
address@hidden
+/etc/mailcap cannot overide builtin mm-mime-data stuff?
address@hidden
+try to protect people from using '~' in file URLs
address@hidden
+keystrokes entered while in w3-pause self-insert under XEmacs --- the
+loop around dispatch-event needs to be smarter about what it
+swallows.
address@hidden
+border-color can have multiple color specifications, but we
+currently choke with 'args out of range' when we see this.
address@hidden
+widget appears to be stealing button3 to mean 'activate' --- this is
+bogus!  We lose all context-sensitive menus because of this.
address@hidden
+We still seem to be growing the line size under Emacs 19.x/20.x
address@hidden
+It would be really nice if w3 buffers were put into w3-mode as soon
+as they were created. Then if the rendering craps out somehow then
+the buffer could be browsed such as it was. Ideally, links and
+widgets would be functional.
address@hidden
+document how to translate Netscape foo.pac files to emacs lisp
address@hidden
+Should we stop using reporter.el?
address@hidden itemize
+
+BUGS (4.1):
address@hidden @minus
address@hidden
+background colors are not heeded on table rows (<tr>).  Same
+properties on individual cells or the table as a whole work fine.
address@hidden
+<br> in <dd> hosed --- margins in general tend to be too big sometimes.
address@hidden
+client side imagemaps have to be in the same buffer (actually in the
+smae buffer, _BEFORE_ the usemap directive on an image) --- fix to be
+able to use imagemaps in different files, any position, etc, etc.
address@hidden itemize
+
+FEATURES (4.1)
address@hidden @minus
address@hidden
+cache a formatted version of documents, with enough info to recreate
+the widgets in them.
address@hidden
+w3-preview-region command
address@hidden
+LDAP support (XEmacs)
address@hidden
+New proxy type for sending requests via mail to a mail->web->mail gateway.
address@hidden
+Emacspeak Interaction
+
address@hidden @bullet
address@hidden
+some way of specifying in a stylesheet whether certain text is
+inaudible.  use the 'inaudible text property for this.
address@hidden
+Full Aural-CSS support
address@hidden itemize
+
address@hidden
+more sophisticated filling algorithm. I'm not sure exactly what
+would be sufficient but breaking lines after punctuation  seems like
+it would solve most of the problem.
address@hidden
+When fetching images for viewing (not inlining), W3 should at least
+have an option of displaying it inline, ala Netscape.
address@hidden
+Widget library merging
+
address@hidden @bullet
address@hidden
+Write a font selection widget
address@hidden
+Write a voice selection widget
address@hidden
+Write a mailcap entry widget
address@hidden itemize
+
address@hidden
+Custom library merging
address@hidden custom support for MM}
address@hidden
+Hotlist handling
+
address@hidden @bullet
address@hidden
+Abstract out current support
address@hidden
+Do something similar to GNUS 'backends' to provide easy way to add new
+bookmark formats, etc.
address@hidden itemize
+
address@hidden
+Write a new major mode for handling CSS style sheets
address@hidden itemize
+
+FEATURES (5.0)
+
address@hidden @minus
address@hidden
+Emacspeak Integration
+
address@hidden @bullet
address@hidden
+Need option to turn off table rendering and print it out as a
+table that is viewable with emacspeak-table-ui.el
address@hidden itemize
+
address@hidden
+Write a text/xml parser
address@hidden
+Completely rewrite display code again
+
address@hidden @bullet
address@hidden
+Abstract everything out to follow parse->flow objects->render model
address@hidden
+Base all stylesheet stuff off of DSSSL
address@hidden
+CSS2
address@hidden
+New rendering backends
+
address@hidden @minus
address@hidden
+Native postscript output
address@hidden
+LaTeX upgrade
address@hidden
+TeXinfo
address@hidden itemize
address@hidden itemize
+
address@hidden
+Display code
+
address@hidden @bullet
address@hidden
+implement <spacer> from netscape 3.0b5
address@hidden
+reimplement w3-show-headers
address@hidden
+Handle math environment using the calc library
address@hidden
+Better integration with the parser
address@hidden itemize
address@hidden itemize
+
+
address@hidden Reporting Bugs, Dealing with Firewalls, Future Directions, Top
address@hidden Reporting Bugs
address@hidden Reporting Bugs
address@hidden Bugs
address@hidden Contacting the author
+
+If any bugs are discovered in Emacs/W3, please report them to the
+mailing list @t{w3-beta@@indiana.edu} --- this is where the brave souls
+who beta test the latest versions of Emacs/W3 reside, and are generally
+very responsive to bug reports.
address@hidden gdj1: w3-submit-bug uses address@hidden rather than
address@hidden w3-beta@@indiana.edu, which is correct?
address@hidden w
address@hidden w3-submit-bug
+Please make sure to use the bug submission feature of Emacs/W3, so that
+all relevant information will be sent along with your bug report.  By
+default this is bound to the address@hidden' key when in an Emacs/W3 buffer,
+or you can use @key{M-x w3-submit-bug} from anywhere within Emacs.
+
+For problems that are causing emacs to signal and error, please send a
+backtrace.  You can get a backtrace by @kbd{M-x setvariable RET
+debug-on-error RET t RET}, and then reproduce the error.
+
+If the problem is visual, please capture a copy of the output and mail
+it along with the bug report (preferably as a MIME attachment, but
+anything will do).  You can use the @code{xwd} program under X-windows
+for this, or @key{Alt-PrintScreen} under Windows 95/NT.  Sorry, but I
+don't remember what the magic incarnation is for doing a screen dump
+under NeXTstep or OS/2.
+
+If the problem is actually causing Emacs to crash, then you will need to
+also mail the maintainers of the various Emacs distributions with the
+bug.  Please use the @t{gnu.emacs.bug} newgroup for reporting bugs with
+GNU Emacs 19, and @t{comp.emacs.xemacs} for reporting bugs with XEmacs
+19 or XEmacs 20.  I am actively involved with the beta testing of the
+latest versions of both branches of Emacs, and if I can reproduce the
+problem, I will do my best to see it gets fixed in the next release.
+
+It is also important to always maintain as much context as possible in
+your responses.  I get so much email from my various Emacs-activities
+and work, that I cannot remember everything.  If you send a bug report,
+and I send you a reply, and you reply with 'no that didn't work', then
+odds are I will have no clue what didn't work, much less what that was
+trying to fix in the first place.  It will be much quicker and less
+painful if I don't have to waste a round-trip email exchange saying
+'what are you talking about'.
+
address@hidden Dealing with Firewalls, Proxy Gateways, Reporting Bugs, Top
address@hidden Dealing with Firewalls
+By default, Emacs can support standard @sc{tcp}/@sc{ip} network
+connections on almost all the platforms it runs on (Unix, @sc{vms},
+Windows, etc).  However, there are several situations where it is not
+sufficient.
+
address@hidden @b
address@hidden Firewalls
address@hidden Firewalls
+It is becoming more and more common to be behind a firewall or some
+other system that restricts your outbound network activity, especially
+if you are like me and away from the wonderful world of academia.
+Emacs/W3 has several different methods to get around firewalls (not to
+worry though --- none of them should get you in trouble with the local
address@hidden department.)
+
address@hidden Emacs cannot resolve hostnames.
address@hidden Faulty hostname resolvers
address@hidden Broken SunOS libc
address@hidden Hostname resolution
+This happens quite often on SunOS workstations and some ULTRIX machines.
+Some C libraries do not include the hostname resolver routines in their
+static libraries.  If Emacs was linked statically, and was not linked
+with the resolver libraries, it wil not be able to get to any machines
+off the local network.  This is characterized by being able to reach
+someplace with a raw ip number, but not its hostname
+(@url{http://129.79.254.191/} works, but
address@hidden://www.cs.indiana.edu/} doesn't).
+
+The best solution for this problem is to recompile Emacs, making sure to
+either link dynamically (if available on your operating system), or
+include the @file{-lresolv}.
+
address@hidden url-gateway-broken-resolution
+If you do not have the disk space or the appropriate permissions to
+recompile Emacs, another alternative is using the @file{nslookup}
+program to do hostname resolution.  To turn this on, set the variable
address@hidden in your @file{~/.emacs} file.  This
+runs the program specified by @code{url-gateway-nslookup-program} (by
+default "@code{nslookup}" to do hostname resolution.  This program should
+expect a single argument on the command line --- the hostname to resolve,
+and should produce output similar to the standard Unix @file{nslookup}
+program:
+
address@hidden
+Name: www.cs.indiana.ed
+Address: 129.79.254.191
address@hidden example
+
address@hidden @sc{term}
address@hidden Using @sc{term} (or @sc{term}-like) Networking Software
address@hidden @address@hidden is a user-level protocol for emulating
address@hidden over a serial line.  More information is available at
address@hidden://sunsite.unc.edu/pub/Linux/apps/comm/term}} for slip-like
+access to the internet.
+
address@hidden: XEmacs and Emacs 19.22 or later have patches to enable native
address@hidden networking.  To enable it, @code{#define TERM} in the
+appropriate s/*.h file for the operating system, then change the
address@hidden definition to include the @file{termnet} library that
+comes with the latest versions of @sc{term}.
+
+If you run into any problems with the native @sc{term} networking
+support in Emacs or XEmacs, please let @t{wmperry+w3@@cs.indiana.edu} know,
+as he is responsible for the original support.
address@hidden table
+
address@hidden url-gateway-local-host-regexp
+Emacs/W3 has support for using the gateway mechanism for certain
+domains, and directly connecting to others.  The variable
address@hidden controls this behaviour.  This is a
+regular expression @footnote{Please see the full Emacs distribution for
+a description of regular expressions} that matches local hosts that do
+not require the use of a gateway.  If @code{nil}, then all connections
+are made through the gateway.
+
address@hidden url-gateway-method
+Emacs/W3 supports several methods of getting around gateways.  The
+variable @code{url-gateway-method} controls which of these methods is
+used.  This variable can have several values (use these as symbol names,
+not strings), ie: @samp{(setq url-gateway-method 'telnet)}.  Possible
+values are:
+
address@hidden @dfn
address@hidden telnet
+Use this method if you must first telnet and log into a gateway host,
+and then run telnet from that host to connect to outside machines.
+
address@hidden url-gateway-telnet-host
address@hidden url-gateway-telnet-parameters
address@hidden url-gateway-telnet-password-prompt
address@hidden url-gateway-telnet-user-name
address@hidden url-gateway-prompt-pattern
address@hidden url-gateway-telnet-login-prompt
address@hidden url-gateway-telnet-password
address@hidden @code
address@hidden url-gateway-telnet-host
+The gateway host to telnet to.  Once logged in there, you then telnet
+out to the hosts you want to connect to.
address@hidden url-gateway-telnet-parameters
+This should be a list of parameters to pass to the @file{telnet} program.
address@hidden url-gateway-telnet-password-prompt
+This is a regular expression that matches the password prompt when
+logging in.
address@hidden url-gateway-telnet-login-prompt
+This is a regular expression that matches the username prompt when
+logging in.
address@hidden url-gateway-telnet-user-name
+The username to log in with.
address@hidden url-gateway-telnet-password
+This is the password to send when logging in.
address@hidden url-gateway-prompt-pattern
+This is a regular expression that matches the shell prompt.
address@hidden table
+
+
address@hidden rlogin
+This method is identical to the @code{telnet} method, but uses
address@hidden to log into the remote machine without having to send the
+username and password over the wire every time.
+
address@hidden url-gateway-rlogin-host
address@hidden url-gateway-rlogin-parameters
address@hidden url-gateway-rlogin-user-name
address@hidden url-gateway-prompt-pattern
address@hidden @code
address@hidden url-gateway-rlogin-host
+Host to @samp{rlogin} to before telnetting out.
address@hidden url-gateway-rlogin-parameters
+Parametres to pass to @samp{rsh}.
address@hidden url-gateway-rlogin-user-name
+User name to use when logging in to the gateway.
address@hidden url-gateway-prompt-pattern
+This is a regular expression that matches the shell prompt.
address@hidden table
+
address@hidden tcp
+Masanobu UMEDA (@i{umerin@@mse.kyutech.ac.jp}) has written a very small
+application that you can run in a subprocess to do the network
+connections.
+
address@hidden @sc{socks}
+Use if the firewall has a @sc{socks} gateway running on it.  @sc{socks}
+v5 protocol is defined in @sc{rfc1928}.
+
address@hidden socks-password
address@hidden socks-username
address@hidden socks-timeout
address@hidden socks-server
address@hidden socks-server-aliases
address@hidden socks-network-aliases
address@hidden socks-redirection-rules
address@hidden socks-nslookup-program
address@hidden @code
address@hidden socks-password
+If this is @code{nil} then you will be asked for the passward, otherwise
+it will be used as the password for authenticating you to the @sc{socks}
+server.
+
address@hidden socks-username
+This is the username to use when authenticating yourself to the
address@hidden server.  By default this is your login name
+
address@hidden socks-timeout
+This controls how long, in seconds, Emacs/W3 will wait for responses from the
address@hidden server; it is 5 by default.
+
address@hidden socks-server
+Thiss the default server, it take the form (@samp{"Default server"}
address@hidden @var{port} @var{version}) where @var{version} can be either
+4 or 5.
+
address@hidden socks-server-aliases
+This a list of server aliases.  It is a list of aliases of the form
address@hidden(alias hostname port version)}.
+
address@hidden socks-network-aliases
+This a list of network aliases.  Each entry in the list takes the form
address@hidden(alias (network))} where @var{alias} is a string that names the
address@hidden  The networks can contain a pair (not a dotted pair) of
address@hidden addresses which specify a range of @sc{ip} addresses, an @sc{ip}
+address and a netmask, a domain name or a unique hostname or @sc{ip}
+address.
+
address@hidden socks-redirection-rules
+This a list of redirection rules.  Each rule take the form
address@hidden(Destination network Connection type)} where @var{Destination
+network} is a network alias from @code{socks-network-aliases} and
address@hidden type} can be @code{nil} in which case a direct
+connection is used, or it can be an alias from
address@hidden in which case that server is used as a
+proxy.
+
address@hidden socks-nslookup-program
+This the @samp{nslookup} program.  It is @samp{nslookup} by default.
address@hidden table
+
+
address@hidden @item ssl
address@hidden This probably shouldn't be documented
+
address@hidden native
+This means that Emacs/W3 should use the builtin networking code of
+Emacs.  This should be used only if there is no firewall, or the Emacs
+source has already been hacked to get around the firewall.
address@hidden table
+
+Emacs/W3 should now be able to get outside the local network.  If none
+of this makes sense, its probably my fault.  Please check with the
+network administrators to see if they have a program that does most of
+this already, since somebody somewhere at the company has probably been
+through something similar to this before, and would be much more
+helpful/knowledgeable about the local setup than I would be.  But feel
+free to mail me as a last resort.
+
address@hidden Proxy Gateways, Installing SSL, Dealing with Firewalls, Top
address@hidden Proxy Gateways
address@hidden url-proxy-services
address@hidden Proxy Servers
address@hidden Proxies
address@hidden Proxies, environment variables
address@hidden HTTP Proxy
+
+In late January 1993, Kevin Altis and Lou Montulli proposed and
+implemented a new proxy service.  This service requires the use of
+environment variables to specify a gateway server/port # to send
+protocol requests to.  Each protocol (@sc{http}, @sc{wais}, gopher,
address@hidden, etc.) can have a different gateway server.  The environment
+variables are @code{PROTOCOL}_proxy, where @code{PROTOCOL} is one of the
+supported network protocols (gopher, file, @sc{http}, @sc{ftp}, etc.)
+
address@hidden No Proxy
address@hidden Proxies, exclusion lists
address@hidden NO_PROXY
+For companies with internal intranets, it will usually be helpful to
+define a list of hosts that should be contacted directly, @b{not} sent
+through the proxy.  The @code{NO_PROXY} environment variable controls
+what hosts are able to be contacted directly.  This should be a comma
+separated list of hostnames, domain names, or a mixture of both.
+Asterisks can be used as a wildcard.  For example:
+
address@hidden
+NO_PROXY=*.aventail.com,home.com,*.seanet.com
address@hidden example
+
+tells Emacs/W3 to contact all machines in the @b{aventail.com} and
address@hidden domains directly, as well as the machine named
address@hidden
+
address@hidden url-proxy-services
address@hidden Proxies, setting from lisp
+For those adventurous souls who enjoy writing regular expressions, all
+the proxy settings can be manipulated from Emacs-Lisp.  The variable
address@hidden controls this.  This is an assoc list, keyed
+on the protocol type (@sc{http}, gopher, etc) in all lowercase.  The
address@hidden of each entry should be the @sc{address} of the proxy server
+to contact, followed by ":" and the port number to use. In the case of
+the special "no_proxy" entry, it should be a regular expression that
+matches any hostnames that should be contacted directly.
+
address@hidden
+(setq url-proxy-services '(("http"     . "proxy.aventail.com:80")
+                           ("no_proxy" . "^.*\\(aventail\\|seanet\\)\.com")))
address@hidden example
+
address@hidden Installing SSL, Mailcap Files, Proxy Gateways, Top
address@hidden Installing SSL
address@hidden HTTP/1.0 Authentication
address@hidden Secure Sockets Layer
address@hidden SSL
address@hidden Gag Puke Retch
address@hidden Exportability
address@hidden Export Restrictions
+In order to use SSL in Emacs/W3, an implementation of SSL is necessary.
+Emacs/W3 is configued to work out of the box with SSLeay 0.6.6 or later.
+For best results, you should apply a patch that makes the SSLeay client
+much quieter about what it reports.
+
+You can download SSLeay from
address@hidden://ftp.psy.uq.oz.au/pub/Crypto/SSL/}
+
+The following variables control how the external program is invoked.
+
address@hidden @code
address@hidden ssl-program-name
address@hidden ssl-program-name
+The name of the program to run, as a string.
+
address@hidden
+(setq ssl-program-name "s_client")
address@hidden example
+
address@hidden ssl-program-arguments
address@hidden ssl-program-arguments
+This should be used if your SSL program needs command line switches to
+specify any behaviour (certificate file locations, etc).  This is a list
+of strings and symbols.
+
+The special symbols 'host and 'port may be used in the list of arguments
+and will be replaced with the hostname and service/port that will be
+connected to.
+
address@hidden
+(setq ssl-program-arguments '("-host" host "-port" service "-verify" "4"
+                              "-CApath /usr/local/ssl/certs"))
address@hidden example
address@hidden table
+The default is ("-host" host "-port" service "-verify"
address@hidden -CApath @var{ssl-certificate-directory}).
+
address@hidden ssl-certificate-directory
address@hidden is the directory in which @sc{ca}
+certificates are stored.  It is
address@hidden@var{w3-configuration-directory}/cert} by default.
+
address@hidden ssl-rehash-program-name
address@hidden is the program that is run after adding a
+certificate to the @code{ssl-certificate-directory} directory.  It is
+run with the directory name as an argument and defaults to @code{c_rehash}.
+
address@hidden ssl-view-certificate-program-name
address@hidden ssl-view-certificate-program-arguments
address@hidden names the program that can
+produce a human-readable view of a certificate.  It is @code{x509} by
+default and is called with the arguments listed in
address@hidden which is @code{("text"
+"-inform" "DER")} by default.
+
address@hidden ssl-certificate-directory-style
address@hidden specifies the type of certificate
+database to use.  It's default (and at the moment, only possible value)
+is @code{ssleay} which specifies a directory or pem encoded certificates
+with hash symlinks.
+
address@hidden ssl-certificate-verification-policy
+You can decide how high up the chain of certificates should
+be verified by setting @code{ssl-certificate-verification-policy}.  Possible
+values are
address@hidden @asis
address@hidden 0
+No verification
address@hidden 1
+Verification required
address@hidden 3
+Reject connection if verification fails
address@hidden 5
+SSL_VERIFY_CLIENT_ONCE
address@hidden table
+The default is 0
+
address@hidden Mailcap Files, Down with DoubleClick, Installing SSL, Top
address@hidden Mailcap Files
+NCSA Mosaic and almost all other WWW browsers rely on a separate file
+for mapping MIME types to external viewing programs.  This takes some of
+the burden off of browser developers, so each browser does not have to
+support all image formats, or postscript, etc.  Instead of having the
+users of Emacs/W3 duplicate this in lisp, this file can be parsed using
+the @code{mm-parse-mailcaps} function.  This function is called each
+time Emacs/W3 is loaded.  It tries to locate mimetype files in several
+places. If the environment variable @code{MAILCAPS} is nonempty, then
+this is assumed to specify a UNIX-like path of mimetype files (this is a
+colon separated string of pathnames).  If the @code{MAILCAPS}
+environment variable is empty, then Emacs/W3 looks for these
+files:
+
address@hidden
address@hidden
address@hidden/.mailcap}
address@hidden
address@hidden/etc/mailcap}
address@hidden
address@hidden/usr/etc/mailcap}
address@hidden
address@hidden/usr/local/etc/mailcap}
address@hidden enumerate
+
+This format of this file is specified in RFC 1343, but a brief synopsis
+follows (this is taken verbatim from sections of RFC 1343).
+
+Each mailcap file consists of a set of entries that describe the proper
+handling of one media type at the local site.  For example, one line
+might tell how to display a message in Group III fax format.  A mailcap
+file consists of a sequence of such individual entries, separated by
+newlines (according to the operating system's newline
+conventions). Blank lines and lines that start with the "#" character
+(ASCII 35) are considered comments, and are ignored.  Long entries may
+be continued on multiple lines if each non-terminal line ends with a
+backslash character ('\', ASCII 92), in which case the multiple lines
+are to be treated as a single mailcap entry.  Note that for such
+"continued" lines, the backslash must be the last character on the line
+to be continued.
+
+Each mailcap entry consists of a number of fields, separated by
+semi-colons.  The first two fields are required, and must occur in the
+specified order.  The remaining fields are optional, and may appear in
+any order.
+
+The first field is the content-type, which indicates the type of data
+this mailcap entry describes how to handle.  It is to be matched against
+the type/subtype specification in the "Content-Type" header field of an
+Internet mail message.  If the subtype is specified as "*", it is
+intended to match all subtypes of the named content-type.
+
+The second field, view-command, is a specification of how the message or
+body part can be viewed at the local site.  Although the syntax of this
+field is fully specified, the semantics of program execution are
+necessarily somewhat operating system dependent.
+
+The optional fields, which may be given in any order, are as follows:
address@hidden @bullet
address@hidden
+The "compose" field may be used to specify a program that can be used to
+compose a new body or body part in the given format.  Its intended use
+is to support mail composing agents that support the composition of
+multiple types of mail using external composing agents.  As with the
+view- command, the semantics of program execution are operating system
+dependent.  The result of the composing program may be data that is not
+yet suitable for mail transport---that is, a Content-Transfer-Encoding
+may need to be applied to the data.
address@hidden
+The "composetyped" field is similar to the "compose" field, but is to be
+used when the composing program needs to specify the Content-type header
+field to be applied to the composed data.  The "compose" field is
+simpler, and is preferred for use with existing (non-mail-oriented)
+programs for composing data in a given format.  The "composetyped" field
+is necessary when the Content-type information must include auxilliary
+parameters, and the composition program must then know enough about mail
+formats to produce output that includes the mail type
+information.
address@hidden
+The "edit" field may be used to specify a program that can be used to
+edit a body or body part in the given format.  In many cases, it may be
+identical in content to the "compose" field, and shares the
+operating-system dependent semantics for program execution.
address@hidden
+The "print" field may be used to specify a program that can be used to
+print a message or body part in the given format.  As with the
+view-command, the semantics of program execution are operating system
+dependent.
address@hidden
+The "test" field may be used to test some external condition (e.g.  the
+machine architecture, or the window system in use) to determine whether
+or not the mailcap line applies.  It specifies a program to be run to
+test some condition.  The semantics of execution and of the value
+returned by the test program are operating system dependent.  If the
+test fails, a subsequent mailcap entry should be sought.  Multiple test
+fields are not permitted---since a test can call a program, it can
+already be arbitrarily complex.
address@hidden
+The "needsterminal" field indicates that the view-command must be run on
+an interactive terminal.  This is needed to inform window-oriented user
+agents that an interactive terminal is needed.  (The decision is not
+left exclusively to the view-command because in some circumstances it
+may not be possible for such programs to tell whether or not they are on
+interactive terminals.)  The needsterminal command should be assumed to
+apply to the compose and edit commands, too, if they exist.  Note that
+this is NOT a test---it is a requirement for the environment in which
+the program will be executed, and should typically cause the creation of
+a terminal window when not executed on either a real terminal or a
+terminal window.
address@hidden
+The "copiousoutput" field indicates that the output from the
+view-command will be an extended stream of output, and is to be
+interpreted as advice to the UA (User Agent mail- reading program) that
+the output should be either paged or made scrollable. Note that it is
+probably a mistake if needsterminal and copiousoutput are both
+specified.
address@hidden
+The "description" field simply provides a textual description,
+optionally quoted, that describes the type of data, to be used
+optionally by mail readers that wish to describe the data before
+offering to display it.
address@hidden
+The "x11-bitmap" field names a file, in X11 bitmap (xbm) format, which
+points to an appropriate icon to be used to visually denote the presence
+of this kind of data.
address@hidden
+Any other fields beginning with "x-" may be included for local or
+mailer-specific extensions of this format.  Implementations should
+simply ignore all such unrecognized fields to permit such extensions,
+some of which might be standardized in a future version of this
+document.
address@hidden itemize
+
address@hidden Down with DoubleClick, Temporary, Mailcap Files, Top
address@hidden Down with DoubleClick
+:: WORK :: Document why doubleclick is address@hidden
+:: WORK :: Document how you can never see another ad from them again
+
address@hidden Temporary, General Index, Down with DoubleClick, Top
address@hidden  node-name,  next,  previous,  upGeneral Index
+
address@hidden @appendix Temporary
+
address@hidden @subsection base64
address@hidden @itemize @code
address@hidden 
address@hidden gdj1: What is DSSSL?
address@hidden 
address@hidden @vindex font-maximum-slippage
address@hidden @item font-maximum-slippage
address@hidden This specifies how much a font can vary from the desired size.  
It is a
address@hidden string and the default value is @samp{1pt}.
+
address@hidden @vindex font-family-mappings
address@hidden @item font-family-mappings
address@hidden This is an alist that tells Emacs/W3 what fonts correspond to the
address@hidden @sc{html} font families.  The format is @code{(@var{html_family}
address@hidden . (@var{fonts}))}.
address@hidden 
address@hidden @end itemize
+
address@hidden General Index, Key Index, Temporary, Top
address@hidden General Index
address@hidden fn
address@hidden Key Index,  , General Index, Top
address@hidden Key Index
address@hidden ky
address@hidden
address@hidden

-----------------------------------------------------------------------


hooks/post-receive
-- 
ELPA



reply via email to

[Prev in Thread] Current Thread [Next in Thread]