// ---------------------------------------------------------------------------- // Zoom Search Engine 7.0 (14/Jan/2014) // // 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-2014 // // 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(""); else document.writeln(""); } document.write(""); // ---------------------------------------------------------------------------- // 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 CatCounter = new Array(); var CatCounterFilled = 0; 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_BOOST = 2; var PAGEINFO_FILETYPE = 3; var PAGEINFO_CAT = 4; var PAGEINFO_METAFIRST = 5; var METAFIELD_TYPE = 0; var METAFIELD_NAME = 1; var METAFIELD_SHOW = 2; var METAFIELD_FORM = 3; var METAFIELD_METHOD = 4; var METAFIELD_DROPDOWN = 5; var METAFIELD_TYPE_NUMERIC = 0; var METAFIELD_TYPE_TEXT = 1; var METAFIELD_TYPE_DROPDOWN = 2; var METAFIELD_TYPE_MULTI = 3; var METAFIELD_TYPE_MONEY = 4; var METAFIELD_METHOD_EXACT = 0; var METAFIELD_METHOD_LESSTHAN = 1; var METAFIELD_METHOD_LESSTHANORE = 2; var METAFIELD_METHOD_GREATERTHAN = 3; var METAFIELD_METHOD_GREATERTHANORE = 4; var METAFIELD_METHOD_SUBSTRING = 5; // ---------------------------------------------------------------------------- // 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 (paramName == "zoom_query") arg_values[1] = arg_values[1].replace(/[\+]/g, " "); // replace the '+' with spaces 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 getParamArrayInt(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 if (isNaN(ret) == false) { 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 SortByDateAsc(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 < NumSearchWords; 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 'ed text. res = res.replace(/\[;:\]/g, ""); res = res.replace(/\[:;\]/g, ""); 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 RecLinkAddParamToURL(url, paramStr) { // add GET parameters to URL depending on // whether there are any existing parameters if (url.indexOf("?") > -1) return url + "&" + paramStr; else { hashPos = url.indexOf("#"); if (hashPos > -1) return url.substr(0, hashPos) + "?" + paramStr + url.substr(hashPos); else return url + "?" + paramStr; } } 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 += "\"" + searchWords[sw] + "\""; searchWords[sw] = ""; SkippedWords++; } } 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, "'"); return query; } function QueryEntities(query) { 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; } function GetMetaValues(pagenum, fieldnum) { return pageinfo[pagenum][PAGEINFO_METAFIRST+fieldnum]; } // ---------------------------------------------------------------------------- // Parameters initialisation (globals) // ---------------------------------------------------------------------------- var query = getParam("zoom_query"); SearchAsSubstring = (query == query.replace(/[\"+]/g, " ")); query = query.replace(/[\"]/g, " "); var IsZoomQuery = 0; if (query.length == 0) { if (document.location.search.indexOf("zoom_query") != -1) IsZoomQuery = 1; } var per_page = parseInt(getParam("zoom_per_page")); if (isNaN(per_page)) per_page = 10; if (per_page < 1) per_page = 1; 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 = getParamArrayInt("zoom_cat[]"); if (cat.length == 0) { cat[0] = parseInt(getParam("zoom_cat")); if (isNaN(cat[0])) cat[0] = -1; // search all categories } var num_zoom_cats = cat.length; var meta_query = new Array(); if (UseMetaFields == 1) { for (fieldnum = 0; fieldnum < NumMetaFields; fieldnum++) { if (metafields[fieldnum][METAFIELD_TYPE] == METAFIELD_TYPE_NUMERIC || metafields[fieldnum][METAFIELD_TYPE] == METAFIELD_TYPE_MONEY) { meta_query[fieldnum] = parseInt(getParam(metafields[fieldnum][METAFIELD_NAME])); if (isNaN(meta_query[fieldnum])) meta_query[fieldnum] = ""; } else if (metafields[fieldnum][METAFIELD_TYPE] == METAFIELD_TYPE_TEXT) { meta_query[fieldnum] = getParam(metafields[fieldnum][METAFIELD_NAME]); meta_query[fieldnum] = meta_query[fieldnum].replace(/[\+]/g, " "); // replace the '+' with spaces } else if (metafields[fieldnum][METAFIELD_TYPE] == METAFIELD_TYPE_MULTI) { var mqarray = new Array(); mqarray = getParamArrayInt(metafields[fieldnum][METAFIELD_NAME]+"[]"); if (mqarray.length == 0) { mqarray[0] = parseInt(getParam(metafields[fieldnum][METAFIELD_NAME])); if (isNaN(mqarray[0])) mqarray[0] = -1; } meta_query[fieldnum] = mqarray; } else meta_query[fieldnum] = getParam(metafields[fieldnum][METAFIELD_NAME]); } } // 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 = DefaultSort; // date range var date_from = ""; var date_to = ""; if (DateRangeSearch == 1) { date_from = getParam("zoom_datefrom"); date_to = getParam("zoom_dateto"); } var SelfURL = ""; var LinkBackJoinChar = "?"; 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; } if (SelfURL.indexOf("?") != -1) LinkBackJoinChar = "&"; // encode invalid URL characters SelfURL = SelfURL.replace(/\ 0) { for (dci = 0; dci < DictArrayCount; dci++) eval("dictwords = dictwords.concat(dictwords"+dci+");"); } if (PageInfoArrayCount > 0) { for (dci = 0; dci < PageInfoArrayCount; dci++) eval("pageinfo = pageinfo.concat(pageinfo"+dci+");"); } if (PageDataArrayCount > 0) { for (dci = 0; dci < PageDataArrayCount; dci++) eval("pagedata = pagedata.concat(pagedata"+dci+");"); } // Join splitted up arrays if necessary if (DictArrayCount > 0) { for (dci = 0; dci < DictArrayCount; dci++) dictwords = dictwords.concat(window["dictwords"+dci]); } if (PageInfoArrayCount > 0) { for (dci = 0; dci < PageInfoArrayCount; dci++) pageinfo = pageinfo.concat(window["pageinfo"+dci]); } if (PageDataArrayCount > 0) { for (dci = 0; dci < PageDataArrayCount; dci++) pagedata = pagedata.concat(window["pagedata"+dci]); } searchUrlBuffer = ""; // Begin searching... for (sw = 0; sw < NumSearchWords; sw++) { if (searchWords[sw] == "") { continue; } if (searchWords[sw].charAt(0) == '-') { searchWords[sw] = searchWords[sw].substr(1); ExcludeTerm = 1; exclude_count++; } colonPos = 0; if ((colonPos = searchWords[sw].indexOf(":")) > -1) { if (searchWords[sw].toLowerCase().indexOf("site:") != -1 || searchWords[sw].toLowerCase().indexOf("url:") != -1) { searchUrlBuffer = searchWords[sw].substring(colonPos+1); exclude_count++; if (NumSearchWords == 1) { IsNoKeywordQuery = true; continue; } } } 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 += 3) { // check if page is already in output list pageexists = 0; ipage = data[kw]; score = parseInt(data[kw+1]); prox = parseInt(data[kw+2]); if (pageinfo[ipage][PAGEINFO_BOOST] != 0) { score *= (pageinfo[ipage][PAGEINFO_BOOST] / 10); score = Math.floor(score + 0.5); } 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] = score; res_table[ipage][3] = prox; } 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] += score; // add in score //res_table[ipage][0] *= 2; // double score as we have two words matching } res_table[ipage][3] &= prox; } 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 } } } // Count number of output lines that match ALL search terms oline = 0; fullmatches = 0; output = new Array(); if (UseCats == 1 && DisplayCatSummary == 1) { if (cat[0] == -1 || num_zoom_cats > 1) { for (cati = 0; cati < NumCats; cati++) CatCounter[cati] = 0; } else DisplayCatSummary = 0; } var UseDateRange = false; if (DateRangeSearch == 1) { if (date_from.length > 0 && date_to.length > 0) { var fromArray = date_from.split("/"); var toArray = date_to.split("/"); if (fromArray.length == 3 && toArray.length == 3) { var tmpFromDate, tmpToDate; if (DateRangeFormat == 1) { tmpFromDate = new Date(fromArray[2], fromArray[0]-1, fromArray[1], 0, 0, 0, 0); tmpToDate = new Date(toArray[2], toArray[0]-1, toArray[1], 23, 59, 59, 59); } else { tmpFromDate = new Date(fromArray[2], fromArray[1]-1, fromArray[0], 0 , 0, 0, 0); tmpToDate = new Date(toArray[2], toArray[1]-1, toArray[0], 23, 59, 59, 999); } var from_datetime = tmpFromDate.getTime()/1000; var to_datetime = tmpToDate.getTime()/1000; if (from_datetime >= 0 && to_datetime > 0) { UseDateRange = true; dateRangeParams = "&zoom_datefrom=" + htmlspecialchars(date_from) + "&zoom_dateto=" + htmlspecialchars(date_to); } } } } var IsAnyDropdown = false; var full_numwords = NumSearchWords - SkippedWords - exclude_count; for (i = 0; i < pageinfo.length; i++) { IsFiltered = false; if (res_table[i][0] > 0 || IsNoKeywordQuery) { if (IsFiltered == false && searchUrlBuffer != "") { pgurl = pagedata[i][PAGEDATA_URL]; if (pgurl.toLowerCase().indexOf(searchUrlBuffer) == -1) IsFiltered = true; else { // the site/URL matched with the site: parameter if (IsNoKeywordQuery) { // increment score/terms if we're allowing this through on site: match alone res_table[i][0]++; res_table[i][1]++; } } } if (UseMetaFields && IsFiltered == false) { for (fieldnum = 0; fieldnum < NumMetaFields && !IsFiltered; fieldnum++) { IsAnyDropdown = false; if (metafields[fieldnum][METAFIELD_TYPE] == METAFIELD_TYPE_DROPDOWN || metafields[fieldnum][METAFIELD_TYPE] == METAFIELD_TYPE_MULTI) { if (meta_query[fieldnum] == -1) IsAnyDropdown = true; } if (meta_query[fieldnum] !== "" && IsAnyDropdown == false) { if (GetMetaValues(i, fieldnum) == null) IsFiltered = true; else if (metafields[fieldnum][METAFIELD_TYPE] == METAFIELD_TYPE_TEXT) { if (metafields[fieldnum][METAFIELD_METHOD] == METAFIELD_METHOD_SUBSTRING) { if (GetMetaValues(i, fieldnum).toLowerCase().indexOf(meta_query[fieldnum].toLowerCase()) == -1) IsFiltered = true; } else { if (wordcasecmp(GetMetaValues(i, fieldnum).toLowerCase(), meta_query[fieldnum].toLowerCase()) == -1) IsFiltered = true; } } else if (metafields[fieldnum][METAFIELD_TYPE] == METAFIELD_TYPE_DROPDOWN) { if (GetMetaValues(i, fieldnum) != meta_query[fieldnum]) IsFiltered = true; } else if (metafields[fieldnum][METAFIELD_TYPE] == METAFIELD_TYPE_MULTI) { IsFiltered = true; var metaVal = GetMetaValues(i, fieldnum); if (metaVal.length > 0) { for (mqi = 0; mqi < meta_query[fieldnum].length && IsFiltered; mqi++) { for (mvi = 0; mvi < metaVal.length; mvi++) { if (metaVal[mvi] == meta_query[fieldnum][mqi]) { IsFiltered = false; break; } } } } } else { var tmpQueryVal = meta_query[fieldnum]; // we do this here to avoid changing meta_query for displaying if (UseMetaFields == 1 && MetaMoneyShowDec == 1 && metafields[fieldnum][METAFIELD_TYPE] == METAFIELD_TYPE_MONEY) tmpQueryVal = tmpQueryVal * 100; // numeric comparison here if (metafields[fieldnum][METAFIELD_METHOD] == METAFIELD_METHOD_LESSTHAN) { bRet = GetMetaValues(i, fieldnum) < tmpQueryVal; } else if (metafields[fieldnum][METAFIELD_METHOD] == METAFIELD_METHOD_LESSTHANORE) { bRet = GetMetaValues(i, fieldnum) <= tmpQueryVal; } else if (metafields[fieldnum][METAFIELD_METHOD] == METAFIELD_METHOD_GREATERTHAN) { bRet = GetMetaValues(i, fieldnum) > tmpQueryVal; } else if (metafields[fieldnum][METAFIELD_METHOD] == METAFIELD_METHOD_GREATERTHANORE) { bRet = GetMetaValues(i, fieldnum) >= tmpQueryVal; } else { // exact match bRet = GetMetaValues(i, fieldnum) == tmpQueryVal; } if (bRet == false) IsFiltered = true; } } } // only add to res_table if empty query! if (IsNoKeywordQuery == true && IsFiltered == false) { res_table[i][0]++; res_table[i][1]++; } } if (IsFiltered == false) { if (res_table[i][2] < full_numwords && andq == 1) IsFiltered = true; } if (UseCats && cat[0] != -1 && IsFiltered == false) { // using cats and not doing an "all cats" search if (SearchMultiCats) { var bFoundCat = false; for (cati = 0; cati < num_zoom_cats; cati++) { if (pageinfo[i][PAGEINFO_CAT].charAt(cat[cati]) == "1") { if (DisplayCatSummary == 1) { CatCounter[cat[cati]]++; CatCounterFilled = 1; } bFoundCat = true; } } if (bFoundCat == false) IsFiltered = true; } else { if (pageinfo[i][PAGEINFO_CAT].charAt(cat[0]) == "0") { IsFiltered = true; } } } if (IsFiltered == false && DateRangeSearch == 1 && UseDateRange == true) { if (pageinfo[i][PAGEINFO_DATETIME] < from_datetime) IsFiltered = true; else if (pageinfo[i][PAGEINFO_DATETIME] > to_datetime) IsFiltered = true; } if (IsFiltered == false) { if (res_table[i][2] >= full_numwords) fullmatches++; // copy if not filtered out output[oline] = new Array(3); output[oline][0] = i; // determine final score baseScale = 1.3; finalScale = ((res_table[i][3] / 255) * 1.7) + baseScale; if (res_table[i][1] > 1) { if (res_table[i][1] <= 10) finalScale = Math.pow(finalScale, res_table[i][1]-1); else { finalScale = Math.pow(finalScale, 10); finalScale += res_table[i][1] - 10; } } if (UseCats == 1 && DisplayCatSummary == 1 && cat[0] == -1) { // if we are doing an All category search AND we're showing cat summary if (pageinfo[i][PAGEINFO_CAT] != null) { for (cati = 0; cati < NumCats; cati++) { if (pageinfo[i][PAGEINFO_CAT].charAt(cati) == "1") { CatCounter[cati]++; CatCounterFilled = 1; } } } } output[oline][1] = Math.floor(res_table[i][0] * finalScale + 0.5); output[oline][2] = res_table[i][1]; oline++; } } } matches = oline; // Sort results in order of score, use "SortCompare" function if (matches > 1) { if (UseDateTime == 1 && sort == 1) output.sort(SortByDate); // sort by date else if (UseDateTime == 1 && sort == 2) output.sort(SortByDateAsc); // sort by date ascending else output.sort(SortCompare); // sort by relevance } // prepare queryForURL if (UseUTF8 == 1 && self.encodeURIComponent) { queryForURL = encodeURIComponent(query); queryForURL = queryForURL.replace(/%20/g, "+"); } else { queryForURL = query.replace(/\s/g, "+"); queryForURL = escape(queryForURL); } metaParams = ""; if (UseMetaFields == 1) { for (fieldnum = 0; fieldnum < NumMetaFields; fieldnum++) { if (meta_query[fieldnum] != "") metaParams = metaParams+"&"+metafields[fieldnum][METAFIELD_NAME]+"="+meta_query[fieldnum]; } } if (Timing == 1) { timeEnd = new Date(); timeDifference = timeEnd - timeStart; } // number of pages of results num_pages = Math.ceil(matches / per_page); } function ZoomShowFormStart() { document.writeln("
"); } function ZoomShowSearchBox() { document.writeln(""); } function ZoomShowSearchButton() { document.writeln("
"); } function ZoomShowResultsPerPage() { document.writeln("" + STR_FORM_RESULTS_PER_PAGE + "\n"); document.writeln("

