function formsCheck() {
	
	// �������� ���������� ������� ��������� ����
	var s="submitForm";
	var r="required";
	var m="missed";
	var w="wrong";
	
	// �������� ��������� ������� ��������� ����
	var phone="phone";
	var number="number";
	var email="email";
	var time="time";
	
	// ���������� ��������� �� �������
	var rMessage=""; // required message
	var wMessage=""; // wrong message
	// ����� ��� ����� �� ��������
	var forms = document.getElementsByTagName("form");
	if (!forms) return;
	
	// ��������� ��� �������� ������ �� ���� ����
	for (i=0; i<forms.length; i++) {
		var theForm=forms[i]; // ������� �����
		var e=forms[i].elements; // �� ��������
		
		// ��������� ����������� � ��������� � class="required", � ����� �� ����� ��������, ���������� ������������� ������
		for (var k=0; k<e.length; k++) {
		
			if (check(e[k],r) || check(e[k],phone) || check(e[k],email) || check(e[k],time)) {
				switch (e[k].tagName) {
					case "INPUT":
					case "TEXTAREA":
						e[k].onkeyup = e[k].onkeypress = function(){
							if(this.value!=""){
								removeclass(getStyleElement(this), m);
								removeclass(getStyleElement(this), w);
							}else{
								addclass(getStyleElement(this), m);								
							}
						}
						break;
					case "SELECT":
						e[k].onchange = function(){
							if(this.options.selectedIndex!=0){
								removeclass(getStyleElement(this), m);
							}else{
								addclass(getStyleElement(this), m);								
							}
						}
						break;
				}
			}
			
			if (check(e[k],s)){ // ����������� ������� ���������� ����� � �������� � class="submitForm"				
				e[k].onclick = validate(theForm);
			}
		}
	}
	
	function validate(f){
		return function(){return validateForm(f);}
	}
	
	function validateForm(theForm) {
		var ok = true; // ���� ���������� ������ �����
		var e = theForm.elements; // ��� �������� ������ �����
		
		for (i=0; i<e.length; i++) {			
			switch (e[i].tagName) {
				case "INPUT":
					if (check(e[i],r) && !e[i].value) { // ���� class="required" � ���� �� ���������																		
						ok = false;
						addclass(getStyleElement(e[i]), m);
						rMessage+=getLabel(e[i])+"\n";						
					}else if(e[i].value!=""){
						if(check(e[i],phone) && !isPhone(e[i].value)){
							ok = false;
							addclass(getStyleElement(e[i]), w);
							wMessage+=getLabel(e[i])+"\n";							
						}else if(check(e[i],number) && !isNumber(e[i].value)){
							ok = false;
							addclass(getStyleElement(e[i]), w);
							wMessage+=getLabel(e[i])+"\n";							
						}else if(check(e[i],email) && !isEmail(e[i].value)){
							ok = false;
							addclass(getStyleElement(e[i]), w);
							wMessage+=getLabel(e[i])+"\n";							
						}else if(check(e[i],time) && !isTime(e[i].value)){
							ok = false;
							addclass(getStyleElement(e[i]), w);
							wMessage+=getLabel(e[i])+"\n";							
						}
					}
					break;
				case "TEXTAREA":
					if (check(e[i],r) && !e[i].value) { // ���� class="required" � ���� �� ���������																		
						ok = false;
						addclass(getStyleElement(e[i]), m);
						rMessage+=getLabel(e[i])+"\n";						
					}else if(e[i].value!=""){
						if(check(e[i],phone) && !isPhone(e[i].value)){
							ok = false;
							addclass(getStyleElement(e[i]), w);
							wMessage+=getLabel(e[i])+"\n";							
						}else if(check(e[i],number) && !isNumber(e[i].value)){
							ok = false;
							addclass(getStyleElement(e[i]), w);
							wMessage+=getLabel(e[i])+"\n";							
						}else if(check(e[i],email) && !isEmail(e[i].value)){
							ok = false;
							addclass(getStyleElement(e[i]), w);
							wMessage+=getLabel(e[i])+"\n";							
						}else if(check(e[i],time) && !isTime(e[i].value)){
							ok = false;
							addclass(getStyleElement(e[i]), w);
							wMessage+=getLabel(e[i])+"\n";							
						}
					}
					break;
				case "SELECT":
					if (check(e[i],r) && e[i].options.selectedIndex==0) { // ���� class="required" � �������� ������� ����� �� ���������
						ok = false;
						addclass(getStyleElement(e[i]), m);
						rMessage+=getLabel(e[i])+"\n";						
					}
					break;
			}
		}
		
		if (ok){
			theForm.submit();
		}else{
			if(rMessage!=""){
			rMessage="Заполните пропущенные поля:\n"+rMessage+"\n\n";
			}
			if(wMessage!=""){
			wMessage="Введите корректные данные:\n"+wMessage;
			}
			alert(rMessage+wMessage);
			rMessage="";
			wMessage="";
			return false;
		}
	}
	
	// ������� ���������� ������ � ��������
	function addclass(o, c) {
		if(!o) return;
		if (!check(o, c)) {
			o.className += o.className == ''?c:' '+c;
		}
	}
	
	// ������� �������� ������
	function removeclass(o, c) {
		if(!o) return;
		o.className = o.className.replace(c, '');
	}
	
	// ������� �������� ������� ������� ������
	function check(o, c) {	 
		if(!o) return;	
		return new RegExp('\\b' + c + '\\b').test(o.className);
	}
	
	// ������� �������� �� ������������ ��������� ������
	function isTime(sTime) {
	oReTime = /^(2[0-3][:\-][0-5][0-9]$)|^([0-1]{0,1}[0-9][:\-][0-5][0-9])$/; 
	return oReTime.test(sTime);
	}
	
	function isNumber(sNumber) {
		oReNumber = /^\-{0,1}\d+$/;
		return oReNumber.test(sNumber);
	}
	
	function isPhone(sPhone) {
		sPhone = sPhone.replace( /[\s\-\(\)\.\]\[]/g, '' );
		oRePhone = /^\+*\d{7,11}(\+\d{2,4})?$/;
		return oRePhone.test(sPhone);
	}
	
	function isEmail(sEmail){
		//sEmail = sEmail.replace( /\(.*?\)/, '' );
		oRegExp = /^[A-Za-z0-9][-\w]*(\.[A-Za-z0-9][-\w]*)*@[A-Za-z0-9][-\w]*(\.[A-Za-z0-9][-\w]*)*\.[a-zA-Z]{2,4}$/;
		return oRegExp.test(sEmail);
	}

	// ���������� ���������� ���������� label, ��������������� �������������� �������� ����� 
	function getLabel(e){
		labels=e.form.getElementsByTagName("label");
		for(k=0;k<labels.length;k++){
			if(labels[k].htmlFor==e.id){
			    return labels[k].innerHTML;
			    break;
			}
		}
	}
	// ������� "���������" ��������, � �������� ����� ����������� class="missed" -
	// ��� �������� �� ������� �����, ����������� � ����������
	function getStyleElement(o){
	
		// return o; // ������� ������ �������� ����� � �������� ��������� ��������
		// return o.parentNode; // ������� ������������� ���������� � �������� ��������� ��������	
		return o.parentNode.getElementsByTagName("label")[0]; // ������� label � �������� ��������� ��������
	}
}

formsCheck();
// window.onload = formsCheck;
