function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_showHideLayers() { //v3.0
  var i,p,v,obj,args=MM_showHideLayers.arguments;
  for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
    if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v='hide')?'hidden':v; }
    obj.visibility=v; }
}

function MM_openBrWindow(theURL,winName,features) { //v2.0
  NeuesFenster=window.open(theURL,winName,features);
	NeuesFenster.focus();
}

//////////////////////////////////////////////////////////////////////////////////////////

function FixedSetzen () {
	EbeneNavigation = document.getElementById("navigation");  // ohne "var" definierte Variablen sind global
	EbeneAnimation = document.getElementById("animation");
	EbeneVerankern = document.getElementById("verankern");
	var Browserfensterhoehe  = window.innerHeight?window.innerHeight:document.body.clientHeight; // Höhe des Browserfensters | MSIE: document.body.clientHeight

	if (Browserfensterhoehe > EbeneNavigation.offsetHeight + 60) {  // 40 top + 20 Toleranz
		EbeneNavigation.style.position = "fixed";
	}
	if (Browserfensterhoehe > 320+153 ) {  // damit die Animation nicht ins Foto ragt
		EbeneAnimation.style.position = "fixed";
		EbeneVerankern.style.position = "fixed";
		EbeneAnimation.style.top = Browserfensterhoehe - 170 + "px";
		EbeneVerankern.style.top = Browserfensterhoehe - 170 + "px";
	}
//	EbeneVerankern.style.top = 300 + "px";  // überdeckt sonst die Animation!
}

function Pruefen () {  // Falls der Browser "position:fixed" nicht untersützt, doch wieder auf "position:absolute" umstellen (MSIE 5.5)
	if (EbeneNavigation.offsetLeft == 0 ) {  // prüfen, ob FixedSetzen funktioniert hat (für MSIE 5.5)
		EbeneNavigation.style.position = "absolute";
		EbeneAnimation.style.position = "absolute";
		EbeneVerankern.style.position = "absolute";
	}
}

//////////////////////////////////////////////////////////////////////////////////////////

/* Features:
*) bei externen Referrern werden nur komplette Woerter highlighted, bei internen (d.h. Suchfunktion der eigenen Website) auch Wortteile
*) Startelement konfigurierbar (d.h. Inhalt ausserhalb dieses Containers wird ignoriert)
*/

var qNamen = new Array('q', 'p', 'query', 'userQuery', 's');
var klassenname = 'suchbegriff';
var startelement = ''; // z.B. startelement = 'inhalt';
//var referrer = 'http://www.google.at/search?q=%C3%96sterreich+Lorem&sourceid=firefox-search&start=0';
var referrer = document.referrer;

/*
URL-Kodierung:
Fuer oe schreibt man:
Unicode: %C3%B6
Latin-1: %F6
*/

var eigeneDomain = document.URL.substr(7); // 'http://' vorne wegschneiden
eigeneDomain = eigeneDomain.substr(0, eigeneDomain.indexOf('/'));

function in_array(needle, haystack) {
	for(var i=0; i < haystack.length; i++) {
		if(haystack[i] === needle) {
			return true;
		}
	}
	return false;
}

function qErmitteln() {
	if (referrer.indexOf('?') == -1) {
		return null;
	}
	var queryString = referrer.substring(referrer.indexOf('?')+1); // referrer: http://www.google.at/search?q=%C3%96sterreich+Urlaub&sourceid=firefox-search&start=0
	queryStringTeil = queryString.split('&'); // Array: q=%C3%96sterreich+Urlaub, sourceid=firefox-search, start=0
	for (i=0; i < queryStringTeil.length; i++) {
		queryStringPaar = queryStringTeil[i].split('='); // Array: q, %C3%96sterreich+Urlaub
		if (in_array(queryStringPaar[0], qNamen)) {
			q = queryStringPaar[1];
			var	eigeneDomainRegExp = new RegExp ('(\/|.)' + eigeneDomain + '\/'); // vordere Klammer heisst: / oder .
			var IstEigeneDomain = eigeneDomainRegExp.test(referrer) ? true : false; // test() wendet den Regulaeren Ausdruck auf referrer an
			q = IstEigeneDomain ? unescape(q) : decodeURI(q); // unescape() wandelt Latin-1-Kodierung zurueck, decodeURI() UTF-8-Kodierung
			q = q.toLowerCase(); // darf erst nach unescape() kommen
			q = q.split('+'); // original: q.split(/[\s,\+\.]+/);
			klasse = new Array();
			for (var k=0; k < q.length; k++) {
				klasse[q[k]] = klassenname + (k+1);
			}		
			// wenn der Benutzer nicht von der Suchfunktion der eigenen Website kommt: nur ganze Woerter highlighten
			if (!IstEigeneDomain) { // test() wendet den Regulaeren Ausdruck auf referrer an
				var qNeu = new Array();
				for (i=0; i < q.length; i++) {
					qNeu.push('\\b'+q[i]+'\\b'); // \b: Wortgrenze (RegExp)
				}
				q = qNeu;
			}
			q = new RegExp(q.join('|'), 'i'); // RegExp: | heisst oder, 'i' heisst case-insensitive
			return q;
		}
	}
	return null;
}

function highlightRekursion(node, q) {
	if (node.hasChildNodes) {
		for (var i=0; i < node.childNodes.length; i++) { // i muss mittels var initialisiert werden (sonst Endlos-Rekursion)!
			highlightRekursion(node.childNodes[i], q);
		}
	}	
	var ausnahmen = /^(script|textarea)/i; // RegExp: 'i' heisst case-insensitive
	if (node.nodeType == 3 && !ausnahmen.test(node.parentNode.tagName)) { // Typ 3 heisst Text-Node. test() wendet den Regulaeren Ausdruck an
		nodeInhaltKlein = node.nodeValue.toLowerCase();
    var treffer = q.exec(node.data); // exec() wendet die RegExp q auf node.data an, und speichert die Ergebnisse (Details siehe unten) im Array treffer
    if (treffer) {
			var wort = treffer[0]; // exec() speichert den gefundenen Ausdruck an die erste Position im Array treffer ...
			var wortPosition = treffer.index // ... und seine Position in die Eigenschaft index
			if (node.parentNode.className != klasse[wort.toLowerCase()]) { // nur wenn das Wort noch nicht highlighted ist
				dahinter = node.splitText(wortPosition); // 'node' enthaelt jetzt nur mehr den Text bis wortPosition, 'dahinter' den restlichen Text
				dahinter.splitText(wort.length); // 'dahinter' enthaelt jetzt nur mehr das Wort 'wort'
				var em = document.createElement("em");
				node.parentNode.replaceChild(em, dahinter); // em ersetzt dahinter
				em.appendChild(dahinter);
				em.className = klasse[wort.toLowerCase()];				
			}
		}
	}
}

function highlight() {
	q = qErmitteln();
	if (q) {
		if (startelement == '') {
			highlightRekursion(document.getElementsByTagName("body")[0], q);
		}
		else {
			highlightRekursion(document.getElementsById(startelement), q);
		}
	}
}

window.onload = function() {
	highlight();
	MM_preloadImages('/navigation/dreieck2.gif');
	FixedSetzen();
	Pruefen();
}