JAVASCRIPT   14

searchhi

Guest on 14th May 2022 01:52:06 AM

  1. /* New: Variable searchhi_string to keep track of words being searched. */
  2. var searchhi_string = '';
  3.  
  4. /* http://www.kryogenix.org/code/browser/searchhi/ */
  5. /* Modified 20021006 to fix query string parsing and add case insensitivity */
  6. function highlightWord(node,word) {
  7.         // Iterate into this nodes childNodes
  8.         if (node.hasChildNodes) {
  9.                 var hi_cn;
  10.                 for (hi_cn=0;hi_cn<node.childNodes.length;hi_cn++) {
  11.                         highlightWord(node.childNodes[hi_cn],word);
  12.                 }
  13.         }
  14.  
  15.         // And do this node itself
  16.         if (node.nodeType == 3) { // text node
  17.                 tempNodeVal = node.nodeValue.toLowerCase();
  18.                 tempWordVal = word.toLowerCase();
  19.                 if (tempNodeVal.indexOf(tempWordVal) != -1) {
  20.                         pn = node.parentNode;
  21.                         if (pn.className != "searchword") {
  22.                                 // word has not already been highlighted!
  23.                                 nv = node.nodeValue;
  24.                                 ni = tempNodeVal.indexOf(tempWordVal);
  25.                                 // Create a load of replacement nodes
  26.                                 before = document.createTextNode(nv.substr(0,ni));
  27.                                 docWordVal = nv.substr(ni,word.length);
  28.                                 after = document.createTextNode(nv.substr(ni+word.length));
  29.                                 hiwordtext = document.createTextNode(docWordVal);
  30.                                 hiword = document.createElement("span");
  31.                                 hiword.className = "searchword";
  32.                                 hiword.appendChild(hiwordtext);
  33.                                 pn.insertBefore(before,node);
  34.                                 pn.insertBefore(hiword,node);
  35.                                 pn.insertBefore(after,node);
  36.                                 pn.removeChild(node);
  37.                         }
  38.                 }
  39.         }
  40. }
  41.  
  42. function unhighlightWord(node,word) {
  43.         // Iterate into this nodes childNodes
  44.         if (node.hasChildNodes) {
  45.                 var hi_cn;
  46.                 for (hi_cn=0;hi_cn<node.childNodes.length;hi_cn++) {
  47.                         highlightWord(node.childNodes[hi_cn],word);
  48.                 }
  49.         }
  50.  
  51.         // And do this node itself
  52.         if (node.nodeType == 3) { // text node
  53.                 tempNodeVal = node.nodeValue.toLowerCase();
  54.                 tempWordVal = word.toLowerCase();
  55.                 if (tempNodeVal.indexOf(tempWordVal) != -1) {
  56.                         pn = node.parentNode;
  57.                         if (pn.className == "searchword") {
  58.                                 prevSib = pn.previousSibling;
  59.                                 nextSib = pn.nextSibling;
  60.                                 nextSib.nodeValue = prevSib.nodeValue + node.nodeValue + nextSib.nodeValue;
  61.                                 prevSib.nodeValue = '';
  62.                                 node.nodeValue = '';
  63.                         }
  64.                 }
  65.         }
  66. }
  67.  
  68. function unhighlight(node) {
  69.         // Iterate into this nodes childNodes
  70.         if (node.hasChildNodes) {
  71.                 var hi_cn;
  72.                 for (hi_cn=0;hi_cn<node.childNodes.length;hi_cn++) {
  73.                         unhighlight(node.childNodes[hi_cn]);
  74.                 }
  75.         }
  76.  
  77.         // And do this node itself
  78.         if (node.nodeType == 3) { // text node
  79.                 pn = node.parentNode;
  80.                 if( pn.className == "searchword" ) {
  81.                         prevSib = pn.previousSibling;
  82.                         nextSib = pn.nextSibling;
  83.                         nextSib.nodeValue = prevSib.nodeValue + node.nodeValue + nextSib.nodeValue;
  84.                         prevSib.nodeValue = '';
  85.                         node.nodeValue = '';
  86.                 }
  87.         }
  88. }
  89.  
  90. function googleSearchHighlight() {
  91.         if (!document.createElement) return;
  92.         ref = document.referrer;
  93.         ref = ref.replace(/\/search\/web\//,'?search&q='); // Most WebCrawler searches
  94.         if (ref.indexOf('?') == -1) return;
  95.         qs = ref.substr(ref.indexOf('?')+1);
  96.         qsa = qs.split('#');
  97.         qs = qsa[0];
  98.         qs = qs.replace(/(^|&)p=Q&ts=e&/,'&'); // Most Eurekster searches
  99.         qs = qs.replace(/(^|&)query=/,'&q='); // Most Lycos searches
  100.         qs = qs.replace(/(^|&)key=/,'&q='); // Most Walhello searches
  101.         qs = qs.replace(/(^|&)keywords=/i,'&q='); // Most Overture searches
  102.         qs = qs.replace(/(^|&)searchfor=/,'&q='); // Most Mysearch.com searches
  103.         qs = qs.replace(/(^|&)qt=/,'&q='); // Most Acoona.com searches
  104.         qs = qs.replace(/(^|&)s=/,'&q='); // Most Technirati GET searches
  105.         qsa = qs.split('&');
  106.         for (i=0;i<qsa.length;i++) {
  107.                 qsip = qsa[i].split('=');
  108.                 if (qsip.length == 1) continue;
  109.                 if (qsip[0] == 'q' || qsip[0] == 'p' || qsip[0] == 'w') { // q= for Google, p= for Yahoo, w= for Eurekster
  110.                         // Trim leading and trailing spaces after unescaping
  111.                         qsip[1] = unescape(qsip[1]).replace(/^\s+|\s+$/g, "");
  112.                         if( qsip[1] == '' ) continue;
  113.                         phrases = qsip[1].replace(/\+/g,' ').split(/\"/);
  114.                         for(p=0;p<phrases.length;p++) {
  115.                                 phrases[p] = unescape(phrases[p]).replace(/^\s+|\s+$/g, "");
  116.                                 if( phrases[p] == '' ) continue;
  117.                                 if( p % 2 == 0 ) words = phrases[p].replace(/([+,()]|%(29|28)|\W+(AND|OR)\W+)/g,' ').split(/\s+/);
  118.                                 else { words=Array(1); words[0] = phrases[p]; }
  119.                                 for (w=0;w<words.length;w++) {
  120.                                         if( words[w] == '' ) continue;
  121.                                         highlightWord(document.getElementsByTagName("body")[0],words[w]);
  122.                                         if( p % 2 == 0 ) searchhi_string = searchhi_string + ' ' + words[w];
  123.                                         else searchhi_string = searchhi_string + ' "' + words[w] + '"';
  124.                                 }
  125.                         }
  126.  
  127.                 }
  128.         }
  129. }
  130.  
  131. // Everything form this point on is modified to allow for highlighting
  132. // of terms found in the REQUEST URI
  133. function localSearchHighlight(searchStr, tryQ) {
  134.         if (!document.createElement) return;
  135.      if (searchStr == '') return;
  136.         if (searchStr.indexOf('?') == -1) qs = searchStr.substr(0);
  137.         else qs = searchStr.substr(1);
  138.         qsa = qs.split('&');
  139.         for (i=0;i<qsa.length;i++) {
  140.                 qsip = qsa[i].split('=');
  141.                 if (qsip.length == 1) continue;
  142.                 if (qsip[0] == 'h' || ( tryQ && ( qsip[0] == 'q' || qsip[0] == 'p' ) ) ) { // be careful about ghost highlights
  143.                         // Trim leading and trailing spaces after unescaping
  144.                         qsip[1] = unescape(qsip[1]).replace(/^\s+|\s+$/g, "");
  145.                         if( qsip[1] == '' ) continue;
  146.                         phrases = qsip[1].replace(/\+/g,' ').split(/\"/);
  147.                         // Use this next line if you would like to force the script to always
  148.                         // search for phrases. See below as well!!!
  149.                         //phrases = new Array(); phrases[0] = ''; phrases[1] = qsip[1].replace(/\+/g,' ');
  150.                         for(p=0;p<phrases.length;p++) {
  151.                                 phrases[p] = unescape(phrases[p]).replace(/^\s+|\s+$/g, "");
  152.                                 if( phrases[p] == '' ) continue;
  153.                                 if( p % 2 == 0 ) words = phrases[p].replace(/([+,()]|%(29|28)|\W+(AND|OR)\W+)/g,' ').split(/\s+/);
  154.                                 else { words=Array(1); words[0] = phrases[p]; }
  155.                                 for (w=0;w<words.length;w++) {
  156.                                         if( words[w] == '' ) continue;
  157.                                         highlightWord(document.getElementsByTagName("body")[0],words[w]);
  158.                                         if( p % 2 == 0 ) searchhi_string = searchhi_string + ' ' + words[w];
  159.                                         else searchhi_string = searchhi_string + ' "' + words[w] + '"';
  160.                                         // As before, use this next line if forcing phrase searching
  161.                                         //else searchhi_string = searchhi_string + ' ' + words[w];
  162.                                 }
  163.                         }
  164.                 }
  165.         }
  166. }
  167.  
  168. function postSearchHighlight() {
  169.         // Trim any leading or trailing space
  170.         // (this is an overkill way of getting rid of the leading
  171.         //  space that always is present in searchhi_string)
  172.         searchhi_string = searchhi_string.replace(/^\s+|\s+$/g, "");
  173.  
  174.         // In MSIE, sometimes the dynamic generation of the spans
  175.         // for the highlighting takes the anchor out of focus.
  176.         // Here, we put it back in focus.
  177.         if( location.hash.length > 1 ) location.hash = location.hash;
  178. }
  179.  
  180. function SearchHighlight() {
  181.      // This logic should allow pages to use themselves as search
  182.      // engines while not ghosting old searches on current results.
  183.      if( document.createElement ) {
  184.           var docrefpage = document.referrer.split('?',2);
  185.           var locrefpage = location.href.split('?',1);
  186.  
  187.           // Check to see if the referrer looks like it has search terms
  188.           //   In the special case when the referrer *IS* this page,
  189.           //   ignore the referrer.
  190.           if( ( docrefpage[0].toUpperCase() != locrefpage[0].toUpperCase() )
  191.               &&
  192.               ( ( docrefpage[1] && docrefpage[1].match(/(^|&)(p=Q&ts=e&|query=|key=|keywords=|searchfor=|qt=|q=)/) )
  193.                 || document.referrer.match(/\/search\/web\//) ) )
  194.           {
  195.                // Look to location (via "h" field) *AND* referrer
  196.                   googleSearchHighlight();
  197.                   localSearchHighlight(location.search);
  198.           } else {
  199.                // Look to location *ONLY* for highlighting
  200.                var locsearch = location.search;
  201.                if( locsearch.indexOf('?') == -1 ) {
  202.                     // Found no GET string, so look to pathname in
  203.                     // last effort to match something
  204.                     locsearch = locsearch.replace(/\/search\//,'?search&q='); // Most WebCrawler searches
  205.                }
  206.                   localSearchHighlight(location.search, 1);
  207.           }
  208.           postSearchHighlight();
  209.      }
  210. }
  211.  
  212. function SmartHighlight()
  213. {
  214.         // This function is like SearchHighlight()
  215.         // but it detects a page refresh and toggles highlighting
  216.         // on each refresh. This gives a quick way to turn off
  217.         // highlighting (and quickly turn it on after).
  218.  
  219.         var today = new Date();
  220.         var now = today.getUTCSeconds();
  221.  
  222.         var cookie = document.cookie;
  223.         var cookieArray = cookie.split('; ');
  224.  
  225.         // Get timestamp stored in cookie
  226.         for (var loop=0; loop < cookieArray.length; loop++){
  227.                 var nameValue = cookieArray[loop].split("=");
  228.                 if (nameValue[0].toString() == 'SHTS'){
  229.                         var cookieTime = parseInt( nameValue[1] );
  230.                 }
  231.                 else if (nameValue[0].toString() == 'SHTSP'){
  232.                         var cookieName = nameValue[1];
  233.                 }
  234.         }
  235.  
  236.         // If we got a cookie, the cookie is from this page,
  237.         // and the cookie's time is very close to now, then
  238.         // this must be a page refresh (or very similar)
  239.         // so we don't want to highlight. (the 5 second threshold
  240.         // may need to be adjusted for slower browsers/pages/etc.)
  241.         if( cookieName &&
  242.                 cookieTime &&
  243.                 cookieName == escape(location.href) &&
  244.                 Math.abs(now - cookieTime) < 5 )
  245.         {
  246.                 // Refresh detected, so don't highlight
  247.  
  248.                 // Disable refresh detection for this run;
  249.                 // this is what allows us to toggle the highlighting
  250.                 // back *ON* on the next refresh
  251.                 searchhi_unl = 0;
  252.         }
  253.         else
  254.         {
  255.                 // This is not a refresh, so highlight
  256.                 SearchHighlight();
  257.         }
  258.  
  259. }
  260.  
  261. function SmartHLUnload()
  262. {
  263.         if( searchhi_unl > 0 )
  264.         {
  265.                 // Turn refresh detection on so that if this
  266.                 // page gets quickly loaded, we know it's a refresh
  267.                 var today = new Date();
  268.                 var now = today.getUTCSeconds();
  269.                 document.cookie = 'SHTS=' + now + ';';
  270.                 document.cookie = 'SHTSP=' + escape(location.href) + ';';
  271.         }
  272.         else
  273.         {
  274.                 // Refresh detection has been disabled
  275.                 document.cookie = 'SHTS=;';
  276.                 document.cookie = 'SHTSP=;';
  277.         }
  278. }
  279.  
  280. function NotRefreshHL()
  281. {
  282.         // This is not a refresh. It's probably a submit
  283.         // with the same search string, so disable refresh
  284.         // detection on this go around.
  285.         searchhi_unl = 0;
  286.         return true;
  287. }
  288.  
  289. // By default, turn refresh detection on
  290. var searchhi_unl = 1;
  291.  
  292. // window.onload = SearchHighlight;
  293. // window.onload = SmartHighlight;
  294. // window.onunload = SmartHLUnload;

Raw Paste


Login or Register to edit or fork this paste. It's free.