// ValidateForm v 1.0.
// Author Petrov A.G. aka Sq.Piglet, E-mail: piglet@freeartists.ru, page: http://apetrov.ru/.

function formValidateInit(form){ // Validate form onsubmit.
	var newFormValidate = new formValidate();
	return newFormValidate.construct(form);
}
function formValidate(){ // Class for validate form.
	this.formElements;
	this.submit = true;
	this.viewError = function(element,rules){
		var errorMessage = document.createTextNode(rules["message"]);
		var errorNodeInt = document.createElement("span");
		errorNodeInt.appendChild(errorMessage);
		if(element.parentNode.className == "form-validate-error"){
			var errorNodesInt = element.parentNode.getElementsByTagName("span");
			for(var i=0;i<errorNodesInt.length;i++) if(errorNodesInt[i].firstChild.data == rules["message"]) return false;
			element.parentNode.insertBefore(errorNodeInt,element);
		}else{
			var errorNode = document.createElement("span");
			errorNode.className = "form-validate-error";
			errorNode.appendChild(errorNodeInt);
			element.parentNode.insertBefore(errorNode,element);
			var cloneElement = element.cloneNode(true);
			errorNode.appendChild(cloneElement);
			element.parentNode.removeChild(element);
		}
	}
	this.clearError = function(element,rules){
		var errorNodesInt = element.parentNode.getElementsByTagName("span");
		for(var i=0;i<errorNodesInt.length;i++){
			var message = errorNodesInt[i].firstChild.data;
			message = message.replace(/\d/,"n");
			if(message.indexOf(rules["message"]) >= 0){
				errorNodesInt[i].parentNode.removeChild(errorNodesInt[i]);
			}
		}
		if(element.parentNode.tagName == "SPAN"){
			if(element.parentNode.getElementsByTagName("span").length == 0){
				var cloneElement = element.cloneNode(true);
				var errorNode = element.parentNode;
				errorNode.parentNode.insertBefore(cloneElement,errorNode);
				errorNode.parentNode.removeChild(errorNode);
			}
		}
	}
	this.formValidateRequired = function(element,rules){
		if(element.value) return true;
		else return false;
	}
	this.formValidate_d = function(element,rules){
		var regexp = /^\d*[\.|\,]?\d+$/;
		return regexp.test(element.value);
	}
	this.formValidate_w = function(element,rules){
		var regexp = /\w/;
		return regexp.test(element.value);
	}
	this.formValidateLength = function(element,rules){
		var _length = parseInt(element.className.substring(element.className.indexOf(rules["name"])+rules["name"].length+1,element.className.length));
		rules["message"] = rules["message"].replace("n",_length);
		if (element.value.length == _length) return true;
		else return false;
	}
	this.formValidateMaxLength = function(element,rules){
		var _length = parseInt(element.className.substring(element.className.indexOf(rules["name"])+rules["name"].length+1,element.className.length));
		rules["message"] = rules["message"].replace("n",_length);
		if (element.value.length <= _length) return true;
		else return false;
	}
	this.formValidateMinLength = function(element,rules){
		var _length = parseInt(element.className.substring(element.className.indexOf(rules["name"])+rules["name"].length+1,element.className.length));
		rules["message"] = rules["message"].replace("n",_length);
		if (element.value.length >= _length) return true;
		else return false;
	}
	this.formValidateYear = function(element,rules){
		var date = new Date();
		if(element.value > 0 && element.value <= date.getFullYear()) return true;
		else return false;
	}
	this.formValidateRules = [
		{
			name:"form-validate:required",
			handler:this.formValidateRequired,
			message:"Required field! "
		},
		{
			name:"form-validate:d",
			handler:this.formValidate_d,
			message:"Должны быть только цифры. "
		},
		{
			name:"form-validate:w",
			handler:this.formValidate_w,
			message:"Должны быть только цифры и буквы. "
		},
		{
			name:"form-validate:length",
			handler:this.formValidateLength,
			message:"В поле должно быть ровно n символов. "
		},
		{
			name:"form-validate:max-length",
			handler:this.formValidateMaxLength,
			message:"Максимальная длина не более n символов. "
		},
		{
			name:"form-validate:min-length",
			handler:this.formValidateMinLength,
			message:"Минимальная длина не менее n символов. "
		},
		{
			name:"form-validate:year",
			handler:this.formValidateYear,
			message:"Нужно указать год. "
		}
	];
	this.construct = function(form){
		this.formElements = form.getElementsByTagName("input");
		var focusFlag = false;
		for(var i=0;i<this.formElements.length;i++){
			if(this.formElements[i].className.indexOf("form-validate:") >= 0){
				for(var j=0;j<this.formValidateRules.length;j++){
					if(this.formElements[i].className.indexOf(this.formValidateRules[j]["name"]) >= 0){
						this.clearError(this.formElements[i],this.formValidateRules[j]);
						if(!this.formValidateRules[j]["handler"](this.formElements[i],this.formValidateRules[j])){
							this.viewError(this.formElements[i],this.formValidateRules[j]);
							this.submit = false;
							if(!focusFlag){
								this.formElements[i].focus();
								focusFlag = true;
							}
						}
					}
				}
			}
		}
		return this.submit;
	}
}