F:\WEBSITES\testbed\zipped\yabb_svn_new\branches\2.5.2\cgi-bin\yabb2\Sources\Search.pl F:\WEBSITES\testbed\zipped\yabb_svn_new\trunk\cgi-bin\yabb2\Sources\Search.pm
############################################################################### ###############################################################################
# Search.pl                                                                   # # Search.pm                                                                   #
  # $Date: 01.05.16 $                                                           #
############################################################################### ###############################################################################
# YaBB: Yet another Bulletin Board                                            # # YaBB: Yet another Bulletin Board                                            #
# Open-Source Community Software for Webmasters                               # # Open-Source Community Software for Webmasters                               #
# Version:        YaBB 2.5.2                                                  # # Version:        YaBB 2.6.12                                                 #
# Packaged:       October 21, 2012                                            # # Packaged:       January 5, 2016                                             #
# Distributed by: http://www.yabbforum.com                                    # # Distributed by: http://www.yabbforum.com                                    #
# =========================================================================== # # =========================================================================== #
# Copyright (c) 2000-2012 YaBB (www.yabbforum.com) - All Rights Reserved.     # # Copyright (c) 2000-2016 YaBB (www.yabbforum.com) - All Rights Reserved.     #
# Software by:  The YaBB Development Team                                     # # Software by:  The YaBB Development Team                                     #
#               with assistance from the YaBB community.                      # #               with assistance from the YaBB community.                      #
############################################################################### ###############################################################################
  our $VERSION = '2.6.12';
   
$searchplver = 'YaBB 2.5.2 $Revision: 1.0 $'; $searchpmver = 'YaBB 2.6.12 $Revision: 1710 $';
if ($action eq 'detailedversion') { return 1; } if ( $action eq 'detailedversion' ) { return 1; }
   
&LoadLanguage('Search');  LoadLanguage('Search'); 
  get_micon();
if($FORM{'searchboards'} =~ /\A\!/) {  get_template('Search'); 
   my($checklist, $catid, $curboard);  
   $checklist = '';  if ( $FORM{'searchboards'} =~ /\A\!/xsm ) { 
   unless ($mloaded == 1) { require "$boardsdir/forum.master"; }     my $checklist = q{}; 
   foreach $catid (@categoryorder) {     get_forum_master(); 
       my($boardlist, @bdlist, $curboard);     foreach my $catid (@categoryorder) { 
#       if ($catselect ne $catid && $catselect) { next; }         (@bdlist) = split /\,/xsm, $cat{$catid}; 
       $boardlist = $cat{$catid};         my ( $catname, $catperms, $catallowcol ) = split /\|/xsm, 
       @bdlist = split(/\,/, $boardlist);           $catinfo{$catid}; 
       my ($catname, $catperms, $catallowcol) = split(/\|/, $catinfo{$catid});         my $access = CatAccess($catperms); 
       my $access = &CatAccess($catperms);         if ( !$access ) { next; } 
       if (!$access) { next; }  
       foreach $curboard (@bdlist) {         recursive_search(@bdlist); 
           chomp $curboard;     } 
           $cat_boardcnt{$catid}++;  
           my ($boardname, $boardperms, $boardview) = split(/\|/, $board{$curboard});     sub recursive_search { 
           my $access = &AccessCheck($curboard, '', $boardperms);         my @x = @_; 
           if (!$iamadmin && $access ne 'granted') { next; }         foreach my $curboard (@x) { 
           $checklist .= qq~$curboard, ~;             chomp $curboard; 
       }  
   }             # don't add to count if it's a sub board 
   $checklist =~ s/, \Z//;             if ( !${ $uid . $curboard }{'parent'} ) { $cat_boardcnt{$catid}++; } 
   $FORM{'searchboards'} = $checklist;             my ( $boardname, $boardperms, $boardview ) = split /\|/xsm, 
               $board{$curboard};
             my $access = AccessCheck( $curboard, q{}, $boardperms );
             if ( !$iamadmin && $access ne 'granted' ) { next; }
             $checklist .= qq~$curboard, ~;
   
             if ( $subboard{$curboard} ) {
                 recursive_search( split /\|/xsm, $subboard{$curboard} );
             }
         }
         return;
     }
     $checklist =~ s/, \Z//sm;
     $FORM{'searchboards'} = $checklist;
} }
   
