/*
    Nome .......: formValida.js
    Por ........: 
	Em .........: Dezembro / 2001
	Alt ........: 
	Descricao ..: Funcao para consistencia de dados em um formulario

	Funcao .....: CheckTxt(txtField,type,Msg,Max)
                  CheckSelect(selField,Msg)
                  CheckSelectM(selField,Max,Msg)
                  CheckRadio(radField,Msg)
                  CheckCBox(cbField,Msg)

	Parametros .: txtField ....: Nome do campo do formulario
                  selField
				  radField
				  cbField

                  type ........: Tipo de validacao que devera ser feita
				               :    * .......: nao permite valor em branco 
                               :    E-mail ..: tipo e-mail
							   :    Data ....: consistencia de data valida
							   :    Número ..: valida a entrada de numero
							   :    Min .....: numero minimo de caracter permitido para o campo
							   :    Max .....: numero maximo de caracter permitido para o campo

				  Msg .........: Mensagem que sera enviada ao usuario

				  Max .........: Número máximo de opcoes a serem escolhidas

	Uso ........: CheckTxt(theform.txt_Codigo,'Numero','Codigo',8,10)
                  CheckSelect(theform.txt_Codigo,'Codigo')
                  CheckSelectM(theform.txt_Codigo,7,'Codigo')
                  CheckRadio(theform.txt_Codigo,'Codigo')
                  CheckCBox(theform.txt_Codigo,'Codigo')

*/

