﻿// ----------------------------------------------------------------------
// Rotinas em Javascript para validação de formulários.
// Todas as rotinas retornam true se executadas nos browser's antigos:
// neste caso a validação tem de ser feita pelo servidor.
// ----------------------------------------------------------------------

var nbsp = 160;    // non-breaking space char
var node_text = 3; // DOM text node-type
emptyString = /^\s*$/

// ----------------------------------------------------------------------
// Trim leading/trailing whitespace da string
// ----------------------------------------------------------------------

function trim(str)
{
  return str.replace(/^\s+|\s+$/g, '')
};

// ----------------------------------------------------------------------
// Apresenta a mensagem warn/error do elemento no HTML
// ----------------------------------------------------------------------

function msg (fld, msgtype, message) 
{

  var dispmessage;
  if (emptyString.test(message)) 
    dispmessage = String.fromCharCode(nbsp);    
  else  
    dispmessage = message;

  var elem = document.getElementById(fld);
  elem.firstChild.nodeValue = dispmessage;  
  
  elem.className = msgtype;
};

// ----------------------------------------------------------------------
// Check
// Codigo comum na validação da rotinas:
// browsers antigos e sem javascript activo
// campos obrigatorios estão vazios
// ----------------------------------------------------------------------

var proceed = 2;  

function commonCheck (vfld, ifld, reqd) 

{
  if (!document.getElementById) 
    return true;  // browser antigo !! a validação tem q ser feita no server.
  var elem = document.getElementById(ifld);
  if (!elem.firstChild)
    return true;  // browser antigo 
  if (elem.firstChild.nodeType != node_text)
    return true;  // ifld tipo de node errado  
    
  if (emptyString.test(vfld.value)) {
    if (reqd) {
      msg (ifld, "error", "(campo obrigatório)");  
      vfld.focus();
      return false;
    }
    else {
      msg (ifld, "warn", "");   // OK
      return true;  
    }
  }
  return proceed;
}

// ----------------------------------------------------------------------
//            validação do Present 
// ----------------------------------------------------------------------

function validatePresent (vfld, ifld)
{
  var stat = commonCheck (vfld, ifld, true);
  if (stat != proceed) return stat;
  
  msg (ifld, "warn", "");  
  return true;
};

// ----------------------------------------------------------------------
// Validação e-mail
// ----------------------------------------------------------------------

function validateEmail (vfld, ifld, reqd)
{
  var stat = commonCheck (vfld, ifld, reqd);
  if (stat != proceed) return stat;

  var tfld = trim(vfld.value);
  var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/
  if (!email.test(tfld)) {
    msg (ifld, "error", "(e-mail inválido)");
    vfld.focus();
    return false;
  }

  var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/
  if (!email2.test(tfld)){
    msg (ifld, "warn", "(e-mail estranho - verificar se está correcto)");
	return false;
  }
  else
    msg (ifld, "warn", "");
  return true;
};


// ----------------------------------------------------------------------
// Validação de numero telefone
// ----------------------------------------------------------------------

function validateTelnr (vfld, ifld, reqd)
{
  var stat = commonCheck (vfld, ifld, reqd);
  if (stat != proceed) return stat;

  var tfld = trim(vfld.value);  // value do campo com whitespace trimmed off
  var telnr = /^\+?[0-9 ()-]+[0-9]$/
  if (!telnr.test(tfld)) {
    msg (ifld, "error", "(numero de telefone inválido. os caracteres premitidos são digitos, (), + e espaços.)");
    vfld.focus();
    return false;
  }

  var numdigits = 0;
  for (var j=0; j<tfld.length; j++)
    if (tfld.charAt(j)>='0' && tfld.charAt(j)<='9') numdigits++;

  if (numdigits<9) {
    msg (ifld, "error", "(" + numdigits + " digitos, numero muito pequeno.)");
    vfld.focus();
    return false;
  }

  if (numdigits>15)
    msg (ifld, "warn", "(" + numdigits + " digitos, verificar se está correcto.)");
  else { 
    if (numdigits<9)
      msg (ifld, "warn", "(só " + numdigits + " digitos, verificar se está correcto.)");
    else
      msg (ifld, "warn", "");
  }
  return true;
};

// ----------------------------------------------------------------------
// Validação de idade
// ----------------------------------------------------------------------

function validateAge (vfld, ifld, reqd)
{
  var stat = commonCheck (vfld, ifld, reqd);
  if (stat != proceed) return stat;

  var tfld = trim(vfld.value);
  var ageRE = /^[0-9]{1,3}$/
  if (!ageRE.test(tfld)) {
    msg (ifld, "error", "(Idade Inválida)");
    vfld.focus();
    return false;
  }

  if (tfld>=101) {
    msg (ifld, "error", "(Idade Inválida)");
    vfld.focus();
    return false;
  }

  if (tfld>100) msg (ifld, "warn", "(idade superior a 100 anos: verificar se está correcto)");
  else {
    if (tfld<7) msg (ifld, "warn", "(idade superior a 7 anos: verificar se está correcto)");
    else        msg (ifld, "warn", "");
  }
  return true;
};
