﻿
	// Fuer die PLZ Pruefung eine besondere Methode zum jQuery.validator hinzufuegen, diese
	// ist automatisch als CSS-Klasse verfuegbar.
	jQuery.validator.addMethod("extendedSearchPLZ", function(value, element) {
			
		var tmpPlz = element;
		var tmpUmkreis = jQuery("select.extendedSearchUmkreis").get(0) || false;
		var tmpLand = jQuery("select.extendedSearchLand").get(0) || false;
		
		if(!tmpPlz || !tmpUmkreis || !tmpLand) return true;
		
		// Sollte ein Wert gesetzt sein und mind. funf Ziffern lang sein, dann die Pulldowns auf 30km und Deutschland stellen.
		if ((tmpPlz.getValue() || '').length == 5) {
		
			if (tmpUmkreis.selectedIndex < 1) tmpUmkreis.selectedIndex = 1;
			if (tmpLand.selectedIndex < 1) tmpLand.selectedIndex = 1;
			
		// Andernfalls, wenn kein Wert als PLZ gesetzt ist, dann die Pulldowns resetten.
		} else if (tmpPlz.getValue() == '') {
		
			tmpUmkreis.selectedIndex = 0;
			tmpLand.selectedIndex = 0;
		}
		
		return true;
		
	}, function(e, element) { return element.errorMessages.join('<br />'); });
		
	// Fuer den Umkreis muss ebenfalls eine Validierung her. Ist eine PLZ oder ein Land
	// gesetzt, dann muss Umkreis auf mind. den ersten Wert gesetzt werden. Ist Umkreis
	// gesetzt, aber kein Land und keine PLZ, dann muss Umkreis zurueckgesetzt werden.
	jQuery.validator.addMethod("extendedSearchUmkreis", function(value, element) {
		
		var tmpPlz = jQuery("select.extendedSearchPLZ").get(0) || false;
		var tmpUmkreis = element;
		var tmpLand = jQuery("select.extendedSearchLand").get(0) || false;
		
		if(!tmpPlz || !tmpUmkreis || !tmpLand) return true;
		
		if ((tmpLand.selectedIndex > 0 || tmpPlz.getValue() != '') && tmpUmkreis.selectedIndex == 0) tmpUmkreis.selectedIndex = 1;
		
		if ((tmpLand.selectedIndex < 1 || tmpPlz.getValue() == '') && tmpUmkreis.selectedIndex > 0) tmpUmkreis.selectedIndex = 0;
		
		return true;
		
	}, '');
	
	// Fuer das Land muss ebenfalls eine Validierung her. Ist eine PLZ oder ein Umkreis 
	// gesetzt, dann muss das Land auf mind. den ersten Wert gesetzt werden. Ist Land gesetzt
	// aber weder PLZ noch Umkreis, dann muss Land zurueckgesetzt werden.
	jQuery.validator.addMethod("extendedSearchLand", function(value, element) {
		
		var tmpPlz = jQuery("select.extendedSearchPLZ").get(0) || false;
		var tmpUmkreis = jQuery("select.extendedSearchUmkreis").get(0) || false;
		var tmpLand = element;
		
		if(!tmpPlz || !tmpUmkreis || !tmpLand) return true;
		
		if ((tmpUmkreis.selectedIndex > 0 || tmpPlz.getValue() != '') && tmpLand.selectedIndex == 0) tmpLand.selectedIndex = 1;
		
		if ((tmpUmkreis.selectedIndex < 1 || tmpPlz.getValue() == '') && tmpLand.selectedIndex > 0) tmpLand.selectedIndex = 0;
		
		return true;
		
	}, '');
						
	// Fuer das "bis"-Datum muss noch eine Validierung her, dass wenn dieses Feld sichtbar ist, und im "vom"-Datum was angegeben wurde
	// das hier auch etwas angegeben werden muss.
	jQuery.validator.addMethod("extendedSearchTo", function(value, element) {
															
		var isToOff = ((jQuery('#extendedSearchVom').get(0) || false).checked || false);
		
		if (!isToOff) return true;
		
		var fromEl = jQuery("#esfFromDate").get(0) || false;
		var toEl = element;
		
		if (!toEl || !fromEl) return true;
		
		// Auf dem Element die Fehlermeldungen zuruecksetzen...
		element.errorMessages = [];
		element.isInvalid = false;
		
		if(fromEl.getValue() != '' && element.getValue() == '') {
			
			element.isInvalid = true;
			
			// Auf dem Element die Fehlermeldungen zuruecksetzen...
			element.errorMessages.push(eveErrorMessages.bis);
			
			return false;
		}
		
		// Wenn das andere Invalid ist aber beide leer sind, dann nochmal validieren, weil dann ist es ja wieder heile
		if (fromEl.isInvalid == true && fromEl.getValue() == '' && element.getValue() == '') jQuery('#extendedSearchFormX').validate().element(fromEl);
		
		return true;
		
	}, function(e, element) { return element.errorMessages.join('<br />'); });
	
	
	// Fuer das "von"-Datum muss noch eine Validierung her, dass wenn dieses Feld sichtbar ist, und im "bis"-Datum was angegeben wurde
	// das hier auch etwas angegeben werden muss.
	jQuery.validator.addMethod("extendedSearchFrom", function(value, element) {
															
		var isToOff = ((jQuery('#extendedSearchVom').get(0) || false).checked || false);
		
		if (!isToOff) return true;
		
		var fromEl = element;
		var toEl = jQuery("#esfToDate").get(0) || false;;
		
		if (!toEl || !fromEl) return true;
		
		// Auf dem Element die Fehlermeldungen zuruecksetzen...
		element.errorMessages = [];
		element.isInvalid = false;
		
		if(toEl.getValue() != '' && element.getValue() == '') {
			
			element.isInvalid = true;
			
			// Auf dem Element die Fehlermeldungen zuruecksetzen...
			element.errorMessages.push(eveErrorMessages.von);
			
			return false;
		}
		
		// Wenn das andere Invalid ist aber beide leer sind, dann nochmal validieren, weil dann ist es ja wieder heile
		if (toEl.isInvalid == true && toEl.getValue() == '' && element.getValue() == '') jQuery('#extendedSearchFormX').validate().element(toEl);
		
		return true;
		
	}, function(e, element) { return element.errorMessages.join('<br />'); });
	
	/**
	 * Kleine Hilfsfunktion :), welche in esf_customRange benutzt wird.
	 */
	var esf_stringToDate = function(dateString, tmpDateFormat, tmpFormatSettings, tmpDatePicker) {
		
		try {
				
			return tmpDatePicker.parseDate(tmpDateFormat, dateString, tmpFormatSettings);
		
		} catch(e) {
			
			return false;			
		}
	};
	
	/**
	 * Immer wenn ein Datepicker aufgerufen wird, wird hier geprueft, welches evtl. ausgewaehlte
	 * Datum die jeweiligen Input-Felder bereits haben, um evtl. zeitliche Restriktionen fuer die
	 * "von" und "bis" Inputs/Datepicker setzen zu koennen.
	 *
	 * @param	{element}	input		Input-Element dessen Datepicker geoeffnet wird.
	 * @param	{object}	whatever	NOT USED
	 * @param	{string}	checkBoxId	Id der Checkbox fuer "Von/Bis" oder "Am"-Status
	 * @param	{string}	fromId		Id des Eingabefelds fuer das Startdatum
	 * @param	{string}	toId		Id des Eingabefelds fuer das Enddatum
	 */
	var esf_customRange = function(input, whatever, checkBoxId, fromId, toId) { 
		
		var now = new Date();
		now = new Date(now.getFullYear(), now.getMonth(), now.getDate()); // Datum der jetzt-Zeit so erzeugen, dass es 0 Uhr ist.
		
		var isToOff = ((jQuery('#'+checkBoxId).get(0) || false).checked || false);
		
		var toEl    = jQuery("#"+toId).get(0) || false;
		var toDate  = jQuery(toEl).datepicker("getDate");
		var toValue = toEl.getValue();
			
		var fromEl    = jQuery("#"+fromId).get(0) || false;
		var fromDate  = jQuery(fromEl).datepicker("getDate");
		var fromValue = fromEl.getValue();
		
		// Wenn es einen Inhalt im input gibt, dann vorher sicherstellen, dass dieser
		// bei "von" nicht aelter als das aktuelle Datum ist.
		
		// Hinweis: Da die erweiterte Suche auch in anderen Laendern benutzt wird und diese
		// ggf. verschiedene Formatierungen fuer das Datum haben wird einfach der Datepicker
		// benutzt, da dieser sprach/land-abhaengig weiss, welche Formatierung gerade
		// genutzt wird (jquery.datepicker.js).
		var tmpDatePicker     = jQuery.datepicker; // Shortcut...
		var tmpInstance       = jQuery.data(input, 'datepicker'); // Instanz des Datepickers passend zum Input-Feld holen...
		var tmpDateFormat     = tmpDatePicker._get(tmpInstance, 'dateFormat'); // Aktuelles Datum-Format ermitteln...
		var tmpFormatSettings = tmpDatePicker._getFormatConfig(tmpInstance); // Aktuelle Einstellungen fuer das Format ermitteln...
		var tmpNowString      = tmpDatePicker.formatDate(tmpDateFormat, now, tmpFormatSettings); // Datum-String fuer "jetzt" erstellen
		
		// Gibt es ein "von"-Datum, dann validieren...
		if(fromValue != "") {
			
			// Pruefen ob das "von" Datum kleiner als das aktuelle ist, wenn ja, dann setze das von-Datum auf das aktuelle...
			var tmpFromDate = esf_stringToDate(fromValue, tmpDateFormat, tmpFormatSettings, tmpDatePicker);
		
			if (!tmpFromDate || tmpFromDate < now) {
				
				fromEl.value = fromValue = tmpNowString;
				fromDate = now;
			}
		}
		
		// Gibt es ein "bis"-Datum, dann validieren...
		if(toValue != "") {
			
			// Pruefen ob das "bis" Datum kleiner als das aktuelle ist, wenn ja, dann setze es auf das aktuelle...
			var tmpToDate = esf_stringToDate(toValue, tmpDateFormat, tmpFormatSettings, tmpDatePicker);
		
			if(!tmpToDate || tmpToDate < now) {
				
				toEl.value = toValue = tmpNowString;
				toDate = now;
			}
		}
		
		// Gibt es ein "von" und ein "bis"-Datum, dann beide gegenpruefen...
		if(fromValue != "" && toValue != "") {
			
			// Pruefen ob das "bis" Datum kleiner als das "von"-Datum ist, wenn ja, dann setze es auf das "von"-Datum...
			var tmpToDate = esf_stringToDate(toValue, tmpDateFormat, tmpFormatSettings, tmpDatePicker);
			var tmpFromDate = esf_stringToDate(fromValue, tmpDateFormat, tmpFormatSettings, tmpDatePicker);
				
			if(tmpToDate < tmpFromDate) {
				
				toEl.value = toValue = fromValue;
				toDate = fromDate;
			}
		}
		
		// Wenn das aktuelle Input das "von"-Input ist, dann darf kein hoeheres Datum ausgewaehlt werden,
		// als im "bis"-Input angegeben (ist kein "bis"-Datum angegeben, dann gibt es keine
		// Beschraenkungen). Wichtig: Wenn das "bis"-Feld nicht genutzt wird, darf es logischer weise keine
		// Beschraenkung geben.
		// Weiterhin darauf achten, dass wenn das Input einen Wert hat, dass "Auswahl aufheben" moeglich ist,
		// dazu wird mandatory auf false gesetzt, damit der Knopf sichtbar wird.
		if (input.id == fromId) {
		
			return { mandatory : ((input.getValue() == '') ? true : false), minDate : now, maxDate : ((toValue == '' || isToOff) ? null : toDate ) };
			
		} else {
		
			// Sicherstellen, dass das fromDate mind. einen Tag spaeter zur Auswahl gibt...
			if(fromValue != "") fromDate.setTime(fromDate.getTime() + (1 * 24 * 60 * 60 * 1000));
			
			return { mandatory : ((input.getValue() == '') ? true : false), minDate : ((fromValue == '') ? now : fromDate ), maxDate : null };
		}
	};
	
	
	/**
	 * Funktion zum Ein- und Ausblenden des "Bis"-Eingabefeldes. Wird von esf_switchBetweenAndAtDate benutzt.
	 *
	 * @param	{boolean}	show		True, wenn das "Bis"-Eingabefeld angezeigt werden soll.
	 * @param	{string}	fromId		Id des Eingabeelements fuer das Startdatum
	 * @param	{string}	toId		Id des Eingabeelements fuer das Enddatum
	 * @param	{string}	hideId		Id des Containers der unsichtbar gemacht werden soll, um beim "Am"-Modus das "Bis"-Eingabefeld zu verstecken.
	 */
	var esf_showHideFromTo = function(show, fromId, toId, hideId) {
		
		var show = show || false;
		
		// Pruefen ob das "von"-Datum hoeher ist als das "bis" Datum, wenn ja
		// anpassen.
		var fromEl    = jQuery("#"+fromId).get(0) || false;
		var fromDate  = jQuery(fromEl).datepicker("getDate");
		var fromValue = fromEl.getValue();
		
		var toEl    = jQuery("#"+toId).get(0) || false;
		var toDate  = jQuery(toEl).datepicker("getDate");
		var toValue = toEl.getValue();
		
		var hideEl  = jQuery('#'+hideId).get(0) || false;
		
		if (hideEl) jQuery(hideEl)[((show) ? 'show' : 'hide')]();
		
		if (show) {
		
			if (fromDate > toDate && toValue != "" && fromValue != "") {
			
				toEl.value = fromValue;
				jQuery(toEl).blur();
			}
		}
		
		jQuery('#extendedSearchFormX').validate().element(fromEl);
		jQuery('#extendedSearchFormX').validate().element(toEl);
	};
	
	
	/**
	 * Erstellt Buttons zum hin und herschalten zwischen "Von ... bis ..." und "Am ...".
	 *
	 * @param	{string}	betweenCheckBoxId	Id der Checkbox fuer den "Zeitraum"-Modus
	 * @param	{string}	atCheckBoxId		Id der Checkbox fuer den "Am"-Modus
	 * @param	{string}	fromId				Id des Eingabeelements fuer das Startdatum
	 * @param	{string}	toId				Id des Eingabeelements fuer das Enddatum
	 * @param	{string}	hideId				Id des Containers der unsichtbar gemacht werden soll, um beim "Am"-Modus das "Bis"-Eingabefeld zu verstecken.
	 */
	var esf_switchBetweenAndAtDate = function(betweenCheckBoxId, atCheckBoxId, fromId, toId, hideId) {
		
		// Wenn Radiobuttons fuer "von bis" angewaehlt, dann entsprechend die "Von/Bis" Zeile 
		// darstellen oder auch nicht. Dabei darauf achten, dass wenn "am" ausgewaehlt wurde
		// des "vom"-Input keine Restriktionen vom "bis"-Input bzw. dessen Datepicker erhaelt!
		var zeitVonEl = jQuery('#'+betweenCheckBoxId).get(0);
		var zeitBisEl = jQuery('#'+atCheckBoxId).get(0);
		
		jQuery(zeitVonEl).click(esf_showHideFromTo.scope(zeitVonEl, [true, fromId, toId, hideId]));
		jQuery(zeitBisEl).click(esf_showHideFromTo.scope(zeitBisEl, [false, fromId, toId, hideId]));
		
		// Nach dem Laden des Dokumentes die evtl. gesetzte Vorauswahl pruefen
		// und ggf. Events fuer "von/bis" oder "am" Anzeige ausloesen.
		jQuery( ((!(zeitBisEl.checked || false)) ? zeitVonEl : zeitBisEl ) ).click();	
	};
	
	
	/**
	 * Erstellt die Konfiguration fuer den Datepicker und initialisiert diesen dann.
	 *
	 * @param	{string}	atCheckBoxId		Id des Checkbox "Am"
	 * @param	{string}	fromId			Id des Eingabeelements fuer das Startdatum
	 * @param	{string}	toId			Id des Eingabeelements fuer das Enddatum
	 * @param	{boolean}	showIcon		Optional: Wenn true, wird ein Date-Picker-Icon angezeigt.
	 */
	var esf_setupDateRangeFields = function(atCheckBoxId, fromId, toId, showIcon) {
		
		var tmpFunc = function(date, el) {
			
			var tmpInput = el.input[0] || false;
			
			if(!tmpInput) return;
			
			jQuery(tmpInput).triggerHandler('focus');
			jQuery(tmpInput).triggerHandler('blur');
			jQuery('#extendedSearchFormX').validate().element(tmpInput);
		};
		
		var dpCfg = {
		
			beforeShow      : esf_customRange.scope(window, [atCheckBoxId, fromId, toId], true), 
			showOtherMonths : true,
			minDate         : new Date(),
			showAnim        : (jQuery.browser.msie) ? 'show' : 'fadeIn',
			duration        : (jQuery.browser.msie) ? '' : 'normal',
			yearRange       : (new Date()).getFullYear() + ':' + ((new Date()).getFullYear() + 2 ),
			closeAtTop      : false,
			changeFirstDay  : false,
			onClose         : tmpFunc,
			onSelect        : tmpFunc
		};
		
		if ((showIcon || false)) {
			
			dpCfg.buttonImage     = 'http://master.eventim.de/img/cal.gif';
			dpCfg.buttonText      = 'Choose';
			dpCfg.buttonImageOnly = true;
			dpCfg.showOn          = 'both';
		}
		
		// "Am" und "Bis"-Inputs mit Datepicker belegen.
		jQuery('#'+fromId+', #'+toId).datepicker(dpCfg);
	};
	
	
	/**
	 * Initialisiert das "Erweiterte Suchformular" mit allen benoetigten Effekten.
	 *
	 * @param	{string}	formId			Id des Formulars "Erweiterte Suche"
	 * @param	{string}	fromId			Id des Eingabeelements fuer das Startdatum
	 * @param	{string}	toId			Id des Eingabeelements fuer das Enddatum
	 * @param	{string}	checkBetweenId	Id der Checkbox "Von/bis"
	 * @param	{string}	checkAtId		Id des Checkbox "Am"
	 * @param	{string}	toContainerId	Id des Containers fuer das "Enddatum"-Eingabeelement, welches versteckt wird, wenn "am" angewaehlt wurde.
	 * @param	{string}	plzId			Id des Eingabefeldes fuer PLZ.
	 * @param	{string}	umkreisId		Id der Auswahlbox fuer den Umkreis.
	 * @param	{string}	landId			Id der Auswahlbox fuer das Land.
	 * @param	{string}	radiusLabel		Optional: Betitelung fuer das Umkreis-Pulldown.
	 * @param	{string}	landLabel		Optional: Betitelung fuer das Land-Pulldown.
	 * @param	{boolean}	showIcon		Optional: Wenn true, wird ein Date-Picker-Icon angezeigt.
	 */
	var esf_setupExtendedSearchForm = function(formId, fromId, toId, checkBetweenId, checkAtId, toContainerId, plzId, radiusId, landId, radiusLabel, landLabel, showIcon) {
		
		/** Submit-Event: Validation ... */
		jQuery('#' + formId).submit(function() {
			
			var tmpErrors = [];
			var tmpErrorMsg = '';
			
			var fromEl = jQuery("#"+fromId).get(0);
			var toEl   = jQuery("#"+toId).get(0);
			
			// Angabe des Datums pruefen, ob korrekt angegeben
			var isToOff = ((jQuery('#'+checkAtId).get(0) || false).checked || false);
			
			// Wenn nur "am" aktiv ist, dann vor dem Senden noch das von-Datum ins bis-Datum schreiben.
			if (isToOff) toEl.value = fromEl.value || '';
			
			if (fromEl.getValue() != '' || toEl.getValue() != '') {
				
				(jQuery('#' + formId + ' input[name=sort_by]').get(0)).value = 'evdatum';
				(jQuery('#' + formId + ' input[name=sort_direction]').get(0)).value = 'asc';
				
			} else {
				
				(jQuery('#' + formId + ' input[name=sort_by]').get(0)).value = 'score';
				(jQuery('#' + formId + ' input[name=sort_direction]').get(0)).value = 'desc';
			}
			
			return;
		});
		
		// Radiobuttons mit Umschaltmoeglichkeit zwischen bestimmten Tag und Zeitraum ausstatten.
		esf_switchBetweenAndAtDate(checkBetweenId, checkAtId, fromId, toId, toContainerId);
			
		// "Am" und "Bis"-Inputs mit Datepicker belegen.
		esf_setupDateRangeFields(checkAtId, fromId, toId, (showIcon || false));
		
		// In die Umkreissuche und Landauswahl noch einen Text einfuegen, falls keiner da ist.
		var radiusEl, tmpLand;
		
		if ((radiusLabel || '') != '') {
		
			if (radiusEl= (jQuery('#'+radiusId).get(0) || false)) {
				
				radiusEl.options[0].text = radiusLabel;
				radiusEl.options[0].style.color = '#aaa';
			}
		}
		
		if ((landLabel || '') != '') {
			
			if (tmpLand= (jQuery('#'+landId).get(0) || false)) {
			
				tmpLand.options[0].text = landLabel;
				tmpLand.options[0].style.color = '#aaa';
			}
		}
	};