sub plushSearch1 { sub plushSearch1 {
   # generate error if admin has disabled search options  
   if ($maxsearchdisplay < 0) { &fatal_error("search_disabled"); }     # generate error if admin has disabled search options 
   my (@categories, $curcat, %catname, %cataccess, %catboards, $openmemgr, @membergroups, $tmpa, %openmemgr, $curboard, @threads, @boardinfo, $counter);     if ( $maxsearchdisplay < 0 ) { fatal_error('search_disabled'); } 
     if ( $advsearchaccess ne 'granted' ) { fatal_error('no_access'); }
   &LoadCensorList;     my ( 
   if (!$iamguest) {         @categories, $curcat,   %catname, %cataccess, @membergroups, 
       &Collapse_Load;         %openmemgr,  $curboard, @threads, @boardinfo, $counter 
   }     ); 
   $yymain .= qq~  
<script language="JavaScript1.2" src="$yyhtml_root/ubbc.js" type="text/javascript"></script>     LoadCensorList(); 
<script language="JavaScript1.2" type="text/javascript">     if ( !$iamguest ) { 
<!--         Collapse_Load(); 
     }
     $yymain .= qq~
  <script type="text/javascript">
function removeUser() { function removeUser() {
   if (document.getElementById('userspec').value && confirm("$searchselector_txt{'removeconfirm'}")) {    if (document.getElementById('userspec').value && confirm("$searchselector_txt{'removeconfirm'}")) {
       document.getElementById('userspec').value = "";        document.getElementById('userspec').value = "";
       document.getElementById('userspectext').value = "";        document.getElementById('userspectext').value = "";
       if(document.getElementById('searchme').checked) {        if(document.getElementById('searchme').checked) {
           document.getElementById('searchme').checked = false;            document.getElementById('searchme').checked = false;
           document.getElementById('userkind').disabled=false;            document.getElementById('userkind').disabled=false;
           document.getElementById('noguests').selected=true;            document.getElementById('noguests').selected=true;
       }        }
       document.getElementById('usrsel').style.display = 'inline';        document.getElementById('usrsel').style.display = 'inline';
       document.getElementById('usrrem').style.display = 'none';        document.getElementById('usrrem').style.display = 'none';
       document.getElementById('searchme').disabled = false;        document.getElementById('searchme').disabled = false;
   }    }
} }
   
function addUser() { function addUser() {
   window.open('$scripturl?action=imlist;sort=username;toid=userspec','','status=no,height=360,width=464,menubar=no,toolbar=no,top=50,left=50,scrollbars=no');    window.open('$scripturl?action=imlist;sort=username;toid=userspec','','status=no,height=360,width=464,menubar=no,toolbar=no,top=50,left=50,scrollbars=no');
} }
   
function searchMe(chelem) { function searchMe(chelem) {
   if(chelem.checked) {    if(chelem.checked) {
       document.getElementById('userspectext').value='${$uid.$username}{'realname'}';        document.getElementById('userspectext').value='${$uid.$username}{'realname'}';
       document.getElementById('userspec').value='$username';        document.getElementById('userspec').value='$username';
       document.getElementById('userkind').value='poster';        document.getElementById('userkind').value='poster';
       document.getElementById('poster').selected=true;        document.getElementById('poster').selected=true;
       document.getElementById('userkind').disabled=true;        document.getElementById('userkind').disabled=true;
   } else {    } else {
       document.getElementById('userspectext').value='';        document.getElementById('userspectext').value='';
       document.getElementById('userspec').value='';        document.getElementById('userspec').value='';
       document.getElementById('userkind').value='noguests';        document.getElementById('userkind').value='noguests';
       document.getElementById('noguests').selected=true;        document.getElementById('noguests').selected=true;
       document.getElementById('userkind').disabled=false;        document.getElementById('userkind').disabled=false;
   }    }
} }
//-->  
</script> </script>
   
<form action="$scripturl?action=search2" method="post" name="searchform" onsubmit="return CheckSearchFields();">  <form action="$scripturl?action=search2" method="post" name="searchform" onsubmit="return CheckSearchFields();" accept-charset="$yymycharset">~; 
<table width="100%" align="center" border="0" cellpadding="4" cellspacing="1" class="bordercolor" >     $yymain .= $mysearch_template . ( 
   <colgroup>         $enable_ubbc 
       <col width="45%" />        ? qq~<br />
       <col width="55%" />             <input type="checkbox" name="searchyabbtags" id="searchyabbtags" value="1" /><label for="searchyabbtags">$search_txt{'searchyabbtags'}</label>~ 
   </colgroup>         : q{} 
   <tr>     ); 
       <td align="left" colspan="2" class="catbg">  
           <img src="$imagesdir/search.gif" alt="" /> <span class="text1"><b>$search_txt{'183'}</b></span>     if (   !$ML_Allowed 
       </td>         || ( $ML_Allowed == 1 && !$iamguest ) 
   </tr>         || ( $ML_Allowed == 2 && $staff ) 
   <tr>         || ( $ML_Allowed == 3 && ( $iamadmin || $iamgmod ) ) 
       <td class="windowbg" align="right" valign="top"><label for="search"><b>$search_txt{'582'}:</b></label></td>         || ( $ML_Allowed == 4 && ( $iamadmin || $iamgmod || $iamfmod ) ) ) 
       <td class="windowbg2">     { 
           <div style="padding: 2px;">         $yymain .= $mysearch_template2; 
           <input type="text" size="30" name="search" id="search" /> <label for="searchtype">$search_txt{'582'}</label>         if ( !$iamguest ) { 
           <select name="searchtype" id="searchtype">             $yymain .= 
           <option value="allwords" selected="selected">$search_txt{'343'}</option>  qq~<input type="checkbox" name="searchme" id="searchme" style="margin: 0px; border: 0px; padding: 0px; vertical-align: middle;" onclick="searchMe(this);" /> <label for="searchme" class="lille">$search_txt{'searchme'}</label><br />~; 
           <option value="anywords">$search_txt{'344'}</option>         } 
           <option value="asphrase">$search_txt{'345'}</option>         else { 
           <option value="aspartial">$search_txt{'345a'}</option>             $yymain .= 
           </select><br />  q~<input type="checkbox" name="searchme" id="searchme" style="visibility: hidden;" /><br />~; 
           <input type="checkbox" name="casesensitiv" id="casesensitiv" value="1" /><label for="casesensitiv">$search_txt{'casesensitiv'}</label>~ . ($enable_ubbc ? qq~<br />         } 
           <input type="checkbox" name="searchyabbtags" id="searchyabbtags" value="1" /><label for="searchyabbtags">$search_txt{'searchyabbtags'}</label>~ : '') . qq~         $yymain .= $mysearch_template3; 
           </div>~;     } 
     else {
   if (!$ML_Allowed || ($ML_Allowed == 1 && !$iamguest) || ($ML_Allowed == 2 && $staff) || ($ML_Allowed == 3 && ($iamadmin || $iamgmod))) {         $yymain .= q~<input type="hidden" name="userkind" value="any" />~; 
       $yymain .= qq~     } 
       </td>  
   </tr>     $yymain .= $mysearch_template4; 
   <tr>  
       <td class="windowbg" align="right" valign="top">     $allselected = 0; 
           <b>$search_txt{'583'}:</b>     $isselected  = 0; 
       </td>     $boardscheck = q{}; 
       <td class="windowbg2">     get_forum_master(); 
           <div style="padding: 4px 0px 4px 0px;">  
           <input type="text" size="30" style="width: 220px; padding-left: 3px;" name="userspectext" id="userspectext" value="" readonly="readonly" /><input type="button" class="button" id="usrsel" style="border-left: 0px; display: inline;" value="$searchselector_txt{'select'}" onclick="javascript:addUser();" /><input type="button" class="button" id="usrrem" style="border-left: 0px; display: none;" value="$searchselector_txt{'remove'}" onclick="javascript:removeUser();" />     foreach my $catid (@categoryorder) { 
           ~;         $boardlist = $cat{$catid}; 
           if(!$iamguest) {         (@bdlist) = split /\,/xsm, $boardlist; 
               $yymain .= qq~<input type="checkbox" name="searchme" id="searchme" style="margin: 0px; border: 0px; padding: 0px; vertical-align: middle;" onclick="searchMe(this);" /> <label for="searchme" class="lille">$search_txt{'searchme'}</label><br />~;         ( $catname, $catperms ) = split /\|/xsm, $catinfo{"$catid"}; 
           } else {         $cataccess = CatAccess($catperms); 
               $yymain .= qq~<input type="checkbox" name="searchme" id="searchme" style="visibility: hidden;" /><br />~;         if ( !$cataccess ) { next; } 
           }  
           $yymain .= qq~         foreach my $curboard (@bdlist) { 
           <input type="hidden" size="30" name="userspec" id="userspec" value="" />             ( $boardname, $boardperms, $boardview ) = split /\|/xsm, 
           </div>               $board{"$curboard"}; 
           <div style="padding: 4px 0px 4px 0px;">             ToChars($boardname); 
           <select name="userkind" id="userkind">             my $access = AccessCheck( $curboard, q{}, $boardperms ); 
               <option value="any">$search_txt{'577'}</option>             if ( !$iamadmin && $access ne 'granted' ) { next; } 
               <option value="starter">$search_txt{'186'}</option>  
               <option id="poster" value="poster">$search_txt{'187'}</option>             if ( ${ $uid . $curboard }{'brdpasswr'} ) { 
               <option id="noguests" value="noguests" selected="selected">$search_txt{'346'}</option>                 my $bdmods = ${ $uid . $curboard }{'mods'}; 
               <option value="onlyguests">$search_txt{'572'}</option>                 $bdmods =~ s/\, /\,/gsm; 
           </select>                 $bdmods =~ s/\ /\,/gsm; 
           </div> ~;                 my %moderators = (); 
                 my $pswiammod  = 0;
   } else {                foreach my $curuser ( split /\,/xsm, $bdmods ) {
       $yymain .= qq~<input type="hidden" name="userkind" value="any" />~;                     if ( $username eq $curuser ) { $pswiammod = 1; } 
   }                }
                 my $bdmodgroups = ${ $uid . $curboard }{'modgroups'};
   $yymain .= qq~                 $bdmodgroups =~ s/\, /\,/gsm; 
       </td>                 my %moderatorgroups = (); 
   </tr>                 foreach my $curgroup ( split /\,/xsm, $bdmodgroups ) { 
   <tr>                     if ( ${ $uid . $username }{'position'} eq $curgroup ) { 
       <td class="windowbg" align="right" valign="top"><b>$search_txt{'189'}:</b><br /><span class="small">$search_txt{'190'}</span></td>                         $pswiammod = 1; 
       <td class="windowbg2" >~;                     } 
   $allselected = 0;                     foreach my $memberaddgroups ( split /\, /sm, 
   $isselected  = 0;                         ${ $uid . $username }{'addgroups'} ) 
   $boardscheck = "";                     { 
   unless ($mloaded == 1) { require "$boardsdir/forum.master"; }                         chomp $memberaddgroups; 
                         if ( $memberaddgroups eq $curgroup ) {
   foreach $catid (@categoryorder) {                             $pswiammod = 1; 
       $boardlist = $cat{$catid};                             last; 
       (@bdlist) = split(/\,/, $boardlist);                         } 
       ($catname, $catperms) = split(/\|/, $catinfo{"$catid"});                     } 
       $cataccess = &CatAccess($catperms);                 } 
       if (!$cataccess) { next; }                 my $cookiename = "$cookiepassword$curboard$username"; 
                 my $crypass    = ${ $uid . $curboard }{'brdpassw'};
       foreach $curboard (@bdlist) {                 if (   !$iamadmin 
           ($boardname, $boardperms, $boardview) = split(/\|/, $board{"$curboard"});                     && !$iamgmod 
           &ToChars($boardname);                     && !$pswiammod 
           my $access = &AccessCheck($curboard, '', $boardperms);                     && $yyCookies{$cookiename} ne $crypass ) 
           if (!$iamadmin && $access ne "granted") { next; }                 { 
                     next;
           # Checks to see if category is expanded or collapsed                 } 
           if ($username ne "Guest") {             } 
               if ($catcol{$catid}) {  
                   $selected = qq~selected="selected"~;             # Checks to see if category is expanded or collapsed 
                   $isselected++;             if ( $username ne 'Guest' ) { 
               } else {                if ( $catcol{$catid} ) {
                   $selected = "";                     $selected = q~selected="selected"~; 
               }                     $isselected++; 
           } else {                 } 
               $selected = qq~selected="selected"~;                 else { 
               $isselected++;                     $selected = q{}; 
           }                }
           $allselected++;             } 
           $checklist .= qq~<option value="$curboard" $selected>$boardname</option>\n          ~;             else { 
       }                 $selected = q~selected="selected"~; 
   }                 $isselected++; 
   if ($isselected == $allselected) { $boardscheck = qq~ checked="checked"~; }            }
   $yymain .= qq~             $allselected++; 
           <select multiple="multiple" name="searchboards" size="5" onchange="selectnum();">             $checklist .= 
           $checklist  qq~<option value="$curboard" $selected>$boardname</option>\n          ~; 
           </select>             if ( !$subboard{$curboard} ) { next; } 
           <input type="checkbox" name="srchAll" id="srchAll"$boardscheck onclick="if (this.checked) searchAll(true); else searchAll(false);" /> <label for="srchAll">$search_txt{'737'}</label>             my $indent; 
           <script language="JavaScript1.2" type="text/javascript">  
           <!-- //             *get_subboards = sub { 
           function searchAll(_v) {                 my @x = @_; 
               for(var i=0;i<document.searchform.searchboards.length;i++)                 $indent += 2; 
               document.searchform.searchboards[i].selected=_v;                 foreach my $childbd (@x) { 
           }                     my $dash; 
                     if ( $indent > 0 ) { $dash = q{-}; }
           function selectnum() {                     ( $chldboardname, undef, undef ) = split /\|/xsm, 
               document.searchform.srchAll.checked = true;                       $board{"$childbd"}; 
               for(var i=0;i<document.searchform.searchboards.length;i++) {                     ToChars($chldboardname); 
                   if (! document.searchform.searchboards[i].selected) { document.searchform.srchAll.checked = false; }                     $checklist .= 
               }                         qq~<option value="$childbd" $selected>~ 
           }                       . ( '&nbsp;' x $indent ) 
           // -->                       . ( $dash x ( $indent / 2 ) ) 
           </script>                       . qq~ $chldboardname</option>\n          ~; 
       </td>                     if ( $subboard{$childbd} ) { 
   </tr>                         get_subboards( split /\|/xsm, $subboard{$childbd} ); 
   <tr>                     } 
       <td align="right" class="windowbg"><b>$search_txt{'573'}:</b></td>                 } 
       <td class="windowbg2">                 $indent -= 2; 
           <input type="checkbox" name="subfield" id="subfield" value="on" checked="checked" /><label for="subfield"> $search_txt{'70'}</label> &nbsp;                 return; 
           <input type="checkbox" name="msgfield" id="msgfield" value="on" checked="checked" /><label for="msgfield"> $search_txt{'72'}</label>             }; 
       </td>             get_subboards( split /\|/xsm, $subboard{$curboard} ); 
   </tr>         } 
   <tr>     } 
       <td align="right" class="windowbg"><label for="age"><b>$search_txt{'1'}</b></label></td>     if ( $isselected == $allselected ) { 
       <td class="windowbg2">         $boardscheck = q~ checked="checked"~; 
           <select name="age" id="age">     } 
               <option value="7" selected="selected">$search_txt{'2'}</option>     if ( $iamadmin || $iamfmod || $iamgmod && $gmod_access2{'ipban2'} eq 'on' ) 
               <option value="31">$search_txt{'3'}</option>     { 
               <option value="92">$search_txt{'4'}</option>         $search_ip = 
               <option value="365">$search_txt{'5'}</option>  qq~<input type="checkbox" name="search_ip" id="search_ip" value="on" /><label for="search_ip"> $search_txt{'73'}</label>~; 
               <option value="0">$search_txt{'6'}</option>     } 
           </select>  
       </td>     $yymain .= qq~ 
   </tr>             <select multiple="multiple" name="searchboards" size="5" onchange="selectnum();"> 
   <tr>             $checklist 
       <td align="right" class="windowbg"><label for="numberreturned"><b>$search_txt{'191'}</b><br /><span class="small">$search_txt{'191b'}</span></label></td>             </select> 
       <td class="windowbg2"><input type="text" size="5" name="numberreturned" id="numberreturned" maxlength="5" value="$maxsearchdisplay" /></td>             <input type="checkbox" name="srchAll" id="srchAll"$boardscheck onclick="if (this.checked) searchAll(true); else searchAll(false);" /> <label for="srchAll">$search_txt{'737'}</label> 
   </tr>             <script type="text/javascript"> 
   <tr>             function searchAll(_v) { 
       <td align="right" class="windowbg"><label for="oneperthread"><b>$search_txt{'191a'}</b></label></td>                 for(var i=0;i<document.searchform.searchboards.length;i++) 
       <td class="windowbg2"><input type="checkbox" name="oneperthread" id="oneperthread" value="1"/></td>                 document.searchform.searchboards[i].selected=_v; 
   </tr>             } 
   <tr>  
       <td class="catbg" colspan="2" height="50" valign="middle" align="center">             function selectnum() { 
           <input type="submit" name="submit" value="$search_txt{'182'}" class="button" />                 document.searchform.srchAll.checked = true; 
       </td>                 for(var i=0;i<document.searchform.searchboards.length;i++) { 
   </tr>                     if (! document.searchform.searchboards[i].selected) { document.searchform.srchAll.checked = false; } 
</table>                 } 
</form>             } 
<script type="text/javascript" language="JavaScript">             </script>~; 
<!--    $yymain .= $mysearch_template5; 
   document.searchform.search.focus();     $yymain =~ s/{yabb maxsearchdisplay}/$maxsearchdisplay/sm; 
     $yymain =~ s/{yabb search_ip}/$search_ip/sm;
   function CheckSearchFields() {  
       if (document.searchform.numberreturned.value > $maxsearchdisplay) {     $yymain .= qq~ 
           alert("$search_txt{'191x'}");  <script type="text/javascript"> 
           document.searchform.numberreturned.focus();     document.searchform.search.focus(); 
           return false;     function CheckSearchFields() { 
       }         if (document.searchform.numberreturned.value > $maxsearchdisplay) { 
       return true;             alert("$search_txt{'191x'}"); 
   }             document.searchform.numberreturned.focus(); 
//-->             return false; 
         }
         return true;
     }
</script> </script>
~; ~;
   
   $yytitle = $search_txt{'183'};    $yytitle      = $search_txt{'183'};
   $yynavigation = qq~&rsaquo; $search_txt{'182'}~;    $yynavigation = qq~&rsaquo; $search_txt{'182'}~;
   &template;     template(); 
     return;
} }
   