"); } function ZoomShowCategories() { if (UseCats) { document.writeln(""); document.write(STR_FORM_CATEGORY + " "); if (SearchMultiCats) { document.writeln("
    "); document.write("
  • " + STR_FORM_CATEGORY_ALL + "
  • "); for (i = 0; i < NumCats; i++) { document.write("
  • "+catnames[i]+"
  • "); } document.writeln("


"); } else { document.write("  "); } document.writeln("
"); } } function ZoomShowMetaFields() { if (UseMetaFields) { document.writeln(""); for (fieldnum = 0; fieldnum < NumMetaFields; fieldnum++) { if (metafields[fieldnum][METAFIELD_TYPE] == METAFIELD_TYPE_NUMERIC) document.writeln(metafields[fieldnum][METAFIELD_FORM] + ": \n"); else if (metafields[fieldnum][METAFIELD_TYPE] == METAFIELD_TYPE_DROPDOWN) { document.writeln(metafields[fieldnum][METAFIELD_FORM] + ": \n"); } else if (metafields[fieldnum][METAFIELD_TYPE] == METAFIELD_TYPE_MULTI) { document.writeln(metafields[fieldnum][METAFIELD_FORM] + ": \n"); } else if (metafields[fieldnum][METAFIELD_TYPE] == METAFIELD_TYPE_MONEY) { document.writeln(metafields[fieldnum][METAFIELD_FORM] + ": " + MetaMoneyCurrency + "\n"); } else document.writeln(metafields[fieldnum][METAFIELD_FORM] + ": \n"); } document.writeln("\n"); } } function ZoomShowMatchOptions() { document.writeln("" + STR_FORM_MATCH + " "); if (andq == 0) { document.writeln(""); document.writeln(""; } else { document.writeln(""); document.writeln(""); } document.writeln("

