// Cria várias funções para auxiliar a validação de formulários
Util = {};

// Valida email, retorna false em caso de erro
Util.validar_email = function (str) {
	return Boolean(str.match(/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/));
};

// Valida CPF, retorna false em caso de erro
// Se formatar for true retorna o CPF formatado em caso de sucesso
Util.validar_cpf = function (str, formatar) {
	// Pega somente os dígitos
	var copia = str.replace(/[^0-9]/g, "");
	
	// Verifica o número de dígitos
	if (copia.length != 11) {
		return false;
	}
	
	// Valida o primeiro dígito verificador
	if (copia.charAt(9) != ((10*(10*copia.charAt(0)+9*copia.charAt(1)+8*copia.charAt(2)+7*copia.charAt(3)+6*copia.charAt(4)+5*copia.charAt(5)+4*copia.charAt(6)+3*copia.charAt(7)+2*copia.charAt(8)))%11)%10) {
		return false;
	}
	
	// Valida o segundo dígito verificador
	if (copia.charAt(10) != ((10*(11*copia.charAt(0)+10*copia.charAt(1)+9*copia.charAt(2)+8*copia.charAt(3)+7*copia.charAt(4)+6*copia.charAt(5)+5*copia.charAt(6)+4*copia.charAt(7)+3*copia.charAt(8)+2*copia.charAt(9)))%11)%10) {
		return false;
	}
	
	// Formata
	if (formatar) {
		return copia.substr(0, 3)+"."+copia.substr(3, 3)+"."+copia.substr(6, 3)+"-"+copia.substr(9, 2);
	}
	
	return true;
};

// Valida CNPJ, retorna false em caso de erro
// Se formatar for true retorna o CNPJ formatado em caso de sucesso
Util.validar_cnpj = function (str, formatar) {
	// Pega somente os dígitos
	var copia = str.replace(/[^0-9]/g, "");
	
	// Verifica o número de dígitos
	if (copia.length != 14) {
		return false;
	}
	
	// Valida o primeiro dígito verificador
	if (copia.charAt(12) != ((10*(5*copia.charAt(0)+4*copia.charAt(1)+3*copia.charAt(2)+2*copia.charAt(3)+9*copia.charAt(4)+8*copia.charAt(5)+7*copia.charAt(6)+6*copia.charAt(7)+5*copia.charAt(8)+4*copia.charAt(9)+3*copia.charAt(10)+2*copia.charAt(11)))%11)%10) {
		return false;
	}
	
	// Valida o segundo dígito verificador
	if (copia.charAt(13) != ((10*(6*copia.charAt(0)+5*copia.charAt(1)+4*copia.charAt(2)+3*copia.charAt(3)+2*copia.charAt(4)+9*copia.charAt(5)+8*copia.charAt(6)+7*copia.charAt(7)+6*copia.charAt(8)+5*copia.charAt(9)+4*copia.charAt(10)+3*copia.charAt(11)+2*copia.charAt(12)))%11)%10) {
		return false;
	}
	
	// Formata
	if (formatar) {
		return copia.substr(0, 2)+"."+copia.substr(2, 3)+"."+copia.substr(5, 3)+"/"+copia.substr(8, 4)+"-"+copia.substr(12, 2);
	}
	
	return true;
};

// Valida telefone, retorna false em caso de erro
// Se formatar for true retorna o telefone formatado em caso de sucesso
Util.validar_tel = function (str, formatar) {
	// Pega somente os dígitos
	var copia = str.replace(/[^0-9]/g, "");
	
	// Verifica o número de dígitos
	if (copia.length != 10) {
		return false;
	}
	
	// Formata
	if (formatar) {
		return "("+copia.substr(0, 2)+") "+copia.substr(2, 4)+"-"+copia.substr(6, 4);
	}
	
	return true;
};

// Valida CEP, retorna false em caso de erro
// Se formatar for true retorna o CEP formatado em caso de sucesso
Util.validar_cep = function (str, formatar) {
	// Pega somente os dígitos
	var copia = str.replace(/[^0-9]/g, "");
	
	// Verifica o número de dígitos
	if (copia.length != 8) {
		return false;
	}
	
	// Formata
	if (formatar) {
		return copia.substr(0, 5)+"-"+copia.substr(5, 3);
	}
	
	return true;
};

