
var isNetscape, isMicrosoft;

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 verificatexto(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;
}


function vMoedaGeral(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 ((campo.charCodeAt(0)<48) || (campo.charCodeAt(0)>57))
    return "18";

  if (contador>1)
    return "18";
  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.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 "18";
  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 "18";
  else {
    if (contador!=0){
      if(campo.charAt(campo.length-3) != '.')
	return "19";
      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  ((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 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 "1";
  if ((isNaN(ano)) || (isNaN(mes)) || (isNaN(dia)) || (dia.length!=2))
    return "1";
  if (mes.length!=2)
    return "1";
  if ((mes>12)||(mes<1))
    return "1";
  else{ 
    if (!ValidDate(dia-0,mes-0,ano))
      return "1";
  }
}

//Verifica se a data introduzida é uma data válida
function vMesAno (data) {
  datum = data.split("/");
  mes = datum[0];
  ano = datum[1];
  if (mes.length!=2)
    return "2";
  if (ano.length!=2)
    return "2";
  if ((isNaN(ano)) || (isNaN(mes)))
    return "2";
  if ((mes>12)||(mes<1))    
    return "2";
  if (ano<0)
    return "2";
}



//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))
    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(".");
  
  if (j < i)
    j = email.indexOf(".",i);
  
  if ((i==-1) || (j==-1) || i < 1 || (j<i+2))
    return "22";
  var z = email.indexOf("@",i+1);
  if (z != -1)
    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";
     //alert(mensagem);
     //return false;  
  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";
  //alert(mensagem);
  //return false;
}

// 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           - '+label+': deve ser do tipo data (AAAA/MM/DD) ';
    return true;
  case "2":
    erros+= '\n           - '+label+': o formato data deve ser (MM/AA) ';
    return true;
  case "4":
    erros+= '\n           - '+label+': deverá ser numérico (Ex: 123) ';
    return true;
  case "5":
    erros+= '\n           - '+label+': deverá ter como minimo: '+ min;
    return true;
  case "6":
    erros+= '\n           - '+label+': deverá ter como máximo: '+ max;
    return true;
  case "9":
    erros+= '\n           - '+label+': número caracteres mínimos: '+min;
    return true;
  case "10":
    erros+= '\n           - '+label+': número caracteres máximos: '+max;
    return true;
  case "11":
    erros+= '\n           - '+label+': o valor tem que ser positivo ';
    return true;
  case "12":
    erros+= '\n           - '+label+': o formato do tipo Taxa deve ser (XX%) ';
    return true;
  case "15":
    erros+= '\n           - '+label+': as duas casas decimais devem ser zeros (Ex: 99.00) ';
    return true;
  case "16":
    erros+= '\n           - '+label+': só deverá ter um separador decimal (Ex: 99.00) ';
    return true;
  case "17":
    erros+= '\n           - '+label+': deverá  ser composto por duas casas decimais (Ex: 99.00) ';
    return true;
  case "18":
    erros+= '\n           - '+label+': o formato deve ser (Ex: 99.00) ';
    return true;
  case "19":
    erros+= '\n           - '+label+': deverá ter duas casas decimais (Ex: 99.99) ';
    return true;
  case "20":
    erros+= '\n           - '+label+': o formato hora deve ser (HH:MM) ';
    return true;
  case "21":
    erros+= '\n           - '+label+': o formato hora deve ser (HH:MM:SS) ';
    return true;  
  case "22":
    erros+= '\n           - '+label+': o formato deve ser do tipo Email ';
    return true;  
  case "23":
    erros+= '\n           - '+label+': nº Contribuinte inválido ';
    return true;
  default: 
    return false;    
  }
  
}



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 (verificatexto(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 (verificatexto(campo)){
		campos_vazios += "\n           ---> " + aValida[j].label;
		if (flagPrimeiroErro == 0){
		  flagPrimeiroErro = 1;
		  campoPrimeiroErro = e.name;
		}
	      }
	    }
	  }
	}
	
	if(!verificatexto(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;
	      }    
	    }
	    break;
	  case "Date" :
	    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 "MesAno" :
	    if (erro(vMesAno(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" :
	    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(vNumero(campo),aValida[j].label,aValida[j].min,aValida[j].max)){
		if (flagPrimeiroErro == 0){
		  flagPrimeiroErro = 1;
		  campoPrimeiroErro = e.name;
		}
	      }
	      break;
	    }
	  case "MoneyGeral" :
	    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(vMoedaGeral(campo),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;
	      }
	    }
	    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;
	      }
	    }
	  }
	}
      }
    }
  }

  // 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 (flagConfirma==1){
      if (!confirma())
	return false;
      return true;
    }
    else
      return true;
  }
  
  msg  = "______________________________________________________\n\n";
  msg += 'Por favor, carregue em OK e verifique a informação submetida.\n';
  msg += "______________________________________________________\n\n"
    
  if (campos_vazios)
    msg += ' - São de preenchimento obrigatório os seguintes campos:' + campos_vazios + '\n';
  if (erros)
    msg += '\n - Os seguintes campos encontram-se mal formatados:\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 (verificatexto(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 (verificatexto(campo)){
			      campos_vazios += "\n           --->" + aValida[0].label;
				  if (flagPrimeiroErro == 0){
		  				flagPrimeiroErro = 1;
		  				campoPrimeiroErro = e.name;
						}
	      		  }
	    	  }
	  }
	}

    if(!verificatexto(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 (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" :
	  		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(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;
  }
  
  /*if (erro(vData(valor),descricao,"",""))
  {   
    if (isMicrosoft){
      alert(erros);
      campo.focus();
    }
    erros="";
    } */ 
}

//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 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 += 'Por favor, carregue em OK e verifique a informação submetida.\n';
  msg += "______________________________________________________\n\n";
  msg += ' - O intervalo da DataInicio e DataFim está incorrecto';
  alert(msg);
  }
 return flag;
	
}


