
var isNetscape, isMicrosoft;

n = (document.layers) ? 1:0
ie = (document.all) ? 1:0


if (parseInt(navigator.appVersion.charAt(0)) >= 4) {
  isNetscape = (navigator.appName == "Netscape") ? true : false;
  isMicrosoft = (navigator.appName.indexOf("Microsoft") != -1) ? true : false;
}

var msg;
var campos_vazios = "";
var erros = "";
var daysofmonth   = new makeArray(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var daysofmonthLY = new makeArray(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var monthsofyear  = new makeArray(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
var today = new Date();
var year = today.getYear();
var month = today.getMonth()+1;
var day = today.getDate();
var flagConfirma = 0;
var campoData = false;
function makeArray() {
  this[0] = makeArray.arguments.length;
  for (i = 0; i<makeArray.arguments.length; i++)
    this[i+1] = makeArray.arguments[i];
}

//Array global de conversor de caracteres

compara = new Array("?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?"," ","!","\"","?","$","%","&","'","(",")","*","+","\,","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","[","\\","]","?","_","?","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?"," ","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","A","A","A","A","A","A","?","C","E","E","E","E","I","I","I","I","?","?","O","O","O","O","O","?","?","U","U","U","U","?","?","?","a","a","a","a","a","a","?","c","e","e","e","e","i","i","i","i","?","?","o","o","o","o","o","÷","?","u","u","u","u","?","?","?","?");
inicializa=0;


// Função que converte todos os caracteres especiais

function converte(campo,nome,j){
  result="";
  tamanho=campo.length;

  for(i=0;i<tamanho;i++) {
    codigo=campo.charCodeAt(i);
    if (codigo<0 || codigo>255)
      codigo = 256;
    if (compara[codigo] != campo.charAt(i) && flagConfirma == 0){ // Nuno - adicionei flagConfirma == 0
      flagConfirma=1;
    }
    result+=compara[codigo];
  }
  document.forms[0].elements[j].value=result;
}


// Janela de confirmação dos dados a enviar

function confirma() {
  if (confirm("Os dados introduzidos continham caracteres Inválidos! \n\n           Foi efectuada conversão automática\n\n                 Confirma esta operação "))
    return true;
  return false;
}


// Atribui propriedades ao objecto valida

function ObjectoValida(parametro,label,tipo,obrigatorio,min,max,dependencia){
  this.parametro = parametro;
  this.label = label;
  this.tipo = tipo;
  this.obrigatorio = obrigatorio;
  this.min = min;
  this.max = max;
  this.dependencia = dependencia;
}

//Verifica se o ano é bissexto

function bissexto(year) {
  if ((year/4)   != Math.floor(year/4))
    return false;
  if ((year/100) != Math.floor(year/100))
    return true;
  if ((year/400) != Math.floor(year/400))
    return false;
  return true;
}

function ValidDate(day,month,year) {
  if ((bissexto(year) && (day>daysofmonthLY[month])) || (!bissexto(year) && (day>daysofmonth[month]))) {
    return false;
  }
  else{
    return true;
  }
}


//Devolve o ultimo dia de cada mes

function UltimoDia(ano,mes) {
  if (bissexto(ano))
    return(daysofmonthLY[mes]);
  else
    return(daysofmonth[mes]);
}


// Captura pelo codigo ASCII se a tecla premida é diferente de Enter ou " ",incrementa o contador
// Verifica o tamanho do contador, se for zero devolve true senão devolve falso

function texto(campo) {
  tamanho= campo.length;
  temp=0;

  for (i=0,j=0;i<tamanho;i++) {
    if ((campo.charCodeAt(i)!=10) && (campo.charCodeAt(i)!=13) && (campo.charCodeAt(i)!=32) ){
      temp[j]+=campo[i];
      j++;
    }
  }

  if (j == 0)
    return true;
  else
    return false;
}


// Verifica se o numero introduzido é um valor positivo
function positivo(campo) {
  if  (parseInt(campo) > 0)
    return "11";
  else
    return "0";
}


//Retira os espaços do valor passado
function tiraEspacos(campo){
  tamanho= campo.length;
  result = "";
  for (i=0;i<tamanho;i++) {
    if (campo.charCodeAt(i)!=32)
      result+=campo.charAt(i);
  }
  return result;
}


//Verifica se o campo introduzido é um campo numerico positivo e permite a inserção de pontos
// Serve para todos os dados do tipo integer
//Exemplo 99.99 - 2 casas decimais

function vMoeda(campo) {
  campo=tiraEspacos(campo);
  contador=0;
  for (i=0;i<campo.length;i++) {
    if (campo.charCodeAt(i)==46)
      contador++;
    if (((campo.charCodeAt(i)<48) || (campo.charCodeAt(i)>57)) && (campo.charCodeAt(i)!=46))
      return "18";
  }

  if (contador>1)
    return "16";
  else {
    if (contador!=0){
      if(campo.charAt(campo.length-3)!='.')
	return "19";
    }
  }
  return "0";
}

//Verifica se o campo introduzido é um campo numerico positivo e permite a inserção de pontos
// Serve para todos os dados do tipo integer
//Exemplo 99.00 - 2 casas decimais a 0

function vMoedaPTE(campo) {
  campo=tiraEspacos(campo);
  contador=0;
  for (i=0;i<campo.length;i++) {
    if (campo.charCodeAt(i)==46)
      contador++;
    if (((campo.charCodeAt(i)<48) || (campo.charCodeAt(i)>57)) && (campo.charCodeAt(i)!=46))
      return "18";
  }

  if (contador>1)
    return "16";
  else {
    if (contador!=0){
      if(campo.charAt(campo.length-3) != '.')
	return "17";
      else {
	if ((campo.charAt(campo.length-2)!='0') || (campo.charAt(campo.length-1)!='0'))
	  return "15";
      }
    }
  }
  return "0";
}


//Verifica se o campo introduzido é um campo numerico positivo
// Serve para todos os dados do tipo number

function vNumero(campo) {
  campo=tiraEspacos(campo);
  for (i=0;i<campo.length;i++) {
  	if ((campo.charCodeAt(i)<48) || (campo.charCodeAt(i)>57))
      return "4";
  }
  return "0";
}


// Verifica se o campo introduzido é do tipo taxa
function vTaxa(campo){
  for (i=0;i<campo.length;i++) {
    if (((campo.charCodeAt(i)<48) || (campo.charCodeAt(i)>57)) && (campo.charCodeAt(i)!=46) && (campo.charCodeAt(i)!=37))
      return "12";
  }
  return "0";
}

//Verifica se o tamanho passado por parametro se encontra correcto
function comprimento (campo,min,max,rows,columns) {
  tamanho= campo.length-1;
  linhas=1;
  j=0;

  for (i=0;i<tamanho;i++) {
    if (campo.charCodeAt(i)==10) {
      linhas++;
      j=i+2;
    }
    else {
      if (i-j>=columns){
	linhas++;
	j=i+2;
      }
    }
  }

  /*  if (linhas>rows)
      return "13";*/

  if  ((parseInt(min)!= null) || (parseInt(max)!= null)){
    if (campo.length < parseInt(min))
      return "9";
    if (campo.length > parseInt(max))
      return "10";
  }
  return "0";
}

//Verifica se o campo introduzido se encontra dentro dos parametros definidos como minimo e máximo
function limite (campo,min,max){
  if (!isNaN(campo)){
    if (min!= "") {
      if (parseInt(campo) < parseInt(min))
	return "5";
    }
    if (max!= ""){
      if (parseInt(campo) > parseInt(max))
	return "6";
    }
  }
  else
    return "4";
}



//Verifica se o campo introduzido se encontra dentro dos parametros definidos como minimo e máximo
function limite1 (campo,min,max){
  if (!isNaN(campo)){
    if (min!= "") {
      if (parseFloat(campo) < parseFloat(min))
	return "5";
    }
    if (max!= ""){
      if (parseFloat(campo) > parseFloat(max))
	return "6";
    }
  }
  else
    return "4";
}

//Verifica se a data introduzida é uma data válida
function vData (data) {
  datum = data.split("/");
  ano = datum[0];
  mes = datum[1];
  dia = datum[2];

  if (ano.length!=4)
    return "8";
  if ((isNaN(ano)) || (isNaN(mes)) || (isNaN(dia)) || (dia.length!=2))
    return "1";
  if (mes.length!=2)
    return "14";
  if ((mes>12)||(mes<1))
    return "2";
  if (dia < 1) return "25";
  else{
    if (!ValidDate(dia-0,mes-0,ano))
      return "3";
  }
  return "0";
}

//Verifica se o campo do tipo data introduzido se encontra dentro dos parametros definidos como minimo e máximo
function limiteData (data,min,max)
{
	//valida 1º se o campo esta bem introduzido
	if ((numero = vData(data)) != "0")
		return numero; //data mal introduzida
	
	//passa a data do formato AAAA/MM/DD para o formato AAAAMMDD de modo a fazer
	//comparacoes directas como se fosse um inteiro
	datum = data.split("/");
  	dataInt = parseInt(""+datum[0]+datum[1]+datum[2]);
  	
	//validacao interna dos outros campos ainda
    if ((min!= "") && (vData(min)=="0"))
    {
    	datum = min.split("/");
    	dataMin = parseInt(""+datum[0]+datum[1]+datum[2]);
      	if (dataInt < dataMin)
			return "5";
    }
    
    if ((max!= "") && (vData(max)=="0"))
    {
    	datum = max.split("/");
    	dataMax = parseInt(""+datum[0]+datum[1]+datum[2]);
      	if (dataInt > dataMax)
			return "6";
    }
}

//verifica se a hora introduzida e valida (HH:MM)
function vTime4 (tempo) {
  horaum = tempo.split(":");
  hora = horaum[0];
  minuto = horaum[1];
  if ((tempo.length != 5) || (isNaN(hora)) || (isNaN(minuto)) || (hora.length != 2) || (minuto.length != 2)
  || (hora > 23) || (minuto > 59))		//ESTA ULTIMA LINHA FOI ACRESCENTADA POR BRUNO F.
    return "20";
}

//verifica se a hora introduzida e valida (HH:MM:SS)
function vTime6 (tempo) {
  horaum = tempo.split(":");
  hora = horaum[0];
  minuto = horaum[1];
  segundo = horaum[2];

  if ((tempo.length != 8) || (isNaN(hora)) || (isNaN(minuto)) || (isNaN(segundo)) || (hora.length != 2) || (minuto.length != 2) || (segundo.length != 2))
    return "21";
}


//verifica se o email introduzido e invalido (T@T.T)
function vEmail(email){
  var i = email.indexOf("@");
  var j = email.indexOf(".",i+2);
  if ((i==-1) || (j==-1) || i < 1 || (email.length<j+2) || (j<i+2))
    return "22";
}

//verifica se o nº contribuinte e correcto
function vContribuinte(contribuinte){
  //  var mensagem="Número Fiscal inválido.";
  //var str=objecto.value;
  var reg=/[0-9]+/;

  if (contribuinte.length<9 || !reg.test(contribuinte) || contribuinte=="000000000" || contribuinte=="123456789") // validar número.
     return "23";

  produto=0;
  j=8;
  for (i=1; i<10; i++){
    produto+=contribuinte.substring(j,j+1)*i;
    j--;
  }
  resto=produto%11;
  if(resto==0 || (resto==1 && contribuinte.substring(8,9)==0))
    return true;
  else
    return "23";

}

var invalidChars = new Array("<", ">", "\'", "\"");
function charInvalido(str){
	for(var z=0; z < invalidChars.length; z++) {
		if(str.indexOf(invalidChars[z])!=-1){
			//if(e.type != "hidden")
				//alert('Uso de caracter inválido: ' + invalidChars[z]);
			return "26";
		}
	}
	return true;
}

// Esta função apanha o codigo do erro e dispara a mensagem respectiva

function erro(numero,label,min,max,rows) {

  switch(numero) {
  case "1":
    erros+= "\n           ---> O campo "+label+" deverá ser do tipo data (AAAA/MM/DD).";
    return true;
  case "2":
    erros+= "\n           ---> campo "+label+"- Mês inválido";
    return true;
  case "3":
    erros+= "\n           ---> campo "+label+"- Dia Inválido, mês com "+UltimoDia(ano,mes-0)+" dias (AAAA/MM/DD).\n";
    return true;
  case "4":
    erros+= "\n           ---> O campo " + label + " deverá ser numerico (Ex: 123)";
    return true;
  case "5":
    erros+= "\n           ---> O campo " + label + " deverá ser maior ou igual a " + min  ;
    return true;
  case "6":
    erros+= "\n           ---> O campo " + label + " deverá ser menor ou igual a " + max;
    return true;
  case "7":
    erros+= "\n           ---> O campo " + label + " deverá ser maior que " + min + " e menor que " + max;
    return true;
  case "8":
    erros+= "\n           ---> O campo " + label + " tem o ano mal formatado (AAAA/MM/DD)";
    return true;
  case "9":
    erros+= "\n           ---> O campo " + label + " deverá ter mais que " + min + " caracteres";
    return true;
  case "10":
    erros+= "\n           ---> O campo " + label + " deverá ter menos que " + max + " caracteres";
    return true;
  case "11":
    erros+= "\n           ---> O campo " + label + " deverá assumir um valor positivo";
    return true;
  case "12":
    erros+= "\n           ---> O campo " + label + " deverá ser do tipo taxa";
    return true;
  case "13":
    erros+= "\n           ---> O campo " + label + " não deverá ter mais de "+rows+" linhas";
    return true;
  case "14":
    erros+= "\n           ---> campo "+label+"- O mês deverá ser formatado com dois digitos (AAAA/MM/DD)";
    return true;
  case "15":
    erros+= "\n           ---> O campo " + label + " deverá ser composto com as casas decimais a zeros (Ex: 99.00)";
    return true;
  case "16":
    erros+= "\n           ---> O campo " + label + " só deverá ter um separador decimal (Ex: 99.00)";
    return true;
  case "17":
    erros+= "\n           ---> O campo " + label + " deverá  ser composto por duas casas decimais (Ex: 99.00)";
    return true;
  case "18":
    erros+= "\n           ---> O campo " + label + "  deverá ser do tipo moeda (Ex: 99.00)";
    return true;
  case "19":
    erros+= "\n           ---> O campo " + label + " deverá  ser composto por duas casas decimais (Ex: 99.99)";
    return true;
  case "20":
    erros+= "\n           ---> O campo " + label + " deverá ser uma Hora válida e do tipo (HH:MM).";
    return true;
  case "21":
    erros+= "\n           ---> O campo " + label + " deverá ser do tipo Hora (HH:MM:SS).";
    return true;
  case "22":
    erros+= "\n           ---> O campo " + label + " deverá ser do tipo Email.";
    return true;
  case "23":
    erros+= "\n           ---> O campo " + label + " deverá ser um nº contribuinte válido.";
    return true;
  case "24":
    erros+= "\n           ---> O campo " + label + " deverá ser um intervalo válido.";
    return true;
  case "25":
    erros+= "\n           ---> O campo " + label + "- Dia Inválido, tem que ser > 0";
    return true;
  case "26":
    erros+= "\n           ---> O campo " + label + " contém caracteres inválidos: " + invalidChars;
    return true;
  default:
    return false;
  }

}

//****************************************************
function confirmaEnvio(form) {
	 existeOk=false;
   objecto = eval("document." + form);
	 // Verifica existencia de objectos 'OK'
   for (var i = 0; i < objecto.length; i++)
	  {
		   var e = objecto.elements[i];
       if (e.name=="OK")
		      existeOk=true;
    }

	  // Impede que seja feito o 'OK' mais do que uma vez
    if (existeOk==true)
        document.all.OK.disabled=true;
    return true;
}

//****************************************************


function verificaForm(form,aValida,conversao) {

  // Percorre todos os elementos do form  e verifica se são obrigatorios ou se existem dependencias
  // Se forem, então valida se estão vazios e se estão bem formatados
  // Se não, verifica se estão bem formatados
  // Converte todos os caracteres e retorna verdadeiro

  flagConfirma = 0; //inicializacao flagConfirma
  flagPrimeiroErro = 0;
  campoPrimeiroErro = "";

  for (var i = 0; i < eval("document." + form + ".length"); i++) {
    var e = eval("document." + form + ".elements[i]");
    for (var j = 0; j < aValida.length; j++) {
      if (e.name==aValida[j].parametro) {
	var campo=e.value;
	if (aValida[j].obrigatorio!="") {
	  //Primeiro verifica se o campo está vazio
	  if (texto(campo)){
	    campos_vazios += "\n           --->" + aValida[j].label;
	    if (flagPrimeiroErro == 0){
	      flagPrimeiroErro = 1;
	      campoPrimeiroErro = e.name;
	    }
	  }
	}
	//Vai verificar se existem dependencias
	else{
	  if(aValida[j].dependencia!="") {
	    depende=aValida[j].dependencia;
	    if (eval("document."+ form + "." +depende+".value")!="") {
	      if (texto(campo)){
		campos_vazios += "\n           --->" + aValida[j].label;
		if (flagPrimeiroErro == 0){
		  flagPrimeiroErro = 1;
		  campoPrimeiroErro = e.name;
		}
	      }
	    }
	  }
	}

      if(!texto(campo)){
	switch(aValida[j].tipo) {
	case "String" :
	  if (erro(comprimento(campo,aValida[j].min,aValida[j].max,e.rows,e.columns),aValida[j].label,aValida[j].min,aValida[j].max,e.rows)){
	      if (flagPrimeiroErro == 0){
	        flagPrimeiroErro = 1;
		campoPrimeiroErro = e.name;
	      }
	  }
	  if(erro(charInvalido(campo),aValida[j].label,aValida[j].min,aValida[j].max,e.rows)) {
	      if (flagPrimeiroErro == 0){
			flagPrimeiroErro = 1;
			campoPrimeiroErro = e.name;
	      }
	  }
	  break;
	case "Date" :
		if ((aValida[j].min != "") || (aValida[j].max != ""))
		{
	    	if (erro(limiteData(campo,aValida[j].min,aValida[j].max),aValida[j].label,aValida[j].min,aValida[j].max))
	    	{
	      		if (flagPrimeiroErro == 0)
	      		{
					flagPrimeiroErro = 1;
					campoPrimeiroErro = e.name;
					campoData = true;
	      		}
	      	}
	    }
	    else
	    {
			if (erro(vData(campo),aValida[j].label,aValida[j].min,aValida[j].max))
			{
		  		if (flagPrimeiroErro == 0)
		  		{
		    		flagPrimeiroErro = 1;
		    		campoPrimeiroErro = e.name;
					campoData = true;
		  		}
			}
	  	}
		break;
	case "tax" :
	  if (erro(vTaxa(campo),aValida[j].label,aValida[j].min,aValida[j].max)){
	    if (flagPrimeiroErro == 0){
	      flagPrimeiroErro = 1;
	      campoPrimeiroErro = e.name;
	    }
	  }
	  break;
	case "Number" :
	  localError = false;
	  if ((aValida[j].min != "") || (aValida[j].max != "")){
	    if (erro(limite(campo,aValida[j].min,aValida[j].max),aValida[j].label,aValida[j].min,aValida[j].max)){
	      if (flagPrimeiroErro == 0){
			flagPrimeiroErro = 1;
			campoPrimeiroErro = e.name;
	      }
	      localError = true;
	    }
	  }
	  if (!localError)
	  {
      	if (erro(vNumero(campo),aValida[j].label,aValida[j].min,aValida[j].max)){
		  if (flagPrimeiroErro == 0){
		    flagPrimeiroErro = 1;
			campoPrimeiroErro = e.name;
		  }
		}
	  }
	  break;
	  
	case "Number1" :

	    if (erro(limite1(campo,aValida[j].min,aValida[j].max),aValida[j].label,aValida[j].min,aValida[j].max)){
	      if (flagPrimeiroErro == 0){
		flagPrimeiroErro = 1;
		campoPrimeiroErro = e.name;
	      }
	    }
	    break;


	  
	  
	case "Money" :
	  if ((aValida[j].min != "") || (aValida[j].max != "")){
	    if (erro(limite(campo,aValida[j].min,aValida[j].max),aValida[j].label,aValida[j].min,aValida[j].max)){
	      if (flagPrimeiroErro == 0){
		flagPrimeiroErro = 1;
		campoPrimeiroErro = e.name;
	      }
	    }
	    break;
	  }
	  else {
	    if (erro(vMoeda(campo),aValida[j].label,aValida[j].min,aValida[j].max)){
	      if (flagPrimeiroErro == 0){
		flagPrimeiroErro = 1;
		campoPrimeiroErro = e.name;
	      }
	    }
	    break;
	  }
	case "MoneyPTE" :
	  if ((aValida[j].min != "") || (aValida[j].max != "")){
	    if (erro(limite(campo,aValida[j].min,aValida[j].max),aValida[j].label,aValida[j].min,aValida[j].max)){
	      if (flagPrimeiroErro == 0){
		flagPrimeiroErro = 1;
		campoPrimeiroErro = e.name;
	      }
	    }
	    break;
	  }
	  else {
	    if (erro(vMoedaPTE(campo),aValida[j].label,aValida[j].min,aValida[j].max)){
	      if (flagPrimeiroErro == 0){
		flagPrimeiroErro = 1;
		campoPrimeiroErro = e.name;
	      }
	    }
	    break;
	  }
	case "Time4" :
	  if (erro(vTime4(campo),aValida[j].label,aValida[j].min,aValida[j].max)){
	    if (flagPrimeiroErro == 0){
	      flagPrimeiroErro = 1;
	      campoPrimeiroErro = e.name;
	    }
	  }
	  break;
	case "Time6" :
	  if (erro(vTime6(campo),aValida[j].label,aValida[j].min,aValida[j].max)){
	    if (flagPrimeiroErro == 0){
	      flagPrimeiroErro = 1;
	      campoPrimeiroErro = e.name;
	    }
	  }
	  break;
	case "Email" :
	  if (erro(vEmail(campo),aValida[j].label,aValida[j].min,aValida[j].max)){
	    if (flagPrimeiroErro == 0){
	      flagPrimeiroErro = 1;
	      campoPrimeiroErro = e.name;
	    }
	  }
	  if(erro(charInvalido(campo),aValida[j].label,aValida[j].min,aValida[j].max,e.rows)) {
	      if (flagPrimeiroErro == 0){
			flagPrimeiroErro = 1;
			campoPrimeiroErro = e.name;
	      }
	  }
	  break;
	case "Contribuinte" :
	  if (erro(vContribuinte(campo),aValida[j].label,aValida[j].min,aValida[j].max)){
	    if (flagPrimeiroErro == 0){
	      flagPrimeiroErro = 1;
	      campoPrimeiroErro = e.name;
	    }
	  }
	  break;
	default :
	  if (erro(comprimento(campo,aValida[j].min,aValida[j].max,e.rows,e.columns),aValida[j].label,aValida[j].min,aValida[j].max,e.rows)){
	    if (flagPrimeiroErro == 0){
	      flagPrimeiroErro = 1;
	      campoPrimeiroErro = e.name;
	    }
	  }
	  if(erro(charInvalido(campo),aValida[j].label,aValida[j].min,aValida[j].max,e.rows)) {
	      if (flagPrimeiroErro == 0){
			flagPrimeiroErro = 1;
			campoPrimeiroErro = e.name;
	      }
	  }
	}
      }
      }
    }
  }

  // Se ocorrer erros, dispara mensagens e retorna falso ao fazer submit,senão retorna verdadeiro
  if (!campos_vazios && !erros) {
    for (var i = 0; i < eval("document." + form + ".length"); i++) {
      var e = eval("document." + form + ".elements[" + i + "]");

      //if (conversao == true)
      //  converte(e.value,e.name,i);
  	  if (conversao == true)
		if (e.type!="select-one"){
			//converte(e.options[e.selectedIndex].value,e.name,i);
			converte(e.value,e.name,i);
		}
    }
    if (flagConfirma==1){
      if (!confirma())
	      return false;
        confirmaEnvio(form);
        return true;
    }
    else{
      confirmaEnvio(form);
      return true;
    }
  }

  msg  = "______________________________________________________\n\n";
  msg += "Os dados não foram submetidos devido ao(s) seguinte(s) erro(s).\n";
  msg += "Por favor, carregue em OK e corrija o(s) seguinte(s) erro(s).\n";
  msg += "______________________________________________________\n\n"

  if (campos_vazios)
    msg += " - É de preenchimento obrigatório o(s) seguinte(s) campos:" + campos_vazios + "\n";
  if (erros)
    msg += "\n - O(s) seguinte(s) campo(s) encontra(m)-se mal formatado(s):\n";

  msg += erros;
  alert(msg);
  msg = "";
  campos_vazios = "";
  erros = "";

  //faz o focus do campo em que ocorreu o primeiro erro
   if (campoPrimeiroErro!=""){
		if (campoData==false) eval("document." + form + "." + campoPrimeiroErro + ".focus()");
		campoData=false
   }

  return false;
}


function verificaCampoACampo(campo,form,aValida,conversao) {

  // Verifica cada campo de uma form, se são obrigatorios ou se existem dependencias
  // Se forem, então valida se estão vazios e se estão bem formatados
  // Se não, verifica se estão bem formatados
  // Converte todos os caracteres e retorna verdadeiro

  flagConfirma = 0; //inicializacao flagConfirma
  flagPrimeiroErro = 0;
  campoPrimeiroErro = "";

    var e = eval("document." + form + "." + campo);
    if (e.name==aValida[0].parametro) {
		var campo=e.value;
		if (aValida[0].obrigatorio!="") {
	  	//Primeiro verifica se o campo está vazio
	  		if (texto(campo)){
	    	campos_vazios += "\n           --->" + aValida[0].label;
	    	if (flagPrimeiroErro == 0){
	      			flagPrimeiroErro = 1;
	      			campoPrimeiroErro = e.name;
	    			}
	  		}
		}
		//Vai verificar se existem dependencias
	else{
	  if(aValida[0].dependencia!="") {
	    depende=aValida[0].dependencia;
	    if (eval("document."+ form + "." +depende+".value")!="") {
		      if (texto(campo)){
			      campos_vazios += "\n           --->" + aValida[0].label;
				  if (flagPrimeiroErro == 0){
		  				flagPrimeiroErro = 1;
		  				campoPrimeiroErro = e.name;
						}
	      		  }
	    	  }
	  }
	}

    if(!texto(campo)){
		switch(aValida[0].tipo) {
		case "String" :
	 		 if (erro(comprimento(campo,aValida[0].min,aValida[0].max,e.rows,e.columns),aValida[0].label,aValida[0].min,aValida[0].max,e.rows)){
	      		if (flagPrimeiroErro == 0){
	        		flagPrimeiroErro = 1;
					campoPrimeiroErro = e.name;
	      			}
	  			}
	  	break;
		case "Date" :
	  		if ((aValida[0].min != "") || (aValida[0].max != ""))
	  		{
	    		if (erro(limiteData(campo,aValida[0].min,aValida[0].max),aValida[0].label,aValida[0].min,aValida[0].max))
	    		{
	      			if (flagPrimeiroErro == 0)
	      			{
						flagPrimeiroErro = 1;
						campoPrimeiroErro = e.name;
						campoData=true;
	      			}
	    		}
	  		}
	  		else
	  		{
	    		if (erro(vData(campo),aValida[0].label,aValida[0].min,aValida[0].max))
	    		{
	      			if (flagPrimeiroErro == 0)
	      			{
						flagPrimeiroErro = 1;
						campoPrimeiroErro = e.name;
						campoData=true;
	      			}
	    		}
	 	 	}
	  		break;
		case "tax" :
	  		if (erro(vTaxa(campo),aValida[0].label,aValida[0].min,aValida[0].max)){
	    		if (flagPrimeiroErro == 0){
	      			flagPrimeiroErro = 1;
	      			campoPrimeiroErro = e.name;
	    			}
	  			}
	  	break;
		case "Number" :
			localError = false;
	  		if ((aValida[0].min != "") || (aValida[0].max != ""))
	  		{
	    		if (erro(limite(campo,aValida[0].min,aValida[0].max),aValida[0].label,aValida[0].min,aValida[0].max))
	    		{
	      			if (flagPrimeiroErro == 0)
	      			{
						flagPrimeiroErro = 1;
						campoPrimeiroErro = e.name;
	      			}
	      			localError = true;
	    		}
	  		}
	  		if (!localError)
	  		{
	    		if (erro(vNumero(campo),aValida[0].label,aValida[0].min,aValida[0].max))
	    		{
	      			if (flagPrimeiroErro == 0)
	      			{
						flagPrimeiroErro = 1;
						campoPrimeiroErro = e.name;
	      			}
	    		}
	    	}
    		break;
		case "Money" :
	  		if ((aValida[0].min != "") || (aValida[0].max != "")){
	    		if (erro(limite(campo,aValida[0].min,aValida[0].max),aValida[0].label,aValida[0].min,aValida[0].max)){
	      			if (flagPrimeiroErro == 0){
						flagPrimeiroErro = 1;
						campoPrimeiroErro = e.name;
	      				}
	    			}
	   		 break;
	  		}
	  		else {
	    		if (erro(vMoeda(campo),aValida[0].label,aValida[0].min,aValida[0].max)){
	      			if (flagPrimeiroErro == 0){
						flagPrimeiroErro = 1;
						campoPrimeiroErro = e.name;
	      				}
	    			}
	    	break;
	  		}
		case "MoneyPTE" :
	  		if ((aValida[0].min != "") || (aValida[0].max != "")){
	    		if (erro(limite(campo,aValida[0].min,aValida[0].max),aValida[0].label,aValida[0].min,aValida[0].max)){
	      			if (flagPrimeiroErro == 0){
						flagPrimeiroErro = 1;
						campoPrimeiroErro = e.name;
	      				}
	    			}
	    	break;
	  		}
	  		else {
	    		if (erro(vMoedaPTE(campo),aValida[0].label,aValida[0].min,aValida[0].max)){
	      			if (flagPrimeiroErro == 0){
						flagPrimeiroErro = 1;
						campoPrimeiroErro = e.name;
	      				}
	    			}
	    	break;
	  		}
		case "Time4" :
	  		if (erro(vTime4(campo),aValida[0].label,aValida[0].min,aValida[0].max)){
	    		if (flagPrimeiroErro == 0){
	      			flagPrimeiroErro = 1;
	      			campoPrimeiroErro = e.name;
	    			}
	  			}
	  	break;
		case "Time6" :
	  		if (erro(vTime6(campo),aValida[0].label,aValida[0].min,aValida[0].max)){
	    		if (flagPrimeiroErro == 0){
	      			flagPrimeiroErro = 1;
	      			campoPrimeiroErro = e.name;
	    			}
	  			}
	  	break;
		case "Email" :
	  		if (erro(vEmail(campo),aValida[0].label,aValida[0].min,aValida[0].max)){
	    		if (flagPrimeiroErro == 0){
	      			flagPrimeiroErro = 1;
	      			campoPrimeiroErro = e.name;
	    			}
	  			}
	  	break;
		case "Contribuinte" :
	  		if (erro(vContribuinte(campo),aValida[0].label,aValida[0].min,aValida[0].max)){
	    		if (flagPrimeiroErro == 0){
	      			flagPrimeiroErro = 1;
	      			campoPrimeiroErro = e.name;
	    			}
	  			}
	  	break;
		default :
	  		if (erro(comprimento(campo,aValida[0].min,aValida[0].max,e.rows,e.columns),aValida[0].label,aValida[j].min,aValida[j].max,e.rows)){
	    		if (flagPrimeiroErro == 0){
	      			flagPrimeiroErro = 1;
	      			campoPrimeiroErro = e.name;
	    			}
	  			}
			}
      }
      }


  // Se ocorrer erros, dispara mensagens e retorna falso ao fazer submit,senão retorna verdadeiro
  if (!campos_vazios && !erros) {
      var e = eval("document." + form + ".elements[" + 0 + "]");
      if (conversao == true)
        converte(e.value,e.name,i);
      if (flagConfirma==1){
      if (!confirma())
	  return false;
      return true;
    }
    else
      return true;
  }

  msg  = "______________________________________________________\n\n";
  msg += "O campo não foi validado.\n";
  msg += "Por favor, carregue em OK e corrija o seguinte erro.\n";
  msg += "______________________________________________________\n\n"

  if (campos_vazios)
    msg += " - O Campo é de preenchimento obrigatório:" + campos_vazios + "\n";
  if (erros)
    msg += "\n - O campo encontra-se mal formatado:\n";

  msg += erros;
  alert(msg);
  msg = "";
  campos_vazios = "";
  erros = "";

  return false;
}



//poem os dois pontos no formato hh:mm ou hh:mm:ss conforme 0 campo vem com 4 ou 6 digitos.
//O campo no caso de ser hh:mm só deverá permitir 5 carateres no maxLength.

function preencheDoisPontos(campo,nome){
  result="";
  tamanho=campo.length;

  if ((tamanho==4 || tamanho==6) && !isNaN(campo)) {
    for(i=0; i<tamanho; i++) {
      if(i==2) {
	result=result.concat(':');
      } else if(i==4) {
	result=result.concat(':');
      }
      result=result.concat(campo.charAt(i));
    }
    nome.value=result;
  } else if(((tamanho==5 && !isNaN(campo.substring(0,2)) && !isNaN(campo.substring(3,5)) && campo.charAt(2)==':')
	     || (tamanho==8 && !isNaN(campo.substring(0,2)) && !isNaN(campo.substring(3,5)) && !isNaN(campo.substring(6,8)) && campo.charAt(2)==':' && campo.charAt(5)==':'))){

  } else if(tamanho==0) {} else {
    nome.focus();
  }

  //	Acrescentado 1999 09 09 I.S.
  tamanho=nome.value.length;
  if (tamanho!=0){
    if(!((tamanho==5 && parseInt(nome.value.substring(0,2))<= 23 && parseInt(nome.value.substring(3,5))<=59)
	 ||(tamanho==8 && parseInt(nome.value.substring(0,2))<= 23 && parseInt(nome.value.substring(3,5))<=59 && parseInt(nome.value.substring(6,8))<=59)))
      {
	nome.focus();
      }
  }
}

// Coloca as barras nas posições correctas em todos os campos do tipo data
// Esta função é chamada no evento onBlur
function formataData(campo, descricao, valor, separador){
  tem_barra=0;
  result="";
  tamanho=valor.length;

  if (tamanho==8 && !isNaN(valor)){
    for (i=0;i<tamanho;i++){
      if (i==4) {
	if (valor.charAt(i)==separador)
	  tem_barra=1;
	else
	  result=result.concat(separador);
      }
      else {
	if (tem_barra==0 && i==6)
	  result=result.concat(separador);
      }
      result=result.concat(valor.charAt(i));
    }
    campo.value=result;
    valor=result;
  }
}

//Formata o campo hora
function formataHora(obj){
	if(!isNaN(obj.value) && obj.value.length==4){
		obj.value=obj.value.substring(0,2)+":"+obj.value.substring(2,4);
	}
}

//funcao parametro de um link de uma tabela paginada (Gerador)
function parametro(descricao,valor){
  this.descricao = descricao;
  this.valor = valor;
}

//funcao que faz o submit da form atraves de um link de uma tabela paginada (Gerador)
function destino(nomeForm, aParametros){
  for (var i = 0; i < aParametros.length; i++) {
    eval("document." + nomeForm + "." + aParametros[i].descricao + ".value = " + aParametros[i].valor + ";");
  }
  eval("document." + nomeForm + ".submit();");
}


function maxLengthTab(campo,tab){
	// funcao que passa o focus para um determinado campo
	// após o preenchimento total do primeiro. iz-1999/08/20
	var x=null;
	var y=null;
	var bool1=false;
	var bool2=false;

	for(var i=0;i< document.forms[0].elements.length;i++){
		if(campo.toUpperCase()==document.forms[0].elements[i].name.toUpperCase()){
			x=document.forms[0].elements[i];
			bool1=true;
		}
		if(tab.toUpperCase()==document.forms[0].elements[i].name.toUpperCase()){
			y=document.forms[0].elements[i];
			bool2=true;
		}
		if(bool1 && bool2) break;
	}
	if(x.maxLength==x.value.length)
		y.focus();
}


function validaDatas(DataInicio,DataFim) {

//verifica se o intervalo de Datas é valido
//DataInicio<=DataFim

datum1 = DataInicio.split("/");
  ano1 = datum1[0];
  mes1 = datum1[1];
  dia1 = datum1[2];

datum2 = DataFim.split("/");
  ano2 = datum2[0];
  mes2 = datum2[1];
  dia2 = datum2[2];

if (ano1>ano2){
flag=true;
}
else {
	flag=false;
	if (ano1==ano2){
		if (mes1>mes2){
			flag=true;
			}
			else{
			if (mes1==mes2){
				if (dia1>dia2){
					flag=true;
					}
				}
			}
		}
	}
if (flag==true){
msg  = "______________________________________________________\n\n";
  msg += "Os dados não foram submetidos devido ao(s) seguinte(s) erro(s).\n";
  msg += "Por favor, carregue em OK e corrija o(s) seguinte(s) erro(s).\n";
  msg += "______________________________________________________\n\n"

    msg += " - O intervalo da DataInicio e DataFim está incorrecto";
  alert(msg);
  }
 return flag;

}

function validaNumero(evento){
codigoTecla=(ie)?evento.keyCode:evento.which;
if (codigoTecla<48 || codigoTecla>57){
	return false;
	}
}

function validaNumeroComVirgula(evento){
codigoTecla=(ie)?evento.keyCode:evento.which;
if (codigoTecla!=44 && (codigoTecla<48 || codigoTecla>57) ){
	return false;
	}
}

function validaNumeroComPonto(evento){
codigoTecla=(ie)?evento.keyCode:evento.which;
if (codigoTecla!=46 && (codigoTecla<48 || codigoTecla>57) ){
	return false;
	}
}

//Replace de todas ocorrencias de um caracter por outro na string dada
function replaceAll( str, from, to ) {
    var idx = str.indexOf( from );


    while ( idx > -1 ) {
        str = str.replace( from, to ); 
        idx = str.indexOf( from );
    }

    return str;
}

// Transforma um campo no formato #.##0,00 para um float
function toFloat(tfld) {
  	strTfld = replaceAll(tfld, '.', '');
  	return parseFloat("0" + strTfld.replace(',','.'));
}



function desenhaLinha(cor){
	linha="<table width='100%' cellpadding=0 cellspacing=0 border=0 bgcolor="+cor+">"
	+"<tr><td><img src=/images/s.gif width=1 height=2></td></tr>"
	+"</table>"
	document.write(linha);
}

function desenhaLinhaFina(cor){
	linha="<table width='100%' cellpadding=0 cellspacing=0 border=0 bgcolor="+cor+">"
	+"<tr><td><img src=/images/s.gif width=1 height=1></td></tr>"
	+"</table>"
	document.write(linha)
}

function validaNumeroLetra(evento){	
codigoTecla=(ie)?evento.keyCode:evento.which;
if (codigoTecla==13){
  pesquisaTitulos();
  return(false);
}
if ((codigoTecla<48 || codigoTecla>57) && (codigoTecla<97 || codigoTecla>122) && (codigoTecla<65 || codigoTecla>90)){ 
       return false;
}    
}