/**
 * Haupt-JavaScript-Datei aller Webseiten;
 * Zustaendig fuer grundlegende Funktionalitaeten auf den Webseiten;
 * Zustaendig fuer die korrekte Generierung des Designs
 * 
 * (c) Sascha Seeger-Kunth, 2009
 */

// Sorgt dafuer, dass der Internet Explorer window.onload nicht als Endlosschleife ausfuehrt
var onloadBool = true;

// Globale Variablen fuer die Scroll-Tweens
var scrollTween; // Speichert die Tweens
var scrollBool = true; // Verhindert klicken der Pfeile waehrend "jump to top"
// Wird aufgerufen, wenn die HTML-Seite fertig geladen ist
window.onload = webpageStarted;

function webpageStarted()
{
	if (onloadBool) 
	{
		onloadBool = false;
		
		// Leitet die automatische Auswahl des E-Mail-Empfängers ein (falls man sich auf dem Kontaktformular befindet)
		if (window.document.getElementById('rg-kontakt')) // Dieses Element existiert nur im Kontaktformular (Dt.)
		{
			getMailID(1);
		}
		else if (window.document.getElementById('rg-contact')) // Dieses Element existiert nur im Kontaktformular (Engl.)
		{
			getMailID(2);
		}
		
		// Entfernt bei einem Mausklick das Wort "Suchen"/"Search" aus dem Suchfeld bzw. setzt den Startzustand
		searchStartText();
		window.document.getElementById("search").onclick = searchClick;
		window.document.getElementById("search").onblur = searchOffClick;
		
		// Schliesst bei Mausklick die Suchergebnisliste mit dem Live-Feedback
		window.document.onclick = closeSearchList;
		
		// Passt dynamisch die Hoehe der Kontaktbox an
		var element1 = window.document.getElementById("companies");
		var element2 = window.document.getElementById("subnavi");
		if (element1) 
		{
			dynamicHeightCompanies();
		}
		else if (element2) 
		{
			dynamicHeightNavi();
		}
		else 
		{
			dynamicHeightNothing();
		}
		
		// Implementiert Funktionalitaeten zum Scrollen des Content-Bereichs
		checkTextArrows();
		window.document.getElementById("top").onmousedown = jumpToTop;
		window.document.getElementById("up").onmousedown = scrollUp;
		window.document.getElementById("up").onmouseup = stopScroll;
		window.document.getElementById("up").onmouseout = stopScroll;
		window.document.getElementById("down").onmousedown = scrollDown;
		window.document.getElementById("down").onmouseup = stopScroll;
		window.document.getElementById("down").onmouseout = stopScroll;
		
		// Scrollen per Mausrad
		if (window.addEventListener) 
		{
			/** DOMMouseScroll is for mozilla. */
			window.document.getElementById("content").addEventListener('DOMMouseScroll', mouseWheelHandle, false);
		}
		else 
		{
			/** IE/Opera. */
			window.document.getElementById("content").onmousewheel = mouseWheelHandle;
		}
		
		// Startet die Medienelementabfrage (in der Datei 'media.js')
		startMediaCheck();
		
		// Startet die Ueberpruefung der Hyperlinks fuer das Scrollen zu Ankern (in der Datei 'anchor_scroll.js')
		searchAnchor();
	}
}

/*************************************************************************
 * Mausrad-Scrollen ab hier
 *************************************************************************/
/** This is high-level function.
 * It must react to delta being more/less than zero.
 */
