~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/php/phpBB3/viewtopic.php

  • Committer: William Grant
  • Date: 2009-02-23 23:47:02 UTC
  • mfrom: (1099.1.211 new-dispatch)
  • Revision ID: grantw@unimelb.edu.au-20090223234702-db4b1llly46ignwo
Merge from lp:~ivle-dev/ivle/new-dispatch.

Pretty much everything changes. Reread the setup docs. Backup your databases.
Every file is now in a different installed location, the configuration system
is rewritten, the dispatch system is rewritten, URLs are different, the
database is different, worksheets and exercises are no longer on the
filesystem, we use a templating engine, jail service protocols are rewritten,
we don't repeat ourselves, we have authorization rewritten, phpBB is gone,
and probably lots of other things that I cannot remember.

This is certainly the biggest commit I have ever made, and hopefully
the largest I ever will.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
<?php
2
 
/**
3
 
*
4
 
* @package phpBB3
5
 
* @version $Id: viewtopic.php,v 1.513 2007/11/06 00:05:53 kellanved Exp $
6
 
* @copyright (c) 2005 phpBB Group
7
 
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
8
 
*
9
 
*/
10
 
 
11
 
/**
12
 
* @ignore
13
 
*/
14
 
define('IN_PHPBB', true);
15
 
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
16
 
$phpEx = substr(strrchr(__FILE__, '.'), 1);
17
 
include($phpbb_root_path . 'common.' . $phpEx);
18
 
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
19
 
include($phpbb_root_path . 'includes/bbcode.' . $phpEx);
20
 
 
21
 
// Start session management
22
 
$user->session_begin();
23
 
$auth->acl($user->data);
24
 
 
25
 
// Initial var setup
26
 
$forum_id       = request_var('f', 0);
27
 
$topic_id       = request_var('t', 0);
28
 
$post_id        = request_var('p', 0);
29
 
$voted_id       = request_var('vote_id', array('' => 0));
30
 
 
31
 
$start          = request_var('start', 0);
32
 
$view           = request_var('view', '');
33
 
 
34
 
$sort_days      = request_var('st', ((!empty($user->data['user_post_show_days'])) ? $user->data['user_post_show_days'] : 0));
35
 
$sort_key       = request_var('sk', ((!empty($user->data['user_post_sortby_type'])) ? $user->data['user_post_sortby_type'] : 't'));
36
 
$sort_dir       = request_var('sd', ((!empty($user->data['user_post_sortby_dir'])) ? $user->data['user_post_sortby_dir'] : 'a'));
37
 
 
38
 
$update         = request_var('update', false);
39
 
 
40
 
/**
41
 
* @todo normalize?
42
 
*/
43
 
$hilit_words    = request_var('hilit', '', true);
44
 
 
45
 
// Do we have a topic or post id?
46
 
if (!$topic_id && !$post_id)
47
 
{
48
 
        trigger_error('NO_TOPIC');
49
 
}
50
 
 
51
 
// Find topic id if user requested a newer or older topic
52
 
if ($view && !$post_id)
53
 
{
54
 
        if (!$forum_id)
55
 
        {
56
 
                $sql = 'SELECT forum_id
57
 
                        FROM ' . TOPICS_TABLE . "
58
 
                        WHERE topic_id = $topic_id";
59
 
                $result = $db->sql_query($sql);
60
 
                $forum_id = (int) $db->sql_fetchfield('forum_id');
61
 
                $db->sql_freeresult($result);
62
 
 
63
 
                if (!$forum_id)
64
 
                {
65
 
                        trigger_error('NO_TOPIC');
66
 
                }
67
 
        }
68
 
 
69
 
        if ($view == 'unread')
70
 
        {
71
 
                // Get topic tracking info
72
 
                $topic_tracking_info = get_complete_topic_tracking($forum_id, $topic_id);
73
 
 
74
 
                $topic_last_read = (isset($topic_tracking_info[$topic_id])) ? $topic_tracking_info[$topic_id] : 0;
75
 
 
76
 
                $sql = 'SELECT post_id, topic_id, forum_id
77
 
                        FROM ' . POSTS_TABLE . "
78
 
                        WHERE topic_id = $topic_id
79
 
                                " . (($auth->acl_get('m_approve', $forum_id)) ? '' : 'AND post_approved = 1') . "
80
 
                                AND post_time > $topic_last_read
81
 
                        ORDER BY post_time ASC";
82
 
                $result = $db->sql_query_limit($sql, 1);
83
 
                $row = $db->sql_fetchrow($result);
84
 
                $db->sql_freeresult($result);
85
 
 
86
 
                if (!$row)
87
 
                {
88
 
                        $sql = 'SELECT topic_last_post_id as post_id, topic_id, forum_id
89
 
                                FROM ' . TOPICS_TABLE . '
90
 
                                WHERE topic_id = ' . $topic_id;
91
 
                        $result = $db->sql_query($sql);
92
 
                        $row = $db->sql_fetchrow($result);
93
 
                        $db->sql_freeresult($result);
94
 
                }
95
 
 
96
 
                if (!$row)
97
 
                {
98
 
                        // Setup user environment so we can process lang string
99
 
                        $user->setup('viewtopic');
100
 
 
101
 
                        trigger_error('NO_TOPIC');
102
 
                }
103
 
 
104
 
                $post_id = $row['post_id'];
105
 
                $topic_id = $row['topic_id'];
106
 
        }
107
 
        else if ($view == 'next' || $view == 'previous')
108
 
        {
109
 
                $sql_condition = ($view == 'next') ? '>' : '<';
110
 
                $sql_ordering = ($view == 'next') ? 'ASC' : 'DESC';
111
 
 
112
 
                $sql = 'SELECT forum_id, topic_last_post_time
113
 
                        FROM ' . TOPICS_TABLE . '
114
 
                        WHERE topic_id = ' . $topic_id;
115
 
                $result = $db->sql_query($sql);
116
 
                $row = $db->sql_fetchrow($result);
117
 
                $db->sql_freeresult($result);
118
 
 
119
 
                if (!$row)
120
 
                {
121
 
                        $user->setup('viewtopic');
122
 
                        // OK, the topic doesn't exist. This error message is not helpful, but technically correct.
123
 
                        trigger_error(($view == 'next') ? 'NO_NEWER_TOPICS' : 'NO_OLDER_TOPICS');
124
 
                }
125
 
                else
126
 
                {
127
 
                        $sql = 'SELECT topic_id, forum_id
128
 
                                FROM ' . TOPICS_TABLE . '
129
 
                                WHERE forum_id = ' . $row['forum_id'] . "
130
 
                                        AND topic_moved_id = 0
131
 
                                        AND topic_last_post_time $sql_condition {$row['topic_last_post_time']}
132
 
                                        " . (($auth->acl_get('m_approve', $row['forum_id'])) ? '' : 'AND topic_approved = 1') . "
133
 
                                ORDER BY topic_last_post_time $sql_ordering";
134
 
                        $result = $db->sql_query_limit($sql, 1);
135
 
                        $row = $db->sql_fetchrow($result);
136
 
                        $db->sql_freeresult($result);
137
 
 
138
 
                        if (!$row)
139
 
                        {
140
 
                                $user->setup('viewtopic');
141
 
                                trigger_error(($view == 'next') ? 'NO_NEWER_TOPICS' : 'NO_OLDER_TOPICS');
142
 
                        }
143
 
                        else
144
 
                        {
145
 
                                $topic_id = $row['topic_id'];
146
 
 
147
 
                                // Check for global announcement correctness?
148
 
                                if (!$row['forum_id'] && !$forum_id)
149
 
                                {
150
 
                                        trigger_error('NO_TOPIC');
151
 
                                }
152
 
                                else if ($row['forum_id'])
153
 
                                {
154
 
                                        $forum_id = $row['forum_id'];
155
 
                                }
156
 
                        }
157
 
                }
158
 
        }
159
 
 
160
 
        // Check for global announcement correctness?
161
 
        if ((!isset($row) || !$row['forum_id']) && !$forum_id)
162
 
        {
163
 
                trigger_error('NO_TOPIC');
164
 
        }
165
 
        else if (isset($row) && $row['forum_id'])
166
 
        {
167
 
                $forum_id = $row['forum_id'];
168
 
        }
169
 
}
170
 
 
171
 
// This rather complex gaggle of code handles querying for topics but
172
 
// also allows for direct linking to a post (and the calculation of which
173
 
// page the post is on and the correct display of viewtopic)
174
 
$sql_array = array(
175
 
        'SELECT'        => 't.*, f.*',
176
 
 
177
 
        'FROM'          => array(
178
 
                FORUMS_TABLE    => 'f',
179
 
        )
180
 
);
181
 
 
182
 
if ($user->data['is_registered'])
183
 
{
184
 
        $sql_array['SELECT'] .= ', tw.notify_status';
185
 
        $sql_array['LEFT_JOIN'] = array();
186
 
 
187
 
        $sql_array['LEFT_JOIN'][] = array(
188
 
                'FROM'  => array(TOPICS_WATCH_TABLE => 'tw'),
189
 
                'ON'    => 'tw.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tw.topic_id'
190
 
        );
191
 
 
192
 
        if ($config['allow_bookmarks'])
193
 
        {
194
 
                $sql_array['SELECT'] .= ', bm.topic_id as bookmarked';
195
 
                $sql_array['LEFT_JOIN'][] = array(
196
 
                        'FROM'  => array(BOOKMARKS_TABLE => 'bm'),
197
 
                        'ON'    => 'bm.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = bm.topic_id'
198
 
                );
199
 
        }
200
 
 
201
 
        if ($config['load_db_lastread'])
202
 
        {
203
 
                $sql_array['SELECT'] .= ', tt.mark_time, ft.mark_time as forum_mark_time';
204
 
 
205
 
                $sql_array['LEFT_JOIN'][] = array(
206
 
                        'FROM'  => array(TOPICS_TRACK_TABLE => 'tt'),
207
 
                        'ON'    => 'tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id'
208
 
                );
209
 
 
210
 
                $sql_array['LEFT_JOIN'][] = array(
211
 
                        'FROM'  => array(FORUMS_TRACK_TABLE => 'ft'),
212
 
                        'ON'    => 'ft.user_id = ' . $user->data['user_id'] . ' AND t.forum_id = ft.forum_id'
213
 
                );
214
 
        }
215
 
}
216
 
 
217
 
if (!$post_id)
218
 
{
219
 
        $sql_array['WHERE'] = "t.topic_id = $topic_id";
220
 
}
221
 
else
222
 
{
223
 
        $sql_array['WHERE'] = "p.post_id = $post_id AND t.topic_id = p.topic_id" . ((!$auth->acl_get('m_approve', $forum_id)) ? ' AND p.post_approved = 1' : '');
224
 
        $sql_array['FROM'][POSTS_TABLE] = 'p';
225
 
}
226
 
 
227
 
