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

« back to all changes in this revision

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

Dispatch now generates an index for each plugin type, allowing plugins to
be written which are aware of other plugins, and other plugin types.

All view plugins now subclass from ivle.webapp.base.plugins.ViewPlugin,
as opposed to subclassing BasePlugin directly. This will allow us to
easily re-write console as an OverlayPlugin, and allow future new
plugins types to be created.

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'