Index: feedback.css
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/feedback/feedback.css,v
retrieving revision 1.7
diff -u -p -r1.7 feedback.css
--- feedback.css	15 Jan 2011 07:13:13 -0000	1.7
+++ feedback.css	15 Jan 2011 12:28:07 -0000
@@ -1,12 +1,14 @@
 /* $Id: feedback.css,v 1.7 2011/01/15 07:13:13 sun Exp $ */
 
+/**
+ * Styles for the feedback form.
+ */
 /* Reset commonly set styles */
 #block-feedback-form,
 #block-feedback-form .feedback-link,
 #block-feedback-form .feedback-link *,
 #block-feedback-form .content,
-#block-feedback-form form,
-#block-feedback-form form label {
+#block-feedback-form form {
   float: none;
   margin: 0;
   padding: 0;
@@ -16,7 +18,6 @@
   color: inherit;
 }
 
-
 #block-feedback-form {
   display: none;
   position: fixed;
@@ -43,31 +44,30 @@
   padding: 6px;
   background-color: #fff;
   opacity: 0.9;
-  max-width: 220px;
+  max-width: 300px;
 }
 /* IE6 doesn't support max-width. */
 * html #block-feedback-form form {
-  width: 220px;
+  width: 300px;
 }
 #block-feedback-form .feedback-help {
   margin: 0 0 0.5em;
   font-size: 10px;
   line-height: normal;
 }
-#block-feedback-form .feedback-submitted {
-  margin-top: 0.2em;
-  font-size: 10px;
-}
 #block-feedback-form .feedback-message {
   height: 10ex;
 }
-#block-feedback-form #feedback-throbber {
-  height: 20px;
-}
-#block-feedback-form .throbbing {
-  background: url(images/throbber.gif) no-repeat left center;
+#block-feedback-form .ajax-progress .throbber {
+  background: transparent url(images/throbber.gif) no-repeat left center;
+  height: 16px;
+  width: 16px;
 }
-#block-feedback-form #feedback-submit {
-  background-color: #fff;
-  margin: 0;
+
+/**
+ * Styles for existing feedback messages.
+ */
+#block-feedback-form .feedback-submitted {
+  margin-top: 0.2em;
+  font-size: 10px;
 }
Index: feedback.js
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/feedback/feedback.js,v
retrieving revision 1.7
diff -u -p -r1.7 feedback.js
--- feedback.js	12 Nov 2010 01:26:01 -0000	1.7
+++ feedback.js	15 Jan 2011 12:13:19 -0000
@@ -31,22 +31,33 @@ Drupal.behaviors.feedbackForm = {
             Drupal.feedbackFormToggle($block, true);
           }
         );
-      $block.find('form').hide()
-        .find(':input[name="ajax"]').val(1).end()
-        .submit(function() {
-          // Toggle throbber/button.
-          $('#feedback-throbber', this).addClass('throbbing');
-          $('#feedback-submit', this).fadeOut('fast', function () {
-            Drupal.feedbackFormSubmit($(this).parents('form'));
-          });
-          return false;
-        });
+      $block.find('form').hide();
       $block.show();
     });
   }
 };
 
 /**
+ * Re-collapse the feedback form after every successful form submission.
+ */
+Drupal.behaviors.feedbackFormSubmit = {
+  attach: function (context) {
+    var $context = $(context);
+    if (!$context.is('#feedback-status-message')) {
+      return;
+    }
+    // Collapse the form.
+    $('#block-feedback-form .feedback-link').click();
+    // Blend out and remove status message.
+    window.setTimeout(function () {
+      $context.fadeOut('slow', function () {
+        $context.remove();
+      });
+    }, 3000);
+  }
+};
+
+/**
  * Collapse or uncollapse the feedback form block.
  */
 Drupal.feedbackFormToggle = function ($block, enable) {
@@ -59,27 +70,4 @@ Drupal.feedbackFormToggle = function ($b
   }
 };
 