//acrescentado por Pedro Fardilha em 2001-06-07
function desenhaImagem(imagem, larguraMax) {
	theImage = new Image();
	theImage.src = imagem;
	nomeFx=imagem.substring(imagem.lastIndexOf("/")+1)
	var extensao = "";


	if (imagem != null || !imagem == "")
	{
		extensao = imagem.substring(imagem.length-3, imagem.length);
	}


	if (extensao == "swf") {
	document.write('<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" width="50" Height ="30">');
	document.write('<param name=movie value="'+imagem+'"><param name=quality value=High>');
	document.write('  <PARAM NAME=menu VALUE=0>');
	document.write('  <param name="_cx" value="24236">');
	document.write('  <param name="_cy" value="16484">');
	document.write('  <param name="FlashVars" value="-1">');
	document.write('  <param name="Src" value="'+imagem+'">');
	document.write('  <param name="WMode" value="Window">');
	document.write('  <param name="Play" value="-1">');
	document.write('  <param name="Loop" value="-1">');
	document.write('  <param name="SAlign" value>');
	document.write('  <param name="Base" value>');
	document.write('  <param name="Scale" value="ShowAll">');
	document.write('  <param name="DeviceFont" value="0">');
	document.write('  <param name="EmbedMovie" value="0">');
	document.write('  <param name="BGColor" value>');
	document.write('  <param name="SWRemote" value>');
	document.write('  <embed src="'+imagem+'" quality=high pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="60" Height ="40"></embed>');
	document.write('</object>');
	}
	else if (extensao == "ipx") {
	document.write('<OBJECT 	ID="IpixX1" 	WIDTH="400" 	HEIGHT="220" 	CLASSID="CLSID:11260943-421B-11D0-8EAC-0000C07D88CF" 	CODEBASE="http://www.ipix.com/download.html">');
	document.write('	<PARAM 		VALUE="'+imagem+'" 		NAME="IPXFILENAME">');
	document.write('	<EMBED 		SRC="/imagens/'+imagem+'" 		WIDTH="400" 		HEIGHT="220" 		PLUGINURL="http://www.ipix.com/cgi-bin/download.cgi"		PALETTE="foreground" 		BORDER="0">');
	document.write('	<NOEMBED>');
	document.write('			You need Netscape Navigator or Internet Explorer 3 or higher with IPIX-plugin.');
	document.write('	</NOEMBED>');
	document.write('</OBJECT>');
	} 
	// e' uma imagem ou outra coisa
	else {
	document.write('<img src="'+imagem+'" border=0 alt="Clique para aceder ao detalhe da imagem:\n'+nomeFx+'">');
	}

	
	if (theImage.width>larguraMax){
		document.images[document.images.length-1].width=larguraMax
	}
}

//acrescentado por Pedro Fardilha em 2001-06-07
function desenhaImagemId(id, imagem, larguraMax) {
	theImage = new Image();
	theImage.src = imagem;
	nomeFx=imagem.substring(imagem.lastIndexOf("/")+1)

	document.write('<img id="'+id+'" name="'+id+'" src="'+imagem+'" border=0 alt="Clique para aceder ao detalhe da imagem:\n'+nomeFx+'">');
	if (theImage.width>larguraMax){
		document.images[document.images.length-1].width=larguraMax
	}
}


//acrescentado por Rita Fontes em 2001-07-06
function chamaPesquisa(){	
	codTecla=(document.all)?event.keyCode:evento.which;
//	alert (codTecla)				
	if (codTecla==13)	pesquisa();
	return true;
}	
			
			

