document.onclick=function() { hideCurrentInfoBox(); }; //Infobox schließen wenn außerhalb geklickt wird

var visibleInfoBox				= false; //Name der aktuell sichtbaren Infobox
var visibleInfoLayer			= false; //Name des aktuell sichtbaren Infolayer
var buttonClicked				= false; //true, falls user auf einen Button klickt
var dropdownButtonUpImageSrc	= 'images/button_up.gif'; //URL für Button "Schließen"
var dropdownButtonDownImageSrc	= 'images/button_dropdown.gif'; //URL für Button "Öffnen"
var infoButtonUpImageSrc		= 'images/button_x.gif'; //URL für Button "Schließen"
var infoButtonDownImageSrc		= 'images/button_info.gif'; //URL für Button "Öffnen"
var accordionEnabled			= true; //Akkordeon-Funktion oder unabhängiges Ein-/Ausblenden?
var mooAccordionEnabled			= true; //Akkordeon von MooTools aktivieren?
var fxEnabled					= true; //Effekte an?
var infolayerElement			= 'div.infolayer'; //Element, das den Infolayer umgibt

////////
//Hinweis:
//Info-Box: Als Infobox wird eine ganze Info-Box mit Inhalt bezeichnet
//Info-Layer: Als Info-Layer wird ein Inhaltsbestandteil einer Info-Box bezeichnet


////////////////////////////////////////////////////////////////////////////////
//////////////////////////// ALLGEMEINE FUNKTIONEN ////////////////////////////
//////////////////////////////////////////////////////////////////////////////

//////
//Eine Ebene/Element einblenden
//object: HTML-Object
function showLayer(object) {
	if (object && $(object)) { //Objekt angegeben?
		$(object).setStyle('display', 'block'); //Layer sichtbar machen
	}
}

//////
//Eine Ebene/Element ausblenden
//object: HTML-Object
function hideLayer(object) {
	if (object && $(object)) { //Objekt angegeben?
		$(object).setStyle('display', 'none'); //Layer unsichtbar machen
	}
}

//////
//Prüft, ob das Object aktuell angezeigt wird
//object: HTML-Object
function isVisible(object) {
	if (object) { //Objekt angegeben?
		if ($(object).getStyle('display')=='block' || $(object).hasClass('visible')) return true; //sichtbar
		return false;
	}
	return false;
}


////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////// FUNKTIONEN FÜR DIE INFOBOX SELBST ////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////

//////
//Eine Infobox einblenden
//target: Objektreferenz auf die Infobox
function showInfoBox(target) {
	if (visibleInfoBox && visibleInfoBox!=target) { //Eine andere Infobox ist noch sichtbar?
		hideInfoBox(visibleInfoBox); //aktuell sichtbare Box verbergen
	}
	showLayer(target); //DIV mit Infobox einblenden
	visibleInfoBox		= target; //aktuell sichtbare Box merken
	dropDownButtonImage	= $(target).getNext('a').getFirst('img.info_button'); //Referenz zum zugehörigen Button
	switchInfoButtonImage(dropDownButtonImage, target);
}

//////
//Eine Infobox ausblenden
//target: Objektreferenz auf die Infobox
function hideInfoBox(target) {
	hideLayer(target); //DIV mit Infobox ausblenden
	var infobox_container = $(target).getParent().getElement('div.infobox_container');
	visibleInfoBox		= false; //keine Infobox mehr sichtbar
	dropDownButtonImage	= $(target).getNext('a').getFirst('img.info_button'); //Referenz zum zugehörigen Button
	switchInfoButtonImage(dropDownButtonImage, target);
}

