<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- $Header: F:\CVS/4.x/Who-has-read-thread.xml,v 1.51 2010/12/30 02:05:17 Pem Exp $ -->
<product productid="paulm_wrt_40" active="1">
	<title>Who Has Read a Thread</title>
	<description>Display members who have read a thread.</description>
	<version>4.1.2</version>
	<dependencies>
		<dependency dependencytype="vbulletin" minversion="4.0.8" maxversion="4.1.99" />
	</dependencies>
	<codes>
		<code version="*">
			<installcode><![CDATA[
// Install Code v4.0.4 //
$pidlist = array(
'paulm_20050716', 'paulm_wrt_37', 'paulm_wrt_38',
);
function ilog($text,$crlf=0,$red=0,$sleep=0)
{ $op = '<center>'; if($red) {$op.='<font color="red">';}	
  $op .= $text; if($red) {$op .= '</font>';}	
  $op .= '</center>';	if($crlf) {$op .= '<br />';}
  echo $op; vbflush(); sleep($sleep);
}
foreach ($pidlist as $oldpid)
{if ($system_versions['products'][$oldpid])
 {delete_product($oldpid);
  if (!$flag) {$flag = true; ilog('<u>The following products have been removed</u><br />',1,1,0);}; $flag = true;
  ilog($system_versions['products'][$oldpid]['title'].', Version '.$system_versions['products'][$oldpid]['version'],1,1,1);
}} 
$info['url'] = 'http://www.vbulletin.org/forum/misc.php?do=producthelp&pid='.$info['productid'];
$info['versioncheckurl'] = 'http://www.vbulletin.org/forum/misc.php?do=productcheck&pid='.$info['productid'];
ilog("<b><u>{$info['title']}</u></b>",1);
ilog("Installing : Version {$info['version']} ; ".substr(substr('$Revision: 1.51 $',1),0,-1),1);
ilog('Please remember to <b>Mark as Installed</b> at vBulletin.org',1,0,4);
]]></installcode>
			<uninstallcode><![CDATA[
function ilog($text,$crlf=0,$red=0,$sleep=0)
{ $op = '<center>'; if($red) {$op.='<font color="red">';}	
  $op .= $text; if($red) {$op .= '</font>';}	
  $op .= '</center>';	if($crlf) {$op .= '<br />';}
  echo $op; vbflush(); sleep($sleep);
}
ilog("Uninstalling $safe_productid",1,0,1);
ilog('Remember to <b>Mark as Uninstalled</b> at vBulletin.org',1,0,4);
]]></uninstallcode>
		</code>
		<code version="4.0.1">
			<installcode><![CDATA[
ilog('Processing : Version 4.0.1',1,0,1);

// Creating Who-Read Table //
require_once(DIR . '/includes/class_dbalter.php');
$db_alter = new vB_Database_Alter_MySQL($vbulletin->db);
$db_alter->fetch_table_info('whoread');
$sql = "CREATE TABLE ".TABLE_PREFIX."whoread (
		userid int(10) unsigned NOT NULL default 0,
		threadid int(10) unsigned NOT NULL default 0,
		dateline int(10) unsigned NOT NULL default 0,
		ipaddress char(15) NOT NULL default '',
		PRIMARY KEY (userid,threadid),
		KEY dateline (threadid,dateline))
";
if($db_alter->query($sql))
{
	ilog('Created Who-Read Table',1,0,1);
	ilog('Processing Thread Reads Data, This can take a while, Please wait ....',1,0,1);
	$sql = "INSERT INTO ".TABLE_PREFIX."whoread 
			(SELECT userid,threadid,readtime,'Unknown' FROM ".TABLE_PREFIX."threadread)
			";
	if($db_alter->query($sql))
	{
		$count = $vbulletin->db->query_first_slave("SELECT COUNT(*) AS rows FROM ".TABLE_PREFIX."whoread");
		$rows = $count['rows'];
		ilog("Processed $rows Records",1,0,1);
	}
}

// Creating Who-Read Column //
$wread = array(
	'name' => 'wrdate',
	'type' => 'text',
	'null' => false
);
$db_alter->fetch_table_info('thread');
if($db_alter->add_field($wread))
{
	ilog('Added Who-Read Column to Thread Table',1,0,1);
}
unset($db_alter);
]]></installcode>
			<uninstallcode><![CDATA[
ilog('Processing : Version 4.0.1',1,0,1);

// Dropping Who-Read Table //
require_once(DIR . '/includes/class_dbalter.php');
$db_alter = new vB_Database_Alter_MySQL($vbulletin->db);
$db_alter->fetch_table_info('whoread');
$sql = "DROP TABLE ".TABLE_PREFIX."whoread";
if($db_alter->query($sql))
{
	ilog('Deleted Who-Read Table',1,0,1);
}

// Dropping Who-Read Column //
$db_alter->fetch_table_info('thread');
if($db_alter->drop_field('wrdate'))
{
	ilog('Removed Who-Read Column from Thread Table',1,0,2);
}
unset($db_alter);
]]></uninstallcode>
		</code>
		<code version="4.0.18">
			<installcode><![CDATA[
ilog('Processing : Version 4.0.18',1,0,1);

// Update Options //
function wrt_forum($forum)
{
	$intforum = intval($forum);
	$intforum = $intforum ? $intforum : -1 ;
	return $intforum;
}

if (substr($vbulletin->options['wrtgrps'],0,2) != 'a:')
{
	$array = explode(',',$vbulletin->options['wrtgrps']);
	$array = array_map('intval',$array);
	$array = array_unique($array);
	$vbulletin->options['wrtgrps'] = serialize($array);
}

if (substr($vbulletin->options['wrtipgrps'],0,2) != 'a:')
{
	$array = explode(',',$vbulletin->options['wrtipgrps']);
	$array = array_map('intval',$array);
	$array = array_unique($array);
	$vbulletin->options['wrtipgrps'] = serialize($array);
}

if (substr($vbulletin->options['wrtswitchgrps'],0,2) != 'a:')
{
	$array = explode(',',$vbulletin->options['wrtswitchgrps']);
	$array = array_map('intval',$array);
	$array = array_unique($array);
	$vbulletin->options['wrtswitchgrps'] = serialize($array);
}

if (substr($vbulletin->options['wrtforums'],0,2) != 'a:')
{
	$array = explode(',',$vbulletin->options['wrtforums']);
	$array = array_map('wrt_forum',$array);
	$array = array_unique($array);
	$vbulletin->options['wrtforums'] = serialize($array);
}
]]></installcode>
			<uninstallcode><![CDATA[
ilog('Processing : Version 4.0.18',1,0,1);
]]></uninstallcode>
		</code>
	</codes>
	<templates>
		<template name="custom_wrt.css" templatetype="template" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[
.pemtable {
	font-weight: bold;
	text-align: center;
}

.pemtable td {
	padding:8px;
	vertical-align:top;
	border-left:1px solid #cedfeb;
	border-right:1px solid #cedfeb;
	border-bottom:1px solid #cedfeb;
}

.pemtable .alt1 {
	background:rgb(255, 255, 255) bottom repeat-x;
}

.pemtable .alt2 {
	background-color:rgb(240,242,250);
}

.pemtable .left {
	text-align: {vb:stylevar left};
}

.pemtable .right {
	text-align: {vb:stylevar right};
}

.pemtable .normal {
	font-weight: normal;
}
]]></template>
		<template name="Display_Readers" templatetype="template" date="1255000000" username="Paul M" version="4.0.17"><![CDATA[
	<!-- $Id: Who-has-read-thread.xml,v 1.51 2010/12/30 02:05:17 Pem Exp $ -->
	<div class="collapse">
		<h4 class="threadinfohead blockhead">
		<a name="wrt" class="collapse" id="collapse_wrt_list" href="{vb:raw relpath}#top"><img src="{vb:stylevar imgdir_button}/collapse{vb:raw wrt.collapse}.png" alt="" title="{vb:rawphrase wrt_col}" /></a>
		{vb:raw wrt.trtitle}</h4>
		<div id="thread_wrt" class="thread_info_block blockbody formcontrols">
			<div class="inner_block" id="wrt_list" {vb:raw wrt.style}>
				<div>
					<p>
						<vb:if condition="$show['wrt_set'] OR $show['wrt_clear'] OR $show['wrt_readers']">{vb:rawphrase wrt_actions}</vb:if>
						<vb:if condition="$show['wrt_readers']"><span>&nbsp;(<a href="misc.php?do=wrtviewall&amp;t={vb:raw wrt.threadid}" title="{vb:phrase wrt_view_all_title}">{vb:phrase wrt_view_all}</a>)</span></vb:if>
						<vb:if condition="$show['wrt_set']"><span>&nbsp;(<a href = "misc.php?do=wrtset&amp;t={vb:raw wrt.threadid}" title="{vb:phrase wrt_set_title}">{vb:phrase wrt_set}</a>)</span></vb:if>
						<vb:if condition="$show['wrt_clear']"><span>&nbsp;(<a href = "misc.php?do=wrtclear&amp;t={vb:raw wrt.threadid}" title="{vb:phrase wrt_clear_title}">{vb:phrase wrt_clear}</a>)</span></vb:if>
					</p>
					<vb:if condition="$show['wrt_readers']">
						<vb:if condition="$wrt['trtotal'] == 0">
							{vb:phrase wrt_no_names} 
						<vb:else />
							<ol class="commalist" id="showthread_wrt_list">
								{vb:raw wrt.list}
							</ol>
						</vb:if>
					<vb:else />
						{vb:phrase wrt_no_readers} 
					</vb:if>
				</div>
			</div>
		</div>
	</div>
	<!-- PEM 4.0 -->
]]></template>
		<template name="Display_Readers_Bit" templatetype="template" date="1260000000" username="Paul M" version="4.0.0"><![CDATA[<li>{vb:stylevar dirmark} <a class="username" href="misc.php?do=wrtviewuser&amp;u={vb:raw threadreader.userid}" title="{vb:raw threadreader.wrdate}">{vb:raw threadreader.musername}</a>{vb:raw threadreader.markinv}</li>]]></template>
		<template name="Display_Readers_View_User" templatetype="template" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[
{vb:stylevar htmldoctype}
<html xmlns="http://www.w3.org/1999/xhtml" dir="{vb:stylevar textdirection}" lang="{vb:stylevar languagecode}" id="vbulletin_html">
<head>
	{vb:raw headinclude}
	<title>{vb:raw wrt.header}</title>
	<link rel="stylesheet" type="text/css" href="{vb:raw vbcsspath}custom_wrt.css" />
	{vb:raw headinclude_bottom}
</head>
	<body>
	{vb:raw header}
	{vb:raw navbar}
	<!-- main -->
	<!-- $Id: Who-has-read-thread.xml,v 1.51 2010/12/30 02:05:17 Pem Exp $ -->
	<div id="wrtuserlist" class="block pemtable">
		<h2 class="blockhead">{vb:var wrt.header}</h2>
		<table id="whoread_table" width="100%">
			<tr>
				<vb:if condition="$show['wrtthread']">
					<td class="blocksubhead left">{vb:phrase thread}</td>
				<vb:else />
					<td class="blocksubhead left">{vb:phrase wrt_member}</td>
				</vb:if>
				<td class="blocksubhead">{vb:phrase wrt_last_viewed}</td>
				<vb:if condition="$show['wrip']">
					<td class="blocksubhead">{vb:phrase ip_address}</td>
				</vb:if>
			</tr>
			{vb:raw wrt.data}
			<tr>
				<td class="blocksubhead" colspan="<vb:if condition="$show['wrip']">3<vb:else />2</vb:if>">&copy;&nbsp;<a href="http://www.cableforum.co.uk/board/member.php?u=1268">Paul Marsden</a>&nbsp;{vb:raw wrt.year}</td>
			</tr>
		</table>
	</div>				
	<!-- /main -->
	{vb:raw footer}
</body>
</html>
]]></template>
		<template name="Display_Readers_View_Bit" templatetype="template" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[
<!-- Cut-Off-Date-->
<vb:if condition="$show['wrtcutoff']">
	<tr>
		<td class="alt2" colspan="<vb:if condition="$show['wrip']">3<vb:else />2</vb:if>"><b>{vb:raw reader.cdate}</b></td>
	</tr>
</vb:if>
<!-- Last-Post-Line -->
<vb:if condition="$show['wrtlastpost']">
	<tr>
		<td class="alt2" colspan="<vb:if condition="$show['wrip']">3<vb:else />2</vb:if>"><b>{vb:raw reader.lpdate}</b></td>
	</tr>
</vb:if>
<!-- Main-Data-Line -->
<vb:if condition="$show['wrtposter']">
	<tr>
		<vb:if condition="$reader['userid'] > 0">
			<td class="alt1 left">&nbsp;<a rel="nofollow" href="misc.php?do=wrtviewuser&amp;u={vb:raw reader.userid}" title="">{vb:raw reader.opentag}{vb:raw reader.username}{vb:raw reader.closetag}</a>{vb:raw reader.markinv}</td>
		<vb:else />
			<vb:if condition="$reader['userid'] == 0">
				<td class="alt1 left">&nbsp;{vb:raw reader.username}</td>
			<vb:else />
				<td class="alt1 left">&nbsp;<a rel="nofollow" href="showthread.php?t={vb:raw reader.threadid}" title="">{vb:raw reader.title}</a></td>
			</vb:if>
		</vb:if>
		<td class="alt1">{vb:raw reader.wrdate}</td>
		<vb:if condition="$show['wrip']">
			<td class="alt1">{vb:raw reader.ipaddress}</td>
		</vb:if>
	</tr>
</vb:if>
]]></template>
	</templates>
	<plugins>
		<plugin active="1" executionorder="5">
			<title>Display Thread Readers</title>
			<hookname>admin_options_print</hookname>
			<phpcode><![CDATA[
if (!function_exists('build_usergroup_list'))
{
	function build_usergroup_list($optzero = '')
	{
		global $vbulletin;
		$usergrouplist = array(0 => $optzero);
		foreach ($vbulletin->usergroupcache AS $usergroup)
		{
			$usergrouplist["$usergroup[usergroupid]"] = $usergroup['title'];
		}
		return $usergrouplist;
	}
}
if (!$handled)
{
	if ($setting['optioncode'] == 'forums:all')
	{
		$handled = true;
		$array = construct_forum_chooser_options(0,$vbphrase['all']);
		$size = sizeof($array);
		$vbphrase[forum_is_closed_for_posting] = $vbphrase[closed];
		print_select_row($description, $name.'[]', $array, unserialize($setting['value']), false, ($size > 10 ? 10 : $size), true);
	}
	if ($setting['optioncode'] == 'usergroups:all')
	{
		$handled = true;
		$array = build_usergroup_list($vbphrase['all']);
		$size = sizeof($array);
		print_select_row($description, $name.'[]', $array, unserialize($setting['value']), false, ($size > 10 ? 10 : $size), true);
	}
}
]]></phpcode>
		</plugin>
		<plugin active="1" executionorder="5">
			<title>Display Thread Readers</title>
			<hookname>admin_options_processing</hookname>
			<phpcode><![CDATA[
if (in_array($oldsetting['optioncode'],array('forums:all','usergroups:all')))
{
	$oldsetting['optioncode'] = 'usergroup:0'; // Cause vb to process the option as a u/g list
}
]]></phpcode>
		</plugin>
		<plugin active="1" executionorder="5">
			<title>Display Thread Readers</title>
			<hookname>global_state_check</hookname>
			<phpcode><![CDATA[
global $threadinfo;

$show['wrt']= false;
$show['wrtip'] = false;
if ($vbulletin->options['wrt'])
{
	$ugroups = unserialize($vbulletin->options['wrtgrps']); 
	if (is_member_of($vbulletin->userinfo,$ugroups) OR $ugroups[0] == 0) 
	{
		global $threadinfo;
		$wrforums = unserialize($vbulletin->options['wrtforums']); 
		if (in_array($threadinfo['forumid'],$wrforums) OR $wrforums[0] == -1) 
		{
			$show['wrt'] = true;
	 	}
	}

	$wripgrps = unserialize($vbulletin->options['wrtipgrps']); 
	if (is_member_of($vbulletin->userinfo,$wripgrps)) 
	{
		$show['wrtip'] = true;
	}

	if ($threadinfo['postuserid'] == $vbulletin->userinfo['userid'])
	{
		if ($vbulletin->options['wrtauthor'])
		{
			$show['wrt'] = true;
		}
	}
}
]]></phpcode>
		</plugin>
		<plugin active="1" executionorder="5">
			<title>Display Thread Readers</title>
			<hookname>template_groups</hookname>
			<phpcode><![CDATA[
require_once(DIR . '/includes/functions_misc.php');
$only['display_'] = fetch_phrase('display','showthread');
$only = array_unique($only);
]]></phpcode>
		</plugin>
		<plugin active="1" executionorder="5">
			<title>Display Thread Readers</title>
			<hookname>archive_process_start</hookname>
			<phpcode><![CDATA[
if ($vbulletin->userinfo['userid'] AND $vbulletin->options['wrt'] AND $do == 'thread')
{
	$time = TIMENOW;
	$ipaddress = IPADDRESS;
	$threadid = $threadinfo[threadid];
	$userid = $vbulletin->userinfo['userid'];
	$db->query_write("
		REPLACE INTO " . TABLE_PREFIX . "whoread
		(userid, threadid, dateline, ipaddress)
		VALUES
		($userid, $threadid, $time, '$ipaddress')
	");
}
]]></phpcode>
		</plugin>
		<plugin active="1" executionorder="5">
			<title>Display Thread Readers</title>
			<hookname>cache_templates</hookname>
			<phpcode><![CDATA[
if ($show['wrt'])
{
	$cache[] = 'Display_Readers';
	$cache[] = 'Display_Readers_Bit';
	$cache[] = 'Display_Readers_View_Bit';
	$cache[] = 'Display_Readers_View_User';
}
]]></phpcode>
		</plugin>
		<plugin active="1" executionorder="5">
			<title>Display Thread Readers</title>
			<hookname>cron_script_cleanup_daily</hookname>
			<phpcode><![CDATA[
if (intval($vbulletin->options['wrtcleandays']))
{
	$xdate = TIMENOW - (intval($vbulletin->options['wrtcleandays']) * 86400);
	$vbulletin->db->query_write("DELETE FROM ".TABLE_PREFIX."whoread WHERE dateline < $xdate");
}
]]></phpcode>
		</plugin>
		<plugin active="1" executionorder="5">
			<title>Display Thread Readers</title>
			<hookname>misc_start</hookname>
			<phpcode><![CDATA[
if ($_REQUEST['do'] == 'wrtset')
{
	// System Turned Off //
	if (!$vbulletin->options['wrt'])
	{
		print_no_permission();
	}
	
	$wrforums = unserialize($vbulletin->options['wrtforums']); 
	if (!(in_array($threadinfo['forumid'],$wrforums) OR $wrforums[0] == -1)) 
	{
		print_no_permission();
 	}

	// Check valid thread //
	$threadinfo = verify_id('thread',$threadid,true,true);

	$ugroups = unserialize($vbulletin->options['wrtswitchgrps']); 
	if ((is_member_of($vbulletin->userinfo,$ugroups) OR $ugroups[0] == 0) 
		AND $vbulletin->options['wrtswitch']) 
	{
		// Reset Users WR Date //
		$wrdates = unserialize($threadinfo['wrdate']);
		$wrdates[$vbulletin->userinfo['userid']] = TIMENOW;
		$threadinfo['wrdate'] = serialize($wrdates);
		$db->query_write("
			UPDATE ".TABLE_PREFIX."thread
			SET wrdate = '$threadinfo[wrdate]'
			WHERE threadid = $threadinfo[threadid]
		");
		$pageinfo['p'] = $threadinfo['lastpostid'];
		exec_header_redirect(fetch_seo_url('thread|js',$threadinfo,$pageinfo).'#wrt');
	}
	else 
	{
		print_no_permission();
	}
}

if ($_REQUEST['do'] == 'wrtclear')
{
	// System Turned Off //
	if (!$vbulletin->options['wrt'])
	{
		print_no_permission();
	}
	
	$wrforums = unserialize($vbulletin->options['wrtforums']); 
	if (!(in_array($threadinfo['forumid'],$wrforums) OR $wrforums[0] == -1)) 
	{
		print_no_permission();
 	}

	// Check valid thread //
	$threadinfo = verify_id('thread',$threadid,true,true);

	$ugroups = unserialize($vbulletin->options['wrtswitchgrps']); 

	$wrdates = unserialize($threadinfo['wrdate']);
	$cutoffdate = intval($wrdates[$vbulletin->userinfo['userid']]);
	if ((is_member_of($vbulletin->userinfo,$ugroups) OR $ugroups[0] == 0) 
		AND $cutoffdate > 0 AND $vbulletin->options['wrtswitch']) 
	{
		// Clear Users WR Date //
		unset($wrdates[$vbulletin->userinfo['userid']]);
		$threadinfo['wrdate'] = serialize($wrdates);
		$db->query_write("
			UPDATE ".TABLE_PREFIX."thread
			SET wrdate = '$threadinfo[wrdate]'
			WHERE threadid = $threadinfo[threadid]
		");
		$pageinfo['p'] = $threadinfo['lastpostid'];
		exec_header_redirect(fetch_seo_url('thread|js',$threadinfo,$pageinfo).'#wrt');
	}
	else 
	{
		print_no_permission();
	}
}

if ($_REQUEST['do'] == 'wrtviewall')
{
	// System Turned Off //
	if (!$vbulletin->options['wrt'])
	{
		print_no_permission();
	}
	
	$wrforums = unserialize($vbulletin->options['wrtforums']); 
	if (!(in_array($threadinfo['forumid'],$wrforums) OR $wrforums[0] == -1)) 
	{
		print_no_permission();
 	}

	// Check valid thread //
	$threadinfo = verify_id('thread',$threadid,true,true);

	$ugroups = unserialize($vbulletin->options['wrtgrps']); 
	if (!((is_member_of($vbulletin->userinfo,$ugroups) OR $ugroups[0] == 0) OR 
	(($threadinfo['postuserid'] == $vbulletin->userinfo['userid']) AND $vbulletin->options['wrtauthor']))) 
	{
		print_no_permission();
 	}

	$ugroups = unserialize($vbulletin->options['wrtviewrdrsgrps']); 
	if (!(is_member_of($vbulletin->userinfo,$ugroups) OR $ugroups[0] == 0)) 
	{
		print_no_permission();
 	}

	// Check if allowed ip view //
	$show['wrip'] = false;
	$ugroups = unserialize($vbulletin->options['wrtipgrps']); 
	if (is_member_of($vbulletin->userinfo,$ugroups) OR $ugroups[0] == 0) 
	{
		$show['wrip'] = true;
	}

	// Set Cutoff Date //
	$cutoff = 0;
	if ($vbulletin->options['wrtlimit']) 
	{
		$cutoff = TIMENOW - 86400 * $vbulletin->options['wrtlimit'];
	}

	// Get Readers Data //
	$readlist = $vbulletin->db->query_read_slave("
		SELECT user.userid, user.options, user.username, 
		user.usergroupid, user.displaygroupid, whoread.dateline, whoread.ipaddress
		FROM ".TABLE_PREFIX."whoread as whoread
		LEFT JOIN ".TABLE_PREFIX."user as user USING (userid)
		WHERE whoread.threadid = $threadinfo[threadid]
		AND whoread.dateline > $cutoff ORDER BY whoread.dateline DESC
	"); 

	// Build Data Rows //
	$wrt = array();
	$show['wrtposter'] = true;
	$show['wrtthread'] = false;

	$threadinfo['lastposttime'] = $threadinfo['lastpost'];
	$wrdates = unserialize($threadinfo['wrdate']);
	$cutoff = intval($wrdates[$vbulletin->userinfo['userid']]);

	while ($threadreader = $vbulletin->db->fetch_array($readlist))
	{
		if (intval($threadreader['userid']))
		{
			$threadreader['markinv'] = '';
			$threadreader['visible'] = true ;
			if ($threadreader['options'] & $vbulletin->bf_misc_useroptions['invisible']) 
			{
				$threadreader['visible'] = false ;
				if (($vbulletin->userinfo['permissions']['genericpermissions'] 
				& $vbulletin->bf_ugp_genericpermissions['canseehidden']) 
				OR $threadreader['userid'] == $vbulletin->userinfo['userid'])
				{
					$threadreader['markinv'] = '*';
					$threadreader['visible'] = true ;
				}
			}
			if ($threadreader['visible']) 
			{
				if ($threadreader['dateline'] <= $threadinfo['lastposttime'])
				{
					$show['wrtlastpost'] = true;
					$threadreader['lpdate'] = $vbphrase['wrt_thread_lastpost'];
					$threadreader['lpdate'] .= vbdate($vbulletin->options['dateformat'],$threadinfo['lastpost']).', ';
					$threadreader['lpdate'] .= vbdate($vbulletin->options['timeformat'],$threadinfo['lastpost']);
					$threadinfo['lastposttime'] = 0;
				}
				else
				{
					$show['wrtlastpost'] = false;
				}

				if ($threadreader['dateline'] <= $cutoff)
				{
					$show['wrtcutoff'] = true;
					$threadreader['cdate'] = $vbphrase['wrt_thread_cutoff'];
					$threadreader['cdate'] .= vbdate($vbulletin->options['dateformat'],$cutoff).', ';
					$threadreader['cdate'] .= vbdate($vbulletin->options['timeformat'],$cutoff);
					$cutoff = 0;
				}
				else
				{
					$show['wrtcutoff'] = false;
				}

				$threadreader['wrdate'] = $vbphrase['wrt_readtime'].' ';
				$threadreader['wrdate'] .= vbdate($vbulletin->options['dateformat'],$threadreader['dateline']).', ';
				$threadreader['wrdate'] .= vbdate($vbulletin->options['timeformat'],$threadreader['dateline']);
				$ugroup = ($threadreader['displaygroupid'] > 0 ? $threadreader['displaygroupid'] : $threadreader['usergroupid']);
				$threadreader['opentag'] = $vbulletin->usergroupcache[$ugroup]['opentag'];
				$threadreader['closetag'] = $vbulletin->usergroupcache[$ugroup]['closetag'];

				$templater = vB_Template::create('Display_Readers_View_Bit');
				$templater->register('reader',$threadreader);
				$wrt['data'] .= $templater->render();
			}
		}
	}

	if ($threadinfo['lastposttime']) 
	{
		$show['wrtcutoff'] = false;
		$show['wrtposter'] = false;
		$show['wrtlastpost'] = true;
		$threadreader['lpdate'] = $vbphrase['wrt_thread_lastpost'];
		$threadreader['lpdate'] .= vbdate($vbulletin->options['dateformat'],$threadinfo['lastpost']).', ';
		$threadreader['lpdate'] .= vbdate($vbulletin->options['timeformat'],$threadinfo['lastpost']);

		$templater = vB_Template::create('Display_Readers_View_Bit');
		$templater->register('reader',$threadreader);
		$wrt['data'] .= $templater->render();
	}

	if ($cutoff) 
	{
		$show['wrtcutoff'] = true;
		$show['wrtposter'] = false;
		$show['wrtlastpost'] = false;
		$threadreader['cdate'] = $vbphrase['wrt_thread_cutoff'];
		$threadreader['cdate'] .= vbdate($vbulletin->options['dateformat'],$cutoff).', ';
		$threadreader['cdate'] .= vbdate($vbulletin->options['timeformat'],$cutoff);

		$templater = vB_Template::create('Display_Readers_View_Bit');
		$templater->register('reader',$threadreader);
		$wrt['data'] .= $templater->render();
	}

	$wrt['header'] = construct_phrase($vbphrase['wrt_who_viewed'],$threadinfo['title']);

	// Navbar
	$navbits = array();
	$navbits[''] = $wrt['header'];
	$navbar = render_navbar_template(construct_navbits($navbits));

	// Output Main Display Page //
	$wrt['year'] = $copyrightyear;
	$templater = vB_Template::create('Display_Readers_View_User');
	$templater->register_page_templates();
	$templater->register('navbar', $navbar);
	$templater->register('wrt',$wrt);
	print_output($templater->render());
}

if ($_REQUEST['do'] == 'wrtviewuser')
{
	// System Turned Off //
	if (!$vbulletin->options['wrt'])
	{
		print_no_permission();
	}
	
	$userid = intval($_REQUEST['userid']);

	$ugroups = unserialize($vbulletin->options['wrtgrps']); 
	if (!(is_member_of($vbulletin->userinfo,$ugroups) OR $ugroups[0] == 0)) 
	{
		print_no_permission();
 	}

	$ugroups = unserialize($vbulletin->options['wrtviewrdrsgrps']); 
	if (!(is_member_of($vbulletin->userinfo,$ugroups) OR $ugroups[0] == 0)) 
	{
		print_no_permission();
 	}

	$ugroups = unserialize($vbulletin->options['wrtviewusergrps']); 
	if (!(is_member_of($vbulletin->userinfo,$ugroups) OR $ugroups[0] == 0)) 
	{
		print_no_permission();
 	}

	// Check if allowed ip view //
	$show['wrip'] = false;
	$ugroups = unserialize($vbulletin->options['wrtipgrps']); 
	if (is_member_of($vbulletin->userinfo,$ugroups) OR $ugroups[0] == 0) 
	{
		$show['wrip'] = true;
	}

	// Set Cutoff Date //
	$cutoff = 0;
	if ($vbulletin->options['wrtlimit']) 
	{
		$cutoff = TIMENOW - 86400 * $vbulletin->options['wrtlimit'];
	}

	//Get allowed forums //
	$xforum_ids = array_keys($vbulletin->forumcache);
	$wrforums = unserialize($vbulletin->options['wrtforums']); 
	foreach ($xforum_ids AS $key => $xforum_id)
	{
		$xfperms = & $vbulletin->userinfo['forumpermissions']["$xforum_id"];
		if (!(($xfperms & $vbulletin->bf_ugp_forumpermissions['canview']) AND ($xfperms & $vbulletin->bf_ugp_forumpermissions['canviewthreads'])))
		{
			unset($xforum_ids["$key"]);
		}
		if (!(in_array($xforum_id,$wrforums) OR $wrforums[0] == -1)) 
		{
			unset($xforum_ids["$key"]);
 		}
	}
	$xforum_list = implode(', ', $xforum_ids);

	$readlist = $vbulletin->db->query_read_slave("
		SELECT whoread.*, title, postuserid, forumid
		FROM ".TABLE_PREFIX."whoread as whoread
		INNER JOIN ".TABLE_PREFIX."thread as thread USING (threadid)
		WHERE whoread.userid = $userid
		AND thread.forumid IN(0$xforum_list) 
		AND whoread.dateline > $cutoff ORDER BY whoread.dateline DESC
	"); 

	// Build Data Rows //
	$wrt = array();
	$show['wrtposter'] = true;
	$show['wrtthread'] = true;
	$show['wrtlastpost'] = false;
	while ($threadreader = $vbulletin->db->fetch_array($readlist))
	{
		$xfperms = & $vbulletin->userinfo['forumpermissions']["{$threadreader['forumid']}"];
		if (($xfperms & $vbulletin->bf_ugp_forumpermissions['canviewothers']) OR ($threadreader['postuserid'] == $vbulletin->userinfo['userid']))
		{
			if (strlen($threadreader['title']) > 64) 
			{
				$threadreader['title'] = substr($threadreader['title'],0,60).' ...';
			}
			$threadreader['userid'] = -1; // Thread //
			$threadreader['title'] = $threadreader['title'] ;
			$threadreader['threadid'] = $threadreader['threadid'];
			$threadreader['wrdate'] = $vbphrase['wrt_readtime'].' ';
			$threadreader['wrdate'] .= vbdate($vbulletin->options['dateformat'],$threadreader['dateline']).', ';
			$threadreader['wrdate'] .= vbdate($vbulletin->options['timeformat'],$threadreader['dateline']);

			$templater = vB_Template::create('Display_Readers_View_Bit');
			$templater->register('reader',$threadreader);
			$wrt['data'] .= $templater->render();
		}
	}

	// Get Readers Username //
	$readlist = $vbulletin->db->query_first_slave("
		SELECT username FROM ".TABLE_PREFIX."user as user WHERE userid = $userid
	"); 

	$wrt['header'] = construct_phrase($vbphrase['wrt_who_viewed_threads'],$readlist['username']);

	// Navbar
	$navbits = array();
	$navbits[''] = $wrt['header'];
	$navbar = render_navbar_template(construct_navbits($navbits));

	// Output Main Display Page //
	$wrt['year'] = $copyrightyear;
	$templater = vB_Template::create('Display_Readers_View_User');
	$templater->register_page_templates();
	$templater->register('navbar', $navbar);
	$templater->register('wrt',$wrt);
	print_output($templater->render());
}
]]></phpcode>
		</plugin>
		<plugin active="1" executionorder="5">
			<title>Display Thread Readers</title>
			<hookname>showthread_complete</hookname>
			<phpcode><![CDATA[
if ($vbulletin->userinfo['userid'] AND $vbulletin->options['wrt'])
{
	$time = TIMENOW;
	$ipaddress = IPADDRESS;
	$threadid = $threadinfo[threadid];
	$userid = $vbulletin->userinfo['userid'];
	$db->query_write("
		REPLACE INTO " . TABLE_PREFIX . "whoread
		(userid, threadid, dateline, ipaddress)
		VALUES
		($userid, $threadid, $time, '$ipaddress')
	");
}
]]></phpcode>
		</plugin>
		<plugin active="1" executionorder="5">
			<title>Display Thread Readers</title>
			<hookname>showthread_getinfo</hookname>
			<phpcode><![CDATA[
if ($show['wrt'])
{
	$show['wrt_set'] = false;
	if ($vbulletin->options['wrtswitch']) 
	{
		$ugroups = unserialize($vbulletin->options['wrtswitchgrps']); 
		if (is_member_of($vbulletin->userinfo,$ugroups) OR $ugroups[0] == 0) 
		{
			$show['wrt_set'] = true;
		}
	}

	$show['wrt_readers'] = false;
	$ugroups = unserialize($vbulletin->options['wrtviewrdrsgrps']); 
	if (is_member_of($vbulletin->userinfo,$ugroups) OR $ugroups[0] == 0) 
	{
		$show['wrt_readers'] = true;
	}

	$cutoff = $threadinfo['dateline'];
	if ($vbulletin->options['wrtlimit']) 
	{
		$cutoff = TIMENOW - (86400 * $vbulletin->options['wrtlimit']);
	}

	$show['wrt_clear'] = false;
	$wrdates = unserialize($threadinfo['wrdate']);
	$cutoffdate = intval($wrdates[$vbulletin->userinfo['userid']]);
	if ($cutoffdate AND $show['wrt_set']) 
	{
		$cutoff = $cutoffdate;
		$show['wrt_clear'] = true;
	}

	$wrt = array();
	$readlist = $vbulletin->db->query_read_slave("
		SELECT user.userid, user.options, user.username, 
		user.usergroupid, user.displaygroupid, whoread.dateline, whoread.ipaddress
		FROM ".TABLE_PREFIX."whoread as whoread
		LEFT JOIN ".TABLE_PREFIX."user as user USING (userid)
		WHERE whoread.threadid = $threadinfo[threadid]
		AND whoread.dateline > $cutoff ORDER BY username
	"); 

	$wrt['trtotal'] = 0;
	while ($threadreader = $vbulletin->db->fetch_array($readlist))
	{
		if (intval($threadreader['userid']))
		{
			$wrt['trtotal'] += 1;
			$threadreader['markinv'] = '';
			$threadreader[visible] = true ;
			if ($threadreader['options'] & $vbulletin->bf_misc_useroptions['invisible']) 
			{
				$threadreader['visible'] = false ;
				if (($vbulletin->userinfo['permissions']['genericpermissions'] 
				& $vbulletin->bf_ugp_genericpermissions['canseehidden']) 
				OR $threadreader['userid'] == $vbulletin->userinfo['userid'])
				{
					$threadreader['markinv'] = '*';
					$threadreader['visible'] = true ;
				}
			}
			if ($threadreader['visible']) 
			{
				fetch_musername($threadreader);
				$threadreader['wrdate'] = $vbphrase['wrt_readtime'].' ';
				$threadreader['wrdate'] .= vbdate($vbulletin->options['dateformat'], $threadreader['dateline']).', ';
				$threadreader['wrdate'] .= vbdate($vbulletin->options['timeformat'], $threadreader['dateline']);
				$templater = vB_Template::create('Display_Readers_Bit');
				$templater->register('threadreader',$threadreader);
				$wrt['list'] .= trim($templater->render()).' ';
			}
		}
	}
	
	if (intval($vbulletin->options['wrtlimit']) == 0) 
	{
		$wrt['trtitle'] = construct_phrase($vbphrase['wrt_read_thread'],$wrt['trtotal']);
	}
	else
	{
		$wrt['trtitle'] = construct_phrase($vbphrase['wrt_read_thread_days'],intval($vbulletin->options['wrtlimit']),$wrt['trtotal']);
	}

	if ($show['wrt_clear']) 
	{
		$threadreader['wrdate'] = vbdate($vbulletin->options['dateformat'], $cutoff).', ';
		$threadreader['wrdate'] .= vbdate($vbulletin->options['timeformat'], $cutoff) ;
		$wrt['trtitle'] = construct_phrase($vbphrase['wrt_read_thread_since'],$threadreader['wrdate'],$wrt['trtotal']);
	}

	if ($vbulletin->options['wrtcollapse'])
	{
		$keys = explode(chr(10),$_COOKIE['vbulletin_collapse']);
		$collapse = array_fill_keys($keys,true);
		$wrt['style'] = 'style="display: none"';
		if (!array_key_exists('wrt_list',$collapse))
		{
			$wrt['collapse'] = '_collapsed';
		}
	}
	else
	{
		$wrt['style'] = $wrt['collapse'] = '';
	}

	$wrt['threadid'] = $threadinfo['threadid'];
	$templater = vB_Template::create('Display_Readers');
	$templater->register('wrt',$wrt);
	$template_hook['showthread_after_activeusers'] .= $templater->render();
}
]]></phpcode>
		</plugin>
	</plugins>
	<phrases>
		<phrasetype name="GLOBAL" fieldname="global">
			<phrase name="wrt_col" date="1260000000" username="Paul M" version="4.0.8"><![CDATA[Collapse/Expand]]></phrase>
			<phrase name="wrt_last_viewed" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Last Viewed]]></phrase>
			<phrase name="wrt_member" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Member]]></phrase>
			<phrase name="wrt_actions" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Actions : ]]></phrase>
			<phrase name="wrt_thread_cutoff" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Preset Date : ]]></phrase>
			<phrase name="wrt_thread_lastpost" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Last Post : ]]></phrase>
			<phrase name="wrt_who_viewed" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Who Viewed This Thread : {1}]]></phrase>
			<phrase name="wrt_who_viewed_threads" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[List of Threads Viewed by : {1}]]></phrase>
		</phrasetype>
		<phrasetype name="Show Thread" fieldname="showthread">
			<phrase name="wrt_clear" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Clear Date]]></phrase>
			<phrase name="wrt_clear_title" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Clear Custom View Date]]></phrase>
			<phrase name="wrt_no_names" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[There are no names to display.]]></phrase>
			<phrase name="wrt_no_readers" date="1285000000" username="Paul M" version="4.1.2"><![CDATA[You do not have permission to view the list of names.]]></phrase>
			<phrase name="wrt_read_thread" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Members who have read this thread : {1}]]></phrase>
			<phrase name="wrt_read_thread_days" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Members who have read this thread in the last {1} days : {2}]]></phrase>
			<phrase name="wrt_read_thread_since" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Members who have read this thread since {1} : {2}]]></phrase>
			<phrase name="wrt_readtime" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Last Read:]]></phrase>
			<phrase name="wrt_set" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Set Date]]></phrase>
			<phrase name="wrt_set_title" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Set/Reset View Date to Now]]></phrase>
			<phrase name="wrt_view_all" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[View-Readers]]></phrase>
			<phrase name="wrt_view_all_title" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[View all thread readers]]></phrase>
		</phrasetype>
		<phrasetype name="vBulletin Settings" fieldname="vbsettings">
			<phrase name="setting_wrt_desc" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Turn on the "Display who has read a thread" system.]]></phrase>
			<phrase name="setting_wrt_title" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Master Control]]></phrase>
			<phrase name="setting_wrtauthor_desc" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[If set to yes then this allows the thread creator to see the who has read display whatever usergroup they are in.]]></phrase>
			<phrase name="setting_wrtauthor_title" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Allow Thread Author]]></phrase>
			<phrase name="setting_wrtcleandays_desc" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Who read records older than this number of days will be purged from the database, this is an optional housekeeping function - set to 0 to disable.]]></phrase>
			<phrase name="setting_wrtcleandays_title" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Table Clean-up]]></phrase>
			<phrase name="setting_wrtforums_desc" date="1225000000" username="Paul M" version="4.0.0"><![CDATA[Restrict the display to selected forums, hold down the CTRL key to make multiple selections.]]></phrase>
			<phrase name="setting_wrtforums_title" date="1225000000" username="Paul M" version="4.0.0"><![CDATA[Allowed Forums]]></phrase>
			<phrase name="setting_wrtgrps_desc" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Select the usergroups that can see the display, hold down the CTRL key to make multiple selections.]]></phrase>
			<phrase name="setting_wrtgrps_title" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Usergroup Restrictions]]></phrase>
			<phrase name="setting_wrtipgrps_desc" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Select the usergroups that can see ip addresses, hold down the CTRL key to make multiple selections.]]></phrase>
			<phrase name="setting_wrtipgrps_title" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[IP Display]]></phrase>
			<phrase name="setting_wrtlimit_desc" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Limit number of days displayed in the who has read a thread feature. Set to 0 for no limit.]]></phrase>
			<phrase name="setting_wrtlimit_title" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Days limit]]></phrase>
			<phrase name="setting_wrtswitch_desc" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[If turned on this allows you to use the "Who has read since" feature - which is resetable and switchable for each thread.]]></phrase>
			<phrase name="setting_wrtswitch_title" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Enable Thread Date Set]]></phrase>
			<phrase name="setting_wrtswitchgrps_desc" date="1255000000" username="Paul M" version="4.0.5"><![CDATA[Select the usergroups that can use the thread set/reset feature, hold down the CTRL key to make multiple selections.]]></phrase>
			<phrase name="setting_wrtswitchgrps_title" date="1255000000" username="Paul M" version="4.0.5"><![CDATA[Set/Reset Usergroups]]></phrase>
			<phrase name="setting_wrtcollapse_desc" date="1250000000" username="Paul M" version="4.0.2"><![CDATA[Set to 'Yes' to allways collapse the display on initial page load.]]></phrase>
			<phrase name="setting_wrtcollapse_title" date="1250000000" username="Paul M" version="4.0.2"><![CDATA[Display Collapse]]></phrase>
			<phrase name="setting_wrtviewusergrps_desc" date="1255000000" username="Paul M" version="4.1.2"><![CDATA[Select the usergroups that can view the list of threads a member has recently read, note that the usergroup must also have permission to view the list of thread readers, hold down the CTRL key to make multiple selections.]]></phrase>
			<phrase name="setting_wrtviewusergrps_title" date="1255000000" username="Paul M" version="4.1.2"><![CDATA[View User History Usergroups]]></phrase>
			<phrase name="setting_wrtviewrdrsgrps_desc" date="1255000000" username="Paul M" version="4.1.2"><![CDATA[Select the usergroups that view the list of thread readers, hold down the CTRL key to make multiple selections.]]></phrase>
			<phrase name="setting_wrtviewrdrsgrps_title" date="1255000000" username="Paul M" version="4.1.2"><![CDATA[View Thread Readers Usergroups]]></phrase>
			<phrase name="settinggroup_wrtgroup" date="1255000000" username="Paul M" version="4.0.0"><![CDATA[Who Has Read a Thread]]></phrase>
		</phrasetype>
	</phrases>
	<options>
		<settinggroup name="wrtgroup" displayorder="3020">
			<setting varname="wrt" displayorder="10">
				<datatype>boolean</datatype>
				<optioncode>yesno</optioncode>
				<defaultvalue>1</defaultvalue>
			</setting>
			<setting varname="wrtgrps" displayorder="20">
				<datatype>free</datatype>
				<optioncode>usergroups:all</optioncode>
				<defaultvalue>a:3:{i:0;i:6;i:1;i:7;i:2;i:5;}</defaultvalue>
			</setting>
			<setting varname="wrtlimit" displayorder="30">
				<datatype>integer</datatype>
				<defaultvalue>0</defaultvalue>
			</setting>
			<setting varname="wrtcollapse" displayorder="40">
				<datatype>boolean</datatype>
				<optioncode>yesno</optioncode>
				<defaultvalue>0</defaultvalue>
			</setting>
			<setting varname="wrtipgrps" displayorder="50">
				<datatype>free</datatype>
				<optioncode>usergroups:all</optioncode>
				<defaultvalue>a:3:{i:0;i:6;i:1;i:7;i:2;i:5;}</defaultvalue>
			</setting>
			<setting varname="wrtauthor" displayorder="60">
				<datatype>boolean</datatype>
				<optioncode>yesno</optioncode>
				<defaultvalue>0</defaultvalue>
			</setting>
			<setting varname="wrtswitch" displayorder="70">
				<datatype>boolean</datatype>
				<optioncode>yesno</optioncode>
				<defaultvalue>0</defaultvalue>
			</setting>
			<setting varname="wrtswitchgrps" displayorder="80">
				<datatype>free</datatype>
				<optioncode>usergroups:all</optioncode>
				<defaultvalue>a:3:{i:0;i:6;i:1;i:7;i:2;i:5;}</defaultvalue>
			</setting>
			<setting varname="wrtviewrdrsgrps" displayorder="90">
				<datatype>free</datatype>
				<optioncode>usergroups:all</optioncode>
				<defaultvalue>a:3:{i:0;i:6;i:1;i:7;i:2;i:5;}</defaultvalue>
			</setting>
			<setting varname="wrtviewusergrps" displayorder="100">
				<datatype>free</datatype>
				<optioncode>usergroups:all</optioncode>
				<defaultvalue>a:3:{i:0;i:6;i:1;i:7;i:2;i:5;}</defaultvalue>
			</setting>
			<setting varname="wrtforums" displayorder="110">
				<datatype>free</datatype>
				<optioncode>forums:all</optioncode>
				<defaultvalue>a:1:{i:0;i:-1;}</defaultvalue>
			</setting>
			<setting varname="wrtcleandays" displayorder="120">
				<datatype>integer</datatype>
				<defaultvalue>365</defaultvalue>
			</setting>
		</settinggroup>
	</options>
</product>