$sql_array['WHERE'] .= ' AND (f.forum_id = t.forum_id';
228
 
 
229
 
if (!$forum_id)
230
 
{
231
 
        // If it is a global announcement make sure to set the forum id to a postable forum
232
 
        $sql_array['WHERE'] .= ' OR (t.topic_type = ' . POST_GLOBAL . '
233
 
                AND f.forum_type = ' . FORUM_POST . ')';
234
 
}
235
 
else
236
 
{
237
 
        $sql_array['WHERE'] .= ' OR (t.topic_type = ' . POST_GLOBAL . "
238
 
                AND f.forum_id = $forum_id)";
239
 
}
240
 
 
241
 
$sql_array['WHERE'] .= ')';
242
 
$sql_array['FROM'][TOPICS_TABLE] = 't';
243
 
 
244
 
// Join to forum table on topic forum_id unless topic forum_id is zero
245
 
// whereupon we join on the forum_id passed as a parameter ... this
246
 
// is done so navigation, forum name, etc. remain consistent with where
247
 
// user clicked to view a global topic
248
 
$sql = $db->sql_build_query('SELECT', $sql_array);
249
 
$result = $db->sql_query($sql);
250
 
$topic_data = $db->sql_fetchrow($result);
251
 
$db->sql_freeresult($result);
252
 
 
253
 
if (!$topic_data)
254
 
{
255
 
        // If post_id was submitted, we try at least to display the topic as a last resort...
256
 
        if ($post_id && $forum_id && $topic_id)
257
 
        {
258
 
                redirect(append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id"));
259
 
        }
260
 
 
261
 
        trigger_error('NO_TOPIC');
262
 
}
263
 
 
264
 
// This is for determining where we are (page)
265
 
if ($post_id)
266
 
{
267
 
        if ($post_id == $topic_data['topic_first_post_id'] || $post_id == $topic_data['topic_last_post_id'])
268
 
        {
269
 
                $check_sort = ($post_id == $topic_data['topic_first_post_id']) ? 'd' : 'a';
270
 
 
271
 
                if ($sort_dir == $check_sort)
272
 
                {
273
 
                        $topic_data['prev_posts'] = ($auth->acl_get('m_approve', $forum_id)) ? $topic_data['topic_replies_real'] : $topic_data['topic_replies'];
274
 
                }
275
 
                else
276
 
                {
277
 
                        $topic_data['prev_posts'] = 0;
278
 
                }
279
 
        }
280
 
        else
281
 
        {
282
 
                $sql = 'SELECT COUNT(p1.post_id) AS prev_posts
283
 
                        FROM ' . POSTS_TABLE . ' p1, ' . POSTS_TABLE . " p2
284
 
                        WHERE p1.topic_id = {$topic_data['topic_id']}
285
 
                                AND p2.post_id = {$post_id}
286
 
                                " . ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND p1.post_approved = 1' : '') . '
287
 
                                AND ' . (($sort_dir == 'd') ? 'p1.post_time >= p2.post_time' : 'p1.post_time <= p2.post_time');
288
 
 
289
 
                $result = $db->sql_query($sql);
290
 
                $row = $db->sql_fetchrow($result);
291
 
                $db->sql_freeresult($result);
292
 
 
293
 
                $topic_data['prev_posts'] = $row['prev_posts'] - 1;
294
 
        }
295
 
}
296
 
 
297
 
$forum_id = (int) $topic_data['forum_id'];
298
 
$topic_id = (int) $topic_data['topic_id'];
299
 
 
300
 
//
301
 
$topic_replies = ($auth->acl_get('m_approve', $forum_id)) ? $topic_data['topic_replies_real'] : $topic_data['topic_replies'];
302
 
 
303
 
// Check sticky/announcement time limit
304
 
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())
305
 
{
306
 
        $sql = 'UPDATE ' . TOPICS_TABLE . '
307
 
                SET topic_type = ' . POST_NORMAL . ', topic_time_limit = 0
308
 
                WHERE topic_id = ' . $topic_id;
309
 
        $db->sql_query($sql);
310
 
 
311
 
        $topic_data['topic_type'] = POST_NORMAL;
312
 
        $topic_data['topic_time_limit'] = 0;
313
 
}
314
 
 
315
 
// Setup look and feel
316
 
$user->setup('viewtopic', $topic_data['forum_style']);
317
 
 
318
 
if (!$topic_data['topic_approved'] && !$auth->acl_get('m_approve', $forum_id))
319
 
{
320
 
        trigger_error('NO_TOPIC');
321
 
}
322
 
 
323
 
// Start auth check
324
 
if (!$auth->acl_get('f_read', $forum_id))
325
 
{
326
 
        if ($user->data['user_id'] != ANONYMOUS)
327
 
        {
328
 
                trigger_error('SORRY_AUTH_READ');
329
 
        }
330
 
 
331
 
        login_box('', $user->lang['LOGIN_VIEWFORUM']);
332
 
}
333
 
 
334
 
// Forum is passworded ... check whether access has been granted to this
335
 
// user this session, if not show login box
336
 
if ($topic_data['forum_password'])
337
 
{
338
 
        login_forum_box($topic_data);
339
 
}
340
 
 
341
 
// Redirect to login or to the correct post upon emailed notification links
342
 
if (isset($_GET['e']))
343
 
{
344
 
        $jump_to = request_var('e', 0);
345
 
 
346
 
        $redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id");
347
 
 
348
 
        if ($user->data['user_id'] == ANONYMOUS)
349
 
        {
350
 
                login_box($redirect_url . "&amp;p=$post_id&amp;e=$jump_to", $user->lang['LOGIN_NOTIFY_TOPIC']);
351
 
        }
352
 
 
353
 
        if ($jump_to > 0)
354
 
        {
355
 
                // We direct the already logged in user to the correct post...
356
 
                redirect($redirect_url . ((!$post_id) ? "&amp;p=$jump_to" : "&amp;p=$post_id") . "#p$jump_to");
357
 
        }
358
 
}
359
 
 
360
 
// What is start equal to?
361
 
if ($post_id)
362
 
{
363
 
        $start = floor(($topic_data['prev_posts']) / $config['posts_per_page']) * $config['posts_per_page'];
364
 
}
365
 
 
366
 
// Get topic tracking info
367
 
if (!isset($topic_tracking_info))
368
 
{
369
 
        $topic_tracking_info = array();
370
 
 
371
 
        // Get topic tracking info
372
 
        if ($config['load_db_lastread'] && $user->data['is_registered'])
373
 
        {
374
 
                $tmp_topic_data = array($topic_id => $topic_data);
375
 
                $topic_tracking_info = get_topic_tracking($forum_id, $topic_id, $tmp_topic_data, array($forum_id => $topic_data['forum_mark_time']));
376
 
                unset($tmp_topic_data);
377
 
        }
378
 
        else if ($config['load_anon_lastread'] || $user->data['is_registered'])
379
 
        {
380
 
                $topic_tracking_info = get_complete_topic_tracking($forum_id, $topic_id);
381
 
        }
382
 
}
383
 
 
384
 
// Post ordering options
385
 
$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']);
386
 
 
387
 
$sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 's' => $user->lang['SUBJECT']);
388
 
$sort_by_sql = array('a' => 'u.username_clean', 't' => 'p.post_time', 's' => 'p.post_subject');
389
 
 
390
 
$s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';
391
 
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);
392
 
 
393
 
// Obtain correct post count and ordering SQL if user has
394
 
// requested anything different
395
 
if ($sort_days)
396
 
{
397
 
        $min_post_time = time() - ($sort_days * 86400);
398
 
 
399
 
        $sql = 'SELECT COUNT(post_id) AS num_posts
400
 
                FROM ' . POSTS_TABLE . "
401
 
                WHERE topic_id = $topic_id
402
 
                        AND post_time >= $min_post_time
403
 
                " . (($auth->acl_get('m_approve', $forum_id)) ? '' : 'AND post_approved = 1');
404
 
        $result = $db->sql_query($sql);
405
 
        $total_posts = (int) $db->sql_fetchfield('num_posts');
406
 
        $db->sql_freeresult($result);
407
 
 
408
 
        $limit_posts_time = "AND p.post_time >= $min_post_time ";
409
 
 
410
 
        if (isset($_POST['sort']))
411
 
        {
412
 
                $start = 0;
413
 
        }
414
 
}
415
 
else
416
 
{
417
 
        $total_posts = $topic_replies + 1;
418
 
        $limit_posts_time = '';
419
 
}
420
 
 
421
 
// Was a highlight request part of the URI?
422
 
$highlight_match = $highlight = '';
423
 
if ($hilit_words)
424
 
{
425
 
        foreach (explode(' ', trim($hilit_words)) as $word)
426
 
        {
427
 
                if (trim($word))
428
 
                {
429
 
                        $word = str_replace('\*', '\w+?', preg_quote($word, '#'));
430
 
                        $word = preg_replace('#(^|\s)\\\\w\*\?(\s|$)#', '$1\w+?$2', $word);
431
 
                        $highlight_match .= (($highlight_match != '') ? '|' : '') . $word;
432
 
                }
433
 
        }
434
 
 
435
 
        $highlight = urlencode($hilit_words);
436
 
}
437
 
 
438
 
// Make sure $start is set to the last page if it exceeds the amount
439
 
if ($start < 0 || $start > $total_posts)
440
 
{
441
 
        $start = ($start < 0) ? 0 : floor(($total_posts - 1) / $config['posts_per_page']) * $config['posts_per_page'];
442
 
}
443
 
 
444
 
// General Viewtopic URL for return links
445
 
$viewtopic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;start=$start&amp;$u_sort_param" . (($highlight_match) ? "&amp;hilit=$highlight" : ''));
446
 
 
447
 
// Are we watching this topic?
448
 
$s_watching_topic = $s_watching_topic_img = array();
449
 
$s_watching_topic['link'] = $s_watching_topic['title'] = '';
450
 
$s_watching_topic['is_watching'] = false;
451
 
 
452
 
if ($config['email_enable'] && $config['allow_topic_notify'] && $user->data['is_registered'])
453
 
{
454
 
        watch_topic_forum('topic', $s_watching_topic, $s_watching_topic_img, $user->data['user_id'], $forum_id, $topic_id, $topic_data['notify_status'], $start);
455
 
}
456
 
 
457
 
// Bookmarks
458
 
if ($config['allow_bookmarks'] && $user->data['is_registered'] && request_var('bookmark', 0))
459
 
