--- editablefields.module.old	2009-01-01 14:26:13.000000000 +0100
+++ editablefields.module	2009-01-01 14:49:37.000000000 +0100
@@ -7,14 +7,6 @@
  */
 
 /**
- * Implementation of hook_init().
- */
-function editablefields_init() {
-  drupal_add_js(drupal_get_path('module', 'editablefields') . '/editablefields.js');
-  drupal_add_js('misc/jquery.form.js');
-}
-
-/**
  * Implementation of hook_menu().
  */
 function editablefields_menu() {
@@ -65,6 +57,8 @@ function editablefields_field_formatter_
  * Theme the editable field.
  */
 function theme_editablefields_formatter_editable($element) {
+  static $js_ready;
+
   $field_name = $element['#field_name'];
   $field = content_fields($field_name);
   $node = $element['#node'];
@@ -82,6 +76,16 @@ function theme_editablefields_formatter_
   else {
     $formatter_name = 'default';
     if ($formatter = _content_get_formatter($formatter_name, $field['type'])) {
+      if (!isset($js_ready)) {
+        $js_ready = TRUE;
+        drupal_add_js('misc/jquery.form.js');
+        drupal_add_js(drupal_get_path('module', 'editablefields') . '/editablefields.js');
+        $settings = array(
+          'url_html' => url('editablefields_html', array('absolute' => TRUE)),
+          'url_submit' => url('editablefields_submit', array('absolute' => TRUE)),
+        );
+        drupal_add_js(array('editablefields' => $settings), 'setting');
+      }
       $theme = $formatter['module'] .'_formatter_'. $formatter_name;
       return '<div class="editablefields" nid="'. $node->nid .'" field="'. $field_name. '">'. theme($theme, $element) .'</div>';
     }
@@ -126,11 +130,11 @@ function editablefields_form_builder(&$f
  */
 function editablefields_html() {
   $nid = arg(1);
-  $field = arg(2);
+  $field_name = arg(2);
   $node = node_load($nid);
   if (node_access('update', $node)) {
-    //  $html = _editablefields_create_form($node, $field);
-    $html = drupal_get_form('editablefields_form', $node, $field);
+    //  $html = _editablefields_create_form($node, $field_name);
+    $html = drupal_get_form('editablefields_form', $node, $field_name);
     $object = new StdClass();
     $object->content = $html;
     // Register the JavaScript callback for this module.
@@ -150,31 +154,31 @@ function editablefields_html() {
  */
 function editablefields_submit() {
   $nid = $_POST['nid'];
-  $field = $_POST['field'];
+  $field_name = $_POST['field'];
   $node = node_load($nid);
 
   if (node_access('update', $node)) {
     $form_state = array('values' => $_POST);
-    $value=$_POST[$field];
-    if (is_array($node->{$field})) {
-      $err = drupal_execute('editablefields_form', $form_state, $node, $field);
+    if (is_array($node->{$field_name})) {
+      $err = drupal_execute('editablefields_form', $form_state, $node, $field_name);
       if ($err) {
         drupal_set_header('HTTP/1.1 404 Not Found');
         print t('Error handling submition') . $err;
         exit();
       }
-      if ($node->{$field} != $form_state['values'][$field]) {
-        $node->{$field} = $form_state['values'][$field];
+      if ($node->{$field_name} != $form_state['values'][$field_name]) {
+        $node->{$field_name} = $form_state['values'][$field_name];
         node_save($node);
       }
-    } else {
+    }
+    else {
       drupal_set_header('HTTP/1.1 404 Not Found');
-      print t('No field found, of name: %field', array('%field' => $field));
+      print t('No field found, of name: %field', array('%field' => $field_name));
     }
   }
   else {
     drupal_set_header('HTTP/1.1 404 Not Found');
-    print t('No write permissions for %field', array('%field' => $field));
+    print t('No write permissions for %field', array('%field' => $field_name));
   }
   exit();
 }
--- editablefields.js.old	2009-01-01 14:25:40.000000000 +0100
+++ editablefields.js	2009-01-01 14:50:02.000000000 +0100
@@ -1,75 +1,66 @@
 // $Id: editablefields.js,v 1.1.2.5 2009/01/01 12:20:59 markfoodyburton Exp $
 
-Drupal.behaviors.editablefields = function(context) {  
-  $('div.editablefields',context).not('.noonload').each(function() {
-                                                          $(this).children().css('opacity', '0.3');
-                                                          editablefieldsload(this, Drupal.settings.basePath+"?q=/editablefields_html/" + $(this).attr("nid") + "/" + $(this).attr("field"));
-                                                        });
-  $('div.editablefields',context).change(editablefieldschanger);
-  $('div.editablefields',context).submit(editablefieldschanger);
-  
-  
-  var updateValue;
-  
-  function editablefieldsupdater(element) {
-    var nid=$(element).attr("nid");
-    var field=$(element).attr("field");
-    $(element).children().css('opacity', '0.3');
-    $.ajax({
-    type: "POST",
-          url: "?q=/editablefields_submit",
-          data: $(element).find('form').serialize()+"&nid="+nid+"&field="+field,
-          element: $(element),
-          success: function(msg) {
-          updateValue = 0;
-          editablefieldsload($(this.element), Drupal.settings.basePath+"?q=/editablefields_html/" + $(this.element).attr("nid") + "/" + $(this.element).attr("field"));
-        },
-          error: function(msg) {
-          alert( "Error, unable to make update: " + msg.responseText);
-        }
-      });
-  };
-  
-  function editablefieldsload(e, url) {
-    $(e).ajaxSubmit({
+Drupal.behaviors.editablefields = function(context) {
+  $('div.editablefields', context).not('.editablefields-processed').each(function() {
+    $(this).addClass('.editablefields-processed');
+    Drupal.editablefields.load(this);
+  });
+};
+
+Drupal.editablefields = {};
+
+Drupal.editablefields.load = function(element) {
+  var url = Drupal.settings.editablefields.url_html + "/" + $(element).attr("nid") + "/" + $(element).attr("field");
+  $.ajax({
     url: url,
-          type: 'GET',
-          success: function(response) {
-          // Call all callbacks.
-          if (response.__callbacks) {
-            $.each(response.__callbacks, function(i, callback) {
-                     eval(callback)(e, response);
-                   });
-          }
-          $(e).html(response.content);
-          Drupal.attachBehaviors(e);
-          $(e).find(':input').change(editablefieldschanger);
-          $(e).find(':input').submit(editablefieldschanger);
-        },
-          error: function(response) {
-          alert(Drupal.t("An error occurred at ") + url);
-        },
-          dataType: 'json'
-          });
+    type: 'GET',
+    success: function(response) {
+      // Call all callbacks.
+      if (response.__callbacks) {
+        $.each(response.__callbacks, function(i, callback) {
+          eval(callback)(element, response);
+        });
+      }
+      $(element).html(response.content);
+      Drupal.attachBehaviors(element);
+      $(element).find(':input').change(function() {
+        Drupal.editablefields.onchange(this);
+      });
+    },
+    error: function(response) {
+      alert(Drupal.t("An error occurred at ") + url);
+    },
+    dataType: 'json'
+  });
+};
+
+Drupal.editablefields.onchange = function(element) {
+  if (!$(element).hasClass('editablefields')) {
+    element = $(element).parents('div.editablefields');
   }
-  
-  function editablefieldschanger() {
-    var t=this;
-    
-    if (!$(this).hasClass('editablefields')) {
-      t = $(this).parents('div.editablefields');
-    }
-    
-    newValue = $(t).find('form').serialize();
-    
-// all this does is prevent you from submitting the same data twice... If in the
-// meantime the user hits a different button, then, I guess the user knows what
-// they want.
-    if (newValue != updateValue) {
-      updateValue = newValue;
-      editablefieldsupdater($(t));
+
+  // Provide some feedback to the user while the form if being processed.
+  $(element).children().css('opacity', '0.5');
+
+  // Send the field form.
+  $.ajax({
+    type: "POST",
+    url: Drupal.settings.editablefields.url_submit,
+    data: $(element).find('form').serialize() + "&nid=" + $(element).attr("nid") + "&field=" + $(element).attr("field"),
+    element: $(element),
+    success: function(msg) {
+      Drupal.editablefields.load(element);
+    },
+    error: function(msg) {
+      alert(Drupal.t("Error, unable to make update:") +" "+ msg.responseText);
     }
-    return false; // dont actually submit
-  };
-};
+  });
+
+  // Ensure same changes are not submitted more than once.
+  $(element).find(':input').each(function() {
+    $(this).attr("disabled", true);
+  });
 
+  // Do not actually submit.
+  return false;
+};
