/* Validacao de Formulario JavaScript (use Prototype 1.6.x ), version 0.1
 *--------------------------------------------------------------------------*/

if (!Prototype) throw('Need prototype...'); else
if (parseFloat(Prototype.Version.substr(0,3)) < 1.6) throw('Wrong version of prototype...');

var Validacao = Class.create();

/**
 * Validacoes
 */
Object.extend(Validacao, {
	confirmacao: function(element) {
		var comparacao = element.name.replace('-confirmar', '')
		elementComparacao = this.form.getInputs(element.type, comparacao)[0];
		return elementComparacao.value == element.value && element.value != '';
	},

	checked: function(element) {
		return !!element.checked;
	},
	
	cpf: function (element) {
		var cpf = element.value;
		var invalidos = ['11111111111','22222222222','33333333333','44444444444','55555555555','66666666666','77777777777','88888888888','99999999999','00000000000'];
		
		if (!cpf || invalidos.include(cpf))
			return false;

		var i, digito = [], posicao = 10, soma = 0;
		var dv_informado = cpf.substr(9,2);

		for(i = 0; i <= 8; i++) {
			digito[i] = cpf.substr(i,1);
			soma = soma + digito[i] * posicao;
			posicao--;
		}

		digito[9] = soma % 11;

		if(digito[9] < 2)
			digito[9] = 0;
		else
			digito[9] = 11 - digito[9];

		posicao = 11;
		soma = 0;

		for (i = 0; i <= 9; i++) {
			soma = soma + digito[i] * posicao;
			posicao--;
		}

		digito[10] = soma % 11;

		if (digito[10] < 2)
			digito[10] = 0;
		else
			digito[10] = 11 - digito[10];

		dv = digito[9] * 10 + digito[10];

		if (dv == dv_informado)
			return true;
		else
			return false;
	}
});

Validacao.validacoes = {
	'v-vazio': [/\w|\d/,"é um campo obrigatório"],
	'v-text': [/\w/i,"precisa conter apenas letras"],
	'v-numero': [/[-+]?[0-9]{1,3}(\.[0-9]{3})?(,[0-9]{2})?/i,"precisa conter apenas números"],
	'v-email': [/^[A-Za-z0-9_.-]+@([A-Za-z0-9_]+\.)+[A-Za-z]{2,4}$/i,"precisa conter um e-mail válido"],
	'v-data': [/^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/[12][0-9]{3}$/i,"precisa conter uma data válida"],
	'v-orkut': [/^http:\/\/www\.orkut\.com\/Profile\.aspx\?uid\=[0-9]{10,}$/i,"precisa ser válido"],
	'v-confirmacao': [Validacao.confirmacao,"deve ser preenchido corretamente"],
	'v-checked': [Validacao.checked,"precisa ser selecionado"],
	'v-cpf': [Validacao.cpf,"precisa ser válido"]
};

var regTextareaMaxlength = /maxlength=(\d{1,4})/i;

