function getSelectValue(elem) {
	var ie = /*@cc_on @_jscript_version||@*/0;
	var result, result_first;
	if (ie) {
		var myoption = elem.getElementsByTagName('option')[elem.selectedIndex];
		var outerHTML = myoption.outerHTML;
		var re = new RegExp();
		re = /\svalue=\"(.*)\"/g;
		result_first = re.exec(outerHTML);
		result = result_first ? result_first[1] : myoption.text;
	} else {
		result = elem.value;
	}
	return result;
}

function ltrim(text){
	var index = 0;
	while (text.charAt(index) == " " || text.charAt(index) == "\t") {
		index++;
	}
	return text.substr(index);
}

function rtrim(text) {
	var index = text.length - 1;
	while (text.charAt(index) == " " || text.charAt(index) == "\t") {
		index--;
	}
	return text.substring(0, index + 1);
}

function trim(text){
	return ltrim(rtrim(text));
}

function getLabelForElement(elem) {
	var labels = elem.form.getElementsByTagName('label');
	var labelsLength = labels.length;
	var label;
	for (var i = 0; i < labelsLength; i++) {
		if (labels[i].htmlFor == elem.id) {
			label = labels[i];
			break;
		}
	}
	return label;
}

function isEmpty(str) {
	var re = /^\s*$/;
	var result = str.match(re) ? true : false;
	return result;
}

function isEMailAddr(str) {
	var re = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;
	var result = str.search(re) != -1;

	return result;
}

function checkForm(frm, lang) {
	var labels = frm.getElementsByTagName('label');
	var labelsLength = labels.length;
	var elements = frm.elements;
	var requiredElements = new Array();
	var requiredElementsTypes = new Array();
	var j = 0;
	var elemValue;
	var label, labelLastChild, id, elem;

	for (var i = 0; i < labelsLength; i++) {
		label = labels[i];

		if (label) {
			labelLastChild = label.lastChild;

			if (labelLastChild.nodeName.toLowerCase() == 'span' && labelLastChild.firstChild && labelLastChild.firstChild.nodeValue == '*') {
				id = label.htmlFor;
				elem = document.getElementById(id);

				if (elem && !elem.disabled) {
					if (labelLastChild.className == 'email') {
						requiredElementsTypes[j] = 'email';
					}
					else if (labelLastChild.className == 'url') {
						requiredElementsTypes[j] = 'url';
					}
					else {
						requiredElementsTypes[j] = '';
					}

					requiredElements[j] = elem;
					j++;
				}
			}
		}
	}

	requiredElementsLength = requiredElements.length;
	var elementsEmpty = new Array();
	var elementsWrong = new Array();
	var elementForFocus;

	if (requiredElementsLength) {
		var m = 0;
		var n = 0;
		var nodeNameLower;
		var curElem;

		for (var k = 0; k < requiredElementsLength; k++) {
			curElem = requiredElements[k];
			nodeNameLower = curElem.nodeName.toLowerCase();

			if ('select' === nodeNameLower) {
				elemValue = getSelectValue(curElem);
			}
			else if ('input' === nodeNameLower && 'checkbox' === curElem.type.toLowerCase()) {
				elemValue = curElem.checked
				          ? 'on'
				          : '';
			}
			else {
				elemValue = curElem.value;
			}

			if (isEmpty(elemValue)) {
				elementsEmpty[m] = curElem;
				m++;
			}
			else if (requiredElementsTypes[k] == 'email' && !isEMailAddr(elemValue)) {
				elementsWrong[n] = curElem;
				n++;
			}
		}
		var elementsEmptyLength = elementsEmpty.length;
		var elementsWrongLength = elementsWrong.length;
		var mymsg;
		var mybull = '\u2014 ';
		var mytrailing;

		if (elementsEmptyLength) {
			if ('en' == lang) {
				mymsg = (elementsEmptyLength == 1)
					  ? 'Caution, following required field is not filled:\n\n'
					  : 'Caution, following required fields are not filled:\n\n';
			}
			else {
				mymsg = (elementsEmptyLength == 1)
					  ? 'Внимание, не заполнено следующее обязательное поле:\n\n'
					  : 'Внимание, не заполнены следующие обязательные поля:\n\n';
			}

			for (var p = 0; p < elementsEmptyLength; p++) {
				mytrailing = (p < elementsEmptyLength - 1)
					       ? ','
					       : '.';

				var labelText = trim(getLabelForElement(elementsEmpty[p]).firstChild.nodeValue);

				var lastChar = labelText.slice(-1);

				if (':' === lastChar || '.' === lastChar) {
					labelText = labelText.substr(0, labelText.length -1);
				}

				mymsg += mybull + labelText + mytrailing + '\n';
			}

			alert(mymsg);

			if (elementsEmpty[0].type !== 'hidden') {
				elementsEmpty[0].focus();
			}

			return false;
		}
		else if (elementsWrongLength) {
			if ('en' == lang) {
				mymsg = (elementsWrongLength == 1)
					  ? 'Caution, following field is filled wrong:\n\n'
					  : 'Caution, following fields are filled wrong:\n\n';
			}
			else {
				mymsg = (elementsWrongLength == 1)
					  ? 'Внимание, следующее поле заполнено неправильно:\n\n'
					  : 'Внимание, следующие поля заполнены неправильно:\n\n';
			}

			for (var p = 0; p < elementsWrongLength; p++) {
				mytrailing = (p < elementsWrongLength - 1)
					       ? ','
					       : '.';

				mymsg += mybull + trim(getLabelForElement(elementsWrong[p]).firstChild.nodeValue) + mytrailing + '\n';
			}

			alert(mymsg);
			elementsWrong[0].focus();

			return false;
		}
	}
	return true;
}
