(function($) {

$.fn.extend({
	validateForm: function() {
		this.each(function() {
			$(this).find(':submit').each(function() { this.disabled = true; });	
			$(this).find(':text, :password, textarea')
				.data('isValid', true)
				.keyup(function() {
					var validatedForm = $(this).parents('form')[0]; 
					$(validatedForm).executeValidation();
				})
				.change(function() {
					var validatedForm = $(this).parents('form')[0]; 
					$(validatedForm).executeValidation();
					if (($(this).data('isValid') != true) && !($(this).hasClass("non-active"))) $(this).addClass('wrong');
					else $(this).removeClass('wrong');
				})
				.focus(function() { /*$(this).css('color', '#000000');*/ })
				.blur(function() { 
					var validatedForm = $(this).parents('form')[0]; 
					$(validatedForm).executeValidation();
					if (($(this).data('isValid') != true) && !($(this).hasClass("non-active"))) $(this).addClass('wrong');
					else $(this).removeClass('wrong');
				});
			$(this).executeValidation();
		});
	},
	executeValidation: function() {
		var formIsValid = 
			this.find(':text.text-validation, :password.text-validation, textarea.text-validation').validateText() & 
			this.find(':text.email-validation').validateEmail() &
			this.find(':text.number-validation').validateNumber();
		if (formIsValid) {
			this.find(':submit').each(function() { this.disabled = false; });
			this.find(':submit').parents(".buttons").removeClass("btn-non-active");
		}
		else {
			this.find(':submit').each(function() { this.disabled = true; });
			this.find(':submit').parents(".buttons").addClass("btn-non-active");
		}

	},
	validateText: function() {
		var valid = true;
		this.each(function() { 			
			$(this).data('isValid', (this.value.length > 0));
			$(this).data('isValid', (!($(this).hasClass("non-active"))) && $(this).data('isValid'));
			valid = valid && $(this).data('isValid'); 
		});
		return valid;
	},
	validateEmail: function() {
		var valid = true;
		var rx = new RegExp(/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,})+$/);
		this.each(function() { 
			var matches = rx.exec(this.value);
			$(this).data('isValid',  (matches != null && this.value == matches[0]));
			$(this).data('isValid', (!($(this).hasClass("non-active"))) && $(this).data('isValid'));
			valid = valid && $(this).data('isValid'); 
		});
		return valid;
	},
	validateNumber: function() {
		var valid = true;
		this.each(function() { 
			$(this).data('isValid', !isNaN(Number(this.value))); 
			valid = valid && $(this).data('isValid');
		});
		return valid;;
	}	
});

})(jQuery);

jQuery(function($) {
	$('form.needs-validation').validateForm();
});
