(function($){
	
	$.fn.PwForm = function(options) 
	{
		options = options||{};		
		
		return this.submit(function(){
			var $form = $(this);
			
			$form.trigger('submitInit');
			
			options.dataType = 'json';
			
			options.beforeSubmit = function(formData) {
				var preventSubmit = false;
				$form.trigger('submitBefore', [formData], function(formData, ret) {
					preventSubmit = (false == ret);
				});							
				if (preventSubmit) {
					$form.trigger('submitAfter', [{}]);
					$form.trigger('submitComplete', [{}]);
					return false;
				}
			};
			
			options.success = function(response) {
				$form.trigger('submitAfter', [response]);
				if (response.validationErrors) {
					$form.trigger('submitError', [response.validationErrors]);
				}
				else {
					$form.trigger('submitSuccess', [response]);
				};
				$form.trigger('submitComplete', [response]);
			};
			
			$form.ajaxSubmit( options );
			return false;
		});
	}
	
	$.each( ('submitInit,submitBefore,submitAfter,submitError,submitSuccess,submitComplete')
		.split(","), function(i, name){
			
			$.fn[name] = function(fn){
				return fn ? this.bind(name, fn) : this.trigger(name);
			};
	});
	
	$.fn.PwFormWithEvents = function(options) {
		
		options = $.extend({
			submitValue : 'Æäèòå...',
			loadingCssClass : 'PwLoadingForm',
			errorCssClass : 'PwError',
			messageCssClass : 'error'
		}, options||{});
		
		return this		
			.PwForm()
			.submitBefore(function() {
				var $form = $( this );
				
				// ïðåäîòâðàùàåì ïîâòîðíûé ñàáìèò ôîðìû
				if (!options.loadingCssClass || this.className.indexOf(options.loadingCssClass) != -1) {
					return false;
				}
				else {
					$form.addClass(options.loadingCssClass);
				}
				
				$form.find('.' + options.messageCssClass).hide();
				
				if (options.loadingSubmitValue) {
					var $submit = $form.find('input[type="submit"]');
					this.submitValue = $submit.val() || '';
					$submit.val(options.loadingSubmitValue);
				}
				
				this.$disabledElements = $form.find(':disabled');
				$form.find('input, select, textarea').not('*[type="file"]').attr('disabled', 'disabled');
			})
			.submitAfter(function(event, response) {
				if (response.redirect) {
					window.location.replace(response.redirect, true);
				}
				else if(response.reload) {
					window.location.reload(true);
				}
				else {
					
					$(this)
						.removeClass(options.loadingCssClass)
						.find('input, select, textarea')
						.not(this.$disabledElements)
						.attr('disabled', '');
						
					if (this.submitValue) {
						$(this).find('input[type="submit"]').val(this.submitValue);
					}
				}
			} )
			.submitError(function(event, errors){
				var $form = $(this);
				
				$.each(errors, function(name, error) {
					$form.find('#' + error.containerId).addClass(options.errorCssClass);
					$form.find('#' + error.messageContainerId).html(error.message).show();
				});
				
				$form.find('.' + options.errorCssClass + ':first').focus();
			});
	}
	
	$(function(){
		$('.PwForm').PwFormWithEvents();
	});
	
		
})(jQuery);
