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 "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.innerHTML;
			}

			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;
}


var previousCollapsedNode = {};

function changeDivVisible(sDivId, sCollapseGrpName) {
    var oDiv, pNode;

    if(pNode = previousCollapsedNode[sCollapseGrpName]) {
        if(pNode.id != sDivId) {
            pNode.style.display = 'none';	
	}
    }

    if (oDiv = document.getElementById(sDivId)) {
        oDiv.style.display = (oDiv.style.display != 'none' ? oDiv.style.display = 'none' : oDiv.style.display = 'block');
	previousCollapsedNode[sCollapseGrpName] = oDiv;
    }
}
