
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 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;
}



// 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 "16";
  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);
	  
	var isvalideCharactersRegExp = /^(\d)+.(\d){2}$/;
	if(!isvalideCharactersRegExp.test(campo))
	{
		return "18";
	}

}




//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) && parseInt(min)==parseInt(max)){
    	return "8";
    }
    if (campo.length > parseInt(max) && parseInt(min)==parseInt(max)){
    	return "8";
    }
    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 limiteMoney (campo,min,max){
  if (!isNaN(campo)){
    if (min!= "") {
      if (parseInt(campo) < parseInt(min))
	return "5";
    }
    if (max!= ""){
      if (parseInt(campo) > parseInt(max))
	return "28";
    }
  }
  else
    return "4";
}


//Verifica se a data introduzida é uma data válida
function vData(data, min, max)
{
	// validar se valor está bem formatado
	if(data.length!=10
	|| data.charAt(0)<"0" || data.charAt(0)>"9"
	|| data.charAt(1)<"0" || data.charAt(1)>"9"
	|| data.charAt(2)<"0" || data.charAt(2)>"9"
	|| data.charAt(3)<"0" || data.charAt(3)>"9"
	|| data.charAt(4)!="-"
	|| data.charAt(5)<"0" || data.charAt(6)>"9"
	|| data.charAt(6)<"0" || data.charAt(7)>"9"
	|| data.charAt(7)!="-"
	|| data.charAt(8)<"0" || data.charAt(8)>"9"
	|| data.charAt(9)<"0" || data.charAt(9)>"9")
	{
		return "1";
	}

	var datum = data.split("-");
	dia = datum[2];
	var enteredDate = new Date(datum[0]+"/"+datum[1]+"/"+datum[2]);
	var minDateT = new Date("1753/01/01");
	var maxDateT = new Date("2079/12/31");
	var diffDate = new Date(datum[0],datum[1]-1,datum[2]);
	var diaDaData= enteredDate.getDate();
	if(diaDaData>0 && diaDaData<10)
	{
		diaDaData= "0"+diaDaData;
	}
	if((""+dia) != (""+diaDaData) || datum[1]<"0" || datum[1]>"12")
	{
		return "23";
	}
	else
	{
		if(min!="")
		{
			datum = min.split("-");
			var minDiff = new Date(datum[0],datum[1]-1,datum[2]);
			var diff = diffDate-minDiff;
			if(diff<0)
			{
				return "25";
			}
		}
		
		if(max!="")
		{
			datum = max.split("-");
			var maxDiff = new Date(datum[0],datum[1]-1,datum[2]);
			var diff = diffDate-maxDiff;		
			if(diff>0)
			{
				return "26";				
			}
		}
		diff = diffDate-minDateT;
		if(diff < 0)
		{
			return "23";				
		}
		diff = diffDate-maxDateT;
		if(diff >= 0)
		{
			return "23";				
		}
	}
	return "";
}
		   	


//verifica se a hora introduzida e valida (HH:MM)
function vTime4 (tempo) 
{ 
	var isvalideEmailExp = /^(\d{2}|\d):\d{2}$/;
	if(!isvalideEmailExp.test(tempo))
	{
		return "20";
	}    
}

function vCodigoPostal (codigopostal) 
{ 
	var isvalideEmailExp = /^(\d{4})-\d{3}$/;
	if(!isvalideEmailExp.test(codigopostal))
	{
		return "29";
	}    
}




	
//verifica se a hora introduzida e valida (HH:MM:SS)
function vTime6 (tempo) {

	var isvalideEmailExp = /^(\d{2}|\d):\d{2}:\d{2}$/;
	if(!isvalideEmailExp.test(tempo))
	{
		return "21";
	}

}