-/**
- * Collapse or uncollapse the feedback form block.
- */
-Drupal.feedbackFormSubmit = function ($form) {
-  $.post($form.get(0).action, $form.serialize(), function (data) {
-    // Collapse the form.
-    $('#block-feedback-form').find('.feedback-link').click();
-    // Display status message.
-    $form.parent().parent().append('<div id="feedback-status-message">' + data.message + '</div>');
-    // Reset form values.
-    $(':input[name="message"]', $form).val('');
-    $('#feedback-throbber', $form).removeClass('throbbing');
-    $('#feedback-submit', $form).show();
-    // Blend out status message.
-    window.setTimeout(function () {
-      $('#feedback-status-message').fadeOut('slow', function () {
-        $(this).remove();
-      });
-    }, 3000);
-  }, 'json');
-  return false;
-};
-
-})(jQuery)
+})(jQuery);
Index: feedback.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/feedback/feedback.module,v
retrieving revision 1.82
diff -u -p -r1.82 feedback.module
--- feedback.module	15 Jan 2011 06:42:37 -0000	1.82
+++ feedback.module	15 Jan 2011 12:37:19 -0000
@@ -116,8 +116,6 @@ function feedback_form($form, &$form_sta
 
   // Store the path on which this form is displayed.
   $form['location'] = array('#type' => 'value', '#value' => $_GET['q']);
-  // Allow the form to be submitted via AJAX.
-  $form['ajax'] = array('#type' => 'hidden', '#default_value' => 0);
 
   $form['help'] = array(
     '#prefix' => '<div class="feedback-help">',
@@ -152,12 +150,24 @@ function feedback_form($form, &$form_sta
     '#required' => TRUE,
     '#wysiwyg' => FALSE,
   );
-  $form['submit'] = array(
+  $form['actions'] = array(
+    '#type' => 'actions',
+    // Without clearfix, the AJAX throbber wraps in an ugly way.
+    // @todo Patch #type actions in core?
+    '#attributes' => array('class' => array('clearfix')),
+  );
+  $form['actions']['submit'] = array(
     '#type' => 'submit',
-    '#value' => t('Send'),
+    '#value' => t('Send feedback'),
     '#id' => 'feedback-submit',
-    '#prefix' => '<div id="feedback-throbber">',
-    '#suffix' => '</div>',
+    '#ajax' => array(
+      'wrapper' => 'feedback-form',
+      'callback' => 'feedback_form_ajax_callback',
+      'progress' => array(
+        'type' => 'throbber',
+        'message' => '',
+      ),
+    ),
   );
 
   return $form;
@@ -171,14 +181,47 @@ function feedback_form_submit($form, &$f
   $entry->message = $form_state['values']['message'];
   $entry->location = $form_state['values']['location'];
   feedback_save($entry);
-  $message = t('Thanks for your feedback!');
-  if ($form_state['values']['ajax']) {
-    drupal_json_output(array('message' => $message));
-    exit;
-  }
-  else {
-    drupal_set_message($message);
+
+  drupal_set_message(t('Thanks for your feedback!'));
+}
+
+/**
+ * AJAX callback for feedback_form() submissions.
+ */
+function feedback_form_ajax_callback($form, &$form_state) {
+  // If there was a form validation error, re-render the entire form.
+  if (!$form_state['executed']) {
+    return $form;
   }
+
+  // Otherwise, return a fresh copy of the form, so the user may post additional
+  // feedback.
+  // Reset the static cache of drupal_html_id().
+  // @see drupal_process_form()
+  // @see drupal_html_id()
+  $seen_ids = &drupal_static('drupal_html_id');
+  $seen_ids = array();
+
+  // Prevent the form from being processed again.
+  // @see drupal_build_form()
+  list($form, $new_form_state) = ajax_get_form();
+  $new_form_state['input'] = array();
+  drupal_process_form($form['#form_id'], $form, $new_form_state);
+
+  // Return AJAX commands in order to output the special success message.
+  // @see ajax_deliver()
+  $build = array('#type' => 'ajax');
+  $html = drupal_render($form);
+  $build['#commands'][] = ajax_command_insert(NULL, $html);
+
+  // A successful form submission normally means that there were no errors, so
+  // we only render status messages.
+  $messages = drupal_get_messages();
+  $messages += array('status' => array());
+  $messages = implode('<br />', $messages['status']);
+  $html = '<div id="feedback-status-message">' . $messages . '</div>';
+  $build['#commands'][] = ajax_command_append('#block-feedback-form', $html);
+  return $build;
 }
 
 /**
