--- drupal/sites/all/modules/cck/nodereference.module	2008/01/23 23:49:21	1.1.1.1
+++ drupal/sites/all/modules/cck/nodereference.module	2008/02/18 03:04:39	1.3
@@ -1,5 +1,5 @@
 <?php
-// $Id: nodereference.module,v 1.1.1.1 2008/01/23 23:49:21 gordonh Exp $
+// $Id: nodereference.module,v 1.3 2008/02/18 03:04:39 gordonh Exp $
 
 /**
  * @file
@@ -37,6 +37,12 @@ function nodereference_field_settings($o
   switch ($op) {
     case 'form':
       $form = array();
+      $form['bidirectional'] = array(
+        '#type' => 'checkbox',
+        '#title' => t('Bi-directional reference'),
+        '#default_value' => isset($field['bidirectional']) ? $field['bidirectional'] : 0,
+        '#description' => t('Checking this will, on shared fields alter the node that is being referenced to add a link back to the current node.'),
+      );
       $form['referenceable_types'] = array(
         '#type' => 'checkboxes',
         '#title' => t('Content types that can be referenced'),
@@ -81,7 +87,7 @@ function nodereference_field_settings($o
       return $form;
 
     case 'save':
-      $settings = array('referenceable_types');
+      $settings = array('referenceable_types', 'bidirectional');
       if (module_exists('views')) {
         $settings[] = 'advanced_view';
         $settings[] = 'advanced_view_args';
@@ -124,10 +130,58 @@ function nodereference_field($op, &$node
         }
       }
       return;
+
+    case 'insert':
+    case 'update':
+      if ($field['bidirectional'] && empty($node->nr_norecurse)) {
+        if ($nids = array_map('nodereference_nids', $items)) {
+          if ($op == 'update' && ($old = node_load($node->nid)) && isset($old->{$field['field_name']})) {
+            $old_nids = array_map('nodereference_nids', $old->{$field['field_name']});
+            foreach (array_diff($old_nids, $nids) as $nid) {
+              if ($nid && ($ref = node_load($nid)) && ($match = array_filter($ref->{$field['field_name']}, create_function('$a', "return \$a['nid'] == '{$node->nid}';")))) {
+                $ref->nr_norecurse = TRUE;
+                $ref->revision = $node->revision;
+                foreach ($match as $key => $value) {
+                  if ($field['multiple'] && $key > 0) {
+                    unset($ref->{$field['field_name']}[$key]);
+                  }
+                  else {
+                    $ref->{$field['field_name']}[$key]['nid'] = 0;
+                  }
+                }
+                node_save($ref);
+              }
+            }
+          }
+          foreach ($nids as $nid) {
+            if ($nid && ($ref = node_load($nid)) && 
+                ((isset($ref->{$field['field_name']}) && 
+                !array_filter($ref->{$field['field_name']}, 
+                  create_function('$a', "return \$a['nid'] == '{$node->nid}';")
+                  )
+                ) || !isset($ref->{$field['field_name']}))) {
+              $ref->nr_norecurse = TRUE;
+              $ref->revision = $node->revision;
+              $ref->{$field['field_name']}[] = array(
+                'nid' => $node->nid,
+              );
+              node_save($ref);
+            }
+          }
+        }
+      }
+      break; 
   }
 }
 
 /**
+ * Create a list of Nodes
+ */
+function nodereference_nids($item) {
+  return $item['nid'];
+}
+
+/**
  * Implementation of hook_field_formatter_info().
  */
 function nodereference_field_formatter_info() {
@@ -527,4 +581,4 @@ function _nodereference_filter_handler($
   $options = array(0 => t('<empty>'));
   $options = $options + _nodereference_potential_references($filterinfo['extra']['field']);
   return $options;
-}
\ No newline at end of file
+}
