#
#  Updates the trackback module to work with the spam module 2.0 rewrite.  Note
#  that this effectively removes much code from the trackback module, as this
#  functionality is now provided automatically by the spam module.
#
#  This also removes the 'spam_trackbacks' table, for which there is no longer
#  any need.
#
#  Reasons to upgrade to the new spam module:
#   - many serious bugs have been fixed
#   - automatically learns and blocks spammer IPs, preventing trackbacks from
#     known spammer IPs
#   - prevents repeated posting of the same identical content over and over
#   - provides a logging mechanism to understand why a trackback was or was
#     not marked as spam
#
#  For more information, please see the following web page:
#     http://www.kerneltrap.org/jeremy/drupal/spam/
#

--- trackback.module.orig	2005-08-11 18:47:19.000000000 -0400
+++ trackback.module	2005-08-12 09:53:57.000000000 -0400
@@ -39,20 +39,21 @@
     $trackback->excerpt = (strlen($_REQUEST['excerpt'] > 255) ? truncate_utf8($_REQUEST['excerpt'], 252) .'...' : $_REQUEST['excerpt']);
     $trackback->status = (variable_get('trackback_moderation', 0) == 0) ? 1 : 0;
     //watchdog('trackback', t('trackback: added \'%subject\'', array('%subject' => $trackback->subject)), l(t('view trackback'), 'node/'. $node->nid, NULL, NULL, 'trackback-'. $trackback->trid));
-    
+
+    // drop silently if this is from a known spammer IP address
+    if (function_exists('spam_filter') && variable_get('trackback_spam_filter', 1)) {
+      module_invoke('spam', 'ip_filter', 'trackback', $trackback->trid);
+    }
+
     watchdog('trackback', t('trackback: added \'%subject\'', array('%subject' => $trackback->subject)), WATCHDOG_NOTICE, l(t('view trackback'), 'node/'. $node->nid .'#trackback-'. $trackback->trid));
     
     db_query("INSERT INTO {trackback_received} (trid, nid, created, site, name, subject, url, excerpt, status) VALUES (%d, %d, %d, '%s', '%s', '%s', '%s', '%s', %d)", $trackback->trid, $trackback->nid, $trackback->created, $trackback->site, $trackback->name, $trackback->subject, $trackback->url, $trackback->excerpt, $trackback->status);
     $error = 0;
     
