Index: modules/ecommerce/contrib/authorize_net/authorize_net.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ecommerce/contrib/authorize_net/authorize_net.module,v
retrieving revision 1.27.2.4
diff -u -r1.27.2.4 authorize_net.module
--- modules/ecommerce/contrib/authorize_net/authorize_net.module	11 Aug 2006 00:27:50 -0000	1.27.2.4
+++ modules/ecommerce/contrib/authorize_net/authorize_net.module	15 Aug 2006 16:45:47 -0000
@@ -455,6 +455,8 @@
 
     default: // Credit card error: card was not charged.
       drupal_set_message($return[3], 'error');
+      // Allow other modules to enable editing of transaction data.
+      module_invoke_all('ec_transaction_error_edit', $edit['txnid'], $payment_url, 'billing');
       drupal_goto($payment_url);
       break;
   }
Index: modules/ecommerce/contrib/ecivicrm/ecivicrm.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ecommerce/contrib/ecivicrm/ecivicrm.module,v
retrieving revision 1.23.2.4
diff -u -r1.23.2.4 ecivicrm.module
--- modules/ecommerce/contrib/ecivicrm/ecivicrm.module	2 Aug 2006 06:21:29 -0000	1.23.2.4
+++ modules/ecommerce/contrib/ecivicrm/ecivicrm.module	15 Aug 2006 16:44:51 -0000
@@ -470,6 +470,23 @@
   }
 }
 
+/**
+ * Implementation of hook_ec_transaction_error_edit().
+ */
+function ecivicrm_ec_transaction_error_edit($txnid, $destination, $data = '') {
+  global $user;
+  $txn = store_transaction_load($txnid);
+  civicrm_initialize(true);
+  $contact = $txn->civicrm_cid ? crm_get_contact(array('contact_id' => $txn->civicrm_cid)) : ecivicrm_get_contact($txn->uid);
+  $locations = crm_get_locations($contact);
+  foreach($locations as $location) {
+    if ($location->address->street_address == $txn->address['billing']->street1 && $location->address->postal_code == $txn->address['billing']->zip) {
+      drupal_set_message(l("user/{$user->uid}/eaddress/edit/{$location->id}/$txnid/$data", t('Edit billing address.'), NULL, "destination=$destination"));
+      return;
+    }
+  }
+}
+
 function ecivicrm_address_page($action = NULL, $location_id = NULL) {
   global $user;
   $uid = $user->uid;
@@ -504,6 +521,19 @@
           '#value' => $location,
         );
       }
+      // If we're editing a transaction address, pass the txnid.
+      if ($txnid = arg(5)) {
+        $form['txnid'] = array(
+          '#type' => 'value',
+          '#value' => $txnid,
+        );
+        if ($txn_data = arg(6)) {
+          $form['txn_data'] = array(
+            '#type' => 'value',
+            '#value' => $txn_data,
+          );
+        }
+      }
       $output.= drupal_get_form('ecivicrm_address_form', $form);
       break;
 
@@ -836,6 +866,11 @@
 
     $uid = crm_uf_get_uf_id($contact->id);
   }
+  // If the address is being edited for a transaction, update the transaction's address. 
+  if ($form_values['txnid']) {
+    // TODO: the address won't be in the correct format. Fix.
+    store_transaction_addresses_save($form_values, $form_values['txn_data']);    
+  }
   if ($uid) {
     return "user/{$uid}/eaddress";
   }
