﻿var nbsp = 160;		// non-breaking space char
var node_text = 3;	// DOM text node-type
var emptyString = /^\s*$/ ;
var global_valfield;	// retain valfield for timer thread

// --------------------------------------------
//                  trim
// Trim leading/trailing whitespace off string
// --------------------------------------------
function trim(str)
{
  return str.replace(/^\s+|\s+$/g, '');
}

// --------------------------------------------
//                  setfocus
// Delayed focus setting to get around IE bug
// --------------------------------------------
function setFocusDelayed()
{
  global_valfield.focus();
}

function setfocus(valfield)
{
  // save valfield in global variable so value retained when routine exits
  global_valfield = valfield;
  setTimeout( 'setFocusDelayed()', 100 );
}

// --------------------------------------------
//                  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, // class to give element ("warn" or "error")
             message, // string to display
			 infomessage) 
{
  // setting an empty string can give problems if later set to a 
  // non-empty string, so ensure a space present. (For Mozilla and Opera one could 
  // simply use a space, but IE demands something more, like a non-breaking space.)
  
  var dispmessage1;
  var dispmessage2;
  var elem = document.getElementById(fld);
  var warning = document.getElementById("inf_name"); 
  
  if (emptyString.test(message))
  {
    dispmessage1 = String.fromCharCode(nbsp);
  }
  else
  {
	dispmessage1 = message;
  }
  
  if (emptyString.test(infomessage))
  {
    dispmessage2 = String.fromCharCode(nbsp);
  }
  else
  {
	dispmessage2 = infomessage;
  }
  
 	elem.firstChild.nodeValue = dispmessage1; 
	warning.firstChild.nodeValue = dispmessage2;
    elem.className = msgtype;
	warning.className = msgtype;

  
 // set the CSS class to adjust appearance of 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    (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  if (!document.getElementById) return true;  // not available on this browser - leave validation to the server
  var elem = document.getElementById(infofield);
  if (!elem.firstChild) return true;  // not available on this browser 
  if (elem.firstChild.nodeType != node_text) return true;  // infofield is wrong type of node  
  return proceed;
}

function validateName  (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed)
  {
	  return stat;
  }

  var namefield = trim(valfield.value);  // value of field with whitespace trimmed off
  var reName = /^[a-zA-Z -%]*$/  ;
  if (!reName.test(namefield))
  {
    msg (infofield, "error", "Species:*", "* Error: you need to enter all or part of a valid name");
    setfocus(valfield);
    return false;
  }
  else
  {
	  msg (infofield, "none", "Species:", "");
  }

  return true;

}