//verifica se o email introduzido e invalido (T@T.T)
function vEmail(email){
	var isvalideEmailExp = /^\w(\.?[\w-])*@\w(\.?[-\w])*\.([a-z]{3}(\.[a-z]{2})?|[a-z]{2}(\.[a-z]{2})?)$/i;
	if(!isvalideEmailExp.test(email))
	{
		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 || 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;
}


//verifica se o nº contribuinte e correcto
function vContribuinteParticular(contribuinte)
{
	var result= vContribuinte(contribuinte);
	if(result!=true) // validar número.
	{
		return result;
	}

	if(contribuinte.substring(0,1) == "5")
	{
		// É NIF Empresa
		return "23";
	}
	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+= "           ---> O campo " + label + " deverá ser do tipo (AAAA-MM-DD).\n";
    return true;
  case "4":
    erros+= "           ---> O campo " + label + " deverá ser numérico (Ex: 123).\n";
    return true;
  case "5":
    erros+= "           ---> O campo " + label + " deverá ter como mínimo o valor " + min + ".\n";
    return true;
  case "6":
    erros+= "           ---> O campo " + label + " deverá ter como máximo o valor " + max + ".\n";
    return true;
  case "7":
    erros+= "           ---> O campo " + label + " deverá ser maior que " + min + " e menor que " + max + ".\n";
    return true;
  case "8":
    erros+= "           ---> O campo " + label + " deverá ter exactamente " + min + " caracter(es).\n";
    return true;  
  case "9":
    erros+= "           ---> O campo " + label + " deverá ter no mínimo " + min + " caracteres.\n";
    return true;
  case "10":
    erros+= "           ---> O campo " + label + " deverá ter no máximo " + max + " caracteres.\n";
    return true;
  case "11":
    erros+= "           ---> O campo " + label + " deverá assumir um valor positivo.\n";
    return true;
  case "12":
    erros+= "           ---> O campo " + label + " deverá ser do tipo taxa.\n";
    return true;
  case "13":
    erros+= "           ---> O campo " + label + " não deverá ter mais de "+rows+" linhas.\n";
    return true;
  case "15":
    erros+= "           ---> O campo " + label + " deverá ser composto com as casas decimais a zeros (Ex: 99.00).\n";
    return true;
  case "16":
    erros+= "           ---> O campo " + label + " só deverá ter um separador decimal (Ex: 99.00).\n";
    return true;
  case "17":
    erros+= "           ---> O campo " + label + " deverá  ser composto por duas casas decimais (Ex: 99.00).\n";
    return true;
  case "18":
    erros+= "           ---> O campo " + label + " deverá ser do tipo moeda (Ex: 99.00).\n";
    return true;
  case "19":
    erros+= "           ---> O campo " + label + " deverá  ser composto por duas casas decimais (Ex: 99.99).\n";
    return true;
  case "20":
    erros+= "           ---> O campo " + label + " deverá ser do tipo Hora (HH:MM).\n";
    return true;
  case "21":
    erros+= "           ---> O campo " + label + " deverá ser do tipo Hora (HH:MM:SS).\n";
    return true;  
  case "22":
    erros+= "           ---> O campo " + label + " não é válido.\n";
    return true;  
  case "23":
    erros+= "           ---> O campo " + label + " não é válido.\n";
    return true;
  case "24":
    erros+= "           ---> O campo " + label + " deverá ser um intervalo válido.\n";
    return true;       
  case "25":
    erros+= "           ---> O campo " + label + " deverá ser superior ou igual a " + min + ".\n";
    return true;
  case "26":
    erros+= "           ---> O campo " + label + " deverá ser inferior ou igual a " + max + ".\n";
    return true;
  case "27":
    erros+= "           ---> O campo " + label + " deverá ser maior que " + min + " e menor que " + max + ".\n";
    return true;    
  case "28":
  	tamMsg = 0;
  	if (max.indexOf(".")>-1){
  		tamMsg = max.substring(0,max.indexOf(".")).length;
  	} else {
  		tamMsg = max.length;
  	}
    erros+= "           ---> O campo " + label + " deverá ter no máximo " + tamMsg + " caracteres.\n";
    return true;    
  case "29":
    erros+= "           ---> O campo " + label + " deverá ser do tipo (4 + 3).\n";
    return true;    

  default: 
    return false;    
  }
}