{
460
 
        if (!$topic_data['bookmarked'])
461
 
        {
462
 
                $sql = 'INSERT INTO ' . BOOKMARKS_TABLE . ' ' . $db->sql_build_array('INSERT', array(
463
 
                        'user_id'       => $user->data['user_id'],
464
 
                        'topic_id'      => $topic_id,
465
 
                ));
466
 
                $db->sql_query($sql);
467
 
        }
468
 
        else
469
 
        {
470
 
                $sql = 'DELETE FROM ' . BOOKMARKS_TABLE . "
471
 
                        WHERE user_id = {$user->data['user_id']}
472
 
                                AND topic_id = $topic_id";
473
 
                $db->sql_query($sql);
474
 
        }
475
 
 
476
 
        meta_refresh(3, $viewtopic_url);
477
 
 
478
 
        $message = (($topic_data['bookmarked']) ? $user->lang['BOOKMARK_REMOVED'] : $user->lang['BOOKMARK_ADDED']) . '<br /><br />' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $viewtopic_url . '">', '</a>');
479
 
        trigger_error($message);
480
 
}
481
 
 
482
 
// Grab ranks
483
 
$ranks = $cache->obtain_ranks();
484
 
 
485
 
// Grab icons
486
 
$icons = $cache->obtain_icons();
487
 
 
488
 
// Grab extensions
489
 
$extensions = array();
490
 
if ($topic_data['topic_attachment'])
491
 
{
492
 
        $extensions = $cache->obtain_attach_extensions($forum_id);
493
 
}
494
 
 
495
 
// Forum rules listing
496
 
$s_forum_rules = '';
497
 
gen_forum_auth_level('topic', $forum_id, $topic_data['forum_status']);
498
 
 
499
 
// Quick mod tools
500
 
$allow_change_type = ($auth->acl_get('m_', $forum_id) || ($user->data['is_registered'] && $user->data['user_id'] == $topic_data['topic_poster'])) ? true : false;
501
 
 
502
 
$topic_mod = '';
503
 
$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>') : '';
504
 
$topic_mod .= ($auth->acl_get('m_delete', $forum_id)) ? '<option value="delete_topic">' . $user->lang['DELETE_TOPIC'] . '</option>' : '';
505
 
$topic_mod .= ($auth->acl_get('m_move', $forum_id) && $topic_data['topic_status'] != ITEM_MOVED) ? '<option value="move">' . $user->lang['MOVE_TOPIC'] . '</option>' : '';
506
 
$topic_mod .= ($auth->acl_get('m_split', $forum_id)) ? '<option value="split">' . $user->lang['SPLIT_TOPIC'] . '</option>' : '';
507
 
$topic_mod .= ($auth->acl_get('m_merge', $forum_id)) ? '<option value="merge">' . $user->lang['MERGE_POSTS'] . '</option>' : '';
508
 
$topic_mod .= ($auth->acl_get('m_merge', $forum_id)) ? '<option value="merge_topic">' . $user->lang['MERGE_TOPIC'] . '</option>' : '';
509
 
$topic_mod .= ($auth->acl_get('m_move', $forum_id)) ? '<option value="fork">' . $user->lang['FORK_TOPIC'] . '</option>' : '';
510
 
$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>' : '';
511
 
$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>' : '';
512
 
$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>' : '';
513
 
$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>' : '';
514
 
$topic_mod .= ($auth->acl_get('m_', $forum_id)) ? '<option value="topic_logs">' . $user->lang['VIEW_TOPIC_LOGS'] . '</option>' : '';
515
 
 
516
 
// If we've got a hightlight set pass it on to pagination.
517
 