"); } function ZoomShowDateRange() { if (DateRangeSearch == 1) { document.writeln(""); if (DateRangeFormat == 1) dateformatStr = "mdy"; else dateformatStr = "dmy"; document.writeln(STR_FORM_DATE_FROM + " "); document.writeln(STR_FORM_DATE_TO + " "); document.writeln(""); } } function ZoomShowFormEnd() { document.writeln(""); if (FormFormat != 2) { document.writeln(""); document.writeln(""); } document.writeln("
"); } function ZoomShowSearchForm() { if (InitSearchCalled == false) { if (IsWarningGiven == false) document.writeln("
This is an advanced template option. You must call ZoomInitSearch() before this. Please check documentation for more help.
"); IsWarningGiven = true; return; } // Display the form if (FormFormat > 0) { ZoomShowFormStart(); ZoomShowSearchBox(); ZoomShowSearchButton(); if (FormFormat == 2) { ZoomShowResultsPerPage(); ZoomShowMatchOptions(); ZoomShowDateRange(); ZoomShowCategories(); ZoomShowMetaFields(); } ZoomShowFormEnd(); } } function ZoomShowHeading() { if (InitSearchCalled == false) { if (IsWarningGiven == false) document.writeln("
This is an advanced template option. You must call ZoomInitSearch() before this. Please check documentation for more help.
"); IsWarningGiven = true; return; } if (IsNoSearch) return; document.write("
" + 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("

