/* Пространство имен для формы в конструкторе заявок */
var constructorServiceForm = {
	DOM: {},
	templateText: '',
	attachLimit: 0,				// максимальное кол-во прикрепляемых к заявке файлов
	attachExtensions: [],		// массив допустимых расширений прикрепляемых файлов
	attachExtensionsString: '',	// строка со списком допустимых расширений файлов

	/*
	 *  Функция, инициализирующая внутренние переменные
	 */
	init: function() {
		// Собираем часто используемые DOM-эелементы
		this.DOM.$pages = $('.js-applications_service-page');
		this.DOM.$form = $('#applications-show-page');
		this.DOM.$formData = $('.js-applications_service-form');
		this.DOM.$formAntiSpam = $('#applications_pravo');
		this.DOM.$formSubmit = $('#edit-submit');
		this.DOM.$formDataFields = this.DOM.$formData.find('input[name], textarea[name], select[name]');
		this.DOM.$template = $('.js-applications_service-statement_text');
		this.DOM.$showStatementButton = $('.js-applications_service-show_statement');
		this.DOM.$changeFormDataButton = $('.js-applications_service-form-control-link');
		this.DOM.$sendFormDataButton = $('.js-applications_service-form-control--button');
		this.DOM.$successMessage = $('.js-applications_service-form-control--success');
		this.DOM.$errorMessage = $('.js-applications_service-form-control--error');
		this.DOM.$attachExtensions = $('.js-page_send-files-add--extensions');
		this.DOM.$menuContainer = $('.js-applications_service-menu-container');

		// Корректируем положение меню при наличии подменю под заголовком
		// [FIXME] удалить после перехода на тему Courts model
		if ($('.sl-menu').length) {
			this.DOM.$menuContainer.addClass('b-applications_service-menu-container--menu');
		}
		if ($('.b-submenu').length && $('.item_link').hasClass('submenu_short-check-backend')) {
			this.DOM.$menuContainer.addClass('b-applications_service-menu-container--menu');
		}
		this.DOM.$menuContainer.removeClass('g-invisible');

		// Получаем максимальное кол-во прикрепляемых файлов
		var attachLimitText = $('.js-page_send-files-add--limit').text();
		this.attachLimit = attachLimitText ? parseInt(attachLimitText, 10) : 0;
		this.attachLimit = (this.attachLimit > 0) ? this.attachLimit : Number.MAX_VALUE;
		// Получаем массив допустимых расширений
		if (this.DOM.$attachExtensions[0]) {
			this.attachExtensions = this.DOM.$attachExtensions[0].onclick().attachExt;
		}
		if (this.attachExtensions.length && !this.attachExtensions[0]) {
			this.attachExtensions = [];
		}
		this.attachExtensionsString = this.attachExtensions.join(', ');

		// Сохраняем текст шаблона предварительного просмотра заявки
		this.templateText = this.DOM.$template.text();
		
		// Стилизуем выпадающие списки
		$('.js-applications_service select').sSelect().each(function() {
			var thisElement = $(this),
				thisElementSelectedTxt = thisElement.next('.newListSelected').children('.selectedTxt'),
				firstOptionText = thisElement.children('option:first').text();
			// Добавляем placeholder только если первый элемент списка пустой
			if (!$.trim(firstOptionText)) {
				thisElementSelectedTxt.text(thisElement.attr('placeholder'));
			} else {
				thisElementSelectedTxt.addClass('noplaceholder');
			}
		});
		// Добавляем обработчики для подсказок в текстовых полях
		$('.js-applications_service').find('input[placeholder], textarea[placeholder]').inputDefaults();

		// Устанавливаем обработчики для элементов формы
		this.bind();
	},

	/*
	 *  Функция, устанавливающая обработчики событий для элементов формы
	 */
	bind: function() {
		// Если включен режим предварительного просмотра
		if ($('.js-applications_service-show_statement').length) {
			var oldSendButton = $('.js-applications_service-send_statement');
			oldSendButton.after(this.DOM.$formSubmit).remove();
		}

		// Обработчики для зависимых полей
		this._bindDependFields();
		// Обработчики для полей с прикреплением файлов
		this._bindInputFile();
		// Устанавливаем обработчик событий на кнопке "Показать заявление"
		this._showStatement();
		// Устанавливаем обработчик событий на кнопке "Изменить данные"
		this._changeFormData();
		// Устанавливаем обработчик событий для отправки формы заявки
		this._sendFormData();
		// Дополнительные обработчики для выпадающих списков (управление placeholder)
		this._controlSelectPlaceholder();
	},


	/* Вспомогательные функции */

	/*
	 *  Функция для очистки текстовых полей
	 */
	clearFields: function() {
		for (var i = 0, max = this.DOM.$formDataFields.length; i < max; i++) {
			this.DOM.$formDataFields.eq(i).val('');
		}
		this.DOM.$formSubmit.val('Отправить');
	},

	/*
	 *  Функция, переключающая формы с полями заявления и его текстом
	 */
	switchPages: function() {
		this.DOM.$pages.toggleClass('g-hidden');
		this.DOM.$formSubmit.toggleClass('g-hidden');
	},

	/*
	 *  Функция, обрабатывающая шаблон предпросмотра заявок
	 */
	processTemplate: function() {
		var templateText = this.templateText,
			fields = this.DOM.$form.serializeArray();
		for (var i = 0, max = fields.length; i < max; i++) {
			var fieldName = fields[i].name,
				fieldTemplateName = fieldName.replace(/\]$/, '').replace(/^request\[/, ''),
				fieldValue = fields[i].value ? fields[i].value : '',
				currentExpr = new RegExp('%' + fieldTemplateName + '%', 'g'),
				fieldElement = $('[name="' + fieldName + '"]', this.DOM.$formData);
			if (fieldElement.closest('.js-field').hasClass('js-field--select')) {
				fieldValue = fieldElement.children('option:selected').text();
			}
			templateText = templateText.replace(currentExpr, fieldValue);
		}
		// Передаем текст с подставленными значениями в шаблон
		this.DOM.$template.text(templateText);
	},


	/* Обработчики событий для элементов формы */

	/*
	 *  Обработчик показа / скрытия зависимых полей
	 */
	_bindDependFields: function() {
		$('.js-depends').each(function() {
			var thisElement = $(this),
				thisParams = thisElement.get(0).onclick();
			$('select[name="' + thisParams.name +'"]').change(function() {
				thisElement.toggleClass('g-invisible', ($(this).val() != thisParams.value));
			});
		});
	},

	/*
	 *  Обработчики для полей с прикреплением файлов
	 */
	_bindInputFile: function() {
		var self = this;

		// Прикрепление файла
		$('.js-files-add-button').delegate('.js-applications_service-add_file', 'change', function() {
			var thisElement = $(this),
				thisElementVal = thisElement.val().replace(/^C:\\fakepath\\/, '');
			// Проверяем расширения прикрепляемых файлов
			if (self.attachExtensions.length) {
				var fileExt = thisElementVal.toLowerCase().match(/[.]([^.]+)$/);
				if (fileExt[1]) {
					if (!commonFunctions.inArray(fileExt[1], self.attachExtensions)) {
						alert('Разрешено прикреплять только файлы со следующими расширениями: ' + self.attachExtensionsString);
						return;
					}
				}
			}
			// Добавляем строку с названием прикрепленного файла
			var newFileTemplate = $($('.js-page_send-files-add--template').html());
			newFileTemplate.find('span').text(thisElementVal);
			$('.js-page_send-files-add').append(newFileTemplate);
			// Прячем input[type="file"], к которому уже прикреплен файл
			thisElement.addClass('g-hidden');
			// Добавляем новый input для прикрепления еще одного файла
			var newFileInput = $('<input type="file" class="ui-files-add js-applications_service-add_file" />'),
				newIndex = parseInt($('.js-files-add-button input[type="file"]').last().attr('name').match(/^file([\d]+)$/)[1], 10) + 1;
			newFileInput.attr('name', 'file' + newIndex);
			$('.js-files-add-button').append(newFileInput);
			// Прячем кнопку прикрепления новых файлов при достижении лимита
			var filesCount = $('.js-files-add-button input[type="file"]').length - 1;
			if (filesCount >= self.attachLimit) {
				$('.js-files-add-button').addClass('g-hidden');
			}
		});

		// Удаление файла из прикрепления
		$('.js-page_send-files-add').delegate('.js-page_send-files-delete', 'click', function() {
			var thisElement = $(this),
				thisBlock = thisElement.closest('.js-page_send-files-add'),
				thisFileInputs = thisBlock.find('.js-applications_service-add_file'),
				thisLine = thisElement.closest('.b-files-add'),
				index = thisLine.index() - 1;
			thisLine.remove();
			thisFileInputs.eq(index).remove();
			// Показываем кнопку прикрепления новых файлов
			$('.js-files-add-button').removeClass('g-hidden');
		});
	},

	/*
	 *  Обработчик клика по кнопке "Показать заявление"
	 */
	_showStatement: function() {
		var self = this;
		this.DOM.$showStatementButton.click(function() {
			// Проверяем значения полей
			if (constructorService.validateForm(self.DOM.$formData)) {
				// Передаем данные из формы в шаблон
				self.processTemplate();
				// Переключаем режим отображения заявления
				self.switchPages();
			}
		});
	},

	/*
	 *  Обработчик клика по кнопке "Изменить данные"
	 */
	_changeFormData: function() {
		var self = this;
		this.DOM.$changeFormDataButton.click(function() {
			self.switchPages();
		});
	},

	/*
	 *  Обработчик клика по кнопке "Отправить данные"
	 */
	_sendFormData: function() {
		var self = this;

		this.DOM.$form.submit(function() {
			// Проверяем значения полей
			if (constructorService.validateForm(self.DOM.$formData)) {
				var fields = self.DOM.$form.serializeArray();
				for (var i = 0, max = fields.length; i < max; i++) {
					var fieldName = fields[i].name,
						fieldElement = $('[name="' + fieldName + '"]', self.DOM.$formData);
					// Для списков отправляем два значения: [id] и [value]
					if (fieldElement.closest('.js-field').hasClass('js-field--select')) {
						var fieldValue = fields[i].value ? fields[i].value : '';
						self.DOM.$formData.append('<input type="hidden" name="' + fieldName + '[id]" value="' + fieldValue + '" />');
						self.DOM.$formData.append('<input type="hidden" name="' + fieldName + '[value]" value="' + fieldElement.children('option:selected').text() + '" />');
						// Отключаем поля, тем самым исключая их из передаваемых данных
						fieldElement.attr('disabled', 'disabled');
					} else {
						// Принудительно очищаем поля в форме
						var fieldValue = fields[i].value ? fields[i].value : '';
						fieldElement.val(fieldValue);
					}
				}
				// Удаляем последний (пустой) инпут для выбора файла
				$('input[type="file"]').last().remove();
				//Anti-spam
				self.DOM.$formAntiSpam.val(self._getParamRandom());
				// Разрешаем отправку формы
				return true;
			}
			return false;
		});
	},
	
	_getParamRandom: function() {
		var param = Math.random();
		
		if (param == 0 || param == 1) {
			param = this._getParamRandom();
		}
		
		return param;
	},

	/*
	 *  Обработчик снятия плейсхолдера с выпадающего списка
	 */
	_controlSelectPlaceholder: function() {
		$('.js-applications_service select').change(function() {
			var thisElement = $(this),
				thisElementSelectedOption = thisElement.children('option:selected'),
				thisElementSelectedOptionText = $.trim(thisElementSelectedOption.text()),
				thisElementSelectedOptionValue = thisElementSelectedOption.attr('value'),
				thisElementSelectedTxt = thisElement.next().find('.selectedTxt');

			if (!thisElementSelectedOptionText && (thisElementSelectedOptionValue == 0)) {
				thisElementSelectedTxt.text(thisElement.attr('placeholder'));
				thisElementSelectedTxt.removeClass('noplaceholder');
			} else {
				thisElementSelectedTxt.addClass('noplaceholder');
			}
		});
	}
};


// Запускаем скрипты для формы в конструкторе заявок
$(function() {
	constructorServiceForm.init();
});