$pagination = generate_pagination(append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;$u_sort_param" . (($highlight_match) ? "&amp;hilit=$highlight" : '')), $total_posts, $config['posts_per_page'], $start);
518
 
 
519
 
// Navigation links
520
 
generate_forum_nav($topic_data);
521
 
 
522
 
// Forum Rules
523
 
generate_forum_rules($topic_data);
524
 
 
525
 
// Moderators
526
 
$forum_moderators = array();
527
 
get_moderators($forum_moderators, $forum_id);
528
 
 
529
 
// This is only used for print view so ...
530
 
$server_path = (!$view) ? $phpbb_root_path : generate_board_url() . '/';
531
 
 
532
 
// Replace naughty words in title
533
 
$topic_data['topic_title'] = censor_text($topic_data['topic_title']);
534
 
 
535
 
// Send vars to template
536
 
$template->assign_vars(array(
537
 
        'FORUM_ID'              => $forum_id,
538
 
        'FORUM_NAME'    => $topic_data['forum_name'],
539
 
        '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']),
540
 
        'TOPIC_ID'              => $topic_id,
541
 
        'TOPIC_TITLE'   => $topic_data['topic_title'],
542
 
        'TOPIC_POSTER'  => $topic_data['topic_poster'],
543
 
 
544
 
        'TOPIC_AUTHOR_FULL'             => get_username_string('full', $topic_data['topic_poster'], $topic_data['topic_first_poster_name'], $topic_data['topic_first_poster_colour']),
545
 
        'TOPIC_AUTHOR_COLOUR'   => get_username_string('colour', $topic_data['topic_poster'], $topic_data['topic_first_poster_name'], $topic_data['topic_first_poster_colour']),
546
 
        'TOPIC_AUTHOR'                  => get_username_string('username', $topic_data['topic_poster'], $topic_data['topic_first_poster_name'], $topic_data['topic_first_poster_colour']),
547
 
 
548
 
        'PAGINATION'    => $pagination,
549
 
        'PAGE_NUMBER'   => on_page($total_posts, $config['posts_per_page'], $start),
550
 
        'TOTAL_POSTS'   => ($total_posts == 1) ? $user->lang['VIEW_TOPIC_POST'] : sprintf($user->lang['VIEW_TOPIC_POSTS'], $total_posts),
551
 
        'U_MCP'                 => ($auth->acl_get('m_', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&amp;mode=topic_view&amp;f=$forum_id&amp;t=$topic_id&amp;start=$start&amp;$u_sort_param", true, $user->session_id) : '',
552
 
        'MODERATORS'    => (isset($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id])) ? implode(', ', $forum_moderators[$forum_id]) : '',
553
 
 
554
 
        'POST_IMG'                      => ($topic_data['forum_status'] == ITEM_LOCKED) ? $user->img('button_topic_locked', 'FORUM_LOCKED') : $user->img('button_topic_new', 'POST_NEW_TOPIC'),
555
 
        'QUOTE_IMG'             => $user->img('icon_post_quote', 'REPLY_WITH_QUOTE'),
556
 
        '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'),
557
 
        'EDIT_IMG'                      => $user->img('icon_post_edit', 'EDIT_POST'),
558
 
        'DELETE_IMG'            => $user->img('icon_post_delete', 'DELETE_POST'),
559
 
        'INFO_IMG'                      => $user->img('icon_post_info', 'VIEW_INFO'),
560
 
        'PROFILE_IMG'           => $user->img('icon_user_profile', 'READ_PROFILE'),
561
 
        'SEARCH_IMG'            => $user->img('icon_user_search', 'SEARCH_USER_POSTS'),
562
 
        'PM_IMG'                        => $user->img('icon_contact_pm', 'SEND_PRIVATE_MESSAGE'),
563
 
        'EMAIL_IMG'             => $user->img('icon_contact_email', 'SEND_EMAIL'),
564
 
        'WWW_IMG'                       => $user->img('icon_contact_www', 'VISIT_WEBSITE'),
565
 
        'ICQ_IMG'                       => $user->img('icon_contact_icq', 'ICQ'),
566
 
        'AIM_IMG'                       => $user->img('icon_contact_aim', 'AIM'),
567
 
        'MSN_IMG'                       => $user->img('icon_contact_msnm', 'MSNM'),
568
 
        'YIM_IMG'                       => $user->img('icon_contact_yahoo', 'YIM'),
569
 
        'JABBER_IMG'            => $user->img('icon_contact_jabber', 'JABBER') ,
570
 
        'REPORT_IMG'            => $user->img('icon_post_report', 'REPORT_POST'),
571
 
        'REPORTED_IMG'          => $user->img('icon_topic_reported', 'POST_REPORTED'),
572
 
        'UNAPPROVED_IMG'        => $user->img('icon_topic_unapproved', 'POST_UNAPPROVED'),
573
 
        'WARN_IMG'                      => $user->img('icon_user_warn', 'WARN_USER'),
574
 
 
575
 
        'S_IS_LOCKED'                   =>($topic_data['topic_status'] == ITEM_UNLOCKED) ? false : true,
576
 
        'S_SELECT_SORT_DIR'     => $s_sort_dir,
577
 
        'S_SELECT_SORT_KEY'     => $s_sort_key,
578
 
        'S_SELECT_SORT_DAYS'    => $s_limit_days,
579
 
        'S_SINGLE_MODERATOR'    => (!empty($forum_moderators[$forum_id]) && sizeof($forum_moderators[$forum_id]) > 1) ? false : true,
580
 
        'S_TOPIC_ACTION'                => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;start=$start"),
581
 
        'S_TOPIC_MOD'                   => ($topic_mod != '') ? '<select name="action">' . $topic_mod . '</select>' : '',
582
 
        'S_MOD_ACTION'                  => append_sid("{$phpbb_root_path}mcp.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;quickmod=1&amp;redirect=" . urlencode(str_replace('&amp;', '&', $viewtopic_url)), true, $user->session_id),
583
 
 
584
 
        'S_VIEWTOPIC'                   => true,
585
 
        'S_DISPLAY_SEARCHBOX'   => ($auth->acl_get('u_search') && $auth->acl_get('f_search', $forum_id) && $config['load_search']) ? true : false,
586
 
        'S_SEARCHBOX_ACTION'    => append_sid("{$phpbb_root_path}search.$phpEx", 't=' . $topic_id),
587
 
 
588
 
        'S_DISPLAY_POST_INFO'   => ($topic_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
589
 
        'S_DISPLAY_REPLY_INFO'  => ($topic_data['forum_type'] == FORUM_POST && ($auth->acl_get('f_reply', $forum_id) || $user->data['user_id'] == ANONYMOUS)) ? true : false,
590
 
 
591
 
        'U_TOPIC'                               => "{$server_path}viewtopic.$phpEx?f=$forum_id&amp;t=$topic_id",
592
 
        'U_FORUM'                               => $server_path,
593
 
        'U_VIEW_TOPIC'                  => $viewtopic_url,
594
 
        'U_VIEW_FORUM'                  => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id),
595
 
        'U_VIEW_OLDER_TOPIC'    => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;view=previous"),
596
 
        'U_VIEW_NEWER_TOPIC'    => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;view=next"),
597
 
        'U_PRINT_TOPIC'                 => ($auth->acl_get('f_print', $forum_id)) ? $viewtopic_url . '&amp;view=print' : '',
598
 
        'U_EMAIL_TOPIC'                 => ($auth->acl_get('f_email', $forum_id) && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=email&amp;t=$topic_id") : '',
599
 
 
600
 
        'U_WATCH_TOPIC'                 => $s_watching_topic['link'],
601
 
        'L_WATCH_TOPIC'                 => $s_watching_topic['title'],
602
 
        'S_WATCHING_TOPIC'              => $s_watching_topic['is_watching'],
603
 
 
604
 
        'U_BOOKMARK_TOPIC'              => ($user->data['is_registered'] && $config['allow_bookmarks']) ? $viewtopic_url . '&amp;bookmark=1' : '',
605
 
        'L_BOOKMARK_TOPIC'              => ($user->data['is_registered'] && $config['allow_bookmarks'] && $topic_data['bookmarked']) ? $user->lang['BOOKMARK_TOPIC_REMOVE'] : $user->lang['BOOKMARK_TOPIC'],
606
 
 
607
 
        'U_POST_NEW_TOPIC'              => ($auth->acl_get('f_post', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=post&amp;f=$forum_id") : '',
608
 
        'U_POST_REPLY_TOPIC'    => ($auth->acl_get('f_reply', $forum_id) || $user->data['user_id'] == ANONYMOUS) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=reply&amp;f=$forum_id&amp;t=$topic_id") : '',
609
 
        'U_BUMP_TOPIC'                  => (bump_topic_allowed($forum_id, $topic_data['topic_bumped'], $topic_data['topic_last_post_time'], $topic_data['topic_poster'], $topic_data['topic_last_poster_id'])) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=bump&amp;f=$forum_id&amp;t=$topic_id") : '')
610
 
);
611
 
 
612
 
// Does this topic contain a poll?
613
 
if (!empty($topic_data['poll_start']))
614
 
{
615
 
        $sql = 'SELECT o.*, p.bbcode_bitfield, p.bbcode_uid
616
 
                FROM ' . POLL_OPTIONS_TABLE . ' o, ' . POSTS_TABLE . " p
617
 
                WHERE o.topic_id = $topic_id
618
 
                        AND p.post_id = {$topic_data['topic_first_post_id']}
619
 
                        AND p.topic_id = o.topic_id
620
 
                ORDER BY o.poll_option_id";
621
 
        $result = $db->sql_query($sql);
622
 
 
623
 
        $poll_info = array();
624
 
        while ($row = $db->sql_fetchrow($result))
625
 
        {
626
 
                $poll_info[] = $row;
627
 
        }
628
 
        $db->sql_freeresult($result);
629
 
 
630
 
        $cur_voted_id = array();
631
 
        if ($user->data['is_registered'])
632
 
        {
633
 
                $sql = 'SELECT poll_option_id
634
 
                        FROM ' . POLL_VOTES_TABLE . '
635
 
                        WHERE topic_id = ' . $topic_id . '
636
 
                                AND vote_user_id = ' . $user->data['user_id'];
637
 
                $result = $db->sql_query($sql);
638
 
 
639
 
                while ($row = $db->sql_fetchrow($result))
640
 
                {
641
 
                        $cur_voted_id[] = $row['poll_option_id'];
642
 
                }
643
 
                $db->sql_freeresult($result);
644
 
        }
645
 
        else
646
 
        {
647
 
                // Cookie based guest tracking ... I don't like this but hum ho
648
 
                // it's oft requested. This relies on "nice" users who don't feel
649
 
                // the need to delete cookies to mess with results.
650
 
                if (isset($_COOKIE[$config['cookie_name'] . '_poll_' . $topic_id]))
651
 
                {
652
 
                        $cur_voted_id = explode(',', $_COOKIE[$config['cookie_name'] . '_poll_' . $topic_id]);
653
 
                        $cur_voted_id = array_map('intval', $cur_voted_id);
654
 
                }
655
 
        }
656
 
 
657
 
        $s_can_vote = (((!sizeof($cur_voted_id) && $auth->acl_get('f_vote', $forum_id)) ||
658
 
                ($auth->acl_get('f_votechg', $forum_id) && $topic_data['poll_vote_change'])) &&
659
 
                (($topic_data['poll_length'] != 0 && $topic_data['poll_start'] + $topic_data['poll_length'] > time()) || $topic_data['poll_length'] == 0) &&
660
 
                $topic_data['topic_status'] != ITEM_LOCKED &&
661
 
                $topic_data['forum_status'] != ITEM_LOCKED) ? true : false;
662
 
        $s_display_results = (!$s_can_vote || ($s_can_vote && sizeof($cur_voted_id)) || $view == 'viewpoll') ? true : false;
663
 
 
664
 
        if ($update && $s_can_vote)
665
 
        {
666
 
                
667
 
                if (!sizeof($voted_id) || sizeof($voted_id) > $topic_data['poll_max_options'] || in_array(VOTE_CONVERTED, $cur_voted_id))
668
 
                {
669
 
                        $redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;start=$start");
670
 
 
671
 
                        meta_refresh(5, $redirect_url);
672
 
                        if (!sizeof($voted_id))
673
 
                        {
674
 
                                $message = 'NO_VOTE_OPTION';
675
 
                        }
676
 
                        else if (sizeof($voted_id) > $topic_data['poll_max_options'])
677
 
                        {
678
 
                                $message = 'TOO_MANY_VOTE_OPTIONS';
679
 
                        }
680
 
                        else
681
 
                        {
682
 
                                $message = 'VOTE_CONVERTED';
683
 
                        }
684
 
 
685
 
                        $message = $user->lang[$message] . '<br /><br />' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $redirect_url . '">', '</a>');
686
 
                        trigger_error($message);
687
 
                }
688
 
 
689
 
                foreach ($voted_id as $option)
690
 
                {
691
 
                        if (in_array($option, $cur_voted_id))
692
 
                        {
693
 
                                continue;
694
 
                        }
695
 
 
696
 
                        $sql = 'UPDATE ' . POLL_OPTIONS_TABLE . '
697
 
                                SET poll_option_total = poll_option_total + 1
698
 
                                WHERE poll_option_id = ' . (int) $option . '
699
 
                                        AND topic_id = ' . (int) $topic_id;
700
 
                        $db->sql_query($sql);
701
 
 
702
 
                        if ($user->data['is_registered'])
703
 
                        {
704
 
                                $sql_ary = array(
705
 
                                        'topic_id'                      => (int) $topic_id,
706
 
                                        'poll_option_id'        => (int) $option,
707
 
                                        'vote_user_id'          => (int) $user->data['user_id'],
708
 
                                        'vote_user_ip'          => (string) $user->ip,
709
 
                                );
710
 
 
711
 
                                $sql = 'INSERT INTO ' . POLL_VOTES_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
712
 
                                $db->sql_query($sql);
713
 
                        }
714
 
                }
715
 
 
716
 
                foreach ($cur_voted_id as $option)
717
 
                {
718
 
                        if (!in_array($option, $voted_id))
719
 
                        {
720
 
                                $sql = 'UPDATE ' . POLL_OPTIONS_TABLE . '
721
 
                                        SET poll_option_total = poll_option_total - 1
722
 
                                        WHERE poll_option_id = ' . (int) $option . '
723
 
                                                AND topic_id = ' . (int) $topic_id;
724
 
                                $db->sql_query($sql);
725
 
 
726
 
                                if ($user->data['is_registered'])
727
 
                                {
728
 
                                        $sql = 'DELETE FROM ' . POLL_VOTES_TABLE . '
729
 
                                                WHERE topic_id = ' . (int) $topic_id . '
730
 
                                                        AND poll_option_id = ' . (int) $option . '
731
 
                                                        AND vote_user_id = ' . (int) $user->data['user_id'];
732
 
                                        $db->sql_query($sql);
733
 
                                }
734
 
                        }
735
 
                }
736
 
 
737
 
                if ($user->data['user_id'] == ANONYMOUS && !$user->data['is_bot'])
738
 
                {
739
 
                        $user->set_cookie('poll_' . $topic_id, implode(',', $voted_id), time() + 31536000);
740
 
                }
741
 
 
742
 
                $sql = 'UPDATE ' . TOPICS_TABLE . '
743
 
                        SET poll_last_vote = ' . time() . "
744
 
                        WHERE topic_id = $topic_id";
745
 
                //, topic_last_post_time = ' . time() . " -- for bumping topics with new votes, ignore for now
746
 
                $db->sql_query($sql);
747
 
 
748
 
                $redirect_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;start=$start");
749
 
 
750
 
                meta_refresh(5, $redirect_url);
751
 
                trigger_error($user->lang['VOTE_SUBMITTED'] . '<br /><br />' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $redirect_url . '">', '</a>'));
752
 
        }
753
 
 
754
 
        $poll_total = 0;
755
 
        foreach ($poll_info as $poll_option)
756
 
        {
757
 
                $poll_total += $poll_option['poll_option_total'];
758
 
        }
759
 
 
760
 
        if ($poll_info[0]['bbcode_bitfield'])
761
 
        {
762
 
                $poll_bbcode = new bbcode();
763
 
        }
764
 
        else
765
 
        {
766
 
                $poll_bbcode = false;
767
 
        }
768
 
 
769
 
        for ($i = 0, $size = sizeof($poll_info); $i < $size; $i++)
770
 
        {
771
 
                $poll_info[$i]['poll_option_text'] = censor_text($poll_info[$i]['poll_option_text']);
772
 
 
773
 
                if ($poll_bbcode !== false)
774
 
                {
775
 
                        $poll_bbcode->bbcode_second_pass($poll_info[$i]['poll_option_text'], $poll_info[$i]['bbcode_uid'], $poll_option['bbcode_bitfield']);
776
 
                }
777
 
 
778
 
                $poll_info[$i]['poll_option_text'] = bbcode_nl2br($poll_info[$i]['poll_option_text']);
779
 
                $poll_info[$i]['poll_option_text'] = smiley_text($poll_info[$i]['poll_option_text']);
780
 
        }
781
 
 
782
 
        $topic_data['poll_title'] = censor_text($topic_data['poll_title']);
783
 
 
784
 
        if ($poll_bbcode !== false)
785
 
        {
786
 
                $poll_bbcode->bbcode_second_pass($topic_data['poll_title'], $poll_info[0]['bbcode_uid'], $poll_info[0]['bbcode_bitfield']);
787
 
        }
788
 
 
789
 
        $topic_data['poll_title'] = bbcode_nl2br($topic_data['poll_title']);
790
 
        $topic_data['poll_title'] = smiley_text($topic_data['poll_title']);
791
 
 
792
 
        unset($poll_bbcode);
793
 
 
794
 
        foreach ($poll_info as $poll_option)
795
 
        {
796
 
                $option_pct = ($poll_total > 0) ? $poll_option['poll_option_total'] / $poll_total : 0;
797
 
                $option_pct_txt = sprintf("%.1d%%", ($option_pct * 100));
798
 
 
799
 
                $template->assign_block_vars('poll_option', array(
800
 
                        'POLL_OPTION_ID'                => $poll_option['poll_option_id'],
801
 
                        'POLL_OPTION_CAPTION'   => $poll_option['poll_option_text'],
802
 
                        'POLL_OPTION_RESULT'    => $poll_option['poll_option_total'],
803
 
                        'POLL_OPTION_PERCENT'   => $option_pct_txt,
804
 
                        'POLL_OPTION_PCT'               => round($option_pct * 100),
805
 
                        'POLL_OPTION_IMG'               => $user->img('poll_center', $option_pct_txt, round($option_pct * 250)),
806
 
                        'POLL_OPTION_VOTED'             => (in_array($poll_option['poll_option_id'], $cur_voted_id)) ? true : false)
807
 
                );
808
 
        }
809
 
 
810
 
        $poll_end = $topic_data['poll_length'] + $topic_data['poll_start'];
811
 
 
812
 
        $template->assign_vars(array(
813
 
                'POLL_QUESTION'         => $topic_data['poll_title'],
814
 
                'TOTAL_VOTES'           => $poll_total,
815
 
                'POLL_LEFT_CAP_IMG'     => $user->img('poll_left'),
816
 
                'POLL_RIGHT_CAP_IMG'=> $user->img('poll_right'),
817
 
 
818
 
                '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']),
819
 
                'L_POLL_LENGTH'         => ($topic_data['poll_length']) ? sprintf($user->lang[($poll_end > time()) ? 'POLL_RUN_TILL' : 'POLL_ENDED_AT'], $user->format_date($poll_end)) : '',
820
 
 
821
 
                'S_HAS_POLL'            => true,
822
 
                'S_CAN_VOTE'            => $s_can_vote,
823
 
                'S_DISPLAY_RESULTS'     => $s_display_results,
824
 
                'S_IS_MULTI_CHOICE'     => ($topic_data['poll_max_options'] > 1) ? true : false,
825
 
                'S_POLL_ACTION'         => $viewtopic_url,
826
 
 
827
 
                'U_VIEW_RESULTS'        => $viewtopic_url . '&amp;view=viewpoll')
828
 
        );
