// CLASSE VALIDATE: Original por PhatFusion, modificada por gregori
// Valida dados em um formulário com base em classes html

var Validate = new Class({

// FUNÇÃO DE INICIALIZAÇÃO//////////////////////////////////////////////////////////
	initialize: function(form){
		this.options = $empty; //Inicializa options
		this.options.onFail = $empty; //Se a form falhar
		this.options.onSuccess = false; //Se a form suceder
		this.form = $(form); //Captura o formulario
		this.elements = this.form.getElements('.req'); //Captura campos obrigatórios
		this.optional = this.form.getElements('input,select,textarea'); //Captura campos opcionais
		inicio = new Element('a').setProperty('name','inicio_form').injectBefore(this.form);



		// Função para substituir Enter por Tab (form precisa ter classe comskip)
		if(this.form.hasClass('comskip')){
			this.form.getElements('input,select,textarea').addClass('iteration');
			this.form.getElements('input[type=hidden]').removeClass('iteration');
			this.form.getElement('input[type=submit]').addClass('noskip');
			var inputs = this.form.getElements('.iteration');

			inputs.addEvent('keydown',function(e){
				if((e.key == 'enter') && (! this.hasClass('noskip'))){
					e.stop();
					var next = inputs[inputs.indexOf(this)+1];
					if($defined(next))next.focus();
				}
			});
		}



		//Adiciona classe verde para campos opcionais no blur
		this.optional.each(function(el,i){
			el.addEvent('blur',function() {
				if ((! el.hasClass('req')) && (el.getAttribute('type') != 'submit'))
				{
					el.addClass('g');
				}
			});
		});



		//Valida campos obrigatórios no blur
		this.elements.each(function(el,i){
				el.addEvent('blur', this.validate.bind(this, el));
				if (el.type == 'radio'){
					if (el == this.form[el.name][0]) {
						asterisco = new Element('span').addClass('er').appendText(' * ').injectBefore(this.form[el.name][0]);
						this.clearbr(el);}
				}else{
					el.asterisco = new Element('span').addClass('er').appendText(' * ').injectBefore(el);
					if (el.type == 'checkbox') this.clearbr(el);
				}
		}.bind(this));




		//Adiciona classes nos inputs ao submit e para o formulário
		this.form.addEvent('submit', function(e){
			var event = new Event(e);
			var doSubmit = true;
			this.elements.each(function(el,i){
				this.optional.each(function(el,i){
						if ((! el.hasClass('req')) && (el.getAttribute('type') != 'submit'))
						{el.addClass('g');}
					});
				if(! this.validate(el)){
					event.stop();
					doSubmit = false;
					window.location="#inicio_form";
				}
			}.bind(this));

			if(doSubmit){
				if(this.options.onSuccess){
					event.stop();
					this.options.onSuccess(this.form);
				}else{
					//this.form.getElement('input[type=submit]').setProperty('value','Aguarde...');
				}
			}
		}.bind(this));

	},

////////////////////////////////////////////////////////////////////////////////////




// VALIDA OS CAMPOS INDIVIDUALMENTE ////////////////////////////////////////////////
	validate: function(el){
		var valid = true;
		var funcao = '';
		this.options = $empty;
		this.clearMsg(el);



		switch(el.type){
			case 'text':
			case 'textarea':
			case 'select-one':
			case 'password':
				if(el.value != ''){


					//Extrai a classe para validação das classes html
					el.getProperty('class').split(' ').each(function(el){
						if (el.match(/chk_*/))funcao = eval(el);
					});

					//Valida de acordo com a função repassada pela classe html
					if (funcao != ""){
						this.setOptions(funcao(el));
						if (!this.options.valid) this.setMsg(el, this.options.msg);
						valid = this.options.valid;
						funcao = "";
					}

				}else{
					valid = false;
					this.setMsg(el);
				}
				break;

			case 'checkbox':
				if(!el.checked){
					valid = false;
					this.setMsg(el);
				}else{
					valid = true;
				}
				break;

			case 'radio':
				var rad = $A(this.form[el.name]);
				var ok = false;
				rad.each(function(e,i){
					if(e.checked){
						ok = true;
					}
				});
				if(!ok){
					valid = false;
					if (el == rad.getLast())
					this.setMsg(rad[0], 'Escolha Obrigatória');
				}else{
					valid = true;
					this.clearMsg(rad[0]);
				}
				break;

		}
		if (valid) {el.addClass('g');}
		return valid;
	},
////////////////////////////////////////////////////////////////////////////////////




// ESCREVE MENSAGEM NA TELA	 ///////////////////////////////////////////////////////
	setMsg: function(el, msg){
		el.removeClass('g');
		if(msg == undefined){
			if (el.title) {
				msg = el.title;
			}else{
				msg = ('Campo Obrigatório');
			}
		}
			if(el.error == undefined){
				el.error = new Element('span').addClass('er').appendText(msg).injectBefore(el);
				if (el.type == 'checkbox' || el.type == 'radio') this.clearbr(el);
			}else{
				el.error.appendText(msg);
			}
			el.addClass('v');
	},
////////////////////////////////////////////////////////////////////////////////////



// LIMPA TAG BR PARA INSERIR MENSAGEM DE ERRO OU ASTERISCO /////////////////////////
	clearbr: function(el){
		el.getParent().getElement('br').dispose();
		el.br = new Element('br').injectBefore(el);
	},
////////////////////////////////////////////////////////////////////////////////////



// LIMPA MENSAGEM NA TELA //////////////////////////////////////////////////////////
	clearMsg: function(el){
		el.removeClass('v');
		if(el.error != undefined){
			el.error.destroy();
			el.error = undefined;
			el.addClass('g');
		}
		if (el.suss) el.suss.destroy();
	}
////////////////////////////////////////////////////////////////////////////////////


});


////////////////////////////////////////////////////////////////////////////////////
Validate.implement(new Options);
Validate.implement(new Events);
////////////////////////////////////////////////////////////////////////////////////



// CAPTURA FORMULARIOS /////////////////////////////////////////////////////////////
window.addEvent('domready', function(){

	var valida = [];
	
	document.getElements('form').each(function(el,i){
		if (!el.hasClass('pulesta'))
		valida[i] = new Validate(el);
	});
});
////////////////////////////////////////////////////////////////////////////////////