//////
//Eine Infobox ein- oder ausblenden (je nach aktueller Sichtbarkeit)
//object: Objektreferenz auf die Infobox
function showHideInfoBox(object) {
	buttonClicked=true; //Funktion wird nur vom User durch Klick aufgerufen
	var visibleInfoBoxOld=visibleInfoBox;
	//var target=$(object).getPrevious('div.infobox_container'); //Suche zugehörige DIV mit Infobox
	var target=$(object);
	
	if (isVisible(target)) { //Box sichtbar?
		hideInfoBox(target); //Box verbergen
	}
	else { //Box unsichtbar?
		showInfoBox(target); //Box anzeigen
		if (mooAccordionEnabled) { //Accordion erzeugen
			accordion = createAccordion(target);
		}
		//Effekt für "Einblenden"
		var targetML = $(target).getStyle('margin-left').toInt();
		$(target).setStyle('margin-left', targetML+30);
		var myFx = new Fx.Tween($(target),	{
			duration: 300,
			transition: Fx.Transitions.Expo.easeOut,
			onComplete: function() {
				accordion.display(0);
			}
		});
		if (fxEnabled && !visibleInfoBoxOld) { //Effekt anzeigen
			myFx.start('margin-left', targetML);
		}
		else {
			$(target).setStyle('margin-left', targetML+30);
			myFx.start('margin-left', targetML);
			//accordion.display(0);
			//$(target).setStyle('margin-left', targetML);
		}
		

		//Sichtbaren Info-Layer zurücksetzen
		if (visibleInfoLayer && accordionEnabled && !mooAccordionEnabled) {
			hideInfoLayer(visibleInfoLayer);
			visibleInfoLayer = false;
		}

		if (accordionEnabled && !mooAccordionEnabled) { //Zu Beginn alle InfoLayer verstecken
			var infoLayer=$(target).getElements(infolayerElement);
			for (var i=0; i<infoLayer.length; i++) {
				hideLayer(infoLayer[i]);
			}
			showInfoLayer($(target).getElement(infolayerElement)); //Den ersten Info-Layer der aktuellen Box anzeigen
		}
	}

	//Return für click-Action in a-TAG
	return false;
}

//////
//Die aktuell sichtbare Infobox ausblenden
//
function hideCurrentInfoBox() {
	if (!buttonClicked && visibleInfoBox) { //Nur ausblenden, wenn user nicht auf einen Button geklickt hat
		hideInfoBox(visibleInfoBox);
	}
	buttonClicked=false; //Variable zurücksetzen
}


/////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////// FUNKTIONEN FÜR DIE INHALTE DER INFOBOX ////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////

//////
//Einen bestimmten Inhaltsbereich ein- oder ausblenden (je nach aktueller Sichtbarkeit)
//object: Der Inhaltsbereich, auf den geklickt wurde (bzw. dessen Button)
function showHideInfoLayer(object) {
	buttonClicked=true; //Funktion wird nur vom User aufgerufen durch Klick
	var target = $(object).getNext(infolayerElement); //Suche Zielelement

	if (visibleInfoLayer && visibleInfoLayer!=target && accordionEnabled==true) { //Eine andere Infobox ist noch sichtbar?
		hideInfoLayer(visibleInfoLayer); //aktuell sichtbare Box verbergen
	}
	if (isVisible(target)) { //Den info ein- oder ausblenden (je nach aktueller Sichtbarkeit)
		hideInfoLayer(target); //ausblenden
	}
	else {
		showInfoLayer(target); //einblenden
	}
}

//////
//Blendet den entsprechenden Info-Layer ein
//target: Referenz auf das HTML-Objekt des Info-Layers, der eingeblendet werden soll
function showInfoLayer(target) {
	if (!mooAccordionEnabled) showLayer(target); //Layer anzeigen
	visibleInfoLayer	= target; //Merke den aktuell sichtbaren Layer
	dropDownButtonImage	= $(target).getPrevious('a').getFirst('img.dropdown_button'); //Referenz zum zugehörigen Button
	switchDropdownButtonImage(dropDownButtonImage, target); //Aussehen des Buttons ändern
}

//////
//Blendet den entsprechenden Info-Layer aus
//target: Referenz auf das HTML-Objekt des Info-Layers, der ausgeblendet werden soll
function hideInfoLayer(target) {
	if (!mooAccordionEnabled) hideLayer(target); //verstecke Layer
	visibleInfoLayer = false; //kein Layer mehr sichtbar
	dropDownButtonImage	= $(target).getPrevious('a').getFirst('img.dropdown_button'); //Referenz zum zugehörigen Button
	switchDropdownButtonImage(dropDownButtonImage, target); //Aussehen des Buttons ändern
}

