/*
'=====================================
'Funções para validação de formulários
'versão 10/04/2010
'Patrick J Levy
'=====================================
/*
Como usar:
Essa função faz duas coisas: Implementa mascaras e validação.

VALIDAÇÃO

1. colocar no <form method="post" action="..." name="..." onSubmit="return valida(this);">
2. para cada campo text, memo, hidden a ser validado colocar: <input type="text" ... valida="Especifique o valor para ...">
3. para select colocar <select valida="Especifique uma op&#30959;..."> - aten&#30959;: a primeira op&#30959; n&#15328;vale como sele&#30959;.
4. para radio/checkbox colocar na primeira op&#30959; apenas: <input type="radio" value="..." valida="Especifique uma op&#30959;...">
5. Para monstrar o texto da mensagem de acordo com o nome do campo, use valida="*". Para um campo chamado "Telefone", o texto da valida&#30959; ser&#6178;Especifique um valor para o campo Telefone"
6. Se precisar de valida&#32101;s customizadas no mesmo formul&#7337;o, inclua uma fun&#30959; "valida_custom" na pagina, retornando true ou false:

	function valida_custom(theForm){
		if (theForm.ExeInd[0].checked && theForm.ExeInd0.value == ''){
			alert ('Especifique quem foi o APG Senior.')
			theForm.ExeInd0.focus();
			return false;
		}
		return true;
	}
MASCARA:

1. inclua o atributo mask="true" na tag form.
2. para cada campo que precise de maskara use:
mask="numero" : somente numers, sem sinal
mask="inteiro" : somente numeros  -
mask="decimal" : somente numeros - e ,
mask="money" : somente numeros - , e .
mask="texto1" : todas a letras, acentuada, numeros e simbolos, exceto & ' e "
mask="login" : letras, numeros e _
mask="email" : letras, numeros,  _ . @ - e formato v&#6953;do
mask="memo1" : todas a letras, acentuada, numeros e simbolos, exceto & ' e "
Aten&#30959;: se houver um objeto com id igual ao nome do campo mais _len, dentro desse campos ser&#6177;presnetado a contagem de caracteres.
Exemplo "<textarea name="obs" mask="memo1"></textarea><div id="obs_len"></div>
mask="cep" : somente numeros, sem sinal, e valida formato [5-3]
mask="data" : somente numeros, sem sinal, e valida formato [2/2/4] e valida data valida
mask="cpf" : somente numeros, sem sinal, e valida formato [3.3.3-2] e valida cpf valida
mask="cnpj" : somente numeros, sem sinal, e valida formato [3.3.3/4-2] e valida cnpj valida
mask="hora" : somente numeros, sem sinal, e valida formato [2:2:2] e valida hora valida
mask="tel"  :  somente numeros, sem sinal, e valida formato [(3)4-4]
mask="visa"  :  somente numeros, sem sinal, e valida formato [4-4-4-4]
*/

//função usada para enviar formulários a partir do href, ao inves de um botão de envio
function submitForm(theForm){
	if (theForm){
		if (typeof(validar) == 'function'){
			validar(theForm);
			if(procValida(theForm)){
				theForm.submit();
			}
		} else {
			theForm.submit();
		}
	}
}

