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

« back to all changes in this revision

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

  • Committer: William Grant
  • Date: 2009-05-27 04:07:51 UTC
  • Revision ID: grantw@unimelb.edu.au-20090527040751-qwh5kq65wbdfrtsz
Drop ivle.conf usage from ivle.interpret.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
<?php
2
 
/**
3
 
*
4
 
* @package phpBB3
5
 
* @version $Id: search.php,v 1.212 2007/10/05 14:30:06 acydburn 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
 
 
19
 
// Start session management
20
 
$user->session_begin();
21
 
$auth->acl($user->data);
22
 
$user->setup('search');
23
 
 
24
 
// Define initial vars
25
 
$mode                   = request_var('mode', '');
26
 
$search_id              = request_var('search_id', '');
27
 
$start                  = max(request_var('start', 0), 0);
28
 
$post_id                = request_var('p', 0);
29
 
$topic_id               = request_var('t', 0);
30
 
$view                   = request_var('view', '');
31
 
 
32
 
$submit                 = request_var('submit', false);
33
 
$keywords               = utf8_normalize_nfc(request_var('keywords', '', true));
34
 
$add_keywords   = utf8_normalize_nfc(request_var('add_keywords', '', true));
35
 
$author                 = request_var('author', '', true);
36
 
$author_id              = request_var('author_id', 0);
37
 
$show_results   = ($topic_id) ? 'posts' : request_var('sr', 'posts');
38
 
$show_results   = ($show_results == 'posts') ? 'posts' : 'topics';
39
 
$search_terms   = request_var('terms', 'all');
40
 
$search_fields  = request_var('sf', 'all');
41
 
$search_child   = request_var('sc', true);
42
 
 
43
 
$sort_days              = request_var('st', 0);
44
 
$sort_key               = request_var('sk', 't');
45
 
$sort_dir               = request_var('sd', 'd');
46
 
 
47
 
$return_chars   = request_var('ch', ($topic_id) ? -1 : 300);
48
 
$search_forum   = request_var('fid', array(0));
49
 
 
50
 
// Is user able to search? Has search been disabled?
51
 
if (!$auth->acl_get('u_search') || !$auth->acl_getf_global('f_search') || !$config['load_search'])
52
 
{
53
 
        $template->assign_var('S_NO_SEARCH', true);
54
 
        trigger_error('NO_SEARCH');
55
 
}
56
 
 
57
 
// Check search load limit
58
 
if ($user->load && $config['limit_search_load'] && ($user->load > doubleval($config['limit_search_load'])))
59
 
{
60
 
        $template->assign_var('S_NO_SEARCH', true);
61
 
        trigger_error('NO_SEARCH_TIME');
62
 
}
63
 
 
64
 
// Check flood limit ... if applicable
65
 
$interval = ($user->data['user_id'] == ANONYMOUS) ? $config['search_anonymous_interval'] : $config['search_interval'];
66
 
if ($interval && !$auth->acl_get('u_ignoreflood'))
67
 
{
68
 
        if ($user->data['user_last_search'] > time() - $interval)
69
 
        {
70
 
                $template->assign_var('S_NO_SEARCH', true);
71
 
                trigger_error('NO_SEARCH_TIME');
72
 
        }
73
 
}
74
 
 
75
 
// Define some vars
76
 
$limit_days             = array(0 => $user->lang['ALL_RESULTS'], 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']);
77
 
$sort_by_text   = array('a' => $user->lang['SORT_AUTHOR'], 't' => $user->lang['SORT_TIME'], 'f' => $user->lang['SORT_FORUM'], 'i' => $user->lang['SORT_TOPIC_TITLE'], 's' => $user->lang['SORT_POST_SUBJECT']);
78
 
 
79
 
$s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';
80
 
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);
81
 
 
82
 
if ($keywords || $author || $author_id || $search_id || $submit)
83
 
{
84
 
        // clear arrays
85
 
        $id_ary = array();
86
 
 
87
 
        // egosearch is an author search
88
 
        if ($search_id == 'egosearch')
89
 
        {
90
 
                $author_id = $user->data['user_id'];
91
 
                
92
 
                if ($user->data['user_id'] == ANONYMOUS)
93
 
                {
94
 
                        login_box('', $user->lang['LOGIN_EXPLAIN_EGOSEARCH']);
95
 
                }
96
 
        }
97
 
 
98
 
        // If we are looking for authors get their ids
99
 
        $author_id_ary = array();
100
 
        if ($author_id)
101
 
        {
102
 
                $author_id_ary[] = $author_id;
103
 
        }
104
 
        else if ($author)
105
 
        {
106
 
                if ((strpos($author, '*') !== false) && (utf8_strlen(str_replace(array('*', '%'), '', $author)) < $config['min_search_author_chars']))
107
 
                {
108
 
                        trigger_error(sprintf($user->lang['TOO_FEW_AUTHOR_CHARS'], $config['min_search_author_chars']));
109
 
                }
110
 
 
111
 
                $sql_where = (strpos($author, '*') !== false) ? ' username_clean ' . $db->sql_like_expression(str_replace('*', $db->any_char, utf8_clean_string($author))) : " username_clean = '" . $db->sql_escape(utf8_clean_string($author)) . "'";
112
 
 
113
 
                $sql = 'SELECT user_id
114
 
                        FROM ' . USERS_TABLE . "
115
 
                        WHERE $sql_where
116
 
                                AND user_type IN (" . USER_NORMAL . ', ' . USER_FOUNDER . ')';
117
 
                $result = $db->sql_query_limit($sql, 100);
118
 
 
119
 
                while ($row = $db->sql_fetchrow($result))
120
 
                {
121
 
                        $author_id_ary[] = (int) $row['user_id'];
122
 
                }
123
 
                $db->sql_freeresult($result);
124
 
 
125
 
                if (!sizeof($author_id_ary))
126
 
                {
127
 
                        trigger_error('NO_SEARCH_RESULTS');
128
 
                }
129
 
        }
130
 
 
131
 
        // if we search in an existing search result just add the additional keywords. But we need to use "all search terms"-mode
132
 
        // so we can keep the old keywords in their old mode, but add the new ones as required words
133
 
        if ($add_keywords)
134
 
        {
135
 
                if ($search_terms == 'all')
136
 
                {
137
 
                        $keywords .= ' ' . $add_keywords;
138
 
                }
139
 
                else
140
 
                {
141
 
                        $search_terms = 'all';
142
 
                        $keywords = implode(' |', explode(' ', preg_replace('#\s+#u', ' ', $keywords))) . ' ' .$add_keywords;
143
 
                }
144
 
        }
145
 
 
146
 
        // Which forums should not be searched? Author searches are also carried out in unindexed forums
147
 
        if (empty($keywords) && sizeof($author_id_ary))
148
 
        {
149
 
                $ex_fid_ary = array_keys($auth->acl_getf('!f_read', true));
150
 
        }
151
 
        else
152
 
        {
153
 
                $ex_fid_ary = array_unique(array_merge(array_keys($auth->acl_getf('!f_read', true)), array_keys($auth->acl_getf('!f_search', true))));
154
 
        }
155
 
 
156
 
        $not_in_fid = (sizeof($ex_fid_ary)) ? 'WHERE ' . $db->sql_in_set('f.forum_id', $ex_fid_ary, true) . " OR (f.forum_password <> '' AND fa.user_id <> " . (int) $user->data['user_id'] . ')' : "";
157
 
 
158
 
        $sql = 'SELECT f.forum_id, f.forum_name, f.parent_id, f.forum_type, f.right_id, f.forum_password, fa.user_id
159
 
                FROM ' . FORUMS_TABLE . ' f
160
 
                LEFT JOIN ' . FORUMS_ACCESS_TABLE . " fa ON (fa.forum_id = f.forum_id
161
 
                        AND fa.session_id = '" . $db->sql_escape($user->session_id) . "')
162
 
                $not_in_fid
163
 
                ORDER BY f.left_id";
164
 
        $result = $db->sql_query($sql);
165
 
 
166
 
        $right_id = 0;
167
 
        $reset_search_forum = true;
168
 
        while ($row = $db->sql_fetchrow($result))
169
 
        {
170
 
                if ($row['forum_password'] && $row['user_id'] != $user->data['user_id'])
171
 
                {
172
 
                        $ex_fid_ary[] = (int) $row['forum_id'];
173
 
                        continue;
174
 
                }
175
 
 
176
 
                if (sizeof($search_forum))
177
 
                {
178
 
                        if ($search_child)
179
 
                        {
180
 
                                if (in_array($row['forum_id'], $search_forum) && $row['right_id'] > $right_id)
181
 
                                {
182
 
                                        $right_id = (int) $row['right_id'];
183
 
                                }
184
 
                                else if ($row['right_id'] < $right_id)
185
 
                                {
186
 
                                        continue;
187
 
                                }
188
 
                        }
189
 
 
190
 
                        if (!in_array($row['forum_id'], $search_forum))
191
 
                        {
192
 
                                $ex_fid_ary[] = (int) $row['forum_id'];
193
 
                                $reset_search_forum = false;
194
 
                        }
195
 
                }
196
 
        }
197
 
        $db->sql_freeresult($result);
198
 
 
199
 
        // find out in which forums the user is allowed to view approved posts
200
 
        if ($auth->acl_get('m_approve'))
201
 
        {
202
 
                $m_approve_fid_ary = array(-1);
203
 
                $m_approve_fid_sql = '';
204
 
        }
205
 
        else if ($auth->acl_getf_global('m_approve'))
206
 
        {
207
 
                $m_approve_fid_ary = array_diff(array_keys($auth->acl_getf('!m_approve', true)), $ex_fid_ary);
208
 
                $m_approve_fid_sql = ' AND (p.post_approved = 1' . ((sizeof($m_approve_fid_ary)) ? ' OR ' . $db->sql_in_set('p.forum_id', $m_approve_fid_ary, true) : '') . ')';
209
 
        }
210
 
        else
211
 
        {
212
 
                $m_approve_fid_ary = array();
213
 
                $m_approve_fid_sql = ' AND p.post_approved = 1';
214
 
        }
215
 
 
216
 
        if ($reset_search_forum)
217
 
        {
218
 
                $search_forum = array();
219
 
        }
220
 
 
221
 
        // Select which method we'll use to obtain the post_id or topic_id information
222
 
        $search_type = basename($config['search_type']);
223
 
 
224
 
        if (!file_exists($phpbb_root_path . 'includes/search/' . $search_type . '.' . $phpEx))
225
 
        {
226
 
                trigger_error('NO_SUCH_SEARCH_MODULE');
227
 
        }
228
 
 
229
 
        require("{$phpbb_root_path}includes/search/$search_type.$phpEx");
230
 
 
231
 
        // We do some additional checks in the module to ensure it can actually be utilised
232
 
        $error = false;
233
 
        $search = new $search_type($error);
234
 
 
235
 
        if ($error)
236
 
        {
237
 
                trigger_error($error);
238
 
        }
239
 
 
240
 
        // let the search module split up the keywords
241
 
        if ($keywords)
242
 
        {
243
 
                $correct_query = $search->split_keywords($keywords, $search_terms);
244
 
                if (!$correct_query || (empty($search->search_query) && !sizeof($author_id_ary) && !$search_id))
245
 
                {
246
 
                        $ignored = (sizeof($search->common_words)) ? sprintf($user->lang['IGNORED_TERMS_EXPLAIN'], implode(' ', $search->common_words)) . '<br />' : '';
247
 
                        trigger_error($ignored . sprintf($user->lang['NO_KEYWORDS'], $search->word_length['min'], $search->word_length['max']));
248
 
                }
249
 
        }
250
 
 
251
 
        if (!$keywords && sizeof($author_id_ary))
252
 
        {
253
 
                // if it is an author search we want to show topics by default
254
 
                $show_results = ($topic_id) ? 'posts' : request_var('sr', ($search_id == 'egosearch') ? 'topics' : 'posts');
255
 
                $show_results = ($show_results == 'posts') ? 'posts' : 'topics';
256
 
        }
257
 
 
258
 
        // define some variables needed for retrieving post_id/topic_id information
259
 
        $sort_by_sql = array('a' => 'u.username_clean', 't' => (($show_results == 'posts') ? 'p.post_time' : 't.topic_last_post_time'), 'f' => 'f.forum_id', 'i' => 't.topic_title', 's' => (($show_results == 'posts') ? 'p.post_subject' : 't.topic_title'));
260
 
 
261
 
        // pre-made searches
262
 
        $sql = $field = $l_search_title = '';
263
 
        if ($search_id)
264
 
        {
265
 
                switch ($search_id)
266
 
                {
267
 
                        // Oh holy Bob, bring us some activity...
268
 
                        case 'active_topics':
269
 
                                $l_search_title = $user->lang['SEARCH_ACTIVE_TOPICS'];
270
 
                                $show_results = 'topics';
271
 
                                $sort_key = 't';
272
 
                                $sort_dir = 'd';
273
 
                                $sort_days = request_var('st', 7);
274
 
                                $sort_by_sql['t'] = 't.topic_last_post_time';
275
 
 
276
 
                                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);
277
 
                                $s_sort_key = $s_sort_dir = '';
278
 
 
279
 
                                $last_post_time_sql = ($sort_days) ? ' AND t.topic_last_post_time > ' . (time() - ($sort_days * 24 * 3600)) : '';
280
 
 
281
 
                                $sql = 'SELECT t.topic_last_post_time, t.topic_id
282
 
                                        FROM ' . TOPICS_TABLE . " t
283
 
                                        WHERE t.topic_moved_id = 0
284
 
                                                $last_post_time_sql
285
 
                                                " . str_replace(array('p.', 'post_'), array('t.', 'topic_'), $m_approve_fid_sql) . '
286
 
                                                ' . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '') . '
287
 
                                        ORDER BY t.topic_last_post_time DESC';
288
 
                                $field = 'topic_id';
289
 
                        break;
290
 
 
291
 
                        case 'unanswered':
292
 
                                $l_search_title = $user->lang['SEARCH_UNANSWERED'];
293
 
                                $show_results = request_var('sr', 'topics');
294
 
                                $show_results = ($show_results == 'posts') ? 'posts' : 'topics';
295
 
                                $sort_by_sql['t'] = ($show_results == 'posts') ? 'p.post_time' : 't.topic_last_post_time';
296
 
                                $sort_by_sql['s'] = ($show_results == 'posts') ? 'p.post_subject' : 't.topic_title';
297
 
                                $sql_sort = 'ORDER BY ' . $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
298
 
 
299
 
                                $sort_join = ($sort_key == 'f') ? FORUMS_TABLE . ' f, ' : '';
300
 
                                $sql_sort = ($sort_key == 'f') ? ' AND f.forum_id = p.forum_id ' . $sql_sort : $sql_sort;
301
 
 
302
 
                                if ($sort_days)
303
 
                                {
304
 
                                        $last_post_time = 'AND p.post_time > ' . (time() - ($sort_days * 24 * 3600));
305
 
                                }
306
 
                                else
307
 
                                {
308
 
                                        $last_post_time = '';
309
 
                                }
310
 
 
311
 
 
312
 
                                if ($sort_key == 'a')
313
 
                                {
314
 
                                        $sort_join = USERS_TABLE . ' u, ';
315
 
                                        $sql_sort = ' AND u.user_id = p.poster_id ' . $sql_sort;
316
 
                                }
317
 
                                if ($show_results == 'posts')
318
 
                                {
319
 
                                        $sql = "SELECT p.post_id
320
 
                                                FROM $sort_join" . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t
321
 
                                                WHERE t.topic_replies = 0
322
 
                                                        AND p.topic_id = t.topic_id
323
 
                                                        $last_post_time
324
 
                                                        $m_approve_fid_sql
325
 
                                                        " . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . "
326
 
                                                        $sql_sort";
327
 
                                        $field = 'post_id';
328
 
                                }
329
 
                                else
330
 
                                {
331
 
                                        $sql = 'SELECT DISTINCT ' . $sort_by_sql[$sort_key] . ", p.topic_id
332
 
                                                FROM $sort_join" . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t
333
 
                                                WHERE t.topic_replies = 0
334
 
                                                        AND t.topic_moved_id = 0
335
 
                                                        AND p.topic_id = t.topic_id
336
 
                                                        $last_post_time
337
 
                                                        $m_approve_fid_sql
338
 
                                                        " . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . "
339
 
                                                $sql_sort";
340
 
                                        $field = 'topic_id';
341
 
                                }
342
 
                        break;
343
 
 
344
 
                        case 'newposts':
345
 
                                $l_search_title = $user->lang['SEARCH_NEW'];
346
 
                                // force sorting
347
 
                                $show_results = (request_var('sr', 'topics') == 'posts') ? 'posts' : 'topics';
348
 
                                $sort_key = 't';
349
 
                                $sort_dir = 'd';
350
 
                                $sort_by_sql['t'] = ($show_results == 'posts') ? 'p.post_time' : 't.topic_last_post_time';
351
 
                                $sql_sort = 'ORDER BY ' . $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
352
 
 
353
 
                                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);
354
 
                                $s_sort_key = $s_sort_dir = $u_sort_param = $s_limit_days = '';
355
 
 
356
 
                                if ($show_results == 'posts')
357
 
                                {
358
 
                                        $sql = 'SELECT p.post_id
359
 
                                                FROM ' . POSTS_TABLE . ' p
360
 
                                                WHERE p.post_time > ' . $user->data['user_lastvisit'] . "
361
 
                                                        $m_approve_fid_sql
362
 
                                                        " . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . "
363
 
                                                $sql_sort";
364
 
                                        $field = 'post_id';
365
 
                                }
366
 
                                else
367
 
                                {
368
 
                                        $sql = 'SELECT t.topic_id
369
 
                                                FROM ' . TOPICS_TABLE . ' t
370
 
                                                WHERE t.topic_last_post_time > ' . $user->data['user_lastvisit'] . '
371
 
                                                        AND t.topic_moved_id = 0
372
 
                                                        ' . str_replace(array('p.', 'post_'), array('t.', 'topic_'), $m_approve_fid_sql) . '
373
 
                                                        ' . ((sizeof($ex_fid_ary)) ? 'AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '') . "
374
 
                                                $sql_sort";
375
 
                                        $field = 'topic_id';
376
 
                                }
377
 
                        break;
378
 
 
379
 
                        case 'egosearch':
380
 
                                $l_search_title = $user->lang['SEARCH_SELF'];
381
 
                        break;
382
 
                }
383
 
        }
384
 
 
385
 
        // show_results should not change after this
386
 
        $per_page = ($show_results == 'posts') ? $config['posts_per_page'] : $config['topics_per_page'];
387
 
        $total_match_count = 0;
388
 
 
389
 
        if ($search_id)
390
 
        {
391
 
                if ($sql)
392
 
                {
393
 
                        // only return up to 1000 ids (the last one will be removed later)
394
 
                        $result = $db->sql_query_limit($sql, 1001 - $start, $start);
395
 
 
396
 
                        while ($row = $db->sql_fetchrow($result))
397
 
                        {
398
 
                                $id_ary[] = $row[$field];
399
 
                        }
400
 
                        $db->sql_freeresult($result);
401
 
 
402
 
                        $total_match_count = sizeof($id_ary) + $start;
403
 
                        $id_ary = array_slice($id_ary, 0, $per_page);
404
 
                }
405
 
                else
406
 
                {
407
 
                        $search_id = '';
408
 
                }
409
 
        }
410
 
 
411
 
        // make sure that some arrays are always in the same order
412
 
        sort($ex_fid_ary);
413
 
        sort($m_approve_fid_ary);
414
 
        sort($author_id_ary);
415
 
 
416
 
        if (!empty($search->search_query))
417
 
        {
418
 
                $total_match_count = $search->keyword_search($show_results, $search_fields, $search_terms, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_fid_ary, $topic_id, $author_id_ary, $id_ary, $start, $per_page);
419
 
        }
420
 
        else if (sizeof($author_id_ary))
421
 
        {
422
 
                $firstpost_only = ($search_fields === 'firstpost') ? true : false;
423
 
                $total_match_count = $search->author_search($show_results, $firstpost_only, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_fid_ary, $topic_id, $author_id_ary, $id_ary, $start, $per_page);
424
 
        }
425
 
 
426
 
        // For some searches we need to print out the "no results" page directly to allow re-sorting/refining the search options.
427
 
        if (!sizeof($id_ary) && !$search_id)
428
 
        {
429
 
                trigger_error('NO_SEARCH_RESULTS');
430
 
        }
431
 
 
432
 
        $sql_where = '';
433
 
 
434
 
        if (sizeof($id_ary))
435
 
        {
436
 
                $sql_where .= $db->sql_in_set(($show_results == 'posts') ? 'p.post_id' : 't.topic_id', $id_ary);
437
 
                $sql_where .= (sizeof($ex_fid_ary)) ? ' AND (' . $db->sql_in_set('f.forum_id', $ex_fid_ary, true) . ' OR f.forum_id IS NULL)' : '';
438
 
                $sql_where .= ($show_results == 'posts') ? $m_approve_fid_sql : str_replace(array('p.post_approved', 'p.forum_id'), array('t.topic_approved', 't.forum_id'), $m_approve_fid_sql);
439
 
        }
440
 
 
441
 
        if ($show_results == 'posts')
442
 
        {
443
 
                include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
444
 
        }
445
 
        else
446
 
        {
447
 
                include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
448
 
        }
449
 
 
450
 
        $user->add_lang('viewtopic');
451
 
 
452
 
        // Grab icons
453
 
        $icons = $cache->obtain_icons();
454
 
 
455
 
        // Output header
456
 
        if ($search_id && ($total_match_count > 1000))
457
 
        {
458
 
                // limit the number to 1000 for pre-made searches
459
 
                $total_match_count--;
460
 
                $l_search_matches = sprintf($user->lang['FOUND_MORE_SEARCH_MATCHES'], $total_match_count);
461
 
        }
462
 
        else
463
 
        {
464
 
                $l_search_matches = ($total_match_count == 1) ? sprintf($user->lang['FOUND_SEARCH_MATCH'], $total_match_count) : sprintf($user->lang['FOUND_SEARCH_MATCHES'], $total_match_count);
465
 
        }
466
 
 
467
 
        // define some vars for urls
468
 
        $hilit = implode('|', explode(' ', preg_replace('#\s+#u', ' ', str_replace(array('+', '-', '|', '(', ')', '&quot;'), ' ', $keywords))));
469
 
        $u_hilit = urlencode(htmlspecialchars_decode(str_replace('|', ' ', $hilit)));
470
 
        $u_show_results = ($show_results != 'posts') ? '&amp;sr=' . $show_results : '';
471
 
        $u_search_forum = implode('&amp;fid%5B%5D=', $search_forum);
472
 
 
473
 
        $u_search = append_sid("{$phpbb_root_path}search.$phpEx", $u_sort_param . $u_show_results);
474
 
        $u_search .= ($search_id) ? '&amp;search_id=' . $search_id : '';
475
 
        $u_search .= ($u_hilit) ? '&amp;keywords=' . urlencode(htmlspecialchars_decode($search->search_query)) : '';
476
 
        $u_search .= ($topic_id) ? '&amp;t=' . $topic_id : '';
477
 
        $u_search .= ($author) ? '&amp;author=' . urlencode(htmlspecialchars_decode($author)) : '';
478
 
        $u_search .= ($author_id) ? '&amp;author_id=' . $author_id : '';
479
 
        $u_search .= ($u_search_forum) ? '&amp;fid%5B%5D=' . $u_search_forum : '';
480
 
        $u_search .= (!$search_child) ? '&amp;sc=0' : '';
481
 
        $u_search .= ($search_fields != 'all') ? '&amp;sf=' . $search_fields : '';
482
 
        $u_search .= ($return_chars != 300) ? '&amp;ch=' . $return_chars : '';
483
 
 
484
 
        $template->assign_vars(array(
485
 
                'SEARCH_TITLE'          => $l_search_title,
486
 
                'SEARCH_MATCHES'        => $l_search_matches,
487
 
                'SEARCH_WORDS'          => $search->search_query,
488
 
                'IGNORED_WORDS'         => (sizeof($search->common_words)) ? implode(' ', $search->common_words) : '',
489
 
                'PAGINATION'            => generate_pagination($u_search, $total_match_count, $per_page, $start),
490
 
                'PAGE_NUMBER'           => on_page($total_match_count, $per_page, $start),
491
 
                'TOTAL_MATCHES'         => $total_match_count,
492
 
                'SEARCH_IN_RESULTS'     => ($search_id) ? false : true,
493
 
 
494
 
                'S_SELECT_SORT_DIR'             => $s_sort_dir,
495
 
                'S_SELECT_SORT_KEY'             => $s_sort_key,
496
 
                'S_SELECT_SORT_DAYS'    => $s_limit_days,
497
 
                'S_SEARCH_ACTION'               => $u_search,
498
 
                'S_SHOW_TOPICS'                 => ($show_results == 'posts') ? false : true,
499
 
 
500
 
                'GOTO_PAGE_IMG'         => $user->img('icon_post_target', 'GOTO_PAGE'),
501
 
                'NEWEST_POST_IMG'       => $user->img('icon_topic_newest', 'VIEW_NEWEST_POST'),
502
 
                'REPORTED_IMG'          => $user->img('icon_topic_reported', 'TOPIC_REPORTED'),
503
 
                'UNAPPROVED_IMG'        => $user->img('icon_topic_unapproved', 'TOPIC_UNAPPROVED'),
504
 
                'LAST_POST_IMG'         => $user->img('icon_topic_latest', 'VIEW_LATEST_POST'),
505
 
 
506
 
                'U_SEARCH_WORDS'        => $u_search,
507
 
        ));
508
 
 
509
 
        if ($sql_where)
510
 
        {
511
 
                if ($show_results == 'posts')
512
 
                {
513
 
                        // @todo Joining this query to the one below?
514
 
                        $sql = 'SELECT zebra_id, friend, foe
515
 
                                FROM ' . ZEBRA_TABLE . '
516
 
                                WHERE user_id = ' . $user->data['user_id'];
517
 
                        $result = $db->sql_query($sql);
518
 
 
519
 
                        $zebra = array();
520
 
                        while ($row = $db->sql_fetchrow($result))
521
 
                        {
522
 
                                $zebra[($row['friend']) ? 'friend' : 'foe'][] = $row['zebra_id'];
523
 
                        }
524
 
                        $db->sql_freeresult($result);
525
 
 
526
 
                        $sql = 'SELECT p.*, f.forum_id, f.forum_name, t.*, u.username, u.username_clean, u.user_sig, u.user_sig_bbcode_uid, u.user_colour
527
 
                                FROM ' . POSTS_TABLE . ' p
528
 
                                        LEFT JOIN ' . TOPICS_TABLE . ' t ON (p.topic_id = t.topic_id)
529
 
                                        LEFT JOIN ' . FORUMS_TABLE . ' f ON (p.forum_id = f.forum_id)
530
 
                                        LEFT JOIN ' . USERS_TABLE . " u ON (p.poster_id = u.user_id)
531
 
                                WHERE $sql_where";
532
 
                }
533
 
                else
534
 
                {
535
 
                        $sql_from = TOPICS_TABLE . ' t
536
 
                                LEFT JOIN ' . FORUMS_TABLE . ' f ON (f.forum_id = t.forum_id)
537
 
                                ' . (($sort_key == 'a') ? ' LEFT JOIN ' . USERS_TABLE . ' u ON (u.user_id = t.topic_poster) ' : '');
538
 
                        $sql_select = 't.*, f.forum_id, f.forum_name';
539
 
 
540
 
                        if ($user->data['is_registered'])
541
 
                        {
542
 
                                if ($config['load_db_track'])
543
 
                                {
544
 
                                        $sql_from .= ' LEFT JOIN ' . TOPICS_POSTED_TABLE . ' tp ON (tp.user_id = ' . $user->data['user_id'] . '
545
 
                                                AND t.topic_id = tp.topic_id)';
546
 
                                        $sql_select .= ', tp.topic_posted';
547
 
                                }
548
 
 
549
 
                                if ($config['load_db_lastread'])
550
 
                                {
551
 
                                        $sql_from .= ' LEFT JOIN ' . TOPICS_TRACK_TABLE . ' tt ON (tt.user_id = ' . $user->data['user_id'] . '
552
 
                                                        AND t.topic_id = tt.topic_id)
553
 
                                                LEFT JOIN ' . FORUMS_TRACK_TABLE . ' ft ON (ft.user_id = ' . $user->data['user_id'] . '
554
 
                                                        AND ft.forum_id = f.forum_id)';
555
 
                                        $sql_select .= ', tt.mark_time, ft.mark_time as f_mark_time';
556
 
                                }
557
 
                        }
558
 
 
559
 
                        if ($config['load_anon_lastread'] || ($user->data['is_registered'] && !$config['load_db_lastread']))
560
 
                        {
561
 
                                $tracking_topics = (isset($_COOKIE[$config['cookie_name'] . '_track'])) ? ((STRIP) ? stripslashes($_COOKIE[$config['cookie_name'] . '_track']) : $_COOKIE[$config['cookie_name'] . '_track']) : '';
562
 
                                $tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array();
563
 
                        }
564
 
 
565
 
                        $sql = "SELECT $sql_select
566
 
                                FROM $sql_from
567
 
                                WHERE $sql_where";
568
 
                }
569
 
                $sql .= ' ORDER BY ' . $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC');
570
 
                $result = $db->sql_query($sql);
571
 
                $result_topic_id = 0;
572
 
 
573
 
                $rowset = array();
574
 
 
575
 
                if ($show_results == 'topics')
576
 
                {
577
 
                        $forums = $rowset = $shadow_topic_list = array();
578
 
                        while ($row = $db->sql_fetchrow($result))
579
 
                        {
580
 
                                if ($row['topic_status'] == ITEM_MOVED)
581
 
                                {
582
 
                                        $shadow_topic_list[$row['topic_moved_id']] = $row['topic_id'];
583
 
                                }
584
 
 
585
 
                                $rowset[$row['topic_id']] = $row;
586
 
 
587
 
                                if (!isset($forums[$row['forum_id']]) && $user->data['is_registered'] && $config['load_db_lastread'])
588
 
                                {
589
 
                                        $forums[$row['forum_id']]['mark_time'] = $row['f_mark_time'];
590
 
                                }
591
 
                                $forums[$row['forum_id']]['topic_list'][] = $row['topic_id'];
592
 
                                $forums[$row['forum_id']]['rowset'][$row['topic_id']] = &$rowset[$row['topic_id']];
593
 
                        }
594
 
                        $db->sql_freeresult($result);
595
 
 
596
 
                        // If we have some shadow topics, update the rowset to reflect their topic information
597
 
                        if (sizeof($shadow_topic_list))
598
 
                        {
599
 
                                $sql = 'SELECT *
600
 
                                        FROM ' . TOPICS_TABLE . '
601
 
                                        WHERE ' . $db->sql_in_set('topic_id', array_keys($shadow_topic_list));
602
 
                                $result = $db->sql_query($sql);
603
 
                        
604
 
                                while ($row = $db->sql_fetchrow($result))
605
 
                                {
606
 
                                        $orig_topic_id = $shadow_topic_list[$row['topic_id']];
607
 
                        
608
 
                                        // We want to retain some values
609
 
                                        $row = array_merge($row, array(
610
 
                                                'topic_moved_id'        => $rowset[$orig_topic_id]['topic_moved_id'],
611
 
                                                'topic_status'          => $rowset[$orig_topic_id]['topic_status'],
612
 
                                                'forum_name'            => $rowset[$orig_topic_id]['forum_name'])
613
 
                                        );
614
 
                        
615
 
                                        $rowset[$orig_topic_id] = $row;
616
 
                                }
617
 
                                $db->sql_freeresult($result);
618
 
                        }
619
 
                        unset($shadow_topic_list);
620
 
 
621
 
                        foreach ($forums as $forum_id => $forum)
622
 
                        {
623
 
                                if ($user->data['is_registered'] && $config['load_db_lastread'])
624
 
                                {
625
 
                                        $topic_tracking_info[$forum_id] = get_topic_tracking($forum_id, $forum['topic_list'], $forum['rowset'], array($forum_id => $forum['mark_time']), ($forum_id) ? false : $forum['topic_list']);
626
 
                                }
627
 
                                else if ($config['load_anon_lastread'] || $user->data['is_registered'])
628
 
                                {
629
 
                                        $topic_tracking_info[$forum_id] = get_complete_topic_tracking($forum_id, $forum['topic_list'], ($forum_id) ? false : $forum['topic_list']);
630
 
                
631
 
                                        if (!$user->data['is_registered'])
632
 
                                        {
633
 
                                                $user->data['user_lastmark'] = (isset($tracking_topics['l'])) ? (int) (base_convert($tracking_topics['l'], 36, 10) + $config['board_startdate']) : 0;
634
 
                                        }
635
 
                                }
636
 
                        }
637
 
                        unset($forums);
638
 
                }
639
 
                else
640
 
                {
641
 
                        $bbcode_bitfield = $text_only_message = '';
642
 
                        $attach_list = array();
643
 
 
644
 
                        while ($row = $db->sql_fetchrow($result))
645
 
                        {
646
 
                                // We pre-process some variables here for later usage
647
 
                                $row['post_text'] = censor_text($row['post_text']);
648
 
 
649
 
                                $text_only_message = $row['post_text'];
650
 
                                // make list items visible as such
651
 
                                if ($row['bbcode_uid'])
652
 
                                {
653
 
                                        $text_only_message = str_replace('[*:' . $row['bbcode_uid'] . ']', '&sdot;&nbsp;', $text_only_message);
654
 
                                        // no BBCode in text only message
655
 
                                        strip_bbcode($text_only_message, $row['bbcode_uid']);
656
 
                                }
657
 
 
658
 
                                if ($return_chars == -1 || utf8_strlen($text_only_message) < ($return_chars + 3))
659
 
                                {
660
 
                                        $row['display_text_only'] = false;
661
 
                                        $bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']);
662
 
 
663
 
                                        // Does this post have an attachment? If so, add it to the list
664
 
                                        if ($row['post_attachment'] && $config['allow_attachments'])
665
 
                                        {
666
 
                                                $attach_list[$row['forum_id']][] = $row['post_id'];
667
 
                                        }
668
 
                                }
669
 
                                else
670
 
                                {
671
 
                                        $row['post_text'] = $text_only_message;
672
 
                                        $row['display_text_only'] = true;
673
 
                                }
674
 
 
675
 
                                $rowset[] = $row;
676
 
                        }
677
 
                        $db->sql_freeresult($result);
678
 
 
679
 
                        unset($text_only_message);
680
 
 
681
 
                        // Instantiate BBCode if needed
682
 
                        if ($bbcode_bitfield !== '')
683
 
                        {
684
 
                                include_once($phpbb_root_path . 'includes/bbcode.' . $phpEx);
685
 
                                $bbcode = new bbcode(base64_encode($bbcode_bitfield));
686
 
                        }
687
 
 
688
 
                        // Pull attachment data
689
 
                        if (sizeof($attach_list))
690
 
                        {
691
 
                                $use_attach_list = $attach_list;
692
 
                                $attach_list = array();
693
 
 
694
 
                                foreach ($use_attach_list as $forum_id => $_list)
695
 
                                {
696
 
                                        if ($auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id))
697
 
                                        {
698
 
                                                $attach_list = array_merge($attach_list, $_list);
699
 
                                        }
700
 
                                }
701
 
                        }
702
 
 
703
 
                        if (sizeof($attach_list))
704
 
                        {
705
 
                                $sql = 'SELECT *
706
 
                                        FROM ' . ATTACHMENTS_TABLE . '
707
 
                                        WHERE ' . $db->sql_in_set('post_msg_id', $attach_list) . '
708
 
                                                AND in_message = 0
709
 
                                        ORDER BY filetime DESC, post_msg_id ASC';
710
 
                                $result = $db->sql_query($sql);
711
 
                
712
 
                                while ($row = $db->sql_fetchrow($result))
713
 
                                {
714
 
                                        $attachments[$row['post_msg_id']][] = $row;
715
 
                                }
716
 
                                $db->sql_freeresult($result);
717
 
                        }
718
 
                }
719
 
 
720
 
                if ($hilit)
721
 
                {
722
 
                        // Remove bad highlights
723
 
                        $hilit_array = array_filter(explode('|', $hilit), 'strlen');
724
 
                        foreach ($hilit_array as $key => $value)
725
 
                        {
726
 
                                $hilit_array[$key] = str_replace('\*', '\w*?', preg_quote($value, '#'));
727
 
                                $hilit_array[$key] = preg_replace('#(^|\s)\\\\w\*\?(\s|$)#', '$1\w+?$2', $hilit_array[$key]);
728
 
                        }
729
 
                        $hilit = implode('|', $hilit_array);
730
 
                }
731
 
 
732
 
                foreach ($rowset as $row)
733
 
                {
734
 
                        $forum_id = $row['forum_id'];
735
 
                        $result_topic_id = $row['topic_id'];
736
 
                        $topic_title = censor_text($row['topic_title']);
737
 
 
738
 
                        // we need to select a forum id for this global topic
739
 
                        if (!$forum_id)
740
 
                        {
741
 
                                if (!isset($g_forum_id))
742
 
                                {
743
 
                                        // Get a list of forums the user cannot read
744
 
                                        $forum_ary = array_unique(array_keys($auth->acl_getf('!f_read', true)));
745
 
        
746
 
                                        // Determine first forum the user is able to read (must not be a category)
747
 
                                        $sql = 'SELECT forum_id
748
 
                                                FROM ' . FORUMS_TABLE . '
749
 
                                                WHERE forum_type = ' . FORUM_POST;
750
 
                
751
 
                                        if (sizeof($forum_ary))
752
 
                                        {
753
 
                                                $sql .= ' AND ' . $db->sql_in_set('forum_id', $forum_ary, true);
754
 
                                        }
755
 
 
756
 
                                        $result = $db->sql_query_limit($sql, 1);
757
 
                                        $g_forum_id = (int) $db->sql_fetchfield('forum_id');
758
 
                                }
759
 
                                $u_forum_id = $g_forum_id;
760
 
                        }
761
 
                        else
762
 
                        {
763
 
                                $u_forum_id = $forum_id;
764
 
                        }
765
 
 
766
 
                        $view_topic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$u_forum_id&amp;t=$result_topic_id" . (($u_hilit) ? "&amp;hilit=$u_hilit" : ''));
767
 
 
768
 
                        $replies = ($auth->acl_get('m_approve', $forum_id)) ? $row['topic_replies_real'] : $row['topic_replies'];
769
 
 
770
 
                        if ($show_results == 'topics')
771
 
                        {
772
 
                                $folder_img = $folder_alt = $topic_type = '';
773
 
                                topic_status($row, $replies, (isset($topic_tracking_info[$forum_id][$row['topic_id']]) && $row['topic_last_post_time'] > $topic_tracking_info[$forum_id][$row['topic_id']]) ? true : false, $folder_img, $folder_alt, $topic_type);
774
 
 
775
 
                                $unread_topic = (isset($topic_tracking_info[$forum_id][$row['topic_id']]) && $row['topic_last_post_time'] > $topic_tracking_info[$forum_id][$row['topic_id']]) ? true : false;
776
 
 
777
 
                                $topic_unapproved = (!$row['topic_approved'] && $auth->acl_get('m_approve', $forum_id)) ? true : false;
778
 
                                $posts_unapproved = ($row['topic_approved'] && $row['topic_replies'] < $row['topic_replies_real'] && $auth->acl_get('m_approve', $forum_id)) ? true : false;
779
 
                                $u_mcp_queue = ($topic_unapproved || $posts_unapproved) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=' . (($topic_unapproved) ? 'approve_details' : 'unapproved_posts') . "&amp;t=$result_topic_id", true, $user->session_id) : '';
780
 
 
781
 
                                $row['topic_title'] = preg_replace('#(?!<.*)(?<!\w)(' . $hilit . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#is', '<span class="posthilit">$1</span>', $row['topic_title']);
782
 
 
783
 
                                $tpl_ary = array(
784
 
                                        'TOPIC_AUTHOR'                          => get_username_string('username', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
785
 
                                        'TOPIC_AUTHOR_COLOUR'           => get_username_string('colour', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
786
 
                                        'TOPIC_AUTHOR_FULL'                     => get_username_string('full', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
787
 
                                        'FIRST_POST_TIME'                       => $user->format_date($row['topic_time']),
788
 
                                        'LAST_POST_SUBJECT'                     => $row['topic_last_post_subject'],
789
 
                                        'LAST_POST_TIME'                        => $user->format_date($row['topic_last_post_time']),
790
 
                                        'LAST_VIEW_TIME'                        => $user->format_date($row['topic_last_view_time']),
791
 
                                        'LAST_POST_AUTHOR'                      => get_username_string('username', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
792
 
                                        'LAST_POST_AUTHOR_COLOUR'       => get_username_string('colour', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
793
 
                                        'LAST_POST_AUTHOR_FULL'         => get_username_string('full', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
794
 
 
795
 
                                        'PAGINATION'            => topic_generate_pagination($replies, $view_topic_url),
796
 
                                        'TOPIC_TYPE'            => $topic_type,
797
 
 
798
 
                                        'TOPIC_FOLDER_IMG'              => $user->img($folder_img, $folder_alt),
799
 
                                        'TOPIC_FOLDER_IMG_SRC'  => $user->img($folder_img, $folder_alt, false, '', 'src'),
800
 
                                        'TOPIC_ICON_IMG'                => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['img'] : '',
801
 
                                        'TOPIC_ICON_IMG_WIDTH'  => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['width'] : '',
802
 
                                        'TOPIC_ICON_IMG_HEIGHT' => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['height'] : '',
803
 
                                        'ATTACH_ICON_IMG'               => ($auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id) && $row['topic_attachment']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
804
 
                                        'UNAPPROVED_IMG'                => ($topic_unapproved || $posts_unapproved) ? $user->img('icon_topic_unapproved', ($topic_unapproved) ? 'TOPIC_UNAPPROVED' : 'POSTS_UNAPPROVED') : '',
805
 
 
806
 
                                        'S_TOPIC_GLOBAL'                => (!$forum_id) ? true : false,
807
 
                                        'S_TOPIC_TYPE'                  => $row['topic_type'],
808
 
                                        'S_USER_POSTED'                 => (!empty($row['mark_type'])) ? true : false,
809
 
                                        'S_UNREAD_TOPIC'                => $unread_topic,
810
 
 
811
 
                                        'S_TOPIC_REPORTED'              => (!empty($row['topic_reported']) && $auth->acl_get('m_report', $forum_id)) ? true : false,
812
 
                                        'S_TOPIC_UNAPPROVED'    => $topic_unapproved,
813
 
                                        'S_POSTS_UNAPPROVED'    => $posts_unapproved,
814
 
 
815
 
                                        'U_LAST_POST'                   => $view_topic_url . '&amp;p=' . $row['topic_last_post_id'] . '#p' . $row['topic_last_post_id'],
816
 
                                        'U_LAST_POST_AUTHOR'    => get_username_string('profile', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
817
 
                                        'U_TOPIC_AUTHOR'                => get_username_string('profile', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
818
 
                                        'U_NEWEST_POST'                 => $view_topic_url . '&amp;view=unread#unread',
819
 
                                        'U_MCP_REPORT'                  => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=reports&amp;t=' . $result_topic_id, true, $user->session_id),
820
 
                                        'U_MCP_QUEUE'                   => $u_mcp_queue,
821
 
                                );
822
 
                        }
823
 
                        else
824
 
                        {
825
 
                                if ((isset($zebra['foe']) && in_array($row['poster_id'], $zebra['foe'])) && (!$view || $view != 'show' || $post_id != $row['post_id']))
826
 
                                {
827
 
                                        $template->assign_block_vars('searchresults', array(
828
 
                                                'S_IGNORE_POST' => true,
829
 
 
830
 
                                                'L_IGNORE_POST' => sprintf($user->lang['POST_BY_FOE'], $row['username'], "<a href=\"$u_search&amp;start=$start&amp;p=" . $row['post_id'] . '&amp;view=show#p' . $row['post_id'] . '">', '</a>'))
831
 
                                        );
832
 
 
833
 
                                        continue;
834
 
                                }
835
 
 
836
 
                                // Replace naughty words such as farty pants
837
 
                                $row['post_subject'] = censor_text($row['post_subject']);
838
 
 
839
 
                                if ($row['display_text_only'])
840
 
                                {
841
 
                                        // now find context for the searched words
842
 
                                        $row['post_text'] = get_context($row['post_text'], array_filter(explode('|', $hilit), 'strlen'), $return_chars);
843
 
                                        $row['post_text'] = bbcode_nl2br($row['post_text']);
844
 
                                }
845
 
                                else
846
 
                                {
847
 
                                        // Second parse bbcode here
848
 
                                        if ($row['bbcode_bitfield'])
849
 
                                        {
850
 
                                                $bbcode->bbcode_second_pass($row['post_text'], $row['bbcode_uid'], $row['bbcode_bitfield']);
851
 
                                        }
852
 
 
853
 
                                        $row['post_text'] = bbcode_nl2br($row['post_text']);
854
 
                                        $row['post_text'] = smiley_text($row['post_text']);
855
 
 
856
 
                                        if (!empty($attachments[$row['post_id']]))
857
 
                                        {
858
 
                                                parse_attachments($forum_id, $row['post_text'], $attachments[$row['post_id']], $update_count);
859
 
                                
860
 
                                                // we only display inline attachments
861
 
                                                unset($attachments[$row['post_id']]);
862
 
                                        }
863
 
                                }
864
 
 
865
 
                                if ($hilit)
866
 
                                {
867
 
                                        // post highlighting
868
 
                                        $row['post_text'] = preg_replace('#(?!<.*)(?<!\w)(' . $hilit . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#is', '<span class="posthilit">$1</span>', $row['post_text']);
869
 
                                        $row['post_subject'] = preg_replace('#(?!<.*)(?<!\w)(' . $hilit . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#is', '<span class="posthilit">$1</span>', $row['post_subject']);
870
 
                                }
871
 
 
872
 
                                $tpl_ary = array(
873
 
                                        'POST_AUTHOR_FULL'              => get_username_string('full', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
874
 
                                        'POST_AUTHOR_COLOUR'    => get_username_string('colour', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
875
 
                                        'POST_AUTHOR'                   => get_username_string('username', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
876
 
                                        'U_POST_AUTHOR'                 => get_username_string('profile', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
877
 
                                
878
 
                                        'POST_SUBJECT'          => $row['post_subject'],
879
 
                                        'POST_DATE'                     => (!empty($row['post_time'])) ? $user->format_date($row['post_time']) : '',
880
 
                                        'MESSAGE'                       => $row['post_text']
881
 
                                );
882
 
                        }
883
 
 
884
 
                        $template->assign_block_vars('searchresults', array_merge($tpl_ary, array(
885
 
                                'FORUM_ID'                      => $forum_id,
886
 
                                'TOPIC_ID'                      => $result_topic_id,
887
 
                                'POST_ID'                       => ($show_results == 'posts') ? $row['post_id'] : false,
888
 
 
889
 
                                'FORUM_TITLE'           => $row['forum_name'],
890
 
                                'TOPIC_TITLE'           => $topic_title,
891
 
                                'TOPIC_REPLIES'         => $replies,
892
 
                                'TOPIC_VIEWS'           => $row['topic_views'],
893
 
 
894
 
                                'U_VIEW_TOPIC'          => $view_topic_url,
895
 
                                'U_VIEW_FORUM'          => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id),
896
 
                                'U_VIEW_POST'           => (!empty($row['post_id'])) ? append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=" . $row['topic_id'] . '&amp;p=' . $row['post_id'] . (($u_hilit) ? '&amp;hilit=' . $u_hilit : '')) . '#p' . $row['post_id'] : '')
897
 
                        ));
898
 
                }
899
 
 
900
 
                if ($topic_id && ($topic_id == $result_topic_id))
901
 
                {
902
 
                        $template->assign_vars(array(
903
 
                                'SEARCH_TOPIC'          => $topic_title,
904
 
                                'U_SEARCH_TOPIC'        => $view_topic_url
905
 
                        ));
906
 
                }
907
 
        }
908
 
        unset($rowset);
909
 
 
910
 
        page_header(($l_search_title) ? $l_search_title : $user->lang['SEARCH']);
911
 
 
912
 
        $template->set_filenames(array(
913
 
                'body' => 'search_results.html')
914
 
        );
915
 
        make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"));
916
 
 
917
 
        page_footer();
918
 
}
919
 
 
920
 
 
921
 
// Search forum
922
 
$s_forums = '';
923
 
$sql = 'SELECT f.forum_id, f.forum_name, f.parent_id, f.forum_type, f.left_id, f.right_id, f.forum_password, fa.user_id
924
 
        FROM ' . FORUMS_TABLE . ' f
925
 
        LEFT JOIN ' . FORUMS_ACCESS_TABLE . " fa ON (fa.forum_id = f.forum_id
926
 
                AND fa.session_id = '" . $db->sql_escape($user->session_id) . "')
927
 
        ORDER BY f.left_id ASC";
928
 
$result = $db->sql_query($sql);
929
 
 
930
 
$right = $cat_right = $padding_inc = 0;
931
 
$padding = $forum_list = $holding = '';
932
 
$pad_store = array('0' => '');
933
 
 
934
 
while ($row = $db->sql_fetchrow($result))
935
 
{
936
 
        if ($row['forum_type'] == FORUM_CAT && ($row['left_id'] + 1 == $row['right_id']))
937
 
        {
938
 
                // Non-postable forum with no subforums, don't display
939
 
                continue;
940
 
        }
941
 
 
942
 
        if ($row['forum_type'] == FORUM_LINK || ($row['forum_password'] && !$row['user_id']))
943
 
        {
944
 
                // if this forum is a link or password protected (user has not entered the password yet) then skip to the next branch
945
 
                continue;
946
 
        }
947
 
 
948
 
        if ($row['left_id'] < $right)
949
 
        {
950
 
                $padding .= '&nbsp; &nbsp;';
951
 
                $pad_store[$row['parent_id']] = $padding;
952
 
        }
953
 
        else if ($row['left_id'] > $right + 1)
954
 
        {
955
 
                if (isset($pad_store[$row['parent_id']]))
956
 
                {
957
 
                        $padding = $pad_store[$row['parent_id']];
958
 
                }
959
 
                else
960
 
                {
961
 
                        continue;
962
 
                }
963
 
        }
964
 
 
965
 
        $right = $row['right_id'];
966
 
 
967
 
        if ($auth->acl_gets('!f_search', '!f_list', $row['forum_id']))
968
 
        {
969
 
                // if the user does not have permissions to search or see this forum skip only this forum/category
970
 
                continue;
971
 
        }
972
 
 
973
 
        $selected = (in_array($row['forum_id'], $search_forum)) ? ' selected="selected"' : '';
974
 
 
975
 
        if ($row['left_id'] > $cat_right)
976
 
        {
977
 
                // make sure we don't forget anything
978
 
                $s_forums .= $holding;
979
 
                $holding = '';
980
 
        }
981
 
 
982
 
        if ($row['right_id'] - $row['left_id'] > 1)
983
 
        {
984
 
                $cat_right = max($cat_right, $row['right_id']);
985
 
 
986
 
                $holding .= '<option value="' . $row['forum_id'] . '"' . $selected . '>' . $padding . $row['forum_name'] . '</option>';
987
 
        }
988
 
        else
989
 
        {
990
 
                $s_forums .= $holding . '<option value="' . $row['forum_id'] . '"' . $selected . '>' . $padding . $row['forum_name'] . '</option>';
991
 
                $holding = '';
992
 
        }
993
 
}
994
 
 
995
 
if ($holding)
996
 
{
997
 
        $s_forums .= $holding;
998
 
}
999
 
 
1000
 
$db->sql_freeresult($result);
1001
 
unset($pad_store);
1002
 
 
1003
 
if (!$s_forums)
1004
 
{
1005
 
        trigger_error('NO_SEARCH');
1006
 
}
1007
 
 
1008
 
// Number of chars returned
1009
 
$s_characters = '<option value="-1">' . $user->lang['ALL_AVAILABLE'] . '</option>';
1010
 
$s_characters .= '<option value="0">0</option>';
1011
 
$s_characters .= '<option value="25">25</option>';
1012
 
$s_characters .= '<option value="50">50</option>';
1013
 
 
1014
 
for ($i = 100; $i <= 1000 ; $i += 100)
1015
 
{
1016
 
        $selected = ($i == 300) ? ' selected="selected"' : '';
1017
 
        $s_characters .= '<option value="' . $i . '"' . $selected . '>' . $i . '</option>';
1018
 
}
1019
 
 
1020
 
$s_hidden_fields = array('t' => $topic_id);
1021
 
 
1022
 
if ($_SID)
1023
 
{
1024
 
        $s_hidden_fields['sid'] = $_SID;
1025
 
}
1026
 
 
1027
 
if (!empty($_EXTRA_URL))
1028
 
{
1029
 
        foreach ($_EXTRA_URL as $url_param)
1030
 
        {
1031
 
                $url_param = explode('=', $url_param, 2);
1032
 
                $s_hidden_fields[$url_param[0]] = $url_param[1];
1033
 
        }
1034
 
}
1035
 
 
1036
 
$template->assign_vars(array(
1037
 
        'S_SEARCH_ACTION'               => "{$phpbb_root_path}search.$phpEx",
1038
 
        'S_HIDDEN_FIELDS'               => build_hidden_fields($s_hidden_fields),
1039
 
        'S_CHARACTER_OPTIONS'   => $s_characters,
1040
 
        'S_FORUM_OPTIONS'               => $s_forums,
1041
 
        'S_SELECT_SORT_DIR'             => $s_sort_dir,
1042
 
        'S_SELECT_SORT_KEY'             => $s_sort_key,
1043
 
        'S_SELECT_SORT_DAYS'    => $s_limit_days,
1044
 
        'S_IN_SEARCH'                   => true,
1045
 
));
1046
 
 
1047
 
// only show recent searches to search administrators
1048
 
if ($auth->acl_get('a_search'))
1049
 
{
1050
 
        // Handle large objects differently for Oracle and MSSQL
1051
 
        switch ($db->sql_layer)
1052
 
        {
1053
 
                case 'oracle':
1054
 
                        $sql = 'SELECT search_time, search_keywords
1055
 
                                FROM ' . SEARCH_RESULTS_TABLE . '
1056
 
                                WHERE dbms_lob.getlength(search_keywords) > 0
1057
 
                                ORDER BY search_time DESC';
1058
 
                break;
1059
 
        
1060
 
                case 'mssql':
1061
 
                case 'mssql_odbc':
1062
 
                        $sql = 'SELECT search_time, search_keywords
1063
 
                                FROM ' . SEARCH_RESULTS_TABLE . '
1064
 
                                WHERE DATALENGTH(search_keywords) > 0
1065
 
                                ORDER BY search_time DESC';
1066
 
                break;
1067
 
        
1068
 
                default:
1069
 
                        $sql = 'SELECT search_time, search_keywords
1070
 
                                FROM ' . SEARCH_RESULTS_TABLE . '
1071
 
                                WHERE search_keywords <> \'\'
1072
 
                                ORDER BY search_time DESC';
1073
 
                break;
1074
 
        }
1075
 
        $result = $db->sql_query_limit($sql, 5);
1076
 
 
1077
 
        while ($row = $db->sql_fetchrow($result))
1078
 
        {
1079
 
                $keywords = $row['search_keywords'];
1080
 
 
1081
 
                $template->assign_block_vars('recentsearch', array(
1082
 
                        'KEYWORDS'      => $keywords,
1083
 
                        'TIME'          => $user->format_date($row['search_time']),
1084
 
 
1085
 
                        'U_KEYWORDS'    => append_sid("{$phpbb_root_path}search.$phpEx", 'keywords=' . urlencode(htmlspecialchars_decode($keywords)))
1086
 
                ));
1087
 
        }
1088
 
        $db->sql_freeresult($result);
1089
 
}
1090
 
 
1091
 
// Output the basic page
1092
 
page_header($user->lang['SEARCH']);
1093
 
 
1094
 
$template->set_filenames(array(
1095
 
        'body' => 'search_body.html')
1096
 
);
1097
 
make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"));
1098
 
 
1099
 
page_footer();
1100
 
 
1101
 
?>
 
 
b'\\ No newline at end of file'