[ABD] Reputation System

Any abandoned MODs will be moved to this forum.

WARNING: MODs in this forum are not currently being supported or maintained by the original MOD author. Proceed at your own risk.
Forum rules
IMPORTANT: MOD Development Forum rules

WARNING: MODs in this forum are not currently being supported nor updated by the original MOD author. Proceed at your own risk.
Locked
User avatar
Pico88
Registered User
Posts: 878
Joined: Sat Mar 07, 2009 10:24 pm
Location: Poland
Name: Lukasz

Re: [RC] Reputation System

Post by Pico88 » Sun Jun 24, 2012 11:45 am

That changed nothing.
You didn't undestand, what I wrote. In ACP and MCP, there are no default name for Reputation category, which were created during first installation. You had to rename or delete them. You can add them manually.
Please do not PM me for support.

User avatar
Pico88
Registered User
Posts: 878
Joined: Sat Mar 07, 2009 10:24 pm
Location: Poland
Name: Lukasz

Re: [RC] Reputation System

Post by Pico88 » Sun Jun 24, 2012 11:47 am

wbxpress wrote:This may be due to the fact, while updating viewtopic_body.html of my Aero theme. I found difficulty to find the below code:
CODE: SELECT ALL
<div class="inner"><span class="corners-top"><span></span></span>

and adding this piece of code after that
CODE: SELECT ALL
{postrow.L_RS_HIDE_POST}
Put {postrow.L_RS_HIDE_POST} after <div class="postbody">
Please do not PM me for support.

wbxpress
Registered User
Posts: 150
Joined: Wed Mar 21, 2012 1:29 pm
Contact:

Re: [RC] Reputation System

Post by wbxpress » Sun Jun 24, 2012 12:16 pm

I have created all the modules that I had deleted. It is made possible due the fact that I had already another forum in which 0.4.1 is installed. Now while installing new version I do not get the option to install or update. Only "Uninstall" is selected. What to do now?

Shall I uninstall first then reinstall? In this case will all the points be removed?

H3llion
Registered User
Posts: 228
Joined: Thu Oct 29, 2009 9:13 am

Re: [RC] Reputation System

Post by H3llion » Mon Jun 25, 2012 12:56 pm

I have an issue when trying to viewtopic for prosilver style.

Code: Select all

Parse error: syntax error, unexpected T_VARIABLE in /home/dreadcra/dreadcraft.net/forums/viewtopic.php on line 1970
Located Here:
http://dreadcraft.net/forums/viewtopic. ... =27&t=2024

Code in viewtopic.php


I checked the brackets and they seem to close everything fine (at least what I seen marked in notepad++). Can you see what is wrong? :roll:

Code: Select all

// Holding maximum post time for marking topic read

// We need to grab it because we do reverse ordering sometimes

$max_post_time = 0;



Find

// Reputation System
$sql_array = 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'
);


if ($config['rs_enable'] && $topic_data['enable_reputation'])
{
	$sql_array['LEFT_JOIN'][] = array('FROM' => array(REPUTATIONS_TABLE => 'r'), 'ON' => 'r.rep_from = ' . $user->data['user_id'] . ' AND r.post_id = p.post_id');
	$sql_array['SELECT'] .= ', r.rep_id AS rated';
}

$sql = $db->sql_build_query('SELECT', $sql_array);
//Reputation System
Edit:

Removed the mod for now, but still want to know what is the issue. Il reinstall it anyway and see if it persists (I installed x.0.1 version instead of the latest repack).

wbxpress
Registered User
Posts: 150
Joined: Wed Mar 21, 2012 1:29 pm
Contact:

Re: [RC] Reputation System

Post by wbxpress » Mon Jun 25, 2012 2:56 pm

How to make the default reputation point as +3 instead of +5?

User avatar
Pico88
Registered User
Posts: 878
Joined: Sat Mar 07, 2009 10:24 pm
Location: Poland
Name: Lukasz

Re: [RC] Reputation System

Post by Pico88 » Mon Jun 25, 2012 2:59 pm

Limit max power to 3, set gain and lose factors etc.
Please do not PM me for support.

wbxpress
Registered User
Posts: 150
Joined: Wed Mar 21, 2012 1:29 pm
Contact:

Re: [RC] Reputation System

Post by wbxpress » Mon Jun 25, 2012 5:30 pm

I want to keep max power +5.
Whenever someone want to rate a post, the default value shows +5, then he have the option to change it to whatever he like. I want the initial value set at +3. Is it possible?

H3llion
Registered User
Posts: 228
Joined: Thu Oct 29, 2009 9:13 am

Re: [RC] Reputation System

Post by H3llion » Mon Jun 25, 2012 6:19 pm

