/*	Função para validação de formulários.		versão 1.1
	
	Está função tem o propósito de ajudar na tarefa de validações de formulários
	através de validações simples como verificar se campos Text são vazios e campos
	Select-one, Select-multiple , Radio , Checkbox foram selecionados.
	 
	Modo de uso:
		validaForm(formulario"nomecampo1:rotulocampo1", ... , "nomecampoN:rotulocampoN")

	Argumentos	
		formulario 	
		 	- o objeto formulário que se deseja validar e 
		 	não o nome do formulário
		 
		"nomecampoi:rotulocampoi"
			- uma string contendo o nome(identificador) do campo 
			seguido do simbolo ':' mais um rotulo para o campo, 
			que será exibido em uma mensagem de alerta para o usuário
	Retorno
		-1					- o campo esta vazio ou não foi selecionado
		-2					- um campo com o nome dado não foi encontrado
		-3					- o tipo do elemento passado não é conhecido
		1					- todos os campos foram preenchidos corretamente
*/

function validaForm()
{
	if(arguments.length == 0)
		return false;
		
	form = arguments[0];
	for(var i=1; i<arguments.length; i++) 
	{ 
		nome = nomeCampo(arguments[i]);
		campo = procuraCampo(form,nome);
		if(campo == null)
		{
			return -2;
		}
		else if(campo.type == "text" || campo.type == "textarea" || campo.type == "password")
		{	tipo = argCampo(arguments[i]);
			if(!validaText(campo,tipo))
			{
				msg(arguments[i]);
				campo.focus();
				return -1;
			}
		}
		else if(campo.type == "radio")
		{	if(!validaRadio(form,campo))
			{
				msg(arguments[i]);
				campo.focus();
				return -1;
			}
		}
		else if(campo.type == "checkbox")
		{	if(!validaCheckbox(form,campo))
			{
				msg(arguments[i]);
				campo.focus();
				return -1;
			}
		}
		else if(campo.type == "select-one")		
		{	arg = argCampo(arguments[i]);
			if(!validaSelect(campo,arg))
			{
				msg(arguments[i]);
				campo.focus();
				return -1;
			}
		}
		else if(campo.type == "select-multiple")
		{	if(!validaSelectMult(campo))
			{
				msg(arguments[i]);
				campo.focus();
				return -1;
			}
		}
		else
		{
			return -3;
		}
	}
	return 1;
}

function procuraCampo(form,nomeCampo)
{
	for(var i=0; i<form.elements.length; i++) 
		if(form.elements[i].name == nomeCampo)
			return form.elements[i];
	
	return null;
}

function validaText(campo,tipo)
{
	if(campo.value == "")
		return false;
	else
		switch (tipo) {
			case "num" :       	return validaNumero(campo.value);
			case "mail" :      	return validaMail(campo.value);
			default : 		return true;
		}
}

function validaRadio(form,campo)
{
	selecao = false;
	for(var i=0; i<form.elements.length; i++) 
		if(form.elements[i].name == campo.name)
			if(form.elements[i].checked)
				selecao = true;
				
	return selecao;
}

function validaCheckbox(form,campo)
{
	selecao = false;
	for(var i=0; i<form.elements.length; i++) 
		if(form.elements[i].name == campo.name)
			if(form.elements[i].checked)
				selecao = true;
				
	return selecao;
}

function validaSelect(campo,arg)
{
	if(arg == "dummy") {
		if(campo.selectedIndex == 0)
			return false;
		else if(campo.selectedIndex == -1)
			return false;
		else
			return true;
	}
	else if(campo.selectedIndex == -1)
		return false;
	else
		return true;
}

function validaSelectMult(campo)
{
	if(campo.selectedIndex == -1)
		return false;
	else
		return true;
}

function nomeCampo(arg)
{
	var campo = arg;
	separador = campo.indexOf(":");
	if (separador != -1)
		return campo.substring(0,separador);
	else
		return campo;
}

function rotuloCampo(arg)
{
	var campo = arg;
	separador1 = campo.indexOf(":");
	if (separador1 != -1) {
		separador2 = campo.lastIndexOf(":");
		if(separador1 != separador2)
			if(campo.substring(separador1+1,separador2) == "" )
				return nomeCampo(campo);
			else
				return campo.substring(separador1+1,separador2);
		else
			return campo.substring(separador+1);
	}
	else
		return nomeCampo(campo);
}

function argCampo(arg)
{
	var campo = arg;
	separador1 = campo.indexOf(":");
	if (separador1 != -1) {
		separador2 = campo.lastIndexOf(":");
		if(separador1 != separador2)
			return campo.substring(separador2+1);
		else
			return "";
	}
	else
		return "";
}

function msg(campo,arg)
{
	rotulo = rotuloCampo(campo);
	arg = argCampo(campo);
	switch (arg) {
			case "num" :       	alert("Preencha o campo "+rotulo+", somente com números"); break;
			case "mail" :      	alert("Preencha o campo "+rotulo+", com um email válido"); break;
			case "cgc" :     	alert("Preencha o campo "+rotulo+", com um cgc válido"); break;
			case "cpf" :      	alert("Preencha o campo"+rotulo+", com um cpf válido"); break;
			case "dummy":	alert("Preencha o campo "+rotulo+", selecione uma opção válida"); break;
			default : 		alert("Preencha o campo: "+rotulo); ;
		}
}

function validaMail(mail)
{	
	exp = /^\w+((-\w+)|(\.\w+))*\@\w+((\.|-)\w+)*\.\w+$/
     	return exp.test(mail);
}

function validaNumero(numero)
{
	for(i=0; (numero.indexOf(".")!=-1) ; i++)
		numero = numero.replace(".","");
		
	numero = numero.replace(",",".");

	return !isNaN(Number(numero));
}