var FormValidation = new Class({

	Implements: [Events, Options],
	
	options: {
		version			: '1.0',
		email			: /^([\w.])+\@(([\w-])+\.)[a-zA-Z0-9]{2,}/,
		domain			: /^(http:\/\/)([\w]+\.){1,}[A-Z]{2,4}\b/gi,
		phone			: /^\+[0-9]{1,3}\.[1-9]{1,2}\.[0-9]{6,}$/gi,
		zip				: /^[0-9]{4,}$/gi,
		numeric			: /^[0-9]+$/gi,
		image			: /[\w]+\.(gif|jpg|bmp|png|jpeg)$/gi,
		ewvt			: /[\w]+\.(htm|html|php|txt)$/gi,
		media			: /[\w]+\.(avi|mov|mpeg|wmv)$/gi,
		pdf				: /[\w]+\.(pdf)$/gi,
		enable			: true,
		err_class		: "invalid-input",
		alias			: 'name',
		required		: 'required',
		mask			: 'mask',
		equal			: 'equal',
		defval			: 'defval'
	},

	initialize: function (element, options) {
		this.FormValidation = element;
		this.setOptions(options);
		this.checkAll();
		
		var elements = this.FormValidation.getElements('input, select, textarea');
		$$(elements).each(function(el) {
			//el.addEvent('click', this.checkAll.bind(this)); //перестал работать вызов диалога отправки файла
			el.addEvent('change', this.checkAll.bind(this));
			el.addEvent('focus', this.checkAll.bind(this));
			el.addEvent('blur', this.checkAll.bind(this));
			el.addEvent('keyup', this.checkAll.bind(this));
		}, this);
	},
	
	checkAll: function  () {
		var permit = true;
		var elements = this.FormValidation.getElements('input, select, textarea');
		$$(elements).each(function(el) {
			ret = this.isValid(el);
			if (!ret) permit = ret;
		}, this);
		var button = this.FormValidation.getElements('input[type=submit]');
		(permit) ? button.set("disabled", false) : button.set("disabled", true);
		return permit;
	},
	
	isValid: function (obj) {
		if (!this.options.enable) return true;
		if (this.required(obj) && this.mask(obj) && this.equal(obj)) {
			$$('#r-' + obj.get('id')).setStyle("visibility", "hidden"); 
			obj.removeClass(this.options.err_class);
			return true;
		}
		else {
			$$('#r-' + obj.get('id')).setStyle("visibility", "visible"); 
			obj.addClass(this.options.err_class);
			return false;
		}
		return false;
	},
	
	required: function (obj) {
		if (obj.get(this.options.required) != 'true') return true;
		if ((obj.match('input[type=checkbox]') || obj.match('input[type=radio]')) && obj.get('checked')) return true;
		if ((obj.match('input[type=file]') || obj.match('input[type=text]') || obj.match('select') || obj.match('textarea')) && obj.get('value') != '' && !this.defval(obj)) return true;
		return false;
	},
	
	mask: function (obj) {
		var tname = obj.get(this.options.mask);
		if (!$defined(tname)) return true;
		eval('tmask = this.options.' + tname + ";");
		var ret = tmask.test(obj.get('value'));
		ret1 = tmask.exec(obj.get('value')); //fix bug in FF
		if (ret) return true;
		return false;
	},

	equal: function (obj) {
		tname = obj.get(this.options.equal);
		if (!$defined(tname)) return true;
		if ($$('#' + tname).get('value') == obj.get('value')) return true;
		return false;
	},

	defval: function (obj) { 
		tdefval = obj.get(this.options.defval);
		if (!$defined(tdefval)) return false;
		if (obj.get('value') != tdefval) return false;
		return true;
	}
});

var SmartAjaxForm = new Class ( {
	Implements: [Events, Options],
	options: {
	    regExpClassname: /^ajax-form/i
	},
	initialize: function (options) {
	    this.setOptions(options);
    	$$('form').each( function (form_tag) {
			if (form_tag.getProperty('class') && form_tag.getProperty('class').test(this.options.regExpClassname)) {
				form_tag.addEvent('submit', function(e) {
					e.stop();
					var responseLayer = new Element('div', {
						'class': 'response ajax-loading',
						'html': '<br/><br/><br/>',
						'events': {
							'click': function(){
								 form_tag.replaces(responseLayer);
							}.pass(form_tag, responseLayer)
						}
					});
			 		responseLayer.replaces(form_tag);
					this.set('send',{
						onComplete: function(response) {
							responseLayer.set('html', response)
							responseLayer.removeClass('ajax-loading');
						},
						onFailure: function(){
							responseLayer.removeClass('ajax-loading');
							alert("Во время отправки формы возникла ошибка. Попробуйте еще раз!");
						}
					});
                	this.send();
				});
			}
		}.bind(this));
	}
});

window.addEvent('domready', function () {
	$$('.form').each( function (element) { new FormValidation(element, {}); } );
	var mySmartFormObj = new SmartAjaxForm();
});