function procValida(theForm){
	//confirma&#30959; de submiss&#15328;do formul&#7337;o. caso negativo, cancela tudo:
	validaStr = theForm.getAttribute('valida');
	if (!!validaStr){
		question = confirm(validaStr);
		if (question == 0){
			return false;
		}
	}

	//passa por todos os campos:
	for (i = 0; i < theForm.length; i++){
		var validaStr = theForm.elements[i].getAttribute('valida');
		var maskStr = theForm.elements[i].getAttribute('mask');
		if (!validaStr) validaStr = '';
		if (!maskStr) maskStr = '';

		if (validaStr != '' || maskStr!= ''){
			var frmObj = theForm.elements[i];
			var frmTyp = theForm.elements[i].type;
			var frmObjName = theForm.elements[i].name;
			if  (validaStr == '*') validaStr = 'Especifique um valor para o campo "'+frmObjName+'"';
			if (frmTyp == 'text' || frmTyp == 'password' || frmTyp == 'textarea' || frmTyp == 'hidden'){
				if (validaStr != '' && (frmObj.value == '' || frmObj.value == '(__)____-____')){
					alert(validaStr);
					frmObj.focus();
					return (false);
				} ;
				if (maskStr != '' && frmObj.value != ''){
					var oMask = mask[maskStr];
					if (maskStr == 'cep'){
						reg = oMask.regex;
						if (!reg.test(frmObj.value)){
							alert('Formato inválido no campo CEP. Utilize xxxxx-xxx.');
							frmObj.focus();
							return (false);
						}
					} else if (maskStr == 'email'){
						reg = oMask.regex;
						if (!reg.test(frmObj.value)){
							alert('Formato inválido no campo E-mail.');
							frmObj.focus();
							return (false);
						}
					} else if (maskStr == 'data'){
						reg = oMask.regex;
						if (!reg.test(frmObj.value)){
							alert('Formato inválido no campo data.');
							frmObj.focus();
							return (false);
						}
					} else if (maskStr == 'hora'){
						reg = oMask.regex;
						if (!reg.test(frmObj.value)){
							alert('Formato inválido no campo hora.');
							frmObj.focus();
							return (false);
						}
					} else if (maskStr == 'cnpj'){
						var errStr = validaCNPJ(frmObj.value);
						if (errStr != ''){
							alert(errStr);
							frmObj.focus();
							return (false);
						}
					} else if (maskStr == 'cpf'){
						var errStr = validaCPF(frmObj.value);
						if (errStr != ''){
							alert(errStr);
							frmObj.focus();
							return (false);
						}
					}
				}
			} else if (frmTyp == 'radio' || frmTyp == 'checkbox'){
				var noCheck = true;
				var radioGrp = theForm[frmObjName];
				if (radioGrp.length) {
					var max = radioGrp.length;
					for (var idx = 0; idx < max; idx++) {
						if (radioGrp[idx].checked) {
							noCheck = false;
						}
					}
				} else {
					if (radioGrp.checked) {
						noCheck = false;
					}
				}
				if (!!validaStr && noCheck){
					alert(validaStr);
					frmObj.focus();
					return (false);
				}
			} else if (frmTyp == 'select-one'){
				if (!!validaStr && frmObj.selectedIndex <= 0){
					alert(validaStr);
					frmObj.focus();
					return (false);
				}
			}
		}
	} //for

	if(typeof valida_custom == 'function') {
		return valida_custom(theForm);
	}
	return (true);
}
function validar(theForm){
	if (theForm){
		theForm.onsubmit=function(){return procValida(theForm)};
		for (i = 0; i < theForm.length; i++){
			maskStr = theForm.elements[i].getAttribute('mask');
			if (!!maskStr){
				var frmObj = theForm.elements[i];
				var frmTyp = theForm.elements[i].type;
				var frmObjName = theForm.elements[i].name;
				frmObj.onkeypress = function(pkey){
					var key   = getKey(pkey);
					if (key == 'pass'){
						return true;
					}
					var ch    = String.fromCharCode(key);
					var str   = this.value + ch;
					var pos   = str.length;
					var oMask  = mask[this.getAttribute('mask')];
					var oMaskLen = oMask.format.length;
					if (oMaskLen == 0) oMaskLen = this.getAttribute('maxlength');
					var valida = oMask.valida
					if (valida != ''){
						valida = valida + valida.toUpperCase();
						if (valida.indexOf(ch) >= 0 && pos <= oMaskLen) {
							if (oMask.format != ''){
							   if (oMask.format.charAt(pos - 1) != ' ' ) {
								  str = this.value + oMask.format.charAt(pos - 1) + ch;
							   }
							   this.value = str;
							} else {
								return true;
							}
						}
						return false;
					} else {
						return true;
					}
				}
				if (frmTyp == 'textarea'){
					if (document.getElementById(frmObjName+'_len')){
						document.getElementById(frmObjName+'_len').innerHTML = frmObj.value.length+'&nbsp;caracteres. (máx: '+frmObj.getAttribute('maxlength')+')';
						frmObj.onkeyup = function(){
							if (this.value.length > this.getAttribute('maxlength')) {
								this.value = this.value.substr(0, this.getAttribute('maxlength'));
								alert ('Texto muito longo!');
								return false;
							}
							document.getElementById(this.name+'_len').innerHTML = this.value.length+'&nbsp;caracteres. (máx: '+this.getAttribute('maxlength')+')';
						}
					}
				}
				if (maskStr == 'data'){
					frmObj.onblur = function(){
						CheckDate(this);
					}
				}
				if (maskStr == 'tel'){
					maskVlr = '(__)____-____';
					frmObj.onblur = function(){
						maskOut(this, maskVlr);
					}
					frmObj.onfocus = function(){
						maskIn(this, maskVlr);
					}
					if (frmObj.value == '') frmObj.value = maskVlr;
				}
			}
		}

	}
}

