$(function() {
	initFieldsPlaceholder();
	
	// Стилизуем чекбоксы
	if ($('.b-checkbox-container').length) {
		$('.b-checkbox-container input').checkbox({ empty: '/static/i/checkbox_custom.png'});
		//Если чекбокс имеет галочку
		$('.js-checkbox-checked')
							.find('.jquery-checkbox')
							.addClass('jquery-checkbox-checked');
	}
	
	$('.js-radio-click').click(function(e){
		var $this = $(e.currentTarget),
			$custom = $this.find('.js-radio-custom'),
			$radio = $custom.find('.js-radio'),
			name = $this.find('.js-radio').attr('name'),
			$inputs = $('.js-radio-container input[name="' + name + '"]'),
			$inputsCustom = $inputs.closest('.js-radio-custom');
	
		if (!$custom.hasClass('b-radio--checked')) {
			$inputsCustom.removeClass('b-radio--checked');
			$inputs.attr('checked', false);
			$custom.addClass('b-radio--checked');
			$radio.attr('checked', true);
		}
	});
	
	//Редактирование кастомного поля(-ей) ползунка и обработчик его изменения
	if ($('.b-range-container').length) {
		initRangeChange();
	}
	
	//Стилизуем выпадающие списки
	if ($('.js-select').length) {
		initSelectCustom($('.ui-select'));
	}
	
	//Инициализация масок для полей c определенным форматом ввода (даты, время)
	//(формат см. textfield.form.tpl.php)
	if ($('.js-textfield--format').length) {
		for (var i = 0, length = inputFormat.length; i < length; i++) {
			$('.js-textfield--format')
									.eq(i)
									.mask(inputFormat[i]);
		}
	}
	
	/**
	 * Добавляем в поля placeholder для браузеров, 
	 * которые не отображжают данный атрибут
	 */
	function initFieldsPlaceholder() {
		var name,
			version = parseInt($.browser.version),
			except = {
				'msie': 10,
				'mozilla': 4,
				'opera': 11
			}
		
		for (name in except) {
			if ($.browser[name] && version < except[name]) {
				$('.js-textfield, .js-textarea').inputDefaults();
			}
		}
	}
	
	/**
	 * Стилизуем выпадающие списки
	 */
	function initSelectCustom(selects) {
		//кастомизируем select
		selects
			.sSelect()
			.each(function() {
				var self = $(this),
					container = self.closest('.js-select-container'),
					block = self.closest('.js-select'),
					custom = self.next('.newListSelected'),
					text = custom.children('.selectedTxt'),
					list = custom.find('.SSContainerDivWrapper'),
					isMultiple = (self.attr('multiple')),
					isDisabled = self.attr('disabled');
				
				//Блокируем поле
				if (isDisabled) {
					custom.addClass('b-select-custom--disabled');
				}
				
				//Обработчик клика по стрелке выпадающего списка
				block.delegate('.js-select-custom-ico', 'click', function(e){
					if (e.stopPropagation) {
						e.stopPropagation();
					} else {
						e.cancelBubble = true;
					}
					
					text.trigger('click');
				});

				//раскрываем курсор кастомного селекта
				container
						.find('.js-select-custom-ico')
						.removeClass('g-hidden');

				//добавляем новые классы к объектам custom'a
				addNewSelectorCustomSelect(custom);

				//для стилизации multiselect'а
				if (isMultiple) {
					initMultiSelectCustom(self, container, custom);
				}

				var selectedTxt = custom.find('.selectedTxt'),
					placeholder = $.trim(self.attr('placeholder'));
				
				placeholder = !placeholder ? '&nbsp;' : placeholder;

				// Добавляем placeholder, если:
				// - добавлен placeholder
				// - по умолчанию не выбран ни один пункт
				if (placeholder && (!self.val() || self.val() == 'empty')) {
					selectedTxt.html(placeholder);
				} else {
					selectedTxt.addClass('noplaceholder');
				}
				
				//Кастомизируем скролл
				if (!container.parent().hasClass('js-court-appointment-filter-item')) {
					fleXenv.fleXcrollMain(list[0]);
				}
			})
			// Обработчик снятия плейсхолдера с выпадающего списка и блокировки поля
			.change(function(e, isDisabled) {
				var self = $(this),
					placeholder = $.trim(self.attr('placeholder'))
					selfSelectedOption = self.children('option:selected'),
					selfSelectedOptionText = $.trim(selfSelectedOption.text()),
					selfSelectedCustom = self.next(),
					selfSelectedTxt = selfSelectedCustom.find('.selectedTxt');
				
				placeholder = !placeholder ? '&nbsp;' : placeholder;

				if (!selfSelectedOptionText) {
					selfSelectedTxt.html(placeholder);
					selfSelectedTxt.removeClass('noplaceholder');
				} else {
					selfSelectedTxt.addClass('noplaceholder');
				}
				
				isDisabled = (isDisabled == undefined) ? false : isDisabled;
				
				//Блокируем поле
				self.attr('disabled', isDisabled);
				selfSelectedCustom
					.toggleClass('b-select-custom--disabled', isDisabled)
					.attr('tabindex', isDisabled ? null : "0");
			});
	}
	
	/**
	 * Стилизация multiselect'а
	 *
	 * @param obj self			<select>
	 * @param obj container
	 * @param obj custom
	 */
	function initMultiSelectCustom(self, container, custom) {
		var option = self.find('option'),
			templates = container.find('.js-select-template');
	
		//Чекбоксы для каждого пункта
		//Устанавливаем стили для выделенных значений по умолчанию для каждого пункта
		if (option) {
			for (var i = 0, length = option.length; i < length; i++) {
				var templateCheckbox = templates
											.find('.js-checkbox-container')
											.eq(0),		//0, потому что каждый шаблон вынимается из блока с шаблонами
					customItemLink = custom
										.find('.js-select-custom-item')
										.eq(i)
										.find('.js-select-custom-link');
	
				//Добавляем чекбоксы в custom
				if (templateCheckbox.length) {
					customItemLink.prepend(templateCheckbox);
				}
	
				//выделяем пункт списка
				if ($(option[i]).attr('selected')) {
					customItemLink.toggleClass('select-custom-link--active');
					customItemLink.find('.ui-form-checkbox').trigger('click');
				}
				
			}
		}
		
		var checkbox = container.find('.js-checkbox-container').find('.ui-form-checkbox');
		
		//обработчик клика на checkbox'е для всех мультиселектов на странице
		checkbox.click(function(){
			//Вызываем событие клика по пункту кастомного списка
			$(this)
				.closest('.js-select-custom-link')
				.trigger('click');
		});
	}
	
	/**
	 * Добавляем новые классы к объектам custom'a
	 *
	 * @param obj self
	 */
	function addNewSelectorCustomSelect(self) {
		var $title = self.find('.selectedTxt'),
			$listContainer = self.find('.SSContainerDivWrapper'),
			$list = $listContainer.children('.newList'),
			$item = $list.children('li'),
			$itemFirst = $item.first(),
			$itemLast = $item.last(),
			$link = $item.children('a');
			
		//Объект custom'a
		self.addClass('b-select-custom');
		//Заголовок
		$title.addClass('b-select-custom-selected_txt');
		//Контейнер списка
		$listContainer.addClass('b-select-custom-wrapper');
		//Список
		$list.addClass('b-select-custom-list');
		//Пункты списка
		$item.addClass('b-select-custom-item js-select-custom-item');
		//Первый пункт
		$itemFirst.addClass('item-first');
		//Последний пункт
		$itemLast.addClass('item-last');
		//Ссылка пункта списка
		$link.addClass('select-custom-link js-select-custom-link');
	}
	
	/**
	 * Редактирование кастомного поля(-ей) ползунка и обработчик его изменения
	 */
	function initRangeChange() {
		//кастомизируем input[type=range]
		$('.js-range')
					.rangeinput()
					.removeClass('g-hidden');
		//вешаем дополнительные классы на курсор
		$('.js-range-container')
						.find('.handle')
						.addClass('js-range-cursor-custom');

		//устанавливаем ширину поля(-ей) в зависимости от шага и кол-ва значений
		var range = $('.js-range'),
			cursor = $('.js-range-cursor-custom');

		for (var i = 0, length = range.length; i < length; i++) {
			var self = $(range[i]),
				container = self.closest('.js-range-container'),
				//ширина конейнера ползунка
				widthContainer = container.width(),
				//фон ползунка
				rangeCustom = container.find('.js-range-custom'),
				//курсор
				cursorCustom = $(cursor[i]);

			//устанавливаем ширину фона
			rangeCustom.width(widthContainer - 20);
			//переносим значение поля под курсор
			cursorCustom.html(self);
		}
		
		range
			.unbind()
			.focus(function(){
				$(this).blur();
			})
			.change(function(event, value){
				var $this, api, conf;
				
				if (value != null) {
					api = $(this).data('rangeinput');
					conf = api.getConf();
					
					if (conf[value] != null) {
						api.setValue(conf[value]);
					}
				}
			});
	}
});