-    if (function_exists('spam_check') && variable_get('trackback_spam_filter', 1)) {
-      // trid, subject and body are used by spam_check()
-      // Put everything we want to check for spam in the trackback body and subject
-      // Since everything has already been inserted into the database and since the value
-      // of the $trackback variable's attributes will not be used again in this function,
-      // we can modify the attributes as we want before passing it on to the spam check.
-      $trackback->subject = $trackback->subject .' '. $trackback->url;
-      spam_check($trackback, 'excerpt', 'subject', 'trackback_spam_actions', 'insert');
+    if (function_exists('spam_filter') && variable_get('trackback_spam_filter', 1)) {
+      // invoke spam.module's spam filter
+      $subject = "$trackback->subject $trackback->url";
+      module_invoke('spam', 'filter', 'trackback', $trackback->trid, $subject, $trackback->excerpt);
     }
   }
   else {
@@ -122,6 +123,10 @@
   if ($trackback_received = db_fetch_object($result)) {
     if (isset($_POST['op'])) {
       db_query('DELETE FROM {trackback_received} WHERE trid = %d', $trid);
+      if (module_exist('spam')) {
+        db_query("DELETE FROM {spam_tracker} WHERE id = %d AND source = 'trackback'", $trid);
+        spam_log(SPAM_LOG, t('spam_delete_trackback: deleted trackback.'), 'trackback', $trid);
+      }
       drupal_goto('node/'. $trackback_received->nid .'#trackbacks');
     }
     else {
@@ -292,11 +297,6 @@
 
     // Other stuff:
     if (module_exist('spam')) {
-      $items[] = array('path' => 'spam/trackback', 'title' => t('spam trackback'),
-                       'type' => MENU_CALLBACK, 'access' => $access,
-                       'callback' => 'trackback_spam_page'
-                      );
-                      
       $items[] = array('path' => 'admin/trackback/list/spam', 'title' => t('spam'),
                        'callback' => 'trackback_spam_admin_overview', 'access' => $access,
                        'type' => MENU_LOCAL_TASK, 'weight' => 10
@@ -329,15 +329,8 @@
     if ($op == t('Update trackbacks') && isset($edit['operation']) && isset($edit['status'])) {
       $function = $edit['operation'];
       foreach ($edit['status'] as $trid => $value) {
-        if ($spam_module_exists) {
-          $trackback = db_fetch_object(db_query('SELECT tr.*, st.spam FROM {trackback_received} tr LEFT JOIN {spam_trackbacks} st ON tr.trid = st.trid WHERE tr.trid = %d', $trid));
-          $trackback->spam = isset($trackback->spam) ? $trackback->spam : 0;
-        }
-        else {
-          $trackback = db_fetch_object(db_query('SELECT * FROM {trackback_received} WHERE trid = %d', $trid));
-        }
         if ($value) {
-          $function($trackback);
+          $function($trid);
         }
       }
 
@@ -352,14 +345,14 @@
   $header[] = array('data' => t('Host'), 'field' => 'tr.site');
   $header[] = array('data' => t('Status'), 'field' => 'tr.status');
   if ($spam_module_exists) {
-    $header[] = array('data' => t('Spam'), 'field' => 'st.spam');
+    $header[] = array('data' => t('Spam'), 'field' => 's.probability');
   }
   $header[] = array('data' => t('Time'), 'field' => 'created', 'sort' => 'desc');
   $header[] = array('data' => t('Operations') , 'colspan' => '2');
 
   $status = ($type == 'approval') ? 0 : 1;
   if ($spam_module_exists) {
-    $sql = 'SELECT tr.*, st.spam FROM {trackback_received} tr LEFT JOIN {spam_trackbacks} st ON tr.trid = st.trid WHERE tr.status = '. db_escape_string($status);
+    $sql = 'SELECT tr.*, s.probability FROM {trackback_received} tr LEFT JOIN {spam_tracker} s ON tr.trid = s.id WHERE tr.status = '. db_escape_string($status);
   }
   else {
     $sql = 'SELECT tr.* FROM {trackback_received} tr WHERE tr.status = '. db_escape_string($status);
@@ -377,7 +370,7 @@
           format_name($trackback),
           $trackback->site,
           ($trackback->status != 0 ? t('Published') : t('Not published')),
-          ($trackback->spam ? t('Spam') : t('Not Spam')), // only difference between if, else for "if ($spam_module_exists)..."
+          ($trackback->probability >= variable_get('spam_threshold', 80) ? t('Spam') : t('Not Spam')), // only difference between if, else for "if ($spam_module_exists)..."
           format_date($trackback->created, 'small'),
           l(t('edit'), "admin/trackback/edit/$trackback->trid"),
           l(t('delete'), "admin/trackback/delete/$trackback->trid")
@@ -409,18 +402,18 @@
 
   $operations = array();
   if (module_exist('spam')) {
-    $operations['trackback_spam_admin_mark_spam'] = t('Mark the selected trackbacks as spam');
-    $operations['trackback_spam_admin_mark_notspam'] = t('Mark the selected trackbacks as not spam');
+    $operations['spam_spam_trackback'] = t('Mark the selected trackbacks as spam');
+    $operations['spam_notspam_trackback'] = t('Mark the selected trackbacks as not spam');
   }
   if ($type == 'new') {
-    $operations['trackback_spam_admin_unpublish'] = t('Unpublish the selected trackbacks');
+    $operations['spam_unpublish_trackback'] = t('Unpublish the selected trackbacks');
   }
   else {
-    $operations['trackback_spam_admin_publish'] = t('Publish the selected trackbacks');
+    $operations['spam_publish_trackback'] = t('Publish the selected trackbacks');
   }
   
   if (module_exist('spam')) {
-    $operations['trackback_spam_delete_spam'] = t('Delete the selected trackbacks (no confirmation)');
+    $operations['spam_delete_trackback'] = t('Delete the selected trackbacks (no confirmation)');
   }
   else {
     $operations['trackback_delete'] = t('Delete the selected trackbacks (no confirmation)');
@@ -589,14 +582,29 @@
   $return = array();
   switch ($op) {
     case 'filter_settings':
-      $return['group'] = form_checkbox(t('Filter trackbacks'), 'trackback_spam_filter', 1, variable_get('trackback_spam_filter', 1), t('If checked, the spam module will check all new trackbacks that are posted to this site and attempt to determine whether or not they are spam.  Trackbacks do not support moderation at this time; you will have to check your watchdog for spam trackbacks and delete them by doing to the trackback itself from the link in the watchdog.'));
+    {
+      $return['group'] = form_checkbox(t('Filter trackbacks'), 'trackback_spam_filter', 1, variable_get('trackback_spam_filter', 1), t('Enable this option to filter new trackbacks as they are posted, determining whether or not they are spam.'));
+      break;
+    }
+    case 'page':
+    {
+      $trackback = trackback_load($a2);
+      $return['old'] = spam_load('trackback', $a2);
+      $return['header'] = "$trackback->subject $trackback->url";
+      $return['body'] = $trackback->excerpt;
+      $return['goto'] = "node/$trackback->nid/#trackbacks";
       break;
+    }
   }
   return $return;
 }
 
 function trackback_delete($trackback) {
   db_query('DELETE FROM {trackback_received} WHERE trid = %d', $trackback->trid);
+  if (module_exist('spam')) {
+    db_query("DELETE FROM {spam_tracker} WHERE id = %d AND source = 'trackback'", $trackback->trid);
+    spam_log(SPAM_LOG, t('spam_delete_trackback: deleted trackback "%subject".', array('%subject' => "<em>$trackback->subject</em>")), 'trackback', $trackback->trid);
+  }
   watchdog('spam', t('Deleted trackback <em>%subject</em>.  The trackback was posted to %link.', array('%subject' => "$trackback->subject", '%link' => l(url('node/'. $trackback->nid, NULL, NULL, TRUE), url('node/'. $trackback->nid)))));
 }
 
@@ -634,10 +642,10 @@
 function trackback_spam_admin_overview() {
   drupal_set_title('spam trackbacks');
   $operations = array(
-    array(t('Mark the selected trackbacks as not spam'), 'trackback_spam_admin_mark_notspam'),
-    array(t('Unpublish the selected trackbacks'), 'trackback_spam_admin_unpublish'),
-    array(t('Publish the selected trackbacks'), 'trackback_spam_admin_publish'),
-    array(t('Delete the selected trackbacks (no confirmation)'), 'trackback_spam_delete_spam')
+    array(t('Mark the selected trackbacks as not spam'), 'spam_notspam_trackback'),
+    array(t('Unpublish the selected trackbacks'), 'spam_unpublish_trackback'),
+    array(t('Publish the selected trackbacks'), 'spam_publish_trackback'),
+    array(t('Delete the selected trackbacks (no confirmation)'), 'spam_delete_trackback')
   );
 
   $op = $_POST['op'];
@@ -645,9 +653,8 @@
   if ($op == t('Update trackbacks') && isset($_POST['edit']['operation']) && isset($_POST['edit']['status'])) {
     $function = $operations[$_POST['edit']['operation']][1];
     foreach ($_POST['edit']['status'] as $trid => $value) {
-      $trackback = db_fetch_object(db_query('SELECT tr.*, st.spam FROM {trackback_received} tr LEFT JOIN {spam_trackbacks} st ON tr.trid = st.trid WHERE tr.trid = %d', $trid));
       if ($value) {
-        $function($trackback);
+        $function($trid);
       }
     }
 
@@ -664,7 +671,7 @@
     array('data' => t('Operations'), 'colspan' => 2)
   );
 
-  $sql = "SELECT tr.*, s.spam FROM {spam_trackbacks} s INNER JOIN {trackback_received} tr WHERE s.trid = tr.trid AND s.spam = 1";
+  $sql = "SELECT tr.*, s.probability FROM {spam_tracker} s INNER JOIN {trackback_received} tr WHERE s.id = tr.trid AND s.source = 'trackback' AND s.probability >= 80";
   $sql .= tablesort_sql($header);
   $result = pager_query($sql,  50);
 
@@ -707,203 +714,122 @@
   $links = array();
   $output = NULL;
   if (variable_get('trackback_spam_filter', 1)) {
-    $c = db_fetch_object(db_query('SELECT rating FROM {spam_trackbacks} WHERE trid = %d', $trackback->trid));
+    $p = db_fetch_object(db_query("SELECT probability FROM {spam_tracker} WHERE id = %d AND source = 'trackback'", $trackback->trid));
     $spam = l(t('mark as spam'), "spam/trackback/$trackback->trid/spam");
     $notspam = l(t('mark as not spam'), "spam/trackback/$trackback->trid/notspam");
   }
   else {
     return $output;
   }
-  $access = user_access('access spam rating');
-  $admin = user_access('administer spam rating');
-  $display = variable_get('spam_display_rating', 0);
-  if (!$c->rating && $admin) {
+  $access = user_access('access spam');
+  $admin = user_access('administer spam');
+  $display = variable_get('spam_display_probability', 0);
+
+  if (variable_get('spam_log_level', SPAM_LOG)) {
+    $display_text = " (". l($p->probability, "admin/spam/logs/trackback/$trackback->trid") .")";
+  }
+  else {
+    $display_text = " ($p->probability)";
+  }
+
+  if (!$p->probability && $admin) {
     $links[] = $spam .' - '. $notspam;
   }
-  else if ($c->rating < variable_get('spam_threshold', 80)) {
+  else if ($p->probability < variable_get('spam_threshold', 80)) {
     if ($access) {
-      $links[] = t('not spam') . ($display ? " ($c->rating)" : '') .' - '. ($admin ? $spam : '');
+      $output = t('not spam') . ($display ? $display_text : '');
+    }
+    if ($admin) {
+      if ($output)
+        $output .= ' - ';
+      $output .= $spam;
     }
   }
   else {
     if ($access) {
-      $links[] = t('spam') . ($display ? " ($c->rating)" : '') .' - '. $notspam;
+      $output = t('spam') . ($display ? $display_text : '');
+    }
+    if ($admin) {
+      if ($output)
+        $output .= ' - ';
+      $output .= $notspam;
     }
   }
+  $links[] = $output;
   return $links;
 }
 
-function trackback_spam_actions($trackback, $tokens, $spam, $rating, $type, $delete, $old_value = NULL) {
-  global $base_url;
-  if ($spam) {
-    // invoke trackback_spam hook
-    $updated = spam_invoke_spam_hook('trackback_spam', $trackback, $tokens, $type);
-    foreach ($updated as $key => $value) {
-      ${$key} = $value;
-    }
-    if (variable_get('spam_unpublish', 0)) {
-      db_query('UPDATE {trackback_received} SET status = 0 WHERE trid = %d', $trackback->trid);
-    }
-    if (variable_get('spam_train_method', 0)) {
-      // auto-learn, TEFT = train everything
-      spam_save_tokens($tokens, 'spam');
-    }
-    if ($type == 'insert') {
-      // only send mail if enabled, and the spam is not being auto-deleted
-      if (!$delete && variable_get('spam_notify_admin', 0)) {
-        _spam_mail(t('[%sitename] Detected a spam trackback', array('%sitename' => variable_get('site_name', 'drupal'))),           
-                   _spam_mail_text('notify_admin_trackback'), $trackback->subject, $trackback->excerpt, 
-                   url(variable_get('spam_unpublish', 0) ? "admin/trackback/edit/$trackback->trid" : "/node/$trackback->nid/#trackback-$trackback->trid", NULL, NULL, TRUE));
-      }
-      
-      _count(array('+spam', '+auto_marked_spam', '+spam_trackback'));
-    }
-        
-    if ($delete) {
-      trackback_spam_delete_spam($trackback, 1);
-      return;
-    }
-    
-    if (variable_get('spam_notify_admin', 0)) {
-      _spam_mail(t('[%sitename] Detected a spam trackback', array('%sitename' => variable_get('site_name', 'drupal'))), _spam_mail_text('notify_admin_trackback'), $trackback->subject, $trackback->excerpt, "$base_url" . url("/node/$trackback->nid/#trackback-$trackback->trid"));
-    }
-    watchdog('spam', t('Spam: suspicious trackback <em>%subject</em> received.  The trackback spam was posted to %link.', array('%subject' => "$trackback->subject", '%link' => l(url('node/'. $trackback->nid .'#trackback-'. $trackback->trid), 'node/'. $trackback->nid))), WATCHDOG_WARNING, l(t('view trackback'), 'node/'. $trackback->nid .'#trackback-'. $trackback->trid));
-  }
-  else { // not spam
-    // invoke comment_notspam hook
-    $updated = spam_invoke_spam_hook('trackback_notspam', $trackback, $tokens, $type);
-    foreach ($updated as $key => $value) {
-      ${$key} = $value;
-    }
-    if ($type == 'insert') {
-      _count(array('+notspam', '+auto_marked_notspam', '+notspam_trackback'));
-    }
-  }
-
-  if ($old_value != NULL) {
-    db_query('UPDATE {spam_trackbacks} SET rating = %d, last = %d WHERE trid = %d', $rating, time(), $trackback->trid);
+function trackback_block($op = 'list', $delta = 0) {
+  $num = variable_get('trackbacks_display_number', 10);
+  if ($op == 'list') {
+    $blocks[0]['info'] = t('Recent trackbacks received');
   }
   else {
-    db_query('INSERT INTO {spam_trackbacks} (trid, rating, spam, last) VALUES (%d, %d, %d, %d)', $trackback->trid, $rating, $spam, time());
+        $result = db_query_range('SELECT * FROM {trackback_received} WHERE status=1 ORDER BY created DESC', 0, $num);
+       $items = array();
+       while ($trackbacks = db_fetch_object($result)) {
+       $items[] = l(truncate_utf8(strip_tags($trackbacks->subject),27), 'node/'. $trackbacks->nid, NULL, NULL, 'trackback-'. $trackbacks->trid) .'<br />'. t('%time ago', array('%time' => format_interval(time() - $trackbacks->created)));
+     }
+     $blocks['subject'] = t('Recent trackbacks');
+     $blocks['content'] = theme('item_list', $items);
   }
+  return $blocks;
 }
 
-function trackback_spam_delete_spam($trackback, $auto = 0) {
-  if ($auto) _count(array('+auto_delete_trackback'));
-  _count(array('+delete_trackback'));
-  db_query('DELETE FROM {trackback_received} WHERE trid = %d', $trackback->trid);
-  watchdog('spam', t('Spam: deleted trackback <em>%subject</em>.  The trackback spam was posted to %link.', array('%subject' => "$trackback->subject", '%link' => l(url('node/'. $trackback->nid, NULL, NULL, TRUE), url('node/'. $trackback->nid)))));
+/** spam module support functions **/
+
+function trackback_load($trid) {
+  return (db_fetch_object(db_query('SELECT * FROM {trackback_received} WHERE trid=%d', $trid)));
 }
 
-function trackback_spam_page() {
-  $op = arg(3);
-  $trackback = db_fetch_object(db_query('SELECT * FROM {trackback_received} WHERE trid = %d', arg(2)));
-  $old = db_fetch_object(db_query('SELECT rating, spam FROM {spam_trackbacks} WHERE trid = %d', $trackback->trid));
-  $spam = ($op == 'spam');
-  $tokens = spam_tokenize($trackback->subject, 'subject*');
-  $tokens = array_merge($tokens, spam_tokenize($trackback->excerpt));
-  if (!$old) {
-    // first time we've looked at this comment
-    spam_save_tokens($tokens, $op);
-    db_query('INSERT INTO {spam_trackbacks} (trid, rating, spam, last) VALUES(%d, %d, %d, %d)', $trackback->trid, $spam ? 99 : 1, $spam, time());
-    if ($spam) {
-      watchdog('spam', t('Spam: marked trackback <em>%subject</em> as spam.', array('%subject' => "$trackback->subject")), WATCHDOG_NOTICE, l(t('edit trackback'), url($trackback->status ? "node/$trackback->nid#trackback-$trackback->trid" : "admin/trackback/edit/$trackback->trid")));
-      _count(array('+spam', '+spam_trackback'));
-    }
-    else {
-      watchdog('spam', t('Spam: marked trackback <em>%subject"</em> as not spam.', array('%subject' => l("$trackback->subject", url("node/$trackback->nid#trackback-$trackback->trid")))));
-      _count(array('+notspam', '+notspam_trackback'));
-    }
-  }
-  else {
-    spam_unsave_tokens($tokens, $op);
-    spam_save_tokens($tokens, $op);
-    db_query('UPDATE {spam_trackbacks} SET rating = %d, spam = %d, last = %d WHERE trid = %d', $spam ? 99 : 1, $spam, time(), $trackback->trid);
-    if ($spam) {
-      _count(array('+spam', '+spam_trackback', '-notspam', '-notspam_trackback', '+false_negative'));
-    }
-    else {
-      _count(array('-spam', '-spam_trackback', '+notspam', '+notspam_trackback', '+false_positive'));
-    }
-  }
-  
-  if ($spam) {
-    if (variable_get('spam_unpublish', 0)) {
-      db_query('UPDATE {trackback_received} SET status = 0 WHERE trid = %d', $trackback->trid);
-    }
-    drupal_set_message(t('Trackback marked as spam.'));
-    watchdog('spam', t('Spam: marked trackback <em>%subject</em> as spam.', array('%subject' => "$trackback->subject")));
-    drupal_goto("node/$trackback->nid#trackbacks");
-  }
-  else {
-    if (variable_get('spam_unpublish', 0)) {
-      db_query('UPDATE {trackback_received} SET status = 1 WHERE trid = %d', $trackback->trid);
-    }
-    drupal_set_message(t('Trackback marked as <em>not</em> spam.'));
-    watchdog('spam', t('Spam: marked trackback <em>%subject</em> as spam.', array('%subject' => "$trackback->subject")));
-    drupal_goto("node/$trackback->nid#trackback-$trackback->trid");
-  }
+function spam_publish_trackback($trid) {
+  $trackback = trackback_load($trid);
+  db_query('UPDATE {trackback_received} SET status = 1 WHERE trid = %d', $trackback->trid);
+	cache_clear_all();
+  watchdog('spam', t('Spam: published trackback <em>%subject</em>', array('%subject' => l("$trackback->subject", url("admin/trackback/edit/$trackback->trid")))), WATCHDOG_NOTICE, l(t('view trackback'), url("node/$trackback->nid#trackback-$trackback->trid")));
+	spam_log(SPAM_LOG, t('spam_publish_trackback: published trackback "%subject".', array('%subject' => "<em>$trackback->subject</em>")), 'trackback', $trackback->trid);
 }
 
-function trackback_spam_admin_unpublish($trackback) {
+function spam_unpublish_trackback($trid) {
+  $trackback = trackback_load($trid);
   db_query('UPDATE {trackback_received} SET status = 0 WHERE trid = %d', $trackback->trid);
-  watchdog('spam', t('Spam: unpublished trackback <em>%subject</em>.', array('%subject' => l("$trackback->subject", url("admin/trackback/edit/$trackback->trid")))), WATCHDOG_NOTICE, l(t('view trackback'), url("admin/trackback/edit/$trackback->trid")));
+	cache_clear_all();
+  watchdog('spam', t('Spam: unpublished trackback <em>%subject</em>', array('%subject' => l("$trackback->subject", url("admin/trackback/edit/$trackback->trid")))), WATCHDOG_NOTICE, l(t('view trackback'), url("node/$trackback->nid#trackback-$trackback->trid")));
+	spam_log(SPAM_LOG, t('spam_unpublish_trackback: unpublished trackback "%subject".', array('%subject' => "<em>$trackback->subject</em>")), 'trackback', $trackback->trid);
 }
 
-function trackback_spam_admin_publish($trackback) {
-  db_query('UPDATE {trackback_received} SET status = 1 WHERE trid = %d', $trackback->trid);
-  watchdog('spam', t('Spam: published trackback <em>%subject</em>', array('%subject' => l("$trackback->subject", url("admin/trackback/edit/$trackback->trid")))), WATCHDOG_NOTICE, l(t('view trackback'), url("node/$trackback->nid#trackback-$trackback->trid")));
+function spam_delete_trackback($trid) {
+  $trackback = trackback_load($trid);
+  db_query('DELETE FROM {trackback_received} WHERE trid = %d', $trackback->trid);
+  db_query("DELETE FROM {spam_tracker} WHERE id = %d AND source = 'trackback'", $trackback->trid);
+  watchdog('spam', t('Spam: deleted trackback <em>%subject</em>.  The trackback spam was posted to %link.', array('%subject' => "$trackback->subject", '%link' => l(url('node/'. $trackback->nid, NULL, NULL, TRUE), url('node/'. $trackback->nid)))));
+  spam_log(SPAM_LOG, t('spam_delete_trackback: deleted trackback "%subject".', array('%subject' => "<em>$trackback->subject</em>")), 'trackback', $trackback->trid);
 }
 
-function trackback_spam_admin_mark_notspam($trackback) {
-  $tokens = spam_tokenize($trackback->subject, 'subject*');
+function spam_notspam_trackback($trid) {
+  $trackback = trackback_load($trid);
+  $tokens = spam_tokenize("$trackback->subject $trackback->url", 'header*');
   $tokens = array_merge($tokens, spam_tokenize($trackback->excerpt));
-  spam_unsave_tokens($tokens, 'notspam');
-  spam_save_tokens($tokens, 'notspam');
-  db_query('DELETE FROM {spam_trackbacks} WHERE trid = %d', $trackback->trid);
-  db_query('INSERT INTO {spam_trackbacks} (trid, rating, spam, last) VALUES (%d, %d, %d, %d)', $trackback->trid, 1, 0, time());
-  if (variable_get('spam_unpublish', 0)) {
-    trackback_spam_admin_publish($trackback);
-  }
-  // Only update stats if the trackback is being set from spam to notspam
-  if ($trackback->spam) {
-    _count(array('-spam', '-spam_trackback','+notspam','+false_positive'));
-  }
+  spam_tokens_unsave($tokens, 0);
+  spam_tokens_save($tokens, 0);
+  db_query("UPDATE {spam_tracker} SET probability = %d, timestamp = %d WHERE source = 'trackback' AND id = %d", 1, time(), $trackback->trid);
+  spam_default_actions('trackback', $trackback->trid, $trackback->subject, $trackback->excerpt, 1, NULL, FALSE);
   watchdog('spam', t('Spam: marked trackback <em>%subject</em> as not spam.', array('%subject' => l("$trackback->subject", url("admin/trackback/edit/$trackback->trid")))), WATCHDOG_NOTICE, l(t('view trackback'), url($trackback->status ? "node/$trackback->nid/trackback-$trackback->trid" : "admin/trackback/edit/$trackback->trid")));
+  spam_log(SPAM_LOG, t('trackback manually marked as not spam'), 'trackback', $trackback->trid);
 }
 
-function trackback_spam_admin_mark_spam($trackback) {
-  $tokens = spam_tokenize($trackback->subject, 'subject*');
+function spam_spam_trackback($trid) {
+  $trackback = trackback_load($trid);
+  $tokens = spam_tokenize("$trackback->subject $trackback->url", 'header*');
   $tokens = array_merge($tokens, spam_tokenize($trackback->excerpt));
-  spam_unsave_tokens($tokens, 'spam');
-  spam_save_tokens($tokens, 'spam');
-  db_query('DELETE FROM {spam_trackbacks} WHERE trid = %d', $trackback->trid);
-  db_query('INSERT INTO {spam_trackbacks} (trid, rating, spam, last) VALUES (%d, %d, %d, %d)', $trackback->trid, 99, 1, time()); 
-  if (variable_get('spam_unpublish', 0)) {
-    trackback_spam_admin_unpublish($trackback);
-  }
-  // If the trackback is already marked as spam, don't do below.
-  if (!$trackback->spam) { 
-    _count(array('+spam', '+spam_trackback','+spam','+false_negative'));
-  }
+  spam_tokens_unsave($tokens, 1);
+  spam_tokens_save($tokens, 1);
+  db_query("UPDATE {spam_tracker} SET probability = %d, timestamp = %d WHERE source = 'trackback' AND id = %d", 99, time(), $trackback->trid);
+  spam_default_actions('trackback', $trackback->trid, $trackback->subject, $trackback->excerpt, 99, NULL, FALSE);
   watchdog('spam', t('Spam: marked trackback <em>%subject</em> as not spam.', array('%subject' => l("$trackback->subject", url("admin/trackback/edit/$trackback->trid")))), WATCHDOG_NOTICE, l(t('view trackback'), url($trackback->status ? "node/$trackback->nid/trackback-$trackback->trid" : "admin/trackback/edit/$trackback->trid")));
+  spam_log(SPAM_LOG, t('trackback manually marked as spam'), 'trackback', $trackback->trid);
 }
 
-function trackback_block($op = 'list', $delta = 0) {
-  $num = variable_get('trackbacks_display_number', 10);
-  if ($op == 'list') {
-    $blocks[0]['info'] = t('Recent trackbacks received');
-  }
-  else {
-        $result = db_query_range('SELECT * FROM {trackback_received} WHERE status=1 ORDER BY created DESC', 0, $num);
-       $items = array();
-       while ($trackbacks = db_fetch_object($result)) {
-       $items[] = l(truncate_utf8(strip_tags($trackbacks->subject),27), 'node/'. $trackbacks->nid, NULL, NULL, 'trackback-'. $trackbacks->trid) .'<br />'. t('%time ago', array('%time' => format_interval(time() - $trackbacks->created)));
-     }
-     $blocks['subject'] = t('Recent trackbacks');
-     $blocks['content'] = theme('item_list', $items);
-  }
-  return $blocks;
-}
+/** end of spam module support functions */
 
 ?>
--- trackback.mysql.orig	2005-08-11 18:47:23.000000000 -0400
+++ trackback.mysql	2005-08-11 18:48:12.000000000 -0400
@@ -25,14 +25,3 @@
   can_receive tinyint(1) NOT NULL default '0',
   PRIMARY KEY (nid)
 );
-
-CREATE TABLE spam_trackbacks (
-  trid int(10) unsigned NOT NULL default '0',
-  rating int(2) unsigned default '0',
-  spam tinyint(1) unsigned default '0',
-  last int(11) unsigned default '0',
-  PRIMARY KEY trid (trid),
-  KEY rating (rating),
-  KEY spam (spam),
-  KEY last (last)
-);
--- trackback.pgsql.orig	2005-08-12 09:55:41.000000000 -0400
+++ trackback.pgsql	2005-08-12 09:55:49.000000000 -0400
@@ -24,11 +24,3 @@
 can_receive smallint NOT NULL,
 PRIMARY KEY (nid)
 );
-
-CREATE TABLE spam_trackbacks (
-trid integer NOT NULL default '0',
-rating integer default '0',
-spam smallint default '0',
-last integer default '0',
-PRIMARY KEY (trid)
-);
