/**
 * Is added in Build/Assets/JavaScripts/250__mvhr.js
 */
(function($) {

	"use strict";

	/**
	 * @param {object} options
	 * @returns {jQuery}
	 */
	$.fn.applicationForm = function(options) {

		var settings = $.extend({
			'parsleyOptions': {
				errorsContainer: function($ParsleyField) {
					return $ParsleyField.$element.parent();
				},
				errorsWrapper: '<ul class="parsley-errors-list"></ul>',
				errorTemplate: '<li></li>'
			}
		}, options);

		if (window.Parsley && window.Parsley.on) {
			window.Parsley.on('form:error', function() {
				var $form = $(this.$element);
				var lines = [];
				$form.find('input, textarea').not('[type="submit"]').each(function() {
					var $item = $(this);
					var itemname = $item.attr('name');
					var itemvalue = $item.val();
					if (!itemvalue.length) {
						return;
					}
					lines.push(
						'' +
						itemname + ': ' +
						itemvalue
					);
				});
				$(this.fields).each(function() {
					var fieldErrors = ParsleyUI.getErrorsMessages(this);
					if (!fieldErrors.length) {
						return;
					}
					lines.push(
						'' +
						this.$element.attr('name') + ': ' +
						fieldErrors.join(', ')
					);
				});
				$.mvHrLog(lines.join('\n'));
			});
		}

		return $(this).each(function() {
			var $element = $(this);
			$element.parsley(settings.parsleyOptions);

			$element.applicationForm_uploadFields();

			$element.find("[data-calendar='true']").each(function() {
				$(this).datepicker({
					autoclose: true,
					format: "dd.mm.yyyy",
					language: 'de'
				});
			});

			return $element;
		});

	};

	/**
	 * @param {Object} options
	 * @returns {jQuery}
	 */
	$.fn.applicationForm_uploadFields = function(options) {

		var settings = $.extend({
			'showFields': 1,
			'itemSelector': 'data-fieldgroup',
			'addFieldSelector': '[data-action="addField"]'
		}, options);

		return $(this).each(function() {
			var $element = $(this);
			var $items = $element.find('[' + settings.itemSelector + ']');
			var $addButton = $element.find(settings.addFieldSelector);

			/**
			 * Initially hide fields
			 */
			var hideFields = function() {
				$items.each(function() {
					var $item = $(this);
					var itemNumber = $item.attr(settings.itemSelector);
					if (itemNumber > settings.showFields) {
						$item.hide();
					}
				});
				checkButtonVisibility();
			};

			/**
			 * Makes the next hidden upload field visible
			 */
			var addField = function() {
				var $invisibleItems = $items.not(':visible');
				if ($invisibleItems.length > 0) {
					$invisibleItems.first().show();
				}
				checkButtonVisibility();
			};

			/**
			 * Checks if the addButton should be displayed
			 */
			var checkButtonVisibility = function() {
				var $invisibleItems = $items.not(':visible');
				if ($invisibleItems.length == 0) {
					$addButton.hide();
				} else {
					$addButton.show();
				}
			};

			/**
			 * Initialize
			 */
			hideFields();
			$addButton.click(function() {
				addField();
			});
		});
	};

	/**
	 * @param {String} message
	 */
	$.mvHrLog = function(message) {
		$.ajax({
			url: '/?eID=tx_mvhr_log',
			method: 'post',
			dataType: 'json',
			data: {
				'message': message
			},
			success: function(data) {
				// console.log(data);
			}
		});
	};

	/**
	 * Init jQuery Plugins
	 */
	$(document).ready(function() {

		if (typeof(window.ParsleyValidator.addValidator) == "function") {

			/**
			 * @param {String} value
			 * @returns {Date}
			 */
			var convertDateToObject = function(value) {
				var dateParts = value.split('.');
				return new Date(dateParts[2], (dateParts[1] - 1), dateParts[0]);
			};

			/**
			 * Date Format Validator
			 */
			window.ParsleyValidator.addValidator(
				'date',
				function(value) {
					return /^(0[1-9]|[12][0-9]|3[0-1])\.(0[1-9]|1[0-2])\.\d{4}$/.test(value);
				},
				256
			);
			window.ParsleyValidator.addMessage('en', 'date', 'Ist kein gültiges Datum (dd.mm.yyyy)');
			window.ParsleyValidator.addMessage('de', 'date', 'Ist kein gültiges Datum (dd.mm.yyyy)');

			/**
			 * Past Date Validator
			 */
			window.ParsleyValidator.addValidator(
				'pastdate',
				function(value) {
					var date = convertDateToObject(value);
					return (date < new Date());
				},
				257
			);
			window.ParsleyValidator.addMessage('en', 'pastdate', 'Datum muss in der Vergangenheit liegen');
			window.ParsleyValidator.addMessage('de', 'pastdate', 'Datum muss in der Vergangenheit liegen');

			/**
			 * Future Date Validator
			 */
			window.ParsleyValidator.addValidator(
				'futuredate',
				function(value) {
					var date = convertDateToObject(value);
					return (date > new Date());
				},
				257
			);
			window.ParsleyValidator.addMessage('en', 'futuredate', 'Datum muss in der Zukunft liegen');
			window.ParsleyValidator.addMessage('de', 'futuredate', 'Datum muss in der Zukunft liegen');

			/**
			 * Filesize Validator
			 */
			window.ParsleyValidator.addValidator(
				'filesize',
				function(value, maxSize) {
					var $element = $('input[data-parsley-filesize]').filter(function() {
						return $(this).val() == value;
					});
					var files = $element.get(0);
					return (files.files[0].size <= maxSize * 1024);
				},
				256
			);
			window.ParsleyValidator.addMessage('en', 'filesize', 'Datei darf nicht größer als 5MB sein');
			window.ParsleyValidator.addMessage('de', 'filesize', 'Datei darf nicht größer als 5MB sein');
		}

		$('#applicationForm').applicationForm();

	});

})(jQuery);
