--- modules/taxonomy_access/taxonomy_access_admin.inc	2007-06-26 18:59:45.000000000 -0400
+++ modules/taxonomy_access/taxonomy_access_admin.inc	2008-01-24 16:16:03.775000726 -0500
@@ -72,9 +72,13 @@ function theme_taxonomy_access_admin() {
 function taxonomy_access_admin_delete_role($rid) {
   if (is_numeric($rid) AND $rid > 2 AND db_fetch_array(db_query('SELECT rid FROM {term_access_defaults} WHERE vid=0 AND rid=%d', $rid))) {
     if ($_POST['confirm']) {
+      // issue #167977 - klance
+      $affected_nodes = _taxonomy_access_get_nodes_for_role($rid);
       db_query('DELETE FROM {term_access} WHERE rid=%d', $rid);
       db_query('DELETE FROM {term_access_defaults} WHERE rid=%d', $rid);
-      node_access_rebuild();
+      // issue #167977 - klance
+      //node_access_rebuild();
+      _taxonomy_access_node_access_update($affected_nodes);            
       drupal_set_message("All term access rules deleted for role $rid.");
       drupal_goto('admin/user/taxonomy_access');
     }
@@ -278,18 +282,27 @@ function taxonomy_access_admin_form_subm
     if (is_array($form_values['selected_terms'])) {
       foreach($form_values['selected_terms'] as $tid => $enabled) {
         if ($enabled) {
+          // issue #167977 - klance
+          $affected_nodes = _taxonomy_access_get_nodes_for_term($tid);
           db_query('DELETE FROM {term_access} WHERE rid = %d AND tid = %d', $form_values['rid'], $tid);
+          // issue #167977 - klance
+          _taxonomy_access_node_access_update($affected_nodes);
         }
       }
     }
     if (is_array($form_values['selected_defaults'])) {
       foreach($form_values['selected_defaults'] as $vid => $enabled) {
         if ($enabled) {
+          // issue #167977 - klance
+          $affected_nodes = _taxonomy_access_get_nodes_for_vocabulary($vid, $form_values['rid']);
           db_query('DELETE FROM {term_access_defaults} WHERE rid = %d AND vid = %d', $form_values['rid'], $vid);
+          // issue #167977 - klance
+          _taxonomy_access_node_access_update($affected_nodes);
         }
       }
     }
-    node_access_rebuild();
+    // issue #167977 - klance
+    //node_access_rebuild();
     break;
   case t('Add'):
     $new = $form_values['new'];
@@ -299,7 +312,8 @@ function taxonomy_access_admin_form_subm
     } elseif ($type == 'default') {
       taxonomy_access_defaults_update($id, $form_values['rid'], $new['grants']);
     }
-    node_access_rebuild();
+    // issue #167977 - klance
+    //node_access_rebuild();
     break;
   case t('Save all'):
     foreach($form_values['grants'] as $vid => $rows) {
@@ -311,7 +325,8 @@ function taxonomy_access_admin_form_subm
         }
       }
     }
-    node_access_rebuild();
+    // issue #167977 - klance
+    //node_access_rebuild();
     drupal_goto('admin/user/taxonomy_access');
   }
 }
@@ -351,9 +366,13 @@ function taxonomy_access_grant_update($t
     $ta_sql_values .= ")";
   }
   $ta_sql .= $sql . $ta_sql_values;
-
+  
+  // issue #167977 - klance
+  $affected_nodes = _taxonomy_access_get_nodes_for_term($tid);
   db_query("DELETE FROM {term_access} WHERE tid=%d AND rid=%d", $tid, ($rid));
   db_query($ta_sql);  // insert into term_access
+  // issue #167977 - klance
+  _taxonomy_access_node_access_update($affected_nodes);
 }
 
 /**
@@ -392,8 +411,12 @@ function taxonomy_access_defaults_update
   }
   $ta_sql .= $sql . $ta_sql_values;
 
+  // issue #167977 - klance
+  $affected_nodes = _taxonomy_access_get_nodes_for_vocabulary($vid, $rid);
   db_query("DELETE FROM {term_access_defaults} WHERE vid=%d AND rid=%d", $vid, $rid);
   db_query($ta_sql);  // insert into term_access_defaults
+  // issue #167977 - klance
+  _taxonomy_access_node_access_update($affected_nodes);
 }
 
 /**
@@ -462,3 +485,84 @@ function taxonomy_access_get_default_gra
   return $grants;
 }
 
+/*
+ * Issue #167977 - klance
+ * Gets node ids associated with a given term
+ * @param $tid
+ *    The term id for which to retrieve associated nodes
+ * @return $nid
+ *    An array of node ids associated with the given term
+ */
+function _taxonomy_access_get_nodes_for_term($tid) {
+  $nid = array();
+  $result = db_query("SELECT nid FROM {term_node} WHERE tid = '$tid'");
+  
+  while($node = db_fetch_object($result)) {
+    $nid[] = $node->nid;
+  }
+  return $nid;
+}
+
+/*
+ * Issue #167977 - klance
+ * Gets node ids associated with a given vocabulary
+ * @param $vid
+ *    The vocabulary id for which to retrieve associated term ids
+ * @params $rid
+ *    The role id for which to retrieve associated term ids
+ * @return $nid
+ *    An array of node ids associated with the given term
+ */
+function _taxonomy_access_get_nodes_for_vocabulary($vid, $rid = NULL) {
+  $nid = array();
+  $query = "SELECT n.nid FROM {term_node} n
+    LEFT JOIN {term_data} d ON n.tid = d.tid
+    LEFT JOIN {term_access} a ON n.tid = a.tid
+    WHERE d.vid = '$vid'";
+  if(!is_null($rid)) {
+    $query .= " AND a.rid = '$rid'";
+  }
+  $result = db_query($query);
+  
+  while($node = db_fetch_object($result)) {
+    $nid[] = $node->nid;
+  }
+  return $nid;
+}
+
+/*
+ * Issue #167977 - klance
+ * Gets node ids associated with the given role
+ * @param $rid
+ *    The role id for which to retrieve term ids that are
+ *    access-controlled for this role
+ * @return $nid
+ *    An array of node ids associated with the given term
+ */
+function _taxonomy_access_get_nodes_for_role($rid) {
+  $nid = array();
+  $result = db_query("
+    SELECT n.nid FROM {term_node} n LEFT JOIN {term_access} a ON n.tid = a.tid WHERE a.rid = '$rid'
+  ");
+  
+  while($node = db_fetch_object($result)) {
+    $nid[] = $node->nid;
+  }
+  return $nid;
+}
+
+/*
+ * Issue #167977
+ * Gets node ids associated with the given term
+ * @return $nid
+ *    An array of node ids for which to acquire access permissions
+ */
+function _taxonomy_access_node_access_update($nid) {
+  foreach($nid as $node) {
+    $loaded_node = node_load($node, NULL, TRUE);
+    if (!empty($loaded_node)) {
+      node_access_acquire_grants($loaded_node);
+    }
+  }
+  return TRUE;
+}
