home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2008 September
/
PCWorld_2008-09_cd.bin
/
system
/
diskche
/
diskcheckup.exe
/
HELP
/
zoom_search.js
< prev
Wrap
Text File
|
2007-10-30
|
36KB
|
993 lines
// ----------------------------------------------------------------------------
// Zoom Search Engine 5.0 (30/4/2007)
//
// This file (search.js) is the JavaScript search front-end for client side
// searches using index files created by the Zoom Search Engine Indexer.
//
// email: zoom@wrensoft.com
// www: http://www.wrensoft.com
//
// Copyright (C) Wrensoft 2000-2007
//
// This script performs client-side searching with the index data file
// (zoom_index.js) generated by the Zoom Search Engine Indexer. It allows you
// to run searches on mediums such as CD-ROMs, or other local data, where a
// web server is not available.
//
// We recommend against using client-side searches for online websites because
// it requires the entire index data file to be downloaded onto the user's
// local machine. This can be very slow for large websites, and our server-side
// search scripts (available for PHP, ASP and CGI) are far better suited for this.
// However, JavaScript is still an option for smaller websites in a limited
// hosting situation (eg: your web host does not support PHP, ASP or CGI).
// ----------------------------------------------------------------------------
// Include required files for index data, settings, etc.
document.write("<script language=\"JavaScript\" src=\"zoom_index.js\" charset=\"" + Charset + "\"><\/script>");
document.write("<script language=\"JavaScript\" src=\"zoom_pageinfo.js\" charset=\"" + Charset + "\"><\/script>");
document.write("<meta http-equiv=\"content-type\" content=\"text/html; charset=" + Charset + "\">");
// ----------------------------------------------------------------------------
// Settings (change if necessary)
// ----------------------------------------------------------------------------
// The options available in the dropdown menu for number of results
// per page
var PerPageOptions = new Array(10, 20, 50, 100);
// Globals
var SkippedWords = 0;
var searchWords = new Array();
var RegExpSearchWords = new Array();
var SkippedOutputStr = "";
var months = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
// Index format
var PAGEDATA_URL = 0;
var PAGEDATA_TITLE = 1;
var PAGEDATA_DESC = 2;
var PAGEDATA_IMG = 3;
var PAGEINFO_DATETIME = 0;
var PAGEINFO_FILESIZE = 1;
var PAGEINFO_CAT = 2;
// ----------------------------------------------------------------------------
// Helper Functions
// ----------------------------------------------------------------------------
// This function will return the value of a GET parameter
function getParam(paramName)
{
paramStr = document.location.search;
if (paramStr == "")
return "";
// remove '?' in front of paramStr
if (paramStr.charAt(0) == "?")
paramStr = paramStr.substr(1);
arg = (paramStr.split("&"));
for (i=0; i < arg.length; i++) {
arg_values = arg[i].split("=")
if (unescape(arg_values[0]) == paramName) {
if (UseUTF8 == 1 && self.decodeURIComponent) // check if decodeURIComponent() is defined
ret = decodeURIComponent(arg_values[1]);
else
ret = unescape(arg_values[1]); // IE 5.0 and older does not have decodeURI
return ret;
}
}
return "";
}
function getParamArray(paramName)
{
paramStr = document.location.search;
var retArray = new Array();
var retCount = 0;
if (paramStr == "")
return retArray;
// remove '?' in front of paramStr
if (paramStr.charAt(0) == "?")
paramStr = paramStr.substr(1);
arg = (paramStr.split("&"));
for (i=0; i < arg.length; i++)
{
arg_values = arg[i].split("=")
if (unescape(arg_values[0]) == paramName)
{
if (UseUTF8 == 1 && self.decodeURIComponent) // check if decodeURIComponent() is defined
ret = decodeURIComponent(arg_values[1]);
else
ret = unescape(arg_values[1]); // IE 5.0 and older does not have decodeURI
retArray[retCount] = ret;
retCount++;
}
}
return retArray;
}
// Compares the two values, used for sorting output results
// Results that match all search terms are put first, highest score
function SortCompare (a, b)
{
if (a[2] < b[2]) return 1;
else if (a[2] > b[2]) return -1;
else if (a[1] < b[1]) return 1;
else if (a[1] > b[1]) return -1;
else return 0;
}
function SortByDate(a, b)
{
if (pageinfo[a[0]][PAGEINFO_DATETIME] < pageinfo[b[0]][PAGEINFO_DATETIME]) return 1;
else if (pageinfo[a[0]][PAGEINFO_DATETIME] > pageinfo[b[0]][PAGEINFO_DATETIME]) return -1;
else return SortCompare(a, b);
}
function sw_compare(a, b)
{
if (a.charAt(0) == '-')
return 1;
if (b.charAt(0) == '-')
return -1;
return 0;
}
function pattern2regexp(pattern)
{
pattern = pattern.replace(/\#/g, "\\#");
pattern = pattern.replace(/\$/g, "\\$");
pattern = pattern.replace(/\./g, "\\.");
pattern = pattern.replace(/\*/g, "[\\d\\S]*");
pattern = pattern.replace(/\?/g, ".?");
return pattern;
}
function PrintHighlightDescription(line)
{
if (Highlighting == 0)
{
document.writeln(line);
return;
}
res = " " + line + " ";
for (i = 0; i < numwords; i++) {
if (RegExpSearchWords[i] == "")
continue;
if (SearchAsSubstring == 1)
res = res.replace(new RegExp("("+RegExpSearchWords[i]+")", "gi"), "[;:]$1[:;]");
else
res = res.replace(new RegExp("(\\W|^|\\b)("+RegExpSearchWords[i]+")(\\W|$|\\b)", "gi"), "$1[;:]$2[:;]$3");
}
// replace the marker text with the html text
// this is to avoid finding previous <span>'ed text.
res = res.replace(/\[;:\]/g, "<span class=\"highlight\">");
res = res.replace(/\[:;\]/g, "</span>");
document.writeln(res);
}
function PrintNumResults(num)
{
if (num == 0)
return STR_NO_RESULTS;
else if (num == 1)
return num + " " + STR_RESULT;
else
return num + " " + STR_RESULTS;
}
function AddParamToURL(url, paramStr)
{
// add GET parameters to URL depending on
// whether there are any existing parameters
if (url.indexOf("?") > -1)
return url + "&" + paramStr;
else
return url + "?" + paramStr;
}
function SkipSearchWord(sw) {
if (searchWords[sw] != "") {
if (SkippedWords > 0)
SkippedOutputStr += ", ";
SkippedOutputStr += "\"<b>" + searchWords[sw] + "</b>\"";
searchWords[sw] = "";
}
}
function wordcasecmp(word1, word2) {
if (word1 == word2)
return 0;
else
return -1;
}
function htmlspecialchars(query) {
query = query.replace(/\&/g, "&");
query = query.replace(/\</g, "<");
query = query.replace(/\>/g, ">");
query = query.replace(/\"/g, """);
query = query.replace(/\'/g, "'");
return query;
}
function QueryEntities(query) {
query = query.replace(/\&/g, "&");
query = query.replace(/\</g, "<");
query = query.replace(/\>/g, ">");
query = query.replace(/\'/g, "'");
return query;
}
function FixQueryForAsianWords(query) {
currCharType = 0;
lastCharType = 0; // 0 is normal, 1 is hiragana, 2 is katakana, 3 is "han"
// check for hiragana/katakana splitting required
newquery = "";
for (i = 0; i < query.length; i++)
{
ch = query.charAt(i);
chVal = query.charCodeAt(i);
if (chVal >= 12352 && chVal <= 12447)
currCharType = 1;
else if (chVal >= 12448 && chVal <= 12543)
currCharType = 2;
else if (chVal >= 13312 && chVal <= 44031)
currCharType = 3;
else
currCharType = 0;
if (lastCharType != currCharType && ch != " ")
newquery += " ";
lastCharType = currCharType;
newquery += ch;
}
return newquery;
}
// ----------------------------------------------------------------------------
// Parameters initialisation (globals)
// ----------------------------------------------------------------------------
var query = getParam("zoom_query");
query = query.replace(/[\++]/g, " "); // replace the '+' with spaces
SearchAsSubstring = (query == query.replace(/[\"+]/g, " "));
query = query.replace(/[\"+]/g, " ");
var per_page = parseInt(getParam("zoom_per_page"));
if (isNaN(per_page)) per_page = 10;
var page = parseInt(getParam("zoom_page"));
if (isNaN(page)) page = 1;
var andq = parseInt(getParam("zoom_and"));
if (isNaN(andq))
{
if (typeof(DefaultToAnd) != "undefined" && DefaultToAnd == 1)
andq = 1;
else
andq = 0;
}
var cat = getParamArray("zoom_cat[]");
if (cat.length == 0)
{
cat[0] = parseInt(getParam("zoom_cat"));
if (isNaN(cat))
cat[0] = -1; // search all categories
}
var num_zoom_cats = cat.length;
// for sorting options. zero is default (relevance)
// 1 is sort by date (if date/time is available)
var sort = parseInt(getParam("zoom_sort"));
if (isNaN(sort)) sort = 0;
var SelfURL = "";
if (typeof(LinkBackURL) == "undefined")
{
SelfURL = document.location.href;
// strip off parameters and anchors
var paramIndex;
paramIndex = SelfURL.indexOf("?");
if (paramIndex > -1)
SelfURL = SelfURL.substr(0, paramIndex);
paramIndex = SelfURL.indexOf("#");
if (paramIndex > -1)
SelfURL = SelfURL.substr(0, paramIndex);
}
else
SelfURL = LinkBackURL;
// encode invalid URL characters
SelfURL = SelfURL.replace(/\</g, "<");
SelfURL = SelfURL.replace(/\"/g, """);
var data = new Array();
var output = new Array();
target = "";
if (UseLinkTarget == 1)
target = " target=\"" + LinkTarget + "\" ";
// ----------------------------------------------------------------------------
// Main search function starts here
// ----------------------------------------------------------------------------
function ZoomSearch()
{
var loadingmsg = document.getElementById("loadingmsg");
if (loadingmsg) loadingmsg.style.display = "None";
if (UseCats)
NumCats = catnames.length;
if (Timing == 1) {
timeStart = new Date();
}
// Display the form
if (FormFormat > 0) {
document.writeln("<form method=\"get\" action=\"" + SelfURL + "\" class=\"zoom_searchform\">");
document.writeln("<input type=\"text\" name=\"zoom_query\" size=\"20\" value=\"" + htmlspecialchars(query) + "\" class=\"zoom_searchbox\" />");
document.writeln("<input type=\"submit\" value=\"" + STR_FORM_SUBMIT_BUTTON + "\" class=\"zoom_button\" /><br />");
if (FormFormat == 2) {
document.writeln("<span class=\"zoom_results_per_page\">" + STR_FORM_RESULTS_PER_PAGE + "\n");
document.writeln("<select name=\"zoom_per_page\">");
for (i = 0; i < PerPageOptions.length; i++) {
document.write("<option");
if (PerPageOptions[i] == per_page)
document.write(" selected=\"selected\"");
document.writeln(">" + PerPageOptions[i] + "</option>");
}
document.writeln("</select><br /><br /></span>");
if (UseCats) {
document.writeln("<span class=\"zoom_categories\">");
document.write(STR_FORM_CATEGORY + " ");
if (SearchMultiCats)
{
document.writeln("<ul>");
document.write("<li><input type=\"checkbox\" name=\"zoom_cat[]\" value=\"-1\"");
if (cat[0] == -1)
document.write(" checked=\"checked\"");
document.writeln(">" + STR_FORM_CATEGORY_ALL + "</input></li>");
for (i = 0; i < NumCats; i++)
{
document.write("<li><input type=\"checkbox\" name=\"zoom_cat[]\" value=\"" +i+ "\"");
if (cat[0] != -1)
{
for (catit = 0; catit < num_zoom_cats; catit++)
{
if (i == cat[catit])
{
document.write(" checked=\"checked\"");
break;
}
}
}
document.writeln(">"+catnames[i]+"</input></li>");
}
document.writeln("</ul><br /><br />");
}
else
{
document.write("<select name='zoom_cat[]'>");
// 'all cats option
document.write("<option value=\"-1\">" + STR_FORM_CATEGORY_ALL + "</option>");
for (i = 0; i < NumCats; i++) {
document.write("<option value=\"" + i + "\"");
if (i == cat[0])
document.write(" selected=\"selected\"");
document.writeln(">" + catnames[i] + "</option>");
}
document.writeln("</select> ");
}
document.writeln("</span>");
}
document.writeln("<span class=\"zoom_match\">" + STR_FORM_MATCH + " ");
if (andq == 0) {
document.writeln("<input type=\"radio\" name=\"zoom_and\" value=\"0\" checked=\"checked\" />" + STR_FORM_ANY_SEARCH_WORDS);
document.writeln("<input type=\"radio\" name=\"zoom_and\" value=\"1\" />" + STR_FORM_ALL_SEARCH_WORDS);
} else {
document.writeln("<input type=\"radio\" name=\"zoom_and\" value=\"0\" />" + STR_FORM_ANY_SEARCH_WORDS);
document.writeln("<input type=\"radio\" name=\"zoom_and\" value=\"1\" checked=\"checked\" />" + STR_FORM_ALL_SEARCH_WORDS);
}
document.writeln("<input type=\"hidden\" name=\"zoom_sort\" value=\"" + sort + "\" />");
document.writeln("<br /><br /></span>");
}
else
{
document.writeln("<input type=\"hidden\" name=\"zoom_per_page\" value=\"" + per_page + "\" />");
document.writeln("<input type=\"hidden\" name=\"zoom_and\" value=\"" + andq + "\" />");
document.writeln("<input type=\"hidden\" name=\"zoom_sort\" value=\"" + sort + "\" />");
}
document.writeln("</form>");
}
// give up early if no search words provided
if (query.length == 0) {
//document.writeln("No search query entered.<br />");
if (ZoomInfo == 1)
document.writeln("<center><p><small>" + STR_POWEREDBY + " <a href=\"http://www.wrensoft.com/zoom/\" target=\"_blank\"><b>Zoom Search Engine</b></a></small></p></center>");
return;
}
if (MapAccents == 1) {
for (i = 0; i < NormalChars.length; i++) {
query = query.replace(AccentChars[i], NormalChars[i]);
}
}
// Special query processing required when SearchAsSubstring is enabled
if (SearchAsSubstring == 1 && UseUTF8 == 1)
query = FixQueryForAsianWords(query);
// prepare search query, strip quotes, trim whitespace
if (WordJoinChars.indexOf(".") == -1)
query = query.replace(/[\.+]/g, " ");
if (WordJoinChars.indexOf("-") == -1)
query = query.replace(/(\S)\-/g, "$1 ");
if (WordJoinChars.indexOf("_") == -1)
query = query.replace(/[\_+]/g, " ");
if (WordJoinChars.indexOf("'") == -1)
query = query.replace(/[\'+]/g, " ");
if (WordJoinChars.indexOf("#") == -1)
query = query.replace(/[\#+]/g, " ");
if (WordJoinChars.indexOf("$") == -1)
query = query.replace(/[\$+]/g, " ");
if (WordJoinChars.indexOf("&") == -1)
query = query.replace(/[\&+]/g, " ");
if (WordJoinChars.indexOf(":") == -1)
query = query.replace(/[\:+]/g, " ");
if (WordJoinChars.indexOf(",") == -1)
query = query.replace(/[\,+]/g, " ");
if (WordJoinChars.indexOf("/") == -1)
query = query.replace(/[\/+]/g, " ");
if (WordJoinChars.indexOf("\\") == -1)
query = query.replace(/[\\+]/g, " ");
// substitute multiple whitespace chars to single character
// also strip any of the wordjoinchars if followed immediately by a space
query = query.replace(/[\s\(\)\^\[\]\|\+\{\}\%]+|[\-._',:&\/\\\\](\s|$)/g, " ");
// trim trailing/leading whitespace
query = query.replace(/^\s*|\s*$/g,"");
var queryForHTML = htmlspecialchars(query);
var queryForSearch;
if (ToLowerSearchWords == 1)
queryForSearch = query.toLowerCase();
else
queryForSearch = query;
queryForSearch = htmlspecialchars(queryForSearch);
// split search phrase into words
searchWords = queryForSearch.split(" "); // split by spaces.
// Sort search words if there are negative signs
if (queryForSearch.indexOf("-") != -1)
searchWords.sort(sw_compare);
var query_zoom_cats = "";
document.write("<div class=\"searchheading\">" + STR_RESULTS_FOR + " " + queryForHTML);
if (UseCats) {
if (cat[0] == -1)
{
document.writeln(" " + STR_RESULTS_IN_ALL_CATEGORIES);
query_zoom_cats = "&zoom_cat%5B%5D=-1";
}
else
{
document.writeln(" " + STR_RESULTS_IN_CATEGORY + " ");
for (catit = 0; catit < num_zoom_cats; catit++)
{
if (catit > 0)
document.write(", ");
document.write("\"" + catnames[cat[catit]] + "\"");
query_zoom_cats += "&zoom_cat%5B%5D="+cat[catit];
}
}
}
document.writeln("<br /><br /></div>");
document.writeln("<div class=\"results\">");
numwords = searchWords.length;
kw_ptr = 0;
outputline = 0;
ipage = 0;
matches = 0;
var SWord;
pagesCount = pageinfo.length;
exclude_count = 0;
ExcludeTerm = 0;
// Initialise a result table the size of all pages
res_table = new Array(pagesCount);
for (i = 0; i < pagesCount; i++)
{
res_table[i] = new Array(3);
res_table[i][0] = 0;
res_table[i][1] = 0;
res_table[i][2] = 0;
}
var UseWildCards = new Array(numwords);
for (sw = 0; sw < numwords; sw++) {
UseWildCards[sw] = 0;
if (skipwords) {
// check min length
if (searchWords[sw].length < MinWordLen) {
SkipSearchWord(sw);
continue;
}
// check skip word list
for (i = 0; i < skipwords.length; i++) {
if (searchWords[sw] == skipwords[i]) {
SkipSearchWord(sw);
break;
}
}
}
if (searchWords[sw].indexOf("*") == -1 && searchWords[sw].indexOf("?") == -1) {
UseWildCards[sw] = 0;
} else {
UseWildCards[sw] = 1;
RegExpSearchWords[sw] = pattern2regexp(searchWords[sw]);
}
if (Highlighting == 1 && UseWildCards[sw] == 0)
RegExpSearchWords[sw] = searchWords[sw];
}
// Begin searching...
for (sw = 0; sw < numwords; sw++) {
if (searchWords[sw] == "") {
SkippedWords++;
continue;
}
if (searchWords[sw].charAt(0) == '-')
{
searchWords[sw] = searchWords[sw].substr(1);
ExcludeTerm = 1;
exclude_count++;
}
if (UseWildCards[sw] == 1) {
if (SearchAsSubstring == 0)
pattern = "^" + RegExpSearchWords[sw] + "$";
else
pattern = RegExpSearchWords[sw];
re = new RegExp(pattern, "g");
}
for (kw_ptr = 0; kw_ptr < dictwords.length; kw_ptr++) {
data = dictwords[kw_ptr].split(" ");
if (UseWildCards[sw] == 0) {
if (SearchAsSubstring == 0)
match_result = wordcasecmp(data[0], searchWords[sw]);
else
match_result = data[0].indexOf(searchWords[sw]);
} else
match_result = data[0].search(re);
if (match_result != -1) {
// keyword found, include it in the output list
for (kw = 1; kw < data.length; kw += 2) {
// check if page is already in output list
pageexists = 0;
ipage = data[kw];
if (ExcludeTerm == 1)
{
// we clear out the score entry so that it'll be excluded in the filter stage
res_table[ipage][0] = 0;
}
else if (res_table[ipage][0] == 0) {
matches++;
res_table[ipage][0] += parseInt(data[kw+1]);
}
else {
if (res_table[ipage][0] > 10000) {
// take it easy if its too big to prevent gigantic scores
res_table[ipage][0] += 1;
} else {
res_table[ipage][0] += parseInt(data[kw+1]); // add in score
res_table[ipage][0] *= 2; // double score as we have two words matching
}
}
res_table[ipage][1] += 1;
// store the 'and' user search terms matched' value
if (res_table[ipage][2] == sw || res_table[ipage][2] == sw-SkippedWords-exclude_count)
res_table[ipage][2] += 1;
}
if (UseWildCards[sw] == 0 && SearchAsSubstring == 0)
break; // this search word was found, so skip to next
}
}
}
if (SkippedWords > 0)
document.writeln("<div class=\"summary\">" + STR_SKIPPED_FOLLOWING_WORDS + " " + SkippedOutputStr + ".<br /><br /></div>");
// Count number of output lines that match ALL search terms
oline = 0;
fullmatches = 0;
output = new Array();
var full_numwords = numwords - SkippedWords - exclude_count;
for (i = 0; i < pagesCount; i++) {
IsFiltered = false;
if (res_table[i][0] > 0) {
if (UseCats && cat[0] != -1) {
// using cats and not doing an "all cats" search
if (SearchMultiCats) {
for (cati = 0; cati < num_zoom_cats; cati++) {
if (pageinfo[i][PAGEINFO_CAT].charAt(cat[cati]) == "1")
break;
}
if (cati == num_zoom_cats)
IsFiltered = true;
}
else {
if (pageinfo[i][PAGEINFO_CAT].charAt(cat[0]) == "0") {
IsFiltered = true;
}
}
}
if (IsFiltered == false) {
if (res_table[i][2] >= full_numwords) {
fullmatches++;
} else {
if (andq == 1)
IsFiltered = true;
}
}
if (IsFiltered == false) {
// copy if not filtered out
output[oline] = new Array(3);
output[oline][0] = i;
output[oline][1] = res_table[i][0];
output[oline][2] = res_table[i][1];
oline++;
}
}
}
matches = oline;
// Sort results in order of score, use "SortCompare" function
if (matches > 1)
{
if (sort == 1 && UseDateTime == 1)
output.sort(SortByDate); // sort by date
else
output.sort(SortCompare); // sort by relevance
}
// prepare queryForURL
var queryForURL = query.replace(/\s/g, "+");
if (UseUTF8 == 1 && self.encodeURIComponent)
queryForURL = encodeURIComponent(queryForURL);
else
queryForURL = escape(queryForURL);
//Display search result information
document.writeln("<div class=\"summary\">");
if (matches == 0)
document.writeln(STR_SUMMARY_NO_RESULTS_FOUND + "<br />");
else if (numwords > 1 && andq == 0) {
//OR
SomeTermMatches = matches - fullmatches;
document.writeln(PrintNumResults(fullmatches) + " " + STR_SUMMARY_FOUND_CONTAINING_ALL_TERMS + " ");
if (SomeTermMatches > 0)
document.writeln(PrintNumResults(SomeTermMatches) + " " + STR_SUMMARY_FOUND_CONTAINING_SOME_TERMS);
document.writeln("<br />");
}
else if (numwords > 1 && andq == 1) //AND
document.writeln(PrintNumResults(fullmatches) + " " + STR_SUMMARY_FOUND_CONTAINING_ALL_TERMS + "<br />");
else
document.writeln(PrintNumResults(matches) + " " + STR_SUMMARY_FOUND + "<br />");
document.writeln("</div>\n");
// number of pages of results
num_pages = Math.ceil(matches / per_page);
if (num_pages > 1)
document.writeln("<div class=\"result_pagescount\"><br />" + num_pages + " " + STR_PAGES_OF_RESULTS + "</div>\n");
// Show recommended links if any
if (Recommended == 1)
{
num_recs_found = 0;
rec_count = recommended.length;
for (rl = 0; rl < rec_count && num_recs_found < RecommendedMax; rl++)
{
sep = recommended[rl].lastIndexOf(" ");
if (sep > -1)
{
rec_word = recommended[rl].slice(0, sep);
rec_idx = parseInt(recommended[rl].slice(sep));
for (sw = 0; sw <= numwords; sw++)
{
if (sw == numwords)
{
match_result = wordcasecmp(rec_word, queryForSearch);
}
else
{
if (UseWildCards[sw] == 1)
{
if (SearchAsSubstring == 0)
pattern = "^" + RegExpSearchWords[sw] + "$";
else
pattern = RegExpSearchWords[sw];
re = new RegExp(pattern, "g");
match_result = rec_word.search(re);
}
else if (SearchAsSubstring == 0)
{
match_result = wordcasecmp(rec_word, searchWords[sw]);
}
else
match_result = rec_word.indexOf(searchWords[sw]);
}
if (match_result != -1)
{
if (num_recs_found == 0)
{
document.writeln("<div class=\"recommended\">");
document.writeln("<div class=\"recommended_heading\">" + STR_RECOMMENDED + "</div>");
}
pgurl = pagedata[rec_idx][PAGEDATA_URL];
pgtitle = pagedata[rec_idx][PAGEDATA_TITLE];
pgdesc = pagedata[rec_idx][PAGEDATA_DESC];
urlLink = pgurl;
if (GotoHighlight == 1)
{
if (SearchAsSubstring == 1)
urlLink = AddParamToURL(urlLink, "zoom_highlightsub=" + queryForURL);
else
urlLink = AddParamToURL(urlLink, "zoom_highlight=" + queryForURL);
}
if (PdfHighlight == 1)
{
if (urlLink.indexOf(".pdf") != -1)
urlLink = urlLink+"#search=""+query+""";
}
document.writeln("<div class=\"recommend_block\">");
document.writeln("<div class=\"recommend_title\">");
document.writeln("<a href=\"" + urlLink + "\"" + target + ">");
if (pgtitle.length > 1)
PrintHighlightDescription(pgtitle);
else
PrintHighlightDescription(pgurl);
document.writeln("</a></div>");
document.writeln("<div class=\"recommend_description\">")
PrintHighlightDescription(pgdesc);
document.writeln("</div>");
document.writeln("<div class=\"recommend_infoline\">" + pgurl + "</div>");
document.writeln("</div>");
num_recs_found++;
break;
}
}
}
}
if (num_recs_found > 0)
document.writeln("</div");
}
// Show sorting options
if (matches > 1)
{
if (UseDateTime == 1)
{
document.writeln("<div class=\"sorting\">");
if (sort == 1)
document.writeln("<a href=\"" + SelfURL + "?zoom_query=" + queryForURL + "&zoom_page=" + page + "&zoom_per_page=" + per_page + query_zoom_cats + "&zoom_and=" + andq + "&zoom_sort=0\">" + STR_SORTBY_RELEVANCE + "</a> / <b>" + STR_SORTEDBY_DATE + "</b>");
else
document.writeln("<b>" + STR_SORTEDBY_RELEVANCE + "</b> / <a href=\"" + SelfURL + "?zoom_query=" + queryForURL + "&zoom_page=" + page + "&zoom_per_page=" + per_page + query_zoom_cats + "&zoom_and=" + andq + "&zoom_sort=1\">" + STR_SORTBY_DATE + "</a>");
document.writeln("</div>");
}
}
// determine current line of result from the output array
if (page == 1) {
arrayline = 0;
} else {
arrayline = ((page - 1) * per_page);
}
// the last result to show on this page
result_limit = arrayline + per_page;
// display the results
while (arrayline < matches && arrayline < result_limit) {
ipage = output[arrayline][0];
score = output[arrayline][1];
pgurl = pagedata[ipage][PAGEDATA_URL];
pgtitle = pagedata[ipage][PAGEDATA_TITLE];
pgdesc = pagedata[ipage][PAGEDATA_DESC];
pgimage = pagedata[ipage][PAGEDATA_IMG];
pgdate = pageinfo[ipage][PAGEINFO_DATETIME];
filesize = pageinfo[ipage][PAGEINFO_FILESIZE];
filesize = Math.ceil(filesize / 1024);
if (filesize < 1)
filesize = 1;
catpage = pageinfo[ipage][PAGEINFO_CAT];
urlLink = pgurl;
if (GotoHighlight == 1)
{
if (SearchAsSubstring == 1)
urlLink = AddParamToURL(urlLink, "zoom_highlightsub=" + queryForURL);
else
urlLink = AddParamToURL(urlLink, "zoom_highlight=" + queryForURL);
}
if (PdfHighlight == 1)
{
if (urlLink.indexOf(".pdf") != -1)
urlLink = urlLink+"#search=""+query+""";
}
if (arrayline % 2 == 0)
document.writeln("<div class=\"result_block\">");
else
document.writeln("<div class=\"result_altblock\">");
if (UseZoomImage == 1)
{
if (pgimage.length > 1)
{
document.writeln("<div class=\"result_image\">");
document.writeln("<a href=\"" + urlLink + "\"" + target + "><img src=\"" + pgimage + "\" class=\"result_image\"></a>");
document.writeln("</div>");
}
}
document.writeln("<div class=\"result_title\">");
if (DisplayNumber == 1)
document.writeln("<b>" + (arrayline+1) + ".</b> ");
if (DisplayTitle == 1)
{
document.writeln("<a href=\"" + urlLink + "\"" + target + ">");
PrintHighlightDescription(pgtitle);
document.writeln("</a>");
}
else
document.writeln("<a href=\"" + urlLink + "\"" + target + ">" + pgurl + "</a>");
if (UseCats)
{
document.write("<span class=\"category\">");
for (cati = 0; cati < NumCats; cati++)
{
if (catpage.charAt(cati) == "1")
document.write(" ["+catnames[cati]+"]");
}
document.writeln("</span>");
}
document.writeln("</div>");
if (DisplayMetaDesc == 1)
{
// print meta description
document.writeln("<div class=\"description\">");
PrintHighlightDescription(pgdesc);
document.writeln("</div>\n");
}
info_str = "";
if (DisplayTerms == 1)
info_str += STR_RESULT_TERMS_MATCHED + " " + output[arrayline][2];
if (DisplayScore == 1) {
if (info_str.length > 0)
info_str += " - ";
info_str += STR_RESULT_SCORE + " " + score;
}
if (DisplayDate == 1 && pgdate > 0)
{
datetime = new Date(pgdate*1000);
if (info_str.length > 0)
info_str += " - ";
info_str += datetime.getDate() + " " + months[datetime.getMonth()] + " " + datetime.getFullYear();
}
if (DisplayFilesize == 1) {
if (info_str.length > 0)
info_str += " - ";
info_str += filesize + "k";
}
if (DisplayURL == 1) {
if (info_str.length > 0)
info_str += " - ";
info_str += STR_RESULT_URL + " " + pgurl;
}
document.writeln("<div class=\"infoline\">");
document.writeln(info_str);
document.writeln("</div></div>\n");
arrayline++;
}
// Show links to other result pages
if (num_pages > 1) {
// 10 results to the left of the current page
start_range = page - 10;
if (start_range < 1)
start_range = 1;
// 10 to the right
end_range = page + 10;
if (end_range > num_pages)
end_range = num_pages;
document.writeln("<div class=\"result_pages\">" + STR_RESULT_PAGES + " ");
if (page > 1)
document.writeln("<a href=\"" + SelfURL + "?zoom_query=" + queryForURL + "&zoom_page=" + (page-1) + "&zoom_per_page=" + per_page + query_zoom_cats + "&zoom_and=" + andq + "&zoom_sort=" + sort + "\"><< " + STR_RESULT_PAGES_PREVIOUS + "</a> ");
for (i = start_range; i <= end_range; i++)
{
if (i == page)
document.writeln(page + " ");
else
document.writeln("<a href=\"" + SelfURL + "?zoom_query=" + queryForURL + "&zoom_page=" + i + "&zoom_per_page=" + per_page + query_zoom_cats + "&zoom_and=" + andq + "&zoom_sort=" + sort + "\">" + i + "</a> ");
}
if (page != num_pages)
document.writeln("<a href=\"" + SelfURL + "?zoom_query=" + queryForURL + "&zoom_page=" + (page+1) + "&zoom_per_page=" + per_page + query_zoom_cats + "&zoom_and=" + andq + "&zoom_sort=" + sort + "\">" + STR_RESULT_PAGES_NEXT + " >></a> ");
document.writeln("</div>");
}
document.writeln("</div>"); // end results style tag
if (Timing == 1) {
timeEnd = new Date();
timeDifference = timeEnd - timeStart;
document.writeln("<div class=\"searchtime\"><br /><br />" + STR_SEARCH_TOOK + " " + (timeDifference/1000) + " " + STR_SECONDS + ".</div>\n");
}
if (ZoomInfo == 1)
document.writeln("<center><p><small>" + STR_POWEREDBY + " <a href=\"http://www.wrensoft.com/zoom/\" target=\"_blank\"><b>Zoom Search Engine</b></a></small></p></center>");
}