diff -rup ../../../modules/comment/comment.admin.inc comment/comment.admin.inc
--- ../../../modules/comment/comment.admin.inc	2008-01-08 10:35:41.000000000 +0000
+++ comment/comment.admin.inc	2008-03-25 16:29:49.000000000 +0000
@@ -210,6 +210,66 @@ function comment_multiple_delete_confirm
 }
 
 /**
+ * Menu callback; hide a comment.
+ *
+ * @param $cid
+ *   The comment do be hidden.
+ */
+function comment_hide($cid = NULL) {
+  $comment = db_fetch_object(db_query('SELECT c.*, u.name AS registered_name, u.uid FROM {comments} c INNER JOIN {users} u ON u.uid = c.uid WHERE c.cid = %d', $cid));
+  $comment->name = $comment->uid ? $comment->registered_name : $comment->name;
+
+  $output = '';
+
+  if (is_object($comment) && is_numeric($comment->cid)) {
+    $output = drupal_get_form('comment_confirm_hide', $comment);
+  }
+  else {
+    drupal_set_message(t('The comment no longer exists.'));
+  }
+
+  return $output;
+}
+
+/**
+ * Form builder; Builds the confirmation form for hiding a single comment.
+ *
+ * @ingroup forms
+ * @see comment_confirm_hide_submit()
+ */
+function comment_confirm_hide(&$form_state, $comment) {
+  $form = array();
+  $form['#comment'] = $comment;
+  return confirm_form(
+    $form,
+    t('Are you sure you want to hide the comment %title?', array('%title' => $comment->subject)),
+    'node/'. $comment->nid,
+    t('The comment will not longer be visible to normal users.'),
+    t('Hide'),
+    t('Cancel'),
+    'comment_confirm_hide');
+}
+
+/**
+ * Process comment_confirm_hide form submissions.
+ */
+function comment_confirm_hide_submit($form, &$form_state) {
+  drupal_set_message(t('The comment has been hidden.'));
+
+  $comment = $form['#comment'];
+
+  // Hide comment and its replies.
+  db_query('UPDATE {comments} SET status = %d WHERE cid = %d', COMMENT_NOT_PUBLISHED, $comment->cid);
+
+  _comment_update_node_statistics($comment->nid);
+
+  // Clear the cache so an anonymous user sees that his comment was hidden.
+  cache_clear_all();
+
+  $form_state['redirect'] = "node/$comment->nid";
+}
+
+/**
  * Menu callback; delete a comment.
  *
  * @param $cid
diff -rup ../../../modules/comment/comment.module comment/comment.module
--- ../../../modules/comment/comment.module	2008-02-23 08:02:48.000000000 +0000
+++ comment/comment.module	2008-03-25 16:31:44.000000000 +0000
@@ -21,6 +21,17 @@ define('COMMENT_PUBLISHED', 0);
 define('COMMENT_NOT_PUBLISHED', 1);
 
 /**
+ * Hidden comments are only visible to users with 'administer comments' permission.
+ */
+define('COMMENT_MODE_HIDDEN_HIDDEN', 0);
+
+/**
+ * Hidden comments are visible to all users, but are initially hidden with a
+ * link to view them.
+ */
+define('COMMENT_MODE_HIDDEN_VIEWABLE', 1);
+
+/**
  * Comments are displayed in a flat list - collapsed.
  */
 define('COMMENT_MODE_FLAT_COLLAPSED', 1);
@@ -223,6 +234,14 @@ function comment_menu() {
     'file' => 'comment.admin.inc',
   );
 
