$(function() {
	// Aktiviert/Deaktiviert das DropDownMainMenu
	var activateDropDownMainMenu = true;
	
	function resizeInformation(newwidth, newheight) {
		var informationElement = null;
		if (!$('#information-ekst-content').is(':visible')) {
			informationElement = $('#information-ekst-content');
		} else if (!$('#information-lst-content').is(':visible')) {
			informationElement = $('#information-lst-content');
		} else if (!$('#information-service-content').is(':visible')) {
			informationElement = $('#information-service-content');
		}
		if (newElement != null) {
			// $(informationElement).height(newheight).width(newwidth);
			console.log("höhe: " + newheight + " Breite: " + newwidth);
		}
	}

	function checkNavigationInformationVisible() {
		return $('#information-ekst-content').is(':visible')
				|| $('#information-lst-content').is(':visible')
				|| $('#information-service-content').is(':visible');
	}

	/**
	 * Oeffnet das Informationsfenster
	 * 
	 * @param targetId
	 */
	function openInformation(targetId) {
		var btn = document.getElementById(targetId);
		var content = document.getElementById(targetId + "-content");
		var closeButton = content.getElementsByClassName("bmf-info-close")[0];

		// Element anzeigen
		content.style.display = "flex";
		// Default-Wert setzen, durch das Verschieben in den Header, muss dies
		// manuel passieren, da sonst die Werte vom Parent
		// uebernommen werden.
		var aktuell = $('.bmf-info-content');
		aktuell.toggleClass('ui-state-default', true);

		closeButton.onclick = function() {
			content.style.display = "none";
			btn.focus();
		}
		closeButton.focus();

		// Versteckt das Element wieder
		window.onclick = function(event) {
			if (event.target == content) {
				content.style.display = "none";
				btn.focus();
			}
		}

		// Versteckt das Element wieder ueber Tastatureingabe
		document.onkeydown = function(evt) {
			// if (content.style.display == "flex") {
			evt = evt || window.event;
			var isEscape = false;
			// console.log("key: " + evt.key);
			// console.log("keyCode: " + evt.keyCode);
			if (evt.hasOwnProperty('key')) {
				isEscape = (evt.key.toLowerCase() == "escape" || evt.key
						.toLowerCase() == "esc");
			} else {
				isEscape = evt.keyCode == 27;
			}
			if (!isEscape && isInfoButtonClosePressed(evt)) {
				isEscape = true;
			}
			// close modal Fenster
			if (isEscape) {
				content.style.display = "none";
				btn.focus();
				evt.preventDefault();
				evt.stopPropagation();
			}

			// Alle fokusierbaren Objekte
			// var canfocus = $(':focusable');
			if (isTabKeyPressed(evt) === true) {
				var focusedElement = $(document.activeElement);

				if (isCloseButtonFocused(evt)) {
					evt.preventDefault();
					//
					if (evt.shiftKey) {
						// Focus previous input
						var logo = $(content).find(
								".bmf_navigation_link_last_dialog");
						logo.focus();
					} else {
						var logo = $(content).find(".bmf_dlg_logo_id_js_tab");
						logo.focus();
					}

				} else if (focusedElement != undefined
						&& focusedElement
								.hasClass("bmf_navigation_link_last_dialog")) {
					if (!evt.shiftKey) {
						evt.preventDefault();
						closeButton.focus();
					}
				}
			}

			// Pfeilnavigation
			// if (checkNavigationInformationVisible()) {
			// pfeilNavigation(evt, content);
			// }
		}

		return false;
	}

	function pfeilNavigation(evt, content) {
		evt = evt || window.event;
		var code = evt.keyCode;
		if (evt.hasOwnProperty('key')) {
			if (evt.key.toLowerCase() == "arrowup") {
				doPfeilHoch(evt, content);
			} else if (evt.key.toLowerCase() == "arrowdown") {
				doPfeilRunter(evt, content);
			}
		} else {
			// Pfeil hoch
			if (code === 38) {
				doPfeilHoch(evt, content);
			} else
			// Pfeil runter
			if (code === 40) {
				doPfeilRunter(evt, content);
			}
		}
	}

	function doPfeilHoch(evt, content) {
		content.scrollTop += 10;
		evt.preventDefault();
		evt.stopPropagation();
	}

	function doPfeilRunter(evt, content) {
		content.scrollTop -= 10;
		evt.preventDefault();
		evt.stopPropagation();
	}

	function checkIfChildInParent(child, parentId) {
		if (child.parent().get(0).id == parentId) {
			return true;
		} else if (child.parent() == undefined
				|| child.parent().get(0) == undefined
				|| child.parent().get(0).id == undefined) {
			return false;
		} else {
			return checkIfChildInParent(child.parent(), parentId);
		}
	}

	/**
	 * Liefert den URL-Wert fuer die Variable zurueck, falls nicht vorhanden
	 * return null.
	 */
	$.urlParameter = function(variableName) {
		var results = new RegExp('[\?&]' + variableName + '=([^&#]*)')
				.exec(window.location.href);
		if (results == null) {
			return null;
		} else {
			return decodeURIComponent(results[1]) || 0;
		}
	}

	/**
	 * Notwendig fuer IE8-Support
	 */
	function strStartsWith(str, prefix) {
		return str.indexOf(prefix) === 0;
	}

	/**
	 * Liefert den aktuellen Seitennamen zurueck.
	 */
	function getPage() {
		var page = window.location.href;
		page = page.substring((page.lastIndexOf("/") + 1), page.length);
		if (page.indexOf("?") >= 0) {
			page = page.substring(0, page.indexOf("?"));
		}
		// Falls eine Session eroeffnet wurde
		if (page.indexOf(";") >= 0) {
			page = page.substring(0, page.indexOf(";"));
		}
		// Falls das letzte Zeichen # ist
		if (page.indexOf("#") == (page.length - 1)) {
			page = page.substring(0, page.indexOf("#"));
		}
		return page;
	}

	/**
	 * Liefert zurueck, welcher Tab aktiv sein soll.
	 */
	function getActiveTab() {
		var page = getPage();
		if (strStartsWith(page, "resultbl")
				|| strStartsWith(page, "eingabeformbl")
				|| strStartsWith(page, "resultfb")
				|| strStartsWith(page, "eingabeformfb")
				|| strStartsWith(page, "eingabeformbdj")
				|| strStartsWith(page, "alcontent")) {
			return 0;
		}
		if ($.urlParameter('st') == "st-ekst-tb"
				|| page == "eingabeformekst.xhtml") {
			return 1;
		}
		if (page == "einganginterface.xhtml" || page == "programmablauf.xhtml"
				|| page == "pseudocodes.xhtml") {
			return 2;
		}

		return false;
	}

	var accordionActive = getActiveTab();

	/**
	 * Prueft ob Enter gedrueckt wurde.
	 */
	function isEnterPressed(evt) {
		evt = evt || window.event;
		var isEnter = false;
		if (evt.hasOwnProperty('key')) {
			isEnter = evt.key.toLowerCase() == "enter";
		} else {
			isEnter = evt.keyCode == 13 || evt.which == 13;
		}

		return isEnter;
	}

	/**
	 * Prueft ob Tab gedrueckt wurde. Zusaetzlich gedrueckte Tasten werden
	 * ignoriert.
	 */
	function isTabKeyPressed(evt) {
		evt = evt || window.event;
		var iskey = false;
		if (evt.hasOwnProperty('key')) {
			// console.log(evt.key.toLowerCase());
			// console.log(evt.shiftKey);
			iskey = evt.key.toLowerCase() == "tab";
		} else {
			var checkKey = 9;
			iskey = evt.keyCode == checkKey || evt.which == checkKey;
		}

		return iskey;
	}

	/**
	 * Prueft ob TAB gedrueckt wurde. Zusaetzlich wird auf die Taste SHIFT
	 * geprueft. Diese darf nicht in Kombination mit TAB auftreten.
	 */
	function isOnlyTabKeyPressed(evt) {
		evt = evt || window.event;
		var iskey = false;
		if (!evt.shiftKey) {
			if (evt.hasOwnProperty('key')) {
				iskey = evt.key.toLowerCase() == "tab";
			} else {
				var checkKey = 9;
				iskey = evt.keyCode == checkKey || evt.which == checkKey;
			}
		}

		return iskey;
	}

	/**
	 * Prueft ob ein InfoButton gedrueckt wurde.
	 */
	function isInfoButtonPressed(event) {
		var focusedElement = $(document.activeElement);
		return isEnterPressed(event)
				&& focusedElement.hasClass("bmf-info-button");
	}

	/**
	 * Prueft ob ein InfoButton gedrueckt wurde.
	 */
	function isInfoButtonClosePressed(event) {
		return isEnterPressed(event) && isCloseButtonFocused(event);
	}

	/**
	 * Prueft ob ein CloseButton fokusiert ist.
	 */
	function isCloseButtonFocused(event) {
		var focusedElement = $(document.activeElement);
		var parentId = focusedElement.parent().parent().get(0).id;
		return (focusedElement.hasClass("bmf-info-close") || startetMit(
				parentId, "dialog_id_"));
	}

	/**
	 * Prueft ob testdata genauso beginnt wie der input-string
	 * 
	 * @param testdata
	 *            Der zu testende String
	 * @param input
	 *            Pruefwert
	 */
	function startetMit(testdata, input) {
		return testdata.length >= input.length
				&& testdata.substring(0, input.length) === input;
	}

	/**
	 * Initialisierung des Accordions
	 */
	$(".menu-accordion")
			.accordion(
					{
						header : ".accordion-bmf-header",
						collapsible : true,
						active : accordionActive,
						heightStyle : 'panel',
						icons : false,
						beforeActivate : function(event, ui) {
							// Falls eines der Informationsfenster des Accordion
							// sichtbar ist => mache nichts
							var focusedElement = $(document.activeElement);
							if (checkNavigationInformationVisible()
									|| isInfoButtonPressed(event)) {
								return false;
							}
							// The accordion believes a panel is being
							// opened
							if (ui.newHeader[0]) {
								var currHeader = ui.newHeader;
								var currContent = currHeader
										.next('.ui-accordion-content');
								// The accordion believes a panel is being
								// closed
							} else {
								var currHeader = ui.oldHeader;
								var currContent = currHeader
										.next('.ui-accordion-content');
							}

							// Since we've changed the default behavior,
							// this detects the actual status
							var isPanelSelected = currHeader
									.attr('aria-selected') == 'true';

							// Switch fuer H2 um die Farbe anzupassen
							var currh2 = currHeader
									.find('.accordion-bmf-header-h2');
							currh2.toggleClass('ui-state-default',
									isPanelSelected).toggleClass(
									'ui-state-active', !isPanelSelected);

							// Toggle the panel's header
							currHeader
									.toggleClass('ui-corner-all',
											isPanelSelected)
									.toggleClass(
											'accordion-header-active ui-state-active ui-corner-top',
											!isPanelSelected).attr(
											'aria-selected',
											((!isPanelSelected).toString()));

							// Toggle the panel's icon
							currHeader.children('.ui-icon').toggleClass(
									'ui-icon-triangle-1-e', isPanelSelected)
									.toggleClass('ui-icon-triangle-1-s',
											!isPanelSelected);

							// Toggle the panel's content
							currContent.toggleClass('accordion-content-active',
									!isPanelSelected)
							if (isPanelSelected) {
								/**
								 * Dieser Bereich schliesst alle Tabs wieder.
								 * Auskommentieren und Methode accordionOpenAll
								 * im ready einkommentieren.
								 */
								if (activateDropDownMainMenu) {
									currContent.slideUp('fast');
									// close all menu
									var sections = $('.menu-accordion').find(
											"h2");
									sections.each(function(index, section) {
										if ($(section).hasClass(
												'ui-state-active')) {
											$(section).click();
										}
									});
								}
							} else {
								currContent.slideDown('fast');
							}

							return false;
						}

					});

	$(".accordion-information a").click(function(event) {
		if (isMainPopupInformation(this.id)) {
			openInformation(this.id);
		}
	});

	$(".bmf-info-close").click(function(event) {
		var content = this.parentNode.parentNode;
		content.style.display = "none";
		return false;
	});

	/**
	 * Prueft ob eines der Hauptnavigationspopups gedrueckt wurde.
	 */
	function isMainPopupInformation(id) {
		return id == 'information-ekst' || id == 'information-lst'
				|| id == 'information-service';
	}

	$(".bmf-info-content").click(function(event) {
		event.stopPropagation();
	});

	$(document).on("click", ".bmf-informations-popup", function(event) {
		openInformation(this.id);
	});

	/**
	 * Close Informationbox
	 */
	$(document).on("click", ".si_infobox_close", function(event) {
		$(".template_infobox").hide();
		event.preventDefault();
	});

	/**
	 * Close Fehlerbox
	 */
	$(document).on("click", ".si_fehlerbox_close", function(event) {
		$(".template_fehlerbox").hide();
		event.preventDefault();
	});
	
	/**
	 * Input-Feld Selektierung des Inhalts
	 */
	$(document).on("click", "input", function(event) {
		$(this).select();
	});
	
	/**
	 * Close Screenreader Information
	 */
	function closeInformationScreenreader(){
		$(".information_screenreader").hide();
	}

	$(document).on("click", "#information_service_infobox", function(event) {
		var input = $("#information-service");
		input.trigger('click');
	});

	$(window).resize(function() {
		// var newwidth = $(window).innerWidth();
		// var newheight = $(window).innerHeight();
		var newwidth = $(window).width();
		var newheight = $(window).height();
		// resizeInformation(newwidth, newheight);
	});

	$(".accordion-information a")
			.on(
					'keydown',
					function(event) {
						if ((event.which == 13 || event.key == "Enter" || event.keyCode == 13)
								&& isMainPopupInformation(this.id)) {
							openInformation(this.id);
							event.preventDefault();
							event.stopPropagation();
						}
					});

	function setActiveClass() {
		var active = $(".menu-accordion").accordion("option", "active");
		if (active == 0 || active == 1 || active == 2) {
			var aktuell = $('.menu-accordion .ui-accordion-header-active')
					.find(".accordion-bmf-header-h2");
			aktuell.toggleClass('ui-state-active', true);
		}
	}

	$('.bmf-info-content a').keydown(
			function(e) {
				// Nur wenn eine Infobox der Hauptnavigation geoeffnet ist.
				if (checkNavigationInformationVisible()) {
					if (e.which == 13) {// Enter key pressed
						if ($(this).attr("onClick") == undefined
								|| $(this).attr("onClick") == null) {
							window.location = $(this).attr("href");
						}
						$(this).trigger('click');
					}
				}
			});

	/**
	 * Verwendung des ersten Buttons fuer inputTextEM ist DEFAULT. Die
	 * Verwendung von $(document).on ist hier Pflicht, weil beim Ajax-Update
	 * Elemente neu Hinzugefuegt werden und der Aufruf ueber
	 * $('.inputTextEM').keydown nicht mehr funktioniert.
	 */
	$(document).on('keydown', '.inputTextEM', function(e) {
		if (isEnterPressed(e)) {// Enter key pressed
			var element = $('#fb_form\\:' + 'income_fb_em');
			element.trigger('click');
//			element.focus();
//			element.select();
			// Default-Vorgabe unterbinden, damit nicht erster Button verwendet
			// wird.
			e.preventDefault();
			e.stopPropagation();
		}
	});
	
	/**
	 * Reagiert auf Enter-Eingabe bei der Berechnung der Einkommensteuer.
	 */
	$(document).on('keydown', '#bmf_form_ekst\\:ekst_bj', function(e) {
		if (isEnterPressed(e)) {// Enter key pressed
			var element = $('#bmf_form_ekst\\:income_ekst');
			element.trigger('click');
			e.preventDefault();
			e.stopPropagation();
		}
	});
	
	$(document).on('keydown', '.inputTextAuswahl', function(e) {
		if (isEnterPressed(e)) {// Enter key pressed
			var element = $('#bl_form\\:' + 'income_bl');
			element.trigger('click');
			e.preventDefault();
			e.stopPropagation();
		}
	});

	/**
	 * Reagiert auf Enter-Eingabe beim Lebenspartner B fuer die Berechnung. Die
	 * Verwendung von $(document).on ist hier Pflicht, weil beim Ajax-Update
	 * Elemente neu Hinzugefuegt werden und der Aufruf ueber
	 * $('.inputTextEF').keydown nicht mehr funktioniert.
	 */
	$(document).on('keydown', '.inputTextEF', function(e) {
		if (isEnterPressed(e)) {// Enter key pressed
			var element = $('#fb_form\\:' + 'income_fb_ef');
			element.trigger('click');
//			element.focus();
//			element.select();
			// Default-Vorgabe unterbinden, damit nicht erster Button verwendet
			// wird.
			e.preventDefault();
			e.stopPropagation();
		}
	});

	$(document).on('keydown', '#bl_form\\:in_steuerklasse', function(e) {
		if (isOnlyTabKeyPressed(e)) {// Enter key pressed
			var inputSelect = $("#bl_form\\:in_steuerklasse").val();
			if (inputSelect < 5) {
				focusNewElement("#bl_form\\:in_kinderfrei");
			} else if (inputSelect < 7) {
				focusNewElement("#bl_form\\:in_kirchensteuer");
			} else if (inputSelect == 7) {
				focusNewElement("#bl_form\\:in_faktor");
			}
			// Default-Vorgabe unterbinden, damit nicht erster Button verwendet
			// wird.
			e.preventDefault();
			e.stopPropagation();
		}
	});

	$(document).ready(function() {
		// Ueberpruefen ob die URL den Druckparameter enthaelt, falls ja
		// drucken.
		if ($.urlParameter('druckansicht') != null) {
			window.print();
		}

		// Pruefen ob Accordion geoffnet, falls ja, Style active setzen
		setActiveClass();

		// Initialisiere Datepicker, wenn moeglich
		// $.datepicker.setDefaults($.datepicker.regional['de']);

		// Autofocus
		bmfAutofocus();

		// $("input[id*='in_geburtsjahr']").datepicker({
		// changeYear : true
		// });

		/**
		 * Damit nicht dauernd alle Tabs geoeffnet sind, muss diese Methode
		 * kommentiert und im Accordion, in der 'beforeActivate'-Funktion, der
		 * Bereich von 'if(isPanelSelected)' auskommentiert werden.
		 */
		if (!activateDropDownMainMenu) {
			accordionOpenAll();
		}
		
		setHotkeyURL();
		setLeseansichtURL();
		setJahresbetragURL();
	});
	
	function setHotkeyURL() {
		var inputValue = $('#startseite_menusteuerung_hotkey\\:hidden_input_url').val();
		$("#startseite_menusteuerung_hotkey").attr('action', inputValue);
	}
	
	function setLeseansichtURL() {
		var inputValue = $('#startseite_menusteuerung_leseansicht\\:hidden_input_url').val();
		$("#startseite_menusteuerung_leseansicht").attr('action', inputValue);
	}
	
	function setJahresbetragURL() {
		var inputValue = $('#bdj_form\\:hidden_input_url').val();
		$("#bdj_form").attr('action', inputValue);
	}

	/**
	 * Oeffnet alle Tabs.
	 */
	function accordionOpenAll() {
		$('.accordion-bmf-header').next().slideDown('fast');
		$("#status").text("Opened");
	}

	/**
	 * Da HTML 4.01 verwendet wird, kann hier nicht passthrough verwendet
	 * werden, da dies zu Validierungsfehlern fuehrt.
	 */
	function bmfAutofocus() {
		var page = getPage();
		if ($(".inputInvalid").length > 0) {
			// Ist ein Validierungsfehler vorhanden, so muss auf dieses Element
			// der Fokus gelegt werden.
			var element = $(".inputInvalid").first();
			element.focus();
			element.select();
		} else if (strStartsWith(page, "eingabeformfb")) {
			var input = $("[id='fb_form:in_beschaeftverhaeltnis_em']");
			if ($.urlParameter('pv') != null) {
				input = $("[id='fb_form:in_kinderfrei']");
			}
			input.focus();
			input.select();
		} else if (strStartsWith(page, "resultbl")
				|| strStartsWith(page, "resultfb")) {
//			var input = $(".bmf_link_ls_erstes_ls_jahr");
			var input = $("#id-infobox-focus");
			if(input.length <= 0){
				input = $(".form_button_icon_druck_style");
			}
			input.focus();
			input.select();
		} else if (strStartsWith(page, "eingabeformbl")) {
			var input = $("[id='bl_form:in_geburtsjahr']");
			input.focus();
			input.select();
		} else if (page == "eingabeformekst.xhtml") {
			var isResultPage = false;
			var param = $.urlParameter('ekst-result');
			if (param != undefined && param != null) {
				if (param == 'true') {
					var input = $("#id-infobox-focus");
					if(input.length <= 0){
						input = $(".form_button_icon_druck_style");
					} 
					if (input.length <= 0){
						input = $("#information-ekst-result");
					}
					input.focus();
					input.select();
					isResultPage = true;
				}
			}
			if (!isResultPage) {
				var input = $("[id='bmf_form_ekst:ekst_zve']");
				input.focus();
				input.select();
			}
		} else if (page == "programmablauf.xhtml"
				|| page == "pseudocodes.xhtml") {
			var input = $(".bmf_focus_li > :first-child a");
			input.focus();
			input.select();
		} else if (page == "einganginterface.xhtml") {
			// Escape von ':', weil dies in JSF zur ID gehoert.
			var input = $("#uiExternSchnittstelleForm\\:income_ext_interface_hinweis");
			input.focus();
			input.select();
		} else {
			var param = $.urlParameter('st');
			if (param != undefined && param != null) {
				if (param == 'st-ekst-tb') {
					var input = $("#ekst-tarif-info a").first();
					input.focus();
					input.select();
				}
			}
		}
	}
});