function mouseWheelAction(delta)
{
	// Mausrad wurde zurueck gedreht (Runterscrollen)
	if (delta < 0) 
	{
		var contentHeight = window.document.getElementById("innerContent").offsetHeight;
		if (scrollBool && contentHeight > 329) 
		{
			// Mit den Pfeilen darf nicht parallel zum Mausrad gescrollt werden
			if (scrollTween != undefined) 
			{
				stopScroll();
			}
			
			var distanceTop = window.document.getElementById("innerContent").offsetTop;
			var distanceToScroll = 329 - contentHeight - distanceTop;
			
			// Zu scrollende Strecke bei einem Mausradklick darf nicht negativ und nicht groesser als 40px sein
			if (distanceToScroll < 0) 
			{
				distanceToScroll *= -1;
			}
			if (distanceToScroll > 40) 
			{
				distanceToScroll = 40;
			}
			
			var targetPos = distanceTop - distanceToScroll;
			var duration = distanceToScroll / 200; // 200px pro Sekunde;
			duration = parseFloat(duration);
			
			scrollTween = new Effect.Move('innerContent', 
			{
				y: targetPos,
				mode: 'absolute',
				duration: 0.05,
				transition: Effect.Transitions.linear,
				afterUpdate: checkTextArrows
			});
		}
	}
	// Mausrad wurde vorwärts gedreht (Hochscrollen)
	else 
	{
		var contentHeight = window.document.getElementById("innerContent").offsetHeight;
		if (scrollBool && contentHeight > 329) 
		{
			// Mit den Pfeilen darf nicht parallel zum Mausrad gescrollt werden
			if (scrollTween != undefined) 
			{
				stopScroll();
			}
			
			var distanceTop = window.document.getElementById("innerContent").offsetTop;
			var distanceToScroll = distanceTop;
			
			// Zu scrollende Strecke bei einem Mausradklick darf nicht negativ und nicht groesser als 40px sein
			if (distanceToScroll < 0) 
			{
				distanceToScroll *= -1;
			}
			if (distanceToScroll > 40) 
			{
				distanceToScroll = 40;
			}
			
			var targetPos = distanceTop + distanceToScroll;
			var duration = distanceToScroll / 200; // 200px pro Sekunde;
			duration = parseFloat(duration);
			
			scrollTween = new Effect.Move('innerContent', 
			{
				y: targetPos,
				mode: 'absolute',
				duration: 0.05,
				transition: Effect.Transitions.linear,
				afterUpdate: checkTextArrows
			});
		}
	}
}

/** Event handler for mouse wheel event.
 */
function mouseWheelHandle(event)
{
	var delta = 0;
	if (!event) /* For IE. */ 
		event = window.event;
	if (event.wheelDelta) 
	{ /* IE/Opera. */
		delta = event.wheelDelta / 120;
		/** In Opera 9, delta differs in sign as compared to IE.
		 */
		if (window.opera) 
			delta = -delta;
	}
	else if (event.detail) 
	{ /** Mozilla case. */
		/** In Mozilla, sign of delta is different than in IE.
		 * Also, delta is multiple of 3.
		 */
		delta = -event.detail / 3;
	}
	/** If delta is nonzero, handle it.
	 * Basically, delta is now positive if wheel was scrolled up,
	 * and negative, if wheel was scrolled down.
	 */
	if (delta) 
		mouseWheelAction(delta);
	/** Prevent default actions caused by mouse wheel.
	 * That might be ugly, but we handle scrolls somehow
	 * anyway, so don't bother here..
	 */
	if (event.preventDefault) 
		event.preventDefault();
	event.returnValue = false;
}

/*************************************************************************
 * Mausrad-Scrollen bis hier
 *************************************************************************/
// Loescht beim Klick auf das Suchfeld den Starttext "Suchen" heraus
function searchClick()
{
	if (window.document.getElementById("search").value == "Suchen" || window.document.getElementById("search").value == "Search") 
	{
		window.document.getElementById("search").value = "";
	}
}

// Verliert das Suchfeld den Fokus bei leerem Inhalt, wird der Starttext hinzugeschrieben
function searchOffClick()
{
	if (window.document.getElementById("search").value == "" && window.document.getElementById("printbutton").innerHTML == "Drucken") // Deutsche Seite 
	{
		window.document.getElementById("search").value = "Suchen";
	}
	else if (window.document.getElementById("search").value == "" && window.document.getElementById("printbutton").innerHTML == "Print") // Englische Seite 
	{
		window.document.getElementById("search").value = "Search";
	}
}

