
function checkForm(form) {
	var ok = true;
	setAllInputsValid(form);
	ok &= checkEmailFields(form);
	ok &= checkNumberFields(form);
	ok &= checkPhoneFields(form);
	ok &= checkCheckboxFields(form);
	ok &= checkMinFields(form);
	ok &= checkRequiredFields(form);
	ok &= checkAlternativeFields(form);
	
	if (ok) {
		return true;
	}
	else {
		setTimeout(function() {
    		$(form).find("input,textarea,select,div").removeClass("invalid");
			$("#"+form.id + " .invalidMessage").hide();	
			$("#"+form.id + " input[type=submit]").show();
		}, 3000);
		return false;
	}
}

function setAllInputsValid(form) {
	$(form).find("input,textarea,select,div").removeClass("invalid");
	$("#"+form.id + " .invalidMessage").hide();	
}

function checkRequiredFields(form) {
	var emptyFieldRegexp = /^\s*$/;
	return checkFields(
		form,
		"required",
		function(input) {
			if(input.type == 'radio') {
				var val = $('input[name='+input.name+']:checked').val();
				if(!val) val = '';
				return !val.match(emptyFieldRegexp);
			}
			else
				return !(input.value.toString().match(emptyFieldRegexp) || input.value == input.title);
		}
	);
}

function checkAlternativeFields(form) {
	var emptyFieldRegexp = /^\s*$/;
	return checkAlternativeFields(
		form,
		"alternative",
		function(input) {
			if(input.type == 'radio') {
				var val = $('input[name='+input.name+']:checked').val();
				if(!val) val = '';
				return !val.match(emptyFieldRegexp);
			}
			else
				return !(input.value.toString().match(emptyFieldRegexp) || input.value == input.title);
		}
	);
}

function checkNumberFields(form) {
	var numberRegexp = /^[0-9]+$/i;
	return checkFields(
		form,
		"number",
		function(input) {
			return input.value == '' || input.value.toString().match(numberRegexp);
		}
	);
}

function checkPhoneFields(form) {
	var phoneRegexp = /^\+?[0-9]{2}[0-9]*\/?[0-9]{4}[0-9]*$/i;
	return checkFields(
		form,
		"phone",
		function(input) {
			return input.value == '' || input.value.toString().replace(/ +/g, '').match(phoneRegexp);
		}
	);
}

function checkEmailFields(form) {
	var emailRegexp = /^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@([a-z0-9]([a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]([a-z0-9-]*[a-z0-9])?$/i;
	return checkFields(
		form,
		"email",
		function(input) {
			return input.value == '' || input.value.toString().match(emailRegexp);
		}
	);
}

function checkCheckboxFields(form) {
	return checkFields(
		form,
		"checkbox",
		function(input) {
			return $(input).filter(':checked').length;
		}
	);
}

function checkMinFields(form) {
	return checkFields(
		form,
		"min3",
		function(input) {
			return input.value.toString().length >= 3;
		}
	);
}

function checkFields(form, className, validateFunction) {
	var ok = true;
	$(form).find("input." + className + ",textarea." + className + ",select." + className).each(function() {
		if (validateFunction(this))
			return;
		ok = false;
		if(this.type == 'radio')
			$(this).parent().addClass("invalid");
		else
			$(this).parent().addClass("invalid");
	});
	
	if(!ok){
		$("#"+form.id + " input[type=submit]").hide();
		$("#"+form.id + " .invalidMessage").show();
	}
	
	return ok;
}

function checkAlternativeFields(form, className, validateFunction) {
	var ok = true;
	
	$(form).find("input." + className + ",textarea." + className + ",select." + className).each(function() {
		ok = false;
	});
	
	$(form).find("input." + className + ",textarea." + className + ",select." + className).each(function() {
		if (validateFunction(this)) {
			ok = true;
		}
	});
	
	if(!ok) {
		$(form).find("input." + className + ",textarea." + className + ",select." + className).each(function() {

		if(this.type == 'radio')
			$(this).parent().addClass("invalid");
		else
			$(this).parent().addClass("invalid");
		});
		
		$("#"+form.id + " input[type=submit]").hide();
		$("#"+form.id + " .invalidMessage").show();
	}
	return ok;
}

