function ASFormValidator() {}
ASFormValidator.prototype = {
	validateTextFieldFNs: {
		"not-empty": function(value) {
			return value != "";
		},
		"e-mail": function(value) {
			return value.match(/\b[-0-9a-zA-Z_.+]*?\@[-0-9a-zA-Z_]*?\.[-0-9a-zA-Z_]{2,4}\b/);
		},
		"digit": function(value) {
			return value.match(/\b\d+\b/);
		},
		"url": function(value) {
			return value.match(/\b((http:\/\/)|(http:\/\/www\.)|(www\.))/);
		}
	},
	init: function(form, opts) {
		this.form = form;
		this.collectFieldsToValidate();
		this.submits = as.w("input[type='submit']",this.form);
		if (opts) {
			this.callbackContext = opts.context;
			this.onValid = opts.onValid;
			this.onInvalid = opts.onInvalid;
			this.onEachCheck = opts.onEachCheck;
		}
		
		this.currentValidStatus = false;
		
		this.decorate();
		this.addEventListeners();
	},
	collectFieldsToValidate: function() {
		this.ftv = as.w("[onclick]",this.form).filter(function() {
			return this.onclick() && this.onclick().validate && ((this.tagName.toLowerCase() == "input") || (this.tagName.toLowerCase() == "textarea") || (this.tagName.toLowerCase() == "select"));
		});
	},
	decorate: function() {
		this.disableSubmits();
	},
	disableSubmits: function() {
		this.submits.each(function() {
			this.disabled = true;
			window.console && console.log(1);
			if (!this.warning) {
				this.warning = as.before("<span style='font: bold 12px Tahoma; color: #c00; display: block; margin-bottom: 3px;'>Убедитесь в том, что корректно заполнили все поля.</span>",this);
			}
			else {
				this.warning.style.display = "block";
			}
		});
	},
	enableSubmits: function() {
		this.submits.each(function() {
			this.disabled = false;
			this.warning.style.display = "none";
		});		
	},
	startListenTextField: function(e) {
		var oTextField = e.target;
		this.listenTFInterval = setInterval(as.bind(function(){
			this.onFieldKeyUp({target: oTextField});
		},this),100);
	},
	stopListenTextField: function() {
		clearInterval(this.listenTFInterval);
	},
	addEventListeners: function() {
		var _self_ = this;
		this.ftv.each(function() {
			switch(this.tagName.toLowerCase()) {
				case "select":
				as.e.change(this,_self_.onSelectChange,_self_);
				_self_.onSelectChange({target: this});
				break;
				
				case "textarea":
				as.e.keyup(this,_self_.onFieldKeyUp,_self_);
				as.e.click(this,_self_.onFieldKeyUp,_self_);
				as.e.focus(this,_self_.startListenTextField,_self_);
				as.e.blur(this,_self_.stopListenTextField,_self_);
				_self_.onFieldKeyUp({target: this})
				break;
				
				case "input":
				switch(this.type) {
					case "text":
					as.e.keyup(this,_self_.onFieldKeyUp,_self_);
					as.e.keypress(this,_self_.onFieldKeyUp,_self_);
					as.e.click(this,_self_.onFieldKeyUp,_self_);
					as.e.focus(this,_self_.startListenTextField,_self_);
					as.e.blur(this,_self_.stopListenTextField,_self_);
					_self_.onFieldKeyUp({target: this})
					break;
					
					case "checkbox":
					as.e.change(this,_self_.onCheckboxChange,_self_);
					_self_.onCheckboxChange({target: this})
					break;
					
					case "radio":
					as.e.change(this,_self_.onRadioChange,_self_);
					_self_.onRadioChane({target: this})
					break;
					
					case "file":
					as.e.change(this,_self_.onFileChange,_self_);
					_self_.onFileChange({target: this})
					break;
				}
				break;
			}
		});
		this.checkFTVValid();
	},
	// EVENT LISTENERS
	onSelectChange: function(e) {
		var oSelect = e.target;
		oSelect.asvalid = (oSelect.selectedIndex != 0);
		this.checkFTVValid();
		this.onEachCheck && this.onEachCheck.call((this.callbackContext || window), oSelect, this.ftv);
	},
	onFieldKeyUp: function(e) {
		oTextField = e.target;
		oTextField.asvalid = this.validateTextFieldFNs[oTextField.onclick().type](oTextField.value);
		this.checkFTVValid();
		this.onEachCheck && this.onEachCheck.call((this.callbackContext || window), oTextField, this.ftv);
	},
	onCheckboxChange: function(e) {
		var oCheckbox = e.taraget;
		oCheckbox.asvalid = oCheckbox.checked;
		this.checkFTVValid();
		this.onEachCheck && this.onEachCheck.call((this.callbackContext || window), oCheckbox, this.ftv);
	},
	onRadioChange: function(e) {
		var oRadio = e.target;
		as.w("input[type='radio'][name='" + oRadio.name + "']",this.form).each(function() {this.asvalid = true;})
		this.checkFTVValid();
		this.onEachCheck && this.onEachCheck.call((this.callbackContext || window), oRadio, this.ftv);
	},
	onFileChange: function(e) {
		var oFile = e.target;
		oFile.asvalid = (oFile.value != "");
		this.checkFTVValid();
		this.onEachCheck && this.onEachCheck.call((this.callbackContext || window),oFile, this.ftv);
	},
	
	//CHECK IF ARE ALL FIELDS TO VALIDATE VALID
	checkFTVValid: function() {
		var isValid = true;
		this.ftv.each(function() {
			if (!this.asvalid && this.offsetWidth) isValid = false;
		});
		
		if (isValid != this.currentValidStatus) {
			if (isValid) {
				this.onValid && this.onValid.call(this.callbackContext || window);
				this.enableSubmits();
			}
			else {
				this.onInvalid && this.onInvalid.call(this.callbackContext || window);
				this.disableSubmits();
			}
		}
		this.currentValidStatus = isValid;
	}
}