// Valida o preenchimento, retorna false em caso de erro
Util.validar_preenchido = function (str) {
	return str != "";
};

// Valida os campos do formulário com as condições dadas
// campos é uma Array em que cada elemento é uma outra Array com três posições: [id_campo, funcao, args]
// funcao é a função que será executada (o valor do campo será enviado como um argumento)
// Ela deve retornar false caso o valor seja inválido. Caso seja válido ela pode retornar true ou uma String para mudar o valor do campo
// args é um segundo argumento que será enviado para a função (opcional)
// Para saber quais campos falharam na validação acesse a propriedade Util.erros que é uma Array com os ids dos campos incorretos
// Se alertar for true (padrão) a função irá alertar o usuário sobre qual campo está errado (usando alert e focus)
// Se completo for false (padrão), quando um campo falhar na validação o processo pára. Caso seja true ele será executado por completo
Util.validar_form = function (campos, alertar, completo) {
	var i, retorno, valido = true;
	Util.erros = [];
	
	for (i in campos) {
		if (campos.hasOwnProperty(i)) {
			retorno = campos[i][1](document.getElementById(campos[i][0]).value, campos[i][2]);
			if (retorno === false) {
				Util.erros.push(campos[i][0]);
				if (completo) {
					valido = false;
				} else {
					if (alertar === undefined || alertar) {
						alert("Campo "+Util.erros[0]+" inválido");
						document.getElementById(Util.erros[0]).select();
					}
					return false;
				}
			} else if (retorno !== true) {
				document.getElementById(campos[i][0]).value = retorno;
			}
		}
	}
	
	if (!valido && (alertar === undefined || alertar)) {
		alert("Campo "+Util.erros[0]+" inválido");
		document.getElementById(Util.erros[0]).select();
	}
	return valido;
};

// Cria uma nova conexão e envia os dados pedidos
// A resposta do servidor será enviada para a função desejada
// Os parâmetros metodo, dados e timeout são opcionais
// dados é uma string da forma nome=valor&nome2=valor2
// timeout indica o tempo máximo de espera em segundos (padrão: 30)
// Zero significa sem limite
Util.ajax = function (url, funcao, dados, metodo, timeout) {
	// Prepara os parâmetros
	metodo = metodo ? metodo.toUpperCase() : "GET";
	dados = dados ? dados : "";
	timeout = timeout===undefined ? 30 : timeout;
	
	// Prepara a url
	if (metodo == "GET" && dados != "") {
		url = url+(url.indexOf("?")==-1 ? "?" : "&")+dados;
		dados = "";
	}
	
	// Cria o objeto
	var ajax = new XMLHttpRequest();
	ajax.funcao = funcao;
	ajax.open(metodo, url, true);
	ajax.onreadystatechange = function () {
		if (this.readyState == 4) {
			clearInterval(this.intervalo);
			if (this.status == 200) {
				this.funcao.call(null, this.responseText);
			} else {
				alert("Erro na conexão");
			}
		}
	};
	
	// Cria o timeout
	ajax.timeout = function () {
		ajax.onreadystatechange = null;
		this.abort();
		alert("Erro na conexão");
	};
	if (timeout) {
		ajax.intervalo = setTimeout(function () {ajax.timeout();}, timeout*1000);
	}
	
	// Envia o pedido
	if (metodo == "POST") {
		ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		ajax.send(dados);
	} else {
		ajax.send();
	}
};

// Pega um parâmetro GET enviado
// Retorna "" caso não esteja definido
Util.GET = function (nome) {
	// Pega a string toda e quebra em partes
	var search = window.location.search;
	var pares = (search.charAt(0)=="?" ? search.substr(1) : search).replace(/&amp;/g, "&").split("&");
	var i;
	
	for (i in pares) {
		if (pares.hasOwnProperty(i)) {
			pares[i] = pares[i].split("=");
			if (pares[i][0] == nome) {
				return pares[i][1];
			}
		}
	}
	
	return "";
};
