Fix issues with view posts since last visit, errors on next page, re-introduce external stopword list, examine feasibility of stemmer, tidy ups ...

git-svn-id: file:///svn/phpbb/trunk@2205 89ea8834-ac86-4346-8a33-228a782c2dd0
This commit is contained in:
Paul S. Owen 2002-02-25 01:00:48 +00:00
parent b9b87a04fa
commit 508b6d60ef
8 changed files with 674 additions and 661 deletions

View file

@ -0,0 +1,51 @@
<?php
//
// phpBB 2.x auto-generated config file
// Do not change anything in this file!
//
$dbms = "mysql4";
$dbhost = "localhost";
$dbname = "dev_starstreak_net";
$dbuser = "devhttp";
$dbpasswd = "efx2KarizonaD";
$dbhost = "localhost";
$dbname = "phpbb_com";
$dbuser = "devhttp";
$dbpasswd = "efx2KarizonaD";
/*
$dbhost = "localhost";
$dbname = "phpbb_test";
$dbuser = "devhttp";
$dbpasswd = "efx2KarizonaD";
$dbms = "mssql-odbc";
$dbhost = "phpbb_test_mssql_odbc";
$dbname = "";
$dbuser = "devhttp";
$dbpasswd = "efx2KarizonaD";
$dbms = "msaccess";
$dbhost = "phpbb_test_msaccess_odbc";
$dbname = "";
$dbuser = "devhttp";
$dbpasswd = "efx2KarizonaD";
$dbms = "mssql";
$dbhost = "localhost";
$dbname = "phpbb_com";
$dbuser = "devhttp";
$dbpasswd = "efx2KarizonaD";
*/
$table_prefix = "phpbb_";
define('PHPBB_INSTALLED', true);
?>

View file