function verificaForm(form,aValida,conversao,errosPaginaInvocacao) {

  // 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
  
  //A opçao errosPaginaInvocacao Server para ser feito uma extensao aos erros genericos, ie,
  //quando é necessario uma validação de negócio na página e é necessário mostrar as mensagens
  //no mesmo formato que o actual. Modo de utilização:
  //	- Dever ser formatado da seguitne forma
  //		"           ---> " + mensagem +"\n"
  //	Exemplo: ver página /portalHabitacao/imoveis/OsMeusImoveis/ConsultarEditarAnuncios.jsp

  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 += "           ---> " + aValida[j].label + "\n";
	    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 += "           ---> " + aValida[j].label + "\n";
		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].min,aValida[j].max),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(limiteMoney(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 "CodigoPostal" :
	  if (erro(vCodigoPostal(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;
	case "ContribuinteParticular" :
	  if (erro(vContribuinteParticular(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;
	    }
	  }
	}
      }
      }
    }
  }
	
	//Esta variavel serve para ser um extesao da script de validacoes
	//A ideia é dar oportunidade para mostrar mensagens em conjunto
	// com as validacoes por defeito sem carregar a script de validacoes
	// com regras de negocio
	errosPaginaInvocacao=''+errosPaginaInvocacao
	if(errosPaginaInvocacao!='undefined' && errosPaginaInvocacao!='')
	{
		erros+=errosPaginaInvocacao;
	}
	

  // 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, corrija o(s) seguinte(s) dado(s):\n\n";
	if(campos_vazios)
	{
		msg+= "  - Campo(s) de preenchimento obrigatório:\n" + campos_vazios + "\n";
	}
	if(erros)
	{
	    msg+= "  - Campo(s) preenchido(s) incorrectamente:\n";
		msg+= erros+"\n\n";
	}
  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 + ".type")!= 'hidden') 
		{
			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 += "           ---> " + aValida[0].label + "\n";
	    	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 += "           ---> " + aValida[0].label + "\n";
				  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].min,aValida[0].max),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 "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;
		case "ContribuinteParticular" :
	  		if (erro(vContribuinteParticular(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 devido aos seguintes erro(s):\n";
  if (campos_vazios)
    msg += " - Campo de preenchimento obrigatório:\n" + campos_vazios + "\n";
  if (erros)
    msg += " - Campo mal formatado:\n";
  
  msg += erros;
  msg += "Por favor, carregue em OK e corrija o dado.";
  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) {

if (DataInicio.indexOf("-")>-1)
	DataInicio = DataInicio.replace("-","/").replace("-","/");
if (DataFim.indexOf("-")>-1)
	DataFim = DataFim.replace("-","/").replace("-","/");

var dateInicio = new Date(DataInicio);
var dateFim = new Date(DataFim);


var flag=false;


if(dateInicio > dateFim)
{
	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 erro(s).\n";
  msg += "______________________________________________________\n\n"
    
    msg += " - O intervalo da DataInicio e DataFim está incorrecto";
  alert(msg);
  }
 return flag;

}

function validaDatasRetornaMsg(DataInicio,DataFim) {

if (DataInicio.indexOf("-")>-1)
	DataInicio = DataInicio.replace("-","/").replace("-","/");
if (DataFim.indexOf("-")>-1)
	DataFim = DataFim.replace("-","/").replace("-","/");

var dateInicio = new Date(DataInicio);
var dateFim = new Date(DataFim);


var flag=false;


if(dateInicio > dateFim)
{
	flag = true;
}
msg="";
if (flag==true){	
  
    msg = "           ---> O campo Data de Fim deverá ser superior ou igual à Data de Início.\n";
  }
 return msg;

}

function comparaDataMaiorMenor(data1,data2,comparacao) {
	if (comparacao==">"){
		return (data1.getTime()>data2.getTime());
	} else if (comparacao==">="){
		return (data1.getTime()>=data2.getTime());
	} else if (comparacao=="<="){
		return (data1.getTime()<=data2.getTime());	
	} else if (comparacao=="<"){
		return (data1.getTime()<data2.getTime());		
	} else if (comparacao=="=="){
		return (data1.getTime()==data2.getTime());	
	}
}

function comparaDataMaiorMenorStr(data1,data2,comparacao) {
	return comparaDataMaiorMenor(criaDate(data1),criaDate(data2),comparacao);
}


function criaDate(data)
{
	return new Date(data.replace("-","/").replace("-","/"));
}