+  $items['comment/hide'] = array(
+    'title' => 'Hide comment',
+    'page callback' => 'comment_hide',
+    'access arguments' => array('administer comments'),
+    'type' => MENU_CALLBACK,
+    'file' => 'comment.admin.inc',
+  );
+
   $items['comment/edit'] = array(
     'title' => 'Edit comment',
     'page callback' => 'comment_edit',
@@ -249,6 +268,7 @@ function comment_menu() {
 function comment_node_type($op, $info) {
   $settings = array(
     'comment',
+    'comment_hidden_viewable',
     'comment_default_mode',
     'comment_default_order',
     'comment_default_per_page',
@@ -523,6 +543,19 @@ function comment_form_alter(&$form, $for
       '#options' => array(t('Disabled'), t('Read only'), t('Read/Write')),
       '#description' => t('Users with the <em>administer comments</em> permission will be able to override this setting.'),
     );
+    $form['comment']['comment_hidden_viewable'] = array(
+      '#type' => 'radios',
+      '#title' => t('Hidden comments visibility'),
+      '#default_value' => variable_get('comment_hidden_viewable_'. $form['#node_type']->type, COMMENT_MODE_HIDDEN_HIDDEN),
+      '#options' => array(
+	  COMMENT_MODE_HIDDEN_HIDDEN => t('Hidden'),
+	  COMMENT_MODE_HIDDEN_VIEWABLE => t('Visible'),
+      ),
+      '#description' => t('The visibility of hidden comments. When hidden only
+      users with the <em>administer comments</em> permission can see them.
+      When visible, all users can see them but they are still initially hidden
+      and the user must click on a link to view hidden comments.'),
+    );
     $form['comment']['comment_default_mode'] = array(
       '#type' => 'radios',
       '#title' => t('Default display mode'),
@@ -850,10 +883,16 @@ function comment_links($comment, $return
         'title' => t('edit'),
         'href' => "comment/edit/$comment->cid"
       );
-      $links['comment_reply'] = array(
-        'title' => t('reply'),
-        'href' => "comment/reply/$comment->nid/$comment->cid"
-      );
+      if ($comment->status == COMMENT_PUBLISHED) {
+      	$links['comment_reply'] = array(
+      	  'title' => t('reply'),
+      	  'href' => "comment/reply/$comment->nid/$comment->cid"
+      	);
+	$links['comment_hide'] = array(
+	  'title' => t('hide'),
+	  'href' => "comment/hide/$comment->cid"
+	);
+      }
     }
     else if (user_access('post comments')) {
       if (comment_access('edit', $comment)) {
@@ -862,10 +901,12 @@ function comment_links($comment, $return
           'href' => "comment/edit/$comment->cid"
         );
       }
-      $links['comment_reply'] = array(
-        'title' => t('reply'),
-        'href' => "comment/reply/$comment->nid/$comment->cid"
-      );
+      if ($comment->status == COMMENT_PUBLISHED) {
+	$links['comment_reply'] = array(
+          'title' => t('reply'),
+	  'href' => "comment/reply/$comment->nid/$comment->cid"
+	);
+      }
     }
     else {
       $node = node_load($comment->nid);
@@ -953,6 +994,8 @@ function comment_render($node, $cid = 0)
     $mode = _comment_get_display_setting('mode', $node);
     $order = _comment_get_display_setting('sort', $node);
     $comments_per_page = _comment_get_display_setting('comments_per_page', $node);
+    $comments_hidden_viewable = _comment_get_display_setting('hidden_viewable', $node);
+    $view_hidden = array_key_exists('showallcomments',$_GET) && ($comments_hidden_viewable == COMMENT_MODE_HIDDEN_VIEWABLE);
 
     if ($cid && is_numeric($cid)) {
       // Single comment view.
@@ -980,7 +1023,7 @@ function comment_render($node, $cid = 0)
       $query = 'SELECT c.cid as cid, c.pid, c.nid, c.subject, c.comment, c.format, c.timestamp, c.name, c.mail, c.homepage, u.uid, u.name AS registered_name, u.signature, u.picture, u.data, c.thread, c.status FROM {comments} c INNER JOIN {users} u ON c.uid = u.uid WHERE c.nid = %d';
 
       $query_args = array($nid);
-      if (!user_access('administer comments')) {
+      if (!user_access('administer comments') && !$view_hidden) {
         $query .= ' AND c.status = %d';
         $query_count .= ' AND status = %d';
         $query_args[] = COMMENT_PUBLISHED;
@@ -1072,6 +1115,17 @@ function comment_render($node, $cid = 0)
     }
 
     $output = theme('comment_wrapper', $output, $node);
+  
+    if ($comments_hidden_viewable == COMMENT_MODE_HIDDEN_VIEWABLE) {
+      if ($view_hidden) {
+        $output .= l("Click here to hide hidden comments", $_GET['q']);
+      } else {
+        if ($num_hidden = db_result(db_query("SELECT COUNT(*) FROM {comments} WHERE nid = %d AND status = %d", $node->nid, COMMENT_NOT_PUBLISHED))) {
+          $output .= l("Click here to view hidden comments ($num_hidden)", 
+	    $_GET['q'], array('query' => 'showallcomments=1'));
+        }
+      }
+    }
   }
 
   return $output;
@@ -1914,6 +1968,9 @@ function _comment_get_display_setting($s
         break;
       case 'comments_per_page':
         $default = variable_get('comment_default_per_page_'. $node->type, 50);
+	break;
+      case 'hidden_viewable':
+	$default = variable_get('comment_hidden_viewable_'. $node->type, COMMENT_MODE_HIDDEN_HIDDEN);
     }
     if (variable_get('comment_controls_'. $node->type, COMMENT_CONTROLS_HIDDEN) == COMMENT_CONTROLS_HIDDEN) {
       // if comment controls are disabled use site default
Only in comment: comment.module.orig
Only in comment: .comment.module.swp