New Error with latest RS version. Happens in every topic.

Code: Select all

Fatal error: Cannot redeclare class reputation in /home/dreadcra/dreadcraft.net/forums/includes/functions_reputation.php on line 21
functions_reputation.php

Code: Select all

<?php
/**
*
* @package		Reputation System
* @author		Pico88 (Pico) (http://www.modsteam.tk)
* @co-author	Versusnja
* @copyright (c) 2012
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/

/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
	exit;
}

class reputation
{
	var $user_vote_power_current;
	var $user_vote_power_remaining;
	var $user_reputation;

	/**Function returns maximum voting power of one user
	* @param int $user_posts
	* @param $user_regdate
	* @param int $user_reputation
	* @param int $user_group_id
	* @param bool $explain Set to true if you want function to return string explaining structure of the user power
	* @return $user_max_power Value of maximum voting power
	*/
	function get_rep_power($user_posts, $user_regdate, $user_reputation, $user_group_id, $number_of_active_warnings, $number_of_ban_days_in_1year = 0, $explain_structure = false)
	{
		global $config, $db;
		$now = time();
		$user_power = array();

		//Increasing power for number of posts
		if ($config['rs_total_posts'] > 0)
		{
			$user_power['for_number_of_posts'] = round($user_posts / $config['rs_total_posts'], 0);
		}

		//Increasing power for the age of the user
		if ($config['rs_membership_days'] > 0)
		{
			$user_power['for_user_age'] = round(intval(($now - $user_regdate) / 86400) / $config['rs_membership_days'], 0);
		}

		//Increasing power for total reputation
		if ($config['rs_power_rep_point'] > 0)
		{
			$user_power['for_reputation'] = round($user_reputation / $config['rs_power_rep_point'], 0);
		}

		//Decreasing for warnings
		if ($config['rs_power_loose_warn'] > 0)
		{
			$user_power['for_warnings'] = -$number_of_active_warnings * $config['rs_power_loose_warn'];
		};

		//Decreasing for bans
		if ($config['rs_power_loose_ban'] > 0)
		{
			$user_power['for_bans'] = -$number_of_ban_days_in_1year * $config['rs_power_loose_ban'];
		};

		$user_max_power = array_sum($user_power);

		//Checking that user min power is not lower than minimum power set in ACP
		if ($user_max_power < $config['rs_min_power'])
		{
			$user_power['minimum_voting_power'] = $config['rs_min_power'];
			$user_max_power = max($config['rs_min_power'], $user_max_power);
		}

		//Checking that user max power is not higher than maximum power set in ACP
		if ($user_max_power > $config['rs_max_power'])
		{
			$user_power['maximum_voting_power'] = $config['rs_max_power'];
			$user_max_power = min($config['rs_max_power'], $user_max_power);
		}

		//Calculating group power, if necessary
		$group_power = 0;
		if ($user_group_id)
		{
			$sql = 'SELECT group_reputation_power
				FROM ' . GROUPS_TABLE . "
				WHERE group_id = $user_group_id";
			$result = $db->sql_query($sql);
			$group_power = (int)$db->sql_fetchfield('group_reputation_power');
			$db->sql_freeresult($result);

			if ($group_power)
			{
				$user_max_power = $group_power;
			}
		}

		//If you want to get explained structure of user power as a string
		if ($explain_structure)
		{
			$output = '';
			foreach($user_power as $reason => $value)
			{
				if ($value <> 0)
				{
					$output .= "$reason: $value";
				}
			}
			return $output;
		}

		return $user_max_power;
	}

	/**Function analyzes voting of a user and returns an array with statistics
	 *
	 */
	function get_reputation_stats($user_id)
	{
		global $db, $config;

		//That's what we will calculate
		$statistics = array(
			'bancounts'			=> 0,
			'vote_power_spent'	=> 0,
		);

		if ($config['rs_power_limit_time'] && $config['rs_power_limit_value'])
		{
			//Until what timestamp should we count user votes
			$voting_timeout = time() - $config['rs_power_limit_time'] * 3600;

			//Let's get all voting data on this user.
			$sql = 'SELECT *
				FROM ' . REPUTATIONS_TABLE . "
				WHERE rep_from = $user_id
					AND post_id != 0
					AND time > $voting_timeout";
			$result = $db->sql_query($sql);

			//Let's run through the rows and make statistics
			while($user_voting = $db->sql_fetchrow($result))
			{
				//How much power a user spent in a specified period of time
				$statistics['vote_power_spent'] += abs($user_voting['point']);
			}
			$db->sql_freeresult($result);
		}

		if ($config['rs_power_loose_ban'] > 0)
		{
			//Until what timestamp should we count user bans
			$bans_timeout = time() - 365 * 24 * 3600;

			$sql = 'SELECT COUNT(rep_id) AS total_bans
				FROM ' . REPUTATIONS_TABLE . "
				WHERE rep_to = $user_id
					AND warning = 2
					AND time > $bans_timeout";
			$result = $db->sql_query($sql);
			$row = $db->sql_fetchrow($result);

			$statistics['bancounts'] = $row['total_bans'];
		}

		return $statistics;
	}

	/**Main function for actual recording of voting points.
	* @param int $to user_id who gets the rating
	* @param int $post_id Option post id
	* @param string $comment
	* @param bool $notify Should we send a private message to the user, who got a new vote
	* @param int $point Actual value set by the voting user
	* @param string $mode
	* @return bool
	*/
	function give_point($to, $post_id = 0, $comment, $notify = false, $point, $mode = 'post')
	{
		global $phpEx, $phpbb_root_path, $config;
		global $template, $db, $user, $auth;

		//If config allows and we are told so, we should send a private message to a user, who received the vote
		if ($notify && $config['rs_pm_notify'])
		{
			include_once($phpbb_root_path . 'includes/functions_privmsgs.' . $phpEx);
			include_once($phpbb_root_path . 'includes/message_parser.' . $phpEx);

			$message_parser = new parse_message();

			if ($post_id)
			{
				$post_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'p=' . $post_id) . '#p' . $post_id;
				$post_link = '<a href="' . $post_url . '">';

				if (!empty($comment))
				{
					$message_parser->message = sprintf($user->lang['RS_PM_BODY_COMMENT'], $point, $comment, $post_link, '</a>');
				}
				else
				{
					$message_parser->message = sprintf($user->lang['RS_PM_BODY'], $point, $post_link, '</a>');
				}
			}
			elseif ($mode == 'user')
			{
				if (!empty($comment))
				{
					$message_parser->message = sprintf($user->lang['RS_PM_BODY_USER_COMMENT'], $point, $comment);
				}
				else
				{
					$message_parser->message = sprintf($user->lang['RS_PM_BODY_USER'], $point);
				}
			}

			$message_parser->parse(true, true, true, false, false, true, true);

			$pm_data = array(
				'from_user_id'		=> $user->data['user_id'],
				'from_user_ip'		=> $user->ip,
				'from_username'		=> $user->data['username'],
				'enable_sig'		=> false,
				'enable_bbcode'		=> true,
				'enable_smilies'	=> true,
				'enable_urls'		=> true,
				'icon_id'			=> 0,
				'bbcode_bitfield'	=> $message_parser->bbcode_bitfield,
				'bbcode_uid'		=> $message_parser->bbcode_uid,
				'message'			=> $message_parser->message,
				'address_list'		=> array('u' => array($to => 'to')),
			);

			submit_pm('post', $user->lang['RS_PM_SUBJECT'], $pm_data, false);
		}

		//Prepare comment text for storage
		$text = utf8_normalize_nfc($comment);
		$uid = $bitfield = $options = '';
		$allow_bbcode = $allow_urls = $allow_smilies = true;
		generate_text_for_storage($text, $uid, $bitfield, $options, $allow_bbcode, $allow_urls, $allow_smilies);

		//Now we are ready to save the vote itself
		$sql_data = array(
			'rep_from'			=> $user->data['user_id'],
			'rep_to'			=> $to,
			'time'				=> time(),
			'post_id'			=> $post_id,
			'user'				=> ($mode == 'user') ? 1 : 0,
			'warning'			=> ($mode == 'ban') ? 2 : (($mode == 'warning') ? 1 : 0),
			'point'				=> $point,
			'comment'			=> $text,
			'bbcode_bitfield'	=> $bitfield,
			'bbcode_uid'		=> $uid,
			'enable_bbcode'		=> $allow_bbcode,
			'enable_urls'		=> $allow_urls,
			'enable_smilies'	=> $allow_smilies,
		);

		//Saving the vote. Used for post rating calculation. Not for user rating calculation
		$db->sql_query('INSERT INTO ' . REPUTATIONS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_data));

		//Nofity user about the point
		$new_points = '';
		if ($config['rs_notification'])
		{
			$sql = 'SELECT user_rep_new
				FROM ' . USERS_TABLE . " 
				WHERE user_id = $to";
			$result = $db->sql_query($sql);
			$rep_new = $db->sql_fetchrow($result);
			$db->sql_freeresult($result);

			$rep_last_time = !$rep_new['user_rep_new'] ? ', user_rep_last = ' . time() . '' : '';
			$new_points = ', user_rep_new = user_rep_new + 1' . $rep_last_time;
		}

		//Caching user reputation
		$sql = 'UPDATE ' . USERS_TABLE . "
			SET user_reputation = user_reputation + $point
				$new_points
			WHERE user_id = $to";
		$db->sql_query($sql);

		//Max user reputation
		if ($config['rs_max_point'])
		{
			$this->check_point($to, 'max');
		}

		//Min user reputation
		if ($config['rs_min_point'])
		{
			$this->check_point($to, 'min');
		}

		//Post reputation
		if ($post_id)
		{
			$post_rs_count = ($point > 0) ? 1 : -1;

			$sql = 'UPDATE ' . POSTS_TABLE . "
				SET post_reputation = post_reputation + $point,
					post_rs_count = post_rs_count + $post_rs_count
				WHERE post_id = $post_id";
			$db->sql_query($sql);
		}

		if ($config['rs_enable_ban'] && $mode != 'ban')
		{
			$this->ban_user($to);
		}

		return true;
	}

	/**
	* @param int $user_id user ID
	* @param string $mode max or min
	*/
	function check_point($user_id, $mode)
	{
		global $config, $db;

		if ($mode == 'max')
		{
			$point = $config['rs_max_point'];
			$sql_where = 'user_reputation > ' . $config['rs_max_point'];
		}
		elseif ($mode == 'min')
		{
			$point = $config['rs_min_point'];
			$sql_where = 'user_reputation < ' . $config['rs_min_point'];
		}
		
		$sql = 'UPDATE ' . USERS_TABLE . "
			SET user_reputation = $point
			WHERE $sql_where
				AND user_id = $user_id";
		$db->sql_query($sql);
	}

	function delete($id = '', $post_id = false)
	{
		global $db, $user, $uid;

		$sql = 'SELECT rep_from, rep_to, point
			FROM ' . REPUTATIONS_TABLE . " r
			WHERE rep_id = $id";
		$result = $db->sql_query($sql);
		$row = $db->sql_fetchrow($result);
		$db->sql_freeresult($result);

		if ($post_id)
		{
			$post_rs_count = ($row['point'] > 0) ? 1 : -1;

			$sql = 'UPDATE ' . POSTS_TABLE . "
				SET post_reputation = post_reputation - {$row['point']},
					post_rs_count = post_rs_count - $post_rs_count
				WHERE post_id = $post_id";
			$db->sql_query($sql);
		}

		$sql = 'UPDATE ' . USERS_TABLE . "
			SET user_reputation = user_reputation - {$row['point']}
			WHERE user_id = {$row['rep_to']}";
		$db->sql_query($sql);

		$sql = 'DELETE FROM ' . REPUTATIONS_TABLE . "
			WHERE rep_id = $id";
		$db->sql_query($sql);

		return true;
	}

	function get_rs_rank($points)
	{
		global $cache, $db;

		if ($cache->get('_rs_ranks') === false)
		{
			$ranks = array();
			$sql = 'SELECT rank_title, rank_points, rank_color
				FROM ' . REPUTATIONS_RANKS_TABLE . '
				ORDER BY rank_points DESC';
			$result = $db->sql_query($sql);

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

			$cache->put('_rs_ranks', $ranks);
		}
		else
		{
			$ranks = $cache->get('_rs_ranks');
		}

		$rs_rank_title = '';
		foreach ($ranks as $rank)
		{
			if ($points >= $rank['rank_points'])
			{
				$rs_rank_title = $rank['rank_title'];
				break;
			}
		}

		return $rs_rank_title;
	}

	function get_rs_rank_color($rs_rank)
	{
		global $cache;

		$ranks = $cache->get('_rs_ranks');

		$rs_rank_color = '';
		foreach ($ranks as $rank)
		{
			if ($rs_rank == $rank['rank_title'])
			{
				$rs_rank_color = $rank['rank_color'];
				break;
			}
		}

		return $rs_rank_color;
	}

	/** Returns the rating of a post.
	* @param $post_id ID of a post
	* @param bool $true_rating If true returns sum of rating points. Otherwise returns count of votes
	*/
	function get_rating($post_id, $true_rating = true)
	{
		global $db;
		$sql = 'SELECT ' . ($true_rating ? 'post_reputation' : 'post_rs_count') . ' as rating
			FROM ' . POSTS_TABLE . "
			WHERE post_id = $post_id";
		$result = $db->sql_query($sql);
		$row = $db->sql_fetchrow($result);
		$db->sql_freeresult($result);

		return $row['rating'];
	}

	/**
	* @param $vote Rating value
	* @return string String value of CSS class for voting placeholder
	*/
	static function get_vote_class($vote)
	{
		if ($vote == 0) return 'zero';
		if ($vote < 0) return 'negative';
		if ($vote > 0) return 'positive';
	}

	/** Returns user reputation.
	* @param $user_id user ID
	*/
	function get_user_reputation($user_id)
	{
		global $db;

		$sql = 'SELECT user_reputation as reputation
			FROM ' . USERS_TABLE . "
			WHERE user_id = $user_id";
		$result = $db->sql_query($sql);
		$row = $db->sql_fetchrow($result);
		$db->sql_freeresult($result);

		return $row['reputation'];
	}

	/** Ban user by minimum reputation;
	* @param $user_id user ID
	*/
	function ban_user($user_id)
	{
		global $config, $db, $cache;

		//Get data for ban
		$sql = 'SELECT user_type, group_id, user_reputation, user_last_rep_ban
			FROM ' . USERS_TABLE . "
			WHERE user_id = $user_id";
		$result = $db->sql_query($sql);
		$user_row = $db->sql_fetchrow($result);
		$db->sql_freeresult($result);

		//Prevent ban founder
		if ($user_row['user_type'] == USER_FOUNDER)
		{
			return;
		}

		//Check user group if it is excluded
		$groups_id = explode(',', $config['rs_ban_groups']);
		$group_id = (is_array($groups_id)) ? (in_array($user_row['group_id'], $groups_id) ? true : false) : (($user_row['group_id'] == $groups_id) ? true : false);
		if ($group_id)
		{
			return;
		}
		
		//Shield for banned user - cannot be banned in that period
		if (time() < $user_row['user_last_rep_ban'])
		{
			return;
		}

		$sql = 'SELECT *
			FROM ' . REPUTATIONS_BANS_TABLE . '
			ORDER BY point ASC';
		$result = $db->sql_query($sql);

		while ($row = $db->sql_fetchrow($result))
		{
			if ($user_row['user_reputation'] <= $row['point'])
			{
				//Now, let's ban the user
				//We cannot use user_ban function due to an error of redecaler function so lest's write own sql query
				$current_time = time();
				$ban_end = max($current_time, $current_time + ($row['ban_time']) * 60);
				$sql_ary = array(
					'ban_userid'		=> $user_id,
					'ban_start'			=> time(),
					'ban_end'			=> $ban_end,
					'ban_reason'		=> $row['ban_reason'],
					'ban_give_reason'	=> $row['ban_give_reason'],
				);

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

				$cache->destroy('sql', BANLIST_TABLE);

				//Shield for banned
				$next_ban_time = time() + ($row['ban_time'] * 60) + ($config['rs_ban_shield'] * 86400);
				$sql = 'UPDATE ' . USERS_TABLE . "
					SET user_last_rep_ban = $next_ban_time
					WHERE user_id = $user_id";
				$db->sql_query($sql);

				break;
			}
		}
		$db->sql_freeresult($result);
	}
}

