%doc>
Example:
  include( 'elements/edit.html',  
    'name'  =>
    'table' =>
    #? 'primary_key' => #required when the dbdef doesn't know...???
    'labels' => {
                  'column' => 'Label',
                }
   
    listref - each item is a literal column name (or method) or hashref
                                                             or (notyet) coderef
    if not specified all columns (except for the primary key) will be editable
    'fields' => [
                  'columname',
                  { 'field' => 'another_columname',
                    'type'  => 'text', #text
                                       #money
                                       #checkbox
                                       #select
                                       #selectlayers
                                       #title
                                       #hidden - hidden value from object
                                       #fixed - display fixed value from here
                                       #fixedhidden - hidden value from here
                    'value' => 'Y', #for checkbox, title, fixed, fixedhidden
                    'disabled' => 0,
                    'onchange' => 'javascript_function',
                    'm2name_table'   => 'table_name',   #only tested w/
                                                        # selectlayers so far
                                                        # might work w/select
                                                        # dunno others
                    'm2name_namecol' => 'name_column',  # 
                    'm2name_label'   => 'Label',        #
                    'm2name_new_default' => \@table_name_objects, #default
                                                                  #m2name
                                                                  #objects for
                                                                  #new records
                    'm2name_error_callback' => sub { my($cgi, $object) = @_; },
                    'm2name_remove_warnings' => \%warnings, #hashref of warning
                                                            #messages for
                                                            #m2name removal
                    'm2name_new_js' => 'function_name', #javascript function
                                                        #called on spawned rows
                                                        #(one arg: new_element)
                    'm2name_remove_js' => 'function_name', #js function called
                                                           #when a row is
                                                           #deleted
                                                           #(three args:
                                                           # value, text,
                                                           #  'no_match')
                    #layer_fields & layer_values_callback only for selectlayer
                    'layer_fields' => [
                                        'fieldname'     => 'Label',
                                        'another_field' => {
                                          label=>'Label',
                                          type =>'text', #text, money
                                        },
                                      ],
                    'layer_values_callback' =>
                      sub {
                            my( $cgi, $object ) = @_;
                            { 'layer'  => { 'fieldname'  => 'current_value',
                                            'fieldname2' => 'field2value',
                                            ...
                                          },
                              'layer2' => { 'l2fieldname' => 'l2value',
                                            ...
                                          },
                              ...
                            };
                          },
                  },
                ]
   
    'menubar'     => '', #menubar arrayref
    #agent virtualization
    'agent_virt'       => 1,
    'agent_null_right' => 'Access Right Name',
   
    #run when re-displaying with an error
    'error_callback' => sub { my( $cgi, $object, $fields_listref ) = @_; },
   
    #run when editing
    'edit_callback' => sub { my( $cgi, $object, $fields_listref ) = @_; },
   
    # returns a hashref for the new object
    'new_hashref_callback'
   
    #run when adding
    'new_callback' => sub { my( $cgi, $object, $fields_listref ) = @_; },
   
    #XXX describe
    'field_callback' => sub { },
   
    #string or coderef of additional HTML to add before 
    'html_table_bottom' => '',
   
    'viewall_dir' => '', #'search' or 'browse', defaults to 'search'
   
    'html_bottom' => '', #string
    'html_bottom' => sub {
                           my $object = shift;
                           # ...
                           "html_string";
                         },
   
    # overrides default popurl(1)."process/$table.html"
    'post_url' => popurl(1).'process/something', 
  );
%doc>
<% include("/elements/header.html", $title,
              include( '/elements/menubar.html', @menubar )
           )
%>
% if ( $cgi->param('error') ) { 
  Error: <% $cgi->param('error') %>
  
% } 
% my $url = $opt{'post_url'} || popurl(1)."process/$table.html";