110 lines
3.9 KiB
JavaScript
110 lines
3.9 KiB
JavaScript
/* http://www.kryogenix.org/code/browser/searchhi/ */
|
|
/* Modified 20021006 to fix query string parsing and add case insensitivity */
|
|
/* Modified 20070316 to stop highlighting inside nosearchhi nodes */
|
|
/* Modified 20081217 to do in-page searching and wrap up in an object */
|
|
/* Modified 20081218 to scroll to first hit like
|
|
http://www.woolyss.free.fr/js/searchhi_Woolyss.js and say when not found */
|
|
|
|
// Modified to integrate with ScrewTurn Wiki
|
|
|
|
searchhi = {
|
|
highlightWord: function(node, word) {
|
|
// Iterate into this nodes childNodes
|
|
if (node.hasChildNodes) {
|
|
for (var hi_cn = 0; hi_cn < node.childNodes.length; hi_cn++) {
|
|
searchhi.highlightWord(node.childNodes[hi_cn], word);
|
|
}
|
|
}
|
|
|
|
// And do this node itself
|
|
if (node.nodeType == 3) { // text node
|
|
tempNodeVal = node.nodeValue.toLowerCase();
|
|
tempWordVal = word.toLowerCase();
|
|
if (tempNodeVal.indexOf(tempWordVal) != -1) {
|
|
var pn = node.parentNode;
|
|
// check if we're inside a "nosearchhi" zone
|
|
var checkn = pn;
|
|
while (checkn.nodeType != 9 &&
|
|
checkn.nodeName.toLowerCase() != 'body') {
|
|
// 9 = top of doc
|
|
if (checkn.className.match(/\bnosearchhi\b/)) { return; }
|
|
checkn = checkn.parentNode;
|
|
}
|
|
if (pn.className != "searchkeyword") {
|
|
// word has not already been highlighted!
|
|
var nv = node.nodeValue;
|
|
var ni = tempNodeVal.indexOf(tempWordVal);
|
|
// Create a load of replacement nodes
|
|
var before = document.createTextNode(nv.substr(0, ni));
|
|
var docWordVal = nv.substr(ni, word.length);
|
|
var after = document.createTextNode(nv.substr(ni + word.length));
|
|
var hiwordtext = document.createTextNode(docWordVal);
|
|
var hiword = document.createElement("b");
|
|
hiword.className = "searchkeyword";
|
|
hiword.appendChild(hiwordtext);
|
|
pn.insertBefore(before, node);
|
|
pn.insertBefore(hiword, node);
|
|
pn.insertBefore(after, node);
|
|
pn.removeChild(node);
|
|
searchhi.found += 1;
|
|
if (searchhi.found == 1) pn.scrollIntoView();
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
googleSearchHighlight: function() {
|
|
// Very fragile implementation that must only work with STW
|
|
var url = document.location.toString();
|
|
var qmIndex = url.indexOf("?HL=");
|
|
if (qmIndex == -1) return;
|
|
var ampIndex = url.indexOf("&");
|
|
var query = url.substring(qmIndex + 4, ampIndex != -1 ? ampIndex : url.length);
|
|
query = query.replace(/,/g, ' ');
|
|
query = unescape(query);
|
|
searchhi.process(query);
|
|
},
|
|
|
|
process: function(wordstring) {
|
|
searchhi.found = 0;
|
|
var words = wordstring.split(/\s+/);
|
|
for (w = 0; w < words.length; w++) {
|
|
searchhi.highlightWord(document.getElementById("PageContentDiv"), words[w]);
|
|
}
|
|
if (searchhi.found === 0) {
|
|
searchhi.nohits();
|
|
}
|
|
},
|
|
|
|
nohits: function() {
|
|
},
|
|
|
|
init: function() {
|
|
if (!document.createElement || !document.getElementsByTagName) return;
|
|
// hook up forms of type searchhi
|
|
var frms = document.getElementsByTagName("form");
|
|
for (var i = 0; i < frms.length; i++) {
|
|
if (frms[i].className.match(/\bsearchhi\b/)) {
|
|
frms[i].onsubmit = function() {
|
|
var inps = this.getElementsByTagName("input");
|
|
for (var j = 0; j < inps.length; j++) {
|
|
if (inps[j].type == "text") {
|
|
searchhi.process(inps[j].value);
|
|
return false;
|
|
}
|
|
}
|
|
};
|
|
}
|
|
}
|
|
// highlight search engine referrer results
|
|
searchhi.googleSearchHighlight();
|
|
}
|
|
};
|
|
|
|
(function(i) {var u =navigator.userAgent;var e=/*@cc_on!@*/false; var st =
|
|
setTimeout;if(/webkit/i.test(u)){st(function(){var dr=document.readyState;
|
|
if(dr=="loaded"||dr=="complete"){i()}else{st(arguments.callee,10);}},10);}
|
|
else if((/mozilla/i.test(u)&&!/(compati)/.test(u)) || (/opera/i.test(u))){
|
|
document.addEventListener("DOMContentLoaded",i,false); } else if(e){ (
|
|
function(){var t=document.createElement('doc:rdy');try{t.doScroll('left');
|
|
i();t=null;}catch(e){st(arguments.callee,0);}})();}else{window.onload=i;}})(searchhi.init);
|