function validateCollNum  (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{

  var namefield = trim(valfield.value);  // value of field with whitespace trimmed off
  var reName = /^[a-zA-Z0-9.,/ _-É]*$/  ;
  if (!reName.test(namefield))
  {
    msg (infofield, "error", "Collector number:*", "* Error: there is an problem with the input");
    setfocus(valfield);
    return false;
  }
  else
  {
	  msg (infofield, "none", "Collector number:", "");
  }

  return true;

}

function validateCollName  (valfield,   // element to be validated
                       	  	infofield,  // id of element to receive info/error msg
                         	required)   // true if required
{
  var namefield = trim(valfield.value);  // value of field with whitespace trimmed off
  var reName = /^[a-zA-Z \-\'&\xE7ç\xE9éï\xEF\xFCüø\xF8\xE8\xE8èá\xE1ä\xE4â\xE2ö\xF6ó\xF3\%\.,]*$/  ;
  if (!reName.test(namefield)) {
    msg (infofield, "error", "Collector:*", "ERROR: You have not entered a valid collectors name");
    setfocus(valfield);
    return false;
  }
  else
  {
	  msg (infofield, "none", "Collector:", "");
  }

  return true;

}

function validateSurName  (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var stat = commonCheck (valfield, infofield, required);
  if (stat != proceed)
  {
	  return stat;
  }

  var namefield = trim(valfield.value);  // value of field with whitespace trimmed off
  //var reName = /^[a-zA-Z \-\'&çéïüèáäâöó\%\.,]{2,}$/ ;
  var reName = /^[a-zA-Z \-\'&\xE7ç\xE9éï\xEF\xFCüø\xF8\xE8\xE8èá\xE1ä\xE4â\xE2ö\xF6ó\xF3\%\.,]{2,}$/ ;
  if (!reName.test(namefield))
  {
    msg (infofield, "error", "Collector:*", "* Error: you need to enter a valid name or use wildcards with more than two letters e.g. We%");
    setfocus(valfield);
    return false;
  }
  else
  {
	  msg (infofield, "none", "Collector:", "");
  }

  return true;

}

function validateBarcode  (valfield,   // element to be validated
                       	  	infofield,  // id of element to receive info/error msg
                         	required)   // true if required
{
  var namefield = trim(valfield.value);  // value of field with whitespace trimmed off
  var reName = /^BR[0-9]{6,13}$|^[0-9]{6,13}$/i  ;
  if ((!reName.test(namefield)) && !emptyString.test(namefield)) {
    msg (infofield, "error", "Barcode number:*", "ERROR: You have not entered a valid barcode number e.g. BR1234567890123");
    setfocus(valfield);
    return false;
  }
  else
  {
	  msg (infofield, "none", "Barcode number:", "");
  }

  return true;

}

function validateDLN  (valfield,   // element to be validated
                       	  	infofield,  // id of element to receive info/error msg
                         	required)   // true if required
{
  var namefield = trim(valfield.value);  // value of field with whitespace trimmed off
  var reName = /^[A-Z]{1,2}[0-9]{4,5}$/i  ;
  if ((!reName.test(namefield)) && !emptyString.test(namefield)) {
    msg (infofield, "error", "Digital loan number:*", "ERROR: You have entered an invalid digital loan number e.g. BT7852");
    setfocus(valfield);
    return false;
  }
  else
  {
	  msg (infofield, "none", "Digital loan number:", "");
  }
  return true;
}

function validateGenus  (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{

  var namefield = trim(valfield.value);  // value of field with whitespace trimmed off
  var reName = /^[a-zA-Z -]*$/  ;
  if (!reName.test(namefield))
  {
    msg (infofield, "error", "Genus:*", "ERROR: you need to enter all or part of a valid generic name");
    setfocus(valfield);
    return false;
  }
  else
  {
	  msg (infofield, "none", "Genus:", "");
  }

  return true;

}

function validateEMail  (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{

  var namefield = trim(valfield.value);  // value of field with whitespace trimmed off
  var reName = /([a-z0-9][-a-z0-9_\+\.]*[a-z0-9])@([a-z0-9][-a-z0-9\.]*[a-z0-9]\.(arpa|root|aero|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)|([0-9]{1,3}\.{3}[0-9]{1,3}))/  ;
  if (!reName.test(namefield))
  {
    msg (infofield, "error", "email*", "ERROR: you need to enter a valid e-mail address");
    setfocus(valfield);
    return false;
  }
  else
  {
	  msg (infofield, "none", "email", "");
  }

  return true;

}

function validatePersonName  (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{

  var namefield = trim(valfield.value);  // value of field with whitespace trimmed off
  var reName = /^([a-zA-ZÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöü]+[\'\,\.\-]?[a-zA-ZÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöü ]*)+[ ]([a-zA-ZÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöü]+[\'\,\.\-]?[a-zA-ZÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöü ]+)+$/  ;
  if (!reName.test(namefield))
  {
    msg (infofield, "error", "Full name*", "ERROR: you need to enter a valid name");
    setfocus(valfield);
    return false;
  }
  else
  {
	  msg (infofield, "none", "Full name", "");
  }

  return true;

}

function validateInstitution  (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{


  var namefield = trim(valfield.value);  // value of field with whitespace trimmed off
  var reName = /^[a-zA-Z \-\'&çéëïüèáäâöó\.,]{1,}$/  ;
  if (!reName.test(namefield))
  {
    msg (infofield, "error", "Institution*", "ERROR: you need to enter a valid name");
    setfocus(valfield);
    return false;
  }
  else
  {
	  msg (infofield, "none", "Institution", "");
  }

  return true;

}

function validateTaxon  (valfield,   // element to be validated
                         infofield,  // id of element to receive info/error msg
                         required)   // true if required
{
  var namefield = trim(valfield.value);  // value of field with whitespace trimmed off
  var reName = /^[()a-zA-Z\x{2D} \-\'&ÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöü\.\x{2E},]{2,}$/  ;
  if (!reName.test(namefield))
  {
    msg (infofield, "error", "Taxon name*", "ERROR: you need to enter a valid name");
    setfocus(valfield);
    return false;
  }
  else
  {
	  msg (infofield, "none", "Taxon name", "");
  }

  return true;

}

