(function($){
	$.fn.popupform = function(options) {

		var opts = $.extend({}, $.fn.popupform.defaults, options);

		return this.each(function() {
			$this = $(this);

			var url = $this.attr("href");

			$.fn.popupform.settings = $.meta ? $.extend({}, opts, $this.data()) : opts;

			$this.click(function() {
				$("body")
					.append('<div id="' + $.fn.popupform.settings.overlayElement + '"></div>');
				$("#" + $.fn.popupform.settings.overlayElement)
					.css("height",$(document).height())
					.css("opacity",0).fadeTo($.fn.popupform.settings.fading,$.fn.popupform.settings.backgroundOpacity,function() {
						$.ajax({
							url: url,
							cache: true,
							success: function(html){
								$.fn.popupform.showPopupElement(html);
								$.fn.popupform.handleCloseButton();
								$.fn.popupform.handleSubmitButton();
								$.fn.popupform.bindDatePicker();
							}
						});
					});
				return false;
			});
		});
	};

	function debug($obj) {
		if (window.console && window.console.log) {
			window.console.log('selection count: ' + $obj.size());
		}
	};

	$.fn.popupform.defaults = {
		backgroundOpacity: 0.8,
		closingElement: "a.label-close-window",
		contentElement: "content",
		overlayElement: "overlay",
		popupElement: "window",
		submitElement: "button#submitter",
		fading: "fast"
	};

	$.fn.popupform.showPopupElement = function(html) {
		$("body").append('<div id="' + $.fn.popupform.settings.popupElement + '"></div>');
		$("#" + $.fn.popupform.settings.popupElement).append(html);
		$("#" + $.fn.popupform.settings.popupElement).css({
			"top": $("#" + $.fn.popupform.settings.contentElement).offset().top + $(document).scrollTop(),
			"left": $("#" +$.fn.popupform.settings.contentElement).offset().left
		}).hide().fadeIn($.fn.popupform.settings.fading);
	};

	$.fn.popupform.hidePopupElement = function(){
		$("#" + $.fn.popupform.settings.popupElement).fadeOut($.fn.popupform.settings.fading,function() {
			$("#" + $.fn.popupform.settings.overlayElement).fadeOut($.fn.popupform.settings.fading,function(){
				$(this).remove();
				$("#" + $.fn.popupform.settings.popupElement).remove();
			});
		});
	}

	$.fn.popupform.bindDatePicker = function() {
		$("#startDate, #endDate").datepicker($.extend({},
			$.datepicker.regional["de"], {
				beforeShow: $.fn.popupform.customDateRange,
				dateFormat: $.datepicker.ISO_8601,
				hideIfNoPrevNext: true,
				dateFormat: "dd.mm.yy",
				showAnim: "fadeIn",
				showOtherMonths: true,
				onSelect: $.fn.popupform.getTakenSlots
			}
		));
	};

	$.fn.popupform.getTakenSlots = function(date, input) {
		if ($("#startDate").val() != "" && $("#endDate").val() != "") {
			$.getJSON("http://" + window.location.host + "/bookings/check/dateFrom/" + $("#startDate").val() + "/dateTo/" + $("#endDate").val(), $.fn.popupform.handleTakenSlots);
		}
	};

	$.fn.popupform.handleTakenSlots = function(data) {
		var free_wo_key = Number(data.slots) - Number(data.slots_key) - Number(data.taken_wo_key);
		var free_w_key = Number(data.slots_key) - Number(data.taken_w_key);
		$("#wo_key").text("nein (" + (free_wo_key) + ")");
		$("#wo_key").attr('disabled', (free_wo_key > 0) ? '' : 'disabled');
		$("#w_key").text("ja (" + (free_w_key) + ")");
		$("#w_key").attr('disabled', (free_w_key > 0) ? '' : 'disabled');
		$("#wo_key").parent().parent().children("span").remove();
		if (Number(data.taken) >= Number(data.slots)) {
			$("#wo_key").parent().after("<span><br />Achtung: keine freien Plätze</span>");
		}
		else if (free_wo_key + free_w_key <= Number(data.slots_warning)) {
			$("#wo_key").parent().after("<span><br />Achtung: hohe Auslastung</span>");
		}
	};

	$.fn.popupform.customDateRange = function(input) {
		return {minDate: (input.id == "endDate" ? $("#startDate").datepicker("getDate") : null), maxDate: (input.id == "startDate" ? $("#endDate").datepicker("getDate") : null)};
	};

	$.fn.popupform.handleCloseButton = function(){
		$($.fn.popupform.settings.closingElement).click(function() {
			$.fn.popupform.hidePopupElement();
			return false;
		});
	};

	$.fn.popupform.handleSubmitButton = function(){
		$($.fn.popupform.settings.submitElement).click(function() {
			$("#create-booking").validate({
				rules: {
					salutation: "required",
					prename: "required",
					surname: "required",
					address: "required",
					zip: "required",
					city: "required",
					fon: "required",
					mail: {
						required: true,
						email: true
					},
				    cadult: {
						required: true,
						min: 1
				    },
					cartype: "required",
					licensenumber: "required",
				    start: {
						required: true,
						dateDE: true
				    },
				    end: {
						required: true,
						dateDE: true
				    },
					key: "required"
				},
				messages: {
					salutation: "Wählen Sie eine Anrede.",
					prename: "Geben Sie den Vornamen ein.",
					surname: "Geben Sie den Nachnamen ein.",
					address: "Geben Sie den Straßennamen und die Hausnummer ein.",
					zip: "Geben Sie die Postleitzahl ein.",
					city: "Geben Sie den Ort ein.",
					fon: "Geben Sie die Telefonnummer ein.",
					mail: {
						required: "Geben Sie die E-Mail-Adresse ein.",
						email: "Die eingegebene E-Mail-Adresse ist ungültig."
					},
					cadult: {
						required: "Geben Sie die Anzahl der Erwachsenen ein.",
						min: "Es muss mindestens eine erwachsene Person vorhanden sein."
					},
					cartype: "Wählen Sie den Fahrzeugtyp aus.",
					licensenumber: "Geben Sie das Kennzeichen ein.",
					start: {
						required: "Geben Sie das Datum für den Parkbeginn ein.",
						dateDE: "Das Datum für den Parkbeginn wurde im falschen Format eingegeben."
					},
					end: {
						required: "Geben Sie das Datum für das Parkende ein.",
						dateDE: "Das Datum für das Parkende wurde im falschen Format eingegeben."
					},
					key: "Wählen Sie, ob ein Schlüssel benötigt wird."
				},
				errorPlacement: function(error, element) {
					$.jGrowl(error.text(), {
						glue: 'after',
						header: "Fehler",
						life: 6000,
						theme: 'airportpark-error'
					});
				},
				errorClass: "invalid",
				onkeyup: false,
				onfocusout: false,
				submitHandler: function(form) {
					form.submit();
				}
			});

			$("#create-user").validate({
				rules: {
					user: "required",
					real_name: "required",
					password: {
						required: true,
						minlength: 4,
						maxlength: 20
					},
					mail: {
						required: true,
						email: true
					}
				},
				messages: {
					user: "Geben Sie einen Benutzernamen ein.",
					real_name: "Geben Sie den Vornamen ein.",
					password: {
						required: "Geben Sie ein Passwort ein.",
						minlength: "Das Passwort muss mindestens 4 Zeichen lang sein.",
						maxlength: "Das Passwort darf maximal 20 Zeichen lang sein.",
					},
					mail: {
						required: "Geben Sie die E-Mail-Adresse ein.",
						email: "Die eingegebene E-Mail-Adresse ist ungültig."
					}
				},
				errorPlacement: function(error, element) {
					$.fn.popupform.handleError(error, element);
				},
				errorClass: "invalid",
				onkeyup: false,
				onfocusout: false,
				submitHandler: function(form) {
					form.submit();
				}
			});

			$("#edit-user").validate({
				rules: {
					user: "required",
					real_name: "required",
					password: {
						minlength: 4,
						maxlength: 20
					},
					mail: {
						required: true,
						email: true
					}
				},
				messages: {
					user: "Geben Sie einen Benutzernamen ein.",
					real_name: "Geben Sie den Vornamen ein.",
					password: {
						minlength: "Das Passwort muss mindestens 4 Zeichen lang sein.",
						maxlength: "Das Passwort darf maximal 20 Zeichen lang sein.",
					},
					mail: {
						required: "Geben Sie die E-Mail-Adresse ein.",
						email: "Die eingegebene E-Mail-Adresse ist ungültig."
					}
				},
				errorPlacement: function(error, element) {
					$.fn.popupform.handleError(error, element);
				},
				errorClass: "invalid",
				onkeyup: false,
				onfocusout: false,
				submitHandler: function(form) {
					form.submit();
				}
			});

			$("#create-price, #edit-price").validate({
				rules: {
					price: {
						required: true,
						numberDE: true
					}
				},
				messages: {
					price: {
						required: "Geben Sie einen Preis ein.",
						numberDE: "Geben Sie nur eine Zahl ein (Komma zulässig)."
					}
				},
				errorPlacement: function(error, element) {
					$.fn.popupform.handleError(error, element);
				},
				errorClass: "invalid",
				onkeyup: false,
				onfocusout: false,
				submitHandler: function(form) {
					form.submit();
				}
			});

			$("#edit-address").validate({
				rules: {
					salutation: "required",
					name: "required",
					email: {
						required: true,
						email: true
					}
				},
				messages: {
					salutation: "Wählen Sie eine Anrede.",
					name: "Geben Sie den Namen ein.",
					email: {
						required: "Geben Sie die E-Mail-Adresse ein.",
						email: "Die eingegebene E-Mail-Adresse ist ungültig."
					}
				},
				errorPlacement: function(error, element) {
					$.fn.popupform.handleError(error, element);
				},
				errorClass: "invalid",
				onkeyup: false,
				onfocusout: false,
				submitHandler: function(form) {
					form.submit();
				}
			});

			$("#edit-parksettings").validate({
				rules: {
					slots: {
						required: true,
						number: true
					},
					slots_key: {
						required: true,
						number: true,
						max: function(element) {return Number($("#slots").val());}
					},
					slots_warning: {
						required: true,
						number: true,
						max: function(element) {return Number($("#slots").val());}
					}
				},
				messages: {
					slots: {
						required: "Geben Sie die Anzahl der Plätze ein.",
						number: "Geben Sie nur eine Zahl ein."
					},
					slots_key: {
						required: "Geben Sie die Anzahl der Plätze mit Schlüssel ein.",
						number: "Geben Sie nur eine Zahl ein.",
						max: "Es können nicht mehr als die vorhandenen Plätze eingegeben werden."
					},
					slots_warning: {
						required: "Geben Sie die Anzahl der Plätze ein, ab der eine Warnung angezeigt werden soll.",
						number: "Geben Sie nur eine Zahl ein.",
						max: "Es können nicht mehr als die vorhandenen Plätze eingegeben werden."
					}
				},
				errorPlacement: function(error, element) {
					$.fn.popupform.handleError(error, element);
				},
				errorClass: "invalid",
				onkeyup: false,
				onfocusout: false,
				submitHandler: function(form) {
					form.submit();
				}
			});

		});
	}

	$.fn.popupform.handleSuccess = function(data) {
		$.fn.popupform.hidePopupElement();
		$.jGrowl("Die Formulardaten wurden erfolgreich gespeichert.", {
			header: "Information"
		});
		$.jGrowl(data.forename, {
			header: "Information"
		});
	}

	$.fn.popupform.handleError = function(error, element) {
		$.jGrowl(error.text(), {
			glue: 'after',
			header: "Fehler",
			life: 6000,
			theme: 'airportpark-error'
		});
	}

})(jQuery);

