function formChecker(form) {
	this.root = form;
	this.submit = this.root.find('input:submit');
	this.required = this.root.find('.required');
	this.attachEvents();
};

formChecker.prototype = {
	attachEvents: function() {
		var me = this;

		this.root.submit(function() {
			return me.checkAll();
		});

		this.required.find('input, select, textarea').bind('keyup click', function() {
			me.checkCurrent($(this));
		});
	},

	checkAll: function() {
		var me = this,
			ok = 0;

		this.required.each(function() {
			var field = $(this).find('input, select, textarea'),
				result = false;

			if (field.length > 1) {
				result = me.checkRadio(field);
			} else {
				result = me.checkField(field);
			}

			if (result == false) {
				me.throwError(field);
			}

			ok += Number(result);
		});

		return Boolean(ok == this.required.length);
	},

	checkCurrent: function(field) {
		var me = this,
			result = true;

		if ($.trim(field.val()) != '') {
			field.removeClass('error');
			field.closest('.form__row').find('.form__label label').removeClass('error');
		}

		if (field.length > 1) {
			result = me.checkRadio(field);
		} else {
			if ($.trim(field.val()) != '') {
				result = me.checkField(field);
			}
		}

		if (result == false) {
			me.throwError(field);
		}
	},

	throwError: function(field) {
		field.addClass('error');
		field.closest('.form__row').find('.form__label label').addClass('error');
	},

	checkField: function(field) {
		return Boolean($.trim(field.val()));
	},

	checkRadio: function(field) {
		var result = false;

		field.each(function() {
			if ($(this).is(':checked')) {
				result = true;
				return false;
			}
		});

		return result;
	}
};
