//
var emptyString = /^\s*$/;
// -----------------------------------------
//                  bgfield
// Changes input field style
// -----------------------------------------

function bgfield(vfld,   // element to changed
             msgtype // type of msg
			 ) 
{
//  vfld.className = "Input_" + msgtype;
};

// -----------------------------------------
//                  msg
// Display warn/error message in HTML element
// commonCheck routine must have previously been called
// -----------------------------------------

function msg(fld,     // id of element to display message in
             msgtype, // type of image
             message) // string to display
{
  var elem = document.getElementById(fld);
//  elem.innerHTML = '<img src="img/ICform_' + msgtype + '.gif"  width="20" height="18">&nbsp;' + message;
  elem.innerHTML = '&nbsp;' + message;
};

// -----------------------------------------
//            commonCheck
// Common code for all validation routines to:
// (a) check for older / less-equipped browsers
// (b) check if empty fields are required
// Returns true (validation passed), 
//         false (validation failed) or 
//         proceed (don't know yet)
// -----------------------------------------

var proceed = 2;

function commonCheck    (vfld,   // element to be validated
                         ifld,   // id of element to receive info/error msg
                         reqd)   // true if required
{
	if (!document.getElementById) 
		return true;  // not available on this browser - leave validation to the server
	var elem = document.getElementById(ifld);
	
	if (emptyString.test(vfld.value) && reqd) {
		if ( ifld ) msg (ifld, "error", "Campo obrigatório");  
		vfld.focus();
		bgfield(vfld, "error");
		return false;
	} else {
		return proceed;  
	}
	return proceed;
}
// -----------------------------------------
//            validatePresentHidden
// Validate if something has been entered in a hidden field
// Returns true if so 
// -----------------------------------------

function validatePresentHidden    (vfld,   // element to be validated
                         ifld)   // id of element to receive info/error msg
{
	if (!document.getElementById) 
		return true;  // not available on this browser - leave validation to the server
	var elem = document.getElementById(ifld);
	
	if (emptyString.test(vfld.value)) {
		msg (ifld, "error", "Campo obrigatório");  
		return false;
	} else {
		msg (ifld, "ok", "");
		return true;  
	}
	return false;
}
// -----------------------------------------
//            validatePresent
// Validate if something has been entered
// Returns true if so 
// -----------------------------------------

function validatePresent(vfld,   // element to be validated
                         ifld )  // id of element to receive info/error msg
{
	var stat = commonCheck (vfld, ifld, true);
	if (stat != proceed) return stat;
	
	msg (ifld, "ok", "");
	bgfield(vfld, "ok");
	return true;
};

// -----------------------------------------
//            validatePresentSelect
// Validate if something has been entered in a select box
// Returns true if so 
// -----------------------------------------
function validatePresentSelect(vfld,   // element to be validated
                         ifld )  // id of element to receive info/error msg
{
	if (!vfld.options[vfld.selectedIndex].value) {
		msg (ifld, "error", "Campo obrigatório");  
		bgfield(vfld, "error");
		return false;
	}
	
	msg (ifld, "ok", "");
	bgfield(vfld, "ok");
	return true;
};

// -----------------------------------------
//               validateEmail
// Validate if e-mail address
// Returns true if so (and also if could not be executed because of old browser)
// -----------------------------------------

function validateEmail  (vfld,   // element to be validated
                         ifld,   // id of element to receive info/error msg
                         reqd)   // true if required
{
	var stat = commonCheck (vfld, ifld, reqd);
	if (stat != proceed) return stat;
	
	var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/;
	if (!email.test(vfld.value)) {
		msg (ifld, "error", "Endereço de email inválido.");
		bgfield(vfld, "error");
		vfld.focus();
		return false;
	}
	
	var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/;
	if (!email2.test(vfld.value)) {
		msg (ifld, "warn", "Formato de email estranho, verifique se está correcto.");
		bgfield(vfld, "warn");
	} else {
		msg (ifld, "ok", "");
		bgfield(vfld, "ok");
	}
	return true;
};

// -----------------------------------------
//               validatePassword
// Validate if password is inserted and if they are equal
// Returns true if so (and also if could not be executed because of old browser)
// -----------------------------------------

function validatePassword (vfld1,   // element to be validated 1
						   vfld2,   // element to be validated 2
						   minlen, // minimum password length
                         ifld,   // id of element to receive info/error msg
                         reqd)   // true if required
{
	var stat = commonCheck (vfld1, ifld, reqd);
	if (stat != proceed) return stat;
	var stat = commonCheck (vfld2, ifld, reqd);
	if (stat != proceed) return stat;
	
	if (vfld1.value != vfld2.value) {
		msg (ifld, "error", "Passwords não coincidem.");
		bgfield(vfld1, "error");
		bgfield(vfld2, "error");
		vfld1.focus();
		return false;
	}
	if (reqd && vfld1.value.length < minlen) {
		msg (ifld, "error", "Passwords devem tem pelo menos " + minlen + " caractéres.");
		bgfield(vfld1, "error");
		bgfield(vfld2, "error");
		vfld1.focus();
		return false;
	}
	
	msg (ifld, "ok", "");
	bgfield(vfld1, "ok");
	bgfield(vfld2, "ok");
	return true;
};



// -----------------------------------------
//            validateTelnr
// Validate telephone number
// Returns true if so (and also if could not be executed because of old browser)
// Permits spaces, hyphens, brackets and leading +
// -----------------------------------------