sub plushSearch2 { sub plushSearch2 {
   # generate error if admin has disabled search options  
   if ($maxsearchdisplay < 0) { &fatal_error("search_disabled"); }  
   &spam_protection;  
   
   my $maxage = $FORM{'age'} || (int(($date - &stringtotime($forumstart)) / 86400) + 1);  
   
   my $display = $FORM{'numberreturned'} || $maxsearchdisplay;  
   if ($maxage  =~ /\D/) { &fatal_error("only_numbers_allowed"); }  
   if ($display =~ /\D/) { &fatal_error("only_numbers_allowed"); }  
   
   # restrict flooding using form abuse  
   if ($display > $maxsearchdisplay) { &fatal_error("result_too_high"); }  
   
   my $userkind = $FORM{'userkind'};  
   my $userspec = $FORM{'userspec'};  
   
   if ($userkind eq 'starter') { $userkind = 1; }  
   elsif ($userkind eq 'poster') { $userkind = 2; }  
   elsif ($userkind eq 'noguests') { $userkind = 3; }  
   elsif ($userkind eq 'onlyguests') { $userkind = 4; }  
   else { $userkind = 0; $userspec = ''; }  
   if ($userspec =~ m~/~)  { &fatal_error("no_user_slash"); }  
   if ($userspec =~ m~\\~) { &fatal_error("no_user_backslash"); }  
   $userspec =~ s/\A\s+//;  
   $userspec =~ s/\s+\Z//;  
   $userspec =~ s/[^0-9A-Za-z#%+,-\.@^_]//g;  
   if ($do_scramble_id) {  
       $userspec =~ s/ //g;  
       $userspec = &decloak($userspec);  
   }  
   if ($FORM{'searchme'} eq 'on' && !$iamguest) {  
       $userkind = 2;  
       $userspec = $username;  
   }  
   $searchtype = $FORM{'searchtype'};  
   my $search  = $FORM{'search'};  
   &FromChars($search);  
   my $one_per_thread = $FORM{'oneperthread'} || 0;  
   if ($searchtype eq 'anywords') { $searchtype = 2; }  
   elsif ($searchtype eq 'asphrase') { $searchtype = 3; }  
   elsif ($searchtype eq 'aspartial') { $searchtype = 4; }  
   else { $searchtype = 1; }  
   $search =~ s/\A\s+//;  
   $search =~ s/\s+\Z//;  
   $search =~ s/\s+/ /g if $searchtype != 3;  
   if ($search eq "" || $search eq " ") { &fatal_error("no_search"); }  
   if ($search =~ m~/~)  { &fatal_error("no_search_slashes"); }  
   if ($search =~ m~\\~) { &fatal_error("no_search_slashes"); }  
   my $searchsubject = $FORM{'subfield'} eq 'on';  
   my $searchmessage = $FORM{'msgfield'} eq 'on';  
   &ToHTML($search);  
   $search =~ s/\t/ \&nbsp; \&nbsp; \&nbsp;/g;  
   $search =~ s/\cM//g;  
   $search =~ s/\n/<br \/>/g;  
   if ($searchtype != 3) { @search = split(/\s+/, $search); }  
   else { @search = ($search); }  
   my $case = $FORM{'casesensitiv'};  
   
   my ($curboard, @threads, $curthread, $tnum, $tsub, $tname, $temail, $tdate, $treplies, $tusername, $ticon, $tstate, @messages, $curpost, $mname, $memail, $mdate, $musername, $micon, $mattach, $mip, $ns, $subfound, $msgfound, $numfound, %data, $i, $board, $curcat, @categories, %catid, %catname, %cataccess, %openmemgr, @membergroups, %cats, @boardinfo, %boardinfo, @boards, $counter, $msgnum);  
   my $maxtime = $date + (3600 * ${$uid.$username}{'timeoffset'}) - ($maxage * 86400);  
   my $oldestfound = 9999999999;  
   
   unless ($mloaded == 1) { require "$boardsdir/forum.master"; }  
   foreach $catid (@categoryorder) {  
       $boardlist = $cat{$catid};  
       (@bdlist) = split(/\,/, $boardlist);  
       ($catname, $catperms) = split(/\|/, $catinfo{$catid});  
       $cataccess = &CatAccess($catperms);  
       if (!$cataccess) { next; }  
   
       foreach $cboard (@bdlist) {  
           ($bname, $bperms, $bview) = split(/\|/, $board{$cboard});  
           $catid{$cboard} = $catid;  
           $catname{$cboard} = $catname;  
       }  
   }  
   
   if ($enable_ubbc) { require "$sourcedir/YaBBC.pl"; }  
   
   @boards = split(/\,\ /, $FORM{'searchboards'});  
   boardcheck: foreach $curboard (@boards) {  
       ($boardname{$curboard}, $boardperms, $boardview) = split(/\|/, $board{$curboard});  
   
       my $access = &AccessCheck($curboard, '', $boardperms);  
       if (!$iamadmin && $access ne "granted") { next; }  
   
       fopen(FILE, "$boardsdir/$curboard.txt") || next;  
       @threads = <FILE>;  
       fclose(FILE);  
   
       threadcheck: foreach $curthread (@threads) {  
           chomp $curthread;  
   
           ($tnum, $tsub, $tname, $temail, $tdate, $treplies, $tusername, $ticon, $tstate) = split(/\|/, $curthread);  
   
           if ($tdate < $maxtime || $tstate =~ /m/i || (!$iamadmin && !$iamgmod && $tstate =~ /h/i)) { next threadcheck; }  
           if ($userkind == 1) {  
               if ($tusername eq 'Guest') {  
                   if ($tname !~ m~\A\Q$userspec\E\Z~i) { next threadcheck; }  
               } else {  
                   if ($tusername !~ m~\A\Q$userspec\E\Z~i) { next threadcheck; }  
               }  
           }  
   
           fopen(FILE, "$datadir/$tnum.txt") || next;  
           @messages = <FILE>;  
           fclose(FILE);  
   
           postcheck: for ($msgnum = @messages; $msgnum >= 0; $msgnum--) {  
               $curpost = $messages[$msgnum];  
               chomp $curpost;  
   
               my ($msub, $mname, $memail, $mdate, $musername, $micon, $mattach, $mip, $savedmessage, $ns) = split(/\|/, $curpost);  
   
               ## if either max to display or outside of filter, next  
               if ($mdate < $maxtime || ($numfound >= $display && $mdate <= $oldestfound)) { next postcheck; }  
   
               &ToChars($msub);  
               ($msub, undef) = &Split_Splice_Move($msub,0);  
   
               &ToChars($savedmessage);  
               $message = $savedmessage;  
               if ($FORM{'searchyabbtags'} && $message =~ /\[\w[^\[]*?\]/) {  
                   &wrap;  
                   ($message, undef) = &Split_Splice_Move($message,$tnum);  
                   if ($enable_ubbc) { &DoUBBC; }  
                   &wrap2;  
                   $savedmessage = $message;  
                   $message =~ s/<.+?>//g;  
               } elsif (!$FORM{'searchyabbtags'}) {  
                   $message =~ s/\[\w[^\[]*?\]//g;  
               }  
   
               if ($musername eq 'Guest') {  
                   if ($userkind == 3 || ($userkind == 2 && $mname !~ m~\A\Q$userspec\E\Z~i) ) { next postcheck; }  
               } else {  
                   if ($userkind == 4 || ($userkind == 2 && $musername !~ m~\A\Q$userspec\E\Z~i) ) { next postcheck; }  
               }  
   
               if ($case) {  
                   if ($searchsubject) {  
                       if ($searchtype == 2 || $searchtype == 4) {  
                           $subfound = 0;  
                           foreach (@search) {  
                               if ($searchtype == 4 && $msub =~ m~\Q$_\E~) { $subfound = 1; last; }  
                               elsif ($msub =~ m~(^|\W|_)\Q$_\E(?=$|\W|_)~) { $subfound = 1; last; }  
                           }  
                       } else {  
                           $subfound = 1;  
                           foreach (@search) {  
                               if ($msub !~ m~(^|\W|_)\Q$_\E(?=$|\W|_)~) { $subfound = 0; last; }  
                           }  
                       }  
                   }  
                   if ($searchmessage && !$subfound) {  
                       if ($searchtype == 2 || $searchtype == 4) {  
                           $msgfound = 0;  
                           foreach (@search) {  
                               if ($searchtype == 4 && $message =~ m~\Q$_\E~) { $msgfound = 1; last; }  
                               elsif ($message =~ m~(^|\W|_)\Q$_\E(?=$|\W|_)~) { $msgfound = 1; last; }  
                           }  
                       } else {  
                           $msgfound = 1;  
                           foreach (@search) {  
                               if ($message !~ m~(^|\W|_)\Q$_\E(?=$|\W|_)~) { $msgfound = 0; last; }  
                           }  
                       }  
                   }  
               } else {  
                   if ($searchsubject) {  
                       if ($searchtype == 2 || $searchtype == 4) {  
                           $subfound = 0;  
                           foreach (@search) {  
                               if ($searchtype == 4 && $msub =~ m~\Q$_\E~i) { $subfound = 1; last; }  
                               elsif ($msub =~ m~(^|\W|_)\Q$_\E(?=$|\W|_)~i) { $subfound = 1; last; }  
                           }  
                       } else {  
                           $subfound = 1;  
                           foreach (@search) {  
                               if ($msub !~ m~(^|\W|_)\Q$_\E(?=$|\W|_)~i) { $subfound = 0; last; }  
                           }  
                       }  
                   }  
                   if ($searchmessage && !$subfound) {  
                       if ($searchtype == 2 || $searchtype == 4) {  
                           $msgfound = 0;  
                           foreach (@search) {  
                               if ($searchtype == 4 && $message =~ m~\Q$_\E~i) { $msgfound = 1; last; }  
                               elsif ($message =~ m~(^|\W|_)\Q$_\E(?=$|\W|_)~i) { $msgfound = 1; last; }  
                           }  
                       } else {  
                           $msgfound = 1;  
                           foreach (@search) {  
                               if ($message !~ m~(^|\W|_)\Q$_\E(?=$|\W|_)~i) { $msgfound = 0; last; }  
                           }  
                       }  
                   }  
               }  
   
               ## blank? try next = else => build list from found mess/sub  
               unless ($msgfound || $subfound) { next postcheck; }  
   
               $data{$mdate} = [$curboard, $tnum, $msgnum, $tusername, $tname, $msub, $mname, $memail, $mdate, $musername, $micon, $mattach, $mip, $savedmessage, $ns, $tstate];  
               if ($mdate < $oldestfound) { $oldestfound = $mdate; }  
               $numfound++;  
               if ($one_per_thread) { last postcheck; }  
           }  
       }  
   }  
   
   @messages = sort { $b <=> $a } keys %data;  
   if (@messages) {  
       if (@messages > $display) { $#messages = $display - 1; }  
       &LoadCensorList;  
   } else {  
       $yymain .= qq~<hr class="hr" /><b>$search_txt{'170'}<br /><a href="javascript:history.go(-1)">$search_txt{'171'}</a></b><hr class="hr" />~;  
   }  
   $search = &Censor($search);  
   
   # Search for censored or uncencored search string and remove duplicate words  
   my @tmpsearch;  
   if ($searchtype == 3) { @tmpsearch = ($search); }  
   else { @tmpsearch = split(/\s+/, $search); }  
   push @tmpsearch, @search;  
   undef %found;  
   @search = grep(!$found{$_}++, @tmpsearch);  
   
   for ($i = 0; $i < @messages; $i++) {  
       ($board, $tnum, $msgnum, $tusername, $tname, $msub, $mname, $memail, $mdate, $musername, $micon, $mattach, $mip, $message, $ns, $tstate) = @{ $data{ $messages[$i] } };  
   
       $tname = &addMemberLink($tusername,$tname,$tnum);  
       $mname = &addMemberLink($musername,$mname,$mdate);  
   
       $mdate = &timeformat($mdate);  
   
       if (!$FORM{'searchyabbtags'}) {  
           &wrap;  
           ($message, undef) = &Split_Splice_Move($message,$tnum);  
           if ($enable_ubbc) { &DoUBBC; }  
           &wrap2;  
       }  
   
       $message = &Censor($message);  
       $msub    = &Censor($msub);  
   
       &Highlight(\$msub,\$message,\@search,$case);  
   
       &ToChars($catname{$board});  
       &ToChars($boardname{$board});  
   
       ++$counter;  
   
       $yymain .= qq~  
<table border="0" width="100%" cellspacing="1" class="bordercolor" style="table-layout: fixed;">  
   <tr>  
       <td align="center" width="5%" class="titlebg">$counter</td>  
       <td align="left" width="95%" class="titlebg">&nbsp;<a href="$scripturl?catselect=$catid{$board}"><u>$catname{$board}</u></a> / <a href="$scripturl?board=$board"><u>$boardname{$board}</u></a> / <a href="$scripturl?num=$tnum/$msgnum#$msgnum"><u>$msub</u></a><br />  
       &nbsp;<span class="small">$search_txt{'30'}: $mdate</span>&nbsp;</td>  
   </tr>  
   <tr>  
       <td colspan="2">  
           <table border="0" width="100%" class="catbg">  
               <tr>  
                   <td align="left">$search_txt{'109'} $tname | $search_txt{'105'} $search_txt{'525'} $mname</td>  
                   <td align="right">&nbsp;~;  
   
       if ($tstate != 1 && (!$iamguest || ($iamguest && $enable_guestposting))) {  
           my $notify = '';  
           if (!$iamguest) {  
               if (${$uid.$username}{'thread_notifications'} =~ /\b$tnum\b/) {  
                   $notify = qq~$menusep<a href="$scripturl?action=notify3;oldnotify=1;num=$tnum/$msgnum#$msgnum">$img{'del_notify'}</a>~;  
               } else {  
                   $notify = qq~$menusep<a href="$scripturl?action=notify2;oldnotify=1;num=$tnum/$msgnum#$msgnum">$img{'add_notify'}</a>~;  
               }  
           }  
           $yymain .= qq~<a href="$scripturl?board=$board;action=post;num=$tnum/$msgnum#$msgnum;title=PostReply">$img{'reply'}</a>$menusep<a href="$scripturl?board=$board;action=post;num=$tnum;quote=$msgnum;title=PostReply">$img{'recentquote'}</a>$notify &nbsp;~;  
       }  
   
       $yymain .= qq~  
                   </td>  
               </tr>  
           </table>  
       </td>  
   </tr>  
   <tr>  
       <td align="left" height="80" colspan="2" class="windowbg2" valign="top"><div class="message" style="float: left; width: 99%; overflow: auto;">$message</div></td>  
   </tr>  
</table><br />~;  
   }  
   
   $yymain .= qq~     # generate error if admin has disabled search options 
     if ( $maxsearchdisplay < 0 ) { fatal_error('search_disabled'); }
     if ( $advsearchaccess ne 'granted' && $qcksearchaccess ne 'granted' ) {
         fatal_error('no_access');
     }
     spam_protection();
   
     my $maxage = $FORM{'age'}
       || ( int( ( $date - stringtotime($forumstart) ) / 86400 ) + 1 );
   
     my $display = $FORM{'numberreturned'} || $maxsearchdisplay;
     if ( $maxage  =~ /\D/xsm ) { fatal_error('only_numbers_allowed'); }
     if ( $display =~ /\D/xsm ) { fatal_error('only_numbers_allowed'); }
   
     # restrict flooding using form abuse
     if ( $display > $maxsearchdisplay ) { fatal_error('result_too_high'); }
   
     my $userkind = $FORM{'userkind'};
     my $userspec = $FORM{'userspec'};
   
     if    ( $userkind eq 'starter' )    { $userkind = 1; }
     elsif ( $userkind eq 'poster' )     { $userkind = 2; }
     elsif ( $userkind eq 'noguests' )   { $userkind = 3; }
     elsif ( $userkind eq 'onlyguests' ) { $userkind = 4; }
     else                                { $userkind = 0; $userspec = q{}; }
   
     if ( $userspec =~ m{/}xsm )  { fatal_error('no_user_slash'); }
     if ( $userspec =~ m{\\}xsm ) { fatal_error('no_user_backslash'); }
     $userspec =~ s/\A\s+//xsm;
     $userspec =~ s/\s+\Z//xsm;
     $userspec =~ s/[^0-9A-Za-z#%+,-\.@^_]//gxsm;
     if ($do_scramble_id) {
         $userspec =~ s/ //gsm;
         $userspec = decloak($userspec);
     }
     if ( $FORM{'searchme'} eq 'on' && !$iamguest ) {
         $userkind = 2;
         $userspec = $username;
     }
     $searchtype = $FORM{'searchtype'};
     my $search = $FORM{'search'};
     FromChars($search);
     my $one_per_thread = $FORM{'oneperthread'} || 0;
     if    ( $searchtype eq 'anywords' )  { $searchtype = 2; }
     elsif ( $searchtype eq 'asphrase' )  { $searchtype = 3; }
     elsif ( $searchtype eq 'aspartial' ) { $searchtype = 4; }
     else                                 { $searchtype = 1; }
     $search =~ s/\A\s+//xsm;
     $search =~ s/\s+\Z//xsm;
     if ( $searchtype != 3 ) { $search =~ s/\s+/ /gxsm; }
     if ( $search eq q{} || $search eq q{ } ) { fatal_error('no_search'); }
     if ( $search =~ m{/}xsm )  { fatal_error('no_search_slashes'); }
     if ( $search =~ m{\\}xsm ) { fatal_error('no_search_slashes'); }
     my $searchsubject = $FORM{'subfield'} eq 'on';
     my $searchmessage = $FORM{'msgfield'} eq 'on';
     if ( $FORM{'search_ip'} eq 'on' ) { $search_ip = $FORM{'search'}; }
     ToHTML($search);
     $search =~ s/\t/ \&nbsp; \&nbsp; \&nbsp;/gxsm;
     $search =~ s/\cM//gxsm;
     $search =~ s/\n/<br \/>/gxsm;
     if ( $searchtype != 3 ) { @search = split /\s+/xsm, $search; }
     else                    { @search = ($search); }
     my $case = $FORM{'casesensitiv'};
   
     my (
         $curboard,  @threads,      $curthread, $tnum,      $tsub,
         $tname,     $temail,       $tdate,     $treplies,  $tusername,
         $ticon,     $tstate,       @messages,  $curpost,   $subfound,
         $msgfound,  $numfound,     %data,      $i,         $board,
         $curcat,    @categories,   %catid,     %catname,   %cataccess,
         %openmemgr, @membergroups, %cats,      @boardinfo, %boardinfo,
         @boards,    $counter,      $msgnum
     );
     my $maxtime =
       $date +
       ( 3600 * ${ $uid . $username }{'timeoffset'} ) -
       ( $maxage * 86400 );
     my $oldestfound = 9999999999;
   
     get_forum_master();
     foreach my $catid (@categoryorder) {
         $boardlist = $cat{$catid};
         (@bdlist) = split /\,/xsm, $boardlist;
         ( $catname, $catperms ) = split /\|/xsm, $catinfo{$catid};
         $cataccess = CatAccess($catperms);
         if ( !$cataccess ) { next; }
   
         foreach my $cboard (@bdlist) {
             ( $bname, $bperms, $bview ) = split /\|/xsm, $board{$cboard};
             $catid{$cboard}   = $catid;
             $catname{$cboard} = $catname;
         }
     }
   
     foreach my $cbdlist ( keys %subboard ) {
         foreach my $cboard ( split /\|/xsm, $subboard{$cbdlist} ) {
             my $catid = ${ $uid . $cboard }{'cat'};
             ( $catname, $catperms ) = split /\|/xsm, $catinfo{$catid};
             $cataccess = CatAccess($catperms);
             if ( !$cataccess ) { next; }
             $catid{$cboard}   = $catid;
             $catname{$cboard} = $catname;
         }
     }
     if ($enable_ubbc) { require Sources::YaBBC; }
   
     @boards = split /\,\ /xsm, $FORM{'searchboards'};
   BOARDCHECK: foreach my $curboard (@boards) {
         ( $boardname{$curboard}, $boardperms, $boardview ) = split /\|/xsm,
           $board{$curboard};
   
         my $access = AccessCheck( $curboard, q{}, $boardperms );
         if ( !$iamadmin && $access ne 'granted' ) { next; }
   
         if ( ${ $uid . $curboard }{'brdpasswr'} ) {
             my $bdmods = ${ $uid . $curboard }{'mods'};
             $bdmods =~ s/\, /\,/gsm;
             $bdmods =~ s/\ /\