829
 
 
830
 
        unset($poll_end, $poll_info, $voted_id);
831
 
}
832
 
 
833
 
// If the user is trying to reach the second half of the topic, fetch it starting from the end
834
 
$store_reverse = false;
835
 
$sql_limit = $config['posts_per_page'];
836
 
 
837
 
if ($start > $total_posts / 2)
838
 
{
839
 
        $store_reverse = true;
840
 
 
841
 
        if ($start + $config['posts_per_page'] > $total_posts)
842
 
        {
843
 
                $sql_limit = min($config['posts_per_page'], max(1, $total_posts - $start));
844
 
        }
845
 
 
846
 
        // Select the sort order
847
 
        $sql_sort_order = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'ASC' : 'DESC');
848
 
        $sql_start = max(0, $total_posts - $sql_limit - $start);
849
 
}
850
 
else
851
 
{
852
 
        // Select the sort order
853
 
        $sql_sort_order = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC');
854
 
        $sql_start = $start;
855
 
}
856
 
 
857
 
// Container for user details, only process once
858
 
$post_list = $user_cache = $id_cache = $attachments = $attach_list = $rowset = $update_count = $post_edit_list = array();
859
 
$has_attachments = $display_notice = false;
860
 
$bbcode_bitfield = '';
861
 
$i = $i_total = 0;
862
 
 
863
 
// Go ahead and pull all data for this topic
864
 
$sql = 'SELECT p.post_id
865
 
        FROM ' . POSTS_TABLE . ' p' . (($sort_by_sql[$sort_key][0] == 'u') ? ', ' . USERS_TABLE . ' u': '') . "
866
 
        WHERE p.topic_id = $topic_id
867
 
                " . ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND p.post_approved = 1' : '') . "
868
 
                " . (($sort_by_sql[$sort_key][0] == 'u') ? 'AND u.user_id = p.poster_id': '') . "
869
 
                $limit_posts_time
870
 
        ORDER BY $sql_sort_order";
871
 
$result = $db->sql_query_limit($sql, $sql_limit, $sql_start);
872
 
 
873
 
$i = ($store_reverse) ? $sql_limit - 1 : 0;
874
 
while ($row = $db->sql_fetchrow($result))
875
 
{
876
 
        $post_list[$i] = $row['post_id'];
877
 
        ($store_reverse) ? $i-- : $i++;
878
 
}
879
 
$db->sql_freeresult($result);
880
 
 
881
 
if (!sizeof($post_list))
882
 
{
883
 
        if ($sort_days)
884
 
        {
885
 
                trigger_error('NO_POSTS_TIME_FRAME');
886
 
        }
887
 
        else
888
 
        {
889
 
                trigger_error('NO_TOPIC');
890
 
        }
891
 
}
892
 
 
893
 
// Holding maximum post time for marking topic read
894
 
// We need to grab it because we do reverse ordering sometimes
895
 
$max_post_time = 0;
896
 
 
897
 
$sql = $db->sql_build_query('SELECT', array(
898
 
        'SELECT'        => 'u.*, z.friend, z.foe, p.*',
899
 
 
900
 
        'FROM'          => array(
901
 
                USERS_TABLE             => 'u',
902
 
                POSTS_TABLE             => 'p',
903
 
        ),
904
 
 
905
 
        'LEFT_JOIN'     => array(
906
 
                array(
907
 
                        'FROM'  => array(ZEBRA_TABLE => 'z'),
908
 
                        'ON'    => 'z.user_id = ' . $user->data['user_id'] . ' AND z.zebra_id = p.poster_id'
909
 
                )
910
 
        ),
911
 
 
912
 
        'WHERE'         => $db->sql_in_set('p.post_id', $post_list) . '
913
 
                AND u.user_id = p.poster_id'
914
 
));
915
 
 
916
 
$result = $db->sql_query($sql);
917
 
 
918
 
$now = getdate(time() + $user->timezone + $user->dst - date('Z'));
919
 
 
920
 
// Posts are stored in the $rowset array while $attach_list, $user_cache
921
 
// and the global bbcode_bitfield are built
922
 
while ($row = $db->sql_fetchrow($result))
923
 
