Added link to the graph2 page.
Added links in the wrapper to the login and logout pages.
Added table with a user's collections to his details page.
Added widgets to edit a user's collections and create new ones on his edit page.
Fixed inserting an extra column in a user's list of collections.
Actually show collection information instead of words in a user's list of collections.
Fixed copy/paste error in user's edit page (not a work!).
Enabled the collection edit button and changed it to "Save".
Changed user object in loop to use the correct name.
Changed "disabled" attributes to "readonly."

The "disabled" attribute prevents the user from editing an input element, but
it also prevents that value from being submitted in the form.  This is not an
acceptable situation, so the input elements in the user's edit collection
table have been changed to use "readonly" attributes, instead.  This also has
the side-benefit of allowing the user to select the text in those fields, for
example so he can copy them.
Added controller actions to add new collections and to edit collections.
Added new method create_graph to create a graph.

This is an attempt to generalize how graphs are created.  The new create_graph
method takes several parameters that specify what is being graphed, and how it
is being graphed.  The $works_rs object is the result set containing the works
that should be graphed, and the $ref_rs object is the result set containing
the references that should be graphed.  Each of these result sets should have
the necessary columns to perform this graphing (this is not error-proof).  For
example, if a user is logged in, the works_rs object should have columns for
the current user's metadata about the works.  This method returns the file
name (not the path) to the file of the graph that was created.
Updated create_work_graph method to use create_graph method.

The create_work_graph method previously created a graph for a work and its
references (both what it reference and what referenced it).  This required two
searches to get all of the references, as well as additional queries to get
work information for works other than the initial one.  This new version of
the method uses the generic create_graph method to do the heavy lifting for
actually creating the GraphViz graph.  Instead of the aforementioned searches,
it uses the id of the work passed in to find all works referencing it or
referenced by it, and then all related references, and passes these result
sets to the create_graph method.
Added method create_work_reading_graph.

Here, a "reading graph" is being defined as the graph of works and references
between works for a work that indicate what works need to be read before one
can expect to be able to understand that work.  If a person wants to be
"safe," he can read all of thw works first.  If not, he can skip some of the
works lower in the tree.  Later, additional colors wiil be added to help the
person easily see the status or state of each work in the graph.
Create the reading graph for a work in its details controller.
Display the work's reading graph on its details page.
Collect information on each node for the reading graph.

After creating the search result set for works, iterate through it and get the
number of times each work references another work and how many times a work is
referenced.  Store these in hashes, and use the set of keys for the latter to
get the list of works to search for references in.
Add a work's depth value to its graph node.

If a Work result set has the depth column, store it as the node's rank.  Note
that this value is not currently used anywhere, as the "rank" in GraphViz is
for subgraphs only, not nodes.
Use rankdir in the graph2 action, but not in the create_graph method.

I am not convinced the rankdir property has any effect if no subgraphs are
being used, especially if no subgraphs are being given ranks.  For now, do not
set the rankdir value in the create_graph method.
Use the default GraphViz layout in the create_graph method.

For now, use only the default GraphViz layout for graphs created in the
create_graph method.  The default layout resembles a tree more, with "from"
nodes above "to" nodes.  This makes the reading graphs much more readable, but
does not help the general reference graphs.  The different graphing methods
will need to at some point specify how they should be laid out, or include
some information that will be mapped to a GraphViz layout internally.