?>
viewtopic.php

Code: Select all

<?php

/**

*

* @package phpBB3

* @version $Id$

* @copyright (c) 2005 phpBB Group

* @license http://opensource.org/licenses/gpl-license.php GNU Public License

*

*/



/**

* @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);
include($phpbb_root_path . 'includes/functions_reputation.' . $phpEx);
include($phpbb_root_path . 'includes/functions_reputation.' . $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']);
//Reputation System
$user->add_lang('mods/reputation_system');
//Reputation System
// Reputation System
$user->add_lang('mods/reputation_system');
// Reputation System



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 == 0) ? '' : "&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']) . '<br /><br />' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $viewtopic_url . '">', '</a>');

	}

	else

	{

		$message = $user->lang['BOOKMARK_ERR'] . '<br /><br />' . 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']);



$s_search_hidden_fields = array(

	't' => $topic_id,

	'sf' => 'msgonly',

);

if ($_SID)

{

	$s_search_hidden_fields['sid'] = $_SID;

}



// 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 == 0) ? '' : "&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 == 0) ? '' : "&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 == 0) ? '' : "&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"),

	'S_SEARCH_LOCAL_HIDDEN_FIELDS'	=> build_hidden_fields($s_search_hidden_fields),



	'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,
	//Reputation System
	'S_ENABLE_REPUTATION'	=> ($topic_data['enable_reputation']) ? true : false,
	//Reputation System
	//Reputation System
	'S_ENABLE_REPUTATION'	=> ($topic_data['enable_reputation']) ? true : false,
	//Reputation System



	'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 == 0) ? '' : "&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] . '<br /><br />' . 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 == 0) ? '' : "&start=$start"));



		meta_refresh(5, $redirect_url);

		trigger_error($user->lang['VOTE_SUBMITTED'] . '<br /><br />' . 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;

//Reputation System
$sql_array = 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'
);

if ($config['rs_enable'] && $topic_data['enable_reputation'])
{
	$sql_array['LEFT_JOIN'][] = array('FROM' => array(REPUTATIONS_TABLE => 'r'), 'ON' => 'r.rep_from = ' . $user->data['user_id'] . ' AND r.post_id = p.post_id');
	$sql_array['SELECT'] .= ', r.rep_id AS rated, r.point AS voting_points';
}

$sql = $db->sql_build_query('SELECT', $sql_array);
//Reputation System



$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'],
		//Reputation System
		'post_reputation'	=> $row['post_reputation'],
		'post_rs_count'		=> $row['post_rs_count'],
		'rated' 			=> (isset($row['rated'])) ? true : false,
		'post_vote_class'	=> (isset($row['rated'])) ? ($row['voting_points'] > 0 ? 'rated_good' : 'rated_bad') : '',
		'voting_points'		=> (isset($row['voting_points'])) ? $row['voting_points'] : 0,
		'rs_hide_post'		=> (($row['post_reputation'] <= $config['rs_hide_post']) && ($view != 'display' || $post_id != $row['post_id'])) ? true : false,
		//Reputation System
		'post_reputation'	=> $row['post_reputation'],
		'post_rs_count'		=> $row['post_rs_count'],
		'rated' 			=> (isset($row['rated'])) ? true : false,



		// 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'	=> '',

				'extra_rank_title'		=> '',
				'extra_rank_image'		=> '',
				'extra_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,
				'reputation'		=> '',
				'reputation'		=> '',

			);



			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'] : '',
				'reputation'	=> $row['user_reputation'],
				'reputation'	=> $row['user_reputation'],



				'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'	=> '',



				'extra_rank_title'		=> '',
				'extra_rank_image'		=> '',
				'extra_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 (defined('SHOW_SPECIAL_AS_EXTRA') && SHOW_SPECIAL_AS_EXTRA)
			{
				$user_cache[$poster_id]['extra_rank_title'] = $user_cache[$poster_id]['rank_title'];
				$user_cache[$poster_id]['extra_rank_image'] = $user_cache[$poster_id]['rank_image'];
				$user_cache[$poster_id]['extra_rank_image_src'] = $user_cache[$poster_id]['rank_image_src'];
				$user_cache[$poster_id]['rank_title'] = $user_cache[$poster_id]['rank_image'] = $user_cache[$poster_id]['rank_image_src'] = '';

				get_user_additional_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']);
			}
			else
			{
				get_user_additional_rank($row['user_rank'], $row['user_posts'], $user_cache[$poster_id]['extra_rank_title'], $user_cache[$poster_id]['extra_rank_image'], $user_cache[$poster_id]['extra_rank_image_src']);
			}
			if ((!empty($row['user_allow_viewemail']) && $auth->acl_get('u_sendemail')) || $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/' . urlencode($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', '<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']);

	}



	// 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']
)));
	//Reputation System
	$post_rep_sum = ($config['rs_post_display']) ? $row['post_reputation'] : $row['post_rs_count'];
	$reputation_box = reputation::get_vote_class($post_rep_sum);
	$rs_ajax = ($config['rs_ajax_enable']) ? 'ajax=1&' : '';

	//Hide post if it has too low rating?
	$hide_post_with_too_low_rating = (!empty($config['rs_hide_post']) && ($row['post_reputation'] <= $config['rs_hide_post']) && $view != 'display' && $config['rs_enable']) ? true : false;
	$hidden_post_message = '';
	if ($hide_post_with_too_low_rating)
	{
		if ($config['rs_ajax_enable'])
		{
			$hidden_post_message = '<div>' . sprintf($user->lang['RS_HIDE_POST'], get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), '<a href="" class="show_hide_post" onclick="return false;">', $user->lang['RS_SHOW_HIDE_HIDDEN_POST'], '</a>') . '</div>';
		}
		else
		{
			$hidden_post_message = (!empty($config['rs_hide_post']) && $row['rs_hide_post'] && $config['rs_enable']) ? sprintf($user->lang['RS_HIDE_POST'], get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), '<a href="' . $viewtopic_url . "&p={$row['post_id']}&view=display#p{$row['post_id']}" . '">', $user->lang['RS_SHOW_HIDDEN_POST'], '</a>') : '';
		}

	}
	//Reputation System
	//Reputation System
	$post_rep_sum = ($config['rs_post_display']) ? $row['post_reputation'] : $row['post_rs_count'];
	$reputation_box = reputation::get_vote_class($post_rep_sum);
    $rs_ajax = ($config['rs_ajax_enable']) ? 'ajax=1&' : '';
	//Reputation System



	//

	$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'],
		'EXTRA_RANK_TITLE'	=> $user_cache[$poster_id]['extra_rank_title'],
		'EXTRA_RANK_IMG'	=> $user_cache[$poster_id]['extra_rank_image'],
		'EXTRA_RANK_IMG_SRC'=> $user_cache[$poster_id]['extra_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', 'UNREAD_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'],

		'POST_NUMBER'		=> $i + $start + 1,

		'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,
		// Reputation System
		'S_GIVE_REPUTATION'	=> ($auth->acl_get('f_rs_give', $forum_id) && $auth->acl_get('u_rs_ratepost') && $poster_id != ANONYMOUS) ? true : false,
		'S_GIVE_NEGATIVE'	=> ($auth->acl_get('f_rs_give_negative', $forum_id) && $config['rs_negative_point']) ? true : false,
		'S_RS_HIDE_POST'	=> (!empty($config['rs_hide_post']) && $row['rs_hide_post'] && $config['rs_enable']) ? true : false,
		'L_RS_HIDE_POST'	=> $hidden_post_message,
		'POST_REP'			=> $post_rep_sum,
		'REPUTATION_BOX'	=> $reputation_box,
		'U_REPUTATION'		=> $user_cache[$poster_id]['reputation'],
		'U_VIEW_REP' 		=> ($auth->acl_get('u_rs_view') || $poster_id == $user->data['user_id']) ? append_sid("{$phpbb_root_path}reputation.$phpEx", '&mode=postdetails&' . $rs_ajax . 'p=' . $row['post_id']) : '',
		'U_VIEW_REP_LIST'	=> ($auth->acl_get('u_rs_view')) ? append_sid("{$phpbb_root_path}reputation.$phpEx", '&mode=details&' . $rs_ajax . 'u=' . $poster_id) : '',
		'U_ADD_POS' 		=> append_sid("{$phpbb_root_path}reputation.$phpEx", '&mode=ratepost&' . $rs_ajax . 'p=' . $row['post_id']),
		'U_ADD_NEG' 		=> append_sid("{$phpbb_root_path}reputation.$phpEx", '&mode=ratepost&' . $rs_ajax . 'p=' . $row['post_id'] . '&point=negative'),
		//Own post? Too low rating? Rated_good? Rated_bad?
		'RS_POST_CLASS'		=> ($user->data['user_id'] == $poster_id ? 'own' : "") . $row['post_vote_class'] . ($hide_post_with_too_low_rating ? ' too_low_rating' : ''),
		'RS_VOTED_POINTS'	=> $row['voting_points'],
		// Reputation System
		// Reputation System
		'S_GIVE_REPUTATION'	=> ($auth->acl_get('f_rs_give', $forum_id) && $auth->acl_get('u_rs_ratepost') && $user->data['user_id'] != $poster_id && $poster_id != ANONYMOUS && !$row['rated']) ? true : false,
		'S_GIVE_NEGATIVE'	=> ($auth->acl_get('f_rs_give_negative', $forum_id) && $config['rs_negative_point']) ? true : false,
		'S_RS_HIDE_POST'	=> (!empty($config['rs_hide_post']) && ($row['post_reputation'] <= $config['rs_hide_post']) && $view != 'display' && $config['rs_enable']) ? true : false,
		'L_RS_HIDE_POST'	=> (!empty($config['rs_hide_post']) && ($row['post_reputation'] <= $config['rs_hide_post']) && $config['rs_enable']) ? sprintf($user->lang['RS_HIDE_POST'], get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), '<a href="' . $viewtopic_url . "&p={$row['post_id']}&view=display#p{$row['post_id']}" . '">', '</a>') : '',
		'POST_REP'		=> $post_rep_sum,
		'REPUTATION_BOX'	=> $reputation_box,
		'U_REPUTATION'		=> $user_cache[$poster_id]['reputation'],
		'U_VIEW_REP' 		=> ($auth->acl_get('u_rs_view') || $poster_id == $user->data['user_id']) ? append_sid("{$phpbb_root_path}reputation.$phpEx", '&mode=postdetails&' . $rs_ajax . 'p=' . $row['post_id']) : '',
		'U_VIEW_REP_LIST' 	=> ($auth->acl_get('u_rs_view')) ? append_sid("{$phpbb_root_path}reputation.$phpEx", '&mode=details&' . $rs_ajax . 'u=' . $poster_id) : '',
		'U_ADD_POS' 		=> append_sid("{$phpbb_root_path}reputation.$phpEx", '&mode=ratepost&' . $rs_ajax . 'p=' . $row['post_id']),
		'U_ADD_NEG' 		=> append_sid("{$phpbb_root_path}reputation.$phpEx", '&mode=ratepost&' . $rs_ajax . 'p=' . $row['post_id'] . '&point=negative'),
		// Reputation System



		'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();



?>

Versusnja
Registered User
Posts: 39
Joined: Tue Jan 12, 2010 9:58 am

Re: [RC] Reputation System

Post by Versusnja » Mon Jun 25, 2012 6:52 pm

wbxpress wrote:I want to keep max power +5.
Whenever someone want to rate a post, the default value shows +5, then he have the option to change it to whatever he like. I want the initial value set at +3. Is it possible?
Currently there is no such option. The drop down menu shows maximum possible value.

User avatar
Pico88
Registered User
Posts: 878
Joined: Sat Mar 07, 2009 10:24 pm
Location: Poland
Name: Lukasz

Re: [RC] Reputation System

Post by Pico88 » Mon Jun 25, 2012 7:21 pm

arti-x wrote:New Error with latest RS version. Happens in every topic.

CODE: SELECT ALL
Fatal error: Cannot redeclare class reputation in /home/dreadcra/dreadcraft.net/forums/includes/functions_reputation.php on line 21
You have got 2x include($phpbb_root_path . 'includes/functions_reputation.' . $phpEx); in viewtopic.php
Remove one of them.
Please do not PM me for support.

User avatar
Pico88
Registered User
Posts: 878
Joined: Sat Mar 07, 2009 10:24 pm
Location: Poland
Name: Lukasz

Re: [RC] Reputation System

Post by Pico88 » Mon Jun 25, 2012 7:24 pm

wbxpress wrote:I want to keep max power +5.
Whenever someone want to rate a post, the default value shows +5, then he have the option to change it to whatever he like. I want the initial value set at +3. Is it possible?
Each user can set default power in their reputation setting.

As said Versusnja, the drop down menu shows maximum possible value, but you can change it to show a minimum.
Please do not PM me for support.

H3llion
Registered User
Posts: 228
Joined: Thu Oct 29, 2009 9:13 am

Re: [RC] Reputation System

Post by H3llion » Mon Jun 25, 2012 7:41 pm

Pico88 wrote:
arti-x wrote:New Error with latest RS version. Happens in every topic.

CODE: SELECT ALL
Fatal error: Cannot redeclare class reputation in /home/dreadcra/dreadcraft.net/forums/includes/functions_reputation.php on line 21
You have got 2x include($phpbb_root_path . 'includes/functions_reputation.' . $phpEx); in viewtopic.php
Remove one of them.
Yes Sir! It is not the first time I would have duplicate entries causing issues. :)

wbxpress
Registered User
Posts: 150
Joined: Wed Mar 21, 2012 1:29 pm
Contact:

Re: [RC] Reputation System

Post by wbxpress » Tue Jun 26, 2012 3:22 am

Thank you. :D

I need another support.
Whenever I enable AJAX, no popup comes instead a un-styled white page comes. However working fine. Can I have the beautiful popup enabled?

H3llion
Registered User
Posts: 228
Joined: Thu Oct 29, 2009 9:13 am

Re: [RC] Reputation System

Post by H3llion » Wed Jun 27, 2012 8:20 pm

Having issue again with resizing / auto-scaling of buttons. Re-uploaded my backup imageset.cfg and still nothing (yes refresh cooks, styles, cache).

http://i.imgur.com/3TjMf.png

Even deleted imageset.cfg and still same issue, which is odd.


Fixed.

Downloaded brand new 2.0.6 AcidTech images cfgs and uploaded, oddly fixed it all up :)

evepowr
Registered User
Posts: 85
Joined: Sun Jan 04, 2004 6:54 pm
Contact:

Re: [RC] Reputation System

Post by evepowr » Thu Jun 28, 2012 12:49 am

Hey pico. Awesome mod by the way. Also wanted to note for everyone that making this work for subsilver is very simple. Literally just replace a few lines that they wanted to do with the prosilver version. Takes an hour tops for people who arent familar with phpbb3.

Anyways i had a quick question. Since rep is also used as a currency. Do you have any plans to make the following 2 features in the near future.

1 - Allow a filter that will display posts based on the reputation power they have. So i could go into a forum and the posts with the highest rep can be shown in descending order.

2 - Can you make it easier to give rep to members. Its somewhat of a hassle that only the admins can do it by going thru the mod control panel. Would be great if i could set it so at the user control panel maybe we mods / admins / users selected. Could give like 100 rep.

Locked

Return to “[3.0.x] Abandoned MODs”