/* http://www.kryogenix.org/code/browser/searchhi/ */
/* Modified  by webdesign.weisshart.de/            */

/* ergaenzt durch S. Wöbbeking (09.3.2008):                                                         */
/* 1. Mindestlaenge des Suchbegriffes, waehlbar ueber neue Variable "min_laenge" )                  */
/* 2. Unterscheidung Gross- Kleinschreibung, wenn URL mit "?P=begriff" aufgerufen wird, (grosses P) */
/*    keine Unterscheidung, wenn URL mit "?p=begriff" aufgerufen wird (kleines p)                   */
/* 3. Nur interne Seiten-Suche eingestellt, waehlbar ueber neue Variable "external_search"          */

var min_laenge = 1;             /* Mindestleange = 1 */
var unterschied_gross = false;  /* false = keine Unterscheidung; true = Unterscheidung */
var external_search = false;    /* Vorbesetzung: false = nur intern; true = auch extern | wird ueberschrieben durch URL-Parameter */

var ref = "";

function highlightWord(node,word,unterschied_gross) {
  // Iterate into this nodes childNodes
  if (node.hasChildNodes) {
    var hi_cn;
    for (hi_cn=0;hi_cn<node.childNodes.length;hi_cn++) {
      highlightWord(node.childNodes[hi_cn],word,unterschied_gross);
    }
  }

  // And do this node itself
  if (node.nodeType == 3) { // text node
  	if (unterschied_gross) { // Unterscheidung Gross- Kleinschreibung
      tempNodeVal = node.nodeValue;
      tempWordVal = word;
    } else {
      tempNodeVal = node.nodeValue.toLowerCase();
      tempWordVal = word.toLowerCase();
    }
    if (tempNodeVal.indexOf(tempWordVal) != -1) {
      pn = node.parentNode;
      klasse = "searchword"+w; // different colors for differnt searchterms

      if (pn.className != klasse) {
        // word has not already been highlighted!
        nv = node.nodeValue;
        ni = tempNodeVal.indexOf(tempWordVal);
        // Create a load of replacement nodes
        before = document.createTextNode(nv.substr(0,ni));
        docWordVal = nv.substr(ni,word.length);
        after = document.createTextNode(nv.substr(ni+word.length));
        hiwordtext = document.createTextNode(docWordVal);
        hiword = document.createElement("em"); // modified from span to em

        hiword.className = klasse;
        hiword.appendChild(hiwordtext);
        pn.insertBefore(before,node);
        pn.insertBefore(hiword,node);
        pn.insertBefore(after,node);
        pn.removeChild(node);
      }
    }
  }
}


function Highlight() {
  if (!document.createElement) return;

  // added for site search
  if (window.location.search) ref = unescape(window.location.search);

  if (external_search) {
    if (document.referrer.search(/google.+/) != -1 || document.referrer.search(/yahoo.+/) != -1 || document.referrer.search(/fireball.+/) != -1 ||document.referrer.search(/search\.msn.+/) != -1 ) {
      ref = decodeURI(document.referrer);
    }
  }

  if (ref.indexOf('?') == -1) return;

  qs = ref.substr(ref.indexOf('?')+1);
  qsa = qs.split('&');

  for (i=0;i<qsa.length;i++) {
    qsip = qsa[i].split('=');
          if (qsip.length == 1 || qsip.length == 5) continue;
          if (qsip[0] == 'q' || qsip[0] == 'query' || qsip[0] == 'p' || qsip[0] == 'P' || qsip[0] == 's') { // q= for Google, p= for Yahoo, query= Fireball, s= for wordpress | p= fuer interne Suche ohne Gross/Klein-Unterscheidung, P= intern mit Unterscheidung
          	
          	if (qsip[0] == 'P') unterschied_gross = true;
          	
            // words not to be highlighted:
            //qsip[1] = qsip[1].replace(/\"|\'|\*|;|\bfür\s*\b|\bvon\s*\b|\bnicht\s*\b|\bde.\s*\b|\bdie\s*\b|\bdas\s*\b|\bauf\s*\b|\beine+.\s*\b|\bein\s*\b|\bund\s*\b|\bwie\s*\b|\bkann\s*\b|\boder\s*\b|\bich\s*\b|\bman\s*\b|\bmit\s*\b|\ist\s*\b|Suchbegriff/gi,'');
            qsip[1] = qsip[1].replace(/-/gi,' ');
            if (document.URL.indexOf('blog') >= 1) qsip[1] = qsip[1].replace(/\d\d|\d/g,''); // 1/2-digit number in blogs
      
            // remove all blanks and '+' before and after searchterm (bugfix: crashes FF & Op)
            qsip[1] = qsip[1].replace(/^(\s+|\++)/,'').replace(/(\++)$/,'').replace(/(\s+)$/,'');
      
            if (qsip[1] != '') {
            words = unescape(qsip[1].replace(/\+/g,' ')).split(/\s+/);
              for (w=0;w<words.length;w++) {
                if (words[w].length >= min_laenge)
                highlightWord(document.getElementsByTagName("body")[0],words[w],unterschied_gross);
              }
            }
          }
  }
}

window.onload = Highlight;