@ -7,55 +7,41 @@
// Remove or comment the next line (die(".... ) to enable this script.
// Do NOT FORGET to either remove this script or disable it after you have used it.
//
die("Please read the first lines of this script for instructions on how to enable it");
//
// Do not change anything below this line.
//
set_time_limit(0);
$common_percent = 0.4; // Percentage of posts in which a word has to appear to be marked as common
$phpbb_root_path = "../";
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'config.'.$phpEx);
include($phpbb_root_path . 'includes/constants.'.$phpEx);
include($phpbb_root_path . 'includes/db.'.$phpEx);
include($phpbb_root_path . 'includes/functions.'.$phpEx);
include($phpbb_root_path . 'common.'.$phpEx);
include($phpbb_root_path . 'includes/search.'.$phpEx);
$common_percent = 0.4; // Percentage of posts in which a word has to appear to be marked as common
print "<html>\n<body>\n";
//
// Try and load stopword and synonym files
//
//$stopword_array = file($phpbb_root_path . "language/lang_" . $board_config['default_lang'] . "/search_stopwords.txt");
//$synonym_array = file($phpbb_root_path . "language/lang_" . $board_config['default_lang'] . "/search_synonyms.txt");
// This needs fixing! Shouldn't be hardcoded to English files!
//$stopword_array = file($phpbb_root_path . "language/lang_english/search_stopwords.txt");
$stopword_array = file($phpbb_root_path . "language/lang_english/search_stopwords.txt");
$synonym_array = file($phpbb_root_path . "language/lang_english/search_synonyms.txt");
/*
for ($j = 0; $j < count($stopword_array); $j++)
{
$filter_word = trim(strtolower($stopword_array[$j]));
$search[] = "/\b" . phpbb_preg_quote($filter_word, "/") . "\b/is";
$replace[] = '';
}
*/
//
// Fetch a batch of posts_text entries
//
$sql = "SELECT count(*) as total, max(post_id) as max_post_id
$sql = "SELECT COUNT(*) as total, MAX(post_id) as max_post_id
FROM ". POSTS_TEXT_TABLE;
if(!$result = $db->sql_query($sql))
if ( !($result = $db->sql_query($sql)) )
{
$error = $db->sql_error();
die("Couldn't get maximum post ID :: " . $sql . " :: " . $error['message']);
}
$max_post_id = $db->sql_fetchrow($result);
$totalposts = $max_post_id['total'];
$max_post_id = $max_post_id['max_post_id'];
@ -74,15 +60,18 @@ for(;$postcounter <= $max_post_id; $postcounter += $batchsize)
WHERE post_id
BETWEEN $batchstart
AND $batchend";
if(!$posts_result = $db->sql_query($sql))
if( !($result = $db->sql_query($sql)) )
{
$error = $db->sql_error();
die("Couldn't get post_text :: " . $sql . " :: " . $error['message']);
}
$rowset = $db->sql_fetchrowset($posts_result);
$rowset = $db->sql_fetchrowset($result);
$db->sql_freeresult($result);
if( $post_rows = $db->sql_numrows($posts_result) )
$post_rows = count($rowset);
if( $post_rows )
{
// $sql = "LOCK TABLES ".POST_TEXT_TABLE." WRITE";
@ -92,18 +81,14 @@ for(;$postcounter <= $max_post_id; $postcounter += $batchsize)
// For every post in the batch:
for($post_nr = 0; $post_nr < $post_rows; $post_nr++ )
{
print ".";
flush();
$matches = array();
$post_id = $rowset[$post_nr]['post_id'];
$text = clean_words("post", $rowset[$post_nr]['post_text'], $synonym_array); // Cleaned up post
$text_title = clean_words("post", $rowset[$post_nr]['post_subject'], $synonym_array);
$matches = array();
$matches['text'] = split_words($text);
$matches['title'] = split_words($text_title);
$matches['text'] = split_words(clean_words("post", $rowset[$post_nr]['post_text'], $stopword_array, $synonym_array));
$matches['title'] = split_words(clean_words("post", $rowset[$post_nr]['post_subject'], $stopword_array, $synonym_array));
while( list($match_type, $match_ary) = @each($matches) )
{
@ -190,13 +175,7 @@ for(;$postcounter <= $max_post_id; $postcounter += $batchsize)
// $result = $db->sql_query($sql);
}
else
{
print "Couldn't get rowcount for number of posts<br>$sql<br>\n";
} // All posts;
$db->sql_freeresult($posts_result);
// Remove common words after the first 2 batches and after every 4th batch after that.
if( $batchcount % 4 == 3 )
{

View file

@ -19,7 +19,7 @@
*
***************************************************************************/
function clean_words($mode, &$entry, &$synonym_list)
function clean_words($mode, &$entry, &$stopword_list, &$synonym_list)
{
// Weird, $init_match doesn't work with static when double quotes (") are used...
static $drop_char_match = array('^', '$', '&', '(', ')', '<', '>', '`', "'", '|', ',', '@', '_', '?', '%', '-', '~', '+', '.', '[', ']', '{', '}', ':', '\\', '/', '=', '#', '\'', ';', '!');
@ -37,16 +37,16 @@ function clean_words($mode, &$entry, &$synonym_list)
if( $mode == "post" )
{
// HTML entities like &nbsp;
$entry = preg_replace("/\b&[a-z]+;\b/is", " ", $entry);
// Replace line endings by a space
$entry = preg_replace("/[\n\r]/is", " ", $entry);
// HTML entities like &nbsp;
$entry = preg_replace("/\b&[a-z]+;\b/", " ", $entry);
// Remove URL's
$entry = preg_replace("/\b[a-z0-9]+:\/\/[a-z0-9\.\-]+(\/[a-z0-9\?\.%_\-\+=&\/]+)?/si", " ", $entry);
$entry = preg_replace("/\b[a-z0-9]+:\/\/[a-z0-9\.\-]+(\/[a-z0-9\?\.%_\-\+=&\/]+)?/", " ", $entry);
// Quickly remove BBcode.
$entry = preg_replace("/\[img:[a-z0-9]{10,}\].*?\[\/img:[a-z0-9]{10,}\]/is", " ", $entry);
$entry = preg_replace("/\[\/?url(=.*?)?\]/si", " ", $entry);
$entry = preg_replace("/\[\/?[a-z\*=\+\-]+(\:?[0-9a-z]+)?:[a-z0-9]{10,}(\:[a-z0-9]+)?=?.*?\]/si", " ", $entry);
$entry = preg_replace("/\[img:[a-z0-9]{10,}\].*?\[\/img:[a-z0-9]{10,}\]/", " ", $entry);
$entry = preg_replace("/\[\/?url(=.*?)?\]/", " ", $entry);
$entry = preg_replace("/\[\/?[a-z\*=\+\-]+(\:?[0-9a-z]+)?:[a-z0-9]{10,}(\:[a-z0-9]+)?=?.*?\]/", " ", $entry);
}
else if( $mode == "search" )
{
@ -55,7 +55,7 @@ function clean_words($mode, &$entry, &$synonym_list)
}
// Replace numbers on their own
$entry = preg_replace("/\b[0-9]+\b/si", " ", $entry);
$entry = preg_replace("/\b[0-9]+\b/", " ", $entry);
//
// Filter out strange characters like ^, $, &, change "it's" to "its"
@ -69,8 +69,21 @@ function clean_words($mode, &$entry, &$synonym_list)
{
$entry = str_replace("*", " ", $entry);
// 'words' that consist of <=3 or >=50 characters are removed.
$entry = preg_replace("/\b([a-z0-9]{1,3}|[a-z0-9]{50,})\b/si", " ", $entry);
// 'words' that consist of <=3 or >=25 characters are removed.
$entry = preg_replace("/\b([a-z0-9]{1,3}|[a-z0-9]{25,})\b/", " ", $entry);
}
if( !empty($stopword_list) )
{
for ($j = 0; $j < count($stopword_list); $j++)
{
$stopword = trim($stopword_list[$j]);
if ( $mode == "post" || ( $stopword != "not" && $stopword != "and" && $stopword != "or" ) )
{
$entry = preg_replace("/\b" . $stopword . "\b/", " ", $entry);
}
}
}
if( !empty($synonym_list) )
@ -78,11 +91,9 @@ function clean_words($mode, &$entry, &$synonym_list)
for ($j = 0; $j < count($synonym_list); $j++)
{
list($replace_synonym, $match_synonym) = split(" ", trim(strtolower($synonym_list[$j])));
if( ( $match_synonym != "and" && $match_synonym != "or" && $match_synonym != "not" &&
$replace_synonym != "and" && $replace_synonym != "or" && $replace_synonym != "not" ) || $mode == "post" )
if ( $mode == "post" || ( $match_synonym != "not" && $match_synonym != "and" && $match_synonym != "or" ) )
{
$entry = preg_replace("/\b" . phpbb_preg_quote(trim($match_synonym), "/") . "\b/is", " " . trim($replace_synonym) . " ", $entry);
$entry = preg_replace("/\b" . trim($match_synonym) . "\b/", " " . trim($replace_synonym) . " ", $entry);
}
}
}
@ -98,7 +109,7 @@ function split_words(&$entry, $mode = "post")
}
else
{
preg_match_all("/(\*?[a-z0-9]+\*?)|\b([a-z0-9]+)\b/is", $entry, $split_entries);
preg_match_all("/(\*?[a-z0-9]+\*?)|\b([a-z0-9]+)\b/", $entry, $split_entries);
}
return $split_entries[1];
@ -108,11 +119,12 @@ function add_search_words($post_id, $post_text, $post_title = "")
{
global $db, $phpbb_root_path, $board_config, $lang;
$stopwords_array = @file($phpbb_root_path . "language/lang_" . $board_config['default_lang'] . "/search_stopwords.txt");
$synonym_array = @file($phpbb_root_path . "language/lang_" . $board_config['default_lang'] . "/search_synonyms.txt");
$search_raw_words = array();
$search_raw_words['text'] = split_words(clean_words("post", $post_text, $synonym_array));
$search_raw_words['title'] = split_words(clean_words("post", $post_title, $synonym_array));
$search_raw_words['text'] = split_words(clean_words('post', $post_text, $stopword_array, $synonym_array));
$search_raw_words['title'] = split_words(clean_words('post', $post_title, $stopword_array, $synonym_array));
$word = array();
$word_insert_sql = array();
@ -389,4 +401,81 @@ function remove_unmatched_words()
return 0;
}
//
// Username search
//
function username_search($search_match, $is_inline_review = 0, $default_list = "")
{
global $db, $board_config, $template, $lang, $images, $theme, $phpEx, $phpbb_root_path;
global $starttime;
$author_list = '';
if ( !empty($search_match) )
{
$username_search = preg_replace("/\*/", "%", trim(strip_tags($search_match)));
$sql = "SELECT username
FROM " . USERS_TABLE . "
WHERE username LIKE '" . str_replace("\'", "''", $username_search) . "'
ORDER BY username";
if ( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, "Couldn't obtain search results", "", __LINE__, __FILE__, $sql);
}
if ( $row = $db->sql_fetchrow($result) )
{
do
{
$author_list .= '<option value="' . $row['username'] . '">' .$row['username'] . '</option>';
}
while ( $row = $db->sql_fetchrow($result) );
}
else
{
$author_list = '<option>' . $lang['No_match']. '</option>';
}
}
if ( !$is_inline_review )
{
$gen_simple_header = TRUE;
$page_title = $lang['Search'];
include($phpbb_root_path . 'includes/page_header.'.$phpEx);
$template->set_filenames(array(
"search_user_body" => "search_username.tpl")
);
$template->assign_vars(array(
"L_CLOSE_WINDOW" => $lang['Close_window'],
"L_SEARCH_USERNAME" => $lang['Find_username'],
"L_UPDATE_USERNAME" => $lang['Select_username'],
"L_SELECT" => $lang['Select'],
"L_SEARCH" => $lang['Search'],
"L_SEARCH_EXPLAIN" => $lang['Search_author_explain'],
"L_CLOSE_WINDOW" => $lang['Close_window'],
"S_AUTHOR_OPTIONS" => $author_list,
"S_SEARCH_ACTION" => append_sid("search.$phpEx?mode=searchuser"))
);
//
// If we have results then dump them out and enable
// the appropriate switch block
//
if ( !empty($author_list) )
{
$template->assign_block_vars("switch_select_name", array());
}
$template->pparse("search_user_body");
include($phpbb_root_path . 'includes/page_tail.'.$phpEx);
}
return($author_list);
}
?>

View file

@ -8,30 +8,16 @@ andy andrew
anemia anaemia
anemic anaemic
anesthesia anaesthesia
anesthesiologist anaesthesiologist
anesthesiololy anaesthesiology
anesthetic anaesthetic
anesthetist anaesthetist
appologize appologise
appologized appologised
appologizing appologising
apr april
archean archaean
archeology archaeology
archeozoic archaeozoic
armor armour
armored armoured
armory armoury
armorment armourment
artic arctic
attachment attachement
attachments attachements
attendence attendance
aug august
barbecue barbeque
bbq barbeque
behavior behaviour
behaviorism behaviourism
biassed biased
biol biology
buletin bulletin
@ -43,18 +29,13 @@ cenozoic caenozoic
center centre
check cheque
color colour
colored coloured
coloring colouring
colorless colourless
comission commission
comittee committee
commitee committee
conceed concede
creating createing
curiculum curriculum
dec december
defense defence
dept department
develope develop
discription description
dulness dullness
@ -66,7 +47,6 @@ exhorbitant exorbitant
exhuberant exuberant
existance existence
favorite favourite
feb february
fetus foetus
ficticious fictitious
flavor flavour
@ -78,66 +58,43 @@ geneology genealogy
grammer grammar
gray grey
guerilla guerrilla
gynecological gynaecological
gynecologist gynaecologist
gynecology gynaecology
harbor harbour
heighth height
hemaglobin haemaglobin
hematin haematin
hematite haematite
hematologist haematologist
hematology haematology
hemophilia haemophilia
hemorrhage haemorrhage
hemorrhoids haemorrhoids
honor honour
innoculate inoculate
installment instalment
irrelevent irrelevant
irrevelant irrelevant
jan january
jeweler jeweller
judgement judgment
jul july
jun june
labeled labelled
labor labour
laborer labourer
laborers labourers
laboring labouring
lib library
licence license
liesure leisure
liquify liquefy
maintainance maintenance
maintenence maintenance
marshal marshall
medieval mediaeval
medievalism mediaevalism
medievalist mediaevalist
meg margaret
meter metre
milage mileage
millipede millepede
miscelaneous miscellaneous
morgage mortgage
noticable noticeable
nov november
occurence occurrence
oct october
offense offence
ommision omission
ommission omission
optimize optimize
optimizer optimiser
optimizing optimising
optimized optimised
organisation organization
organise organize
organised organized
organising organizing
organiser organizer
pajamas pyjamas
paleography palaeography
paleolithic palaeolithic
@ -158,7 +115,6 @@ personel personnel
practise practice
program programme
psych psychology
qld queensland
questionaire questionnaire
rarify rarefy
reccomend recommend
@ -178,7 +134,6 @@ supersede supercede
suprise surprise
surprize surprise
synchronise synchronize
tas tasmania
temperary temporary
theater theatre
threshhold threshold
@ -187,7 +142,6 @@ truely truly
truley truly
useable usable
valor valour
vic victoria
vigor vigour
vol volume
whack wack

File diff suppressed because it is too large Load diff

View file

@ -26,7 +26,7 @@
<span class="postdetails">{L_REPLIES}: <b>{searchresults.TOPIC_REPLIES}</b><br />
{L_VIEWS}: <b>{searchresults.TOPIC_VIEWS}</b></span><br />
</td>
<td valign="top" class="row1"> <img src="templates/subSilver/images/icon_minipost.gif" alt="Post image icon"><span class="postdetails">{L_FORUM}:&nbsp;<b><a href="{U_FORUM}" class="postdetails">{searchresults.FORUM_NAME}</a></b>&nbsp;&nbsp;&nbsp;{L_POSTED}:
<td valign="top" class="row1"> <span class="postdetails">{L_FORUM}:&nbsp;<b><a href="{U_FORUM}" class="postdetails">{searchresults.FORUM_NAME}</a></b>&nbsp;&nbsp;&nbsp;{L_POSTED}:
{searchresults.POST_DATE}&nbsp;&nbsp;&nbsp;Subject: <b><a href="{searchresults.U_POST}">{searchresults.POST_SUBJECT}</a></b></span></td>
</tr>
<tr>

View file

@ -57,7 +57,7 @@
<table width="98%" cellspacing="2" border="0" align="center">
<tr>
<td><span class="gensmall"><b>{S_TIMEZONE}</b></span></td>
<td valign="top"><span class="gensmall"><b>{S_TIMEZONE}</b></span></td>
<td align="right">{JUMPBOX}</td>
</tr>
</table>

View file

@ -1,86 +1,57 @@
<form action="{S_SEARCH_ACTION}" method="POST">
<table width="100%" cellspacing="2" cellpadding="2" border="0" align="center">
<form action="{S_SEARCH_ACTION}" method="POST"><table width="100%" cellspacing="2" cellpadding="2" border="0" align="center">
<tr>
<td align="left"><span class="nav"><a href="{U_INDEX}" class="nav">{L_INDEX}</a></span></td>
<td align="left"><span class="nav"><a href="{U_INDEX}" class="nav">{L_INDEX}</a></span></td>
</tr>
</table>
<table class="forumline" width="100%" cellpadding="4" cellspacing="1" border="0">
<tr>
<th class="thHead" colspan="4" height="25">{L_SEARCH_QUERY}</th>
</tr>
<tr>
<td class="row1" colspan="2" width="50%"><span class="gen">{L_SEARCH_KEYWORDS}:</span><br /><span class="gensmall">{L_SEARCH_KEYWORDS_EXPLAIN}</span></td>
<td class="row2" colspan="2" valign="top"><span class="genmed"><input type="text" style="width: 300px" class="post" name="search_keywords" size="30" /><br /><input type="radio" name="search_terms" value="any" checked="checked" /> {L_SEARCH_ANY_TERMS}<br /><input type="radio" name="search_terms" value="all" /> {L_SEARCH_ALL_TERMS}</span></td>
</tr>
<tr>
<td class="row1" colspan="2"><span class="gen">{L_SEARCH_AUTHOR}:</span><br /><span class="gensmall">{L_SEARCH_AUTHOR_EXPLAIN}</span></td>
<td class="row2" colspan="2" valign="middle"><span class="genmed"><input type="text" style="width: 300px" class="post" name="search_author" size="30" /></span></td>
</tr>
<tr>
<th class="thHead" colspan="4" height="25">{L_SEARCH_OPTIONS}</th>
</tr>
<tr>
<td class="row1" align="right"><span class="gen">{L_FORUM}:&nbsp;</span></td>
<td class="row2"><span class="genmed"><select class="post" name="search_forum">{S_FORUM_OPTIONS}</select></span></td>
<td class="row1" align="right" nowrap="nowrap"><span class="gen">{L_SEARCH_PREVIOUS}:&nbsp;</span></td>
<td class="row2" valign="middle"><span class="genmed"><select class="post" name="search_time">{S_TIME_OPTIONS}</select><br /><input type="radio" name="search_fields" value="all" checked="checked" /> {L_SEARCH_MESSAGE_TITLE}<br /><input type="radio" name="search_fields" value="msgonly" /> {L_SEARCH_MESSAGE_ONLY}</span></td>
</tr>
<tr>
<td class="row1" align="right"><span class="gen">{L_CATEGORY}:&nbsp;</span></td>
<td class="row2"><span class="genmed"><select class="post" name="search_cat">{S_CATEGORY_OPTIONS}
</select></span></td>
<td class="row1" align="right"><span class="gen">{L_SORT_BY}:&nbsp;</span></td>
<td class="row2" valign="middle" nowrap="nowrap"><span class="genmed"><select class="post" name="sort_by">{S_SORT_OPTIONS}</select><br /><input type="radio" name="sort_dir" value="ASC" /> {L_SORT_ASCENDING}<br /><input type="radio" name="sort_dir" value="DESC" checked /> {L_SORT_DESCENDING}</span>&nbsp;</td>
</tr>
<tr>
<td class="row1" align="right" nowrap="nowrap"><span class="gen">{L_DISPLAY_RESULTS}:&nbsp;</span></td>
<td class="row2" nowrap="nowrap"><input type="radio" name="show_results" value="posts" /><span class="genmed">{L_POSTS}<input type="radio" name="show_results" value="topics" checked="checked" />{L_TOPICS}</span></td>
<td class="row1" align="right"><span class="gen">{L_RETURN_FIRST}</span></td>
<td class="row2"><span class="genmed"><select class="post" name="return_chars">{S_CHARACTER_OPTIONS}</select> {L_CHARACTERS}</span></td>
</tr>
<tr>
<td class="catBottom" colspan="4" align="center" height="28">{S_HIDDEN_FIELDS}<input class="liteoption" type="submit" value="{L_SEARCH}" /></td>
</tr>
</table>
<table width="100%" cellspacing="2" cellpadding="2" border="0" align="center">
<tr>
<td align="right" valign="middle"><span class="gensmall">{S_TIMEZONE}</span></td>
</tr>
</table></form>
<table width="100%" border="0">
<tr>
<td align="right" valign="top">{JUMPBOX}</td>
</tr>
</table>
<table border="0" cellpadding="4" cellspacing="1" width="100%" class="forumline">
<tr>
<th class="thHead" colspan="4" height="25">{L_SEARCH_QUERY}</th>
</tr>
<tr>
<td class="row1" colspan="2" width="50%"><span class="gen">{L_SEARCH_KEYWORDS}:</span><br />
<span class="gensmall">{L_SEARCH_KEYWORDS_EXPLAIN}</span></td>
<td class="row2" colspan="2" valign="top"><span class="genmed">
<input type="text" style="width: 300px" class="post" name="search_keywords" size="30" />
<br />
<input type="radio" name="addterms" value="any" checked="checked" /> {L_SEARCH_ANY_TERMS}<br />
<input type="radio" name="addterms" value="all" /> {L_SEARCH_ALL_TERMS}</span></td>
</tr>
<tr>
<td class="row1" colspan="2"><span class="gen">{L_SEARCH_AUTHOR}:</span><br />
<span class="gensmall">{L_SEARCH_AUTHOR_EXPLAIN}</span></td>
<td class="row2" colspan="2" valign="middle"><span class="genmed">
<input type="text" style="width: 300px" class="post" name="search_author" size="30" />
</span> </td>
</tr>
<tr>
<th class="thHead" colspan="4" height="25">{L_SEARCH_OPTIONS}</th>
</tr>
<tr>
<td class="row1" align="right"><span class="gen">{L_FORUM}:&nbsp;</span></td>
<td class="row2"><span class="genmed">
<select class="post" name="searchforum">{S_FORUM_OPTIONS}
</select>
</span></td>
<td class="row1" align="right" nowrap="nowrap"><span class="gen">{L_SEARCH_PREVIOUS}:&nbsp;</span></td>
<td class="row2" valign="middle"><span class="genmed"><select class="post" name="resultdays">{S_TIME_OPTIONS}</select>
<br />
<input type="radio" name="searchfields" value="all" checked="checked" /> {L_SEARCH_MESSAGE_TITLE}<br />
<input type="radio" name="searchfields" value="msgonly" /> {L_SEARCH_MESSAGE_ONLY}</span></td>
</tr>
<tr>
<td class="row1" align="right"><span class="gen">{L_CATEGORY}:&nbsp;</span></td>
<td class="row2"><span class="genmed">
<select class="post" name="searchcat">{S_CATEGORY_OPTIONS}
</select>
</span></td>
<td class="row1" align="right"><span class="gen">{L_SORT_BY}:&nbsp;</span></td>
<td class="row2" valign="middle" nowrap="nowrap"><span class="genmed">
<select class="post" name="sortby">{S_SORT_OPTIONS}</select>
<br />
<input type="radio" name="sortdir" value="ASC" />
{L_SORT_ASCENDING}<br />
<input type="radio" name="sortdir" value="DESC" checked />
{L_SORT_DESCENDING}</span>&nbsp;</td>
</tr>
<tr>
<td class="row1" align="right" nowrap="nowrap"><span class="gen">{L_DISPLAY_RESULTS}:&nbsp;</span></td>
<td class="row2" nowrap="nowrap">
<input type="radio" name="showresults" value="posts" />
<span class="genmed">{L_POSTS}
<input type="radio" name="showresults" value="topics" checked="checked" />
{L_TOPICS}</span></td>
<td class="row1" align="right"><span class="gen">{L_RETURN_FIRST}</span></td>
<td class="row2"><span class="genmed">
<select class="post" name="charsreqd">{S_CHARACTER_OPTIONS}
</select>
{L_CHARACTERS}</span></td>
</tr>
<tr>
<td class="catBottom" colspan="4" align="center" height="28">{S_HIDDEN_FIELDS}
<input class="liteoption" type="submit" value="{L_SEARCH}" />
</td>
</tr>
</table>
<table width="100%" cellspacing="2" border="0" align="center" cellpadding="2">
<tr>
<td align="right" valign="middle"><span class="gensmall">{S_TIMEZONE}</span></td>
</tr>
</table>
</form>
<table width="100%" border="0">
<tr>
<td align="right" valign="top">{JUMPBOX}</td>
</tr>
</table>