{
924
 
        // Set max_post_time
925
 
        if ($row['post_time'] > $max_post_time)
926
 
        {
927
 
                $max_post_time = $row['post_time'];
928
 
        }
929
 
 
930
 
        $poster_id = $row['poster_id'];
931
 
 
932
 
        // Does post have an attachment? If so, add it to the list
933
 
        if ($row['post_attachment'] && $config['allow_attachments'])
934
 
        {
935
 
                $attach_list[] = $row['post_id'];
936
 
 
937
 
                if ($row['post_approved'])
938
 
                {
939
 
                        $has_attachments = true;
940
 
                }
941
 
        }
942
 
 
943
 
        $rowset[$row['post_id']] = array(
944
 
                'hide_post'                     => ($row['foe'] && ($view != 'show' || $post_id != $row['post_id'])) ? true : false,
945
 
 
946
 
                'post_id'                       => $row['post_id'],
947
 
                'post_time'                     => $row['post_time'],
948
 
                'user_id'                       => $row['user_id'],
949
 
                'username'                      => $row['username'],
950
 
                'user_colour'           => $row['user_colour'],
951
 
                'topic_id'                      => $row['topic_id'],
952
 
                'forum_id'                      => $row['forum_id'],
953
 
                'post_subject'          => $row['post_subject'],
954
 
                'post_edit_count'       => $row['post_edit_count'],
955
 
                'post_edit_time'        => $row['post_edit_time'],
956
 
                'post_edit_reason'      => $row['post_edit_reason'],
957
 
                'post_edit_user'        => $row['post_edit_user'],
958
 
 
959
 
                // Make sure the icon actually exists
960
 
                'icon_id'                       => (isset($icons[$row['icon_id']]['img'], $icons[$row['icon_id']]['height'], $icons[$row['icon_id']]['width'])) ? $row['icon_id'] : 0,
961
 
                'post_attachment'       => $row['post_attachment'],
962
 
                'post_approved'         => $row['post_approved'],
963
 
                'post_reported'         => $row['post_reported'],
964
 
                'post_username'         => $row['post_username'],
965
 
                'post_text'                     => $row['post_text'],
966
 
                'bbcode_uid'            => $row['bbcode_uid'],
967
 
                'bbcode_bitfield'       => $row['bbcode_bitfield'],
968
 
                'enable_smilies'        => $row['enable_smilies'],
969
 
                'enable_sig'            => $row['enable_sig'],
970
 
                'friend'                        => $row['friend'],
971
 
                'foe'                           => $row['foe'],
972
 
        );
973
 
 
974
 
        // Define the global bbcode bitfield, will be used to load bbcodes
975
 
        $bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']);
976
 
 
977
 
        // Is a signature attached? Are we going to display it?
978
 
        if ($row['enable_sig'] && $config['allow_sig'] && $user->optionget('viewsigs'))
979
 
        {
980
 
                $bbcode_bitfield = $bbcode_bitfield | base64_decode($row['user_sig_bbcode_bitfield']);
981
 
        }
982
 
 
983
 
        // Cache various user specific data ... so we don't have to recompute
984
 
        // this each time the same user appears on this page
985
 
        if (!isset($user_cache[$poster_id]))
986
 
        {
987
 
                if ($poster_id == ANONYMOUS)
988
 
                {
989
 
                        $user_cache[$poster_id] = array(
990
 
                                'joined'                => '',
991
 
                                'posts'                 => '',
992
 
                                'from'                  => '',
993
 
 
994
 
                                'sig'                                   => '',
995
 
                                'sig_bbcode_uid'                => '',
996
 
                                'sig_bbcode_bitfield'   => '',
997
 
 
998
 
                                'online'                        => false,
999
 
                                'avatar'                        => '',
1000
 
                                'rank_title'            => '',
1001
 
                                'rank_image'            => '',
1002
 
                                'rank_image_src'        => '',
1003
 
                                'sig'                           => '',
1004
 
                                'posts'                         => '',
1005
 
                                'profile'                       => '',
1006
 
                                'pm'                            => '',
1007
 
                                'email'                         => '',
1008
 
                                'www'                           => '',
1009
 
                                'icq_status_img'        => '',
1010
 
                                'icq'                           => '',
1011
 
                                'aim'                           => '',
1012
 
                                'msn'                           => '',
1013
 
                                'yim'                           => '',
1014
 
                                'jabber'                        => '',
1015
 
                                'search'                        => '',
1016
 
                                'age'                           => '',
1017
 
 
1018
 
                                'username'                      => $row['username'],
1019
 
                                'user_colour'           => $row['user_colour'],
1020
 
 
1021
 
                                'warnings'                      => 0,
1022
 
                                'allow_pm'                      => 0,
1023
 
                        );
1024
 
                }
1025
 
                else
1026
 
                {
1027
 
                        $user_sig = '';
1028
 
 
1029
 
                        // We add the signature to every posters entry because enable_sig is post dependant
1030
 
                        if ($row['user_sig'] && $config['allow_sig'] && $user->optionget('viewsigs'))
1031
 
                        {
1032
 
                                $user_sig = $row['user_sig'];
1033
 
                        }
1034
 
 
1035
 
                        $id_cache[] = $poster_id;
1036
 
 
1037
 
                        $user_cache[$poster_id] = array(
1038
 
                                'joined'                => $user->format_date($row['user_regdate']),
1039
 
                                'posts'                 => $row['user_posts'],
1040
 
                                'warnings'              => (isset($row['user_warnings'])) ? $row['user_warnings'] : 0,
1041
 
                                'from'                  => (!empty($row['user_from'])) ? $row['user_from'] : '',
1042
 
 
1043
 
                                'sig'                                   => $user_sig,
1044
 
                                'sig_bbcode_uid'                => (!empty($row['user_sig_bbcode_uid'])) ? $row['user_sig_bbcode_uid'] : '',
1045
 
                                'sig_bbcode_bitfield'   => (!empty($row['user_sig_bbcode_bitfield'])) ? $row['user_sig_bbcode_bitfield'] : '',
1046
 
 
1047
 
                                'viewonline'    => $row['user_allow_viewonline'],
1048
 
                                'allow_pm'              => $row['user_allow_pm'],
1049
 
 
1050
 
                                'avatar'                => ($user->optionget('viewavatars')) ? get_user_avatar($row['user_avatar'], $row['user_avatar_type'], $row['user_avatar_width'], $row['user_avatar_height']) : '',
1051
 
                                'age'                   => '',
1052
 
 
1053
 
                                'rank_title'            => '',
1054
 
                                'rank_image'            => '',
1055
 
                                'rank_image_src'        => '',
1056
 
 
1057
 
                                'username'                      => $row['username'],
1058
 
                                'user_colour'           => $row['user_colour'],
1059
 
 
1060
 
                                'online'                => false,
1061
 
                                'profile'               => append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=viewprofile&amp;u=$poster_id"),
1062
 
                                'www'                   => $row['user_website'],
1063
 
                                'aim'                   => ($row['user_aim'] && $auth->acl_get('u_sendim')) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=contact&amp;action=aim&amp;u=$poster_id") : '',
1064
 
                                'msn'                   => ($row['user_msnm'] && $auth->acl_get('u_sendim')) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=contact&amp;action=msnm&amp;u=$poster_id") : '',
1065
 
                                'yim'                   => ($row['user_yim']) ? 'http://edit.yahoo.com/config/send_webmesg?.target=' . urlencode($row['user_yim']) . '&amp;.src=pg' : '',
1066
 
                                'jabber'                => ($row['user_jabber'] && $auth->acl_get('u_sendim')) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=contact&amp;action=jabber&amp;u=$poster_id") : '',
1067
 
                                'search'                => ($auth->acl_get('u_search')) ? append_sid("{$phpbb_root_path}search.$phpEx", 'search_author=' . urlencode($row['username']) .'&amp;showresults=posts') : '',
1068
 
                        );
1069
 
 
1070
 
                        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']);
1071
 
 
1072
 
                        if (!empty($row['user_allow_viewemail']) || $auth->acl_get('a_email'))
1073
 
                        {
1074
 
                                $user_cache[$poster_id]['email'] = ($config['board_email_form'] && $config['email_enable']) ? append_sid("{$phpbb_root_path}memberlist.$phpEx", "mode=email&amp;u=$poster_id") : (($config['board_hide_emails'] && !$auth->acl_get('a_email')) ? '' : 'mailto:' . $row['user_email']);
1075
 
                        }
1076
 
                        else
1077
 
                        {
1078
 
                                $user_cache[$poster_id]['email'] = '';
1079
 
                        }
1080
 
 
1081
 
                        if (!empty($row['user_icq']))
1082
 
                        {
1083
 
                                $user_cache[$poster_id]['icq'] = 'http://www.icq.com/people/webmsg.php?to=' . $row['user_icq'];
1084
 
                                $user_cache[$poster_id]['icq_status_img'] = '<img src="http://web.icq.com/whitepages/online?icq=' . $row['user_icq'] . '&amp;img=5" width="18" height="18" alt="" />';
1085
 
                        }
1086
 
                        else
1087
 
                        {
1088
 
                                $user_cache[$poster_id]['icq_status_img'] = '';
1089
 
                                $user_cache[$poster_id]['icq'] = '';
1090
 
                        }
1091
 
 
1092
 
                        if ($config['allow_birthdays'] && !empty($row['user_birthday']))
1093
 
                        {
1094
 
                                list($bday_day, $bday_month, $bday_year) = array_map('intval', explode('-', $row['user_birthday']));
1095
 
 
1096
 
                                if ($bday_year)
1097
 
                                {
1098
 
                                        $diff = $now['mon'] - $bday_month;
1099
 
                                        if ($diff == 0)
1100
 
                                        {
1101
 
                                                $diff = ($now['mday'] - $bday_day < 0) ? 1 : 0;
1102
 
                                        }
1103
 
                                        else
1104
 
                                        {
1105
 
                                                $diff = ($diff < 0) ? 1 : 0;
1106
 
                                        }
1107
 
 
1108
 
                                        $user_cache[$poster_id]['age'] = (int) ($now['year'] - $bday_year - $diff);
1109
 
                                }
1110
 
                        }
1111
 
                }
1112
 
        }
1113
 
}
1114
 
$db->sql_freeresult($result);
1115
 
 
1116
 
// Load custom profile fields
1117
 
if ($config['load_cpf_viewtopic'])
1118
 
{
1119
 
        include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);
1120
 
        $cp = new custom_profile();
1121
 
 
1122
 
        // Grab all profile fields from users in id cache for later use - similar to the poster cache
1123
 
        $profile_fields_cache = $cp->generate_profile_fields_template('grab', $id_cache);
1124
 
}
1125
 
 
1126
 
// Generate online information for user
1127
 
if ($config['load_onlinetrack'] && sizeof($id_cache))
1128
 
{
1129
 
        $sql = 'SELECT session_user_id, MAX(session_time) as online_time, MIN(session_viewonline) AS viewonline
1130
 
                FROM ' . SESSIONS_TABLE . '
1131
 
                WHERE ' . $db->sql_in_set('session_user_id', $id_cache) . '
1132
 
                GROUP BY session_user_id';
1133
 
        $result = $db->sql_query($sql);
1134
 
 
1135
 
        $update_time = $config['load_online_time'] * 60;
1136
 
        while ($row = $db->sql_fetchrow($result))
1137
 
        {
1138
 
                $user_cache[$row['session_user_id']]['online'] = (time() - $update_time < $row['online_time'] && (($row['viewonline']) || $auth->acl_get('u_viewonline'))) ? true : false;
1139
 
        }
1140
 
        $db->sql_freeresult($result);
1141
 
}
1142
 
unset($id_cache);
1143
 
 
1144
 
// Pull attachment data
1145
 
if (sizeof($attach_list))
1146
 
{
1147
 
        if ($auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id))
1148
 
        {
1149
 
                $sql = 'SELECT *
1150
 
                        FROM ' . ATTACHMENTS_TABLE . '
1151
 
                        WHERE ' . $db->sql_in_set('post_msg_id', $attach_list) . '
1152
 
                                AND in_message = 0
1153
 
                        ORDER BY filetime DESC, post_msg_id ASC';
1154
 
                $result = $db->sql_query($sql);
1155
 
 
1156
 
                while ($row = $db->sql_fetchrow($result))
1157
 
                {
1158
 
                        $attachments[$row['post_msg_id']][] = $row;
1159
 
                }
1160
 
                $db->sql_freeresult($result);
1161
 
 
1162
 
                // No attachments exist, but post table thinks they do so go ahead and reset post_attach flags
1163
 
                if (!sizeof($attachments))
1164
 
                {
1165
 
                        $sql = 'UPDATE ' . POSTS_TABLE . '
1166
 
                                SET post_attachment = 0
1167
 
                                WHERE ' . $db->sql_in_set('post_id', $attach_list);
1168
 
                        $db->sql_query($sql);
1169
 
 
1170
 
                        // We need to update the topic indicator too if the complete topic is now without an attachment
1171
 
                        if (sizeof($rowset) != $total_posts)
1172
 
                        {
1173
 
                                // Not all posts are displayed so we query the db to find if there's any attachment for this topic
1174
 
                                $sql = 'SELECT a.post_msg_id as post_id
1175
 
                                        FROM ' . ATTACHMENTS_TABLE . ' a, ' . POSTS_TABLE . " p
1176
 
                                        WHERE p.topic_id = $topic_id
1177
 
                                                AND p.post_approved = 1
1178
 
                                                AND p.topic_id = a.topic_id";
1179
 
                                $result = $db->sql_query_limit($sql, 1);
1180
 
                                $row = $db->sql_fetchrow($result);
1181
 
                                $db->sql_freeresult($result);
1182
 
 
1183
 
                                if (!$row)
1184
 
                                {
1185
 
                                        $sql = 'UPDATE ' . TOPICS_TABLE . "
1186
 
                                                SET topic_attachment = 0
1187
 
                                                WHERE topic_id = $topic_id";
1188
 
                                        $db->sql_query($sql);
1189
 
                                }
1190
 
                        }
1191
 
                        else
1192
 
                        {
1193
 
                                $sql = 'UPDATE ' . TOPICS_TABLE . "
1194
 
                                        SET topic_attachment = 0
1195
 
                                        WHERE topic_id = $topic_id";
1196
 
                                $db->sql_query($sql);
1197
 
                        }
1198
 
                }
1199
 
                else if ($has_attachments && !$topic_data['topic_attachment'])
1200
 
                {
1201
 
                        // Topic has approved attachments but its flag is wrong
1202
 
                        $sql = 'UPDATE ' . TOPICS_TABLE . "
1203
 
                                SET topic_attachment = 1
1204
 
                                WHERE topic_id = $topic_id";
1205
 
                        $db->sql_query($sql);
1206
 
 
1207
 
                        $topic_data['topic_attachment'] = 1;
1208
 
                }
1209
 
        }
1210
 
        else
1211
 
        {
1212
 
                $display_notice = true;
1213
 
        }
1214
 
}
1215
 
 
1216
 
// Instantiate BBCode if need be
1217
 
if ($bbcode_bitfield !== '')
1218
 
{
1219
 
        $bbcode = new bbcode(base64_encode($bbcode_bitfield));
1220
 
}
1221
 
 
1222
 
$i_total = sizeof($rowset) - 1;
1223
 
$prev_post_id = '';
1224
 
 
1225
 
