You are viewing the MafiaScum.net Wiki. To play the game, visit the forum.

MafiaWiki:Sandbox: Difference between revisions

From MafiaWiki
Jump to navigation Jump to search
(mcpmain)
(viewtopic)
Line 6: Line 6:
/**
/**
*
*
* @package mcp
* @package phpBB3
* @version $Id: mcp_main.php 10427 2010-01-18 16:41:21Z jelly_doughnut $
* @version $Id: viewtopic.php 10510 2010-02-20 00:15:35Z toonarmy $
* @copyright (c) 2005 phpBB Group
* @copyright (c) 2005 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
Line 16: Line 16:
* @ignore
* @ignore
*/
*/
if (!defined('IN_PHPBB'))
define('IN_PHPBB', true);
{
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
exit;
$phpEx = substr(strrchr(__FILE__, '.'), 1);
}
include($phpbb_root_path . 'common.' . $phpEx);
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
include($phpbb_root_path . 'includes/bbcode.' . $phpEx);
 
// Start session management
$user->session_begin();
$auth->acl($user->data);
 
// Initial var setup
$forum_id = request_var('f', 0);
$topic_id = request_var('t', 0);
$post_id = request_var('p', 0);
$voted_id = request_var('vote_id', array('' => 0));
 
$voted_id = (sizeof($voted_id) > 1) ? array_unique($voted_id) : $voted_id;
 
 
$start = request_var('start', 0);
$view = request_var('view', '');
 
$default_sort_days = (!empty($user->data['user_post_show_days'])) ? $user->data['user_post_show_days'] : 0;
$default_sort_key = (!empty($user->data['user_post_sortby_type'])) ? $user->data['user_post_sortby_type'] : 't';
$default_sort_dir = (!empty($user->data['user_post_sortby_dir'])) ? $user->data['user_post_sortby_dir'] : 'a';
 
$sort_days = request_var('st', $default_sort_days);
$sort_key = request_var('sk', $default_sort_key);
$sort_dir = request_var('sd', $default_sort_dir);
 
$update = request_var('update', false);


$s_can_vote = false;
/**
/**
* mcp_main
* @todo normalize?
* Handling mcp actions
* @package mcp
*/
*/
class mcp_main
$hilit_words = request_var('hilit', '', true);
 
// Do we have a topic or post id?
if (!$topic_id && !$post_id)
{
{
var $p_master;
trigger_error('NO_TOPIC');
var $u_action;
}


function mcp_main(&$p_master)
// Find topic id if user requested a newer or older topic
if ($view && !$post_id)
{
if (!$forum_id)
{
{
$this->p_master = &$p_master;
$sql = 'SELECT forum_id
FROM ' . TOPICS_TABLE . "
WHERE topic_id = $topic_id";
$result = $db->sql_query($sql);
$forum_id = (int) $db->sql_fetchfield('forum_id');
$db->sql_freeresult($result);
 
if (!$forum_id)
{
trigger_error('NO_TOPIC');
}
}
}


function main($id, $mode)
if ($view == 'unread')
{
{
global $auth, $db, $user, $template, $action;
// Get topic tracking info
global $config, $phpbb_root_path, $phpEx;
$topic_tracking_info = get_complete_topic_tracking($forum_id, $topic_id);


$quickmod = ($mode == 'quickmod') ? true : false;
$topic_last_read = (isset($topic_tracking_info[$topic_id])) ? $topic_tracking_info[$topic_id] : 0;


switch ($action)
$sql = 'SELECT post_id, topic_id, forum_id
FROM ' . POSTS_TABLE . "
WHERE topic_id = $topic_id
" . (($auth->acl_get('m_approve', $forum_id)) ? '' : 'AND post_approved = 1') . "
AND post_time > $topic_last_read
AND forum_id = $forum_id
ORDER BY post_time ASC";
$result = $db->sql_query_limit($sql, 1);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
 
if (!$row)
{
$sql = 'SELECT topic_last_post_id as post_id, topic_id, forum_id
FROM ' . TOPICS_TABLE . '
WHERE topic_id = ' . $topic_id;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
}
 
if (!$row)
{
{
case 'lock':
// Setup user environment so we can process lang string
case 'unlock':
$user->setup('viewtopic');
$topic_ids = (!$quickmod) ? request_var('topic_id_list', array(0)) : array(request_var('t', 0));


if (!sizeof($topic_ids))
trigger_error('NO_TOPIC');
{
}
trigger_error('NO_TOPIC_SELECTED');
}


lock_unlock($action, $topic_ids);
$post_id = $row['post_id'];
break;
$topic_id = $row['topic_id'];
}
else if ($view == 'next' || $view == 'previous')
{
$sql_condition = ($view == 'next') ? '>' : '<';
$sql_ordering = ($view == 'next') ? 'ASC' : 'DESC';


case 'lock_post':
$sql = 'SELECT forum_id, topic_last_post_time
case 'unlock_post':
FROM ' . TOPICS_TABLE . '
WHERE topic_id = ' . $topic_id;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
 
if (!$row)
{
$user->setup('viewtopic');
// OK, the topic doesn't exist. This error message is not helpful, but technically correct.
trigger_error(($view == 'next') ? 'NO_NEWER_TOPICS' : 'NO_OLDER_TOPICS');
}
else
{
$sql = 'SELECT topic_id, forum_id
FROM ' . TOPICS_TABLE . '
WHERE forum_id = ' . $row['forum_id'] . "
AND topic_moved_id = 0
AND topic_last_post_time $sql_condition {$row['topic_last_post_time']}
" . (($auth->acl_get('m_approve', $row['forum_id'])) ? '' : 'AND topic_approved = 1') . "
ORDER BY topic_last_post_time $sql_ordering";
$result = $db->sql_query_limit($sql, 1);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);


$post_ids = (!$quickmod) ? request_var('post_id_list', array(0)) : array(request_var('p', 0));
if (!$row)
{
$user->setup('viewtopic');
trigger_error(($view == 'next') ? 'NO_NEWER_TOPICS' : 'NO_OLDER_TOPICS');
}
else
{
$topic_id = $row['topic_id'];


if (!sizeof($post_ids))
// Check for global announcement correctness?
if (!$row['forum_id'] && !$forum_id)
{
{
trigger_error('NO_POST_SELECTED');
trigger_error('NO_TOPIC');
}
}
 
else if ($row['forum_id'])
lock_unlock($action, $post_ids);
break;
 
case 'make_announce':
case 'make_sticky':
case 'make_global':
case 'make_normal':
 
$topic_ids = (!$quickmod) ? request_var('topic_id_list', array(0)) : array(request_var('t', 0));
 
if (!sizeof($topic_ids))
{
{
trigger_error('NO_TOPIC_SELECTED');
$forum_id = $row['forum_id'];
}
}
}
}
}


change_topic_type($action, $topic_ids);
// Check for global announcement correctness?
break;
if ((!isset($row) || !$row['forum_id']) && !$forum_id)
{
trigger_error('NO_TOPIC');
}
else if (isset($row) && $row['forum_id'])
{
$forum_id = $row['forum_id'];
}
}


case 'move':
// This rather complex gaggle of code handles querying for topics but
$user->add_lang('viewtopic');
// also allows for direct linking to a post (and the calculation of which
// page the post is on and the correct display of viewtopic)
$sql_array = array(
'SELECT' => 't.*, f.*',


$topic_ids = (!$quickmod) ? request_var('topic_id_list', array(0)) : array(request_var('t', 0));
'FROM' => array(FORUMS_TABLE => 'f'),
);


if (!sizeof($topic_ids))
// Firebird handles two columns of the same name a little differently, this
{
// addresses that by forcing the forum_id to come from the forums table.
trigger_error('NO_TOPIC_SELECTED');
if ($db->sql_layer === 'firebird')
}
{
$sql_array['SELECT'] = 'f.forum_id AS forum_id, ' . $sql_array['SELECT'];
}


mcp_move_topic($topic_ids);
// The FROM-Order is quite important here, else t.* columns can not be correctly bound.
break;
if ($post_id)
{
$sql_array['SELECT'] .= ', p.post_approved';
$sql_array['FROM'][POSTS_TABLE] = 'p';
}


case 'fork':
// Topics table need to be the last in the chain
$user->add_lang('viewtopic');
$sql_array['FROM'][TOPICS_TABLE] = 't';


$topic_ids = (!$quickmod) ? request_var('topic_id_list', array(0)) : array(request_var('t', 0));
if ($user->data['is_registered'])
{
$sql_array['SELECT'] .= ', tw.notify_status';
$sql_array['LEFT_JOIN'] = array();


if (!sizeof($topic_ids))
$sql_array['LEFT_JOIN'][] = array(
{
'FROM' => array(TOPICS_WATCH_TABLE => 'tw'),
trigger_error('NO_TOPIC_SELECTED');
'ON' => 'tw.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tw.topic_id'
}
);


mcp_fork_topic($topic_ids);
if ($config['allow_bookmarks'])
break;
{
$sql_array['SELECT'] .= ', bm.topic_id as bookmarked';
$sql_array['LEFT_JOIN'][] = array(
'FROM' => array(BOOKMARKS_TABLE => 'bm'),
'ON' => 'bm.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = bm.topic_id'
);
}


case 'delete_topic':
if ($config['load_db_lastread'])
$user->add_lang('viewtopic');
{
$sql_array['SELECT'] .= ', tt.mark_time, ft.mark_time as forum_mark_time';


$topic_ids = (!$quickmod) ? request_var('topic_id_list', array(0)) : array(request_var('t', 0));
$sql_array['LEFT_JOIN'][] = array(
'FROM' => array(TOPICS_TRACK_TABLE => 'tt'),
'ON' => 'tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id'
);


if (!sizeof($topic_ids))
$sql_array['LEFT_JOIN'][] = array(
{
'FROM' => array(FORUMS_TRACK_TABLE => 'ft'),
trigger_error('NO_TOPIC_SELECTED');
'ON' => 'ft.user_id = ' . $user->data['user_id'] . ' AND t.forum_id = ft.forum_id'
}
);
}
}


mcp_delete_topic($topic_ids);
if (!$post_id)
break;
{
$sql_array['WHERE'] = "t.topic_id = $topic_id";
}
else
{
$sql_array['WHERE'] = "p.post_id = $post_id AND t.topic_id = p.topic_id";
}


case 'delete_post':
$sql_array['WHERE'] .= ' AND (f.forum_id = t.forum_id';
$user->add_lang('posting');


$post_ids = (!$quickmod) ? request_var('post_id_list', array(0)) : array(request_var('p', 0));
if (!$forum_id)
{
// If it is a global announcement make sure to set the forum id to a postable forum
$sql_array['WHERE'] .= ' OR (t.topic_type = ' . POST_GLOBAL . '
AND f.forum_type = ' . FORUM_POST . ')';
}
else
{
$sql_array['WHERE'] .= ' OR (t.topic_type = ' . POST_GLOBAL . "
AND f.forum_id = $forum_id)";
}


if (!sizeof($post_ids))
$sql_array['WHERE'] .= ')';
{
trigger_error('NO_POST_SELECTED');
}


mcp_delete_post($post_ids);
// Join to forum table on topic forum_id unless topic forum_id is zero
break;
// whereupon we join on the forum_id passed as a parameter ... this
}
// is done so navigation, forum name, etc. remain consistent with where
// user clicked to view a global topic
$sql = $db->sql_build_query('SELECT', $sql_array);
$result = $db->sql_query($sql);
$topic_data = $db->sql_fetchrow($result);
$db->sql_freeresult($result);


switch ($mode)
// link to unapproved post or incorrect link
{
if (!$topic_data)
case 'front':
{
include($phpbb_root_path . 'includes/mcp/mcp_front.' . $phpEx);
// If post_id was submitted, we try at least to display the topic as a last resort...
if ($post_id && $topic_id)
{
redirect(append_sid("{$phpbb_root_path}viewtopic.$phpEx", "t=$topic_id" . (($forum_id) ? "&amp;f=$forum_id" : '')));
}


$user->add_lang('acp/common');
trigger_error('NO_TOPIC');
}


mcp_front_view($id, $mode, $action);
$forum_id = (int) $topic_data['forum_id'];
// This is for determining where we are (page)
if ($post_id)
{
// are we where we are supposed to be?
if (!$topic_data['post_approved'] && !$auth->acl_get('m_approve', $topic_data['forum_id']))
{
// If post_id was submitted, we try at least to display the topic as a last resort...
if ($topic_id)
{
redirect(append_sid("{$phpbb_root_path}viewtopic.$phpEx", "t=$topic_id" . (($forum_id) ? "&amp;f=$forum_id" : '')));
}


$this->tpl_name = 'mcp_front';
trigger_error('NO_TOPIC');
$this->page_title = 'MCP_MAIN';
}
break;
if ($post_id == $topic_data['topic_first_post_id'] || $post_id == $topic_data['topic_last_post_id'])
{
$check_sort = ($post_id == $topic_data['topic_first_post_id']) ? 'd' : 'a';


case 'forum_view':
if ($sort_dir == $check_sort)
include($phpbb_root_path . 'includes/mcp/mcp_forum.' . $phpEx);
{
$topic_data['prev_posts'] = ($auth->acl_get('m_approve', $forum_id)) ? $topic_data['topic_replies_real'] : $topic_data['topic_replies'];
}
else
{
$topic_data['prev_posts'] = 0;
}
}
else
{
$sql = 'SELECT COUNT(p1.post_id) AS prev_posts
FROM ' . POSTS_TABLE . ' p1, ' . POSTS_TABLE . " p2
WHERE p1.topic_id = {$topic_data['topic_id']}
AND p2.post_id = {$post_id}
" . ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND p1.post_approved = 1' : '') . '
AND ' . (($sort_dir == 'd') ? 'p1.post_time >= p2.post_time' : 'p1.post_time <= p2.post_time');


$user->add_lang('viewforum');
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);


$forum_id = request_var('f', 0);
$topic_data['prev_posts'] = $row['prev_posts'] - 1;
}
}


$forum_info = get_forum_data($forum_id, 'm_', true);
$topic_id = (int) $topic_data['topic_id'];
//
$topic_replies = ($auth->acl_get('m_approve', $forum_id)) ? $topic_data['topic_replies_real'] : $topic_data['topic_replies'];


if (!sizeof($forum_info))
// Check sticky/announcement time limit
{
if (($topic_data['topic_type'] == POST_STICKY || $topic_data['topic_type'] == POST_ANNOUNCE) && $topic_data['topic_time_limit'] && ($topic_data['topic_time'] + $topic_data['topic_time_limit']) < time())
$this->main('main', 'front');
{
return;
$sql = 'UPDATE ' . TOPICS_TABLE . '
}
SET topic_type = ' . POST_NORMAL . ', topic_time_limit = 0
WHERE topic_id = ' . $topic_id;
$db->sql_query($sql);


$forum_info = $forum_info[$forum_id];
$topic_data['topic_type'] = POST_NORMAL;
$topic_data['topic_time_limit'] = 0;
}


mcp_forum_view($id, $mode, $action, $forum_info);
// Setup look and feel
$user->setup('viewtopic', $topic_data['forum_style']);


$this->tpl_name = 'mcp_forum';
if (!$topic_data['topic_approved'] && !$auth->acl_get('m_approve', $forum_id))
$this->page_title = 'MCP_MAIN_FORUM_VIEW';
{
break;
trigger_error('NO_TOPIC');
}


case 'topic_view':
// Start auth check
include($phpbb_root_path . 'includes/mcp/mcp_topic.' . $phpEx);
if (!$auth->acl_get('f_read', $forum_id))
{
if ($user->data['user_id'] != ANONYMOUS)
{
trigger_error('SORRY_AUTH_READ');
}


mcp_topic_view($id, $mode, $action);
login_box('', $user->lang['LOGIN_VIEWFORUM']);
}


$this->tpl_name = 'mcp_topic';
// Forum is passworded ... check whether access has been granted to this
$this->page_title = 'MCP_MAIN_TOPIC_VIEW';
// user this session, if not show login box
break;
if ($topic_data['forum_password'])
{
login_forum_box($topic_data);
}


case 'post_details':
// Redirect to login or to the correct post upon emailed notification links
include($phpbb_root_path . 'includes/mcp/mcp_post.' . $phpEx);
if (isset($_GET['e']))
{
$jump_to = request_var('e', 0);


mcp_post_details($id, $mode, $action);
$redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id");


$this->tpl_name = ($action == 'whois') ? 'mcp_whois' : 'mcp_post';
if ($user->data['user_id'] == ANONYMOUS)
$this->page_title = 'MCP_MAIN_POST_DETAILS';
{
break;
login_box($redirect_url . "&amp;p=$post_id&amp;e=$jump_to", $user->lang['LOGIN_NOTIFY_TOPIC']);
}


default:
if ($jump_to > 0)
trigger_error('NO_MODE', E_USER_ERROR);
{
break;
// We direct the already logged in user to the correct post...
}
redirect($redirect_url . ((!$post_id) ? "&amp;p=$jump_to" : "&amp;p=$post_id") . "#p$jump_to");
}
}
}
}


/**
// What is start equal to?
* Lock/Unlock Topic/Post
if ($post_id)
*/
{
function lock_unlock($action, $ids)
$start = floor(($topic_data['prev_posts']) / $config['posts_per_page']) * $config['posts_per_page'];
}
 
// Get topic tracking info
if (!isset($topic_tracking_info))
{
{
global $auth, $user, $db, $phpEx, $phpbb_root_path;
$topic_tracking_info = array();


if ($action == 'lock' || $action == 'unlock')
// Get topic tracking info
if ($config['load_db_lastread'] && $user->data['is_registered'])
{
{
$table = TOPICS_TABLE;
$tmp_topic_data = array($topic_id => $topic_data);
$sql_id = 'topic_id';
$topic_tracking_info = get_topic_tracking($forum_id, $topic_id, $tmp_topic_data, array($forum_id => $topic_data['forum_mark_time']));
$set_id = 'topic_status';
unset($tmp_topic_data);
$l_prefix = 'TOPIC';
}
}
else
else if ($config['load_anon_lastread'] || $user->data['is_registered'])
{
{
$table = POSTS_TABLE;
$topic_tracking_info = get_complete_topic_tracking($forum_id, $topic_id);
$sql_id = 'post_id';
$set_id = 'post_edit_locked';
$l_prefix = 'POST';
}
}
}
// Post ordering options
$limit_days = array(0 => $user->lang['ALL_POSTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
$sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 's' => $user->lang['SUBJECT']);
$sort_by_sql = array('a' => array('u.username_clean', 'p.post_id'), 't' => 'p.post_time', 's' => array('p.post_subject', 'p.post_id'));
$join_user_sql = array('a' => true, 't' => false, 's' => false);
$s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';


$orig_ids = $ids;
gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param, $default_sort_days, $default_sort_key, $default_sort_dir);


if (!check_ids($ids, $table, $sql_id, array('m_lock')))
// Obtain correct post count and ordering SQL if user has
// requested anything different
if ($sort_days)
{
$min_post_time = time() - ($sort_days * 86400);
 
$sql = 'SELECT COUNT(post_id) AS num_posts
FROM ' . POSTS_TABLE . "
WHERE topic_id = $topic_id
AND post_time >= $min_post_time
" . (($auth->acl_get('m_approve', $forum_id)) ? '' : 'AND post_approved = 1');
$result = $db->sql_query($sql);
$total_posts = (int) $db->sql_fetchfield('num_posts');
$db->sql_freeresult($result);
 
$limit_posts_time = "AND p.post_time >= $min_post_time ";
 
if (isset($_POST['sort']))
{
{
// Make sure that for f_user_lock only the lock action is triggered.
$start = 0;
if ($action != 'lock')
}
{
}
return;
else
}
{
$total_posts = $topic_replies + 1;
$limit_posts_time = '';
}


$ids = $orig_ids;
// Was a highlight request part of the URI?
 
$highlight_match = $highlight = '';
if (!check_ids($ids, $table, $sql_id, array('f_user_lock')))
if ($hilit_words)
{
foreach (explode(' ', trim($hilit_words)) as $word)
{
if (trim($word))
{
{
return;
$word = str_replace('\*', '\w+?', preg_quote($word, '#'));
$word = preg_replace('#(^|\s)\\\\w\*\?(\s|$)#', '$1\w+?$2', $word);
$highlight_match .= (($highlight_match != '') ? '|' : '') . $word;
}
}
}
}
unset($orig_ids);


$redirect = request_var('redirect', build_url(array('action', 'quickmod')));
$highlight = urlencode($hilit_words);
}


$s_hidden_fields = build_hidden_fields(array(
// Make sure $start is set to the last page if it exceeds the amount
$sql_id . '_list' => $ids,
if ($start < 0 || $start >= $total_posts)
'action' => $action,
{
'redirect' => $redirect)
$start = ($start < 0) ? 0 : floor(($total_posts - 1) / $config['posts_per_page']) * $config['posts_per_page'];
);
}
$success_msg = '';


if (confirm_box(true))
// General Viewtopic URL for return links
{
$viewtopic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;start=$start" . ((strlen($u_sort_param)) ? "&amp;$u_sort_param" : '') . (($highlight_match) ? "&amp;hilit=$highlight" : ''));
$sql = "UPDATE $table
SET $set_id = " . (($action == 'lock' || $action == 'lock_post') ? ITEM_LOCKED : ITEM_UNLOCKED) . '
WHERE ' . $db->sql_in_set($sql_id, $ids);
$db->sql_query($sql);


$data = ($action == 'lock' || $action == 'unlock') ? get_topic_data($ids) : get_post_data($ids);
// Are we watching this topic?
$s_watching_topic = array(
'link' => '',
'title' => '',
'is_watching' => false,
);


foreach ($data as $id => $row)
if (($config['email_enable'] || $config['jab_enable']) && $config['allow_topic_notify'] && $user->data['is_registered'])
{
{
add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_' . strtoupper($action), $row['topic_title']);
watch_topic_forum('topic', $s_watching_topic, $user->data['user_id'], $forum_id, $topic_id, $topic_data['notify_status'], $start);
}


$success_msg = $l_prefix . ((sizeof($ids) == 1) ? '' : 'S') . '_' . (($action == 'lock' || $action == 'lock_post') ? 'LOCKED' : 'UNLOCKED') . '_SUCCESS';
// Reset forum notification if forum notify is set
}
if ($config['allow_forum_notify'] && $auth->acl_get('f_subscribe', $forum_id))
else
{
{
confirm_box(false, strtoupper($action) . '_' . $l_prefix . ((sizeof($ids) == 1) ? '' : 'S'), $s_hidden_fields);
$s_watching_forum = $s_watching_topic;
watch_topic_forum('forum', $s_watching_forum, $user->data['user_id'], $forum_id, 0);
}
}
}


$redirect = request_var('redirect', "index.$phpEx");
// Bookmarks
$redirect = reapply_sid($redirect);
if ($config['allow_bookmarks'] && $user->data['is_registered'] && request_var('bookmark', 0))
 
{
if (!$success_msg)
if (check_link_hash(request_var('hash', ''), "topic_$topic_id"))
{
{
redirect($redirect);
if (!$topic_data['bookmarked'])
{
$sql = 'INSERT INTO ' . BOOKMARKS_TABLE . ' ' . $db->sql_build_array('INSERT', array(
'user_id' => $user->data['user_id'],
'topic_id' => $topic_id,
));
$db->sql_query($sql);
}
else
{
$sql = 'DELETE FROM ' . BOOKMARKS_TABLE . "
WHERE user_id = {$user->data['user_id']}
AND topic_id = $topic_id";
$db->sql_query($sql);
}
$message = (($topic_data['bookmarked']) ? $user->lang['BOOKMARK_REMOVED'] : $user->lang['BOOKMARK_ADDED']) . '<br /><br />' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $viewtopic_url . '">', '</a>');
}
}
else
else
{
{
meta_refresh(2, $redirect);
$message = $user->lang['BOOKMARK_ERR'] . '<br /><br />' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $viewtopic_url . '">', '</a>');
trigger_error($user->lang[$success_msg] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $redirect . '">', '</a>'));
}
}
meta_refresh(3, $viewtopic_url);
trigger_error($message);
}
}


