\n" .
"Script Version: $version
\n" .
"Script Date: $date");
}
}
// Add a message to overwrite the
// default "no results found" message
$custom_msg = '';
// Fixes REQUEST_URI if they are running certain
// version of IIS
if(!isset($_SERVER['REQUEST_URI']))
{
if(isset($_SERVER['SCRIPT_NAME']))
{
$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'];
}
else
{
$_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF'];
}
if($_SERVER['QUERY_STRING'])
{
$_SERVER['REQUEST_URI'] .= '?'.$_SERVER['QUERY_STRING'];
}
}
// The location of the generated search file
$search_file = substr_replace(__FILE__, 'txt', -3);
// The location of the generated prefs file
$pref_file = substr_replace(__FILE__, 'xml', -3);
// Takes care of all of the users global weight preferences.
// The higher these numbers are set, the more the keywords that
// are found in a given page in a given section will weigh
// relative to the global weight of the page.
$weights = array();
// The global weight of the meta keys for a page
$weights['meta_keys_weight'] = 1;
// The global weight of the meta description for a page
$weights['meta_desc_weight'] = 1;
// The global weight of the user keys for a page
$weights['user_keys_weight'] = 1;
// The global weight of the users indiviual weight for a page
$weights['user_weight'] = 1;
// The global weight of the content for a page
$weights['content_weight'] = 1;
// The flexibility of the search. If you set this number higher,
// you get less, but more acurate results. If you set this number
// lower, you get more but less acurate results. If you set this
// number to a negative number, it will return all pages.
$search_flex = 1;
// The user-inputted search phrase
$query = stripslashes($_GET['q']);
// The current page of the search results
$page = (!isset($_GET['p']) || (int) $_GET['p'] < 1) ? 1 : (int) $_GET['p'];
// This class holds some general user inputted preferences for
// the look of the search page.
class Pref
{
// The html for the header
var $htmlheader;
// The html for the footer
var $htmlfooter;
// The name of the font to use
var $htmlfontname;
// The hex code for the background color
var $htmlbkcolor;
// The hex code for the text color
var $htmltextcolor;
// The hex code for the link color
var $htmllinkcolor;
// The hex code for the vlink color
var $htmlvlinkcolor;
// The font size to use
var $htmlfontsize;
// I'm not too sure about this one
var $fontbold;
// I'm not too sure about this one
var $fontitalic;
// The number of results per page
var $resultsperpage;
// The swf code
var $htmlswf;
// The date flag
var $htmldate;
// The def flag
var $htmldef;
// The rel flag
var $htmlrel;
// The default language
var $htmldeflanguage;
// The highlight color
var $htmlhighlight;
// The ad position
var $adpos;
// The ad html
var $adhtml;
// The font for the date
var $htmldatefontface;
// The font size for the date
var $htmldatefontsize;
// The font color for the date
var $htmldatefontcolor;
// The font style for the date
var $htmldatefontstyle;
// The font for the relevancy
var $htmlrelevancyfontface;
// The font size for the relevancy
var $htmlrelevancyfontsize;
// The font color for the relevancy
var $htmlrelevancyfontcolor;
// The font style for the relevancy
var $htmlrelevancyfontstyle;
// The font for the definition
var $htmldefinitionfontface;
// The font size for the definition
var $htmldefinitionfontsize;
// The font color for the definition
var $htmldefinitionfontcolor;
// The font style for the definition
var $htmldefinitionfontstyle;
// This function builds the prefs object given an array
function Pref ($attr)
{
// Itterates through all the given attributes
foreach ($attr as $name => $value)
{
// Check to see if we need to convert to css style
// hex color
if(preg_match('/^0x([\dA-F]{6})$/', $value, $match))
{
$this->$name = '#' . $match[1];
}
else
{
$this->$name = $value;
}
}
// Setting defaults just incase
if ($this->htmlfontname == '')
{
$this->htmlfontname = 'Arial';
}
if ($this->htmlbkcolor == '')
{
$this->htmlbkcolor = '#FFF';
}
if ($this->htmltextcolor == '')
{
$this->htmltextcolor = '#000';
}
if ($this->htmllinkcolor == '')
{
$this->htmllinkcolor = '#00F';
}
if ($this->htmlvlinkcolor == '')
{
$this->htmlvlinkcolor = '#F00';
}
if ($this->htmlfontsize == '')
{
$this->htmlfontsize = 13;
}
if ($this->resultsperpage == '')
{
$this->resultsperpage = 10;
}
if ($this->htmldatefontface == '')
{
$this->htmldatefontface == 'Arial';
}
if ($this->htmldatefontcolor == '')
{
$this->htmldatefontcolor = 'green';
}
if ($this->htmldatefontsize == '')
{
$this->htmldatefontsize = 13;
}
if ($this->htmlrelevancyfontface == '')
{
$this->htmlrelevancyfontface = 'Arial';
}
if ($this->htmlrelevancyfontcolor == '')
{
$this->htmlrelevancyfontcolor = 'green';
}
if ($this->htmlrelevancyfontsize == '')
{
$this->htmlrelevancyfontsize = 12;
}
if ($this->htmldefinitionfontface == '')
{
$this->htmldefinitionfontface = 'Arial';
}
if ($this->htmldefinitionfontcolor == '')
{
$this->htmldefinitionfontcolor = '0000FF';
}
if ($this->htmldefinitionfontsize == '')
{
$this->htmldefinitionfontsize = 12;
}
// Translate and prepare the styles for the date and url
switch ($this->htmldatefontstyle)
{
case '1':
$this->htmldatefontstyle = "\n font-weight:bold;\n";
break;
case '2':
$this->htmldatefontstyle = "\n font-style:italic;\n";
break;
case '3':
$this->htmldatefontstyle = "\n font-weight:bold;\n font-style:italic;\n";
break;
default:
$this->htmldatefontstyle = "\n font-weight:normal;\n font-style:normal;\n";
}
// Translate and prepare the styles for the relevancy
switch ($this->htmlrelevancyfontstyle)
{
case '1':
$this->htmlrelevancyfontstyle = "\n font-weight:bold;\n";
break;
case '2':
$this->htmlrelevancyfontstyle = "\n font-style:italic;\n";
break;
case '3':
$this->htmlrelevancyfontstyle = "\n font-weight:bold;\n font-style:italic;\n";
break;
default:
$this->htmlrelevancyfontstyle = "\n font-weight:normal;\n font-style:normal;\n";
}
// Translate and prepare the styles for the definition
switch ($this->htmldefinitionfontstyle)
{
case '1':
$this->htmldefinitionfontstyle = "\n font-weight:bold;\n";
break;
case '2':
$this->htmldefinitionfontstyle = "\n font-style:italic;\n";
break;
case '3':
$this->htmldefinitionfontstyle = "\n font-weight:bold;\n font-style:italic;\n";
break;
default:
$this->htmldefinitionfontstyle = "\n font-weight:normal;\n font-style:normal;\n";
}
// Get the language for wiki
switch ($this->htmldeflanguage)
{
case 'Deutsch':
$this->htmldeflanguage = 'de';
break;
case 'Francais':
$this->htmldeflanguage = 'fr';
break;
case 'Svenska':
$this->htmldeflanguage = 'sv';
break;
case 'Nederlands':
$this->htmldeflanguage = 'nl';
break;
case 'Polski':
$this->htmldeflanguage = 'pl';
break;
case 'Portugues':
$this->htmldeflanguage = 'pt';
break;
case 'Espanol':
$this->htmldeflanguage = 'es';
break;
case 'Italiano':
$this->htmldeflanguage = 'it';
break;
case 'Japanese':
$this->htmldeflanguage = 'ja';
break;
default:
$this->htmldeflanguage = 'en';
}
// Just making stuff pretty for css
$this->htmldefinitionfontsize .= 'px';
$this->htmlrelevancyfontsize .= 'px';
$this->htmldatefontsize .= 'px';
$this->htmlfontsize .= 'px;';
$this->htmlfontname .= ';';
$this->htmlbkcolor .= ';';
$this->htmltextcolor .= ';';
$this->htmllinkcolor .= ';';
$this->htmlvlinkcolor .= ';';
$this->htmlfontsize .= ';';
// Checking for the highlight color
$this->htmlhighlight=(($this->htmlhighlight != '') ?
$this->htmlhighlight :
$this->htmlbkcolor) . ';';
// If the user included a header, decode it
if($this->htmlheader != '')
{
$this->htmlheader = $this->htmlheader;
}
// If the user included a footer, decode it
if($this->htmlfooter != '')
{
$this->htmlfooter = $this->htmlfooter;
}
// Fixing some xml spelling errors from
// the windows application
$this->adhtml = ($this->addhtml) ? $this->addhtml : $this->adhtml;
$this->adpos = ($this->addpos) ? $this->addpos : $this->adpos;
}
}
// This class will be instantiated for every instance of the page
// node found in the generated xml file. The attributes of this
// class correspond directly to the children of the page node.
// This class also include various methods for searching and
// calculating the current weight of any given page.
class Page
{
// The url for the page
var $url;
// The date the page was last indexed
var $indexed;
// The meta keys for the page
var $meta_keys;
// The meta description of the page
var $meta_desc;
// The user-inputted keys for the page
var $user_keys;
// The user-inputted weight for the page
var $user_weight;
// The contents for the page
var $content;
// The calculated weight for the meta keys for this page
var $meta_keys_weight;
// The calculate weight for the meta description for this page
var $meta_desc_weight;
// The calculated weight for the user-inputted keys for this page
var $user_keys_weight;
// The calculated weight for the content for this page
var $content_weight;
// The total weight for this page
var $weight;
// This function builds the page object given an array of elements
function Page ($attr)
{
foreach ($attr as $name => $value)
{
$this->$name = $value;
}
// Initialize the boled content and remove fix html entities
$this->bolded_content = $this->content;
// REMOVED TO COMPLY WITH EUROPEAN DATE FORMATS
// Convert the date to a friendly format
//$date = explode('/', $this->indexed);
//$this->indexed = date("M d, Y", mktime(0,0,0,$date[0],$date[1],$date[2]));
}
// Searches and weighs this page using a given string
function search ($string)
{
// Initialization of all of the local weights
$this->meta_keys_weight = 0;
$this->meta_desc_weight = 0;
$this->user_keys_weight = 0;
$this->content_weight = 0;
// Finded quoted string for exact matches
preg_match_all('/"([^"]*)"/', trim($string), $word_array);
$string = preg_replace('/("[^"]*")/', '', trim($string));
// Splits up the seach string into just words, ignoring all
// punctuations, white-space and any other unwanted characters
preg_match_all("/([\w'\-]*)[^\w'\-]*/",trim($string), $word_array_2);
// Takes out the garbage
array_pop($word_array_2[1]);
// Merge the array from the quoted strings and the unquoted strings
$word_array[1] = array_merge($word_array[1], $word_array_2[1]);
// Initialize max len for importance calculations
$max_len = 0;
// Check for the OR operator
$keys = array_keys($word_array[1], "OR");
$count = count($keys);
// Assigns all of the local weight multiplers for each word to be
// multiplied against the global weight settings
foreach ($word_array[1] as $key => $word)
{
// Check for the exclusion operator
if($word{0} == '-')
{
$neg = true;
$word = substr($word, 1);
} else {
$neg = false;
}
// Check for the OR operator
if($count > 0)
{
// If this is our first pass,
// set the OR array
if(!isset($or_array))
{
$or_array = array();
$or_array[$count] = 't';
}
// If the current word is OR
// Initialize the next array
// element
if($word == 'OR')
{
$or_array[--$count] = 't';
}
}
// Calculate weights
$content_weight = $this->get_multiplier($word, $this->content);
$meta_keys_weight = $this->get_multiplier($word, $this->meta_keys);
$meta_desc_weight = $this->get_multiplier($word, $this->meta_desc);
$user_keys_weight = $this->get_multiplier($word, $this->user_keys);
// If any word doesnt appear in one of the fields
if($content_weight == 0 && $meta_keys_weight == 0 &&
$meta_desc_weight == 0 && $user_keys_weight == 0)
{
// If the current word isn't preceeded by an
// exlusion operator
if(!$neg)
{
// If the current search doesnt contain
// any OR operators
if(!isset($or_array))
{
// Return a weight of zero for the current page
return $this->weight = 0;
}
// Else, Set the current section of the OR to false
else
{
$or_array[$count] = 'f';
}
}
}
// If the word does appear and the word is preceeded
// by an exclusion operator, return a weight of zero
// for the current page
else if($neg)
{
return $this->weight = 0;
}
// Otherwise, calculate the current weights of the found
// words
else
{
$this->content_weight += $content_weight;
$this->meta_keys_weight += $meta_keys_weight;
$this->meta_desc_weight += $meta_desc_weight;
$this->user_keys_weight += $user_keys_weight;
// Bold all of the keywords
$this->bolded_content = preg_replace("/\b(" . $word . ")\b/i",
'\1',
$this->bolded_content);
}
// Get the length of the current word
$len = strlen($word);
// If the length is greater than the longest word so far
// Set the current string to the longest word
if($len > $max_len)
{
$max_len = $len;
$most_important = $word;
}
}
// If the user is using the OR operator and none of the
// sections found all matches, return 0 as the current
// weight
if(isset($or_array) && !in_array('t', $or_array))
{
return $this->weight = 0;
}
// Set the string we're looking for since we will be using it quite a bit
$findme = "$most_important";
// Find the position of the first occurance of this string
$strpos = strpos(strtolower($this->bolded_content), strtolower($findme));
// If the string can't be found in the content, simply display the
// first 256 characters
if($strpos === false)
{
$start_point = 0;
$end_point = 256;
}
// If the string position is found, set a start point and an end point
// to start clipping
else
{
$start_point = $strpos - 128;
$end_point = $strpos + 128;
}
// Look for a space that we can clip off before the first occurance of
// the longest string, if one isn't found, set the start_point to the
// first occurance of the longest string
if(($start_point = $this->find_space($start_point, $this->bolded_content)) === false)
{
$start_point = $strpos;
}
// Look for a space that we can clip after the first occurance of
// the longest string, if one isn't found, set the end_point to the
// end of the first occurance of the longest string
if(($end_point = $this->find_space($end_point, $this->bolded_content, true)) === false)
{
$end_point = $strpos + strlen($findme);
}
// Initialize the bolded content string which will be used
// for the displayed results
$bolded_content = '';
// If the starting point isn't at the beginning of the content
// add the '...' to show that the result is taken out of context
if($start_point != 0)
{
$bolded_content .= '...';
}
// Make the clippings for the bolded content
$bolded_content .= substr($this->bolded_content, $start_point + 1, $end_point - $start_point - 1);
// If the ending point isn't at the end of the content
// add the '...' to show that the result is taken out of context
if($end_point != strlen($this->bolded_content) - 1)
{
$bolded_content .= '...';
}
$this->bolded_content = $bolded_content;
// Returns the total weight for the current page and assigns
// the total weight to the weight attibute
return $this->weight = $this->get_total_weight();
}
// Finds a place that is alright for clipping while staying in bound
function find_space($start, $string, $reverse = false)
{
// If the reverse flag isn't set, then we move in forward motion
if(!$reverse)
{
// Set the delimeter
$del = $start + 128;
// Loop through all possible characters
for($i = $start; $i < $del; $i++)
{
// Make sure we're in bounds
if($i > 0)
{
// Check to see if the current character is okay for
// a clipping point
if($this->check($string[$i]) === true)
{
return $i;
}
}
}
// If we can't find a suitable place for clipping, we return false
return false;
}
// If the reverse flag is set, the we move in revers
else
{
// So we don't have to continuously calculate these
$cnt = strlen($string);
// Set the current delimeter
$del = $start - 128;
// Loop through all possible characters
for($i = $start; $i > $del; $i--)
{
// Make sure we're in bounds
if($i < $cnt)
{
// Check to see if the current character is okay for
// a clipping point
if($this->check($string[$i]) === true)
{
return $i;
}
}
}
// If we can't find a suitable place for clipping, we return false
return false;
}
}
// Check to see if a passed character is not a character that may be
// part of a word or something else important
function check($char)
{
if(ord($char) < 47 && ord($char) != 39 )
{
return true;
}
return false;
}
// Calculates and returns the global weight for the current page
function get_total_weight()
{
global $weights;
return ($this->meta_keys_weight * $weights['meta_keys_weight']) +
($this->meta_desc_weight * $weights['meta_desc_weight']) +
($this->user_keys_weight * $weights['user_keys_weight']) +
($this->content_weight * $weights['content_weight']) +
($this->user_weight * $weights['user_weight']);
}
// Calculates the multiplier for a word by counting the number
// of times the given word appears in a section
function get_multiplier ($needle, $haystack)
{
preg_match_all("/\b" . $needle . "\b/i", $haystack, $matches);
return count($matches[0]) * strlen($needle);
}
}
// Returns the current time
function stamp ()
{
$time_init = explode(chr(32),microtime());
return $time_init[1] + $time_init[0];
}
// Returns the amount of time that has elapsed between two times
function elapsed ($time_start, $time_end)
{
return substr(($time_end - $time_start), 0, 5);
}
// Parses an xml file and builds an array of Page Object out of it.
// Return the array of page objects or false if an error occurs.
function parse_xml ($xml_file)
{
// Reads the xml file into a string
$xml = file_get_contents($xml_file);
$parser = xml_parser_create();
// Disables casefolding for semantical purposes
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
// Skips values that consist of only white space
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
// If the xml fails to parse into a struct, we return false
if(xml_parse_into_struct($parser, $xml, $values, $tags) === 0)
{
return false;
}
xml_parser_free($parser);
// Itterates through all of the tags
foreach ($tags as $name => $value)
{
// If we find a page node, start building the page object
if ($name == 'page')
{
$nodes = $value;
$cnt = count($nodes);
for ($i = 0; $i < $cnt; $i += 2)
{
$element_array[] = build_page(array_slice($values, $nodes[$i],
$nodes[$i + 1] - $nodes[$i] + 1));
}
}
// If we're looking at the prefs file, load the prefs object
else if ($name == 'coffeecupsearch')
{
return new Pref($values[0]['attributes']);
}
}
return (count($element_array) > 0) ? $element_array : false;
}
// Constructs a page object using an array of corresponding nodes and values
function build_page ($values)
{
$cnt = count($values);
// Itterates through all of the nodes
for ($i = 0; $i < $cnt; $i++)
{
// If an attribute array is found, add each attribute to the page array
if(is_array($values[$i]['attributes']))
{
// Itterates through all of the attributes and then adds them
// to the page array
foreach($values[$i]['attributes'] as $name => $value)
{
$page[$name] = $value;
}
}
// If any complete nodes are found, adds them to the page array
if($values[$i]['type'] == 'complete')
{
$page[$values[$i]['tag']] = $values[$i]['value'];
}
}
// Return the new page object
return new Page($page);
}
// This is for sorting the page objects in descending order, based on weight.
// Basically just your run of the mill quick sort implementation.
function quick_sort (&$array, $left, $right)
{
// hold the ends of the current array
$l_hold = $left;
$r_hold = $right;
// the pivot point is starts at the far left
$pivot = $array[$left];
// Itterates through every value in the current array
while ($left < $right)
{
// So long as the weight is less than or equal to the weight of the
// pivot object, continue on to the next value
while (($array[$right]->weight <= $pivot->weight) && ($left < $right))
{
$right--;
}
// If we reach this code, and its not because we've reached the end
// of the array, then we must move the current value to the other side
// of the pivot
if ($left != $right)
{
$array[$left] = $array[$right];
$left++;
}
// Now were moving from the left to the right, so long as the weight
// is greater than or equal to the pivot value, continue to the next
// value
while (($array[$left]->weight >= $pivot->weight) && ($left < $right))
{
$left++;
}
// If we read this code, and its not because we've reached the end
// of the array, then we must move the current value to the other side
// of the pivot
if ($left != $right)
{
$array[$right] = $array[$left];
$right--;
}
}
// Put everything into its place
$array[$left] = $pivot;
$pivot = $left;
$left = $l_hold;
$right = $r_hold;
// If we still have more on the left side, continue to quick sort
if ($left < $pivot)
{
quick_sort($array, $left, $pivot - 1);
}
// if we still have more on the right side continue to quick sort
if ($right > $pivot)
{
quick_sort($array, $pivot + 1, $right);
}
}
// Callback function to format the definition links
function fix_entities($matches)
{
global $prefs;
return "htmldeflanguage.wikipedia.com/wiki/$matches[1]\">" .
"$matches[1]" . htmlentities($matches[2]);
}
// Get the current time
$st = stamp();
// Attempt to parse the preferences file
if(($prefs = parse_xml($pref_file)) === false)
{
$body = "
There seems to be a problem loading " . "your preferences file.
\n"; $title = "Error"; } // Check to make sure that the query isn't blank else if(trim($query) != '') { // Attempt to parse the search file if(($xml = parse_xml($search_file)) === false) { $body = "There seems to be a problem processing " . "your request
\n"; $title = "Error"; } else { $title = 'Search results for "' . htmlentities($query) . '"'; // Initialize the $results array $results = array(); //Itterate through all of the pages foreach ($xml as $key => $val) { // Try to find a page that returns a weight greater than the current // $search_flex settings when searching for a given search string if($xml[$key]->search($query) > $search_flex) { $results[] = $xml[$key]; } } // Get the number of results because we will be using it a lot $cnt = count($results); // Get the search string because we will be using it a lot $q = $query; $query = htmlentities(urldecode($query)); // If some results were found if ($cnt > 0) { // Sort the results in decending order quick_sort($results, 0, count($results) - 1); // Get the result number of the first result on the current page $start = $page * $prefs->resultsperpage - $prefs->resultsperpage; // Get the heaviest weight for relevance $heaviest = $results[0]->weight; // We need to make sure that the user isn't trying to request a page // that is outside of this result set if ($start < $cnt) { // Get the results for the current page $page_results = array_slice($results, $start, $prefs->resultsperpage); if(!$prefs->btnbkd){ array_pop($page_results); $i = 'ICAgIDxoMz48YSBocmVmPSJodHRwOi8vd3d3LmNvZmZlZWN1cC5jb20vIiB0YXJn'. 'ZXQ9Il9ibGFuayI+RG93bmxvYWQgQ29mZmVlQ3VwIFNvZnR3YXJlIE5vdyAhPC9h'. 'PjwvaDM+CiAgICA8cD5UaGlzIHNlYXJjaCBlbmdpbmUgd2FzIGNyZWF0ZWQgdXNp'. 'bmcgQ29mZmVlQ3VwIFdlYnNpdGUgU2VhcmNoLjxiciAvPiBWaXNpdCA8YSBocmVm'. 'PSJodHRwOi8vd3d3LmNvZmZlZWN1cC5jb20iIHRhcmdldD0iX2JsYW5rIj5odHRw'. 'Oi8vd3d3LmNvZmZlZWN1cC5jb20vPC9hPiB0byBjaGVjayBvdXQgYWxsIG91ciBX'. 'ZWIgRGVzaWduIHNvZnR3YXJlIGFuZCBTZWFyY2ggRW5naW5lIFN1Ym1pc3Npb24g'. 'c2VydmljZXMuPGJyIC8+IDxzdHJvbmc+PGVtPlsgVGhpcyBsaW5rIGNhbiBvbmx5'. 'IGJlIHJlbW92ZWQgYnkgcHVyY2hhc2luZyBDb2ZmZWVDdXAgV2Vic2l0ZSBTZWFy'. 'Y2ggXTwvZW0+PC9zdHJvbmc+PC9wPgogICAgPHAgY2xhc3M9InVybF9pbmZvIj48'. 'YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL3d3dy5jb2ZmZWVjdXAuY29t'. 'LyI+aHR0cDovL3d3dy5jb2ZmZWVjdXAuY29tLzwvYT4gLSA='; $body .= base64_decode($i).date("M d, Y").'';} // Add the results to the body of the page foreach ($page_results as $page_result) { $body .= "$page_result->bolded_content
\n" . "$page_result->url" . (($prefs->htmldate == 'true') ? (" - " . $page_result->indexed) : '') . (($prefs->htmlrel == 'true') ? (" - Relevance: " . sprintf("%.2f",$page_result->weight / $heaviest * 100) . '%') : '') . "
\n"; } // Check to see if we need to add navigational links to our search if ($cnt > $prefs->resultsperpage) { // Adds all previous page links for ($i = $page - 4; $i != $page; $i++) { if ($i > 0) { $navigation .= " $i \n"; } } // Adds the current age number $navigation .= " $page \n"; // Adds all of the next page links for($i = $page + 1; $i != $page + 5; $i++) { if(($i * $prefs->resultsperpage - ($prefs->resultsperpage - 1)) <= $cnt) { $navigation .= " $i \n"; } // Might as well leave the loop if weve gone out of range else { break; } } // Adds the "Next" and "Prev" links if needed $navigation = " "; } // Get the ending time stamp $et = elapsed($st, stamp()); // Preparing some infor about the current page $result_info = "Found $cnt results for \"" .
(($prefs->htmldef == 'true') ?
(preg_replace_callback("/([\w'\-]{3,})([^\w'\-]*)/", "fix_entities", $q))
:
htmlentities($q)) .
"\" in $et " .
"seconds.
Displaying results " .
($start + 1) . " - " . ((($start + $prefs->resultsperpage) > $cnt) ?
$cnt : ($start + $prefs->resultsperpage)) . "
Error: The page you have requested falls outside the result set.
\n"; $prefs->adhtml = ''; } } // No matches were found else { $body = ($custom_msg != '') ? $custom_msg : ("No matches found for search \"$query\"
\n" . "