$template->assign_vars(array(
1226
 
        'S_NUM_POSTS' => sizeof($post_list))
1227
 
);
1228
 
 
1229
 
// Output the posts
1230
 
$first_unread = $post_unread = false;
1231
 
for ($i = 0, $end = sizeof($post_list); $i < $end; ++$i)
1232
 
{
1233
 
        // A non-existing rowset only happens if there was no user present for the entered poster_id
1234
 
        // This could be a broken posts table.
1235
 
        if (!isset($rowset[$post_list[$i]]))
1236
 
        {
1237
 
                continue;
1238
 
        }
1239
 
 
1240
 
        $row =& $rowset[$post_list[$i]];
1241
 
        $poster_id = $row['user_id'];
1242
 
 
1243
 
        // End signature parsing, only if needed
1244
 
        if ($user_cache[$poster_id]['sig'] && $row['enable_sig'] && empty($user_cache[$poster_id]['sig_parsed']))
1245
 
        {
1246
 
                $user_cache[$poster_id]['sig'] = censor_text($user_cache[$poster_id]['sig']);
1247
 
 
1248
 
                if ($user_cache[$poster_id]['sig_bbcode_bitfield'])
1249
 
                {
1250
 
                        $bbcode->bbcode_second_pass($user_cache[$poster_id]['sig'], $user_cache[$poster_id]['sig_bbcode_uid'], $user_cache[$poster_id]['sig_bbcode_bitfield']);
1251
 
                }
1252
 
 
1253
 
                $user_cache[$poster_id]['sig'] = bbcode_nl2br($user_cache[$poster_id]['sig']);
1254
 
                $user_cache[$poster_id]['sig'] = smiley_text($user_cache[$poster_id]['sig']);
1255
 
                $user_cache[$poster_id]['sig_parsed'] = true;
1256
 
        }
1257
 
 
1258
 
        // Parse the message and subject
1259
 
        $message = censor_text($row['post_text']);
1260
 
 
1261
 
        // Second parse bbcode here
1262
 
        if ($row['bbcode_bitfield'])
1263
 
        {
1264
 
                $bbcode->bbcode_second_pass($message, $row['bbcode_uid'], $row['bbcode_bitfield']);
1265
 
        }
1266
 
 
1267
 
        $message = bbcode_nl2br($message);
1268
 
        $message = smiley_text($message);
1269
 
 
1270
 
        if (!empty($attachments[$row['post_id']]))
1271
 
        {
1272
 
                parse_attachments($forum_id, $message, $attachments[$row['post_id']], $update_count);
1273
 
        }
1274
 
 
1275
 
        // Replace naughty words such as farty pants
1276
 
        $row['post_subject'] = censor_text($row['post_subject']);
1277
 
 
1278
 
        // Highlight active words (primarily for search)
1279
 
        if ($highlight_match)
1280
 
        {
1281
 
                $message = preg_replace('#(?!<.*)(?<!\w)(' . $highlight_match . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#is', '<span class="posthilit">\1</span>', $message);
1282
 
                $row['post_subject'] = preg_replace('#(?!<.*)(?<!\w)(' . $highlight_match . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#is', '<span class="posthilit">\1</span>', $row['post_subject']);
1283
 
        }
1284
 
 
1285
 
        // Editing information
1286
 
        if (($row['post_edit_count'] && $config['display_last_edited']) || $row['post_edit_reason'])
1287
 
        {
1288
 
                // Get usernames for all following posts if not already stored
1289
 
                if (!sizeof($post_edit_list) && ($row['post_edit_reason'] || ($row['post_edit_user'] && !isset($user_cache[$row['post_edit_user']]))))
1290
 
                {
1291
 
                        // Remove all post_ids already parsed (we do not have to check them)
1292
 
                        $post_storage_list = (!$store_reverse) ? array_slice($post_list, $i) : array_slice(array_reverse($post_list), $i);
1293
 
 
1294
 
                        $sql = 'SELECT DISTINCT u.user_id, u.username, u.user_colour
1295
 
                                FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
1296
 
                                WHERE ' . $db->sql_in_set('p.post_id', $post_storage_list) . '
1297
 
                                        AND p.post_edit_count <> 0
1298
 
                                        AND p.post_edit_user <> 0
1299
 
                                        AND p.post_edit_user = u.user_id';
1300
 
                        $result2 = $db->sql_query($sql);
1301
 
                        while ($user_edit_row = $db->sql_fetchrow($result2))
1302
 
                        {
1303
 
                                $post_edit_list[$user_edit_row['user_id']] = $user_edit_row;
1304
 
                        }
1305
 
                        $db->sql_freeresult($result2);
1306
 
 
1307
 
                        unset($post_storage_list);
1308
 
                }
1309
 
 
1310
 
                $l_edit_time_total = ($row['post_edit_count'] == 1) ? $user->lang['EDITED_TIME_TOTAL'] : $user->lang['EDITED_TIMES_TOTAL'];
1311
 
 
1312
 
                if ($row['post_edit_reason'])
1313
 
                {
1314
 
                        // User having edited the post also being the post author?
1315
 
                        if (!$row['post_edit_user'] || $row['post_edit_user'] == $poster_id)
1316
 
                        {
1317
 
                                $display_username = get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']);
1318
 
                        }
1319
 
                        else
1320
 
                        {
1321
 
                                $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']);
1322
 
                        }
1323
 
 
1324
 
                        $l_edited_by = sprintf($l_edit_time_total, $display_username, $user->format_date($row['post_edit_time']), $row['post_edit_count']);
1325
 
                }
1326
 
                else
1327
 
                {
1328
 
                        if ($row['post_edit_user'] && !isset($user_cache[$row['post_edit_user']]))
1329
 
                        {
1330
 
                                $user_cache[$row['post_edit_user']] = $post_edit_list[$row['post_edit_user']];
1331
 
                        }
1332
 
 
1333
 
                        // User having edited the post also being the post author?
1334
 
                        if (!$row['post_edit_user'] || $row['post_edit_user'] == $poster_id)
1335
 
                        {
1336
 
                                $display_username = get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']);
1337
 
                        }
1338
 
                        else
1339
 
                        {
1340
 
                                $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']);
1341
 
                        }
1342
 
 
1343
 
                        $l_edited_by = sprintf($l_edit_time_total, $display_username, $user->format_date($row['post_edit_time']), $row['post_edit_count']);
1344
 
                }
1345
 
        }
1346
 
        else
1347
 
        {
1348
 
                $l_edited_by = '';
1349
 
        }
1350
 
 
1351
 
        // Bump information
1352
 
        if ($topic_data['topic_bumped'] && $row['post_id'] == $topic_data['topic_last_post_id'] && isset($user_cache[$topic_data['topic_bumper']]) )
1353
 
        {
1354
 
                // It is safe to grab the username from the user cache array, we are at the last
1355
 
                // post and only the topic poster and last poster are allowed to bump.
1356
 
                // Admins and mods are bound to the above rules too...
1357
 
                $l_bumped_by = '<br /><br />' . sprintf($user->lang['BUMPED_BY'], $user_cache[$topic_data['topic_bumper']]['username'], $user->format_date($topic_data['topic_last_post_time']));
1358
 
        }
1359
 
        else
1360
 
        {
1361
 
                $l_bumped_by = '';
1362
 
        }
1363
 
 
1364
 
        $cp_row = array();
1365
 
 
1366
 
        //
1367
 
        if ($config['load_cpf_viewtopic'])
1368
 
        {
1369
 
                $cp_row = (isset($profile_fields_cache[$poster_id])) ? $cp->generate_profile_fields_template('show', false, $profile_fields_cache[$poster_id]) : array();
1370
 
        }
1371
 
 
1372
 
        $post_unread = (isset($topic_tracking_info[$topic_id]) && $row['post_time'] > $topic_tracking_info[$topic_id]) ? true : false;
1373
 
 
1374
 
        $s_first_unread = false;
1375
 
        if (!$first_unread && $post_unread)
1376
 
        {
1377
 
                $s_first_unread = $first_unread = true;
1378
 
        }
1379
 
 
1380
 
        //
1381
 
        $postrow = array(
1382
 
                'POST_AUTHOR_FULL'              => get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),
1383
 
                'POST_AUTHOR_COLOUR'    => get_username_string('colour', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),
1384
 
                'POST_AUTHOR'                   => get_username_string('username', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),
1385
 
                'U_POST_AUTHOR'                 => get_username_string('profile', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),
1386
 
 
1387
 
                'RANK_TITLE'            => $user_cache[$poster_id]['rank_title'],
1388
 
                'RANK_IMG'                      => $user_cache[$poster_id]['rank_image'],
1389
 
                'RANK_IMG_SRC'          => $user_cache[$poster_id]['rank_image_src'],
1390
 
                'POSTER_JOINED'         => $user_cache[$poster_id]['joined'],
1391
 
                'POSTER_POSTS'          => $user_cache[$poster_id]['posts'],
1392
 
                'POSTER_FROM'           => $user_cache[$poster_id]['from'],
1393
 
                'POSTER_AVATAR'         => $user_cache[$poster_id]['avatar'],
1394
 
                'POSTER_WARNINGS'       => $user_cache[$poster_id]['warnings'],
1395
 
                'POSTER_AGE'            => $user_cache[$poster_id]['age'],
1396
 
 
1397
 
                'POST_DATE'                     => $user->format_date($row['post_time']),
1398
 
                'POST_SUBJECT'          => $row['post_subject'],
1399
 
                'MESSAGE'                       => $message,
1400
 
                'SIGNATURE'                     => ($row['enable_sig']) ? $user_cache[$poster_id]['sig'] : '',
1401
 
                'EDITED_MESSAGE'        => $l_edited_by,
1402
 
                'EDIT_REASON'           => $row['post_edit_reason'],
1403
 
                'BUMPED_MESSAGE'        => $l_bumped_by,
1404
 
 
1405
 
                'MINI_POST_IMG'                 => ($post_unread) ? $user->img('icon_post_target_unread', 'NEW_POST') : $user->img('icon_post_target', 'POST'),
1406
 
                'POST_ICON_IMG'                 => ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['img'] : '',
1407
 
                'POST_ICON_IMG_WIDTH'   => ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['width'] : '',
1408
 
                'POST_ICON_IMG_HEIGHT'  => ($topic_data['enable_icons'] && !empty($row['icon_id'])) ? $icons[$row['icon_id']]['height'] : '',
1409
 
                'ICQ_STATUS_IMG'                => $user_cache[$poster_id]['icq_status_img'],
1410
 
                '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')),
1411
 
                'S_ONLINE'                              => ($poster_id == ANONYMOUS || !$config['load_onlinetrack']) ? false : (($user_cache[$poster_id]['online']) ? true : false),
1412
 
 
1413
 
                'U_EDIT'                        => (!$user->data['is_registered']) ? '' : ((($user->data['user_id'] == $poster_id && $auth->acl_get('f_edit', $forum_id) && ($row['post_time'] > time() - ($config['edit_time'] * 60) || !$config['edit_time'])) || $auth->acl_get('m_edit', $forum_id)) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=edit&amp;f=$forum_id&amp;p={$row['post_id']}") : ''),
1414
 
                'U_QUOTE'                       => ($auth->acl_get('f_reply', $forum_id)) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=quote&amp;f=$forum_id&amp;p={$row['post_id']}") : '',
1415
 
                'U_INFO'                        => ($auth->acl_get('m_info', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=main&amp;mode=post_details&amp;f=$forum_id&amp;p=" . $row['post_id'], true, $user->session_id) : '',
1416
 
                'U_DELETE'                      => (!$user->data['is_registered']) ? '' : ((($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['edit_time'] * 60) || !$config['edit_time'])) || $auth->acl_get('m_delete', $forum_id)) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=delete&amp;f=$forum_id&amp;p={$row['post_id']}") : ''),
1417
 
 
1418
 
                'U_PROFILE'             => $user_cache[$poster_id]['profile'],
1419
 
                'U_SEARCH'              => $user_cache[$poster_id]['search'],
1420
 
                'U_PM'                  => ($poster_id != ANONYMOUS && $config['allow_privmsg'] && $auth->acl_get('u_sendpm') && ($user_cache[$poster_id]['allow_pm'] || $auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_'))) ? append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm&amp;mode=compose&amp;action=quotepost&amp;p=' . $row['post_id']) : '',
1421
 
                'U_EMAIL'               => $user_cache[$poster_id]['email'],
1422
 
                'U_WWW'                 => $user_cache[$poster_id]['www'],
1423
 
                'U_ICQ'                 => $user_cache[$poster_id]['icq'],
1424
 
                'U_AIM'                 => $user_cache[$poster_id]['aim'],
1425
 
                'U_MSN'                 => $user_cache[$poster_id]['msn'],
1426
 
                'U_YIM'                 => $user_cache[$poster_id]['yim'],
1427
 
                'U_JABBER'              => $user_cache[$poster_id]['jabber'],
1428
 
 
1429
 
                'U_REPORT'                      => ($auth->acl_get('f_report', $forum_id)) ? append_sid("{$phpbb_root_path}report.$phpEx", 'f=' . $forum_id . '&amp;p=' . $row['post_id']) : '',
1430
 
                'U_MCP_REPORT'          => ($auth->acl_get('m_report', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=report_details&amp;f=' . $forum_id . '&amp;p=' . $row['post_id'], true, $user->session_id) : '',
1431
 
                'U_MCP_APPROVE'         => ($auth->acl_get('m_approve', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=approve_details&amp;f=' . $forum_id . '&amp;p=' . $row['post_id'], true, $user->session_id) : '',
1432
 
                'U_MINI_POST'           => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'p=' . $row['post_id']) . (($topic_data['topic_type'] == POST_GLOBAL) ? '&amp;f=' . $forum_id : '') . '#p' . $row['post_id'],
1433
 
                'U_NEXT_POST_ID'        => ($i < $i_total && isset($rowset[$post_list[$i + 1]])) ? $rowset[$post_list[$i + 1]]['post_id'] : '',
1434
 
                'U_PREV_POST_ID'        => $prev_post_id,
1435
 
                'U_NOTES'                       => ($auth->acl_getf_global('m_')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=notes&amp;mode=user_notes&amp;u=' . $poster_id, true, $user->session_id) : '',
1436
 
                'U_WARN'                        => ($auth->acl_get('m_warn') && $poster_id != $user->data['user_id'] && $poster_id != ANONYMOUS) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=warn&amp;mode=warn_post&amp;f=' . $forum_id . '&amp;p=' . $row['post_id'], true, $user->session_id) : '',
1437
 
 
1438
 
                'POST_ID'                       => $row['post_id'],
1439
 
                'POSTER_ID'                     => $poster_id,
1440
 
 
1441
 
                'S_HAS_ATTACHMENTS'     => (!empty($attachments[$row['post_id']])) ? true : false,
1442
 
                'S_POST_UNAPPROVED'     => ($row['post_approved']) ? false : true,
1443
 
                'S_POST_REPORTED'       => ($row['post_reported'] && $auth->acl_get('m_report', $forum_id)) ? true : false,
1444
 
                'S_DISPLAY_NOTICE'      => $display_notice && $row['post_attachment'],
1445
 
                'S_FRIEND'                      => ($row['friend']) ? true : false,
1446
 
                'S_UNREAD_POST'         => $post_unread,
1447
 
                'S_FIRST_UNREAD'        => $s_first_unread,
1448
 
                'S_CUSTOM_FIELDS'       => (isset($cp_row['row']) && sizeof($cp_row['row'])) ? true : false,
1449
 
                'S_TOPIC_POSTER'        => ($topic_data['topic_poster'] == $poster_id) ? true : false,
1450
 
 
1451
 
                'S_IGNORE_POST'         => ($row['hide_post']) ? true : false,
1452
 
                'L_IGNORE_POST'         => ($row['hide_post']) ? sprintf($user->lang['POST_BY_FOE'], get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), '<a href="' . $viewtopic_url . "&amp;p={$row['post_id']}&amp;view=show#p{$row['post_id']}" . '">', '</a>') : '',
1453
 
        );
1454
 
 
1455
 
        if (isset($cp_row['row']) && sizeof($cp_row['row']))
1456
 
        {
1457
 
                $postrow = array_merge($postrow, $cp_row['row']);
1458
 
        }
1459
 
 
1460
 
        // Dump vars into template
1461
 
        $template->assign_block_vars('postrow', $postrow);
1462
 
 
1463
 
        if (!empty($cp_row['blockrow']))
1464
 
        {
1465
 
                foreach ($cp_row['blockrow'] as $field_data)
1466
 
                {
1467
 
                        $template->assign_block_vars('postrow.custom_fields', $field_data);
1468
 
                }
1469
 
        }
1470
 
 
1471
 
        // Display not already displayed Attachments for this post, we already parsed them. ;)
1472
 
        if (!empty($attachments[$row['post_id']]))
1473
 
        {
1474
 
                foreach ($attachments[$row['post_id']] as $attachment)
1475
 
                {
1476
 
                        $template->assign_block_vars('postrow.attachment', array(
1477
 
                                'DISPLAY_ATTACHMENT'    => $attachment)
1478
 
                        );
1479
 
                }
1480
 
        }
1481
 
 
1482
 
        $prev_post_id = $row['post_id'];
1483
 
 
1484
 
        unset($rowset[$post_list[$i]]);
1485
 
        unset($attachments[$row['post_id']]);
1486
 
}
1487
 
unset($rowset, $user_cache);
1488
 
 
1489
 
// Update topic view and if necessary attachment view counters ... but only if this is the first 'page view'
1490
 
if (isset($user->data['session_page']) && strpos($user->data['session_page'], '&t=' . $topic_id) === false)
1491
 
{
1492
 
        $sql = 'UPDATE ' . TOPICS_TABLE . '
1493
 
                SET topic_views = topic_views + 1, topic_last_view_time = ' . time() . "
1494
 
                WHERE topic_id = $topic_id";
1495
 
        $db->sql_query($sql);
1496
 
 
1497
 
        // Update the attachment download counts
1498
 
        if (sizeof($update_count))
1499
 
        {
1500
 
                $sql = 'UPDATE ' . ATTACHMENTS_TABLE . '
1501
 
                        SET download_count = download_count + 1
1502
 
                        WHERE ' . $db->sql_in_set('attach_id', array_unique($update_count));
1503
 
                $db->sql_query($sql);
1504
 
        }
1505
 
}
1506
 
 
1507
 
// Only mark topic if it's currently unread. Also make sure we do not set topic tracking back if earlier pages are viewed.
1508
 
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])
1509
 
{
1510
 
        markread('topic', $forum_id, $topic_id, $max_post_time);
1511
 
 
1512
 
        // Update forum info
1513
 
        $all_marked_read = update_forum_tracking_info($forum_id, $topic_data['forum_last_post_time'], (isset($topic_data['forum_mark_time'])) ? $topic_data['forum_mark_time'] : false, false);
1514
 
}
1515
 
else
1516
 
{
1517
 
        $all_marked_read = true;
1518
 
}
1519
 
 
1520
 
// If there are absolutely no more unread posts in this forum and unread posts shown, we can savely show the #unread link
1521
 
if ($all_marked_read)
1522
 
{
1523
 
        if ($post_unread)
1524
 
        {
1525
 
                $template->assign_vars(array(
1526
 
                        'U_VIEW_UNREAD_POST'    => '#unread',
1527
 
                ));
1528
 
        }
1529
 
        else if (isset($topic_tracking_info[$topic_id]) && $topic_data['topic_last_post_time'] > $topic_tracking_info[$topic_id])
1530
 
        {
1531
 
                $template->assign_vars(array(
1532
 
                        'U_VIEW_UNREAD_POST'    => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;view=unread") . '#unread',
1533
 
                ));
1534
 
        }
1535
 
}
1536
 
else if (!$all_marked_read)
1537
 
{
1538
 
        $last_page = ((floor($start / $config['posts_per_page']) + 1) == max(ceil($total_posts / $config['posts_per_page']), 1)) ? true : false;
1539
 
 
1540
 
        // What can happen is that we are at the last displayed page. If so, we also display the #unread link based in $post_unread
1541
 
        if ($last_page && $post_unread)
1542
 
        {
1543
 
                $template->assign_vars(array(
1544
 
                        'U_VIEW_UNREAD_POST'    => '#unread',
1545
 
                ));
1546
 
        }
1547
 
        else if (!$last_page)
1548
 
        {
1549
 
                $template->assign_vars(array(
1550
 
                        'U_VIEW_UNREAD_POST'    => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;view=unread") . '#unread',
1551
 
                ));
1552
 
        }
1553
 
}
1554
 
 
1555
 
// We overwrite $_REQUEST['f'] if there is no forum specified
1556
 
// to be able to display the correct online list.
1557
 
// One downside is that the user currently viewing this topic/post is not taken into account.
1558
 
if (empty($_REQUEST['f']))
1559
 
{
1560
 
        $_REQUEST['f'] = $forum_id;
1561
 
}
1562
 
 
1563
 
// Output the page
1564
 
page_header($user->lang['VIEW_TOPIC'] .' - ' . $topic_data['topic_title']);
1565
 
 
1566
 
$template->set_filenames(array(
1567
 
        'body' => ($view == 'print') ? 'viewtopic_print.html' : 'viewtopic_body.html')
1568
 
);
1569
 
make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"), $forum_id);
1570
 
 
1571
 
page_footer();
1572
 
 
1573
 
?>
 
 
b'\\ No newline at end of file'