diff --git a/phpBB/includes/mcp/mcp_queue.php b/phpBB/includes/mcp/mcp_queue.php
new file mode 100644
index 0000000000..dc647d5896
--- /dev/null
+++ b/phpBB/includes/mcp/mcp_queue.php
@@ -0,0 +1,306 @@
+mcp_init();
+ }
+
+ function main($mode)
+ {
+ global $auth, $db, $user, $template;
+ global $config, $phpbb_root_path, $phpEx, $SID;
+
+ $this->mode = $mode;
+
+ switch ($mode)
+ {
+ case 'approve':
+ //
+ // TODO: increment post counts
+ // warn users watching forums/topics
+ //
+
+ // Get topic data
+ if ($post_id_list = $this->get_post_ids('m_approve'))
+ {
+ $post_mode = 'unapproved_posts';
+
+ $sql = 'SELECT topic_id
+ FROM ' . POSTS_TABLE . '
+ WHERE post_id IN (' . implode(', ', $post_id_list) . ')';
+ $result = $db->sql_query($sql);
+
+ $topic_id_list = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $topic_id_list[] = $row['topic_id'];
+
+ // TODO: log posts being approved? that would be a hell lot of logging
+ //add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_APPROVE_POST', $row['post_id']);
+ }
+
+ $msg = (count($post_id_list) == 1) ? $user->lang['POST_APPROVED_SUCCESS'] : $user->lang['POSTS_APPROVED_SUCCESS'];
+
+ // Return to topic
+ $redirect_url = "viewtopic.$phpEx$SID&f={$this->forum_id}&p={$this->post_id}#{$this->post_id}";
+
+ if ($this->quickmod)
+ {
+ meta_refresh(3, $redirect_url);
+ $return_topic = '
' . sprintf($user->lang['RETURN_TOPIC'], '', '');
+ }
+ else
+ {
+ if (count($post_id_list) == 1)
+ {
+ return_link('RETURN_POST', $this->url . '&mode=post_details');
+ }
+ return_link('RETURN_TOPIC', $redirect_url);
+ }
+ }
+ elseif ($topic_id_list = $this->get_topic_ids('m_approve'))
+ {
+ $post_mode = 'unapproved_topics';
+
+ $sql = 'SELECT forum_id, topic_title, topic_first_post_id
+ FROM ' . TOPICS_TABLE . '
+ WHERE topic_id IN (' . implode(', ', $topic_id_list) . ')';
+ $result = $db->sql_query($sql);
+
+ $post_id_list = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $post_id_list[] = $row['topic_first_post_id'];
+ add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_APPROVE_TOPIC', $row['topic_title']);
+ }
+
+ $sql = 'UPDATE ' . TOPICS_TABLE . '
+ SET topic_approved = 1
+ WHERE topic_id IN (' . implode(', ', $topic_id_list) . ')';
+ $db->sql_query($sql);
+
+ $msg = (count($topic_id_list) == 1) ? $user->lang['TOPIC_APPROVED_SUCCESS'] : $user->lang['TOPICS_APPROVED_SUCCESS'];
+
+ // Return to forum
+ $redirect_url = "viewforum.$phpEx$SID&f=" . $this->forum_id;
+
+ if ($this->quickmod)
+ {
+ meta_refresh(3, $redirect_url);
+ $return_topic = '';
+ }
+ else
+ {
+ return_link('RETURN_FORUM', $redirect_url);
+ }
+ }
+ else
+ {
+ trigger_error('NOT_MODERATOR');
+ }
+
+ // Update approved flag
+ $sql = 'UPDATE ' . POSTS_TABLE . '
+ SET post_approved = 1
+ WHERE post_id IN (' . implode(', ', $post_id_list) . ')';
+ $db->sql_query($sql);
+
+ // Now resync everything
+ sync('topic', 'topic_id', $topic_id_list, TRUE, TRUE);
+
+ // Back to... whatever
+ if ($this->quickmod)
+ {
+ trigger_error($msg . $return_topic . '
' . sprintf($user->lang['RETURN_FORUM'], "forum_id . '">', ''));
+ }
+ else
+ {
+ $template->assign_var('MESSAGE', $msg);
+ $this->main($post_mode);
+ }
+ break;
+
+ case 'unapproved_topics':
+ case 'unapproved_posts':
+ if (!$forum_list = implode(', ', get_forum_list('m_approve')))
+ {
+ trigger_error('NOT_MODERATOR');
+ }
+
+ $this->mcp_sorting($mode, $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $this->forum_id);
+ $forum_topics = ($total == -1) ? $forum_info['forum_topics'] : $total;
+ $limit_time_sql = ($sort_days) ? 'AND t.topic_last_post_time >= ' . (time() - ($sort_days * 86400)) : '';
+
+
+ if ($mode == 'unapproved_posts')
+ {
+ $sql = 'SELECT p.post_id
+ FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t' . (($sort_order_sql{0} == 'u') ? ', ' . USERS_TABLE . ' u' : '') . "
+ WHERE p.forum_id IN ($forum_list)
+ AND p.post_approved = 0
+ " . (($sort_order_sql{0} == 'u') ? 'AND u.user_id = p.poster_id' : '') . "
+ AND t.topic_id = p.topic_id
+ AND t.topic_first_post_id <> p.post_id
+ ORDER BY $sort_order_sql";
+ $result = $db->sql_query_limit($sql, $config['topics_per_page'], $this->start);
+
+ $i = 0;
+ $post_ids = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $post_ids[] = $row['post_id'];
+ $row_num[$row['post_id']] = $i++;
+ }
+
+ $sql = 'SELECT f.forum_id, f.forum_name, t.topic_id, t.topic_title, p.post_id, p.post_username, p.poster_id, p.post_time, u.username
+ FROM ' . POSTS_TABLE . ' p, ' . FORUMS_TABLE . ' f, ' . TOPICS_TABLE . ' t, ' . USERS_TABLE . " u
+ WHERE p.post_id IN (" . implode(', ', $post_ids) . ")
+ AND t.topic_id = p.topic_id
+ AND f.forum_id = p.forum_id
+ AND u.user_id = p.poster_id";
+
+ $result = $db->sql_query($sql);
+ $post_data = $rowset = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $post_data[$row['post_id']] = $row;
+ }
+ $db->sql_freeresult($result);
+
+ foreach ($post_ids as $post_id)
+ {
+ $rowset[] = $post_data[$post_id];
+ }
+ unset($post_data, $post_ids);
+ }
+ else
+ {
+ $sql = 'SELECT f.forum_id, f.forum_name, t.topic_id, t.topic_title, t.topic_time AS post_time, t.topic_poster AS poster_id, t.topic_first_post_id AS post_id, t.topic_first_poster_name AS username
+ FROM ' . TOPICS_TABLE . ' t, ' . FORUMS_TABLE . " f
+ WHERE t.topic_approved = 0
+ AND t.forum_id IN ($forum_list)
+ AND f.forum_id = t.forum_id
+ ORDER BY $sort_order_sql";
+ $result = $db->sql_query_limit($sql, $config['topics_per_page'], $this->start);
+
+ $rowset = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $rowset[] = $row;
+ }
+ $db->sql_freeresult($result);
+ }
+
+ foreach ($rowset as $row)
+ {
+ if ($row['poster_id'] == ANONYMOUS)
+ {
+ $poster = (!empty($row['post_username'])) ? $row['post_username'] : $user->lang['GUEST'];
+ }
+ else
+ {
+ $poster = '' . $row['username'] . '';
+ }
+
+ $s_checkbox = ($mode == 'unapproved_posts') ? '' : '';
+
+ $template->assign_block_vars('postrow', array(
+ 'U_VIEWFORUM' => "viewforum.$phpEx$SID&f=" . $row['forum_id'],
+ // Q: Why accessing the topic by a post_id instead of its topic_id?
+ // A: To prevent the post from being hidden because of low karma or wrong encoding
+ 'U_VIEWTOPIC' => "viewtopic.$phpEx$SID&f=" . $row['forum_id'] . '&p=' . $row['post_id'] . (($mode == 'unapproved_posts') ? '#' . $row['post_id'] : ''),
+
+ 'FORUM_NAME' => $row['forum_name'],
+ 'TOPIC_TITLE' => $row['topic_title'],
+ 'POSTER' => $poster,
+ 'POST_TIME' => $user->format_date($row['post_time']),
+ 'S_CHECKBOX' => $s_checkbox
+ ));
+ }
+ unset($rowset);
+
+ // Now display the page
+ $template->assign_vars(array(
+ 'L_DISPLAY_ITEMS' => ($mode == 'unapproved_posts') ? $user->lang['DISPLAY_POSTS'] : $user->lang['DISPLAY_POSTS']
+ ));
+
+ $this->display($user->lang['MCP_QUEUE'], 'mcp_queue.html');
+ break;
+
+ default:
+ trigger_error('UNKNOWN_MODE');
+ }
+ }
+
+ // This function simply puts the number of unapproved items in menu titles
+ function alter_menu()
+ {
+ global $db, $user;
+
+ $forum_list = get_forum_list('m_approve');
+
+ $sql = 'SELECT COUNT(*) AS total
+ FROM ' . TOPICS_TABLE . '
+ WHERE forum_id IN (' . implode(', ', $forum_list) . ')
+ AND topic_approved = 0';
+ $result = $db->sql_query($sql);
+ $total_topics = $db->sql_fetchfield('total', 0, $result);
+
+ $sql = 'SELECT COUNT(*) AS total
+ FROM ' . POSTS_TABLE . '
+ WHERE forum_id IN (' . implode(', ', $forum_list) . ')
+ AND post_approved = 0';
+ $result = $db->sql_query($sql);
+ $total_posts = $db->sql_fetchfield('total', 0, $result) - $total_topics;
+
+ $this->subs['unapproved_topics']['title'] = sprintf($this->subs['unapproved_topics']['title'], ($total_topics) ? $total_topics : $user->lang['NONE']);
+ $this->subs['unapproved_posts']['title'] = sprintf($this->subs['unapproved_posts']['title'], ($total_posts) ? $total_posts : $user->lang['NONE']);
+ }
+
+ function install()
+ {
+ }
+
+ function uninstall()
+ {
+ }
+
+ function module()
+ {
+ $details = array(
+ 'name' => 'MCP - Queue',
+ 'description' => 'Module for management of items waiting for approval',
+ 'filename' => 'queue',
+ 'version' => '0.1.0',
+ 'phpbbversion' => '2.2.0'
+ );
+ return $details;
+ }
+}
+?>
\ No newline at end of file