function decode_utf8(utftext) {
    var plaintext = ""; var i=0; var c=c1=c2=0;
    // while-Schleife, weil einige Zeichen uebersprungen werden
    while(i<utftext.length)
        {
        c = utftext.charCodeAt(i);
        if (c<128) {
            plaintext += String.fromCharCode(c);
            i++;}
        else if((c>191) && (c<224)) {
            c2 = utftext.charCodeAt(i+1);
            plaintext += String.fromCharCode(((c&31)<<6) | (c2&63));
            i+=2;}
        else {
            c2 = utftext.charCodeAt(i+1); c3 = utftext.charCodeAt(i+2);
            plaintext += String.fromCharCode(((c&15)<<12) | ((c2&63)<<6) | (c3&63));
            i+=3;}
        }
    return plaintext;
}

function searchHighlight() {

  if (!document.createElement) return;

  // Wenn nicht der ganze html-body nach Treffern untersucht werden soll,
  // dann kann man mit einem
  // <div id="searchable_text"> content </div>
  // den Bereich einschränken
  //var searchable_text = document.getElementById("searchable");
  var searchable_text = document.getElementsByTagName("body")[0];
  if (!searchable_text) return;

  function getSearchWords(url) {
    if (url.indexOf('?') == -1) return [];
    var queryString = url.substr(url.indexOf('?') + 1);
    var params = queryString.split('&');
    for (var p in params) {
      var param = params[p].split('=');
      if (param.length < 2) continue;
      if (param[0] == 'q' || param[0] == 'p') { // q= for Google, p= for Yahoo
        return unescape(param[1].replace(/\+/g, ' ')).split(/\s+/);
      }
    }
    return [];
  }

  function highlightWord(node, word, searchwordindex) {

    // If this node is a text node and contains the search word, highlight it by
    // surrounding it with a span element
    if (node.nodeType == 3) { // Node.TEXT_NODE
      var pos = node.nodeValue.toLowerCase().indexOf(word.toLowerCase());
      if (pos >= 0 && !/^searchword\d$/.test(node.parentNode.className)) {
        var span = document.createElement("span");
        span.className = "searchword" + (searchwordindex % 5);
        span.appendChild(document.createTextNode(
            node.nodeValue.substr(pos, word.length)));
        var newNode = node.splitText(pos);
        newNode.nodeValue = newNode.nodeValue.substr(word.length);
        node.parentNode.insertBefore(span, newNode);
        return true;
      }
    } else if (!node.nodeName.match(/button|select|textarea/i)) {
      // Recurse into child nodes
      for (var i = 0; i < node.childNodes.length; i++) {
        if (highlightWord(node.childNodes[i], word, searchwordindex)) i++;
      }
    }
    return false;
  }

  function sortNamesByLength(a,b){
    return b.length-a.length; // von Lang nach Kurz sortieren
  }

  var words = getSearchWords(document.URL);

  if (!words.length) words = getSearchWords(document.referrer);

  if (words.length) {
    words.sort(sortNamesByLength);
    for (var w in words) {
      if (w < 4) { // maximal 5 Suchbegriffe (die 5 längsten) werden hervorgehoben
        words[w] = decode_utf8(words[w]);
        if (words.length < 4) { // bei weniger als 4 Suchbegriffen muss der Begriff mind. 4 Zeichen lang sein
            if (words[w].length > 3) highlightWord(searchable_text, words[w], w);
        }
        else { // bei 4 oder mehr Suchbegriffen muss der Begriff mind. 5 Zeichen lang sein
            if (words[w].length > 4) highlightWord(searchable_text, words[w], w);
        }
      }
    }
  }
}

//window.onload = searchHighlight;