Index: trunk/lib/Text/FormBuilder.pm
===================================================================
--- trunk/lib/Text/FormBuilder.pm	(revision 80)
+++ trunk/lib/Text/FormBuilder.pm	(revision 81)
@@ -296,5 +296,8 @@
         title => $self->{form_spec}{title},
         text  => $self->{form_spec}{description},
-        submit => $self->{form_spec}{submit},
+        # use 'defined' so we are able to differentiate between 'submit = 0' (no submit button)
+        # and 'submit = undef' (use default submit button)
+        ( defined $self->{form_spec}{submit} ? (submit => $self->{form_spec}{submit}) : () ),
+        reset => $self->{form_spec}{reset},
         template => {
             type => 'Text',
@@ -305,4 +308,5 @@
             },
             data => {
+                #TODO: make FB aware of sections
                 sections    => $self->{form_spec}{sections},
                 author      => $self->{form_spec}{author},
@@ -534,5 +538,5 @@
                 # mark invalid fields
                 if ($$_{invalid}) {
-                    $OUT .= qq[<td>$$_{field} <span class="comment">$$_{comment}</span> ] . $msg_invalid . q[</td>];
+                    $OUT .= qq[<td>$$_{field} <span class="comment">$$_{comment}</span> $$_{error}</td>];
                 } else {
                     $OUT .= qq[<td>$$_{field} <span class="comment">$$_{comment}</span></td>];
@@ -551,7 +555,7 @@
                 $OUT .= qq[    <td><span class="fieldgroup">];
                 $OUT .= join(' ', map { qq[<small class="sublabel">$$_{label}</small> $$_{field} $$_{comment}] } @group_fields);
-                #TODO: allow comments on field groups
-                $OUT .= " ] . $msg_invalid . q[" if grep { $$_{invalid} } @group_fields;
-                
+                if (my @invalid = grep { $$_{invalid} } @group_fields) {
+                    $OUT .= ' ' . join('; ', map { $$_{error} } @invalid);
+                }                
                 $OUT .= qq[ <span class="comment">$$line[1]{comment}</span></span></td>\n];
                 $OUT .= qq[  </tr>\n];
@@ -566,5 +570,5 @@
     }
 %>
-  <tr><th></th><td style="padding-top: 1em;"><% $submit %></td></tr>
+  <tr><th></th><td style="padding-top: 1em;"><% $submit %> <% $reset %></td></tr>
 </table>
 </fieldset>
@@ -965,5 +969,7 @@
     }
     
-    !submit button label, button label 2, ...
+    !submit label, label 2, ...
+    
+    !reset label
 
 =head2 Directives
@@ -1024,4 +1030,11 @@
 rendered together at the bottom of the form. See L<CGI::FormBuilder> for an
 explanation of how the multiple submit buttons work together in a form.
+
+To disable the display of any submit button, use C<!submit 0>
+
+=item C<!reset>
+
+The label for the a reset button at the end of the form. No reset button will be
+rendered unless you use this directive.
 
 =back
@@ -1244,6 +1257,4 @@
 Make sure that multiple runs of the parser don't share data.
 
-Allow renaming and inclusion of a reset button
-
 Warn/suggest using the C<!submit> directive if some uses C<foo:submit>?
 
Index: trunk/lib/Text/FormBuilder/grammar
===================================================================
--- trunk/lib/Text/FormBuilder/grammar	(revision 80)
+++ trunk/lib/Text/FormBuilder/grammar	(revision 81)
@@ -64,4 +64,5 @@
 		()
 	    ),
+	    reset => $formspec{reset},
 	}
     }
@@ -111,5 +112,5 @@
 field_line: <skip:'[ \t]*'> ( field | comment | blank ) "\n"
 
-line: <skip:'[ \t]*'> ( title | author | pattern_def | section_head | heading | submit | group_field | field_group | unknown_directive | field | comment | blank ) /\n+/
+line: <skip:'[ \t]*'> ( title | author | pattern_def | section_head | heading | submit | reset | group_field | field_group | unknown_directive | field | comment | blank ) /\n+/
 
 title: '!title' /.*/
@@ -155,4 +156,10 @@
 	#warn scalar(@{ $item[2] }) . ' submit button(s)';
 	push @submit, @{ $item[2] };
+    }
+
+reset: '!reset' string
+    {
+	warn "[Text::FormBuilder] Reset button redefined at input text line $thisline\n" if defined $formspec{reset};
+	$formspec{reset} = $item{string};
     }
 