"); } function ZoomShowResults() { if (InitSearchCalled == false) { if (IsWarningGiven == false) document.writeln("
This is an advanced template option. You must call ZoomInitSearch() before this. Please check documentation for more help.
"); IsWarningGiven = true; return; } if (IsNoSearch) { if (ZoomInfo == 1) document.writeln("

" + STR_POWEREDBY + " Zoom Search Engine

"); return; } document.writeln("
"); // 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]; 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.toLowerCase().indexOf(".pdf") != -1) urlLink = urlLink+"#search=%22"+query+"%22"; } if (arrayline % 2 == 0) document.writeln("
"); else document.writeln("
"); if (PluginOpenNewWindow == 1 && pageinfo[ipage][PAGEINFO_FILETYPE] >= FileTypePluginStart) target = " target=\"_blank\""; else target = zoom_target; if (UseZoomImage == 1) { if (pgimage.length > 1) { document.writeln("
"); document.writeln("\"\""); document.writeln("
"); } } document.writeln("
"); if (DisplayNumber == 1) document.writeln("" + (arrayline+1) + ". "); if (DisplayTitle == 1) { document.writeln(""); PrintHighlightDescription(pgtitle); document.writeln(""); } else document.writeln("" + pgurl + ""); if (UseCats) { catpage = pageinfo[ipage][PAGEINFO_CAT]; document.write(""); for (cati = 0; cati < NumCats; cati++) { if (catpage.charAt(cati) == "1") document.write(" ["+catnames[cati]+"]"); } document.writeln(""); } document.writeln("
"); if (UseMetaFields == 1 && DisplayMetaFields == 1) { var cssFieldName, cssValueName; for (fieldnum = 0; fieldnum < NumMetaFields; fieldnum++) { cssFieldName = "result_metaname_" + metafields[fieldnum][METAFIELD_NAME]; cssValueName = "result_metavalue_" + metafields[fieldnum][METAFIELD_NAME]; if (GetMetaValues(ipage, fieldnum) != null) { if (metafields[fieldnum][METAFIELD_TYPE] == METAFIELD_TYPE_DROPDOWN) { document.writeln("
"); document.writeln(""+metafields[fieldnum][METAFIELD_SHOW]+": "); document.write(""); var ddi = GetMetaValues(ipage, fieldnum); document.writeln(metafields[fieldnum][METAFIELD_DROPDOWN][ddi]+"
"); } else if (metafields[fieldnum][METAFIELD_TYPE] == METAFIELD_TYPE_MULTI) { var metaVal = GetMetaValues(ipage,fieldnum); if (metaVal.length > 0) { document.writeln("
"); document.writeln(""+metafields[fieldnum][METAFIELD_SHOW]+": "); document.write(""); var ddarray = metafields[fieldnum][METAFIELD_DROPDOWN]; for (mvi = 0; mvi < metaVal.length; mvi++) { if (mvi > 0) document.write(", "); document.write(ddarray[metaVal[mvi]]); } document.write("
"); } } else if (metafields[fieldnum][METAFIELD_TYPE] == METAFIELD_TYPE_MONEY) { document.writeln("
"); document.writeln(""+metafields[fieldnum][METAFIELD_SHOW]+": "); var tmpMoneyStr = ""; if (MetaMoneyShowDec == 1) tmpMoneyStr = (GetMetaValues(ipage, fieldnum)/100).toFixed(2); else tmpMoneyStr = GetMetaValues(ipage, fieldnum); document.writeln(""+MetaMoneyCurrency+tmpMoneyStr+"
"); } else { document.writeln("
"); document.writeln(""+metafields[fieldnum][METAFIELD_SHOW]+": "); document.writeln(""+GetMetaValues(ipage, fieldnum)+"
"); } } } } if (DisplayMetaDesc == 1) { // print meta description document.writeln("
"); PrintHighlightDescription(pgdesc); document.writeln("
\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 = pageinfo[ipage][PAGEINFO_DATETIME]; if (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) { filesize = pageinfo[ipage][PAGEINFO_FILESIZE]; filesize = Math.ceil(filesize / 1024); if (filesize < 1) filesize = 1; if (info_str.length > 0) info_str += "  -  "; info_str += filesize + "k"; } if (DisplayURL == 1) { if (info_str.length > 0) info_str += "  -  "; if (TruncateShowURL > 0) { if (pgurl.length > TruncateShowURL) pgurl = pgurl.substr(0, TruncateShowURL) + "..."; } info_str += STR_RESULT_URL + " " + pgurl; } document.writeln("
"); document.writeln(info_str); document.writeln("
\n"); arrayline++; } document.writeln("
"); // end results style tag } function ZoomShowSummary() { if (InitSearchCalled == false) { if (IsWarningGiven == false) document.writeln("
This is an advanced template option. You must call ZoomInitSearch() before this. Please check documentation for more help.
"); IsWarningGiven = true; return; } if (IsNoSearch) return; if (SkippedWords > 0) document.writeln("
" + STR_SKIPPED_FOLLOWING_WORDS + " " + SkippedOutputStr + ".

"); //Display search result information document.writeln("
"); if (matches == 0) document.writeln(STR_SUMMARY_NO_RESULTS_FOUND + "
"); else if (NumSearchWords > 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("
"); } else if (NumSearchWords > 1 && andq == 1) //AND document.writeln(PrintNumResults(fullmatches) + " " + STR_SUMMARY_FOUND_CONTAINING_ALL_TERMS + "
"); else document.writeln(PrintNumResults(matches) + " " + STR_SUMMARY_FOUND + "
"); document.writeln("
\n"); } function ZoomShowCatSummary() { if (UseCats == 0 || DisplayCatSummary == 0 || CatCounterFilled == 0) return; if (InitSearchCalled == false) { if (IsWarningGiven == false) document.writeln("
This is an advanced template option. You must call ZoomInitSearch() before this. Please check documentation for more help.
"); IsWarningGiven = true; return; } if (IsNoSearch) return; var ShowCatSummaryHeading = true; var CatSummaryShown = false; for (catit = 0; catit < NumCats; catit++) { if (CatCounter[catit] > 0) { // if all the results found belonged to this one category, then we don't show a cat summary at all if (CatCounter[catit] != matches) { if (ShowCatSummaryHeading == true) { document.writeln("

" + STR_CAT_SUMMARY + "
    "); ShowCatSummaryHeading = false; CatSummaryShown = true; } document.writeln("
  • " + catnames[catit]); document.writeln(" (" + CatCounter[catit] + ")
  • "); } } } if (DisplayCatSummary == 1 && CatSummaryShown == true) document.writeln("
"); } function ZoomShowPagesCount() { if (InitSearchCalled == false) { if (IsWarningGiven == false) document.writeln("
This is an advanced template option. You must call ZoomInitSearch() before this. Please check documentation for more help.
"); IsWarningGiven = true; return; } if (IsNoSearch) return; if (num_pages > 1) document.writeln("

" + num_pages + " " + STR_PAGES_OF_RESULTS + "
\n"); } var LastRecLinkIdx = 0; function RecLinkWordMatch(rec_word, rec_idx) { var bRecLinkFound = false; if (LastRecLinkIdx == rec_idx) return false; for (sw = 0; sw <= NumSearchWords; sw++) { if (sw == NumSearchWords) { 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 (rec_word.indexOf("*") != -1 || rec_word.indexOf("?") != -1) { var RecWordRegExp = "^" + pattern2regexp(rec_word) + "$"; re = new RegExp(RecWordRegExp, "g"); match_result = searchWords[sw].search(re); } } } if (match_result != -1) { bRecLinkFound = true; if (num_recs_found == 0) { document.writeln("
"); document.writeln("
" + STR_RECOMMENDED + "
"); } LastRecLinkIdx = rec_idx; pgurl = pagedata[rec_idx][PAGEDATA_URL]; pgtitle = pagedata[rec_idx][PAGEDATA_TITLE]; pgdesc = pagedata[rec_idx][PAGEDATA_DESC]; pgimage = pagedata[rec_idx][PAGEDATA_IMG]; urlLink = pgurl; if (GotoHighlight == 1) { if (SearchAsSubstring == 1) urlLink = RecLinkAddParamToURL(urlLink, "zoom_highlightsub=" + queryForURL); else urlLink = RecLinkAddParamToURL(urlLink, "zoom_highlight=" + queryForURL); } if (PdfHighlight == 1) { if (urlLink.toLowerCase().indexOf(".pdf") != -1) urlLink = urlLink+"#search=%22"+query+"%22"; } document.writeln("
"); if (UseZoomImage == 1) { if (pgimage.length > 1) { document.writeln("
"); document.writeln("\"\""); document.writeln("
"); } } document.writeln(""); document.writeln("
") PrintHighlightDescription(pgdesc); document.writeln("
"); document.writeln("
" + pgurl + "
"); document.writeln("
"); num_recs_found++; break; } } return bRecLinkFound; } function ZoomShowRecommended() { if (InitSearchCalled == false) { if (IsWarningGiven == false) document.writeln("
This is an advanced template option. You must call ZoomInitSearch() before this. Please check documentation for more help.
"); IsWarningGiven = true; return; } if (IsNoSearch) return; // 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)); if (rec_word.indexOf(",") != -1) { rec_multiwords = rec_word.split(","); for (rlm = 0; rlm < rec_multiwords.length; rlm++) { if (RecLinkWordMatch(rec_multiwords[rlm], rec_idx)) break; } } else RecLinkWordMatch(rec_word, rec_idx); } } if (num_recs_found > 0) document.writeln("
"); } } function ZoomShowSorting() { if (InitSearchCalled == false) { if (IsWarningGiven == false) document.writeln("
This is an advanced template option. You must call ZoomInitSearch() before this. Please check documentation for more help.
"); IsWarningGiven = true; return; } if (IsNoSearch) return; // Show sorting options if (matches > 1) { if (UseDateTime == 1) { document.writeln("
"); if (sort == 1) document.writeln("" + STR_SORTBY_RELEVANCE + " / " + STR_SORTEDBY_DATE + ""); else if (sort == 2) document.writeln("" + STR_SORTBY_RELEVANCE + " / " + STR_SORTEDBY_DATE_ASC + ""); else document.writeln("" + STR_SORTEDBY_RELEVANCE + " / " + STR_SORTBY_DATE + ""); document.writeln("
"); } } } function ZoomShowPageNumbers() { if (InitSearchCalled == false) { if (IsWarningGiven == false) document.writeln("
This is an advanced template option. You must call ZoomInitSearch() before this. Please check documentation for more help.
"); IsWarningGiven = true; return; } if (IsNoSearch) return; // 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("
" + STR_RESULT_PAGES + " "); if (page > 1) document.writeln("<< " + STR_RESULT_PAGES_PREVIOUS + " "); for (i = start_range; i <= end_range; i++) { if (i == page) document.writeln(page + " "); else document.writeln("" + i + " "); } if (page != num_pages) document.writeln("" + STR_RESULT_PAGES_NEXT + " >> "); document.writeln("
"); } if (ZoomInfo == 1) document.writeln("

" + STR_POWEREDBY + " Zoom Search Engine

"); } function ZoomShowSearchTime() { if (InitSearchCalled == false) { if (IsWarningGiven == false) document.writeln("
This is an advanced template option. You must call ZoomInitSearch() before this. Please check documentation for more help.
"); IsWarningGiven = true; return; } if (IsNoSearch) return; if (Timing == 1) document.writeln("


" + STR_SEARCH_TOOK + " " + (timeDifference/1000) + " " + STR_SECONDS + ".
\n"); } // This is the default function and it's all you need to call for the normal result format function ZoomSearch() { var loadingmsg = document.getElementById("loadingmsg"); if (loadingmsg) loadingmsg.style.display = "None"; ZoomInitSearch(); ZoomShowSearchForm(); ZoomShowHeading(); ZoomShowSummary(); ZoomShowCatSummary(); ZoomShowPagesCount(); ZoomShowRecommended(); ZoomShowSorting(); ZoomShowResults(); ZoomShowPageNumbers(); ZoomShowSearchTime(); }