// Project's jQuery plugins
(function($){
	
	/**
	 * Плагин оформляет стандартные селекты 
	 * во внешний вид селектов быстрого фильтра сайта.
	 */
	$.fn.naFilterDropdown = function(action, options)
	{
		var defaultAction = 'init';
		var settings = {
			'currentValue': '',
			'editLabel': 'Изменить',
			'emptyLabel': 'Любое значение',
			'emptyValue': '',
			'onChange': false
	    };
		
		function enableDocumentListener(enable)
		{
			if(enable){
				$(document).bind('click', documentClickHandler);
			} else {
				$(document).unbind('click', documentClickHandler);
			}
		}
		
		function documentClickHandler(event)
		{
			if($('.selectbox-inner').is(':visible')){
				$('.selectbox-inner:visible').hide();
			}
		}
		
		function getContainer(element)
		{
			return element.parents('div._nadContainer:first');
		}
		
		function itemClickHandler(event)
		{
			event.preventDefault();
			var $this = $(this);
			var $container = getContainer($this);
			$container.find('.currentLabel').html($this.html());
			
			var value = $this.attr('href').split('-')[1];
			$container.find('input[type="hidden"]').val(value);
			settings.currentValue = value;
			
			$container.find('li.selected').removeClass('selected');
			$this.parents('li:first').addClass('selected');
			
			if(typeof(settings.onChange) == 'function'){
				settings.onChange();
			}
		}
		
		/**
		 * @param $this DIV element
		 */
		function onAdd($this, options)
		{
			settings = $this.data('settings');
			
			var name = $this.find('input[type="hidden"]').attr('name');
			var html = '<li';
			if(options.selected){
				$this.find('li.selected').removeClass('selected');
				$this.find('.currentLabel').html(options.label);
				html += ' class="selected"';
				
				settings.currentValue = options.value;
				if(!options.skipCallback){
					settings.onChange();
				}
			}
			html += '><a href="#' + name + '-' + options.value + '">' + options.label + '</a></li>';
			var $item = $(html);
			$this.find('ul').append($item);
			$item.find('a').click(itemClickHandler);
			
			if($this.find('ul li').length == 1){
				$this.find('input:hidden').val(options.value);
				$this.find('.currentLabel').html(options.label);
			}
		}
		
		/**
		 * @param $this DIV element
		 */
		function onClear($this)
		{
			var settings = $this.data('settings');
			
			// Сбрасываем значение поля
			$this.find('input[type="hidden"]').val(settings.emptyValue);
			
			// Устанавливаем подпись в стандартное значение
			$this.find('.currentLabel').text(settings.emptyLabel);
			
			// Отключаем слушатели событий от значений дропдауна
			$this.find('div.selectbox-inner li a').unbind('click', itemClickHandler);
			
			// Удаляем сами элементы значений
			$this.find('div.selectbox-inner li').remove();
			
			if(typeof(settings.onClear) == 'function'){
				settings.onClear();
			}
		}
		
		/**
		 * @param $this SELECT element
		 */
		function onInit($this)
		{
			var name = $this.attr('name');
			var id = $this.attr('id');
			var currentLabel = $this.find('option:selected').text() || settings.emptyLabel;
			var currentValue = $this.find('option:selected').val() || settings.emptyValue;
			
			var html = '<div class="selectbox _nadContainer" style="' + $this.attr('style') + '" id="' + id + '">';
			
			// Current value
			html += '<b class="currentLabel">' + currentLabel + '</b>';
			
			// Button
			html += '<a class="opens" href="#"><span>' + settings.editLabel + '</span></a>';
			
			// Values
			html += '<div class="selectbox-inner" style="display: none; "><ul id="area_click">';
			$this.find('option').each(function(){
				var $this = $(this);
				html += '<li';
				if($this.is(':selected')){
					html += ' class="selected"';
				}
				html += '><a href="#' + name + '-' + $this.val() + '">'+$this.text()+'</a></li>';
			});
			html += '</ul></div>';
			
			html += '<input type="hidden" name="' + name + '" value="' + currentValue + '"/>';
			
			html += '</div>';
			var $container = $(html);
			$this.replaceWith($container);
			
			var $openButton = $container.find('a.opens');
			// Adjust value's width
			// TODO Изменить верстку, так как сейчас длинные строки обрезаются
			$container.find('.currentLabel').width($container.width() - $openButton.outerWidth() - 10);
			
			// Attach event handlers
			$openButton.click(openClickHandler);
			$container.find('div.selectbox-inner li a').click(itemClickHandler);
			$container.data('settings', settings);
		}
		
		function openClickHandler(event)
		{
			event.preventDefault();
			event.stopPropagation();
			
			documentClickHandler();
			
			var $dropdownValues = $(this).parents('div._nadContainer:first').find('div.selectbox-inner');
			$dropdownValues.show();
			enableDocumentListener(true);
		}
		
		return this.each(function()
		{
			if(!action){
				action = defaultAction;
			}
			
			switch(action){
				case 'add':
					onAdd($(this), options);
					break;
			
				case 'clear':
					onClear($(this));
					break;
				
				case 'init':
					if(options){ 
						$.extend(settings, options);
					}
					onInit($(this));
					break;
					
				default:
					
			}
		}
		);
	};
	
	/**
	 * Для отображения одной формы по нажатию на разные кнопки.
	 * Например, несколько кнопок "подать заявку" и одна форма.
	 * 
	 */
	$.fn.singletonForm = function(options)
	{
		var settings = {
			buttonSelector: 'a.singletonFormButton',
			onClose: false
		};			

		return this.each(function()
		{
			if (options) { 
				$.extend(settings, options);
			}
			
			var $formContainer = $(this);
			var $form = $formContainer.find('form');
			var $hiddenButton;
			
			function hideForm()
			{
				if($hiddenButton){
					$hiddenButton.show();
					
					$formContainer.hide();
					$formContainer.find('.errors').remove();
				}
			}
			
			$(settings.buttonSelector).click(function(event)
			{
				event.preventDefault();
				
				var $button = $(this);
				
				hideForm();
				
				$button.after($formContainer);
				$button.hide();
				$hiddenButton = $button;
				$formContainer.show();
			});
			
			$formContainer.find('.closeButton').click(function(event){
				hideForm();
				if(typeof(settings.onClose === 'function')){
					settings.onClose($form, $formContainer);
				}
			});
			
			$formContainer.hide();
		});
	};
	
	/**
	*	При клике на кнопку меняется названия вакансии в форме.
	*/
	$.fn.vacancyButton = function(options)
	{
		return this.each(function()
		{
			var $button = $(this);
			var $container = $button.parents('.vacancyItem:first');
			
			$button.click(function(event){
				$('.vacancyFormContainer .vacancyName')
					.html($container.find('.vacancyName').html());
				
				$('.vacancyFormContainer input[name="vacancy_id"]')
					.val($container.find('.vacancyCode').html());
			});
		});
	};
	
	/**
	 * Базовый плагин для формы, отправляющейся без перезагрузки страницы.
	 * Блокирует форму, показывает прелоадер и разблокирует форму после
	 * загрузки. Можно назначить колбэк на успешное завершение загрузки.
	 * 
	 * Разделяет объекты формы и контейнера формы.
	 */
	$.fn.baseAjaxForm = function(options)
	{
		var settings = {
			onSuccess: false
		};
		
		function resetForm($form)
		{
			$form.find('input[type!="hidden"][type!="submit"], textarea').val('');
		}
		
		return this.each(function()
		{
			if(options){ 
				$.extend(settings, options);
			}
			
			var $container = $(this);
			var $form = $container.is('form') ? $container : $container.find('form:first');
			var action = $form.attr('action');
			var $loadingIcon = $form.find('.loadingIcon');
			
			$form.submit(function(event){
				event.preventDefault();
				var data = $form.serialize();
				$form.find('input, textarea').attr('disabled', 'disabled');
				$loadingIcon.show();
				$.post(action, data, function(data){
					$form.find('input, textarea').removeAttr('disabled');
					$loadingIcon.hide();
					
					if(data.ok){
						resetForm($form);
						if(typeof(settings.onSuccess) === 'function'){
							settings.onSuccess(data, $form, $container);
						};
					} else if(data.errors) {   
						var errors = [];
						for(var p in data.errors){
							errors.push(data.errors[p]);
						}
						if(errors.length){
							alert(errors.join("\n"));
						}
					};
				}, 'json');
			});
		});
	};
	
})(jQuery);