// Setzt den korrekten Starttext des Suchfeldes
function searchStartText()
{
	if (window.document.getElementById("search").value == "" && window.document.getElementById("printbutton").innerHTML == "Drucken") // Deutsche Seite 
	{
		window.document.getElementById("search").value = "Suchen";
	}
	else if (window.document.getElementById("search").value == "" && window.document.getElementById("printbutton").innerHTML == "Print") // Englische Seite 
	{
		window.document.getElementById("search").value = "Search";
	}
}

// Schliesst bei Mausklick die Suchergebnisliste mit dem Live-Feedback
function closeSearchList(Event)
{
	if (!Event) 
	{
		Event = window.event;
	}
	
	var container = window.document.getElementById("container");
	var searchList = window.document.getElementById("ac_results");
	
	var leftX = container.offsetLeft + 682;
	var rightX = container.offsetLeft + 900;
	var topY = container.offsetTop;
	var bottomY = container.offsetTop + 16 + searchList.offsetHeight;
	
	if (Event.clientX < leftX || Event.clientX > rightX || Event.clientY < topY || Event.clientY > bottomY) 
	{
		window.document.getElementById("ac_results").style.display = "none";
	}
}

// Passt die Hoehe der Kontakt-Box (unten links) dynamisch an die Hoehe der Teilfirmenlogos an
function dynamicHeightCompanies()
{
	// Hoehe der Teilfirmenlogo-Box wird ermittelt
	var companiesHeight = window.document.getElementById("companies").offsetHeight;
	
	// Teilfirmenlogos existieren
	if (companiesHeight > 5) 
	{
		var contactHeight = 413 - companiesHeight - 19;
		
		// Die Kontakt-Box muss immer min. 125px hoch sein
		if (contactHeight > 125) 
		{
			window.document.getElementById("contact").style.height = contactHeight + "px";
		}
		else 
		{
			window.document.getElementById("contact").style.height = "125px";
			window.document.getElementById("companies").style.height = "269px";
			window.document.getElementById("companies").style.overflow = "hidden";
		}
	}
	// Teilfirmenlogos existieren nicht
	else 
	{
		// Um 1px Border der leeren Teilfirmenlogo-Box zu vermeiden
		window.document.getElementById("companies").style.display = "none";
		// Kontakt-Box nimmt aufgrund fehlender Teilfirmenlogo-Box die komplette Hoehe ein
		window.document.getElementById("contact").style.height = "411px";
		// Erweitert Banner-Box, um auch breite Banner einbinden zu koennen
		window.document.getElementById("banner").style.width = "898px";
		// Verringert die Hoehe der linken Spalte, damit der breite Banner Platz hat
		window.document.getElementById("column_left").style.height = "413px";
	}
}

// Passt die Hoehe der Kontakt-Box (unten links) dynamisch an die Hoehe der Subnavigation an
function dynamicHeightNavi()
{
	// Hoehe der Subnavigation wird ermittelt
	var subnaviHeight = window.document.getElementById("subnavi").offsetHeight;
	
	// Subnavigation existiert
	if (subnaviHeight > 5) 
	{
		var contactHeight = 525 - subnaviHeight - 19;
		
		// Die Kontakt-Box muss immer min. 125px hoch sein
		if (contactHeight > 125) 
		{
			window.document.getElementById("contact").style.height = contactHeight + "px";
		}
		else 
		{
			window.document.getElementById("contact").style.height = "125px";
			window.document.getElementById("subnavi").style.height = "381px";
			window.document.getElementById("subnavi").style.overflow = "hidden";
		}
	}
	// Subnavigation existiert nicht
	else 
	{
		// Um 1px Border der leeren Subnavigation zu vermeiden
		window.document.getElementById("subnavi").style.display = "none";
		// Kontakt-Box nimmt aufgrund fehlender Subnavigation die komplette Hoehe ein
		window.document.getElementById("contact").style.height = "411px";
		// Erweitert Banner-Box, um auch breite Banner einbinden zu koennen
		window.document.getElementById("banner").style.width = "898px";
		// Verringert die Hoehe der linken Spalte, damit der breite Banner Platz hat
		window.document.getElementById("column_left").style.height = "413px";
	}
}