/**
// Grab ranks
* Change Topic Type
$ranks = $cache->obtain_ranks();
*/
function change_topic_type($action, $topic_ids)
{
global $auth, $user, $db, $phpEx, $phpbb_root_path;


// For changing topic types, we only allow operations in one forum.
// Grab icons
$forum_id = check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('f_announce', 'f_sticky', 'm_'), true);
$icons = $cache->obtain_icons();


if ($forum_id === false)
// Grab extensions
{
$extensions = array();
return;
if ($topic_data['topic_attachment'])
}
{
$extensions = $cache->obtain_attach_extensions($forum_id);
}


switch ($action)
// Forum rules listing
{
$s_forum_rules = '';
case 'make_announce':
gen_forum_auth_level('topic', $forum_id, $topic_data['forum_status']);
$new_topic_type = POST_ANNOUNCE;
$check_acl = 'f_announce';
$l_new_type = (sizeof($topic_ids) == 1) ? 'MCP_MAKE_ANNOUNCEMENT' : 'MCP_MAKE_ANNOUNCEMENTS';
break;


case 'make_global':
// Quick mod tools
$new_topic_type = POST_GLOBAL;
$allow_change_type = ($auth->acl_get('m_', $forum_id) || ($user->data['is_registered'] && $user->data['user_id'] == $topic_data['topic_poster'])) ? true : false;
$check_acl = 'f_announce';
$l_new_type = (sizeof($topic_ids) == 1) ? 'MCP_MAKE_GLOBAL' : 'MCP_MAKE_GLOBALS';
break;


case 'make_sticky':
$topic_mod = '';
$new_topic_type = POST_STICKY;
$topic_mod .= ($auth->acl_get('m_lock', $forum_id) || ($auth->acl_get('f_user_lock', $forum_id) && $user->data['is_registered'] && $user->data['user_id'] == $topic_data['topic_poster'] && $topic_data['topic_status'] == ITEM_UNLOCKED)) ? (($topic_data['topic_status'] == ITEM_UNLOCKED) ? '<option value="lock">' . $user->lang['LOCK_TOPIC'] . '</option>' : '<option value="unlock">' . $user->lang['UNLOCK_TOPIC'] . '</option>') : '';
$check_acl = 'f_sticky';
$topic_mod .= ($auth->acl_get('m_delete', $forum_id)) ? '<option value="delete_topic">' . $user->lang['DELETE_TOPIC'] . '</option>' : '';
$l_new_type = (sizeof($topic_ids) == 1) ? 'MCP_MAKE_STICKY' : 'MCP_MAKE_STICKIES';
$topic_mod .= ($auth->acl_get('m_move', $forum_id) && $topic_data['topic_status'] != ITEM_MOVED) ? '<option value="move">' . $user->lang['MOVE_TOPIC'] . '</option>' : '';
break;
$topic_mod .= ($auth->acl_get('m_split', $forum_id)) ? '<option value="split">' . $user->lang['SPLIT_TOPIC'] . '</option>' : '';
$topic_mod .= ($auth->acl_get('m_merge', $forum_id)) ? '<option value="merge">' . $user->lang['MERGE_POSTS'] . '</option>' : '';
$topic_mod .= ($auth->acl_get('m_merge', $forum_id)) ? '<option value="merge_topic">' . $user->lang['MERGE_TOPIC'] . '</option>' : '';
$topic_mod .= ($auth->acl_get('m_move', $forum_id)) ? '<option value="fork">' . $user->lang['FORK_TOPIC'] . '</option>' : '';
$topic_mod .= ($allow_change_type && $auth->acl_gets('f_sticky', 'f_announce', $forum_id) && $topic_data['topic_type'] != POST_NORMAL) ? '<option value="make_normal">' . $user->lang['MAKE_NORMAL'] . '</option>' : '';
$topic_mod .= ($allow_change_type && $auth->acl_get('f_sticky', $forum_id) && $topic_data['topic_type'] != POST_STICKY) ? '<option value="make_sticky">' . $user->lang['MAKE_STICKY'] . '</option>' : '';
$topic_mod .= ($allow_change_type && $auth->acl_get('f_announce', $forum_id) && $topic_data['topic_type'] != POST_ANNOUNCE) ? '<option value="make_announce">' . $user->lang['MAKE_ANNOUNCE'] . '</option>' : '';
$topic_mod .= ($allow_change_type && $auth->acl_get('f_announce', $forum_id) && $topic_data['topic_type'] != POST_GLOBAL) ? '<option value="make_global">' . $user->lang['MAKE_GLOBAL'] . '</option>' : '';
$topic_mod .= ($auth->acl_get('m_', $forum_id)) ? '<option value="topic_logs">' . $user->lang['VIEW_TOPIC_LOGS'] . '</option>' : '';


default:
// If we've got a hightlight set pass it on to pagination.
$new_topic_type = POST_NORMAL;
$pagination = generate_pagination(append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id" . ((strlen($u_sort_param)) ? "&amp;$u_sort_param" : '') . (($highlight_match) ? "&amp;hilit=$highlight" : '')), $total_posts, $config['posts_per_page'], $start);
$check_acl = '';
$l_new_type = (sizeof($topic_ids) == 1) ? 'MCP_MAKE_NORMAL' : 'MCP_MAKE_NORMALS';
break;
}


$redirect = request_var('redirect', build_url(array('action', 'quickmod')));
// Navigation links
generate_forum_nav($topic_data);


$s_hidden_fields = array(
// Forum Rules
'topic_id_list' => $topic_ids,
generate_forum_rules($topic_data);
'f' => $forum_id,
'action' => $action,
'redirect' => $redirect,
);
$success_msg = '';


if (confirm_box(true))
// Moderators
{
$forum_moderators = array();
if ($new_topic_type != POST_GLOBAL)
if ($config['load_moderators'])
{
{
$sql = 'UPDATE ' . TOPICS_TABLE . "
get_moderators($forum_moderators, $forum_id);
SET topic_type = $new_topic_type
}
WHERE " . $db->sql_in_set('topic_id', $topic_ids) . '
AND forum_id <> 0';
$db->sql_query($sql);


// Reset forum id if a global topic is within the array
// This is only used for print view so ...
$to_forum_id = request_var('to_forum_id', 0);
$server_path = (!$view) ? $phpbb_root_path : generate_board_url() . '/';


if ($to_forum_id)
// Replace naughty words in title
{
$topic_data['topic_title'] = censor_text($topic_data['topic_title']);
$sql = 'UPDATE ' . TOPICS_TABLE . "
SET topic_type = $new_topic_type, forum_id = $to_forum_id
WHERE " . $db->sql_in_set('topic_id', $topic_ids) . '
AND forum_id = 0';
$db->sql_query($sql);


// Update forum_ids for all posts
// Send vars to template
$sql = 'UPDATE ' . POSTS_TABLE . "
$template->assign_vars(array(
SET forum_id = $to_forum_id
'FORUM_ID' => $forum_id,
WHERE " . $db->sql_in_set('topic_id', $topic_ids) . '
'FORUM_NAME' => $topic_data['forum_name'],
AND forum_id = 0';
'FORUM_DESC' => generate_text_for_display($topic_data['forum_desc'], $topic_data['forum_desc_uid'], $topic_data['forum_desc_bitfield'], $topic_data['forum_desc_options']),
$db->sql_query($sql);
'TOPIC_ID' => $topic_id,
'TOPIC_TITLE' => $topic_data['topic_title'],
'TOPIC_POSTER' => $topic_data['topic_poster'],


// Do a little forum sync stuff
'TOPIC_AUTHOR_FULL' => get_username_string('full', $topic_data['topic_poster'], $topic_data['topic_first_poster_name'], $topic_data['topic_first_poster_colour']),
$sql = 'SELECT SUM(t.topic_replies + t.topic_approved) as topic_posts, COUNT(t.topic_approved) as topics_authed
'TOPIC_AUTHOR_COLOUR' => get_username_string('colour', $topic_data['topic_poster'], $topic_data['topic_first_poster_name'], $topic_data['topic_first_poster_colour']),
FROM ' . TOPICS_TABLE . ' t
'TOPIC_AUTHOR' => get_username_string('username', $topic_data['topic_poster'], $topic_data['topic_first_poster_name'], $topic_data['topic_first_poster_colour']),
WHERE ' . $db->sql_in_set('t.topic_id', $topic_ids);
$result = $db->sql_query($sql);
$row_data = $db->sql_fetchrow($result);
$db->sql_freeresult($result);


$sync_sql = array();
'PAGINATION' => $pagination,
'PAGE_NUMBER' => on_page($total_posts, $config['posts_per_page'], $start),
'TOTAL_POSTS' => ($total_posts == 1) ? $user->lang['VIEW_TOPIC_POST'] : sprintf($user->lang['VIEW_TOPIC_POSTS'], $total_posts),
'U_MCP' => ($auth->acl_get('m_', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&amp;mode=topic_view&amp;f=$forum_id&amp;t=$topic_id&amp;start=$start" . ((strlen($u_sort_param)) ? "&amp;$u_sort_param" : ''), true, $user->session_id) : '',
'MODERATORS' => (isset($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id])) ? implode(', ', $forum_moderators[$forum_id]) : '',


if ($row_data['topic_posts'])
'POST_IMG' => ($topic_data['forum_status'] == ITEM_LOCKED) ? $user->img('button_topic_locked', 'FORUM_LOCKED') : $user->img('button_topic_new', 'POST_NEW_TOPIC'),
{
'QUOTE_IMG' => $user->img('icon_post_quote', 'REPLY_WITH_QUOTE'),
$sync_sql[$to_forum_id][] = 'forum_posts = forum_posts + ' . (int) $row_data['topic_posts'];
'REPLY_IMG' => ($topic_data['forum_status'] == ITEM_LOCKED || $topic_data['topic_status'] == ITEM_LOCKED) ? $user->img('button_topic_locked', 'TOPIC_LOCKED') : $user->img('button_topic_reply', 'REPLY_TO_TOPIC'),
}
'EDIT_IMG' => $user->img('icon_post_edit', 'EDIT_POST'),
'DELETE_IMG' => $user->img('icon_post_delete', 'DELETE_POST'),
'INFO_IMG' => $user->img('icon_post_info', 'VIEW_INFO'),
'PROFILE_IMG' => $user->img('icon_user_profile', 'READ_PROFILE'),
'SEARCH_IMG' => $user->img('icon_user_search', 'SEARCH_USER_POSTS'),
'PM_IMG' => $user->img('icon_contact_pm', 'SEND_PRIVATE_MESSAGE'),
'EMAIL_IMG' => $user->img('icon_contact_email', 'SEND_EMAIL'),
'WWW_IMG' => $user->img('icon_contact_www', 'VISIT_WEBSITE'),
'ICQ_IMG' => $user->img('icon_contact_icq', 'ICQ'),
'AIM_IMG' => $user->img('icon_contact_aim', 'AIM'),
'MSN_IMG' => $user->img('icon_contact_msnm', 'MSNM'),
'YIM_IMG' => $user->img('icon_contact_yahoo', 'YIM'),
'JABBER_IMG' => $user->img('icon_contact_jabber', 'JABBER') ,
'REPORT_IMG' => $user->img('icon_post_report', 'REPORT_POST'),
'REPORTED_IMG' => $user->img('icon_topic_reported', 'POST_REPORTED'),
'UNAPPROVED_IMG' => $user->img('icon_topic_unapproved', 'POST_UNAPPROVED'),
'WARN_IMG' => $user->img('icon_user_warn', 'WARN_USER'),


if ($row_data['topics_authed'])
'S_IS_LOCKED' => ($topic_data['topic_status'] == ITEM_UNLOCKED && $topic_data['forum_status'] == ITEM_UNLOCKED) ? false : true,
{
'S_SELECT_SORT_DIR' => $s_sort_dir,
$sync_sql[$to_forum_id][] = 'forum_topics = forum_topics + ' . (int) $row_data['topics_authed'];
'S_SELECT_SORT_KEY' => $s_sort_key,
}
'S_SELECT_SORT_DAYS' => $s_limit_days,
'S_SINGLE_MODERATOR' => (!empty($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id]) > 1) ? false : true,
'S_TOPIC_ACTION' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;start=$start"),
'S_TOPIC_MOD' => ($topic_mod != '') ? '<select name="action" id="quick-mod-select">' . $topic_mod . '</select>' : '',
'S_MOD_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;start=$start&amp;quickmod=1&amp;redirect=" . urlencode(str_replace('&amp;', '&', $viewtopic_url)), true, $user->session_id),


$sync_sql[$to_forum_id][] = 'forum_topics_real = forum_topics_real + ' . (int) sizeof($topic_ids);
'S_VIEWTOPIC' => true,
'S_DISPLAY_SEARCHBOX' => ($auth->acl_get('u_search') && $auth->acl_get('f_search', $forum_id) && $config['load_search']) ? true : false,
'S_SEARCHBOX_ACTION' => append_sid("{$phpbb_root_path}search.$phpEx", 't=' . $topic_id),


foreach ($sync_sql as $forum_id_key => $array)
'S_DISPLAY_POST_INFO' => ($topic_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
{
'S_DISPLAY_REPLY_INFO' => ($topic_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_reply', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
$sql = 'UPDATE ' . FORUMS_TABLE . '
'S_ENABLE_FEEDS_TOPIC' => ($config['feed_topic'] && !phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $topic_data['forum_options'])) ? true : false,
SET ' . implode(', ', $array) . '
WHERE forum_id = ' . $forum_id_key;
$db->sql_query($sql);
}


sync('forum', 'forum_id', $to_forum_id);
'U_TOPIC' => "{$server_path}viewtopic.$phpEx?f=$forum_id&amp;t=$topic_id",
}
'U_FORUM' => $server_path,
}
'U_VIEW_TOPIC' => $viewtopic_url,
else
'U_VIEW_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id),
{
'U_VIEW_OLDER_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;view=previous"),
// Get away with those topics already being a global announcement by re-calculating $topic_ids
'U_VIEW_NEWER_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;view=next"),
$sql = 'SELECT topic_id
'U_PRINT_TOPIC' => ($auth->acl_get('f_print', $forum_id)) ? $viewtopic_url . '&amp;view=print' : '',
FROM ' . TOPICS_TABLE . '
'U_EMAIL_TOPIC' => ($auth->acl_get('f_email', $forum_id) && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=email&amp;t=$topic_id") : '',
WHERE ' . $db->sql_in_set('topic_id', $topic_ids) . '
AND forum_id <> 0';
$result = $db->sql_query($sql);


$topic_ids = array();
'U_WATCH_TOPIC' => $s_watching_topic['link'],
while ($row = $db->sql_fetchrow($result))
'L_WATCH_TOPIC' => $s_watching_topic['title'],
{
'S_WATCHING_TOPIC' => $s_watching_topic['is_watching'],
$topic_ids[] = $row['topic_id'];
}
$db->sql_freeresult($result);


if (sizeof($topic_ids))
'U_BOOKMARK_TOPIC' => ($user->data['is_registered'] && $config['allow_bookmarks']) ? $viewtopic_url . '&amp;bookmark=1&amp;hash=' . generate_link_hash("topic_$topic_id") : '',
{
'L_BOOKMARK_TOPIC' => ($user->data['is_registered'] && $config['allow_bookmarks'] && $topic_data['bookmarked']) ? $user->lang['BOOKMARK_TOPIC_REMOVE'] : $user->lang['BOOKMARK_TOPIC'],
// Delete topic shadows for global announcements
$sql = 'DELETE FROM ' . TOPICS_TABLE . '
WHERE ' . $db->sql_in_set('topic_moved_id', $topic_ids);
$db->sql_query($sql);


$sql = 'UPDATE ' . TOPICS_TABLE . "
'U_POST_NEW_TOPIC' => ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=post&amp;f=$forum_id") : '',
SET topic_type = $new_topic_type, forum_id = 0
'U_POST_REPLY_TOPIC' => ($auth->acl_get('f_reply', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=reply&amp;f=$forum_id&amp;t=$topic_id") : '',
WHERE " . $db->sql_in_set('topic_id', $topic_ids);
'U_BUMP_TOPIC' => (bump_topic_allowed($forum_id, $topic_data['topic_bumped'], $topic_data['topic_last_post_time'], $topic_data['topic_poster'], $topic_data['topic_last_poster_id'])) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=bump&amp;f=$forum_id&amp;t=$topic_id&amp;hash=" . generate_link_hash("topic_$topic_id")) : '')
$db->sql_query($sql);
);


// Update forum_ids for all posts
// Does this topic contain a poll?
$sql = 'UPDATE ' . POSTS_TABLE . '
if (!empty($topic_data['poll_start']))
SET forum_id = 0
{
WHERE ' . $db->sql_in_set('topic_id', $topic_ids);
$sql = 'SELECT o.*, p.bbcode_bitfield, p.bbcode_uid
$db->sql_query($sql);
FROM ' . POLL_OPTIONS_TABLE . ' o, ' . POSTS_TABLE . " p
WHERE o.topic_id = $topic_id
AND p.post_id = {$topic_data['topic_first_post_id']}
AND p.topic_id = o.topic_id
ORDER BY o.poll_option_id";
$result = $db->sql_query($sql);


// Do a little forum sync stuff
$poll_info = array();
$sql = 'SELECT SUM(t.topic_replies + t.topic_approved) as topic_posts, COUNT(t.topic_approved) as topics_authed
while ($row = $db->sql_fetchrow($result))
FROM ' . TOPICS_TABLE . ' t
{
WHERE ' . $db->sql_in_set('t.topic_id', $topic_ids);
$poll_info[] = $row;
$result = $db->sql_query($sql);
}
$row_data = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$db->sql_freeresult($result);


$sync_sql = array();
$cur_voted_id = array();
if ($user->data['is_registered'])
{
$sql = 'SELECT poll_option_id
FROM ' . POLL_VOTES_TABLE . '
WHERE topic_id = ' . $topic_id . '
AND vote_user_id = ' . $user->data['user_id'];
$result = $db->sql_query($sql);


if ($row_data['topic_posts'])
while ($row = $db->sql_fetchrow($result))
{
{
$sync_sql[$forum_id][] = 'forum_posts = forum_posts - ' . (int) $row_data['topic_posts'];
$cur_voted_id[] = $row['poll_option_id'];
}
}
$db->sql_freeresult($result);
}
else
{
// Cookie based guest tracking ... I don't like this but hum ho
// it's oft requested. This relies on "nice" users who don't feel
// the need to delete cookies to mess with results.
if (isset($_COOKIE[$config['cookie_name'] . '_poll_' . $topic_id]))
{
$cur_voted_id = explode(',', $_COOKIE[$config['cookie_name'] . '_poll_' . $topic_id]);
$cur_voted_id = array_map('intval', $cur_voted_id);
}
}


if ($row_data['topics_authed'])
// Can not vote at all if no vote permission
{
$s_can_vote = ($auth->acl_get('f_vote', $forum_id) &&
$sync_sql[$forum_id][] = 'forum_topics = forum_topics - ' . (int) $row_data['topics_authed'];
(($topic_data['poll_length'] != 0 && $topic_data['poll_start'] + $topic_data['poll_length'] > time()) || $topic_data['poll_length'] == 0) &&
}
$topic_data['topic_status'] != ITEM_LOCKED &&
$topic_data['forum_status'] != ITEM_LOCKED &&
(!sizeof($cur_voted_id) ||
($auth->acl_get('f_votechg', $forum_id) && $topic_data['poll_vote_change']))) ? true : false;
$s_display_results = (!$s_can_vote || ($s_can_vote && sizeof($cur_voted_id)) || $view == 'viewpoll') ? true : false;


$sync_sql[$forum_id][] = 'forum_topics_real = forum_topics_real - ' . (int) sizeof($topic_ids);
if ($update && $s_can_vote)
{


foreach ($sync_sql as $forum_id_key => $array)
if (!sizeof($voted_id) || sizeof($voted_id) > $topic_data['poll_max_options'] || in_array(VOTE_CONVERTED, $cur_voted_id) || !check_form_key('posting'))
{
{
$sql = 'UPDATE ' . FORUMS_TABLE . '
$redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;start=$start");
SET ' . implode(', ', $array) . '
WHERE forum_id = ' . $forum_id_key;
$db->sql_query($sql);
}


sync('forum', 'forum_id', $forum_id);
meta_refresh(5, $redirect_url);
if (!sizeof($voted_id))
{
$message = 'NO_VOTE_OPTION';
}
else if (sizeof($voted_id) > $topic_data['poll_max_options'])
{
$message = 'TOO_MANY_VOTE_OPTIONS';
}
else if (in_array(VOTE_CONVERTED, $cur_voted_id))
{
$message = 'VOTE_CONVERTED';
}
}
else
{
$message = 'FORM_INVALID';
}
$message = $user->lang[$message] . '<br /><br />' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $redirect_url . '">', '</a>');
trigger_error($message);
}
}


$success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_TYPE_CHANGED' : 'TOPICS_TYPE_CHANGED';
foreach ($voted_id as $option)
{
if (in_array($option, $cur_voted_id))
{
continue;
}


if (sizeof($topic_ids))
$sql = 'UPDATE ' . POLL_OPTIONS_TABLE . '
{
SET poll_option_total = poll_option_total + 1
$data = get_topic_data($topic_ids);
WHERE poll_option_id = ' . (int) $option . '
AND topic_id = ' . (int) $topic_id;
$db->sql_query($sql);


foreach ($data as $topic_id => $row)
if ($user->data['is_registered'])
{
{
add_log('mod', $forum_id, $topic_id, 'LOG_TOPIC_TYPE_CHANGED', $row['topic_title']);
$sql_ary = array(
'topic_id' => (int) $topic_id,
'poll_option_id' => (int) $option,
'vote_user_id' => (int) $user->data['user_id'],
'vote_user_ip' => (string) $user->ip,
);
 
$sql = 'INSERT INTO ' . POLL_VOTES_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
$db->sql_query($sql);
}
}
}
}
}
else
{
// Global topic involved?
$global_involved = false;


if ($new_topic_type != POST_GLOBAL)
foreach ($cur_voted_id as $option)
{
{
$sql = 'SELECT forum_id
if (!in_array($option, $voted_id))
FROM ' . TOPICS_TABLE . '
{
WHERE ' . $db->sql_in_set('topic_id', $topic_ids) . '
$sql = 'UPDATE ' . POLL_OPTIONS_TABLE . '
AND forum_id = 0';
SET poll_option_total = poll_option_total - 1
$result = $db->sql_query($sql);
WHERE poll_option_id = ' . (int) $option . '
$row = $db->sql_fetchrow($result);
AND topic_id = ' . (int) $topic_id;
$db->sql_freeresult($result);
$db->sql_query($sql);


if ($row)
if ($user->data['is_registered'])
{
{
$global_involved = true;
$sql = 'DELETE FROM ' . POLL_VOTES_TABLE . '
WHERE topic_id = ' . (int) $topic_id . '
AND poll_option_id = ' . (int) $option . '
AND vote_user_id = ' . (int) $user->data['user_id'];
$db->sql_query($sql);
}
}
}
}
}


if ($global_involved)
if ($user->data['user_id'] == ANONYMOUS && !$user->data['is_bot'])
{
{
global $template;
$user->set_cookie('poll_' . $topic_id, implode(',', $voted_id), time() + 31536000);
}
 
$sql = 'UPDATE ' . TOPICS_TABLE . '
SET poll_last_vote = ' . time() . "
WHERE topic_id = $topic_id";
//, topic_last_post_time = ' . time() . " -- for bumping topics with new votes, ignore for now
$db->sql_query($sql);


$template->assign_vars(array(
$redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;start=$start");
'S_FORUM_SELECT' => make_forum_select(request_var('f', $forum_id), false, false, true, true),
'S_CAN_LEAVE_SHADOW' => false,
'ADDITIONAL_MSG' => (sizeof($topic_ids) == 1) ? $user->lang['SELECT_FORUM_GLOBAL_ANNOUNCEMENT'] : $user->lang['SELECT_FORUM_GLOBAL_ANNOUNCEMENTS'])
);


confirm_box(false, $l_new_type, build_hidden_fields($s_hidden_fields), 'mcp_move.html');
meta_refresh(5, $redirect_url);
}
trigger_error($user->lang['VOTE_SUBMITTED'] . '<br /><br />' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $redirect_url . '">', '</a>'));
else
{
confirm_box(false, $l_new_type, build_hidden_fields($s_hidden_fields));
}
}
}


$redirect = request_var('redirect', "index.$phpEx");
$poll_total = 0;
$redirect = reapply_sid($redirect);
foreach ($poll_info as $poll_option)
{
$poll_total += $poll_option['poll_option_total'];
}


if (!$success_msg)
if ($poll_info[0]['bbcode_bitfield'])
{
{
redirect($redirect);
$poll_bbcode = new bbcode();
}
}
else
else
{
{
meta_refresh(2, $redirect);
$poll_bbcode = false;
trigger_error($user->lang[$success_msg] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $redirect . '">', '</a>'));
}
}
}


/**
for ($i = 0, $size = sizeof($poll_info); $i < $size; $i++)
* Move Topic
{
*/
$poll_info[$i]['poll_option_text'] = censor_text($poll_info[$i]['poll_option_text']);
function mcp_move_topic($topic_ids)
{
global $auth, $user, $db, $template;
global $phpEx, $phpbb_root_path;


// Here we limit the operation to one forum only
if ($poll_bbcode !== false)
$forum_id = check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_move'), true);
{
$poll_bbcode->bbcode_second_pass($poll_info[$i]['poll_option_text'], $poll_info[$i]['bbcode_uid'], $poll_option['bbcode_bitfield']);
}


if ($forum_id === false)
$poll_info[$i]['poll_option_text'] = bbcode_nl2br($poll_info[$i]['poll_option_text']);
{
$poll_info[$i]['poll_option_text'] = smiley_text($poll_info[$i]['poll_option_text']);
return;
}
}


$to_forum_id = request_var('to_forum_id', 0);
$topic_data['poll_title'] = censor_text($topic_data['poll_title']);
$redirect = request_var('redirect', build_url(array('action', 'quickmod')));
$additional_msg = $success_msg = '';


$s_hidden_fields = build_hidden_fields(array(
if ($poll_bbcode !== false)
'topic_id_list' => $topic_ids,
{
'f' => $forum_id,
$poll_bbcode->bbcode_second_pass($topic_data['poll_title'], $poll_info[0]['bbcode_uid'], $poll_info[0]['bbcode_bitfield']);
'action' => 'move',
}
'redirect' => $redirect)
);


if ($to_forum_id)
$topic_data['poll_title'] = bbcode_nl2br($topic_data['poll_title']);
{
$topic_data['poll_title'] = smiley_text($topic_data['poll_title']);
$forum_data = get_forum_data($to_forum_id, 'f_post');


if (!sizeof($forum_data))
unset($poll_bbcode);
{
$additional_msg = $user->lang['FORUM_NOT_EXIST'];
}
else
{
$forum_data = $forum_data[$to_forum_id];


if ($forum_data['forum_type'] != FORUM_POST)
foreach ($poll_info as $poll_option)
{
$additional_msg = $user->lang['FORUM_NOT_POSTABLE'];
}
else if (!$auth->acl_get('f_post', $to_forum_id) || (!$auth->acl_get('m_approve', $to_forum_id) && !$auth->acl_get('f_noapprove', $to_forum_id)))
{
$additional_msg = $user->lang['USER_CANNOT_POST'];
}
else if ($forum_id == $to_forum_id)
{
$additional_msg = $user->lang['CANNOT_MOVE_SAME_FORUM'];
}
}
}
else if (isset($_POST['confirm']))
{
{
$additional_msg = $user->lang['FORUM_NOT_EXIST'];
$option_pct = ($poll_total > 0) ? $poll_option['poll_option_total'] / $poll_total : 0;
}
$option_pct_txt = sprintf("%.1d%%", round($option_pct * 100));


if (!$to_forum_id || $additional_msg)
$template->assign_block_vars('poll_option', array(
{
'POLL_OPTION_ID' => $poll_option['poll_option_id'],
unset($_POST['confirm']);
'POLL_OPTION_CAPTION' => $poll_option['poll_option_text'],
unset($_REQUEST['confirm_key']);
'POLL_OPTION_RESULT' => $poll_option['poll_option_total'],
'POLL_OPTION_PERCENT' => $option_pct_txt,
'POLL_OPTION_PCT' => round($option_pct * 100),
'POLL_OPTION_IMG' => $user->img('poll_center', $option_pct_txt, round($option_pct * 250)),
'POLL_OPTION_VOTED' => (in_array($poll_option['poll_option_id'], $cur_voted_id)) ? true : false)
);
}
}


if (confirm_box(true))
$poll_end = $topic_data['poll_length'] + $topic_data['poll_start'];
{
$topic_data = get_topic_data($topic_ids);
$leave_shadow = (isset($_POST['move_leave_shadow'])) ? true : false;


$forum_sync_data = array();
$template->assign_vars(array(
'POLL_QUESTION' => $topic_data['poll_title'],
'TOTAL_VOTES' => $poll_total,
'POLL_LEFT_CAP_IMG' => $user->img('poll_left'),
'POLL_RIGHT_CAP_IMG'=> $user->img('poll_right'),


$forum_sync_data[$forum_id] = current($topic_data);
'L_MAX_VOTES' => ($topic_data['poll_max_options'] == 1) ? $user->lang['MAX_OPTION_SELECT'] : sprintf($user->lang['MAX_OPTIONS_SELECT'], $topic_data['poll_max_options']),
$forum_sync_data[$to_forum_id] = $forum_data;
'L_POLL_LENGTH' => ($topic_data['poll_length']) ? sprintf($user->lang[($poll_end > time()) ? 'POLL_RUN_TILL' : 'POLL_ENDED_AT'], $user->format_date($poll_end)) : '',


// Real topics added to target forum
'S_HAS_POLL' => true,
$topics_moved = sizeof($topic_data);
'S_CAN_VOTE' => $s_can_vote,
'S_DISPLAY_RESULTS' => $s_display_results,
'S_IS_MULTI_CHOICE' => ($topic_data['poll_max_options'] > 1) ? true : false,
'S_POLL_ACTION' => $viewtopic_url,


// Approved topics added to target forum
'U_VIEW_RESULTS' => $viewtopic_url . '&amp;view=viewpoll')
$topics_authed_moved = 0;
);


// Posts (topic replies + topic post if approved) added to target forum
unset($poll_end, $poll_info, $voted_id);
$topic_posts_added = 0;
}


// Posts (topic replies + topic post if approved and not global announcement) removed from source forum
// If the user is trying to reach the second half of the topic, fetch it starting from the end
$topic_posts_removed = 0;
$store_reverse = false;
$sql_limit = $config['posts_per_page'];
$sql_sort_order = $direction = '';


// Real topics removed from source forum (all topics without global announcements)
if ($start > $total_posts / 2)
$topics_removed = 0;
{
$store_reverse = true;


// Approved topics removed from source forum (except global announcements)
if ($start + $config['posts_per_page'] > $total_posts)
$topics_authed_removed = 0;
{
$sql_limit = min($config['posts_per_page'], max(1, $total_posts - $start));
}


foreach ($topic_data as $topic_id => $topic_info)
// Select the sort order
{
$direction = (($sort_dir == 'd') ? 'ASC' : 'DESC');
if ($topic_info['topic_approved'])
$sql_start = max(0, $total_posts - $sql_limit - $start);
{
}
$topics_authed_moved++;
else
$topic_posts_added++;
{
}
// Select the sort order
$direction = (($sort_dir == 'd') ? 'DESC' : 'ASC');
$sql_start = $start;
}


$topic_posts_added += $topic_info['topic_replies'];
if (is_array($sort_by_sql[$sort_key]))
{
$sql_sort_order = implode(' ' . $direction . ', ', $sort_by_sql[$sort_key]) . ' ' . $direction;
}
else
{
$sql_sort_order = $sort_by_sql[$sort_key] . ' ' . $direction;
}


if ($topic_info['topic_type'] != POST_GLOBAL)
// Container for user details, only process once
{
$post_list = $user_cache = $id_cache = $attachments = $attach_list = $rowset = $update_count = $post_edit_list = array();
$topics_removed++;
$has_attachments = $display_notice = false;
$topic_posts_removed += $topic_info['topic_replies'];
$bbcode_bitfield = '';
$i = $i_total = 0;


if ($topic_info['topic_approved'])
// Go ahead and pull all data for this topic
{
$sql = 'SELECT p.post_id
$topics_authed_removed++;
FROM ' . POSTS_TABLE . ' p' . (($join_user_sql[$sort_key]) ? ', ' . USERS_TABLE . ' u': '') . "
$topic_posts_removed++;
WHERE p.topic_id = $topic_id
}
" . ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND p.post_approved = 1' : '') . "
}
" . (($join_user_sql[$sort_key]) ? 'AND u.user_id = p.poster_id': '') . "
}
$limit_posts_time
ORDER BY $sql_sort_order";
$result = $db->sql_query_limit($sql, $sql_limit, $sql_start);


$db->sql_transaction('begin');
$i = ($store_reverse) ? $sql_limit - 1 : 0;
while ($row = $db->sql_fetchrow($result))
{
$post_list[$i] = (int) $row['post_id'];
($store_reverse) ? $i-- : $i++;
}
$db->sql_freeresult($result);


$sync_sql = array();
if (!sizeof($post_list))
{
if ($sort_days)
{
trigger_error('NO_POSTS_TIME_FRAME');
}
else
{
trigger_error('NO_TOPIC');
}
}


if ($topic_posts_added)
// Holding maximum post time for marking topic read
{
// We need to grab it because we do reverse ordering sometimes
$sync_sql[$to_forum_id][] = 'forum_posts = forum_posts + ' . $topic_posts_added;
$max_post_time = 0;
}


if ($topics_authed_moved)
$sql = $db->sql_build_query('SELECT', array(
{
'SELECT' => 'u.*, z.friend, z.foe, p.*',
$sync_sql[$to_forum_id][] = 'forum_topics = forum_topics + ' . (int) $topics_authed_moved;
}


$sync_sql[$to_forum_id][] = 'forum_topics_real = forum_topics_real + ' . (int) $topics_moved;
'FROM' => array(
USERS_TABLE => 'u',
POSTS_TABLE => 'p',
),


// Move topics, but do not resync yet
'LEFT_JOIN' => array(
move_topics($topic_ids, $to_forum_id, false);
array(
'FROM' => array(ZEBRA_TABLE => 'z'),
'ON' => 'z.user_id = ' . $user->data['user_id'] . ' AND z.zebra_id = p.poster_id'
)
),


$forum_ids = array($to_forum_id);
'WHERE' => $db->sql_in_set('p.post_id', $post_list) . '
foreach ($topic_data as $topic_id => $row)
AND u.user_id = p.poster_id'
{
));
// Get the list of forums to resync, add a log entry
$forum_ids[] = $row['forum_id'];
add_log('mod', $to_forum_id, $topic_id, 'LOG_MOVE', $row['forum_name'], $forum_data['forum_name']);


// If we have moved a global announcement, we need to correct the topic type
$result = $db->sql_query($sql);
if ($row['topic_type'] == POST_GLOBAL)
{
$sql = 'UPDATE ' . TOPICS_TABLE . '
SET topic_type = ' . POST_ANNOUNCE . '
WHERE topic_id = ' . (int) $row['topic_id'];
$db->sql_query($sql);
}


// Leave a redirection if required and only if the topic is visible to users
$now = getdate(time() + $user->timezone + $user->dst - date('Z'));
if ($leave_shadow && $row['topic_approved'] && $row['topic_type'] != POST_GLOBAL)
{
$shadow = array(
'forum_id' => (int) $row['forum_id'],
'icon_id' => (int) $row['icon_id'],
'topic_attachment' => (int) $row['topic_attachment'],
'topic_approved' => 1, // a shadow topic is always approved
'topic_reported' => 0, // a shadow topic is never reported
'topic_title' => (string) $row['topic_title'],
'topic_poster' => (int) $row['topic_poster'],
'topic_time' => (int) $row['topic_time'],
'topic_time_limit' => (int) $row['topic_time_limit'],
'topic_views' => (int) $row['topic_views'],
'topic_replies' => (int) $row['topic_replies'],
'topic_replies_real' => (int) $row['topic_replies_real'],
'topic_status' => ITEM_MOVED,
'topic_type' => POST_NORMAL,
'topic_first_post_id' => (int) $row['topic_first_post_id'],
'topic_first_poster_colour'=>(string) $row['topic_first_poster_colour'],
'topic_first_poster_name'=> (string) $row['topic_first_poster_name'],
'topic_last_post_id' => (int) $row['topic_last_post_id'],
'topic_last_poster_id' => (int) $row['topic_last_poster_id'],
'topic_last_poster_colour'=>(string) $row['topic_last_poster_colour'],
'topic_last_poster_name'=> (string) $row['topic_last_poster_name'],
'topic_last_post_subject'=> (string)  $row['topic_last_post_subject'],
'topic_last_post_time' => (int) $row['topic_last_post_time'],
'topic_last_view_time' => (int) $row['topic_last_view_time'],
'topic_moved_id' => (int) $row['topic_id'],
'topic_bumped' => (int) $row['topic_bumped'],
'topic_bumper' => (int) $row['topic_bumper'],
'poll_title' => (string) $row['poll_title'],
'poll_start' => (int) $row['poll_start'],
'poll_length' => (int) $row['poll_length'],
'poll_max_options' => (int) $row['poll_max_options'],
'poll_last_vote' => (int) $row['poll_last_vote']
);


$db->sql_query('INSERT INTO ' . TOPICS_TABLE . $db->sql_build_array('INSERT', $shadow));
// Posts are stored in the $rowset array while $attach_list, $user_cache
// and the global bbcode_bitfield are built
while ($row = $db->sql_fetchrow($result))
{
// Set max_post_time
if ($row['post_time'] > $max_post_time)
{
$max_post_time = $row['post_time'];
}


// Shadow topics only count on new "topics" and not posts... a shadow topic alone has 0 posts
$poster_id = (int) $row['poster_id'];
$topics_removed--;
$topics_authed_removed--;
}
}
unset($topic_data);


if ($topic_posts_removed)
// Does post have an attachment? If so, add it to the list
{
if ($row['post_attachment'] && $config['allow_attachments'])
$sync_sql[$forum_id][] = 'forum_posts = forum_posts - ' . $topic_posts_removed;
{
}
$attach_list[] = (int) $row['post_id'];


if ($topics_removed)
if ($row['post_approved'])
{
{
$sync_sql[$forum_id][] = 'forum_topics_real = forum_topics_real - ' . (int) $topics_removed;
$has_attachments = true;
}
}
}


if ($topics_authed_removed)
$rowset[$row['post_id']] = array(
{
'hide_post' => ($row['foe'] && ($view != 'show' || $post_id != $row['post_id'])) ? true : false,
$sync_sql[$forum_id][] = 'forum_topics = forum_topics - ' . (int) $topics_authed_removed;
}


$success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_MOVED_SUCCESS' : 'TOPICS_MOVED_SUCCESS';
'post_id' => $row['post_id'],
'post_time' => $row['post_time'],
'user_id' => $row['user_id'],
'username' => $row['username'],
'user_colour' => $row['user_colour'],
'topic_id' => $row['topic_id'],
'forum_id' => $row['forum_id'],
'post_subject' => $row['post_subject'],
'post_edit_count' => $row['post_edit_count'],
'post_edit_time' => $row['post_edit_time'],
'post_edit_reason' => $row['post_edit_reason'],
'post_edit_user' => $row['post_edit_user'],
'post_edit_locked' => $row['post_edit_locked'],


foreach ($sync_sql as $forum_id_key => $array)
// Make sure the icon actually exists
{
'icon_id' => (isset($icons[$row['icon_id']]['img'], $icons[$row['icon_id']]['height'], $icons[$row['icon_id']]['width'])) ? $row['icon_id'] : 0,
$sql = 'UPDATE ' . FORUMS_TABLE . '
'post_attachment' => $row['post_attachment'],
SET ' . implode(', ', $array) . '
'post_approved' => $row['post_approved'],
WHERE forum_id = ' . $forum_id_key;
'post_reported' => $row['post_reported'],
$db->sql_query($sql);
'post_username' => $row['post_username'],
}
'post_text' => $row['post_text'],
'bbcode_uid' => $row['bbcode_uid'],
'bbcode_bitfield' => $row['bbcode_bitfield'],
'enable_smilies' => $row['enable_smilies'],
'enable_sig' => $row['enable_sig'],
'friend' => $row['friend'],
'foe' => $row['foe'],
);


$db->sql_transaction('commit');
// Define the global bbcode bitfield, will be used to load bbcodes
$bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']);


sync('forum', 'forum_id', array($forum_id, $to_forum_id));
// Is a signature attached? Are we going to display it?
if ($row['enable_sig'] && $config['allow_sig'] && $user->optionget('viewsigs'))
{
$bbcode_bitfield = $bbcode_bitfield | base64_decode($row['user_sig_bbcode_bitfield']);
}
}
else
 
// Cache various user specific data ... so we don't have to recompute
// this each time the same user appears on this page
if (!isset($user_cache[$poster_id]))
{
{
$template->assign_vars(array(
if ($poster_id == ANONYMOUS)
'S_FORUM_SELECT' => make_forum_select($to_forum_id, $forum_id, false, true, true, true),
{
'S_CAN_LEAVE_SHADOW' => true,
$user_cache[$poster_id] = array(
'ADDITIONAL_MSG' => $additional_msg)
'joined' => '',
);
'posts' => '',
'from' => '',
 
'sig' => '',
'sig_bbcode_uid' => '',
'sig_bbcode_bitfield' => '',
 
'online' => false,
'avatar' => ($user->optionget('viewavatars')) ? get_user_avatar($row['user_avatar'], $row['user_avatar_type'], $row['user_avatar_width'], $row['user_avatar_height']) : '',
'rank_title' => '',
'rank_image' => '',
'rank_image_src' => '',
'sig' => '',
'profile' => '',
'pm' => '',
'email' => '',
'www' => '',
'icq_status_img' => '',
'icq' => '',
'aim' => '',
'msn' => '',
'yim' => '',
'jabber' => '',
'search' => '',
'age' => '',
 
'username' => $row['username'],
'user_colour' => $row['user_colour'],
 
'warnings' => 0,
'allow_pm' => 0,
);
 
get_user_rank($row['user_rank'], false, $user_cache[$poster_id]['rank_title'], $user_cache[$poster_id]['rank_image'], $user_cache[$poster_id]['rank_image_src']);
}
else
{
$user_sig = '';
 
// We add the signature to every posters entry because enable_sig is post dependant
if ($row['user_sig'] && $config['allow_sig'] && $user->optionget('viewsigs'))
{
$user_sig = $row['user_sig'];
}


confirm_box(false, 'MOVE_TOPIC' . ((sizeof($topic_ids) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_move.html');
$id_cache[] = $poster_id;
}


$redirect = request_var('redirect', "index.$phpEx");
$user_cache[$poster_id] = array(
$redirect = reapply_sid($redirect);
'joined' => $user->format_date($row['user_regdate']),
'posts' => $row['user_posts'],
'warnings' => (isset($row['user_warnings'])) ? $row['user_warnings'] : 0,
'from' => (!empty($row['user_from'])) ? $row['user_from'] : '',


if (!$success_msg)
'sig' => $user_sig,
{
'sig_bbcode_uid' => (!empty($row['user_sig_bbcode_uid'])) ? $row['user_sig_bbcode_uid'] : '',
redirect($redirect);
'sig_bbcode_bitfield' => (!empty($row['user_sig_bbcode_bitfield'])) ? $row['user_sig_bbcode_bitfield'] : '',
}
else
{
meta_refresh(3, $redirect);


$message = $user->lang[$success_msg];
'viewonline' => $row['user_allow_viewonline'],
$message .= '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $redirect . '">', '</a>');
'allow_pm' => $row['user_allow_pm'],
$message .= '<br /><br />' . sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id") . '">', '</a>');
$message .= '<br /><br />' . sprintf($user->lang['RETURN_NEW_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$to_forum_id") . '">', '</a>');


trigger_error($message);
'avatar' => ($user->optionget('viewavatars')) ? get_user_avatar($row['user_avatar'], $row['user_avatar_type'], $row['user_avatar_width'], $row['user_avatar_height']) : '',
}
'age' => '',
}


/**
'rank_title' => '',
* Delete Topics
'rank_image' => '',
*/
'rank_image_src' => '',
function mcp_delete_topic($topic_ids)
{
global $auth, $user, $db, $phpEx, $phpbb_root_path;


if (!check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_delete')))
'username' => $row['username'],
{
'user_colour' => $row['user_colour'],
return;
}


$redirect = request_var('redirect', build_url(array('action', 'quickmod')));
'online' => false,
$forum_id = request_var('f', 0);
'profile' => append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=viewprofile&amp;u=$poster_id"),
'www' => $row['user_website'],
'aim' => ($row['user_aim'] && $auth->acl_get('u_sendim')) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=contact&amp;action=aim&amp;u=$poster_id") : '',
'msn' => ($row['user_msnm'] && $auth->acl_get('u_sendim')) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=contact&amp;action=msnm&amp;u=$poster_id") : '',
'yim' => ($row['user_yim']) ? 'http://edit.yahoo.com/config/send_webmesg?.target=' . urlencode($row['user_yim']) . '&amp;.src=pg' : '',
'jabber' => ($row['user_jabber'] && $auth->acl_get('u_sendim')) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=contact&amp;action=jabber&amp;u=$poster_id") : '',
'search' => ($auth->acl_get('u_search')) ? append_sid("{$phpbb_root_path}search.$phpEx", "author_id=$poster_id&amp;sr=posts") : '',


$s_hidden_fields = build_hidden_fields(array(
'author_full' => get_username_string('full', $poster_id, $row['username'], $row['user_colour']),
'topic_id_list' => $topic_ids,
'author_colour' => get_username_string('colour', $poster_id, $row['username'], $row['user_colour']),
'f' => $forum_id,
'author_username' => get_username_string('username', $poster_id, $row['username'], $row['user_colour']),
'action' => 'delete_topic',
'author_profile' => get_username_string('profile', $poster_id, $row['username'], $row['user_colour']),
'redirect' => $redirect)
);
);
$success_msg = '';


if (confirm_box(true))
get_user_rank($row['user_rank'], $row['user_posts'], $user_cache[$poster_id]['rank_title'], $user_cache[$poster_id]['rank_image'], $user_cache[$poster_id]['rank_image_src']);
{
$success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_DELETED_SUCCESS' : 'TOPICS_DELETED_SUCCESS';


$data = get_topic_data($topic_ids);
if (!empty($row['user_allow_viewemail']) || $auth->acl_get('a_email'))
{
$user_cache[$poster_id]['email'] = ($config['board_email_form'] && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=email&amp;u=$poster_id") : (($config['board_hide_emails'] && !$auth->acl_get('a_email')) ? '' : 'mailto:' . $row['user_email']);
}
else
{
$user_cache[$poster_id]['email'] = '';
}


foreach ($data as $topic_id => $row)
if (!empty($row['user_icq']))
{
if ($row['topic_moved_id'])
{
{
add_log('mod', $row['forum_id'], $topic_id, 'LOG_DELETE_SHADOW_TOPIC', $row['topic_title']);
$user_cache[$poster_id]['icq'] = 'http://www.icq.com/people/webmsg.php?to=' . $row['user_icq'];
$user_cache[$poster_id]['icq_status_img'] = '<img src="http://web.icq.com/whitepages/online?icq=' . $row['user_icq'] . '&amp;img=5" width="18" height="18" alt="" />';
}
}
else
else
{
{
add_log('mod', $row['forum_id'], $topic_id, 'LOG_DELETE_TOPIC', $row['topic_title'], $row['topic_first_poster_name']);
$user_cache[$poster_id]['icq_status_img'] = '';
$user_cache[$poster_id]['icq'] = '';
}
 
if ($config['allow_birthdays'] && !empty($row['user_birthday']))
{
list($bday_day, $bday_month, $bday_year) = array_map('intval', explode('-', $row['user_birthday']));
 
if ($bday_year)
{
$diff = $now['mon'] - $bday_month;
if ($diff == 0)
{
$diff = ($now['mday'] - $bday_day < 0) ? 1 : 0;
}
else
{
$diff = ($diff < 0) ? 1 : 0;
}
 
$user_cache[$poster_id]['age'] = (int) ($now['year'] - $bday_year - $diff);
}
}
}
}
}
}
}
$db->sql_freeresult($result);


$return = delete_topics('topic_id', $topic_ids);
// Load custom profile fields
}
if ($config['load_cpf_viewtopic'])
else
{
if (!class_exists('custom_profile'))
{
{
confirm_box(false, (sizeof($topic_ids) == 1) ? 'DELETE_TOPIC' : 'DELETE_TOPICS', $s_hidden_fields);
include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);
}
}
$cp = new custom_profile();


if (!isset($_REQUEST['quickmod']))
// Grab all profile fields from users in id cache for later use - similar to the poster cache
{
$profile_fields_tmp = $cp->generate_profile_fields_template('grab', $id_cache);
$redirect = request_var('redirect', "index.$phpEx");
$redirect = reapply_sid($redirect);
$redirect_message = 'PAGE';
}
else
{
$redirect = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id);
$redirect_message = 'FORUM';
}


if (!$success_msg)
// filter out fields not to be displayed on viewtopic. Yes, it's a hack, but this shouldn't break any MODs.
$profile_fields_cache = array();
foreach ($profile_fields_tmp as $profile_user_id => $profile_fields)
{
{
redirect($redirect);
$profile_fields_cache[$profile_user_id] = array();
}
foreach ($profile_fields as $used_ident => $profile_field)
else
{
{
if ($profile_field['data']['field_show_on_vt'])
meta_refresh(3, $redirect);
{
trigger_error($user->lang[$success_msg] . '<br /><br />' . sprintf($user->lang['RETURN_' . $redirect_message], '<a href="' . $redirect . '">', '</a>'));
$profile_fields_cache[$profile_user_id][$used_ident] = $profile_field;
}
}
}
}
unset($profile_fields_tmp);
}
}


/**
// Generate online information for user
* Delete Posts
if ($config['load_onlinetrack'] && sizeof($id_cache))
*/
function mcp_delete_post($post_ids)
{
{
global $auth, $user, $db, $phpEx, $phpbb_root_path;
$sql = 'SELECT session_user_id, MAX(session_time) as online_time, MIN(session_viewonline) AS viewonline
FROM ' . SESSIONS_TABLE . '
WHERE ' . $db->sql_in_set('session_user_id', $id_cache) . '
GROUP BY session_user_id';
$result = $db->sql_query($sql);


if (!check_ids($post_ids, POSTS_TABLE, 'post_id', array('m_delete')))
$update_time = $config['load_online_time'] * 60;
while ($row = $db->sql_fetchrow($result))
{
{
return;
$user_cache[$row['session_user_id']]['online'] = (time() - $update_time < $row['online_time'] && (($row['viewonline']) || $auth->acl_get('u_viewonline'))) ? true : false;
}
}
$db->sql_freeresult($result);
}
unset($id_cache);


$redirect = request_var('redirect', build_url(array('action', 'quickmod')));
// Pull attachment data
$forum_id = request_var('f', 0);
if (sizeof($attach_list))
 
{
$s_hidden_fields = build_hidden_fields(array(
if ($auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id))
'post_id_list' => $post_ids,
'f' => $forum_id,
'action' => 'delete_post',
'redirect' => $redirect)
);
$success_msg = '';
 
if (confirm_box(true))
{
{
if (!function_exists('delete_posts'))
$sql = 'SELECT *
{
FROM ' . ATTACHMENTS_TABLE . '
include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
WHERE ' . $db->sql_in_set('post_msg_id', $attach_list) . '
}
AND in_message = 0
 
ORDER BY filetime DESC, post_msg_id ASC';
// Count the number of topics that are affected
// I did not use COUNT(DISTINCT ...) because I remember having problems
// with it on older versions of MySQL -- Ashe
 
$sql = 'SELECT DISTINCT topic_id
FROM ' . POSTS_TABLE . '
WHERE ' . $db->sql_in_set('post_id', $post_ids);
$result = $db->sql_query($sql);
$result = $db->sql_query($sql);


$topic_id_list = array();
while ($row = $db->sql_fetchrow($result))
while ($row = $db->sql_fetchrow($result))
{
{
$topic_id_list[] = $row['topic_id'];
$attachments[$row['post_msg_id']][] = $row;
}
}
$affected_topics = sizeof($topic_id_list);
$db->sql_freeresult($result);
$db->sql_freeresult($result);


$post_data = get_post_data($post_ids);
// No attachments exist, but post table thinks they do so go ahead and reset post_attach flags
 
if (!sizeof($attachments))
foreach ($post_data as $id => $row)
{
{
$post_username = ($row['poster_id'] == ANONYMOUS && !empty($row['post_username'])) ? $row['post_username'] : $row['username'];
$sql = 'UPDATE ' . POSTS_TABLE . '
add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_DELETE_POST', $row['post_subject'], $post_username);
SET post_attachment = 0
}
WHERE ' . $db->sql_in_set('post_id', $attach_list);
$db->sql_query($sql);


// Now delete the posts, topics and forums are automatically resync'ed
// We need to update the topic indicator too if the complete topic is now without an attachment
delete_posts('post_id', $post_ids);
if (sizeof($rowset) != $total_posts)
{
// Not all posts are displayed so we query the db to find if there's any attachment for this topic
$sql = 'SELECT a.post_msg_id as post_id
FROM ' . ATTACHMENTS_TABLE . ' a, ' . POSTS_TABLE . " p
WHERE p.topic_id = $topic_id
AND p.post_approved = 1
AND p.topic_id = a.topic_id";
$result = $db->sql_query_limit($sql, 1);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);


$sql = 'SELECT COUNT(topic_id) AS topics_left
if (!$row)
FROM ' . TOPICS_TABLE . '
{
WHERE ' . $db->sql_in_set('topic_id', $topic_id_list);
$sql = 'UPDATE ' . TOPICS_TABLE . "
$result = $db->sql_query_limit($sql, 1);
SET topic_attachment = 0
 
WHERE topic_id = $topic_id";
$deleted_topics = ($row = $db->sql_fetchrow($result)) ? ($affected_topics - $row['topics_left']) : $affected_topics;
$db->sql_query($sql);
$db->sql_freeresult($result);
}
 
$topic_id = request_var('t', 0);
 
// Return links
$return_link = array();
if ($affected_topics == 1 && !$deleted_topics && $topic_id)
{
$return_link[] = sprintf($user->lang['RETURN_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id") . '">', '</a>');
}
$return_link[] = sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id) . '">', '</a>');
 
if (sizeof($post_ids) == 1)
{
if ($deleted_topics)
{
// We deleted the only post of a topic, which in turn has
// been removed from the database
$success_msg = $user->lang['TOPIC_DELETED_SUCCESS'];
}
}
else
else
{
{
$success_msg = $user->lang['POST_DELETED_SUCCESS'];
$sql = 'UPDATE ' . TOPICS_TABLE . "
SET topic_attachment = 0
WHERE topic_id = $topic_id";
$db->sql_query($sql);
}
}
}
}
else
else if ($has_attachments && !$topic_data['topic_attachment'])
{
{
if ($deleted_topics)
// Topic has approved attachments but its flag is wrong
{
$sql = 'UPDATE ' . TOPICS_TABLE . "
// Some of topics disappeared
SET topic_attachment = 1
$success_msg = $user->lang['POSTS_DELETED_SUCCESS'] . '<br /><br />' . $user->lang['EMPTY_TOPICS_REMOVED_WARNING'];
WHERE topic_id = $topic_id";
}
$db->sql_query($sql);
else
 
{
$topic_data['topic_attachment'] = 1;
$success_msg = $user->lang['POSTS_DELETED_SUCCESS'];
}
}
}
}
}
else
else
{
{
confirm_box(false, (sizeof($post_ids) == 1) ? 'DELETE_POST' : 'DELETE_POSTS', $s_hidden_fields);
$display_notice = true;
}
}
}
// Instantiate BBCode if need be
if ($bbcode_bitfield !== '')
{
$bbcode = new bbcode(base64_encode($bbcode_bitfield));
}


$redirect = request_var('redirect', "index.$phpEx");
$i_total = sizeof($rowset) - 1;
$redirect = reapply_sid($redirect);
$prev_post_id = '';


if (!$success_msg)
$template->assign_vars(array(
'S_NUM_POSTS' => sizeof($post_list))
);
 
// Output the posts
$first_unread = $post_unread = false;
for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
{
// A non-existing rowset only happens if there was no user present for the entered poster_id
// This could be a broken posts table.
if (!isset($rowset[$post_list[$i]]))
{
{
redirect($redirect);
continue;
}
}
else
 
$row =& $rowset[$post_list[$i]];
$poster_id = $row['user_id'];
 
// End signature parsing, only if needed
if ($user_cache[$poster_id]['sig'] && $row['enable_sig'] && empty($user_cache[$poster_id]['sig_parsed']))
{
{
if ($affected_topics != 1 || $deleted_topics || !$topic_id)
$user_cache[$poster_id]['sig'] = censor_text($user_cache[$poster_id]['sig']);
 
if ($user_cache[$poster_id]['sig_bbcode_bitfield'])
{
{
$redirect = append_sid("{$phpbb_root_path}mcp.$phpEx", "f=$forum_id&i=main&mode=forum_view", false);
$bbcode->bbcode_second_pass($user_cache[$poster_id]['sig'], $user_cache[$poster_id]['sig_bbcode_uid'], $user_cache[$poster_id]['sig_bbcode_bitfield']);
}
}


meta_refresh(3, $redirect);
$user_cache[$poster_id]['sig'] = bbcode_nl2br($user_cache[$poster_id]['sig']);
trigger_error($success_msg . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $redirect . '">', '</a>') . '<br /><br />' . implode('<br /><br />', $return_link));
$user_cache[$poster_id]['sig'] = smiley_text($user_cache[$poster_id]['sig']);
$user_cache[$poster_id]['sig_parsed'] = true;
}
}
}


/**
// Parse the message and subject
* Fork Topic
$message = censor_text($row['post_text']);
*/
function mcp_fork_topic($topic_ids)
{
global $auth, $user, $db, $template, $config;
global $phpEx, $phpbb_root_path;


if (!check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_')))
// Second parse bbcode here
if ($row['bbcode_bitfield'])
{
{
return;
$bbcode->bbcode_second_pass($message, $row['bbcode_uid'], $row['bbcode_bitfield']);
}
}


$to_forum_id = request_var('to_forum_id', 0);
$message = bbcode_nl2br($message);
$forum_id = request_var('f', 0);
$message = smiley_text($message);
$redirect = request_var('redirect', build_url(array('action', 'quickmod')));
$additional_msg = $success_msg = '';


$s_hidden_fields = build_hidden_fields(array(
if (!empty($attachments[$row['post_id']]))
'topic_id_list' => $topic_ids,
{
'f' => $forum_id,
parse_attachments($forum_id, $message, $attachments[$row['post_id']], $update_count);
'action' => 'fork',
}
'redirect' => $redirect)
 
);
// Replace naughty words such as farty pants
$row['post_subject'] = censor_text($row['post_subject']);


if ($to_forum_id)
// Highlight active words (primarily for search)
if ($highlight_match)
{
{
$forum_data = get_forum_data($to_forum_id, 'f_post');
$message = preg_replace('#(?!<.*)(?<!\w)(' . $highlight_match . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#is', '<span class="posthilit">\1</span>', $message);
$row['post_subject'] = preg_replace('#(?!<.*)(?<!\w)(' . $highlight_match . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#is', '<span class="posthilit">\1</span>', $row['post_subject']);
}


if (!sizeof($topic_ids))
// Editing information
if (($row['post_edit_count'] && $config['display_last_edited']) || $row['post_edit_reason'])
{
// Get usernames for all following posts if not already stored
if (!sizeof($post_edit_list) && ($row['post_edit_reason'] || ($row['post_edit_user'] && !isset($user_cache[$row['post_edit_user']]))))
{
{
$additional_msg = $user->lang['NO_TOPIC_SELECTED'];
// Remove all post_ids already parsed (we do not have to check them)
$post_storage_list = (!$store_reverse) ? array_slice($post_list, $i) : array_slice(array_reverse($post_list), $i);
 
$sql = 'SELECT DISTINCT u.user_id, u.username, u.user_colour
FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
WHERE ' . $db->sql_in_set('p.post_id', $post_storage_list) . '
AND p.post_edit_count <> 0
AND p.post_edit_user <> 0
AND p.post_edit_user = u.user_id';
$result2 = $db->sql_query($sql);
while ($user_edit_row = $db->sql_fetchrow($result2))
{
$post_edit_list[$user_edit_row['user_id']] = $user_edit_row;
}
$db->sql_freeresult($result2);
 
unset($post_storage_list);
}
}
else if (!sizeof($forum_data))
 
$l_edit_time_total = ($row['post_edit_count'] == 1) ? $user->lang['EDITED_TIME_TOTAL'] : $user->lang['EDITED_TIMES_TOTAL'];
 
if ($row['post_edit_reason'])
{
{
$additional_msg = $user->lang['FORUM_NOT_EXIST'];
// User having edited the post also being the post author?
if (!$row['post_edit_user'] || $row['post_edit_user'] == $poster_id)
{
$display_username = get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']);
}
else
{
$display_username = get_username_string('full', $row['post_edit_user'], $post_edit_list[$row['post_edit_user']]['username'], $post_edit_list[$row['post_edit_user']]['user_colour']);
}
 
$l_edited_by = sprintf($l_edit_time_total, $display_username, $user->format_date($row['post_edit_time'], false, true), $row['post_edit_count']);
}
}
else
else
{
{
$forum_data = $forum_data[$to_forum_id];
if ($row['post_edit_user'] && !isset($user_cache[$row['post_edit_user']]))
{
$user_cache[$row['post_edit_user']] = $post_edit_list[$row['post_edit_user']];
}


if ($forum_data['forum_type'] != FORUM_POST)
// User having edited the post also being the post author?
if (!$row['post_edit_user'] || $row['post_edit_user'] == $poster_id)
{
{
$additional_msg = $user->lang['FORUM_NOT_POSTABLE'];
$display_username = get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']);
}
}
else if (!$auth->acl_get('f_post', $to_forum_id))
else
{
{
$additional_msg = $user->lang['USER_CANNOT_POST'];
$display_username = get_username_string('full', $row['post_edit_user'], $user_cache[$row['post_edit_user']]['username'], $user_cache[$row['post_edit_user']]['user_colour']);
}
}
$l_edited_by = sprintf($l_edit_time_total, $display_username, $user->format_date($row['post_edit_time'], false, true), $row['post_edit_count']);
}
}
}
}
else if (isset($_POST['confirm']))
else
{
{
$additional_msg = $user->lang['FORUM_NOT_EXIST'];
$l_edited_by = '';
}
}


if ($additional_msg)
// Bump information
if ($topic_data['topic_bumped'] && $row['post_id'] == $topic_data['topic_last_post_id'] && isset($user_cache[$topic_data['topic_bumper']]) )
{
{
unset($_POST['confirm']);
// It is safe to grab the username from the user cache array, we are at the last
unset($_REQUEST['confirm_key']);
// post and only the topic poster and last poster are allowed to bump.
// Admins and mods are bound to the above rules too...
$l_bumped_by = sprintf($user->lang['BUMPED_BY'], $user_cache[$topic_data['topic_bumper']]['username'], $user->format_date($topic_data['topic_last_post_time'], false, true));
}
else
{
$l_bumped_by = '';
}
}


if (confirm_box(true))
$cp_row = array();
 
//
if ($config['load_cpf_viewtopic'])
{
{
$topic_data = get_topic_data($topic_ids, 'f_post');
$cp_row = (isset($profile_fields_cache[$poster_id])) ? $cp->generate_profile_fields_template('show', false, $profile_fields_cache[$poster_id]) : array();
}


$total_posts = 0;
$post_unread = (isset($topic_tracking_info[$topic_id]) && $row['post_time'] > $topic_tracking_info[$topic_id]) ? true : false;
$new_topic_id_list = array();


foreach ($topic_data as $topic_id => $topic_row)
$s_first_unread = false;
{
if (!$first_unread && $post_unread)
$sql_ary = array(
{
'forum_id' => (int) $to_forum_id,
$s_first_unread = $first_unread = true;
'icon_id' => (int) $topic_row['icon_id'],
}
'topic_attachment' => (int) $topic_row['topic_attachment'],
 
'topic_approved' => 1,
$edit_allowed = ($user->data['is_registered'] && ($auth->acl_get('m_edit', $forum_id) || (
'topic_reported' => 0,
$user->data['user_id'] == $poster_id &&
'topic_title' => (string) $topic_row['topic_title'],
$auth->acl_get('f_edit', $forum_id) &&
'topic_poster' => (int) $topic_row['topic_poster'],
!$row['post_edit_locked'] &&
'topic_time' => (int) $topic_row['topic_time'],
($row['post_time'] > time() - ($config['edit_time'] * 60) || !$config['edit_time'])
'topic_replies' => (int) $topic_row['topic_replies_real'],
)));
'topic_replies_real' => (int) $topic_row['topic_replies_real'],
'topic_status' => (int) $topic_row['topic_status'],
'topic_type' => (int) $topic_row['topic_type'],
'topic_first_poster_name' => (string) $topic_row['topic_first_poster_name'],
'topic_last_poster_id' => (int) $topic_row['topic_last_poster_id'],
'topic_last_poster_name' => (string) $topic_row['topic_last_poster_name'],
'topic_last_post_time' => (int) $topic_row['topic_last_post_time'],
'topic_last_view_time' => (int) $topic_row['topic_last_view_time'],
'topic_bumped' => (int) $topic_row['topic_bumped'],
'topic_bumper' => (int) $topic_row['topic_bumper'],
'poll_title' => (string) $topic_row['poll_title'],
'poll_start' => (int) $topic_row['poll_start'],
'poll_length' => (int) $topic_row['poll_length'],
'poll_max_options' => (int) $topic_row['poll_max_options'],
'poll_vote_change' => (int) $topic_row['poll_vote_change'],
);


$db->sql_query('INSERT INTO ' . TOPICS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
$delete_allowed = ($user->data['is_registered'] && ($auth->acl_get('m_delete', $forum_id) || (
$new_topic_id = $db->sql_nextid();
$user->data['user_id'] == $poster_id &&
$new_topic_id_list[$topic_id] = $new_topic_id;
$auth->acl_get('f_delete', $forum_id) &&
$topic_data['topic_last_post_id'] == $row['post_id'] &&
($row['post_time'] > time() - ($config['delete_time'] * 60) || !$config['delete_time']) &&
// we do not want to allow removal of the last post if a moderator locked it!
!$row['post_edit_locked']
)));


if ($topic_row['poll_start'])
//
{
$postrow = array(
$poll_rows = array();
'POST_AUTHOR_FULL' => ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_full'] : get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),
'POST_AUTHOR_COLOUR' => ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_colour'] : get_username_string('colour', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),
'POST_AUTHOR' => ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_username'] : get_username_string('username', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),
'U_POST_AUTHOR' => ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_profile'] : get_username_string('profile', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),


$sql = 'SELECT *
'RANK_TITLE' => $user_cache[$poster_id]['rank_title'],
FROM ' . POLL_OPTIONS_TABLE . "
'RANK_IMG' => $user_cache[$poster_id]['rank_image'],
WHERE topic_id = $topic_id";
'RANK_IMG_SRC' => $user_cache[$poster_id]['rank_image_src'],
$result = $db->sql_query($sql);
'POSTER_JOINED' => $user_cache[$poster_id]['joined'],
'POSTER_POSTS' => $user_cache[$poster_id]['posts'],
'POSTER_FROM' => $user_cache[$poster_id]['from'],
'POSTER_AVATAR' => $user_cache[$poster_id]['avatar'],
'POSTER_WARNINGS' => $user_cache[$poster_id]['warnings'],
'POSTER_AGE' => $user_cache[$poster_id]['age'],


while ($row = $db->sql_fetchrow($result))
'POST_DATE' => $user->format_date($row['post_time'], false, ($view == 'print') ? true : false),
{
'POST_SUBJECT' => $row['post_subject'],
$sql_ary = array(
'MESSAGE' => $message,
'poll_option_id' => (int) $row['poll_option_id'],
'SIGNATURE' => ($row['enable_sig']) ? $user_cache[$poster_id]['sig'] : '',
'topic_id' => (int) $new_topic_id,
'EDITED_MESSAGE' => $l_edited_by,
'poll_option_text' => (string) $row['poll_option_text'],
'EDIT_REASON' => $row['post_edit_reason'],
'poll_option_total' => 0
'BUMPED_MESSAGE' => $l_bumped_by,
);


$db->sql_query('INSERT INTO ' . POLL_OPTIONS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
'MINI_POST_IMG' => ($post_unread) ? $user->img('icon_post_target_unread', 'NEW_POST') : $user->img('icon_post_target', 'POST'),
}
'POST_ICON_IMG' => ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['img'] : '',
}
'POST_ICON_IMG_WIDTH' => ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['width'] : '',
'POST_ICON_IMG_HEIGHT' => ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['height'] : '',
'ICQ_STATUS_IMG' => $user_cache[$poster_id]['icq_status_img'],
'ONLINE_IMG' => ($poster_id == ANONYMOUS || !$config['load_onlinetrack']) ? '' : (($user_cache[$poster_id]['online']) ? $user->img('icon_user_online', 'ONLINE') : $user->img('icon_user_offline', 'OFFLINE')),
'S_ONLINE' => ($poster_id == ANONYMOUS || !$config['load_onlinetrack']) ? false : (($user_cache[$poster_id]['online']) ? true : false),


$sql = 'SELECT *
'U_EDIT' => ($edit_allowed) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=edit&amp;f=$forum_id&amp;p={$row['post_id']}") : '',
FROM ' . POSTS_TABLE . "
'U_QUOTE' => ($auth->acl_get('f_reply', $forum_id)) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=quote&amp;f=$forum_id&amp;p={$row['post_id']}") : '',
WHERE topic_id = $topic_id
'U_INFO' => ($auth->acl_get('m_info', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&amp;mode=post_details&amp;f=$forum_id&amp;p=" . $row['post_id'], true, $user->session_id) : '',
ORDER BY post_time ASC";
'U_DELETE' => ($delete_allowed) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=delete&amp;f=$forum_id&amp;p={$row['post_id']}") : '',
$result = $db->sql_query($sql);


$post_rows = array();
'U_PROFILE' => $user_cache[$poster_id]['profile'],
while ($row = $db->sql_fetchrow($result))
'U_SEARCH' => $user_cache[$poster_id]['search'],
{
'U_PM' => ($poster_id != ANONYMOUS && $config['allow_privmsg'] && $auth->acl_get('u_sendpm') && ($user_cache[$poster_id]['allow_pm'] || $auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_'))) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=compose&amp;action=quotepost&amp;p=' . $row['post_id']) : '',
$post_rows[] = $row;
'U_EMAIL' => $user_cache[$poster_id]['email'],
}
'U_WWW' => $user_cache[$poster_id]['www'],
$db->sql_freeresult($result);
'U_ICQ' => $user_cache[$poster_id]['icq'],
'U_AIM' => $user_cache[$poster_id]['aim'],
'U_MSN' => $user_cache[$poster_id]['msn'],
'U_YIM' => $user_cache[$poster_id]['yim'],
'U_JABBER' => $user_cache[$poster_id]['jabber'],


if (!sizeof($post_rows))
'U_REPORT' => ($auth->acl_get('f_report', $forum_id)) ? append_sid("{$phpbb_root_path}report.$phpEx", 'f=' . $forum_id . '&amp;p=' . $row['post_id']) : '',
{
'U_MCP_REPORT' => ($auth->acl_get('m_report', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=report_details&amp;f=' . $forum_id . '&amp;p=' . $row['post_id'], true, $user->session_id) : '',
continue;
'U_MCP_APPROVE' => ($auth->acl_get('m_approve', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=approve_details&amp;f=' . $forum_id . '&amp;p=' . $row['post_id'], true, $user->session_id) : '',
}
'U_MINI_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'p=' . $row['post_id']) . (($topic_data['topic_type'] == POST_GLOBAL) ? '&amp;f=' . $forum_id : '') . '#p' . $row['post_id'],
'U_NEXT_POST_ID' => ($i < $i_total && isset($rowset[$post_list[$i + 1]])) ? $rowset[$post_list[$i + 1]]['post_id'] : '',
'U_PREV_POST_ID' => $prev_post_id,
'U_NOTES' => ($auth->acl_getf_global('m_')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=notes&amp;mode=user_notes&amp;u=' . $poster_id, true, $user->session_id) : '',
'U_WARN' => ($auth->acl_get('m_warn') && $poster_id != $user->data['user_id'] && $poster_id != ANONYMOUS) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=warn&amp;mode=warn_post&amp;f=' . $forum_id . '&amp;p=' . $row['post_id'], true, $user->session_id) : '',


$total_posts += sizeof($post_rows);
'POST_ID' => $row['post_id'],
foreach ($post_rows as $row)
'POSTER_ID' => $poster_id,
{
$sql_ary = array(
'topic_id' => (int) $new_topic_id,
'forum_id' => (int) $to_forum_id,
'poster_id' => (int) $row['poster_id'],
'icon_id' => (int) $row['icon_id'],
'poster_ip' => (string) $row['poster_ip'],
'post_time' => (int) $row['post_time'],
'post_approved' => 1,
'post_reported' => 0,
'enable_bbcode' => (int) $row['enable_bbcode'],
'enable_smilies' => (int) $row['enable_smilies'],
'enable_magic_url' => (int) $row['enable_magic_url'],
'enable_sig' => (int) $row['enable_sig'],
'post_username' => (string) $row['post_username'],
'post_subject' => (string) $row['post_subject'],
'post_text' => (string) $row['post_text'],
'post_edit_reason' => (string) $row['post_edit_reason'],
'post_edit_user' => (int) $row['post_edit_user'],
'post_checksum' => (string) $row['post_checksum'],
'post_attachment' => (int) $row['post_attachment'],
'bbcode_bitfield' => $row['bbcode_bitfield'],
'bbcode_uid' => (string) $row['bbcode_uid'],
'post_edit_time' => (int) $row['post_edit_time'],
'post_edit_count' => (int) $row['post_edit_count'],
'post_edit_locked' => (int) $row['post_edit_locked'],
'post_postcount' => 0,
);


$db->sql_query('INSERT INTO ' . POSTS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
'S_HAS_ATTACHMENTS' => (!empty($attachments[$row['post_id']])) ? true : false,
$new_post_id = $db->sql_nextid();
'S_POST_UNAPPROVED' => ($row['post_approved']) ? false : true,
'S_POST_REPORTED' => ($row['post_reported'] && $auth->acl_get('m_report', $forum_id)) ? true : false,
'S_DISPLAY_NOTICE' => $display_notice && $row['post_attachment'],
'S_FRIEND' => ($row['friend']) ? true : false,
'S_UNREAD_POST' => $post_unread,
'S_FIRST_UNREAD' => $s_first_unread,
'S_CUSTOM_FIELDS' => (isset($cp_row['row']) && sizeof($cp_row['row'])) ? true : false,
'S_TOPIC_POSTER' => ($topic_data['topic_poster'] == $poster_id) ? true : false,


// Copy whether the topic is dotted
'S_IGNORE_POST' => ($row['hide_post']) ? true : false,
markread('post', $to_forum_id, $new_topic_id, 0, $row['poster_id']);
'L_IGNORE_POST' => ($row['hide_post']) ? sprintf($user->lang['POST_BY_FOE'], get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), '<a href="' . $viewtopic_url . "&amp;p={$row['post_id']}&amp;view=show#p{$row['post_id']}" . '">', '</a>') : '',
);


// Copy Attachments
if (isset($cp_row['row']) && sizeof($cp_row['row']))
if ($row['post_attachment'])
{
{
$postrow = array_merge($postrow, $cp_row['row']);
$sql = 'SELECT * FROM ' . ATTACHMENTS_TABLE . "
}
WHERE post_msg_id = {$row['post_id']}
AND topic_id = $topic_id
AND in_message = 0";
$result = $db->sql_query($sql);


$sql_ary = array();
// Dump vars into template
while ($attach_row = $db->sql_fetchrow($result))
$template->assign_block_vars('postrow', $postrow);
{
$sql_ary[] = array(
'post_msg_id' => (int) $new_post_id,
'topic_id' => (int) $new_topic_id,
'in_message' => 0,
'is_orphan' => (int) $attach_row['is_orphan'],
'poster_id' => (int) $attach_row['poster_id'],
'physical_filename' => (string) utf8_basename($attach_row['physical_filename']),
'real_filename' => (string) utf8_basename($attach_row['real_filename']),
'download_count' => (int) $attach_row['download_count'],
'attach_comment' => (string) $attach_row['attach_comment'],
'extension' => (string) $attach_row['extension'],
'mimetype' => (string) $attach_row['mimetype'],
'filesize' => (int) $attach_row['filesize'],
'filetime' => (int) $attach_row['filetime'],
'thumbnail' => (int) $attach_row['thumbnail']
);
}
$db->sql_freeresult($result);


if (sizeof($sql_ary))
if (!empty($cp_row['blockrow']))
{
{
$db->sql_multi_insert(ATTACHMENTS_TABLE, $sql_ary);
foreach ($cp_row['blockrow'] as $field_data)
}
{
}
$template->assign_block_vars('postrow.custom_fields', $field_data);
}
}
}


$sql = 'SELECT user_id, notify_status
// Display not already displayed Attachments for this post, we already parsed them. ;)
FROM ' . TOPICS_WATCH_TABLE . '
if (!empty($attachments[$row['post_id']]))
WHERE topic_id = ' . $topic_id;
{
$result = $db->sql_query($sql);
foreach ($attachments[$row['post_id']] as $attachment)
{
$template->assign_block_vars('postrow.attachment', array(
'DISPLAY_ATTACHMENT' => $attachment)
);
}
}


$sql_ary = array();
$prev_post_id = $row['post_id'];
while ($row = $db->sql_fetchrow($result))
{
$sql_ary[] = array(
'topic_id' => (int) $new_topic_id,
'user_id' => (int) $row['user_id'],
'notify_status' => (int) $row['notify_status'],
);
}
$db->sql_freeresult($result);


if (sizeof($sql_ary))
unset($rowset[$post_list[$i]]);
{
unset($attachments[$row['post_id']]);
$db->sql_multi_insert(TOPICS_WATCH_TABLE, $sql_ary);
}
}
unset($rowset, $user_cache);
}


// Sync new topics, parent forums and board stats
// Update topic view and if necessary attachment view counters ... but only for humans and if this is the first 'page view'
sync('topic', 'topic_id', $new_topic_id_list);
if (isset($user->data['session_page']) && !$user->data['is_bot'] && (strpos($user->data['session_page'], '&t=' . $topic_id) === false || isset($user->data['session_created'])))
{
$sql = 'UPDATE ' . TOPICS_TABLE . '
SET topic_views = topic_views + 1, topic_last_view_time = ' . time() . "
WHERE topic_id = $topic_id";
$db->sql_query($sql);


$sync_sql = array();
// Update the attachment download counts
if (sizeof($update_count))
{
$sql = 'UPDATE ' . ATTACHMENTS_TABLE . '
SET download_count = download_count + 1
WHERE ' . $db->sql_in_set('attach_id', array_unique($update_count));
$db->sql_query($sql);
}
}


$sync_sql[$to_forum_id][] = 'forum_posts = forum_posts + ' . $total_posts;
// Get last post time for all global announcements
$sync_sql[$to_forum_id][] = 'forum_topics = forum_topics + ' . sizeof($new_topic_id_list);
// to keep proper forums tracking
$sync_sql[$to_forum_id][] = 'forum_topics_real = forum_topics_real + ' . sizeof($new_topic_id_list);
if ($topic_data['topic_type'] == POST_GLOBAL)
{
$sql = 'SELECT topic_last_post_time as forum_last_post_time
FROM ' . TOPICS_TABLE . '
WHERE forum_id = 0
ORDER BY topic_last_post_time DESC';
$result = $db->sql_query_limit($sql, 1);
$topic_data['forum_last_post_time'] = (int) $db->sql_fetchfield('forum_last_post_time');
$db->sql_freeresult($result);


foreach ($sync_sql as $forum_id_key => $array)
$sql = 'SELECT mark_time as forum_mark_time
{
FROM ' . FORUMS_TRACK_TABLE . '
$sql = 'UPDATE ' . FORUMS_TABLE . '
WHERE forum_id = 0
SET ' . implode(', ', $array) . '
AND user_id = ' . $user->data['user_id'];
WHERE forum_id = ' . $forum_id_key;
$result = $db->sql_query($sql);
$db->sql_query($sql);
$topic_data['forum_mark_time'] = (int) $db->sql_fetchfield('forum_mark_time');
}
$db->sql_freeresult($result);
}


sync('forum', 'forum_id', $to_forum_id);
// Only mark topic if it's currently unread. Also make sure we do not set topic tracking back if earlier pages are viewed.
set_config_count('num_topics', sizeof($new_topic_id_list), true);
if (isset($topic_tracking_info[$topic_id]) && $topic_data['topic_last_post_time'] > $topic_tracking_info[$topic_id] && $max_post_time > $topic_tracking_info[$topic_id])
set_config_count('num_posts', $total_posts, true);
{
markread('topic', (($topic_data['topic_type'] == POST_GLOBAL) ? 0 : $forum_id), $topic_id, $max_post_time);


foreach ($new_topic_id_list as $topic_id => $new_topic_id)
// Update forum info
{
$all_marked_read = update_forum_tracking_info((($topic_data['topic_type'] == POST_GLOBAL) ? 0 : $forum_id), $topic_data['forum_last_post_time'], (isset($topic_data['forum_mark_time'])) ? $topic_data['forum_mark_time'] : false, false);
add_log('mod', $to_forum_id, $new_topic_id, 'LOG_FORK', $topic_row['forum_name']);
}
}
else
{
$all_marked_read = true;
}


$success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_FORKED_SUCCESS' : 'TOPICS_FORKED_SUCCESS';
// If there are absolutely no more unread posts in this forum and unread posts shown, we can savely show the #unread link
if ($all_marked_read)
{
if ($post_unread)
{
$template->assign_vars(array(
'U_VIEW_UNREAD_POST' => '#unread',
));
}
}
else
else if (isset($topic_tracking_info[$topic_id]) && $topic_data['topic_last_post_time'] > $topic_tracking_info[$topic_id])
{
{
$template->assign_vars(array(
$template->assign_vars(array(
'S_FORUM_SELECT' => make_forum_select($to_forum_id, false, false, true, true, true),
'U_VIEW_UNREAD_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;view=unread") . '#unread',
'S_CAN_LEAVE_SHADOW' => false,
));
'ADDITIONAL_MSG' => $additional_msg)
}
);
}
else if (!$all_marked_read)
{
$last_page = ((floor($start / $config['posts_per_page']) + 1) == max(ceil($total_posts / $config['posts_per_page']), 1)) ? true : false;


confirm_box(false, 'FORK_TOPIC' . ((sizeof($topic_ids) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_move.html');
// What can happen is that we are at the last displayed page. If so, we also display the #unread link based in $post_unread
if ($last_page && $post_unread)
{
$template->assign_vars(array(
'U_VIEW_UNREAD_POST' => '#unread',
));
}
}
else if (!$last_page)
{
$template->assign_vars(array(
'U_VIEW_UNREAD_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;view=unread") . '#unread',
));
}
}
// let's set up quick_reply
$s_quick_reply = false;
if ($user->data['is_registered'] && $config['allow_quick_reply'] && ($topic_data['forum_flags'] & FORUM_FLAG_QUICK_REPLY) && $auth->acl_get('f_reply', $forum_id))
{
// Quick reply enabled forum
$s_quick_reply = (($topic_data['forum_status'] == ITEM_UNLOCKED && $topic_data['topic_status'] == ITEM_UNLOCKED) || $auth->acl_get('m_edit', $forum_id)) ? true : false;
}


$redirect = request_var('redirect', "index.$phpEx");
if ($s_can_vote || $s_quick_reply)
$redirect = reapply_sid($redirect);
{
add_form_key('posting');


if (!$success_msg)
if ($s_quick_reply)
{
{
redirect($redirect);
$s_attach_sig = $config['allow_sig'] && $user->optionget('attachsig') && $auth->acl_get('f_sigs', $forum_id) && $auth->acl_get('u_sig');
$s_smilies = $config['allow_smilies'] && $user->optionget('smilies') && $auth->acl_get('f_smilies', $forum_id);
$s_bbcode = $config['allow_bbcode'] && $user->optionget('bbcode') && $auth->acl_get('f_bbcode', $forum_id);
$s_notify = $config['allow_topic_notify'] && ($user->data['user_notify'] || $s_watching_topic['is_watching']);
 
$qr_hidden_fields = array(
'topic_cur_post_id' => (int) $topic_data['topic_last_post_id'],
'lastclick' => (int) time(),
'topic_id' => (int) $topic_data['topic_id'],
'forum_id' => (int) $forum_id,
);
 
// Originally we use checkboxes and check with isset(), so we only provide them if they would be checked
(!$s_bbcode) ? $qr_hidden_fields['disable_bbcode'] = 1 : true;
(!$s_smilies) ? $qr_hidden_fields['disable_smilies'] = 1 : true;
(!$config['allow_post_links']) ? $qr_hidden_fields['disable_magic_url'] = 1 : true;
($s_attach_sig) ? $qr_hidden_fields['attach_sig'] = 1 : true;
($s_notify) ? $qr_hidden_fields['notify'] = 1 : true;
($topic_data['topic_status'] == ITEM_LOCKED) ? $qr_hidden_fields['lock_topic'] = 1 : true;
 
$template->assign_vars(array(
'S_QUICK_REPLY' => true,
'U_QR_ACTION' => append_sid("{$phpbb_root_path}posting.$phpEx", "mode=reply&amp;f=$forum_id&amp;t=$topic_id"),
'QR_HIDDEN_FIELDS' => build_hidden_fields($qr_hidden_fields),
'SUBJECT' => 'Re: ' . censor_text($topic_data['topic_title']),
));
}
}
else
}
{
// now I have the urge to wash my hands :(
$redirect_url = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id);
 
meta_refresh(3, $redirect_url);
$return_link = sprintf($user->lang['RETURN_FORUM'], '<a href="' . $redirect_url . '">', '</a>');


if ($forum_id != $to_forum_id)
// We overwrite $_REQUEST['f'] if there is no forum specified
{
// to be able to display the correct online list.
$return_link .= '<br /><br />' . sprintf($user->lang['RETURN_NEW_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $to_forum_id) . '">', '</a>');
// One downside is that the user currently viewing this topic/post is not taken into account.
}
if (empty($_REQUEST['f']))
{
$_REQUEST['f'] = $forum_id;
}


trigger_error($user->lang[$success_msg] . '<br /><br />' . $return_link);
// We need to do the same with the topic_id. See #53025.
}
if (empty($_REQUEST['t']) && !empty($topic_id))
{
$_REQUEST['t'] = $topic_id;
}
}
// Output the page
page_header($user->lang['VIEW_TOPIC'] . ' - ' . $topic_data['topic_title'], true, $forum_id);
$template->set_filenames(array(
'body' => ($view == 'print') ? 'viewtopic_print.html' : 'viewtopic_body.html')
);
make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"), $forum_id);
page_footer();


?>
?>

Revision as of 01:59, 18 June 2010

Please feel free to use this page to test edits and practice your Mad Wiki skillz. If you'd replace this message or something like it when you are done, it would be greatly appreciated. Thanks, The Mgmt.


<?php /**

/**

  • @ignore
  • /

define('IN_PHPBB', true); $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './'; $phpEx = substr(strrchr(__FILE__, '.'), 1); include($phpbb_root_path . 'common.' . $phpEx); include($phpbb_root_path . 'includes/functions_display.' . $phpEx); include($phpbb_root_path . 'includes/bbcode.' . $phpEx);

// Start session management $user->session_begin(); $auth->acl($user->data);

// Initial var setup $forum_id = request_var('f', 0); $topic_id = request_var('t', 0); $post_id = request_var('p', 0); $voted_id = request_var('vote_id', array( => 0));

$voted_id = (sizeof($voted_id) > 1) ? array_unique($voted_id) : $voted_id;


$start = request_var('start', 0); $view = request_var('view', );

$default_sort_days = (!empty($user->data['user_post_show_days'])) ? $user->data['user_post_show_days'] : 0; $default_sort_key = (!empty($user->data['user_post_sortby_type'])) ? $user->data['user_post_sortby_type'] : 't'; $default_sort_dir = (!empty($user->data['user_post_sortby_dir'])) ? $user->data['user_post_sortby_dir'] : 'a';

$sort_days = request_var('st', $default_sort_days); $sort_key = request_var('sk', $default_sort_key); $sort_dir = request_var('sd', $default_sort_dir);

$update = request_var('update', false);

$s_can_vote = false; /**

  • @todo normalize?
  • /

$hilit_words = request_var('hilit', , true);

// Do we have a topic or post id? if (!$topic_id && !$post_id) { trigger_error('NO_TOPIC'); }

// Find topic id if user requested a newer or older topic if ($view && !$post_id) { if (!$forum_id) { $sql = 'SELECT forum_id FROM ' . TOPICS_TABLE . " WHERE topic_id = $topic_id"; $result = $db->sql_query($sql); $forum_id = (int) $db->sql_fetchfield('forum_id'); $db->sql_freeresult($result);

if (!$forum_id) { trigger_error('NO_TOPIC'); } }

if ($view == 'unread') { // Get topic tracking info $topic_tracking_info = get_complete_topic_tracking($forum_id, $topic_id);

$topic_last_read = (isset($topic_tracking_info[$topic_id])) ? $topic_tracking_info[$topic_id] : 0;

$sql = 'SELECT post_id, topic_id, forum_id FROM ' . POSTS_TABLE . " WHERE topic_id = $topic_id " . (($auth->acl_get('m_approve', $forum_id)) ?  : 'AND post_approved = 1') . " AND post_time > $topic_last_read AND forum_id = $forum_id ORDER BY post_time ASC"; $result = $db->sql_query_limit($sql, 1); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result);

if (!$row) { $sql = 'SELECT topic_last_post_id as post_id, topic_id, forum_id FROM ' . TOPICS_TABLE . ' WHERE topic_id = ' . $topic_id; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); }

if (!$row) { // Setup user environment so we can process lang string $user->setup('viewtopic');

trigger_error('NO_TOPIC'); }

$post_id = $row['post_id']; $topic_id = $row['topic_id']; } else if ($view == 'next' || $view == 'previous') { $sql_condition = ($view == 'next') ? '>' : '<'; $sql_ordering = ($view == 'next') ? 'ASC' : 'DESC';

$sql = 'SELECT forum_id, topic_last_post_time FROM ' . TOPICS_TABLE . ' WHERE topic_id = ' . $topic_id; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result);

if (!$row) { $user->setup('viewtopic'); // OK, the topic doesn't exist. This error message is not helpful, but technically correct. trigger_error(($view == 'next') ? 'NO_NEWER_TOPICS' : 'NO_OLDER_TOPICS'); } else { $sql = 'SELECT topic_id, forum_id FROM ' . TOPICS_TABLE . ' WHERE forum_id = ' . $row['forum_id'] . " AND topic_moved_id = 0 AND topic_last_post_time $sql_condition {$row['topic_last_post_time']} " . (($auth->acl_get('m_approve', $row['forum_id'])) ?  : 'AND topic_approved = 1') . " ORDER BY topic_last_post_time $sql_ordering"; $result = $db->sql_query_limit($sql, 1); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result);

if (!$row) { $user->setup('viewtopic'); trigger_error(($view == 'next') ? 'NO_NEWER_TOPICS' : 'NO_OLDER_TOPICS'); } else { $topic_id = $row['topic_id'];

// Check for global announcement correctness? if (!$row['forum_id'] && !$forum_id) { trigger_error('NO_TOPIC'); } else if ($row['forum_id']) { $forum_id = $row['forum_id']; } } } }

// Check for global announcement correctness? if ((!isset($row) || !$row['forum_id']) && !$forum_id) { trigger_error('NO_TOPIC'); } else if (isset($row) && $row['forum_id']) { $forum_id = $row['forum_id']; } }

// This rather complex gaggle of code handles querying for topics but // also allows for direct linking to a post (and the calculation of which // page the post is on and the correct display of viewtopic) $sql_array = array( 'SELECT' => 't.*, f.*',

'FROM' => array(FORUMS_TABLE => 'f'), );

// Firebird handles two columns of the same name a little differently, this // addresses that by forcing the forum_id to come from the forums table. if ($db->sql_layer === 'firebird') { $sql_array['SELECT'] = 'f.forum_id AS forum_id, ' . $sql_array['SELECT']; }

// The FROM-Order is quite important here, else t.* columns can not be correctly bound. if ($post_id) { $sql_array['SELECT'] .= ', p.post_approved'; $sql_array['FROM'][POSTS_TABLE] = 'p'; }

// Topics table need to be the last in the chain $sql_array['FROM'][TOPICS_TABLE] = 't';

if ($user->data['is_registered']) { $sql_array['SELECT'] .= ', tw.notify_status'; $sql_array['LEFT_JOIN'] = array();

$sql_array['LEFT_JOIN'][] = array( 'FROM' => array(TOPICS_WATCH_TABLE => 'tw'), 'ON' => 'tw.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tw.topic_id' );

if ($config['allow_bookmarks']) { $sql_array['SELECT'] .= ', bm.topic_id as bookmarked'; $sql_array['LEFT_JOIN'][] = array( 'FROM' => array(BOOKMARKS_TABLE => 'bm'), 'ON' => 'bm.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = bm.topic_id' ); }

if ($config['load_db_lastread']) { $sql_array['SELECT'] .= ', tt.mark_time, ft.mark_time as forum_mark_time';

$sql_array['LEFT_JOIN'][] = array( 'FROM' => array(TOPICS_TRACK_TABLE => 'tt'), 'ON' => 'tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id' );

$sql_array['LEFT_JOIN'][] = array( 'FROM' => array(FORUMS_TRACK_TABLE => 'ft'), 'ON' => 'ft.user_id = ' . $user->data['user_id'] . ' AND t.forum_id = ft.forum_id' ); } }

if (!$post_id) { $sql_array['WHERE'] = "t.topic_id = $topic_id"; } else { $sql_array['WHERE'] = "p.post_id = $post_id AND t.topic_id = p.topic_id"; }

$sql_array['WHERE'] .= ' AND (f.forum_id = t.forum_id';

if (!$forum_id) { // If it is a global announcement make sure to set the forum id to a postable forum $sql_array['WHERE'] .= ' OR (t.topic_type = ' . POST_GLOBAL . ' AND f.forum_type = ' . FORUM_POST . ')'; } else { $sql_array['WHERE'] .= ' OR (t.topic_type = ' . POST_GLOBAL . " AND f.forum_id = $forum_id)"; }

$sql_array['WHERE'] .= ')';

// Join to forum table on topic forum_id unless topic forum_id is zero // whereupon we join on the forum_id passed as a parameter ... this // is done so navigation, forum name, etc. remain consistent with where // user clicked to view a global topic $sql = $db->sql_build_query('SELECT', $sql_array); $result = $db->sql_query($sql); $topic_data = $db->sql_fetchrow($result); $db->sql_freeresult($result);

// link to unapproved post or incorrect link if (!$topic_data) { // If post_id was submitted, we try at least to display the topic as a last resort... if ($post_id && $topic_id) { redirect(append_sid("{$phpbb_root_path}viewtopic.$phpEx", "t=$topic_id" . (($forum_id) ? "&f=$forum_id" : ))); }

trigger_error('NO_TOPIC'); }

$forum_id = (int) $topic_data['forum_id']; // This is for determining where we are (page) if ($post_id) { // are we where we are supposed to be? if (!$topic_data['post_approved'] && !$auth->acl_get('m_approve', $topic_data['forum_id'])) { // If post_id was submitted, we try at least to display the topic as a last resort... if ($topic_id) { redirect(append_sid("{$phpbb_root_path}viewtopic.$phpEx", "t=$topic_id" . (($forum_id) ? "&f=$forum_id" : ))); }

trigger_error('NO_TOPIC'); } if ($post_id == $topic_data['topic_first_post_id'] || $post_id == $topic_data['topic_last_post_id']) { $check_sort = ($post_id == $topic_data['topic_first_post_id']) ? 'd' : 'a';

if ($sort_dir == $check_sort) { $topic_data['prev_posts'] = ($auth->acl_get('m_approve', $forum_id)) ? $topic_data['topic_replies_real'] : $topic_data['topic_replies']; } else { $topic_data['prev_posts'] = 0; } } else { $sql = 'SELECT COUNT(p1.post_id) AS prev_posts FROM ' . POSTS_TABLE . ' p1, ' . POSTS_TABLE . " p2 WHERE p1.topic_id = {$topic_data['topic_id']} AND p2.post_id = {$post_id} " . ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND p1.post_approved = 1' : ) . ' AND ' . (($sort_dir == 'd') ? 'p1.post_time >= p2.post_time' : 'p1.post_time <= p2.post_time');

$result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result);

$topic_data['prev_posts'] = $row['prev_posts'] - 1; } }

$topic_id = (int) $topic_data['topic_id']; // $topic_replies = ($auth->acl_get('m_approve', $forum_id)) ? $topic_data['topic_replies_real'] : $topic_data['topic_replies'];

// Check sticky/announcement time limit if (($topic_data['topic_type'] == POST_STICKY || $topic_data['topic_type'] == POST_ANNOUNCE) && $topic_data['topic_time_limit'] && ($topic_data['topic_time'] + $topic_data['topic_time_limit']) < time()) { $sql = 'UPDATE ' . TOPICS_TABLE . ' SET topic_type = ' . POST_NORMAL . ', topic_time_limit = 0 WHERE topic_id = ' . $topic_id; $db->sql_query($sql);

$topic_data['topic_type'] = POST_NORMAL; $topic_data['topic_time_limit'] = 0; }

// Setup look and feel $user->setup('viewtopic', $topic_data['forum_style']);

if (!$topic_data['topic_approved'] && !$auth->acl_get('m_approve', $forum_id)) { trigger_error('NO_TOPIC'); }

// Start auth check if (!$auth->acl_get('f_read', $forum_id)) { if ($user->data['user_id'] != ANONYMOUS) { trigger_error('SORRY_AUTH_READ'); }

login_box(, $user->lang['LOGIN_VIEWFORUM']); }

// Forum is passworded ... check whether access has been granted to this // user this session, if not show login box if ($topic_data['forum_password']) { login_forum_box($topic_data); }

// Redirect to login or to the correct post upon emailed notification links if (isset($_GET['e'])) { $jump_to = request_var('e', 0);

$redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id");

if ($user->data['user_id'] == ANONYMOUS) { login_box($redirect_url . "&p=$post_id&e=$jump_to", $user->lang['LOGIN_NOTIFY_TOPIC']); }

if ($jump_to > 0) { // We direct the already logged in user to the correct post... redirect($redirect_url . ((!$post_id) ? "&p=$jump_to" : "&p=$post_id") . "#p$jump_to"); } }

// What is start equal to? if ($post_id) { $start = floor(($topic_data['prev_posts']) / $config['posts_per_page']) * $config['posts_per_page']; }

// Get topic tracking info if (!isset($topic_tracking_info)) { $topic_tracking_info = array();

// Get topic tracking info if ($config['load_db_lastread'] && $user->data['is_registered']) { $tmp_topic_data = array($topic_id => $topic_data); $topic_tracking_info = get_topic_tracking($forum_id, $topic_id, $tmp_topic_data, array($forum_id => $topic_data['forum_mark_time'])); unset($tmp_topic_data); } else if ($config['load_anon_lastread'] || $user->data['is_registered']) { $topic_tracking_info = get_complete_topic_tracking($forum_id, $topic_id); } }

// Post ordering options $limit_days = array(0 => $user->lang['ALL_POSTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);

$sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 's' => $user->lang['SUBJECT']); $sort_by_sql = array('a' => array('u.username_clean', 'p.post_id'), 't' => 'p.post_time', 's' => array('p.post_subject', 'p.post_id')); $join_user_sql = array('a' => true, 't' => false, 's' => false);

$s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = ;

gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param, $default_sort_days, $default_sort_key, $default_sort_dir);

// Obtain correct post count and ordering SQL if user has // requested anything different if ($sort_days) { $min_post_time = time() - ($sort_days * 86400);

$sql = 'SELECT COUNT(post_id) AS num_posts FROM ' . POSTS_TABLE . " WHERE topic_id = $topic_id AND post_time >= $min_post_time " . (($auth->acl_get('m_approve', $forum_id)) ?  : 'AND post_approved = 1'); $result = $db->sql_query($sql); $total_posts = (int) $db->sql_fetchfield('num_posts'); $db->sql_freeresult($result);

$limit_posts_time = "AND p.post_time >= $min_post_time ";

if (isset($_POST['sort'])) { $start = 0; } } else { $total_posts = $topic_replies + 1; $limit_posts_time = ; }

// Was a highlight request part of the URI? $highlight_match = $highlight = ; if ($hilit_words) { foreach (explode(' ', trim($hilit_words)) as $word) { if (trim($word)) { $word = str_replace('\*', '\w+?', preg_quote($word, '#')); $word = preg_replace('#(^|\s)\\\\w\*\?(\s|$)#', '$1\w+?$2', $word); $highlight_match .= (($highlight_match != ) ? '|' : ) . $word; } }

$highlight = urlencode($hilit_words); }

// Make sure $start is set to the last page if it exceeds the amount if ($start < 0 || $start >= $total_posts) { $start = ($start < 0) ? 0 : floor(($total_posts - 1) / $config['posts_per_page']) * $config['posts_per_page']; }

// General Viewtopic URL for return links $viewtopic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&start=$start" . ((strlen($u_sort_param)) ? "&$u_sort_param" : ) . (($highlight_match) ? "&hilit=$highlight" : ));

// Are we watching this topic? $s_watching_topic = array( 'link' => , 'title' => , 'is_watching' => false, );

if (($config['email_enable'] || $config['jab_enable']) && $config['allow_topic_notify'] && $user->data['is_registered']) { watch_topic_forum('topic', $s_watching_topic, $user->data['user_id'], $forum_id, $topic_id, $topic_data['notify_status'], $start);

// Reset forum notification if forum notify is set if ($config['allow_forum_notify'] && $auth->acl_get('f_subscribe', $forum_id)) { $s_watching_forum = $s_watching_topic; watch_topic_forum('forum', $s_watching_forum, $user->data['user_id'], $forum_id, 0); } }

// Bookmarks if ($config['allow_bookmarks'] && $user->data['is_registered'] && request_var('bookmark', 0)) { if (check_link_hash(request_var('hash', ), "topic_$topic_id")) { if (!$topic_data['bookmarked']) { $sql = 'INSERT INTO ' . BOOKMARKS_TABLE . ' ' . $db->sql_build_array('INSERT', array( 'user_id' => $user->data['user_id'], 'topic_id' => $topic_id, )); $db->sql_query($sql); } else { $sql = 'DELETE FROM ' . BOOKMARKS_TABLE . " WHERE user_id = {$user->data['user_id']} AND topic_id = $topic_id"; $db->sql_query($sql); } $message = (($topic_data['bookmarked']) ? $user->lang['BOOKMARK_REMOVED'] : $user->lang['BOOKMARK_ADDED']) . '

' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $viewtopic_url . '">', '</a>'); } else { $message = $user->lang['BOOKMARK_ERR'] . '

' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $viewtopic_url . '">', '</a>'); } meta_refresh(3, $viewtopic_url);

trigger_error($message); }

// Grab ranks $ranks = $cache->obtain_ranks();

// Grab icons $icons = $cache->obtain_icons();

// Grab extensions $extensions = array(); if ($topic_data['topic_attachment']) { $extensions = $cache->obtain_attach_extensions($forum_id); }

// Forum rules listing $s_forum_rules = ; gen_forum_auth_level('topic', $forum_id, $topic_data['forum_status']);

// Quick mod tools $allow_change_type = ($auth->acl_get('m_', $forum_id) || ($user->data['is_registered'] && $user->data['user_id'] == $topic_data['topic_poster'])) ? true : false;

$topic_mod = ; $topic_mod .= ($auth->acl_get('m_lock', $forum_id) || ($auth->acl_get('f_user_lock', $forum_id) && $user->data['is_registered'] && $user->data['user_id'] == $topic_data['topic_poster'] && $topic_data['topic_status'] == ITEM_UNLOCKED)) ? (($topic_data['topic_status'] == ITEM_UNLOCKED) ? '<option value="lock">' . $user->lang['LOCK_TOPIC'] . '</option>' : '<option value="unlock">' . $user->lang['UNLOCK_TOPIC'] . '</option>') : ; $topic_mod .= ($auth->acl_get('m_delete', $forum_id)) ? '<option value="delete_topic">' . $user->lang['DELETE_TOPIC'] . '</option>' : ; $topic_mod .= ($auth->acl_get('m_move', $forum_id) && $topic_data['topic_status'] != ITEM_MOVED) ? '<option value="move">' . $user->lang['MOVE_TOPIC'] . '</option>' : ; $topic_mod .= ($auth->acl_get('m_split', $forum_id)) ? '<option value="split">' . $user->lang['SPLIT_TOPIC'] . '</option>' : ; $topic_mod .= ($auth->acl_get('m_merge', $forum_id)) ? '<option value="merge">' . $user->lang['MERGE_POSTS'] . '</option>' : ; $topic_mod .= ($auth->acl_get('m_merge', $forum_id)) ? '<option value="merge_topic">' . $user->lang['MERGE_TOPIC'] . '</option>' : ; $topic_mod .= ($auth->acl_get('m_move', $forum_id)) ? '<option value="fork">' . $user->lang['FORK_TOPIC'] . '</option>' : ; $topic_mod .= ($allow_change_type && $auth->acl_gets('f_sticky', 'f_announce', $forum_id) && $topic_data['topic_type'] != POST_NORMAL) ? '<option value="make_normal">' . $user->lang['MAKE_NORMAL'] . '</option>' : ; $topic_mod .= ($allow_change_type && $auth->acl_get('f_sticky', $forum_id) && $topic_data['topic_type'] != POST_STICKY) ? '<option value="make_sticky">' . $user->lang['MAKE_STICKY'] . '</option>' : ; $topic_mod .= ($allow_change_type && $auth->acl_get('f_announce', $forum_id) && $topic_data['topic_type'] != POST_ANNOUNCE) ? '<option value="make_announce">' . $user->lang['MAKE_ANNOUNCE'] . '</option>' : ; $topic_mod .= ($allow_change_type && $auth->acl_get('f_announce', $forum_id) && $topic_data['topic_type'] != POST_GLOBAL) ? '<option value="make_global">' . $user->lang['MAKE_GLOBAL'] . '</option>' : ; $topic_mod .= ($auth->acl_get('m_', $forum_id)) ? '<option value="topic_logs">' . $user->lang['VIEW_TOPIC_LOGS'] . '</option>' : ;

// If we've got a hightlight set pass it on to pagination. $pagination = generate_pagination(append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id" . ((strlen($u_sort_param)) ? "&$u_sort_param" : ) . (($highlight_match) ? "&hilit=$highlight" : )), $total_posts, $config['posts_per_page'], $start);

// Navigation links generate_forum_nav($topic_data);

// Forum Rules generate_forum_rules($topic_data);

// Moderators $forum_moderators = array(); if ($config['load_moderators']) { get_moderators($forum_moderators, $forum_id); }

// This is only used for print view so ... $server_path = (!$view) ? $phpbb_root_path : generate_board_url() . '/';

// Replace naughty words in title $topic_data['topic_title'] = censor_text($topic_data['topic_title']);

// Send vars to template $template->assign_vars(array( 'FORUM_ID' => $forum_id, 'FORUM_NAME' => $topic_data['forum_name'], 'FORUM_DESC' => generate_text_for_display($topic_data['forum_desc'], $topic_data['forum_desc_uid'], $topic_data['forum_desc_bitfield'], $topic_data['forum_desc_options']), 'TOPIC_ID' => $topic_id, 'TOPIC_TITLE' => $topic_data['topic_title'], 'TOPIC_POSTER' => $topic_data['topic_poster'],

'TOPIC_AUTHOR_FULL' => get_username_string('full', $topic_data['topic_poster'], $topic_data['topic_first_poster_name'], $topic_data['topic_first_poster_colour']), 'TOPIC_AUTHOR_COLOUR' => get_username_string('colour', $topic_data['topic_poster'], $topic_data['topic_first_poster_name'], $topic_data['topic_first_poster_colour']), 'TOPIC_AUTHOR' => get_username_string('username', $topic_data['topic_poster'], $topic_data['topic_first_poster_name'], $topic_data['topic_first_poster_colour']),

'PAGINATION' => $pagination, 'PAGE_NUMBER' => on_page($total_posts, $config['posts_per_page'], $start), 'TOTAL_POSTS' => ($total_posts == 1) ? $user->lang['VIEW_TOPIC_POST'] : sprintf($user->lang['VIEW_TOPIC_POSTS'], $total_posts), 'U_MCP' => ($auth->acl_get('m_', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&mode=topic_view&f=$forum_id&t=$topic_id&start=$start" . ((strlen($u_sort_param)) ? "&$u_sort_param" : ), true, $user->session_id) : , 'MODERATORS' => (isset($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id])) ? implode(', ', $forum_moderators[$forum_id]) : ,

'POST_IMG' => ($topic_data['forum_status'] == ITEM_LOCKED) ? $user->img('button_topic_locked', 'FORUM_LOCKED') : $user->img('button_topic_new', 'POST_NEW_TOPIC'), 'QUOTE_IMG' => $user->img('icon_post_quote', 'REPLY_WITH_QUOTE'), 'REPLY_IMG' => ($topic_data['forum_status'] == ITEM_LOCKED || $topic_data['topic_status'] == ITEM_LOCKED) ? $user->img('button_topic_locked', 'TOPIC_LOCKED') : $user->img('button_topic_reply', 'REPLY_TO_TOPIC'), 'EDIT_IMG' => $user->img('icon_post_edit', 'EDIT_POST'), 'DELETE_IMG' => $user->img('icon_post_delete', 'DELETE_POST'), 'INFO_IMG' => $user->img('icon_post_info', 'VIEW_INFO'), 'PROFILE_IMG' => $user->img('icon_user_profile', 'READ_PROFILE'), 'SEARCH_IMG' => $user->img('icon_user_search', 'SEARCH_USER_POSTS'), 'PM_IMG' => $user->img('icon_contact_pm', 'SEND_PRIVATE_MESSAGE'), 'EMAIL_IMG' => $user->img('icon_contact_email', 'SEND_EMAIL'), 'WWW_IMG' => $user->img('icon_contact_www', 'VISIT_WEBSITE'), 'ICQ_IMG' => $user->img('icon_contact_icq', 'ICQ'), 'AIM_IMG' => $user->img('icon_contact_aim', 'AIM'), 'MSN_IMG' => $user->img('icon_contact_msnm', 'MSNM'), 'YIM_IMG' => $user->img('icon_contact_yahoo', 'YIM'), 'JABBER_IMG' => $user->img('icon_contact_jabber', 'JABBER') , 'REPORT_IMG' => $user->img('icon_post_report', 'REPORT_POST'), 'REPORTED_IMG' => $user->img('icon_topic_reported', 'POST_REPORTED'), 'UNAPPROVED_IMG' => $user->img('icon_topic_unapproved', 'POST_UNAPPROVED'), 'WARN_IMG' => $user->img('icon_user_warn', 'WARN_USER'),

'S_IS_LOCKED' => ($topic_data['topic_status'] == ITEM_UNLOCKED && $topic_data['forum_status'] == ITEM_UNLOCKED) ? false : true, 'S_SELECT_SORT_DIR' => $s_sort_dir, 'S_SELECT_SORT_KEY' => $s_sort_key, 'S_SELECT_SORT_DAYS' => $s_limit_days, 'S_SINGLE_MODERATOR' => (!empty($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id]) > 1) ? false : true, 'S_TOPIC_ACTION' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&start=$start"), 'S_TOPIC_MOD' => ($topic_mod != ) ? '<select name="action" id="quick-mod-select">' . $topic_mod . '</select>' : , 'S_MOD_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", "f=$forum_id&t=$topic_id&start=$start&quickmod=1&redirect=" . urlencode(str_replace('&', '&', $viewtopic_url)), true, $user->session_id),

'S_VIEWTOPIC' => true, 'S_DISPLAY_SEARCHBOX' => ($auth->acl_get('u_search') && $auth->acl_get('f_search', $forum_id) && $config['load_search']) ? true : false, 'S_SEARCHBOX_ACTION' => append_sid("{$phpbb_root_path}search.$phpEx", 't=' . $topic_id),

'S_DISPLAY_POST_INFO' => ($topic_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false, 'S_DISPLAY_REPLY_INFO' => ($topic_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_reply', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false, 'S_ENABLE_FEEDS_TOPIC' => ($config['feed_topic'] && !phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $topic_data['forum_options'])) ? true : false,

'U_TOPIC' => "{$server_path}viewtopic.$phpEx?f=$forum_id&t=$topic_id", 'U_FORUM' => $server_path, 'U_VIEW_TOPIC' => $viewtopic_url, 'U_VIEW_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id), 'U_VIEW_OLDER_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&view=previous"), 'U_VIEW_NEWER_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&view=next"), 'U_PRINT_TOPIC' => ($auth->acl_get('f_print', $forum_id)) ? $viewtopic_url . '&view=print' : , 'U_EMAIL_TOPIC' => ($auth->acl_get('f_email', $forum_id) && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=email&t=$topic_id") : ,

'U_WATCH_TOPIC' => $s_watching_topic['link'], 'L_WATCH_TOPIC' => $s_watching_topic['title'], 'S_WATCHING_TOPIC' => $s_watching_topic['is_watching'],

'U_BOOKMARK_TOPIC' => ($user->data['is_registered'] && $config['allow_bookmarks']) ? $viewtopic_url . '&bookmark=1&hash=' . generate_link_hash("topic_$topic_id") : , 'L_BOOKMARK_TOPIC' => ($user->data['is_registered'] && $config['allow_bookmarks'] && $topic_data['bookmarked']) ? $user->lang['BOOKMARK_TOPIC_REMOVE'] : $user->lang['BOOKMARK_TOPIC'],

'U_POST_NEW_TOPIC' => ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=post&f=$forum_id") : , 'U_POST_REPLY_TOPIC' => ($auth->acl_get('f_reply', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=reply&f=$forum_id&t=$topic_id") : , 'U_BUMP_TOPIC' => (bump_topic_allowed($forum_id, $topic_data['topic_bumped'], $topic_data['topic_last_post_time'], $topic_data['topic_poster'], $topic_data['topic_last_poster_id'])) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=bump&f=$forum_id&t=$topic_id&hash=" . generate_link_hash("topic_$topic_id")) : ) );

// Does this topic contain a poll? if (!empty($topic_data['poll_start'])) { $sql = 'SELECT o.*, p.bbcode_bitfield, p.bbcode_uid FROM ' . POLL_OPTIONS_TABLE . ' o, ' . POSTS_TABLE . " p WHERE o.topic_id = $topic_id AND p.post_id = {$topic_data['topic_first_post_id']} AND p.topic_id = o.topic_id ORDER BY o.poll_option_id"; $result = $db->sql_query($sql);

$poll_info = array(); while ($row = $db->sql_fetchrow($result)) { $poll_info[] = $row; } $db->sql_freeresult($result);

$cur_voted_id = array(); if ($user->data['is_registered']) { $sql = 'SELECT poll_option_id FROM ' . POLL_VOTES_TABLE . ' WHERE topic_id = ' . $topic_id . ' AND vote_user_id = ' . $user->data['user_id']; $result = $db->sql_query($sql);

while ($row = $db->sql_fetchrow($result)) { $cur_voted_id[] = $row['poll_option_id']; } $db->sql_freeresult($result); } else { // Cookie based guest tracking ... I don't like this but hum ho // it's oft requested. This relies on "nice" users who don't feel // the need to delete cookies to mess with results. if (isset($_COOKIE[$config['cookie_name'] . '_poll_' . $topic_id])) { $cur_voted_id = explode(',', $_COOKIE[$config['cookie_name'] . '_poll_' . $topic_id]); $cur_voted_id = array_map('intval', $cur_voted_id); } }

// Can not vote at all if no vote permission $s_can_vote = ($auth->acl_get('f_vote', $forum_id) && (($topic_data['poll_length'] != 0 && $topic_data['poll_start'] + $topic_data['poll_length'] > time()) || $topic_data['poll_length'] == 0) && $topic_data['topic_status'] != ITEM_LOCKED && $topic_data['forum_status'] != ITEM_LOCKED && (!sizeof($cur_voted_id) || ($auth->acl_get('f_votechg', $forum_id) && $topic_data['poll_vote_change']))) ? true : false; $s_display_results = (!$s_can_vote || ($s_can_vote && sizeof($cur_voted_id)) || $view == 'viewpoll') ? true : false;

if ($update && $s_can_vote) {

if (!sizeof($voted_id) || sizeof($voted_id) > $topic_data['poll_max_options'] || in_array(VOTE_CONVERTED, $cur_voted_id) || !check_form_key('posting')) { $redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&start=$start");

meta_refresh(5, $redirect_url); if (!sizeof($voted_id)) { $message = 'NO_VOTE_OPTION'; } else if (sizeof($voted_id) > $topic_data['poll_max_options']) { $message = 'TOO_MANY_VOTE_OPTIONS'; } else if (in_array(VOTE_CONVERTED, $cur_voted_id)) { $message = 'VOTE_CONVERTED'; } else { $message = 'FORM_INVALID'; }

$message = $user->lang[$message] . '

' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $redirect_url . '">', '</a>'); trigger_error($message); }

foreach ($voted_id as $option) { if (in_array($option, $cur_voted_id)) { continue; }

$sql = 'UPDATE ' . POLL_OPTIONS_TABLE . ' SET poll_option_total = poll_option_total + 1 WHERE poll_option_id = ' . (int) $option . ' AND topic_id = ' . (int) $topic_id; $db->sql_query($sql);

if ($user->data['is_registered']) { $sql_ary = array( 'topic_id' => (int) $topic_id, 'poll_option_id' => (int) $option, 'vote_user_id' => (int) $user->data['user_id'], 'vote_user_ip' => (string) $user->ip, );

$sql = 'INSERT INTO ' . POLL_VOTES_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary); $db->sql_query($sql); } }

foreach ($cur_voted_id as $option) { if (!in_array($option, $voted_id)) { $sql = 'UPDATE ' . POLL_OPTIONS_TABLE . ' SET poll_option_total = poll_option_total - 1 WHERE poll_option_id = ' . (int) $option . ' AND topic_id = ' . (int) $topic_id; $db->sql_query($sql);

if ($user->data['is_registered']) { $sql = 'DELETE FROM ' . POLL_VOTES_TABLE . ' WHERE topic_id = ' . (int) $topic_id . ' AND poll_option_id = ' . (int) $option . ' AND vote_user_id = ' . (int) $user->data['user_id']; $db->sql_query($sql); } } }

if ($user->data['user_id'] == ANONYMOUS && !$user->data['is_bot']) { $user->set_cookie('poll_' . $topic_id, implode(',', $voted_id), time() + 31536000); }

$sql = 'UPDATE ' . TOPICS_TABLE . ' SET poll_last_vote = ' . time() . " WHERE topic_id = $topic_id"; //, topic_last_post_time = ' . time() . " -- for bumping topics with new votes, ignore for now $db->sql_query($sql);

$redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&start=$start");

meta_refresh(5, $redirect_url); trigger_error($user->lang['VOTE_SUBMITTED'] . '

' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $redirect_url . '">', '</a>')); }

$poll_total = 0; foreach ($poll_info as $poll_option) { $poll_total += $poll_option['poll_option_total']; }

if ($poll_info[0]['bbcode_bitfield']) { $poll_bbcode = new bbcode(); } else { $poll_bbcode = false; }

for ($i = 0, $size = sizeof($poll_info); $i < $size; $i++) { $poll_info[$i]['poll_option_text'] = censor_text($poll_info[$i]['poll_option_text']);

if ($poll_bbcode !== false) { $poll_bbcode->bbcode_second_pass($poll_info[$i]['poll_option_text'], $poll_info[$i]['bbcode_uid'], $poll_option['bbcode_bitfield']); }

$poll_info[$i]['poll_option_text'] = bbcode_nl2br($poll_info[$i]['poll_option_text']); $poll_info[$i]['poll_option_text'] = smiley_text($poll_info[$i]['poll_option_text']); }

$topic_data['poll_title'] = censor_text($topic_data['poll_title']);

if ($poll_bbcode !== false) { $poll_bbcode->bbcode_second_pass($topic_data['poll_title'], $poll_info[0]['bbcode_uid'], $poll_info[0]['bbcode_bitfield']); }

$topic_data['poll_title'] = bbcode_nl2br($topic_data['poll_title']); $topic_data['poll_title'] = smiley_text($topic_data['poll_title']);

unset($poll_bbcode);

foreach ($poll_info as $poll_option) { $option_pct = ($poll_total > 0) ? $poll_option['poll_option_total'] / $poll_total : 0; $option_pct_txt = sprintf("%.1d%%", round($option_pct * 100));

$template->assign_block_vars('poll_option', array( 'POLL_OPTION_ID' => $poll_option['poll_option_id'], 'POLL_OPTION_CAPTION' => $poll_option['poll_option_text'], 'POLL_OPTION_RESULT' => $poll_option['poll_option_total'], 'POLL_OPTION_PERCENT' => $option_pct_txt, 'POLL_OPTION_PCT' => round($option_pct * 100), 'POLL_OPTION_IMG' => $user->img('poll_center', $option_pct_txt, round($option_pct * 250)), 'POLL_OPTION_VOTED' => (in_array($poll_option['poll_option_id'], $cur_voted_id)) ? true : false) ); }

$poll_end = $topic_data['poll_length'] + $topic_data['poll_start'];

$template->assign_vars(array( 'POLL_QUESTION' => $topic_data['poll_title'], 'TOTAL_VOTES' => $poll_total, 'POLL_LEFT_CAP_IMG' => $user->img('poll_left'), 'POLL_RIGHT_CAP_IMG'=> $user->img('poll_right'),

'L_MAX_VOTES' => ($topic_data['poll_max_options'] == 1) ? $user->lang['MAX_OPTION_SELECT'] : sprintf($user->lang['MAX_OPTIONS_SELECT'], $topic_data['poll_max_options']), 'L_POLL_LENGTH' => ($topic_data['poll_length']) ? sprintf($user->lang[($poll_end > time()) ? 'POLL_RUN_TILL' : 'POLL_ENDED_AT'], $user->format_date($poll_end)) : ,

'S_HAS_POLL' => true, 'S_CAN_VOTE' => $s_can_vote, 'S_DISPLAY_RESULTS' => $s_display_results, 'S_IS_MULTI_CHOICE' => ($topic_data['poll_max_options'] > 1) ? true : false, 'S_POLL_ACTION' => $viewtopic_url,

'U_VIEW_RESULTS' => $viewtopic_url . '&view=viewpoll') );

unset($poll_end, $poll_info, $voted_id); }

// If the user is trying to reach the second half of the topic, fetch it starting from the end $store_reverse = false; $sql_limit = $config['posts_per_page']; $sql_sort_order = $direction = ;

if ($start > $total_posts / 2) { $store_reverse = true;

if ($start + $config['posts_per_page'] > $total_posts) { $sql_limit = min($config['posts_per_page'], max(1, $total_posts - $start)); }

// Select the sort order $direction = (($sort_dir == 'd') ? 'ASC' : 'DESC'); $sql_start = max(0, $total_posts - $sql_limit - $start); } else { // Select the sort order $direction = (($sort_dir == 'd') ? 'DESC' : 'ASC'); $sql_start = $start; }

if (is_array($sort_by_sql[$sort_key])) { $sql_sort_order = implode(' ' . $direction . ', ', $sort_by_sql[$sort_key]) . ' ' . $direction; } else { $sql_sort_order = $sort_by_sql[$sort_key] . ' ' . $direction; }

// Container for user details, only process once $post_list = $user_cache = $id_cache = $attachments = $attach_list = $rowset = $update_count = $post_edit_list = array(); $has_attachments = $display_notice = false; $bbcode_bitfield = ; $i = $i_total = 0;

// Go ahead and pull all data for this topic $sql = 'SELECT p.post_id FROM ' . POSTS_TABLE . ' p' . (($join_user_sql[$sort_key]) ? ', ' . USERS_TABLE . ' u': ) . " WHERE p.topic_id = $topic_id " . ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND p.post_approved = 1' : ) . " " . (($join_user_sql[$sort_key]) ? 'AND u.user_id = p.poster_id': ) . " $limit_posts_time ORDER BY $sql_sort_order"; $result = $db->sql_query_limit($sql, $sql_limit, $sql_start);

$i = ($store_reverse) ? $sql_limit - 1 : 0; while ($row = $db->sql_fetchrow($result)) { $post_list[$i] = (int) $row['post_id']; ($store_reverse) ? $i-- : $i++; } $db->sql_freeresult($result);

if (!sizeof($post_list)) { if ($sort_days) { trigger_error('NO_POSTS_TIME_FRAME'); } else { trigger_error('NO_TOPIC'); } }

// Holding maximum post time for marking topic read // We need to grab it because we do reverse ordering sometimes $max_post_time = 0;

$sql = $db->sql_build_query('SELECT', array( 'SELECT' => 'u.*, z.friend, z.foe, p.*',

'FROM' => array( USERS_TABLE => 'u', POSTS_TABLE => 'p', ),

'LEFT_JOIN' => array( array( 'FROM' => array(ZEBRA_TABLE => 'z'), 'ON' => 'z.user_id = ' . $user->data['user_id'] . ' AND z.zebra_id = p.poster_id' ) ),

'WHERE' => $db->sql_in_set('p.post_id', $post_list) . ' AND u.user_id = p.poster_id' ));

$result = $db->sql_query($sql);

$now = getdate(time() + $user->timezone + $user->dst - date('Z'));

// Posts are stored in the $rowset array while $attach_list, $user_cache // and the global bbcode_bitfield are built while ($row = $db->sql_fetchrow($result)) { // Set max_post_time if ($row['post_time'] > $max_post_time) { $max_post_time = $row['post_time']; }

$poster_id = (int) $row['poster_id'];

// Does post have an attachment? If so, add it to the list if ($row['post_attachment'] && $config['allow_attachments']) { $attach_list[] = (int) $row['post_id'];

if ($row['post_approved']) { $has_attachments = true; } }

$rowset[$row['post_id']] = array( 'hide_post' => ($row['foe'] && ($view != 'show' || $post_id != $row['post_id'])) ? true : false,

'post_id' => $row['post_id'], 'post_time' => $row['post_time'], 'user_id' => $row['user_id'], 'username' => $row['username'], 'user_colour' => $row['user_colour'], 'topic_id' => $row['topic_id'], 'forum_id' => $row['forum_id'], 'post_subject' => $row['post_subject'], 'post_edit_count' => $row['post_edit_count'], 'post_edit_time' => $row['post_edit_time'], 'post_edit_reason' => $row['post_edit_reason'], 'post_edit_user' => $row['post_edit_user'], 'post_edit_locked' => $row['post_edit_locked'],

// Make sure the icon actually exists 'icon_id' => (isset($icons[$row['icon_id']]['img'], $icons[$row['icon_id']]['height'], $icons[$row['icon_id']]['width'])) ? $row['icon_id'] : 0, 'post_attachment' => $row['post_attachment'], 'post_approved' => $row['post_approved'], 'post_reported' => $row['post_reported'], 'post_username' => $row['post_username'], 'post_text' => $row['post_text'], 'bbcode_uid' => $row['bbcode_uid'], 'bbcode_bitfield' => $row['bbcode_bitfield'], 'enable_smilies' => $row['enable_smilies'], 'enable_sig' => $row['enable_sig'], 'friend' => $row['friend'], 'foe' => $row['foe'], );

// Define the global bbcode bitfield, will be used to load bbcodes $bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']);

// Is a signature attached? Are we going to display it? if ($row['enable_sig'] && $config['allow_sig'] && $user->optionget('viewsigs')) { $bbcode_bitfield = $bbcode_bitfield | base64_decode($row['user_sig_bbcode_bitfield']); }

// Cache various user specific data ... so we don't have to recompute // this each time the same user appears on this page if (!isset($user_cache[$poster_id])) { if ($poster_id == ANONYMOUS) { $user_cache[$poster_id] = array( 'joined' => , 'posts' => , 'from' => ,

'sig' => , 'sig_bbcode_uid' => , 'sig_bbcode_bitfield' => ,

'online' => false, 'avatar' => ($user->optionget('viewavatars')) ? get_user_avatar($row['user_avatar'], $row['user_avatar_type'], $row['user_avatar_width'], $row['user_avatar_height']) : , 'rank_title' => , 'rank_image' => , 'rank_image_src' => , 'sig' => , 'profile' => , 'pm' => , 'email' => , 'www' => , 'icq_status_img' => , 'icq' => , 'aim' => , 'msn' => , 'yim' => , 'jabber' => , 'search' => , 'age' => ,

'username' => $row['username'], 'user_colour' => $row['user_colour'],

'warnings' => 0, 'allow_pm' => 0, );

get_user_rank($row['user_rank'], false, $user_cache[$poster_id]['rank_title'], $user_cache[$poster_id]['rank_image'], $user_cache[$poster_id]['rank_image_src']); } else { $user_sig = ;

// We add the signature to every posters entry because enable_sig is post dependant if ($row['user_sig'] && $config['allow_sig'] && $user->optionget('viewsigs')) { $user_sig = $row['user_sig']; }

$id_cache[] = $poster_id;

$user_cache[$poster_id] = array( 'joined' => $user->format_date($row['user_regdate']), 'posts' => $row['user_posts'], 'warnings' => (isset($row['user_warnings'])) ? $row['user_warnings'] : 0, 'from' => (!empty($row['user_from'])) ? $row['user_from'] : ,

'sig' => $user_sig, 'sig_bbcode_uid' => (!empty($row['user_sig_bbcode_uid'])) ? $row['user_sig_bbcode_uid'] : , 'sig_bbcode_bitfield' => (!empty($row['user_sig_bbcode_bitfield'])) ? $row['user_sig_bbcode_bitfield'] : ,

'viewonline' => $row['user_allow_viewonline'], 'allow_pm' => $row['user_allow_pm'],

'avatar' => ($user->optionget('viewavatars')) ? get_user_avatar($row['user_avatar'], $row['user_avatar_type'], $row['user_avatar_width'], $row['user_avatar_height']) : , 'age' => ,

'rank_title' => , 'rank_image' => , 'rank_image_src' => ,

'username' => $row['username'], 'user_colour' => $row['user_colour'],

'online' => false, 'profile' => append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=viewprofile&u=$poster_id"), 'www' => $row['user_website'], 'aim' => ($row['user_aim'] && $auth->acl_get('u_sendim')) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=contact&action=aim&u=$poster_id") : , 'msn' => ($row['user_msnm'] && $auth->acl_get('u_sendim')) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=contact&action=msnm&u=$poster_id") : , 'yim' => ($row['user_yim']) ? 'http://edit.yahoo.com/config/send_webmesg?.target=' . urlencode($row['user_yim']) . '&.src=pg' : , 'jabber' => ($row['user_jabber'] && $auth->acl_get('u_sendim')) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=contact&action=jabber&u=$poster_id") : , 'search' => ($auth->acl_get('u_search')) ? append_sid("{$phpbb_root_path}search.$phpEx", "author_id=$poster_id&sr=posts") : ,

'author_full' => get_username_string('full', $poster_id, $row['username'], $row['user_colour']), 'author_colour' => get_username_string('colour', $poster_id, $row['username'], $row['user_colour']), 'author_username' => get_username_string('username', $poster_id, $row['username'], $row['user_colour']), 'author_profile' => get_username_string('profile', $poster_id, $row['username'], $row['user_colour']), );

get_user_rank($row['user_rank'], $row['user_posts'], $user_cache[$poster_id]['rank_title'], $user_cache[$poster_id]['rank_image'], $user_cache[$poster_id]['rank_image_src']);

if (!empty($row['user_allow_viewemail']) || $auth->acl_get('a_email')) { $user_cache[$poster_id]['email'] = ($config['board_email_form'] && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=email&u=$poster_id") : (($config['board_hide_emails'] && !$auth->acl_get('a_email')) ?  : 'mailto:' . $row['user_email']); } else { $user_cache[$poster_id]['email'] = ; }

if (!empty($row['user_icq'])) { $user_cache[$poster_id]['icq'] = 'http://www.icq.com/people/webmsg.php?to=' . $row['user_icq']; $user_cache[$poster_id]['icq_status_img'] = '<img src="http://web.icq.com/whitepages/online?icq=' . $row['user_icq'] . '&img=5" width="18" height="18" alt="" />'; } else { $user_cache[$poster_id]['icq_status_img'] = ; $user_cache[$poster_id]['icq'] = ; }

if ($config['allow_birthdays'] && !empty($row['user_birthday'])) { list($bday_day, $bday_month, $bday_year) = array_map('intval', explode('-', $row['user_birthday']));

if ($bday_year) { $diff = $now['mon'] - $bday_month; if ($diff == 0) { $diff = ($now['mday'] - $bday_day < 0) ? 1 : 0; } else { $diff = ($diff < 0) ? 1 : 0; }

$user_cache[$poster_id]['age'] = (int) ($now['year'] - $bday_year - $diff); } } } } } $db->sql_freeresult($result);

// Load custom profile fields if ($config['load_cpf_viewtopic']) { if (!class_exists('custom_profile')) { include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx); } $cp = new custom_profile();

// Grab all profile fields from users in id cache for later use - similar to the poster cache $profile_fields_tmp = $cp->generate_profile_fields_template('grab', $id_cache);

// filter out fields not to be displayed on viewtopic. Yes, it's a hack, but this shouldn't break any MODs. $profile_fields_cache = array(); foreach ($profile_fields_tmp as $profile_user_id => $profile_fields) { $profile_fields_cache[$profile_user_id] = array(); foreach ($profile_fields as $used_ident => $profile_field) { if ($profile_field['data']['field_show_on_vt']) { $profile_fields_cache[$profile_user_id][$used_ident] = $profile_field; } } } unset($profile_fields_tmp); }

// Generate online information for user if ($config['load_onlinetrack'] && sizeof($id_cache)) { $sql = 'SELECT session_user_id, MAX(session_time) as online_time, MIN(session_viewonline) AS viewonline FROM ' . SESSIONS_TABLE . ' WHERE ' . $db->sql_in_set('session_user_id', $id_cache) . ' GROUP BY session_user_id'; $result = $db->sql_query($sql);

$update_time = $config['load_online_time'] * 60; while ($row = $db->sql_fetchrow($result)) { $user_cache[$row['session_user_id']]['online'] = (time() - $update_time < $row['online_time'] && (($row['viewonline']) || $auth->acl_get('u_viewonline'))) ? true : false; } $db->sql_freeresult($result); } unset($id_cache);

// Pull attachment data if (sizeof($attach_list)) { if ($auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id)) { $sql = 'SELECT * FROM ' . ATTACHMENTS_TABLE . ' WHERE ' . $db->sql_in_set('post_msg_id', $attach_list) . ' AND in_message = 0 ORDER BY filetime DESC, post_msg_id ASC'; $result = $db->sql_query($sql);

while ($row = $db->sql_fetchrow($result)) { $attachments[$row['post_msg_id']][] = $row; } $db->sql_freeresult($result);

// No attachments exist, but post table thinks they do so go ahead and reset post_attach flags if (!sizeof($attachments)) { $sql = 'UPDATE ' . POSTS_TABLE . ' SET post_attachment = 0 WHERE ' . $db->sql_in_set('post_id', $attach_list); $db->sql_query($sql);

// We need to update the topic indicator too if the complete topic is now without an attachment if (sizeof($rowset) != $total_posts) { // Not all posts are displayed so we query the db to find if there's any attachment for this topic $sql = 'SELECT a.post_msg_id as post_id FROM ' . ATTACHMENTS_TABLE . ' a, ' . POSTS_TABLE . " p WHERE p.topic_id = $topic_id AND p.post_approved = 1 AND p.topic_id = a.topic_id"; $result = $db->sql_query_limit($sql, 1); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result);

if (!$row) { $sql = 'UPDATE ' . TOPICS_TABLE . " SET topic_attachment = 0 WHERE topic_id = $topic_id"; $db->sql_query($sql); } } else { $sql = 'UPDATE ' . TOPICS_TABLE . " SET topic_attachment = 0 WHERE topic_id = $topic_id"; $db->sql_query($sql); } } else if ($has_attachments && !$topic_data['topic_attachment']) { // Topic has approved attachments but its flag is wrong $sql = 'UPDATE ' . TOPICS_TABLE . " SET topic_attachment = 1 WHERE topic_id = $topic_id"; $db->sql_query($sql);

$topic_data['topic_attachment'] = 1; } } else { $display_notice = true; } }

// Instantiate BBCode if need be if ($bbcode_bitfield !== ) { $bbcode = new bbcode(base64_encode($bbcode_bitfield)); }

$i_total = sizeof($rowset) - 1; $prev_post_id = ;

$template->assign_vars(array( 'S_NUM_POSTS' => sizeof($post_list)) );

// Output the posts $first_unread = $post_unread = false; for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i) { // A non-existing rowset only happens if there was no user present for the entered poster_id // This could be a broken posts table. if (!isset($rowset[$post_list[$i]])) { continue; }

$row =& $rowset[$post_list[$i]]; $poster_id = $row['user_id'];

// End signature parsing, only if needed if ($user_cache[$poster_id]['sig'] && $row['enable_sig'] && empty($user_cache[$poster_id]['sig_parsed'])) { $user_cache[$poster_id]['sig'] = censor_text($user_cache[$poster_id]['sig']);

if ($user_cache[$poster_id]['sig_bbcode_bitfield']) { $bbcode->bbcode_second_pass($user_cache[$poster_id]['sig'], $user_cache[$poster_id]['sig_bbcode_uid'], $user_cache[$poster_id]['sig_bbcode_bitfield']); }

$user_cache[$poster_id]['sig'] = bbcode_nl2br($user_cache[$poster_id]['sig']); $user_cache[$poster_id]['sig'] = smiley_text($user_cache[$poster_id]['sig']); $user_cache[$poster_id]['sig_parsed'] = true; }

// Parse the message and subject $message = censor_text($row['post_text']);

// Second parse bbcode here if ($row['bbcode_bitfield']) { $bbcode->bbcode_second_pass($message, $row['bbcode_uid'], $row['bbcode_bitfield']); }

$message = bbcode_nl2br($message); $message = smiley_text($message);

if (!empty($attachments[$row['post_id']])) { parse_attachments($forum_id, $message, $attachments[$row['post_id']], $update_count); }

// Replace naughty words such as farty pants $row['post_subject'] = censor_text($row['post_subject']);

// Highlight active words (primarily for search) if ($highlight_match) { $message = preg_replace('#(?!<.*)(?<!\w)(' . $highlight_match . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#is', '\1', $message); $row['post_subject'] = preg_replace('#(?!<.*)(?<!\w)(' . $highlight_match . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#is', '\1', $row['post_subject']); }

// Editing information if (($row['post_edit_count'] && $config['display_last_edited']) || $row['post_edit_reason']) { // Get usernames for all following posts if not already stored if (!sizeof($post_edit_list) && ($row['post_edit_reason'] || ($row['post_edit_user'] && !isset($user_cache[$row['post_edit_user']])))) { // Remove all post_ids already parsed (we do not have to check them) $post_storage_list = (!$store_reverse) ? array_slice($post_list, $i) : array_slice(array_reverse($post_list), $i);

$sql = 'SELECT DISTINCT u.user_id, u.username, u.user_colour FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u WHERE ' . $db->sql_in_set('p.post_id', $post_storage_list) . ' AND p.post_edit_count <> 0 AND p.post_edit_user <> 0 AND p.post_edit_user = u.user_id'; $result2 = $db->sql_query($sql); while ($user_edit_row = $db->sql_fetchrow($result2)) { $post_edit_list[$user_edit_row['user_id']] = $user_edit_row; } $db->sql_freeresult($result2);

unset($post_storage_list); }

$l_edit_time_total = ($row['post_edit_count'] == 1) ? $user->lang['EDITED_TIME_TOTAL'] : $user->lang['EDITED_TIMES_TOTAL'];

if ($row['post_edit_reason']) { // User having edited the post also being the post author? if (!$row['post_edit_user'] || $row['post_edit_user'] == $poster_id) { $display_username = get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']); } else { $display_username = get_username_string('full', $row['post_edit_user'], $post_edit_list[$row['post_edit_user']]['username'], $post_edit_list[$row['post_edit_user']]['user_colour']); }

$l_edited_by = sprintf($l_edit_time_total, $display_username, $user->format_date($row['post_edit_time'], false, true), $row['post_edit_count']); } else { if ($row['post_edit_user'] && !isset($user_cache[$row['post_edit_user']])) { $user_cache[$row['post_edit_user']] = $post_edit_list[$row['post_edit_user']]; }

// User having edited the post also being the post author? if (!$row['post_edit_user'] || $row['post_edit_user'] == $poster_id) { $display_username = get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']); } else { $display_username = get_username_string('full', $row['post_edit_user'], $user_cache[$row['post_edit_user']]['username'], $user_cache[$row['post_edit_user']]['user_colour']); }

$l_edited_by = sprintf($l_edit_time_total, $display_username, $user->format_date($row['post_edit_time'], false, true), $row['post_edit_count']); } } else { $l_edited_by = ; }

// Bump information if ($topic_data['topic_bumped'] && $row['post_id'] == $topic_data['topic_last_post_id'] && isset($user_cache[$topic_data['topic_bumper']]) ) { // It is safe to grab the username from the user cache array, we are at the last // post and only the topic poster and last poster are allowed to bump. // Admins and mods are bound to the above rules too... $l_bumped_by = sprintf($user->lang['BUMPED_BY'], $user_cache[$topic_data['topic_bumper']]['username'], $user->format_date($topic_data['topic_last_post_time'], false, true)); } else { $l_bumped_by = ; }

$cp_row = array();

// if ($config['load_cpf_viewtopic']) { $cp_row = (isset($profile_fields_cache[$poster_id])) ? $cp->generate_profile_fields_template('show', false, $profile_fields_cache[$poster_id]) : array(); }

$post_unread = (isset($topic_tracking_info[$topic_id]) && $row['post_time'] > $topic_tracking_info[$topic_id]) ? true : false;

$s_first_unread = false; if (!$first_unread && $post_unread) { $s_first_unread = $first_unread = true; }

$edit_allowed = ($user->data['is_registered'] && ($auth->acl_get('m_edit', $forum_id) || ( $user->data['user_id'] == $poster_id && $auth->acl_get('f_edit', $forum_id) && !$row['post_edit_locked'] && ($row['post_time'] > time() - ($config['edit_time'] * 60) || !$config['edit_time']) )));

$delete_allowed = ($user->data['is_registered'] && ($auth->acl_get('m_delete', $forum_id) || ( $user->data['user_id'] == $poster_id && $auth->acl_get('f_delete', $forum_id) && $topic_data['topic_last_post_id'] == $row['post_id'] && ($row['post_time'] > time() - ($config['delete_time'] * 60) || !$config['delete_time']) && // we do not want to allow removal of the last post if a moderator locked it! !$row['post_edit_locked'] )));

// $postrow = array( 'POST_AUTHOR_FULL' => ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_full'] : get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), 'POST_AUTHOR_COLOUR' => ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_colour'] : get_username_string('colour', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), 'POST_AUTHOR' => ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_username'] : get_username_string('username', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), 'U_POST_AUTHOR' => ($poster_id != ANONYMOUS) ? $user_cache[$poster_id]['author_profile'] : get_username_string('profile', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),

'RANK_TITLE' => $user_cache[$poster_id]['rank_title'], 'RANK_IMG' => $user_cache[$poster_id]['rank_image'], 'RANK_IMG_SRC' => $user_cache[$poster_id]['rank_image_src'], 'POSTER_JOINED' => $user_cache[$poster_id]['joined'], 'POSTER_POSTS' => $user_cache[$poster_id]['posts'], 'POSTER_FROM' => $user_cache[$poster_id]['from'], 'POSTER_AVATAR' => $user_cache[$poster_id]['avatar'], 'POSTER_WARNINGS' => $user_cache[$poster_id]['warnings'], 'POSTER_AGE' => $user_cache[$poster_id]['age'],

'POST_DATE' => $user->format_date($row['post_time'], false, ($view == 'print') ? true : false), 'POST_SUBJECT' => $row['post_subject'], 'MESSAGE' => $message, 'SIGNATURE' => ($row['enable_sig']) ? $user_cache[$poster_id]['sig'] : , 'EDITED_MESSAGE' => $l_edited_by, 'EDIT_REASON' => $row['post_edit_reason'], 'BUMPED_MESSAGE' => $l_bumped_by,

'MINI_POST_IMG' => ($post_unread) ? $user->img('icon_post_target_unread', 'NEW_POST') : $user->img('icon_post_target', 'POST'), 'POST_ICON_IMG' => ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['img'] : , 'POST_ICON_IMG_WIDTH' => ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['width'] : , 'POST_ICON_IMG_HEIGHT' => ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['height'] : , 'ICQ_STATUS_IMG' => $user_cache[$poster_id]['icq_status_img'], 'ONLINE_IMG' => ($poster_id == ANONYMOUS || !$config['load_onlinetrack']) ?  : (($user_cache[$poster_id]['online']) ? $user->img('icon_user_online', 'ONLINE') : $user->img('icon_user_offline', 'OFFLINE')), 'S_ONLINE' => ($poster_id == ANONYMOUS || !$config['load_onlinetrack']) ? false : (($user_cache[$poster_id]['online']) ? true : false),

'U_EDIT' => ($edit_allowed) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=edit&f=$forum_id&p={$row['post_id']}") : , 'U_QUOTE' => ($auth->acl_get('f_reply', $forum_id)) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=quote&f=$forum_id&p={$row['post_id']}") : , 'U_INFO' => ($auth->acl_get('m_info', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&mode=post_details&f=$forum_id&p=" . $row['post_id'], true, $user->session_id) : , 'U_DELETE' => ($delete_allowed) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=delete&f=$forum_id&p={$row['post_id']}") : ,

'U_PROFILE' => $user_cache[$poster_id]['profile'], 'U_SEARCH' => $user_cache[$poster_id]['search'], 'U_PM' => ($poster_id != ANONYMOUS && $config['allow_privmsg'] && $auth->acl_get('u_sendpm') && ($user_cache[$poster_id]['allow_pm'] || $auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_'))) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&mode=compose&action=quotepost&p=' . $row['post_id']) : , 'U_EMAIL' => $user_cache[$poster_id]['email'], 'U_WWW' => $user_cache[$poster_id]['www'], 'U_ICQ' => $user_cache[$poster_id]['icq'], 'U_AIM' => $user_cache[$poster_id]['aim'], 'U_MSN' => $user_cache[$poster_id]['msn'], 'U_YIM' => $user_cache[$poster_id]['yim'], 'U_JABBER' => $user_cache[$poster_id]['jabber'],

'U_REPORT' => ($auth->acl_get('f_report', $forum_id)) ? append_sid("{$phpbb_root_path}report.$phpEx", 'f=' . $forum_id . '&p=' . $row['post_id']) : , 'U_MCP_REPORT' => ($auth->acl_get('m_report', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&mode=report_details&f=' . $forum_id . '&p=' . $row['post_id'], true, $user->session_id) : , 'U_MCP_APPROVE' => ($auth->acl_get('m_approve', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&mode=approve_details&f=' . $forum_id . '&p=' . $row['post_id'], true, $user->session_id) : , 'U_MINI_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'p=' . $row['post_id']) . (($topic_data['topic_type'] == POST_GLOBAL) ? '&f=' . $forum_id : ) . '#p' . $row['post_id'], 'U_NEXT_POST_ID' => ($i < $i_total && isset($rowset[$post_list[$i + 1]])) ? $rowset[$post_list[$i + 1]]['post_id'] : , 'U_PREV_POST_ID' => $prev_post_id, 'U_NOTES' => ($auth->acl_getf_global('m_')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=notes&mode=user_notes&u=' . $poster_id, true, $user->session_id) : , 'U_WARN' => ($auth->acl_get('m_warn') && $poster_id != $user->data['user_id'] && $poster_id != ANONYMOUS) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=warn&mode=warn_post&f=' . $forum_id . '&p=' . $row['post_id'], true, $user->session_id) : ,

'POST_ID' => $row['post_id'], 'POSTER_ID' => $poster_id,

'S_HAS_ATTACHMENTS' => (!empty($attachments[$row['post_id']])) ? true : false, 'S_POST_UNAPPROVED' => ($row['post_approved']) ? false : true, 'S_POST_REPORTED' => ($row['post_reported'] && $auth->acl_get('m_report', $forum_id)) ? true : false, 'S_DISPLAY_NOTICE' => $display_notice && $row['post_attachment'], 'S_FRIEND' => ($row['friend']) ? true : false, 'S_UNREAD_POST' => $post_unread, 'S_FIRST_UNREAD' => $s_first_unread, 'S_CUSTOM_FIELDS' => (isset($cp_row['row']) && sizeof($cp_row['row'])) ? true : false, 'S_TOPIC_POSTER' => ($topic_data['topic_poster'] == $poster_id) ? true : false,

'S_IGNORE_POST' => ($row['hide_post']) ? true : false, 'L_IGNORE_POST' => ($row['hide_post']) ? sprintf($user->lang['POST_BY_FOE'], get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), '<a href="' . $viewtopic_url . "&p={$row['post_id']}&view=show#p{$row['post_id']}" . '">', '</a>') : , );

if (isset($cp_row['row']) && sizeof($cp_row['row'])) { $postrow = array_merge($postrow, $cp_row['row']); }

// Dump vars into template $template->assign_block_vars('postrow', $postrow);

if (!empty($cp_row['blockrow'])) { foreach ($cp_row['blockrow'] as $field_data) { $template->assign_block_vars('postrow.custom_fields', $field_data); } }

// Display not already displayed Attachments for this post, we already parsed them. ;) if (!empty($attachments[$row['post_id']])) { foreach ($attachments[$row['post_id']] as $attachment) { $template->assign_block_vars('postrow.attachment', array( 'DISPLAY_ATTACHMENT' => $attachment) ); } }

$prev_post_id = $row['post_id'];

unset($rowset[$post_list[$i]]); unset($attachments[$row['post_id']]); } unset($rowset, $user_cache);

// Update topic view and if necessary attachment view counters ... but only for humans and if this is the first 'page view' if (isset($user->data['session_page']) && !$user->data['is_bot'] && (strpos($user->data['session_page'], '&t=' . $topic_id) === false || isset($user->data['session_created']))) { $sql = 'UPDATE ' . TOPICS_TABLE . ' SET topic_views = topic_views + 1, topic_last_view_time = ' . time() . " WHERE topic_id = $topic_id"; $db->sql_query($sql);

// Update the attachment download counts if (sizeof($update_count)) { $sql = 'UPDATE ' . ATTACHMENTS_TABLE . ' SET download_count = download_count + 1 WHERE ' . $db->sql_in_set('attach_id', array_unique($update_count)); $db->sql_query($sql); } }

// Get last post time for all global announcements // to keep proper forums tracking if ($topic_data['topic_type'] == POST_GLOBAL) { $sql = 'SELECT topic_last_post_time as forum_last_post_time FROM ' . TOPICS_TABLE . ' WHERE forum_id = 0 ORDER BY topic_last_post_time DESC'; $result = $db->sql_query_limit($sql, 1); $topic_data['forum_last_post_time'] = (int) $db->sql_fetchfield('forum_last_post_time'); $db->sql_freeresult($result);

$sql = 'SELECT mark_time as forum_mark_time FROM ' . FORUMS_TRACK_TABLE . ' WHERE forum_id = 0 AND user_id = ' . $user->data['user_id']; $result = $db->sql_query($sql); $topic_data['forum_mark_time'] = (int) $db->sql_fetchfield('forum_mark_time'); $db->sql_freeresult($result); }

// Only mark topic if it's currently unread. Also make sure we do not set topic tracking back if earlier pages are viewed. if (isset($topic_tracking_info[$topic_id]) && $topic_data['topic_last_post_time'] > $topic_tracking_info[$topic_id] && $max_post_time > $topic_tracking_info[$topic_id]) { markread('topic', (($topic_data['topic_type'] == POST_GLOBAL) ? 0 : $forum_id), $topic_id, $max_post_time);

// Update forum info $all_marked_read = update_forum_tracking_info((($topic_data['topic_type'] == POST_GLOBAL) ? 0 : $forum_id), $topic_data['forum_last_post_time'], (isset($topic_data['forum_mark_time'])) ? $topic_data['forum_mark_time'] : false, false); } else { $all_marked_read = true; }

// If there are absolutely no more unread posts in this forum and unread posts shown, we can savely show the #unread link if ($all_marked_read) { if ($post_unread) { $template->assign_vars(array( 'U_VIEW_UNREAD_POST' => '#unread', )); } else if (isset($topic_tracking_info[$topic_id]) && $topic_data['topic_last_post_time'] > $topic_tracking_info[$topic_id]) { $template->assign_vars(array( 'U_VIEW_UNREAD_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&view=unread") . '#unread', )); } } else if (!$all_marked_read) { $last_page = ((floor($start / $config['posts_per_page']) + 1) == max(ceil($total_posts / $config['posts_per_page']), 1)) ? true : false;

// What can happen is that we are at the last displayed page. If so, we also display the #unread link based in $post_unread if ($last_page && $post_unread) { $template->assign_vars(array( 'U_VIEW_UNREAD_POST' => '#unread', )); } else if (!$last_page) { $template->assign_vars(array( 'U_VIEW_UNREAD_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&view=unread") . '#unread', )); } }

// let's set up quick_reply $s_quick_reply = false; if ($user->data['is_registered'] && $config['allow_quick_reply'] && ($topic_data['forum_flags'] & FORUM_FLAG_QUICK_REPLY) && $auth->acl_get('f_reply', $forum_id)) { // Quick reply enabled forum $s_quick_reply = (($topic_data['forum_status'] == ITEM_UNLOCKED && $topic_data['topic_status'] == ITEM_UNLOCKED) || $auth->acl_get('m_edit', $forum_id)) ? true : false; }

if ($s_can_vote || $s_quick_reply) { add_form_key('posting');

if ($s_quick_reply) { $s_attach_sig = $config['allow_sig'] && $user->optionget('attachsig') && $auth->acl_get('f_sigs', $forum_id) && $auth->acl_get('u_sig'); $s_smilies = $config['allow_smilies'] && $user->optionget('smilies') && $auth->acl_get('f_smilies', $forum_id); $s_bbcode = $config['allow_bbcode'] && $user->optionget('bbcode') && $auth->acl_get('f_bbcode', $forum_id); $s_notify = $config['allow_topic_notify'] && ($user->data['user_notify'] || $s_watching_topic['is_watching']);

$qr_hidden_fields = array( 'topic_cur_post_id' => (int) $topic_data['topic_last_post_id'], 'lastclick' => (int) time(), 'topic_id' => (int) $topic_data['topic_id'], 'forum_id' => (int) $forum_id, );

// Originally we use checkboxes and check with isset(), so we only provide them if they would be checked (!$s_bbcode) ? $qr_hidden_fields['disable_bbcode'] = 1 : true; (!$s_smilies) ? $qr_hidden_fields['disable_smilies'] = 1 : true; (!$config['allow_post_links']) ? $qr_hidden_fields['disable_magic_url'] = 1 : true; ($s_attach_sig) ? $qr_hidden_fields['attach_sig'] = 1 : true; ($s_notify) ? $qr_hidden_fields['notify'] = 1 : true; ($topic_data['topic_status'] == ITEM_LOCKED) ? $qr_hidden_fields['lock_topic'] = 1 : true;

$template->assign_vars(array( 'S_QUICK_REPLY' => true, 'U_QR_ACTION' => append_sid("{$phpbb_root_path}posting.$phpEx", "mode=reply&f=$forum_id&t=$topic_id"), 'QR_HIDDEN_FIELDS' => build_hidden_fields($qr_hidden_fields), 'SUBJECT' => 'Re: ' . censor_text($topic_data['topic_title']), )); } } // now I have the urge to wash my hands :(


// We overwrite $_REQUEST['f'] if there is no forum specified // to be able to display the correct online list. // One downside is that the user currently viewing this topic/post is not taken into account. if (empty($_REQUEST['f'])) { $_REQUEST['f'] = $forum_id; }

// We need to do the same with the topic_id. See #53025. if (empty($_REQUEST['t']) && !empty($topic_id)) { $_REQUEST['t'] = $topic_id; }

// Output the page page_header($user->lang['VIEW_TOPIC'] . ' - ' . $topic_data['topic_title'], true, $forum_id);

$template->set_filenames(array( 'body' => ($view == 'print') ? 'viewtopic_print.html' : 'viewtopic_body.html') ); make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"), $forum_id);

page_footer();

?>