/* Verificar os campos de um formulario, procura nos elementos do form passado como parametro	
			  por uma tag: validarInfo com uma das seguintes configuracoes:
					""(não definida): O campo não e validado
					"Texto a mostrar": O texto será mostrado caso a validacao do tipo 0 (se campo vazio) falhar
					"tipoValidacao,Texto a mostrar": O texto será mostrado se o tipo de validacao especificado falhar
					"tipoValidacao,Texto a mostrar,tipoValidacao2" tipoValidacao=5, tipoValidacao2 e a validacao a efectuar 
					aos elementos, ver definicoes dos tipos de validacao
					"tipoValidacao,Texto a mostrar,tipoValidacao2,tag,idContentor" tipoValidacao=6, tipoValidacao2 e a validacao a efectuar 
					aos elementos, ver definicoes dos tipos de validacao
					
					Tipos de validacao podem ser acrescentados no codigo: 
						switch(tipoValidacao){
						...
							case N:
								break;
						}
					
					Estao definidos os seguintes tipos de validação:
						0 -Testar se o objecto está vazio	
						1 -Testar se o valor é numerico
						2 -Testar se o valor é um email válido
						3 -Testar o valor 0 (considerado indefinido)
						4 -Testar chckbox ou radio
						5 -Testar objs com o mesmo nome, so colocar a tag validarInfo num dos objectos, preferencialmente o primeiro,
						pelo menos um dos objectos tem de ser validado
						6 -Igual a 5 so que em vez do nome verifica todos os objectos com a tag passada
			 */
function verificarCamposForm(objForm){
//			alert('0msg');
	//Array de mensagens descritivas do problema, indexadas pelo tipo de validacao
	var msgsDescProb=new Array('está vazio', 'tem que conter um número', 'tem que conter um endereço de email válido',
														 'está indefinido', 'tem de estar seleccionado', 
														 'pelo menos um dos elementos tem de estar preenchido',
														 'pelo menos um dos elementos tem de estar preenchido');
	var msgAlerta='Ocorreram os seguintes problemas:\n';
	//As mensagens com textoValidacao e msgDescProb indexada ao tipo de validacao escolhido
	var msgAlertaProbs='';
				//alert('0_5msg');
					//alert('1msg'+objForm.length);

	for (i = 0; i < objForm.length; i++){
		var objFormElem=objForm.elements[i];
		var objFormElemAttribs=objFormElem.attributes['validarInfo'];
		if(objFormElemAttribs){
			//O atributo validarInfo está definido
			var valores=objFormElemAttribs.value.split(',');
			switch(valores.length){
				case 0:
					//O valor de validarInfo está definido mas vazio
					alert('Objecto: '+objForm.elements[i].name+' com validarInfo definida, mas vazia');
					return false;
					break;
				case 1:
					//O valor de validarInfo apenas contem o texto, neste caso irá usar-se o tipo de validacao 0
					var tipoValidacao=0;
					var textoValidacao=valores[0];
					break;
				case 2:
					//O valor de validarInfo contem o tipo de validacao e o texto
					var tipoValidacao=valores[0];
					var textoValidacao=valores[1];
					break;	
				case 3:
					//O valor de validarInfo contem o tipo de validacao e o texto e a valdacao secundaria pra o caso do tipo validacao 4
					var tipoValidacao=valores[0];
					var textoValidacao=valores[1];
					var tipoValidacao2=valores[2];
					break;		
				case 5:
					//O valor de validarInfo contem o tipo de validacao e o texto e a valdacao secundaria pra o caso do tipo validacao 4
					var tipoValidacao=valores[0];
					var textoValidacao=valores[1];
					var tipoValidacao2=valores[2];
					var tagAValidar=valores[3];
					var idContentorAValidar=valores[4];
					break;			
			}

			//Testar os elementos por tipo de validação
			var validacaoFalhou=false;
			//Testar o valor do objecto através do algoritmo definido atraves do tipo de validacao
			switch(parseInt(tipoValidacao)){
				case 5:	
					validacaoFalhou=true;
					var objsMesmoNome=document.getElementsByName(objFormElem.name);
					for (i2 = 0; i2 < objsMesmoNome.length; i2++)
						if(!validacaoFalhouCamposFormValidarElemento(objsMesmoNome[i2], tipoValidacao2)){
							validacaoFalhou=false;	
							break;
						}
					break;	
				case 6:	
					validacaoFalhou=true;
					var objsMesmoNome=document.getElementById(idContentorAValidar).getElementsByTagName(tagAValidar);
					for (i2 = 0; i2 < objsMesmoNome.length; i2++)
						if(!validacaoFalhouCamposFormValidarElemento(objsMesmoNome[i2], tipoValidacao2)){
							validacaoFalhou=false;	
							break;
						}
					break;		
				default:
					validacaoFalhou=validacaoFalhouCamposFormValidarElemento(objFormElem, tipoValidacao);
			}
			//Se a validação falhou, acrescentar mais uma mensagem com o texto identificativo do objecto e descricao do erro
			if(validacaoFalhou)
				msgAlertaProbs=msgAlertaProbs+textoValidacao+' '+msgsDescProb[parseInt(tipoValidacao)]+'\n';
		}	
	}
	if(msgAlertaProbs!=''){
		alert(msgAlerta+msgAlertaProbs);
		return false;
	}
	return true;
}

function validacaoFalhouCamposFormValidarElemento(objFormElem, tipoValidacao){
	var	validacaoFalhou=false;
	switch(parseInt(tipoValidacao)){
		case 0:
			//Verificar se está vazio
			if(objFormElem.value=='')
				validacaoFalhou=true;
			break;
		case 1:
			//Verificar se é valor numérico
			if(!is_NaN(objFormElem.value))
				validacaoFalhou=true;
			break;
		case 2:	
			//Verificar se é email válido
			emailRE = new RegExp("^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$");
			if(!emailRE.test(objFormElem.value))
				validacaoFalhou=true;
			break;	
		case 3:	
			if(objFormElem.value==0)
				validacaoFalhou=true;
			break;
		case 4:	
			if(objFormElem.checked==false)
				validacaoFalhou=true;
			break;	
	}
	//Se o objecto esta disabled, retuornar sempre validacao com sucesso, de forma a ignorar os elementos nesse estado
	return validacaoFalhou && !objFormElem.disabled;
}