// Passt die Hoehe der Kontakt-Box (unten links) dynamisch an die Hoehe der Subnavigation an
function dynamicHeightNothing()
{
	// Kontakt-Box nimmt aufgrund fehlender Subnavigation und Teilfirmenlogo-Box die komplette Hoehe ein
	window.document.getElementById("contact").style.height = "411px";
	// Erweitert Banner-Box, um auch breite Banner einbinden zu koennen
	window.document.getElementById("banner").style.width = "898px";
	// Verringert die Hoehe der linken Spalte, damit der breite Banner Platz hat
	window.document.getElementById("column_left").style.height = "413px";
}

// Prueft, ob die Scrollpfeile und der "Top"-Button eingeblendet werden sollen
function checkTextArrows()
{
	var contentHeight = window.document.getElementById("innerContent").offsetHeight;
	var distanceTop = window.document.getElementById("innerContent").offsetTop;
	
	if (contentHeight < 330) 
	{
		window.document.getElementById("top").style.display = "none";
		window.document.getElementById("up").style.display = "none";
		window.document.getElementById("down").style.display = "none";
	}
	else 
	{
		if (distanceTop < 0) 
		{
			window.document.getElementById("top").style.display = "inline";
			window.document.getElementById("up").style.display = "inline";
		}
		else 
		{
			window.document.getElementById("top").style.display = "none";
			window.document.getElementById("up").style.display = "none";
		}
		if ((329 - contentHeight) < distanceTop) 
		{
			window.document.getElementById("down").style.display = "inline";
		}
		else 
		{
			window.document.getElementById("down").style.display = "none";
		}
	}
}

// Startet den Scrollvorgang nach oben
function scrollUp()
{
	if (scrollBool) 
	{
		var distanceTop = window.document.getElementById("innerContent").offsetTop;
		var duration = distanceTop / 200; // 200px pro Sekunde
		if (duration < 0) 
		{
			duration *= -1;
		}
		duration = parseFloat(duration);
		
		scrollTween = new Effect.Move('innerContent', 
		{
			y: 0,
			mode: 'absolute',
			duration: duration,
			transition: Effect.Transitions.linear,
			afterUpdate: checkTextArrows
		});
	}
}

// Startet den Scrollvorgang nach unten
function scrollDown()
{
	if (scrollBool) 
	{
		var contentHeight = window.document.getElementById("innerContent").offsetHeight;
		var distanceTop = window.document.getElementById("innerContent").offsetTop;
		var duration = (329 - contentHeight - distanceTop) / 200; // 200px pro Sekunde
		var targetPos = 329 - contentHeight;
		
		if (duration < 0) 
		{
			duration *= -1;
		}
		duration = parseFloat(duration);
		
		scrollTween = new Effect.Move('innerContent', 
		{
			y: targetPos,
			mode: 'absolute',
			duration: duration,
			transition: Effect.Transitions.linear,
			afterUpdate: checkTextArrows
		});
	}
}

// Startet den Sprung nach oben
function jumpToTop()
{
	scrollBool = false;
	
	var distanceTop = window.document.getElementById("innerContent").offsetTop;
	var duration = distanceTop / 800; // 800px pro Sekunde
	if (duration < 0) 
	{
		duration *= -1;
	}
	duration = parseFloat(duration);
	
	scrollTween = new Effect.Move('innerContent', 
	{
		y: 0,
		mode: 'absolute',
		duration: duration,
		transition: Effect.Transitions.sinoidal,
		afterUpdate: checkTextArrows,
		afterFinish: activateScroll
	});
}

// Stoppt den Scrollvorgang (nach oben oder unten)
function stopScroll()
{
	if (scrollBool) 
	{
		scrollTween.cancel();
	}
}

// Reaktiviert die Funktionsfaehigkeit der Scrollpfeile
function activateScroll()
{
	scrollBool = true;
}

