var min_length_for_highlighting = 3;     // Nur Wörter ab dieser Länge werden behandelt


function highlight_searchwords() {
    // Bei altem Browser gleich zurück
	if (!document.createElement) return;

	var searchwords = "";

    // Primär werden die Suchwörter der lokalen Suche markiert
    searchwords = check_local_searchwords();

    // Falls die aktuelle Seite nicht über die Ergebnisseite der lokalen Suche aufgerufen wurde, prüfe ob der User von einer bekannten Suchmaschinen kommt und markiere die dort eingegegen Suchwörter auf der aktuellen Seite
    if (searchwords == "")
        searchwords = check_searchengines();

    // Aufräumen
    searchwords = bereinige(searchwords);

    // Alle Suchbegriffe durchgehen und markieren
    var searchwords_array = searchwords.split(" ");
    for(var i=0; i<searchwords_array.length; i++){
        if (searchwords_array[i].length >= min_length_for_highlighting) {
            // Der 2. Parameter gibt an, in welchem Bereich überhaupt markiert werden kann
            // document.body -> alles
            // document.getElementById("inhalt_und_menulevel3") -> Content + Teaser + Menü ab Level 3
            // document.getElementById("inhalt") -> Content + Teaser
            markiere(searchwords_array[i], document.body);
        }
    }
}


function check_local_searchwords () {
    // gebe die Suchwörter der lokalen Suche zurück (ausgelesen aus key=...)
    var theKey = "key";
    var url_array = document.URL.split("?");

    // Querystring vorhanden?
    if (url_array[1]) {
        var arg_array = url_array[1].split("&");
        for(var i=0; i<arg_array.length; i++){
            var schluessel = arg_array[i].split("=");
            // Wenn der Parameter passt, gebe dessen Wert zurück
            if (schluessel[0] == theKey) return schluessel[1];
        }
    }

    // Nix gefunden
    return "";
}


function check_searchengines () {
    // wenn der User von einer Suchmachine kommt, werden die dort eingegeben Suchwörter zurückgegeben
    var theKey = "";
    var ref = document.referrer.toLowerCase();
    var url_array = ref.split("?");

    // Querystring vorhanden?
    if (url_array[1]) {
        // Bestimme den zur jeweiligen Suchmachine passenden Schlüssel
        if (ref.indexOf(".google.") != -1) {
            theKey = "q";
        }
        else if (ref.indexOf(".yahoo.") != -1) {
            theKey = "p";
        }
        else if (ref.indexOf(".msn.") != -1) {
            theKey = "q";
        }
        else if (ref.indexOf(".t-online.") != -1) {
            theKey = "q";
        }
        else if (ref.indexOf(".web.de") != -1) {
            theKey = "su";
        }
        else if (ref.indexOf(".freenet.de.") != -1) {
            theKey = "query";
        }
        else if (ref.indexOf("suche.aol") != -1) {
            theKey = "q";
        }
        else if (ref.indexOf("search.aol.com") != -1) {
            theKey = "query";
        }
        else if (ref.indexOf(".altavista.") != -1) {
            theKey = "q";
        }
        else if (ref.indexOf(".ask.") != -1) {
            theKey = "q";
        }
        else if (ref.indexOf(".lycos.") != -1) {
            theKey = "query";
        }
        else if (ref.indexOf(".allesklar.de") != -1) {
            theKey = "words";
        }
        else if (ref.indexOf("suche.netscape.") != -1) {
            theKey = "q";
        }
        else if (ref.indexOf(".netscape.com") != -1) {
            theKey = "s";
        }
        else if (ref.indexOf("search.com") != -1) {
            theKey = "q";
        }
        else if (ref.indexOf(".fireball.de") != -1) {
            theKey = "query";
        }
        else if (ref.indexOf(".alltheweb.") != -1) {
            theKey = "q";
        }
        else if (ref.indexOf(".hotbot.") != -1) {
            theKey = "query";
        }

        // User kommt nicht von einer der genannten Suchmaschinen
        if (theKey == "") return "";

        var arg_array = url_array[1].split("&");
        for(var i=0; i<arg_array.length; i++){
            var schluessel = arg_array[i].split("=");
            if (schluessel[0] == theKey) return schluessel[1];
        }
    }

    // Nix gefunden
    return "";
}


function markiere(begriff, knoten) {
    // Sicherheitsabfrage
    if (knoten == null) return;

	// Rekursiv durch alle Kinderknoten
	if (knoten.hasChildNodes) {
		var cn;
		for (var cn=0; cn<knoten.childNodes.length; cn++) {
			markiere(begriff, knoten.childNodes[cn]);
		}
	}

	// Und der Textknoten selbst
	if (knoten.nodeType == 3) {
        var begriff_klein = begriff.toLowerCase();
        var text = knoten.data;
        var text_klein = text.toLowerCase();
        var pos = text_klein.indexOf(begriff_klein);

    	var eltern_knoten = knoten.parentNode;
        if (pos != -1  &&  eltern_knoten.className != "searchword") {
            var vorher = document.createTextNode(text.substr(0,pos));
            var aktuell = document.createTextNode(text.substr(pos,begriff.length));
            var nachher = document.createTextNode(text.substr(pos+begriff.length));

            var neuer_knoten = create_highlight_knoten(aktuell);

            eltern_knoten.insertBefore(vorher, knoten);
            eltern_knoten.insertBefore(neuer_knoten, knoten);
            eltern_knoten.insertBefore(nachher, knoten);
            eltern_knoten.removeChild(knoten);
        }
    }
}


function create_highlight_knoten(child) {
    var knoten = document.createElement("span");
    knoten.className = "searchword";
    knoten.appendChild(child);
    return knoten;
}


function bereinige(text){
    text = unescape(text);
    text = text.replace(/\+/g," ");         // + durch Leerzeichen ersetzen
    text = text.replace(/\"/g,"");          // " löschen
    text = text.replace(/^\s*/g,"");        // alle Leerzeichen am Anfang löschen
    text = text.replace(/\s*$/g,"");        // alle Leerzeichen am Ende löschen
    text = text.replace(/\s+/g," ");        // Mehrfache Leerzeichen durch ein einzelnes ersetzen

    return text;
}


window.onload = highlight_searchwords;