function getKey(e){
	if(!e) {
		if(window.event) {
			e = window.event;
		} else {
			//total failure, we have no way of referencing the event
			return;
		}
	}
	/*
	if (BrowserDetect.browser == 'Explorer'){
		k = e.keyCode;
	} else if (BrowserDetect.browser != 'Explorer'){
		k = e.which;
	}
	*/
	var k = window.event ? event.keyCode : e.which;
	//var k = (window.event) ? window.event.keyCode : e.which;
	if (k == 9 || k == 8 || k == 13){
		return 'pass';
	} else {
		return k;
	}
}


///////////////////////////////////////////
// validar CPF
///////////////////////////////////////////

function validaCPF(CPF){
	erro = new String;
	if (CPF.length < 14) erro = "É necessário preencher corretamente o número do CPF! (xxx.xxx.xxx-xx)";
	if ((CPF.charAt(3) != ".") || (CPF.charAt(7) != ".") || (CPF.charAt(11) != "-")){
		if (erro.length == 0) erro = "É necessário preencher corretamente o número do CPF! (xxx.xxx.xxx-xx)";
	}
	if(document.layers && parseInt(navigator.appVersion) == 4){
		x = CPF.substring(0,2);
		x += CPF.substring (4,6);
		x += CPF.substring (8,10);
		x += CPF.substring (12,13);
		CPF = x;
	} else {
		CPF = CPF.replace ('.','');
		CPF = CPF.replace ('.','');
		CPF = CPF.replace ('-','');
	}
	if (CPF.length > 0){
		if (CPF.length != 11 || CPF == "00000000000" || CPF == "11111111111" ||
			CPF == "22222222222" ||	CPF == "33333333333" || CPF == "44444444444" ||
			CPF == "55555555555" || CPF == "66666666666" || CPF == "77777777777" ||
			CPF == "88888888888" || CPF == "99999999999"){
			erro = "CPF Inv&#6953;do!";
		}

		soma = 0;
		for (cpx=0; cpx < 9; cpx ++)
			soma += parseInt(CPF.charAt(cpx)) * (10 - cpx);
		resto = 11 - (soma % 11);
		if (resto == 10 || resto == 11)
			resto = 0;
		if (resto != parseInt(CPF.charAt(9))){
			erro = "CPF Inv&#6953;do!";
		}

		soma = 0;
		for (cpx = 0; cpx < 10; cpx ++)
			soma += parseInt(CPF.charAt(cpx)) * (11 - cpx);
		resto = 11 - (soma % 11);

		if (resto == 10 || resto == 11)
			resto = 0;

		if (resto != parseInt(CPF.charAt(10))){
			erro = "CPF Inválido!";
		}
		if (erro.length > 0){
			return (erro);
		}
		return '';
	}
}

///////////////////////////////////////////
// validar CNPJ
///////////////////////////////////////////

function validaCNPJ(CNPJ) {
	erro = new String;
	if (CNPJ.length < 18) erro = "É necessário  preencher corretamente o número do CNPJ! (xx.xxx.xxx/xxxx-xx)";
	if ((CNPJ.charAt(2) != ".") || (CNPJ.charAt(6) != ".") || (CNPJ.charAt(10) != "/") || (CNPJ.charAt(15) != "-")){
		if (erro.length == 0) erro = "É necessário  preencher corretamente número do CNPJ! (xx.xxx.xxx/xxxx-xx)";
	}
	if(document.layers && parseInt(navigator.appVersion) == 4){
		x = CNPJ.substring(0,2);
		x += CNPJ. substring (3,6);
		x += CNPJ. substring (7,10);
		x += CNPJ. substring (11,15);
		x += CNPJ. substring (16,18);
		CNPJ = x;
	} else {
		CNPJ = CNPJ. replace (".","");
		CNPJ = CNPJ. replace (".","");
		CNPJ = CNPJ. replace ("-","");
		CNPJ = CNPJ. replace ("/","");
	}
	var nonNumbers = /\D/;
	if (nonNumbers.test(CNPJ)) erro = "A verificação de CNPJ suporta apenas números!";
	var a = [];
	var b = new Number;
	var c = [6,5,4,3,2,9,8,7,6,5,4,3,2];
	for (cpj=0; cpj<12; cpj++){
		a[cpj] = CNPJ.charAt(cpj);
		b += a[cpj] * c[cpj+1];
	}
	if ((x = b % 11) < 2) { a[12] = 0 } else { a[12] = 11-x }
	b = 0;
	for (y=0; y<13; y++) {
		b += (a[y] * c[y]);
	}
	if ((x = b % 11) < 2) { a[13] = 0; } else { a[13] = 11-x; }
	if ((CNPJ.charAt(12) != a[12]) || (CNPJ.charAt(13) != a[13])){
		erro ="CNPJ Inválido!";
	}
	if (erro.length > 0){
		return (erro)
	}
	return '';
}