function CheckTxt(txtField,type,Msg,Min,Max){
	type = type.toUpperCase();

	if(!Msg)
		Msg = txtField.name;

	if(txtField.value == '') {
		alert('Digite um valor para o campo '+Msg+'!');
		txtField.focus();
		return false;
	}

	if (Max != null) {
		if (txtField.value.length > Max) {
			alert('Número máximo de caracteres permitido é '+Max);
			txtField.focus();
			return false;
		}
	}

	if (Min != null) {
		if (txtField.value.length < Min) {
			alert('Número minimo de caracteres permitido é '+Min);
			txtField.focus();
			return false;
		}
	}

	switch (type) {
		case 'EMAIL':
			if(txtField.value.indexOf('@') == -1 || txtField.value.indexOf('.') == -1){
				alert('Digite um endereço de e-mail válido!');
				txtField.focus();
				return false;
			}
			break;
		case 'DATA':
			with(txtField){
				// Verifica se a entrada do usuário está no formato correto: DD/MM/AAAA:

/*
				if ( (value.charAt(2) != '/' || value.charAt(5) != '/' || value.length < 10) {
					alert('Formato de data inválida!\nFormato correto: DD/MM/AAAA!');
					txtField.focus();
					return false;
				}
*/

				// Verifica se o dia, mês e ano são número e se todos são válidos.
				var Dia,Mes,Ano,MsgDataInvalida,MsgAnoInvalido;

				MsgAnoInvalido = '\nInforme um valor para o Ano entre 1900 e 2079!';
				MsgDataInvalida = '\nDigite uma data no formato DD/MM/AAAA!';

				if (value.charCodeAt(0) == 48)	
					Dia = parseInt(value.substring(1,2));
				else
					Dia = parseInt(value.substring(0,2));
				
				if (value.charCodeAt(3) == 48)
					Mes = parseInt(value.substring(4,5));
				else
					Mes = parseInt(value.substring(3,5));
				
				Ano = parseInt(value.substring(6));

				if (Dia < 1 || Dia > 31 || isNaN(Dia)){ // Dia não é válido.
					if (Msg == '')
						Msg = 'Dia inválido para a data informada!';
					else
						Msg = 'Dia inválido para o campo ' + Msg.toUpperCase() + '!';
					
					alert(Msg);
					txtField.focus();
					return false;
				}
				if (Mes < 1 || Mes > 12 || isNaN(Mes)){ // Mês não é válido.
					if (Msg == '')
						Msg = 'Mês inválido para a data informada!';
					else
						Msg = 'Mês inválido para o campo ' + Msg.toUpperCase() + '!';
					
					alert(Msg);
					txtField.focus();
					return false;
				}
				if (Ano < 1900 || Ano > 2079 || isNaN(Ano)){ // Ano não é válido
					if (Msg == '')
						Msg = 'Ano inválido para a data informada!';
					else
						Msg = 'Ano inválido para o campo ' + Msg.toUpperCase() + '!';
					
					Msg = Msg + MsgAnoInvalido;
					alert(Msg);
					txtField.focus();
					return false;
				}
				/*
					Entra aqui uma rotina para calcular se o ano é bissexto.
					Com isso, valido o número de dias para o mês de fevereiro.
				*/
				var AnoBiss = 0;
				if ((Ano%4 == 0 && Ano%100 != 0) || Ano%400 == 0)
					AnoBiss = 1;
				else
					AnoBiss = 0;
				if ((Mes == 2 && AnoBiss == 1 && Dia > 29) || (Mes == 2 && AnoBiss == 0 && Dia > 28)){
					if (Msg == '')
						Msg = 'A data digitada é inválida!';
					else
						Msg = 'Data inválida digitada no campo ' + Msg.toUpperCase() + '!';
					Msg = Msg + MsgDataInvalida;

					alert(Msg);
					txtField.focus();
					return false;
				}
				// Verifica o número de dias para os meses que têm apenas 30 dias:
				if ((Mes == 4 || Mes == 6 || Mes == 9 || Mes == 11) && Dia > 30){
					if (Msg == '')
						Msg = 'A data digitada é inválida!';
					else
						Msg = 'Data inválida digitada no campo ' + Msg.toUpperCase() + '!';
					Msg = Msg + MsgDataInvalida;

					alert(Msg);
					txtField.focus();
					return false;
				}
			}
			break;
		
		
		case 'HHMM':
			with(txtField){
				var Horas, Minutos;
				
				Horas   = parseInt(value.substring(0,2));
				Minutos = parseInt(value.substring(3,5));

				if (Horas < 0 || Horas > 24){ // Hora inválida.
					alert('Hora inválida. Informe um valor entre 0 e 24!');
					txtField.focus();
					return false;
				}
				if (Minutos < 0 || Minutos > 59){ // Minuto inválido.
					alert('Minuto inválido. Informe um valor entre 0 e 59!');
					txtField.focus();
					return false;
				}
				if (value == "24:59"){ // Minuto inválido.
					alert('Hora Inválida!');
					txtField.focus();
					return false;
				}
			}
			break;
		
		
		case 'NUMERO':
			var valido = "1234567890,.-/";
			var vsub;
			var ind;

            for (ind=0 ; ind < txtField.value.length ; ind++) {
                vsub=txtField.value.substring(ind,ind+1);
                if (valido.indexOf(vsub) == "-1") {
                    alert("Número digitado inválido.");
					txtField.focus();
					return false;
                }
            }

			if(isNaN(parseInt(txtField.value))){
				alert('Digite um número inteiro para o campo '+Msg+'!');
				txtField.focus();
				return false;
				/*
				Para testar se o número é real:
				if(isNaN(parseFloat(txtField.value))){
				alert('Digite um número real para este campo!');
				*/
			}
			break;
		default:
			;
	}
	return true;
}
function CheckSelect(selField,Msg){
	if(!Msg)
		Msg = selField.name;
	var objSel = selField;
	if (objSel.selectedIndex == 0){ // O valor aqui deve ser 0, pois o navegador já seleciona o primeiro ítem por default.
		alert('Selecione uma opção para o campo '+Msg+'!');
		objSel.focus();
		return false;
	}
	else
		return true;
	
}
function CheckSelectM(selField,Max,Msg){
	if(!Msg)
		Msg = selField.name;
	var nSelec = 0;
	var objSel = selField;
	for(var i=0;i<objSel.length;i++){
		if (objSel.options[i].selected)
			nSelec++;
	}
	
	if (nSelec > Max) {
		alert('Você deve selecionar no máximo ' + Max + ' opções!');
		objSel.focus();
		return false;	
	}
	if (objSel.selectedIndex == -1){
		alert('Você deve selecionar pelo menos uma opção no campo '+Msg+'!');
		objSel.focus();
		return false;
	}
	else
		return true;
}
function CheckRadio(radField,Msg){
	if(!Msg)
		Msg = radField.name;
	var nSelec = 0;
	var objRadioGrp = radField;
	if(objRadioGrp.checked)
		return true;
	for(var i=0;i<objRadioGrp.length;i++)
		if (objRadioGrp[i].checked)
			nSelec++;
	if (nSelec == 0){
		alert('Selecione uma opção para o campo '+Msg+'!');
//		objRadioGrp[0].focus();
		return false;
	}
	else
		return true;
}
/*
O código a seguir mostra várias formas de se manipular um coleção de valores
de caixas de seleção (checkbox). Para dois ou mais campos do tipo checkbox 
tornarem-se uma coleção, basta configurar a propriedade 'name' de ambos com o mesmo
valor. A partir daí, seus elementos podem ser acessados atrvés de um laço 'for' com 
'flag' na propriedade 'length' da coleção, que retorna o número de seus elementos.
Um página ASP pode acessar diretamente uma coleção de caixas, usando-se um laço do tipo:
For Each sValue In Request.Form("sName")
	...
	Comandos
	...
Next
Onde sValue é o valor da propriedade "value" do campo checkbox e SName o
valor da propriedade "name".		
*/
function CheckCBox(cbField,Msg){
	if(!Msg)
		Msg = cbField.name;
	// Variável para contar o número de caixas selecionadas:
	var nSelec = 0;
	// Atribui os campos 'cb_option' do formulário atual à variável objCheckBox,
	// que passa a ser um 'Array' de todas caixas de seleção com o nome 'cb_option':
	var objCheckBox = cbField;
	// Looping pelos campos armazenados na variável objCheckBox:
	for(var i=0;i<objCheckBox.length;i++)
		if (objCheckBox[i].checked) // Testou se o campo atual foi selecionado.
			nSelec++; // Incrementou o contador de caixas selecionadas.				
	if (nSelec == 0){ // Nenhuma caixa foi selecionada.
		alert('Você deve selecionar uma opção para o campo '+Msg+'!');
		objCheckBox[0].focus;
		return false;
	}
	else {
		return true;
	}
}