//////
//Bild des Dropdown-Buttons ändern (je nach Sichtbarkeit des zugehörigen Info-Layers)
//buttonImage: Referenz auf das Objekt des Buttons
//refObject: Referenz-Objekt anhand dessen Sichtbarkeit das Aussehen des Buttons geändert wird
function switchDropdownButtonImage(buttonImage, refObject) {
	if (buttonImage && buttonImage.nodeName=='IMG' && $(buttonImage).hasClass('dropdown_button')) { //Button gefunden => Aussehen des Buttons ändern
		if (isVisible(refObject)) { //Referenz-Objekt sichtbar?
			$(buttonImage).setProperty('src', dropdownButtonUpImageSrc); //Button "Schließen" anzeigen
		}
		else {
			$(buttonImage).setProperty('src', dropdownButtonDownImageSrc); //Button "Ausklappen" anzeigen
		}
	}
}

//////
//Bild des Info-Buttons ändern (je nach Sichtbarkeit der zugehörigen Infobox)
//buttonImage: Referenz auf das Objekt des Buttons
//refObject: Referenz-Objekt anhand dessen Sichtbarkeit das Aussehen des Buttons geändert wird
function switchInfoButtonImage(buttonImage, refObject) {
	if (buttonImage && buttonImage.nodeName=='IMG' && $(buttonImage).hasClass('info_button')) { //Button gefunden => Aussehen des Buttons ändern
		if (isVisible(refObject)) { //Referenz-Objekt sichtbar?
			$(buttonImage).setProperty('src', infoButtonUpImageSrc); //Button "Schließen" anzeigen
		}
		else {
			$(buttonImage).setProperty('src', infoButtonDownImageSrc); //Button "Info" anzeigen
		}
	}
}

//////
//Erzeugt ein Mootools-Accordion für die angegebene InfoBox
//infoBox: Referenz auf die InfoBox
function createAccordion(infoBox) {
	var togglers	= $(infoBox).getElements('img.dropdown_button'); //Alle Toggler der aktuellen InfoBox
	var elements	= $(infoBox).getElements(infolayerElement); //Alle Elemente für das Accordion

	var myAccordion = new Accordion($('infobox'), togglers, elements, { //Erzeuge Accordion
		opacity: false,
		display:99,
		alwaysHide:false,
		duration:300,
		transition: Fx.Transitions.Expo.easeOut,
		onActive: function(toggler, element){
			toggler.setProperty('src', dropdownButtonUpImageSrc);
		},
		onBackground: function(toggler, element){
			toggler.setProperty('src', dropdownButtonDownImageSrc);
		},
		onComplete: function(toggler, element){
		}
	});
	
	return myAccordion;
}


//////
// Den Rechner aus- oder einklappen
function toggleRechner() {
	if (isVisible('rechner_toolbar')) {
		$('rechner_toolbar').setStyle('display', 'none');
		$('rechner_standard').setStyle('display', 'block');
	}
	else {
		$('rechner_toolbar').setStyle('display', 'block');
		$('rechner_standard').setStyle('display', 'none');
	}
}

function showInfoText(object, div) {
	for (var i=1; i<=10; i++) {
		o='info'+i;
		if ($(o)) {
			hideLayer(o);
		}
	}

	/*var rows=$$('div.row');
	rows.setStyle('border', '1px solid transparent');
	$(div).setStyle('border', '1px solid #ffffff');*/
	
	showLayer(object);
}


window.addEvent('domready', function() {
	hideRechnerLayer();

	function addClassName(el, sClassName) {
		var s = el.className;
		var p = s.split(" ");
		var l = p.length;
		for (var i = 0; i < l; i++) {
			if (p[i] == sClassName)
				return;
		}
		p[p.length] = sClassName;
		el.className = p.join(" ").replace( /(^\s+)|(\s+$)/g, "" );
	}
	
	function removeClassName(el, sClassName) {
		var s = el.className;
		var p = s.split(" ");
		var np = [];
		var l = p.length;
		var j = 0;
		for (var i = 0; i < l; i++) {
			if (p[i] != sClassName)
				np[j++] = p[i];
		}
		el.className = np.join(" ").replace( /(^\s+)|(\s+$)/g, "" );
	}
	var st = new SortableTable(document.getElementById("ergebnisliste"), sortFields);
	
	// restore the class names
	st.onsort = function () {
		var rows = st.tBody.rows;
		var l = rows.length;
		for (var i = 0; i < l; i++) {
			removeClassName(rows[i], "altRow");
			if (!(i % 2)) {
				addClassName(rows[i], "altRow");
			}
		}
	};


});

