? ajax-error.patch
Index: feedback.css
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/feedback/feedback.css,v
retrieving revision 1.4.2.1
diff -u -p -r1.4.2.1 feedback.css
--- feedback.css	8 Jan 2010 16:55:07 -0000	1.4.2.1
+++ feedback.css	31 Dec 2010 01:45:29 -0000
@@ -68,6 +68,9 @@
   width: 200px;
 }
 #block-feedback-form #feedback-throbber {
+  min-height: 20px;
+}
+* html #block-feedback-form #feedback-throbber {
   height: 20px;
 }
 #block-feedback-form .throbbing {
@@ -77,3 +80,6 @@
   background-color: #fff;
   margin: 0;
 }
+#block-feedback-form #feedback-error-message {
+  color: #ff0000;
+}
Index: feedback.js
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/feedback/feedback.js,v
retrieving revision 1.3.2.2
diff -u -p -r1.3.2.2 feedback.js
--- feedback.js	8 Jan 2010 22:21:11 -0000	1.3.2.2
+++ feedback.js	31 Dec 2010 01:45:29 -0000
@@ -55,25 +55,43 @@ Drupal.feedbackFormToggle = function ($b
 };
 
 /**
- * Collapse or uncollapse the feedback form block.
+ * Submit the feedback form.
  */
 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');
+  $.ajax({
+    url: $form.get(0).action,
+    type: 'POST',
+    data: $form.serialize(),
+    success: 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('');
+      Drupal.feedbackFormReset($form);
+      // Blend out status message.
+      window.setTimeout(function () {
+        $('#feedback-status-message').fadeOut('slow', function () {
+          $(this).remove();
+        });
+      }, 3000);
+    },
+    error: function () {
+      Drupal.feedbackFormReset($form);
+      // Display error message.
+      $("#feedback-throbber").prepend('<div id="feedback-error-message">' + Drupal.t("An error occurred.") + '</div>');
+    },
+    dataType: 'json'
+  });
   return false;
 };
 
+/**
+ * Reset the feedback form.
+ */
+Drupal.feedbackFormReset = function ($form) {
+  $("#feedback-error-message").remove();
+  $('#feedback-throbber', $form).removeClass('throbbing');
+  $('#feedback-submit', $form).show();
+}
