/* Пространство имен для конструктора заявок */
var constructorService = {
	ajaxPath: '/sites/all/modules/court/court_constructor_service/ajax/applications/',
	ajaxPathAppointment: '/sites/all/modules/court/court_constructor_service/ajax/appointment/',
	ajaxTimeout: 10000,

	/*
	 *  Функция, инициализирующая внутренние переменные
	 */
	init: function() {
		// Устанавливаем обработчики для DOM-элементов
		this.bind();
	},

	/*
	 *  Функция, устанавливающая обработчики событий для элементов формы
	 */
	bind: function() {
		// Навешиваем обработчик раскрытия выпадающего меню для администраторов
		this.bindAdminMenu();
		// Инициализация масок для полей ввода
		this.bindValidateMasks();
		// Устанавливаем обработчик, снимающий подсветку ошибок при получении фокуса элементом ввода
		this._removeErrorFromInputs();
	},

	/**
	 *  Функция для валидации данных
	 */
	_validate: function(type, value, isRequired, text) {
		var status = true,
			pattern = null;
		if (typeof(type) !== 'string') {
			pattern = decodeURIComponent(type[1]);
			type = type[0];
		}
		value = $.trim(value);

		// Если поле не обязательно и оно пустое, то возвращаем true
		if (!isRequired && !value) {
			return true;
		}
		// Проверка полей разных типов
		switch (type) {
			case 'required':
				if (typeof(text) !== 'undefined') {
					text = $.trim(text);
					// Проверка на обязательность в выпадающем списке
					status = !((value == 0) && (text == ''));
				} else {
					// Проверка на обязательность в текстовых полях
					status = !!value;
				}
				break;
			case 'numeric':
				status = !!value.match(/^[\d]+$/);
				break;
			case 'email':
				status = commonFunctions.checkEmail(value);
				break;
			case 'date1':
			case 'date2':
			case 'date3':
			case 'date4':
				status = commonFunctions.checkDate(value, parseInt(type.replace(/^date/, ''), 10));
				break;
			case 'time1':
			case 'time2':
				status = commonFunctions.checkTime(value);
				break;
			case 'phone1':
			case 'phone2':
			case 'phone3':
			case 'phone4':
			case 'phone5':
			case 'phone6':
			case 'phone7':
			case 'phone8':
			case 'phone9':
			case 'phone10':
				status = commonFunctions.checkPhone(value, parseInt(type.replace(/^phone/, ''), 10));
				break;
			case 'interval':
				status = commonFunctions.checkInterval(value);
				break;
			case 'custom':
				status = commonFunctions.checkByPattern(value, new RegExp(pattern));
				break;
		}
		return status;
	},

	/**
	 *  Функция для проверки данных, введенных в формы конструктора данных
	 */
	validateForm: function($form) {
		var self = this,
			status = true,
			types = ['required', 'numeric', 'email', 'date1', 'date2', 'date3', 'date4',
					 'time1', 'time2', 'interval', 'phone1', 'phone2', 'phone3', 'phone4',
					 'phone5', 'phone6', 'phone7', 'phone8', 'phone9', 'phone10', 'custom'];	// типы валидируемых значений

		for (var i = 0, max = types.length; i < max; i++) {
			$('.js-validation--' + types[i], $form).each(function() {
				var thisElement = $(this),
					thisInput = thisElement.find('input, textarea'),
					currentStatus = false,
					validateType = (types[i] == 'custom') ? [types[i], thisElement.attr('rel')] : types[i];

				if (!thisInput.parent().hasClass('g-invisible')) {
					if (thisInput.length) {
						currentStatus = self._validate(validateType, thisInput.val(), thisElement.hasClass('js-validation--required'));
					} else {
						thisInput = thisElement.find('select');
						currentStatus = self._validate(validateType, thisInput.val(), thisElement.hasClass('js-validation--required'),
													   thisInput.children('option:selected').text());
					}
				} else {
					currentStatus = true;
				}
				

				thisElement.toggleClass('b-field--error js-field--error', !currentStatus);
				if (!currentStatus) {
					status = false;
				}
			});
		}
		return status;
	},

	/*
	 *  Функция, инициализирующая маски для полей ввода
	 */
	bindValidateMasks: function() {
		$('.js-validation--date1 input').mask('99.99.9999');
		$('.js-validation--date2 input').mask('99.99.99');
		$('.js-validation--date3 input').mask('99/99/9999');
		$('.js-validation--date4 input').mask('99/99/99');
		$('.js-validation--time1 input').mask('99:99');
		$('.js-validation--time2 input').mask('99.99');
		$('.js-validation--interval input').mask('99:99 - 99:99');
	},

	/*
	 *  Обработчик клика по выпадающему меню для администраторов
	 */
	bindAdminMenu: function() {
		// Клик на слове "Еще" (разворачивание меню)
		$('.js-applications_service-link').click(function(event) {
			// Предотвращаем вызов событий родительских элементов при клике
			event.stopPropagation();
			event.cancelBubble = true;
			// Инициализация переменных
			var thisElement = $(this),
				thisParent = thisElement.parent(),
				thisList = thisParent.next();
			// Переключаем меню
			thisElement.toggleClass('b-applications_service-link--active');
			thisParent.toggleClass('b-applications_service-menu--active');
			thisList.toggleClass('g-hidden');
			return false;
		});

		// Обработчик клика
		$('.js-applications_service-menu-list-link').click(function(event) {
			// Предотвращаем вызов событий родительских элементов при клике
			// (чтобы меню не захлопывалось после клика)
			event.stopPropagation();
			event.cancelBubble = true;
		});

		// Скрываем меню при клике вне пункта меню
		$(document).click(function() {
			// Инициализация переменных
			var adminMenu = $('.js-applications_service-link'),
				thisParent = adminMenu.parent(),
				thisList = thisParent.next();
			// Скрываем меню
			adminMenu.removeClass('b-applications_service-link--active');
			thisParent.removeClass('b-applications_service-menu--active');
			thisList.addClass('g-hidden');
		});
	},

	/*
	 *  Обработчик, снимающий подсветку ошибок при получении фокуса элементом ввода
	 */
	_removeErrorFromInputs: function() {
		$('.b-applications_service').delegate('.js-field--error', 'focusin', function() {
			$(this).removeClass('b-field--error js-field--error');
		});

		$('.js-appointment').delegate('.js-field--error', 'focusin', function() {
			$(this).removeClass('b-field--error js-field--error');
		});
	}
};


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