Помогите исправить скрипт по поиску в базе данных
Есть скрипт по поиску в базе данных но вот в чём проблема: когда идёт посик по базе )в ней существуют 4 группы ( так вот поиск должен отображать найденое по групам сначала 1 група потом 2 и так далее -а он собака отображает не по групам а по сходству с словом которое ищут!
// ====== global variables ======================
// array with search results
var results = new Array();
// search started flag
var isSearchStarted;
// Previouse search query, used to avoid search
// when getting back from some page
var prevQuery = "";
var keywords = new Array();
var currentKeywords = new Array();
var curKeywordIndex = -1;
var completionDiv;
// define browsers
var isIE = (navigator.userAgent.toLowerCase().indexOf("explorer") != -1) ||
(navigator.userAgent.toLowerCase().indexOf("msie") != -1); //document.all ? true : false;
var isOpera = navigator.userAgent.toLowerCase().indexOf('opera') != -1;
// This function will return the value of the spefcified GET parameter
function getParam(paramName){
var paramStr = document.location.search;
if (paramStr == "")
return "";
// remove '?' in front of paramStr
if (paramStr.charAt(0) == "?")
paramStr = paramStr.substr(1);
var arg = (paramStr.split("&"));
for (i=0; i < arg.length; i++) {
arg_values = arg[i].split("=")
if (unescape(arg_values[0]) == paramName)
{
if (USE_UTF8 == 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 "";
}
// fast string trim
function trim(str) {
str = str.replace(/^\s+/, '');
for (var i = str.length - 1; i >= 0; i--) {
if (/\S/.test(str.charAt(i))) {
str = str.substring(0, i + 1);
break;
}
}
return str;
}
// gets left coord of given element
function getLeft(element){
var curNode = element;
var left = 0;
do{
left += curNode.offsetLeft;
curNode = curNode.offsetParent;
}while(curNode.tagName.toLowerCase() != 'body');
return left;
}
// gets top coord of given element
function getTop(element){
var curNode = element;
var top = 0;
do{
top += curNode.offsetTop;
curNode = curNode.offsetParent;
}while(curNode.tagName.toLowerCase() != 'body');
return top;
}
// initialization of keywords list
function buildKeywords(){
// if first run
if(keywords.length == 0){
for(index in aData){
kw = aData[index][1].split(",");
for(i in kw){
keywords[trim(kw[i])] = 1;
}
keywords[trim[aData[index][3]]];
}
// create keywords div
completionDiv = document.createElement("div");
completionDiv.setAttribute("id", "keywords");
completionDiv.className = "keywords-block";
document.searchForm.appendChild(completionDiv);
hideKeywords();
}
}
function hideKeywords(){
completionDiv.style.visibility = "hidden";
curKeywordIndex = -1;
}
function completeText(index){
if(completionDiv.style.visibility == "visible" &&
index != -1)
{
var srch = document.searchForm.search;
srch.value = currentKeywords[index];
}
}
function buildKeywordsBlock(){
var hintText = "";
for(i = 0; i < currentKeywords.length; i++){
var kwClass = (i == curKeywordIndex) ?
"selected-keyword-item" : "keyword-item";
hintText += "<div class=\"" + kwClass + "\" onclick=\"completeText("+i+");\">" + currentKeywords[i] + "</div>"
}
completionDiv.innerHTML = hintText;
}
// KeyPressed event handler prevents form submit on Enter
function preventEnter(e){
if (isIE) e = window.event;
if ((e.keyCode == 13 || isOpera) &&
completionDiv.style.visibility == "visible") return false;
}
// Function which handles the keypress event
function processKeyDown(e){
if (isIE) e = window.event;
var keyCode = e.keyCode;
switch (keyCode) {
// Return/Enter
case 13:
if(completionDiv.style.visibility != "visible"){
submitform();
}else{
completeText(curKeywordIndex);
hideKeywords();
}
e.returnValue = false;
e.cancelBubble = true;
break;
// Escape
case 27:
hideKeywords();
e.returnValue = false;
e.cancelBubble = true;
break;
// Up arrow
case 38:
if(curKeywordIndex > 0) curKeywordIndex--;
buildKeywordsBlock();
return false;
// Tab
case 9:
hideKeywords();
return;
// Down arrow
case 40:
if(curKeywordIndex < currentKeywords.length - 1)
curKeywordIndex++;
buildKeywordsBlock();
return false;
}
}
// Function which handles the keyup event
function processKeyUp(e){
// Mozilla
if (isIE) e = window.event;
var keyCode = e.keyCode;
switch (keyCode) {
case 13:
completeText(curKeywordIndex);
hideKeywords();
e.returnValue = false;
e.cancelBubble = true;
break;
case 27:
hideKeywords();
e.returnValue = false;
e.cancelBubble = true;
break;
case 38:
case 40:
return false;
default:
showKeywords();
break;
}
}
// Shows completion block containing keywords
// that begins with entered text
function showKeywords(){
var srch = document.searchForm.search;
var userInput = document.searchForm.search.value;
if(trim(userInput) == ""){
hideKeywords();
}else{
var counter = 0;
var left = getLeft(srch);
var top = getTop(srch) + srch.offsetHeight;
var width = srch.offsetWidth;
currentKeywords = new Array();
for(word in keywords){
if(word.indexOf(userInput) == 0){
currentKeywords.push(word);
counter++;
}
if((MAX_KEYWORDS != -1) && (counter > MAX_KEYWORDS)) break;
}
if(currentKeywords.length > 0){
completionDiv.style.visibility = "visible";
}else{
hideKeywords();
}
buildKeywordsBlock();
// Lets position it
completionDiv.style.left = left + 'px';
completionDiv.style.top = top + 'px';
completionDiv.style.width = width + 'px';
completionDiv.style.zIndex = '99';
|
Вот продолжение
srch.parentNode.insertBefore(completionDiv, srch);
// Prevent select dropdowns showing thru
if (isIE) {
completionDiv.style.left = left + 10 + 'px';
completionDiv.style.top = top + 17 + 'px';
var iframe = document.createElement('iframe');
iframe.id = 'search_iframe';
iframe.style.position = 'absolute';
iframe.style.top = '0';
iframe.style.left = '0';
iframe.style.width = '0px';
iframe.style.height = '0px';
iframe.style.zIndex = '98';
iframe.style.visibility = 'hidden';
srch.parentNode.insertBefore(iframe, srch);
}
}
return true;
}
// Not used yet
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;
}
// Replaces special chars from query
function htmlspecialchars(query) {
query = query.replace(/\&/g, " ");
query = query.replace(/\</g, " ");
query = query.replace(/\>/g, " ");
query = query.replace(/\"/g, " ");
query = query.replace(/\'/g, " ");
query = query.replace(/\++/g, " ");
return query;
}
// Lets replace this long function
// with a smaller one
function print(text){
document.write(text);
}
// Form validation, checks if anything is entered for now.
function formatSearchQuery(){
if(document.searchForm.search.value.length == 0) return false;
return true;
}
// Submits search form
function submitform(){
document.searchForm.submit();
// history.go(0)
}
// Function is called when one of the category is selected.
// Adds Category text in the search box and submits form
function category(catID){
var form = document.searchForm;
var val = form.search.value;
var pos = val.indexOf(':');
form.search.value = aCat[catID] + ":" + trim(val.substr(pos+1));
submitform();
}
// Prints warning with the specified id
function printWarning(warningID){
var message = "";
switch(warningID){
case 1: message = WARNING_CATEGORY_NOT_FOUND;
}
print("<br><div class=\"warning-block\">" + message + "</div>");
}
// Creates div with categories
// Each category is in div too.
function printCategories(){
var i=0;
var cnt=0;
print("<div class=\"categories-block\">");
for (key in aCat){
i++;
}
print("<table border=\"0\"><tr><td>");
for (key in aCat){
cnt++;
if (cnt == i/2+1)
{
//print("</div>");
//print("<div class=\"categories-block2\">");
print("</td><td>");
}
print("<div class=\"cat-block\"><a class=\"cat-link\" href=\"javascript: category(\'"+key+"\')\">" + aCat[key] + "</a></div>");
}
print("</tr></table>");
print("</div>");
}
// Returns category index from it's name
function findCategoryIndex(catName){
if(catName.length == 0) return -1;
for(index in aCat){
if(catName == aCat[index]) return index;
}
return 0;
}
// Returns html with banners
function buildBanners(){
var banners = "";
var filename;
for(it in results){
// if client type "2"
if( aData[results[it][0]][0] == "2"){
filename = CLIENTS_FOLDER + results[it][0] + "/" + CLIENT_BANNER;
banners += "<a href=\""+ CLIENTS_FOLDER+ results[it][0] + "/" + CLIENT_LINK_TARGET + "\">"
+ "<object>" // width=\"1000\" height=\"400\"
+ "<param name=\"movie\" value=\"" + filename + "\">"
+ "<embed src=\"" + filename + "\">" // width=\"550\" height=\"400\"
+ "</embed>"
+ "</object>"
+ "</a>" + "<br>";
}
}
return banners;
}
// function returns relation coeficient for the specified
// customer data with specified search combination and category.
// The category should match exactly.
function getDataRel(data, searchString, cat){
if(cat != -1 && data[2] != cat) return 0;
var rel = 0;
// if name or keywords contains string exactly
if(data[3].toLowerCase().indexOf(searchString) != -1) rel += 1000;
else if(data[1].toLowerCase().indexOf(searchString) != -1) rel += 500;
else{
// split string into tokens and search for each token
var tokens = searchString.split(/[\,\s\.\?\!]+/);
var name = data[3].toLowerCase();
var keywords = data[1].toLowerCase();
for(var i = 0; i < tokens.length; i++){
if(name.indexOf(tokens[i]) != -1){
// add rel
rel += (tokens.length - i) * 20;
}
}
for(var i = 0; i < tokens.length; i++){
if(keywords.indexOf(tokens[i]) != -1){
// add rel
rel += (tokens.length - i) * 10;
}
}
}
// add correlation with client type
if(rel > 0){
rel += parseInt(400 - data[0] * 100);
}
return rel;
}
// function prints formatted seach result
function formatResult(index, id, data){
var result = index + ". ";
result += "<a href=\"" + CLIENTS_FOLDER+ id + "/" + CLIENT_LINK_TARGET +
"\" class=\"company-name\">" + data[3] + "</a> <br>";
result += data[4] + "<br>" + PHONE_NUMBER_PREFIX + data[5] + "<br>";
result += "<div class=\"descr-block\">" + aDescr[id] + "</div>";
return result;
}
// criteria for sorting search results
// Resulta are sorted by relation coficient for now.
function resultsSortCriteria(a, b){
return b[1] - a[1];
}
// searches and prints results for the specified search query
function printResult(searchQuery){
// divide into category and search string
var pos = searchQuery.indexOf(':');
var searchCategory = "";
var searchString = searchQuery;
if(pos > 0){
searchCategory = trim(searchQuery.substr(0, pos));
searchString = trim(searchQuery.substr(pos+1));
}
var category = findCategoryIndex(searchCategory);
if(category == 0) printWarning(1);
if(prevQuery != searchQuery){
prevQuery = searchQuery;
var rel = 0;
var lsearch = searchString.toLowerCase();
// form data to output
for(key in aData){
if((rel = getDataRel(aData[key], lsearch, category)) > 0){
results.push(new Array(key, rel));
}
if((MAX_SEARCH_RESULTS != -1) && (results.length > MAX_SEARCH_RESULTS)) break;
}
results.sort(resultsSortCriteria);
if(results.length == 0){
// error message: no data found
var errorDiv = document.createElement('div');
errorDiv.className = "error-block";
errorDiv.innerHTML = NO_DATA_FOUND_MESSAGE;
document.body.appendChild(errorDiv);
}else{
// out data
var mainDiv = document.createElement('div');
mainDiv.className = "results-block";
var bannerDiv = document.createElement('div');
bannerDiv.className = "banner-block";
bannerDiv.innerHTML = buildBanners();
var cntr = 1;
// print results
for(index in results){
var divElem = document.createElement('div');
divElem.className = "client-block";
divElem.style.background = colorsClientType[aData[results[index][0]][0]];
divElem.innerHTML = formatResult(cntr++, results[index][0], aData[results[index][0]]);
mainDiv.appendChild(divElem);
}
// append search results and banner blocks
document.body.appendChild(mainDiv);
document.body.appendChild(bannerDiv);
}
}
}
// inits search form
function initForm(searchQuery){
var divClass = isSearchStarted ? "search-block" : "standalone-search-block";
document.getElementById("divForm").setAttribute("class", divClass);
document.searchForm.search.value = searchQuery;
}
// puts search string into input box after returning on
// the search page from anywhere
function initsearch(){
var searchQuery = htmlspecialchars(getParam("search"));
document.searchForm.search.value = searchQuery;
}
// all functions called throught this method
function search(){
buildKeywords();
var searchQuery = htmlspecialchars(getParam("search"));
isSearchStarted = (trim(searchQuery) != "");
initForm(searchQuery);
if(!isSearchStarted) printCategories();
if(isSearchStarted){
printResult(searchQuery);
}
}
|
в раздел работа
|
| Часовой пояс GMT +3, время: 19:57. |