function checkPrushForm(form, input_required_fields, maxMissedFields) {
	if(!form) {
		alert("Form object expected in first argument");
		return false;
	}

	if(!maxMissedFields) {
		maxMissedFields = 3;
	}

	var i;
	var missed_fields = new Array();

	var focus_field;

	var required_fields = (input_required_fields) ? input_required_fields : ['lname', 'fname', 'mname', 'email'];

	for(i in required_fields) {
		var field = form[required_fields[i]];
		
		if(!field) continue;

		if(!checkIfFieldFilled(field)) {
			missed_fields.push(getFieldLabel(field));

			if(!focus_field) {
				focus_field = field;
			}
		}
	}

	if(focus_field) {
		if(typeof focus_field.length == "undefined") {
			focus_field.focus();
		} else {
			if(focus_field.length > 0) {
				focus_field = (focus_field.item) ? focus_field.item(0) : focus_field[0];
				if(focus_field) {
					focus_field.focus();
				}
			}
		}
	}

	var sz = missed_fields.length;
	if(sz > 0) {
		if(sz == 1) {
			alert("Необходимо заполнить поле \"" + missed_fields.pop() + "\".");
			return false;
		} else {
			var str = "";
			var isTooMuchMissedFields;
			if(sz > maxMissedFields) {
				isTooMuchMissedFields = true;
				sz = maxMissedFields;
			} else {
				isTooMuchMissedFields = false;
			}


			for(i = 0; i < sz; i++) {
				if(i > 0) {
					if(i == sz - 1) {
						str += " и";
					} else {
						str += ",";
					}
				}

				str += " \"" + missed_fields[i] + "\"";
			}

			if(isTooMuchMissedFields) {
				str += "... и остальные обязательные поля";
			}

			alert("Необходимо заполнить поля" + str + ".");
			return false;
		}
	}
	return true;
}


function checkIfFieldFilled(field) {
	if(typeof field != "object") {
		alert("Expected object, " + (typeof field) + " given");
		return false;
	}
	
	var fieldType = (field.type) ? field.type : "checkboxArray";

	switch(fieldType) {
		case "text":
		case "password":
		case "file":
		case "textarea":
		case "checkbox":
		case "select":
		case "select-one":
			return (field.value.length == 0) ? false : true;
			break;
			
		case "checkboxArray":
			var res = false;
			var i;

			for(i = 0; i < field.length; i++) {
				var item = (field.item) ? field.item(i) : field[i];
				if(item.checked) {
					return true;
				}
			}
			return (i > 0) ? res : true;
			break;

		default:
			alert("Don't know, hot to deal with " + field.type + " input");
			break;
	}

	return true;
}


function getFieldLabel(field) {
	var labels = document.getElementsByTagName("label");

	if(!field.type) {
		field = (field.item) ? field.item(0) : field[0];
	}

	var field_id = field.id;
	var sz = labels.length;
	var i;

	for(i = 0; i < sz; i++) {
		var label = labels.item(i);

		if(label.attributes['for'].nodeValue == field_id) {
			var res = label.textContent;
			
			if(!res) {	//WORKAROUND for IE7
				res = label.innerText;
			}

			res = res.replace(/<[\/]?[A-z0-9+]>/g, "");

			if(res.substring(res.length - 1, res.length) == ":") {
				res = res.substring(0, res.length - 1);
			}
			
			if(res.substring(res.length - 1, res.length) == "*") {
				res = res.substring(0, res.length - 1);
			}
			
			return res;
		}
	}

	return false;
}


function checkForm(obj, elems) {
	var pass = document.getElementById('password');
	var pre_pass = document.getElementById('password_check');	


	if(pre_pass) {
		if(pre_pass.value!==pass.value) {
			alert('Введенные пароли не совпадают');
			pass.focus();
			return false;
		}
	}


	var element, pattern;
	var reg = new RegExp("[0-9a-z_]+@[0-9a-z_^.]+\\.[a-z]{2,3}", 'i');
	for (var i = 0; i < obj.elements.length; i++) {
		element = obj.elements[i];
		if (elems != undefined)
		if (elems.join().indexOf(element.type) < 0) continue;
		if (element.value == 'марка и модель' || element.value == 'куб.см' || element.value == 'л.с.') {
			alert(element.getAttribute("required"));
			element.focus();
			return false;
		}
		if (!element.getAttribute("required")) continue;
		if (pattern = element.getAttribute("check_pattern")) {
			pattern = new RegExp(pattern, "g");
			if (!pattern.test(element.value)) {
				alert(element.getAttribute("required"));
				element.focus();
				return false;
			}   
		}
		else if(/^\s*$/.test(element.value)) {
			alert(element.getAttribute("required"));
			element.focus();
			return false;
		}
		if (null!=element.getAttribute("mail"))
		if (!reg.test(element.value)) {
			alert(element.getAttribute("mail"));
			element.focus(); 
			return false;
		}
    }
	return true;
}
