Index: unitag.module
===================================================================
--- unitag.module	(revision 2612)
+++ unitag.module	(working copy)
@@ -42,12 +42,22 @@
       'type' => MENU_DEFAULT_LOCAL_TASK
     );
     $items[] = array(
+      'path' => 'admin/content/taxonomy/unitag/denials',
+      'title' => t('Manage denials'),
+      'callback' => 'drupal_get_form',
+      'callback arguments' => array('unitag_manage_suggestions_form'),
+      'access' => user_access('administer taxonomy'),
+      'type' => MENU_LOCAL_TASK,
+      'weight' => 1,
+    );
+    $items[] = array(
       'path' => 'admin/content/taxonomy/unitag/settings',
       'title' => t('Settings'),
       'callback' => 'drupal_get_form',
       'callback arguments' => array('unitag_settings_form'),
       'access' => user_access('administer taxonomy'),
-      'type' => MENU_LOCAL_TASK
+      'type' => MENU_LOCAL_TASK,
+      'weight' => 3,
     );
     $items[] = array(
       'path' => 'unitag/autocomplete',
@@ -232,6 +242,7 @@
  * @return $form
  */
 function unitag_manage_suggestions_form() {
+  $denials = arg(4) === 'denials';
   // Display suggestions table.
   $form['term_suggestions'] = array(
     '#type' => 'fieldset',
@@ -242,7 +253,7 @@
   );
 
   // Grab available suggestions.
-  $suggestions = unitag_suggestions_get();
+  $suggestions = unitag_suggestions_get($denials);
   $utids = array();
   foreach ($suggestions as $suggestion) {
     $utids[$suggestion->utid] = '';
@@ -271,7 +282,8 @@
       'new-term' => t('Approve as new terms'),
       'new-synonym' => t('Approve as synonyms of the root term'),
       'new-child' => t('Approve as children of the parent terms'),
-      'deny' => t('Deny and delete')
+      'deny' => t('Deny'),
+      'delete' => t('Delete'),
     ),
     '#prefix' => '<div class="container-inline">'
   );
@@ -376,6 +388,9 @@
           unitag_suggestion_delete($suggestion, TRUE);
           break;
         case 'deny':
+          unitag_suggestion_deny($suggestion);
+          break;
+        case 'delete':
           unitag_suggestion_delete($suggestion);
           break;
       }
@@ -679,8 +694,10 @@
   // Perform the equivalent of a REPLACE. This ensures that case corrections
   // go into the database correctly.
   $basename = _unitag_get_basename($suggestion);
+  // check that this suggestion hasn't already been denied
+  $result = db_query("SELECT utid FROM {unitag} WHERE basename = '%s' AND deny = utid", $basename);
   db_query("DELETE FROM {unitag} WHERE nid = %d AND vid = %d AND basename = '%s'", $nid, $vid, $basename);
-  db_query("INSERT INTO {unitag} (nid, vid, name, basename) VALUES (%d, %d, '%s', '%s')", $nid, $vid, $suggestion, $basename);
+  db_query("INSERT INTO {unitag} (nid, vid, name, basename, deny) VALUES (%d, %d, '%s', '%s', %d)", $nid, $vid, $suggestion, $basename, db_result($result));
 
   watchdog('taxonomy', t('Unitag: Added %name as a suggestion for node <a href="!url">%nid</a>.', array('%name' => $suggestion, '!url' => url('node/'. $nid), '%nid' => $nid)), WATCHDOG_NOTICE);
 }
@@ -716,6 +733,20 @@
 }
 
 /**
+ * Deny a suggestion.  Marking a suggestion as denied will blacklist this
+ * suggestion from further additions.
+ *
+ * @param $suggestion
+ *   The suggestion object which is to be denied.
+ */
+function unitag_suggestion_deny($suggestion) {
+  // Delete this entry.
+  db_query("UPDATE {unitag} SET deny = %d WHERE utid = %d", $suggestion->utid,$suggestion->utid);
+  watchdog('taxonomy', t('Unitag: denied suggestion %name.', array('%name' => $suggestion->name)), WATCHDOG_NOTICE);
+}
+
+
+/**
  * Delete a suggestion.
  *
  * @param $suggestion
@@ -737,11 +768,14 @@
 /**
  * Retrieve all available suggestions.
  *
+ * @param $denial
+ *   boolean used to specify the retrival of denied terms
  * @return Array
  *   An array of suggestions.
  */
-function unitag_suggestions_get() {
-  $result = db_query("SELECT u.*, n.title FROM {unitag} u INNER JOIN {node} n USING (nid) ORDER BY u.vid, u.name, u.nid DESC");
+function unitag_suggestions_get($denial) {
+  $where = $denial ? 'WHERE u.deny != 0' : 'WHERE u.deny = 0';
+  $result = db_query("SELECT u.*, n.title FROM {unitag} u INNER JOIN {node} n USING (nid) $where ORDER BY u.vid, u.name, u.nid DESC");
   $suggestions = array();
   while ($suggestion = db_fetch_object($result)) {
     $suggestions[$suggestion->utid] = $suggestion;
Index: unitag.install
===================================================================
--- unitag.install	(revision 2612)
+++ unitag.install	(working copy)
@@ -38,6 +38,26 @@
 }
 
 /**
+ * Implementation of hook_update_N()
+ */
+function unitag_update_1() {
+  $ret = array();
+
+  switch ($GLOBALS['db_type']) {
+    case 'pgsql':
+        db_add_column($ret, 'unitag', 'deny', 'int', array('default' => 0, 'not null' => TRUE));
+        break;
+
+    case 'mysql':
+    case 'mysqli':
+        $ret[] = update_sql("ALTER TABLE {unitag} ADD `deny` int unsigned NOT NULL default 0");
+        break;
+  }
+
+  return $ret;
+}
+
+/**
  * Implementation of hook_uninstall().
  */
 function unitag_uninstall() {