(function($){
	$.fn.slideTabs = function( options ) {  
		var settings = {};

		return this.each(function() {        
			if (options) { 
				$.extend( settings, options );
			}
			
			var $slider = $(this);
			var $slides = $slider.find('div.items:first > .slide');
			$slides.filter(':not(.default)').slideHide();
			
			$slider.find('.slider-tabs:first a:not(.direct)').click(function(event){
				event.preventDefault();
				
				$targetSlide = $slides.filter($(this).attr('href'));
				if($targetSlide.data('active')){
					return false;
				}
				
				var $this = $(this);
				$this.parents('div.slider-tabs:first').find('a').removeClass('active');
				$this.addClass('active');
				
				$slides.filter('.default').hide('fast');
				$slides.filter(':not(.default)').data('active', 0).slideHide();
				$targetSlide
					.data('active', 1)
						.stop()
						.css({display: 'block', 'zIndex': 5})
						.animate({'left': 0, 'opacity': 100});
			});
		});
	};
	
	$.fn.slideHide = function(options)
	{
		var settings = {};
		return this.each(function() { 
			if (options) { 
				$.extend( settings, options );
			}
			$(this).animate(
				{'left': '-10px', 'opacity': '0'}, 
				300, 
				function(){
					$(this).css({display: 'none'}); 
				}
			);
			
			/*
			* IE cannot set float as zIndex, so we can't animate it.
			* Just set it via css method;
			*/
			$(this).css({'zIndex': 2});
		});
	};
})(jQuery);
