
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}

function validateEmail(val) {
	var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
	return reg.test(val);
}
function validatePhone(val) {
	var digits_count = 0;
	for (i = 0; i < val.length; i++) {
		var c = val.charAt(i);
		if (c >= "0" && c <= "9") digits_count++;
	}
	if (digits_count < 11 || digits_count > 12) return false;
	var reg = /^\+([0-9]{1,2})([\s]{0,1})+\(([0-9]{1,4})+\)([\s]{0,1})([0-9\s\-]{5,12})$/;
	return reg.test(val);
}

function validateDate(val, separator) {
	// Формат: дд.мм.гггг
	var exp1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/
	// Формат: дд.мм.гг
	var exp2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/
	// Формат: дд.мм
	var exp3 = /^\d{1,2}(\-|\/|\.)\d{1,2}$/

	if (!exp1.test(val) && !exp2.test(val) && !exp3.test(val)) return false;
	
	var strSeparator = val.substring(2,3);
	if (separator && separator != strSeparator) return false;
	
	var arrayDate = val.split(strSeparator);
	var arrayLookup = {'01' : 31, '03' : 31, '04' : 30, '05' : 31, '06' : 30, '07' : 31, '08' : 31, '09' : 30, '10' : 31, '11' : 30, '12' : 31	}
	
	var intDay = parseInt(arrayDate[0],10);
	
    if(arrayLookup[arrayDate[1]] != null) {
		if(intDay <= arrayLookup[arrayDate[1]] && intDay != 0)
			return true;
	}
	
	var intMonth = parseInt(arrayDate[1],10);
	if (intMonth == 2) {
		var intYear = arrayDate[2] ? parseInt(arrayDate[2], 10) : 0;
		if (intDay > 0 && intDay < 29) {
			return true;
		} else if (intDay == 29) {
			if ((intYear % 4 == 0) && (intYear % 100 != 0) || (intYear % 400 == 0)) {
				return true;
			}
		}
	}
	
	return false;
}

function validateTime(val, separator) {
	// Формат: чч:мм:сс
	var exp1 = /^\d{1,2}(\-|\/|\.|:)\d{1,2}\1\d{2}$/
	// Формат: чч:мм
	var exp2 = /^\d{1,2}(\-|\/|\.|:)\d{1,2}$/
	
	if (!exp1.test(val) && !exp2.test(val)) return false;
	
	var strSeparator = val.substring(2,3);
	if (separator && separator != strSeparator) return false;
	
	var arrayDate = val.split(strSeparator);
	
	var h = parseInt(arrayDate[0] || 0, 10);
	var m = parseInt(arrayDate[1] || 0, 10);
	var s = parseInt(arrayDate[2] || 0, 10);
	
	if (h >= 0 && h < 24 && m >= 0 && m < 60 && s >= 0 && s < 60) return true;
	
	return false;
}

function validateFormField(field) {
	if (field.attr("disabled") == true) {
		field.parents(".item").removeClass("error");
		return true;
	}
	var val = field.val().trim();
	var is_error = (field.hasClass("req-string") && val.length < 1);
	if (!is_error)
		is_error = (field.hasClass("req-email") && !validateEmail(val));
	if (!is_error)
		is_error = (field.hasClass("req-phone") && !validatePhone(val, '-'));
	if (!is_error)
		is_error = (field.hasClass("req-date") && !validateDate(val, '.'));
	if (!is_error)
		is_error = (field.hasClass("req-time") && !validateTime(val, '-'));
	
	if (is_error) {
		field.parents(".item").addClass("error");
		return false;
	} else {
		field.parents(".item").removeClass("error");
		return true;
	}
}

function validateForm(form) {
	var elements = $(form).find(":input");
	
	elements.each(function() {
		$(this).blur(function() {
			validateFormField($(this));
		});
	});
	
	$(form).submit(function() {
		var is_ok = true;
		elements.each(function() {
			if (!validateFormField($(this))) is_ok = false;
		});
		if (!is_ok) {
			alert('При заполнении формы допущены ошибки. Поля с некорректно ввёденными значениями отмечены рамкой.');
			return false;
		}
		return true;
	});
}