function validateTelnr  (vfld,   // element to be validated
                         ifld,   // id of element to receive info/error msg
                         reqd)   // true if required
{
  var stat = commonCheck (vfld, ifld, reqd);
  if (stat != proceed) return stat;

  alert(1);
  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  var telnr = /^\+?[0-9 ()-]+[0-9]$/;
  if (!telnr.test(tfld)) {
    msg (ifld, "error", "ERROR: not a valid telephone number. Characters permitted are digits, space ()- and leading +");
    vfld.focus();
    alert(11);
    return false;
  }

  alert(2);
  var numdigits = 0;
  for (var j=0; j<tfld.length; j++)
    if (tfld.charAt(j)>='0' && tfld.charAt(j)<='9') numdigits++;

  alert(3);
  if (numdigits<6) {
    msg (ifld, "error", "ERROR: " + numdigits + " digits - too short");
    vfld.focus();
    return false;
  }

  alert(4);
  if (numdigits>14)
    msg (ifld, "warn", numdigits + " digits - check if correct");
  else { 
    if (numdigits<10)
      msg (ifld, "warn", "Only " + numdigits + " digits - check if correct");
    else
      msg (ifld, "warn", "");
  }
  return true;
};

// -----------------------------------------
//            validateNumber
// Validate telephone number
// Returns true if so (and also if could not be executed because of old browser)
// Permits spaces, hyphens, brackets and leading +
// -----------------------------------------

function validateNumber  (vfld,   // element to be validated
                         ifld,   // id of element to receive info/error msg
						 num, // number of digits
                         reqd)   // true if required
{
	var stat = commonCheck (vfld, ifld, reqd);
	if (stat != proceed) return stat;

	var tfld = vfld.value;
	var telnr = /^[0-9]+$/;
	if (!telnr.test(tfld)) {
		if (!tfld.length && !reqd) {
			msg (ifld, "ok", "");
			bgfield(vfld, "ok");
			return true;
		}
		bgfield(vfld, "error");
		msg (ifld, "error", "Apenas números são permitidos.");
		vfld.focus();
		return false;
	} else {
		msg (ifld, "ok", "");
		bgfield(vfld, "ok");
	}
	if (num && tfld.length != num) {
		if (!tfld.length && !reqd) {
			msg (ifld, "ok", "");
			bgfield(vfld, "ok");
			return true;
		}
		msg (ifld, "error", "Tem de inserir " + num + " digitos.");
		bgfield(vfld, "error");
		vfld.focus();
		return false;	  
	}
	msg (ifld, "ok", "");
	bgfield(vfld, "ok");
	return true;
};

// -----------------------------------------
//            validateString
// Validate string
// Returns true if so (and also if could not be executed because of old browser)
// Permits spaces, hyphens
// -----------------------------------------

function validateString  (vfld,   // element to be validated
                         ifld,   // id of element to receive info/error msg
						 num, // number of chars
                         reqd)   // true if required
{
	var stat = commonCheck (vfld, ifld, reqd);
	if (stat != proceed) return stat;

	var tfld = vfld.value;
	var telnr = /^[a-zA-Z\s-]+$/;
	if (!telnr.test(tfld)) {
		if (!tfld.length && !reqd) {
			msg (ifld, "ok", "");
			bgfield(vfld, "ok");
			return true;
		}
		bgfield(vfld, "error");
		msg (ifld, "error", "Apenas letras, hífens e espaços são permitidos.");
		vfld.focus();
		return false;
	} else {
		msg (ifld, "ok", "");
		bgfield(vfld, "ok");
	}
	if (num && tfld.length != num) {
		if (!tfld.length && !reqd) {
			msg (ifld, "ok", "");
			bgfield(vfld, "ok");
			return true;
		}
		msg (ifld, "error", "Tem de inserir " + num + " caracteres.");
		bgfield(vfld, "error");
		vfld.focus();
		return false;	  
	}
	msg (ifld, "ok", "");
	bgfield(vfld, "ok");
	return true;
};

// -----------------------------------------
//            validateFloat
// Validate telephone number
// Returns true if so (and also if could not be executed because of old browser)
// Permits spaces, hyphens, brackets and leading +
// -----------------------------------------

function validateFloat  (vfld,   // element to be validated
                         ifld,   // id of element to receive info/error msg
                         reqd)   // true if required
{
	var stat = commonCheck (vfld, ifld, reqd);
	if (stat != proceed) return stat;

	var tfld = vfld.value;
	var telnr = /^[0-9\.,]+$/;
	if (!telnr.test(tfld)) {
		if (!tfld.length && !reqd) {
			msg (ifld, "ok", "");
			bgfield(vfld, "ok");
			return true;
		}
		bgfield(vfld, "error");
		msg (ifld, "error", "Apenas números inteiros ou décimais são permitidos.");
		vfld.focus();
		return false;
	} else {
		msg (ifld, "ok", "");
		bgfield(vfld, "ok");
	}
	msg (ifld, "ok", "");
	bgfield(vfld, "ok");
	return true;
};


// -----------------------------------------
//             validateAge
// Validate person's age
// Returns true if OK 
// -----------------------------------------

function validateAge    (vfld,   // element to be validated
                         ifld,   // id of element to receive info/error msg
                         reqd)   // true if required
{
  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", "ERROR: not a valid age");
    vfld.focus();
    return false;
  }

  if (tfld>=200) {
    msg (ifld, "error", "ERROR: not a valid age");
    vfld.focus();
    return false;
  }

  if (tfld>110) msg (ifld, "warn", "Older than 110: check correct");
  else {
    if (tfld<7) msg (ifld, "warn", "Bit young for this, aren't you?");
    else        msg (ifld, "warn", "");
  }
  return true;
};