Object.extend(Validacao.prototype, {
	/**
	 * Constructor
	 */
	initialize: function(form) {
		this.form = $(form);
		this.validacoes = {};

		if (!this.form) return false;

		if(this.form.hasClassName('v-editar'))
			this.editing = true;
		else
			this.editing = false


		this.elements = form.getElements();

		this.elements.each((function(element) {
			if (!element.className.blank())
				this.setValidacao(element);
		}).bind(this));
	},

	setValidacao: function(element) {
		var validacoes = $H(Validacao.validacoes).keys();
		
		if (element.value && ['text','textarea'].include(element.type) && (!this.editing || element.hasClassName('v-neditar'))) {
			element.onfocus = function() {
				if (this.value == this.defaultValue)
					this.value = '';
			}
			element.onblur = function() {
				if (this.value == '')
					this.value = this.defaultValue;
			}
		}

		$w(element.className).each((function(className) {
			if (element.type == 'textarea' && regTextareaMaxlength.test(className)) {
				this._maxlength(element, className);
				return;
			}
			if(!validacoes.include(className)) return;
			this.validacoes[element.name] = [false, className, element.title];

			if (['radio','checkbox'].include(element.type)) {
				if (Validacao.checked(element))
					this.validacoes[element.name] = [true, className, element.title];

				var validacao = Validacao.validacoes[className][0];
				var caracteres = Validacao.validacoes[className][2];
				var mascara = Validacao.validacoes[className][3];
				
				if (validacao)
					this._validacao(element, validacao, className);
			}

		}).bind(this));
	},
	
	_validacao: function(element, validacao, className) {
		var validador = (function(validacao) {
			if (!validacao) {
				element.oldBackground = element.getStyle('backgroundColor');
				element.setStyle({backgroundColor: '#fee'});
			}
			this.validacoes[element.name] = [validacao, className, element.title];
		}).bind(this);

		var oldClick = element.onclick || function() {}
		if (validacao.test)
			element.onclick = (function() { validador(validacao.test(element.value)); oldClick.bind(element)(); }).bind(this);
		else
			element.onclick = (function() { validador(validacao.bind(this)(element)); oldClick.bind(element)(); }).bind(this);
	},

	_maxlength: function(element, className) {
		var maxlength = className.match(regTextareaMaxlength)[1];
		var oldonkeydown = element.onkeydown || function() { };

		element.onkeydown = function() {
			if (this.value.length > maxlength)
				this.value = this.value.substring(0, maxlength);

			oldonkeydown();
		}
	},
	
	verificaValidacoes: function() {
		var mensagem = 'Preencha corretamente o formulário:\n';
		var validado = true;
		this.atualizaElements();

		$H(this.validacoes).each((function(valida) {
			if(!valida[1][0])
				validado = false;
			else
				return true;

			mensagem += '\n- ' + valida[1][2] + ' ' + Validacao.validacoes[valida[1][1]][1];
		}).bind(this));

		if (!validado)
			alert(mensagem);

		return validado;
	},

	clear: function() {
		$H(this.validacoes).each((function(valida) {
			if (this.validacoes[valida[0]][1] != 'v-checked')
				this.validacoes[valida[0]][0] = false;
		}).bind(this));
	},
	
	atualizaElements: function() {
		var inputs = this.form.getElements();
		var validacoes = $H(Validacao.validacoes).keys();

		inputs.each((function(input) {
			$w(input.className).each((function(className) {
				if(!validacoes.include(className) || ['radio','checkbox'].include(input.type))
					return;

				var validacao = Validacao.validacoes[className][0];
				var validado = (validacao.test) ? validacao.test(input.value) : validacao.bind(this)(input);

				this.validacoes[input.name] = [(validado && (input.value != input.defaultValue || (this.editing && !input.hasClassName('v-neditar')) || input.type == 'hidden')), className, input.title];
			}).bind(this));
		}).bind(this));
	},
	
	submit: function() {
		if (this.verificaValidacoes())
			this.form.submit();
	}
});

$('content').select('form').each(function(form) {
	var oldSubmit = form.onsubmit;
	form.validador = new Validacao(form);

	form.onsubmit = function() {
		if (this.validador.verificaValidacoes()) {
			this.validador.clear();

			if (!oldSubmit)
				return true;
			else {
				var retorno = oldSubmit();
				return !!retorno;
			}
		} 
		
		return false;
	};
});


/*
 * MM Format Prov
 */
function MM_format(e,src,mask) {
	if (window.event) { _TXT = e.keyCode; } 
	else if(e.which) { _TXT = e.which; }

	if(_TXT > 47 && _TXT < 58) { 
	 var i = src.value.length; var saida = mask.substring(0,1); var texto = mask.substring(i)
	 if (texto.substring(0,1) != saida) { src.value += texto.substring(0,1); } 
		return true; } else { if (_TXT != 8) { return false; } 
	 else { return true; }
	}
}