function CheckDate(dtaDate){
	if (dtaDate.value == "" ){
		return false;
	}
	var err=0;
	dtaValue=dtaDate.value;
	if (dtaValue.length != 8 && dtaValue.length != 10 ) err=1
	mm = dtaValue.substring(3, 5);
	dd = dtaValue.substring(0, 2);
	yy = dtaValue.substring(6, 10);
	if (mm<1 || mm>12) err = 1
	if (dd<1 || dd>31) err = 1
	if (yy.length == 4){
		if (yy<1900) err = 1
	} else {
		//se ano for inferior a 30 se entende 20??
		//se for maior que 29 se entende 19??
		yy=parseInt(yy,10)
		yy += yy<30?2000:1900
	}
	if (mm==4 || mm==6 || mm==9 || mm==11){
		if (dd==31) err=1
	}
	if (mm==2){
		var dtaYear=parseInt(yy/4);
		if (isNaN(dtaYear)) {
			err=1;
		}
		if (dd>29) err=1
		if (dd==29 && ((yy/4)!=parseInt(yy/4))) err=1
	}
	dtaDate.value = dd + '/' + mm + '/' + yy

	if (err==1) {
		if (dtaValue.length < 8){
			dtaDate.value = "";
		} else {
			alert(dtaDate.value + ' é uma data inválida !');
			dtaDate.value = "";
			dtaDate.focus();
			return false;
		}
	}
	return true;
}

var mask = {
	numero: {
		format: '',
		valida: '0123456789'
	},
	inteiro: {
		format: '',
		valida: '-+0123456789',
		regex: /^[-+]?\d*$/
	},
	decimal: {
		format: '',
		valida: '-0123456789,'
	},
	money: {
		format: '',
		valida: '-0123456789,.'
	},
	texto1: {
		format: '',
		valida: 'aáàâãbcçdeéèêfghiíìjklmnoóòõôpqrstuúùüvwxyz0123456789_-()[]{}:/|\.,;+=@*%$#!?&ºª '
	},
	login: {
		format: '',
		valida: 'abcdefghijklmnopqrstuvwxyz0123456789_'
    },
	permalink: {
		format: '',
		valida: 'abcdefghijklmnopqrstuvwxyz0123456789_'
	},
	email: {
		format: '',
		valida: 'abcdefghijklmnopqrstuvwxyz0123456789_.@-',
		regex:  /^[0-9a-zA-Z_.-]+@[0-9a-zA-Z]+[\.]{1}[0-9a-zA-Z]+[\.]?[0-9a-zA-Z]+$/
	},
	memo1: {
		format: '',
		valida: ''
	},
	cep: {
		format: '     -   ',
		valida: '0123456789',
		regex: /[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9]/
	},
	data_iso: {
		format: '    -  -  ',
		valida: '0123456789',
		regex:  /\d/
	},
	data: {
		format: '  /  /    ',
		valida: '0123456789',
		regex: /^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/
	},
	cpf: {
		format: '   .   .   -  ',
		valida: '0123456789'
	},
	cnpj: {
		format: '  .   .   /    -  ',
		valida: '0123456789'
	},
	hora: {
		format: '  :  :  ',
		regex:  /^(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9])(:([0-5]?[0-9]))?$/,
		valida: '0123456789'
	},
  hora2: {
	 format: '  :  ',
	 regex:  /^(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9])?$/,
	 valida: '0123456789'
  },
	tel: {
		format: '(  )    -    ',
		valida: '0123456789'
	},
	visa: {
		format: '    -    -    -    ',
		valida: '0123456789'
	}
}

function maskIn(cpo, mskStr){
	if (cpo.value == mskStr){
		cpo.value = '';
	}
}
function maskOut(cpo, mskStr){
	if (cpo.value == ''){
		cpo.value = mskStr;
	}
}
