
/**************************************************************

	Script		: Validate
	Version		: 2.1
	Authors		: Samuel Birch
	Desc		: Form validation
	Licence		: Open Source MIT Licence

**************************************************************/

var Validate = new Class({
	
	getOptions: function(){
		return {
			validateOnBlur: true,
			errorClass: 'error',
			errorMsgClass: 'errorMessage',
			onFail: Class.empty,
			onSuccess: false,
			showErrorsInline: true,
			label: 'Enviando...'
		};
	},

	initialize: function(form, options){
		this.setOptions(this.getOptions(), options);
		
		this.form = $(form);
		this.elements = this.form.getElements('.required');
		
		this.list = [];
		
		this.elements.each(function(el,i){
			if(this.options.validateOnBlur){
				el.addEvent('blur', this.validate.bind(this, el));
			}
		}.bind(this));
		
		this.form.addEvent('submit', function(e){
			var event = new Event(e);
			var doSubmit = true;
			this.elements.each(function(el,i){
				if(! this.validate(el)){
					event.stop();
					doSubmit = false
					this.list.include(el);
				}else{
					this.list.remove(el);
				}
			}.bind(this));
			
			if(doSubmit){
				if(this.options.onSuccess){
					event.stop();
					this.options.onSuccess(this.form);
				}else{
					if (this.form.target != "_blank")
						this.form.getElement('input[type=submit]').setProperty('value',this.options.label);
				}
			}else{
			//	this.form.getElements('input[type=text]').each(function(el){
			//		if (el.value == "")
			//			el.value = el.valorLayout;
			//	}.bind(this));
			//	this.form.getElements('textarea').each(function(el){
			//		if (el.value == "")
			//			el.value = el.valorLayout;
			//	}.bind(this));
				this.options.onFail(this.getList());
			}
			
		}.bind(this));
		
	},
	
	getList: function(){
		var list = new Element('ul');
		this.list.each(function(el,i){
			if(el.title != ''){
			var li = new Element('li').injectInside(list);
			new Element('label').setProperty('for', el.id).setText(el.title).injectInside(li);
			}
		});
		return list;
	},
	
	validate: function(el){
		var valid = true;
		this.clearMsg(el);
		
		switch(el.type){
			case 'text':
			case 'textarea':
			case 'select-one':
			case 'password':
				//if(el.value != '' && el.valorLayout != el.value){
				if(el.value != '' && el.value != ' '){
					if(el.hasClass('email')){
						var regEmail = /[A-Z0-9_.-]+@([A-Z0-9_]+\.)+[A-Z]{2,4}/;
						if(el.value.toUpperCase().match(regEmail)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Entre com um e-mail válido');
						}
					}
					
					if(el.hasClass('confirm')){
						this.form.getElements('input').each(function(el){
							if(el.hasClass('match')){
								elem = el.value.toUpperCase();
							}
						});
						if(el.value.toUpperCase() == elem){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Dados não conferem');
						}
					}
					
					if(el.hasClass('data')){
						var regDt = /(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/[12][0-9]{3}/
						if(el.value.match(regDt)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Preencha data no formato dd/mm/aaaa');
						}
					}
					
					if(el.hasClass('moeda')){
						var regNum = /^[0-9]*(,[0-9]{1,2})?$/;
						if(el.value.match(regNum)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Preencha no formato moeda da época (nnnnnn,nn)');
						}
					}
					
					if(el.hasClass('oabproc')){
						var regNum = /^([A-Za-z]{2}(([0-9]{6})|([0-9]{5}[A-Za-z]{1})))$|^([Pp][Cc][0-9]{1,4})$/;
						if(el.value.match(regNum)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Preencha OAB / Procurador no formato DFNNNNNN / PCNNN');
						}
					}
					
					if(el.hasClass('pushCPF')){
						var regNum = /^([0-9]{9}-?[0-9]{2})$|^([0-9]{8}\/?[0-9]{4}-?[0-9]{2})$/;
						if(el.value.match(regNum)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Preencha CPF / CNPJ no formato 999999999-99 / 99999999/9999-99');
						}
					}
					
					if(el.hasClass('pushMail')){
						var regEmail = /([A-Z0-9_.-]+@([A-Z0-9_]+\.)+[A-Z]{2,4})|^descadastrar/i;
						if(el.value.toUpperCase().match(regEmail)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Entre com um e-mail válido');
						}
					}
					
					if(el.hasClass('cpfnumero')){
						var regNum = /^[0-9]{11}$/;
						if(el.value.match(regNum)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Preencha o CPF somente com números');
						}
					}
					
					var classes = el.getProperty("class").split(' ');
					for (i=0;i<classes.length;i++){
						if(classes[i].match(/^size(\[.+\])$/)) {
							var size = classes[i].match(/^size(\[.+\])$/)[1].replace('[', '');
							size = size.replace(']', '');
							size = size.split(',');
							var regSize = new RegExp("^.{"+size[0]+","+size[1]+"}$");
							if(el.value.match(regSize)){
								valid = true;
							}else{
								valid = false;
								this.setMsg(el, 'Permitido de '+size[0]+' a '+size[1]+' caracteres');
							}
						}
					}
					
					if(el.hasClass('number')){
						var regNum = /^[0-9]*$/;
						if(el.value.match(regNum)){
							valid = true;
						}else{
							valid = false;
							this.setMsg(el, 'Apenas números permitidos');
						}
					}
					
				}else{
					valid = false;
					this.setMsg(el);
				}
				break;
				
			case 'checkbox':
				if(el.hasClass('multi')){
					var rad = $A(this.form[el.name]);
					var ok = false;
					rad.each(function(e,i){
						if(e.checked){
							ok = true;
						}
					});
					if(!ok){
						valid = false;
						this.setMsg(rad.getLast(), 'Escolha pelo menos uma opção');
					}else{
						valid = true;
						this.clearMsg(rad.getLast());
					}
				}
				else {
					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;
					this.setMsg(rad.getLast(), 'Escolha uma opção');
				}else{
					valid = true;
					this.clearMsg(rad.getLast());
				}
				break;
				
		}
		return valid;
	},
	
	setMsg: function(el, msg){
		if(msg == undefined){
			msg = el.title;
		}
		if(this.options.showErrorsInline){
			if(el.error == undefined){
				el.error = new Element('span').addClass(this.options.errorMsgClass).setText(msg).injectAfter(el);
			}else{
				el.error.setText(msg);
			}
			el.addClass(this.options.errorClass);
		}
	},
	
	clearMsg: function(el){
		el.removeClass(this.options.errorClass);
		if(el.error != undefined){
			el.error.remove();
			el.error = undefined;
		}
	}
	
});

Validate.implement(new Options);
Validate.implement(new Events);


/*************************************************************/
