// ------------------------------------------------------------------

// alert("message: " + msgtype);

// Javascript form validation routines.
// Author: Stephen Poley
//
// Simple routines to quickly pick up obvious typos.
// All validation routines return true if executed by older browser:
// in this case validation must be left to the server.
//
// Update Aug 2004: have tested that IE 5.0 and IE 5.5 both support DOM model
// sufficiently well, so innerHTML option removed (redundant).
//
// Update Jun 2005: discovered that reason IE wasn't setting focus was
// due to an IE timing bug. Added 0.1 sec delay to fix.
//	
// Update Oct 2005: minor tidy-up: unused parameter removed
// ----------------------------------------------------------------------

var nbsp = 160;    // non-breaking space char
var node_text = 3; // DOM text node-type
var emptyString = /^\s*$/
var glb_vfld;      // retain vfld 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()
{
  glb_vfld.focus()
}

function setfocus(vfld)
{
  // save vfld in global variable so value retained when routine exits
  glb_vfld = vfld;
  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
{
  // 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 dispmessage;
  if (emptyString.test(message)) 
      dispmessage = message;
      //dispmessage = String.fromCharCode(nbsp);    
  else  
    dispmessage = message;

// alert ('message: '+ message);

var elem = document.getElementById(fld);
  elem.firstChild.nodeValue = dispmessage;  
  elem.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    (vfld,   // element to be validated
                         ifld,   // id of element to receive info/error msg
                         reqd,   // true if required
                         nfld)   // field name
{
  if (!document.getElementById) 
  return true;  // not available on this browser - leave validation to the server

  var elem = document.getElementById(ifld);
  if (!elem.firstChild)
  return true;  // not available on this browser 
  if (elem.firstChild.nodeType != node_text)
  return true;  // ifld is wrong type of node  
  if (emptyString.test(vfld.value)) {
    if (reqd) {
    msg (ifld, "error", nfld);  
    setfocus(vfld);
    return false;
    }
    else {
    msg (ifld, "warn", "");   // OK
    return true;  
    }
  } else {
  msg (ifld, "okay", nfld)
  }
  //alert ("this is a test: commonCheck xxx");
return proceed;
};

// ****************************************************************************
//            validate password
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valPass (vfld,   // element to be validated
                  ifld,   // id of element to receive info/error msg
                  nfld )  // name of field
{

//alert ("vfld: " + vfld.name);
//alert ("ifld: " + ifld);
//alert ("nfld: " + nfld);

  var stat = commonCheck (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;
  //  alert ("checkpoint 1");
  //  alert ("checkpoint 2"+ifld.name);
  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  var illChars = /\W/;
  if (illChars.test(tfld)) {
    msg (ifld, "error", "Illegal characters");
    setfocus(vfld);
    return false;
  } else {
	if (tfld.length < 4 || tfld.length >= 30) {
    msg (ifld, "error", "Must be at least 6 characters");
    setfocus(vfld);
    return false;
    }
  }
  msg (ifld, "okay", nfld);  
  return true;
};


// ****************************************************************************
//         validate Title
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valDrop (vfld,   // element to be validated
                  ifld,   // id of element to receive info/error msg
                  nfld )  // name of field
{
//alert("ifld: "+ifld); 
  if (vfld == 0 || vfld.value == 0) {
  //alert("vfld==0: "+vfld); 
    msg (ifld, "error", nfld);
    setfocus(vfld);
    return false;
  }
  //alert ("vfld: "+vfld);

  msg (ifld, "okay", nfld);  
  return true;
};

// ****************************************************************************
//         validate First Name
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valTimeFormat (vfld,   // element to be validated
                  ifld,   // id of element to receive info/error msg
                  nfld )  // name of field
{
//alert ("vfld: " + vfld.name); alert ("ifld: " + ifld); alert ("nfld: " + nfld);
  var stat = commonCheck (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  // var illChars = /[^a-z A-Z 0-9 _]/;
  var timeFormat = /^([0-9]{1,2}):([0-5][0-9])[ ]?([a|p]m)$/
  if (!timeFormat.test(tfld)) {
    msg (ifld, "error", "Format must be hh:mm am/pm");
    setfocus(vfld);
    return false;
  }
  // alert ("checkpoint 1: " + nfld);
  msg (ifld, "okay", nfld);  
  return true;
};

// ****************************************************************************
//         validate First Name
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valCustName (vfld,   // element to be validated
                      ifld,   // id of element to receive info/error msg
                      nfld )  // name of field
{
  var stat = commonCheck (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  // var illChars = /[^a-z A-Z 0-9 _]/;
  var illChars = /[\!\@\$\%\|\*\"\=\;\?]/;
  if (illChars.test(tfld)) {
    msg (ifld, "error", "Illegal characters in name");
    setfocus(vfld);
    return false;
  } else {
	if (tfld.length < 1 || tfld.length >= 20) {
    msg (ifld, "error", "Must be 1 to 20 chars");
    setfocus(vfld);
    return false;
    }
  }
  msg (ifld, "okay", nfld);  
  return true;
};

// ****************************************************************************
//         validate First Name
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valText    (vfld,   // element to be validated
                      ifld,   // id of element to receive info/error msg
                      nfld )  // name of field
{
  var stat = commonCheck (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  // var illChars = /[^a-z A-Z 0-9 _]/;
  var illChars = /[\!\@\$\%\|\*\"\=\;\?]/;
  if (illChars.test(tfld)) {
  msg (ifld, "error", "Illegal characters");
  setfocus(vfld);
  return false;
  }
  msg (ifld, "okay", nfld);  
  return true;
};

// ****************************************************************************
// validate Text Input
// Allows a blank input (does not Validate if something has been entered)
// Checks for illegal characters
// Returns true if so 
// ****************************************************************************
function valTextOther    (vfld,   // element to be validated
                      ifld,   // id of element to receive info/error msg
                      nfld )  // name of field
{
  //var stat = commonCheck (vfld, ifld, true, nfld);
  //if (stat != proceed) return stat;

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  // var illChars = /[^a-z A-Z 0-9 _]/;
  var illChars = /[\!\@\$\%\|\*\"\=\;\?]/;
  if (illChars.test(tfld)) {
  msg (ifld, "error", "Illegal characters");
  setfocus(vfld);
  return false;
  }
  msg (ifld, "okay", nfld);  
  return true;
};

// ****************************************************************************
// ****************************************************************************
// CODE IS SAME AS valCustName - but this is generic
// ****************************************************************************
//         validate First Name
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valName (vfld,   // element to be validated
                  ifld,   // id of element to receive info/error msg
                  nfld )  // name of field
{
//alert ("vfldValue: " + vfld.value);
//alert ("vfld: " + vfld.name); alert ("ifld: " + ifld); alert ("nfld: " + nfld);
  var stat = commonCheck (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

  //alert ("valName: " + vfld.value);
  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  // var illChars = /[^a-z A-Z 0-9 _]/;

  //alert ("tfld: " + tfld);
  var illChars = /[\!\@\$\%\|\*\"\=\;\?\#]/;
  //alert ("illchars: " + illChars);
  if (illChars.test(tfld)) {
  //alert ("tp10: ");
    msg (ifld, "error", "Illegal characters in name");
    setfocus(vfld);
    return false;
  } else {
	if (tfld.length < 1 || tfld.length >= 20) {
    msg (ifld, "error", "Must be 1 to 20 chars");
    setfocus(vfld);
    return false;
    }
  }
  // alert ("checkpoint 1: " + nfld);
  msg (ifld, "okay", nfld);  
  return true;
};

// ****************************************************************************
// ****************************************************************************
//         validate account Name --- CHANGE references to valFLName
// ****************************************************************************
//         validate Account Name
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valAccountName (vfld,   // element to be validated
                         ifld,   // id of element to receive info/error msg
                         nfld )  // name of field
{
//alert ("vfld: " + vfld.name); alert ("ifld: " + ifld); alert ("nfld: " + nfld);
  var stat = commonCheck (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  var illChars = /\W/;
  if (illChars.test(tfld)) {
    msg (ifld, "error", "Illegal characters (no spaces)");
    setfocus(vfld);
    return false;
  } else {
	if (tfld.length < 5 || tfld.length >= 30) {
    msg (ifld, "error", "Must be at least 5 characters");
    setfocus(vfld);
    return false;
    }
  }
  // alert ("checkpoint 1: " + nfld);
  msg (ifld, "okay", nfld);  
  return true;
};

// ****************************************************************************
// ****************************************************************************
//         validate credit card Name --- CHANGE references to valFLName
// ****************************************************************************
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valccName (vfld,   // element to be validated
                    ifld,   // id of element to receive info/error msg
                    nfld )  // name of field
{
//alert ("vfld: " + vfld.name); alert ("ifld: " + ifld); alert ("nfld: " + nfld);
  var stat = commonCheck (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  //var illChars = /[^a-z A-Z 0-9 _]/;
  var illChars = /[\!\@\$\%\|\*\"\=\;\?]/;
  if (illChars.test(tfld)) {
    msg (ifld, "error", "Illegal characters in name");
    setfocus(vfld);
    return false;
  } else {
	if (tfld.length < 5 || tfld.length >= 30) {
    msg (ifld, "error", "Must be 5 to 20 chars");
    setfocus(vfld);
    return false;
    }
  }
  // alert ("checkpoint 1: " + nfld);
  msg (ifld, "okay", nfld);  
  return true;
};

// ****************************************************************************
// ****************************************************************************
// CODE IS SAME AS valccName - but this is generic
// ****************************************************************************
//         validate First Name
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valFLName (vfld,   // element to be validated
                    ifld,   // id of element to receive info/error msg
                    nfld )  // name of field
{
  var stat = commonCheck (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;
//alert ("vfld: " + vfld.name); alert ("ifld: " + ifld); alert ("nfld: " + nfld);
  var stat = commonCheck (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;
  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  //var illChars = /[^a-z A-Z 0-9 _]/;
  var illChars = /[\!\@\$\%\|\*\"\=\;\?]/;
  if (illChars.test(tfld)) {
    msg (ifld, "error", "Illegal characters");
    setfocus(vfld);
    return false;
  } else {
	if (tfld.length < 5 || tfld.length >= 30) {
    msg (ifld, "error", "Must be 5 to 30 chars");
    setfocus(vfld);
    return false;
    }
  }
  // alert ("checkpoint 1: " + nfld);
  msg (ifld, "okay", nfld);  
  return true;
};

// ****************************************************************************
//               validate Email
// Validate if e-mail address
// Returns true if so (and also if could not be executed because of old browser)
// ****************************************************************************
function valEmail  (vfld,   // element to be validated
                    ifld,   // id of element to receive info/error msg
                    nfld)   // true if required
{
//alert ("test");
  var stat = commonCheck (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/
  if (!email.test(tfld)) {
    msg (ifld, "error", "Invalid Email");
    setfocus(vfld);
    return false;
  }
//  var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/
//  if (!email2.test(tfld)) 
//    msg (ifld, "warn", "Unusual Email Address:");
//  else
//    msg (ifld, "warn", "");
msg (ifld, "okay", nfld);  
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 valPhone  (vfld,   // element to be validated
                    ifld,   // id of element to receive info/error msg
                    nfld)   // true if required
{
  var stat = commonCheck (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

  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", "Only digits, +, -, ()");
    setfocus(vfld);
    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<6) {
    msg (ifld, "error", 'number is too short');
    setfocus(vfld);
    return false;
  }

msg (ifld, "okay", nfld);  
return true;
};

// ****************************************************************************
//            validateTelnr
// Validate telephone number
// Permits spaces, hyphens, brackets and leading + (also permits blank field)
// ****************************************************************************
function valCellPhone  (vfld,   // element to be validated
                       ifld,   // id of element to receive info/error msg
                       nfld)   // true if required
{
  //var stat = commonCheck (vfld, ifld, true, nfld);
  //if (stat != proceed) return stat;

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  var telnr = /^\+?[0-9 ()-]+[0-9]$/

  if (tfld.length > 0) {
    if (!telnr.test(tfld)) {
      msg (ifld, "error", "Only digits, +, -, or () allowed");
      setfocus(vfld);
      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<6) {
      msg (ifld, "error", 'Cell Phone number is too short');
      setfocus(vfld);
      return false;
    }
  }
msg (ifld, "okay", nfld);  
return true;
};

// ********************************
//        validate cc Number
//      Returns true if OK 
// ********************************
function valccNumber (vfld,   // element to be validated
                      ifld,   // id of element to receive info/error msg
                      nfld)   // true if required
{
  var stat = commonCheck (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

//alert ("nfld: " + nfld);
//alert ("stat: " + stat);

if (stat != proceed) return stat;

  var tfld = trim(vfld.value);
  var nums = /[0-9]{15,16}/
  if (!nums.test(tfld)) {

//alert ("tfld: " + tfld);
    msg (ifld, "error", "Invalid Number");
    setfocus(vfld);
    return false;
  }
msg (ifld, "okay", nfld);  
return true;
};

// ********************************
//        validate CVV2
//      Returns true if OK 
// ********************************
function valccCvv2 (vfld,   // element to be validated
                    ifld,   // id of element to receive info/error msg
                    nfld)   // true if required
{
  var stat = commonCheck (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

//alert ("nfld: " + nfld);
//alert ("stat: " + stat);

if (stat != proceed) return stat;

  var tfld = trim(vfld.value);
  var nums = /[0-9]{3,4}/
  if (!nums.test(tfld)) {

//alert ("tfld: " + tfld);
    msg (ifld, "error", "CVV2");
    setfocus(vfld);
    return false;
  }
msg (ifld, "okay", nfld);  
return true;
};



//------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------
// -----------------------------------------
//            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)
// -----------------------------------------
function commonCheckBus    (vfld,   // element to be validated
                            ifld,   // id of element to receive info/error msg
                            reqd,   // true if required
                            nfld)   // field name
{
  if (!document.getElementById) 
  return true;  // not available on this browser - leave validation to the server
  var elem = document.getElementById(ifld);
  if (!elem.firstChild)
  return true;  // not available on this browser 
  if (elem.firstChild.nodeType != node_text) 
  return true;  // ifld is wrong type of node  
  if (emptyString.test(vfld.value)) {
    if (reqd) {
    //alert ("test message");
    msg (ifld, "error", 'required');  
    setfocus(vfld);
    return false;
    }
    else {
    msg (ifld, "warn", "");   // OK
    return true;  
    }
  } else {
  msg (ifld, "okay", "")
  }
return proceed;
};

// ****************************************************************************
//         validate Title
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valBusDrop (vfld,   // element to be validated
                     ifld,   // id of element to receive info/error msg
                     nfld )  // name of field
{
//alert ('testing');
  var stat = commonCheckBus (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;
//  alert("vfld: "+vfld.value); alert("ifld: "+ifld); alert("nfld: "+nfld);  alert("stat: "+stat);
  if (vfld == 0 || vfld.value == 0) {
  //alert("vfld==0: "+vfld); 
    msg (ifld, "error", "Required");
    setfocus(vfld);
    return false;
  }
  //alert ("vfld: "+vfld);

  msg (ifld, "okay", "");  
  return true;
};

// ****************************************************************************
// ****************************************************************************
// CODE IS SAME AS valccName - but this is generic
// ****************************************************************************
//         validate First Name
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valBusFLName (vfld,   // element to be validated
                    ifld,   // id of element to receive info/error msg
                    nfld )  // name of field
{

//alert ("testing");
var stat = commonCheckBus (vfld, ifld, true, nfld);

//alert ("testing 2");
  if (stat != proceed) return stat;

//alert ("vfld: " + vfld.name); alert ("ifld: " + ifld); alert ("nfld: " + nfld);
  var stat = commonCheck (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;
  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
//  var illChars = /[^a-z A-Z 0-9 _\']/;
//  if (illChars.test(tfld)) {
  var illChars = /[\!\@\$\%\|\*\"\=\;\?]/;
  if (illChars.test(tfld)) {
    msg (ifld, "error", "Illegal characters");
    setfocus(vfld);
    return false;
  } else {
	if (tfld.length < 2 || tfld.length >= 50) {
    msg (ifld, "error", "Must be 5 to 50 chars");
    setfocus(vfld);
    return false;
    }
  }
  // alert ("checkpoint 1: " + nfld);
  msg (ifld, "okay", nfld);  
  return true;
};


// ****************************************************************************
//         validate First Name
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valBusName (vfld,   // element to be validated
                      ifld,   // id of element to receive info/error msg
                      nfld )  // name of field
{

// alert ("testing");

//alert ("vfld: " + vfld.name); alert ("ifld: " + ifld); alert ("nfld: " + nfld);
  var stat = commonCheckBus (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  //var illChars = /[^a-z A-Z 0-9 _]/;
  var illChars = /[\!\@\$\%\|\*\"\=\;\?]/;
  if (illChars.test(tfld)) {
    msg (ifld, "error", "Illegal characters");
    setfocus(vfld);
    return false;
  } else {
	if (tfld.length < 1 || tfld.length >= 20) {
    msg (ifld, "error", "Must be 1 to 20 chars");
    setfocus(vfld);
    return false;
    }
  }
  // alert ("checkpoint 1: " + nfld);
  msg (ifld, "okay", nfld);  
  return true;
};

// ****************************************************************************
//         validate First Name
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valBusName_new (vfld,   // element to be validated
                         ifld,   // id of element to receive info/error msg
                         reqd,   // true or false - field has required input
                         nfld )  // name of field
{

//alert ("testing");
//alert ("vfld: " + vfld.name); 
//alert ("ifld: " + ifld); 
//alert ("reqd: " + reqd); 
//alert ("nfld: " + nfld);
  var stat = commonCheckBus (vfld, ifld, reqd, nfld);
  if (stat != proceed) return stat;

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  //var illChars = /[^a-z A-Z 0-9 _]/;
  var illChars = /[\!\@\$\%\|\*\"\=\;\?]/;
  if (illChars.test(tfld)) {
    msg (ifld, "error", "Illegal characters");
    setfocus(vfld);
    return false;
  } else {
	if (tfld.length < 1 || tfld.length >= 50) {
    msg (ifld, "error", "Must be 1 to 50 chars");
    setfocus(vfld);
    return false;
    }
  }
  //alert ("checkpoint 1: " + nfld);
  msg (ifld, "okay", nfld);  
  return true;
};



// ****************************************************************************
//               validate Email
// Validate if e-mail address
// Returns true if so (and also if could not be executed because of old browser)
// ****************************************************************************
function valBusEmail  (vfld,   // element to be validated
                    ifld,   // id of element to receive info/error msg
                    nfld)   // true if required
{
//alert ("test");
  var stat = commonCheckBus (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/
  if (!email.test(tfld)) {
    msg (ifld, "error", "Invalid Email");
    setfocus(vfld);
    return false;
  }
msg (ifld, "okay", nfld);  
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 valBusPhone  (vfld,   // element to be validated
                    ifld,   // id of element to receive info/error msg
                    nfld)   // true if required
{
  var stat = commonCheckBus (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

  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", "Only digits, +, -, ()");
    setfocus(vfld);
    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<6) {
    msg (ifld, "error", 'numer is too short');
    setfocus(vfld);
    return false;
  }

if (numdigits<6) {
    msg (ifld, "error", 'numer is too short');
    setfocus(vfld);
    return false;
  }
msg (ifld, "okay", nfld);  
return true;
};

// ********************************
//   validate Number, and is 4 digits
//      Returns true if OK 
// ********************************
function valNum4 (vfld,   // element to be validated
                  ifld,   // id of element to receive info/error msg
                  nfld)   // true if required
{
  var stat = commonCheckBus (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

//alert ("nfld: " + nfld);
//alert ("stat: " + stat);

if (stat != proceed) return stat;

  var tfld = trim(vfld.value);
  var nums = /[0-9]{4,4}/
  if (!nums.test(tfld)) {

//alert ("tfld: " + tfld);
    msg (ifld, "error", "date must be 4 digits (ex: 1978)");
    setfocus(vfld);
    return false;
  }

if (tfld <= 1900 || tfld > 2015) {
    msg (ifld, "error", 'Date must be after 1900');
    setfocus(vfld);
    return false;
  }

msg (ifld, "okay", nfld);  
return true;
};

// ********************************
//   validate Number is between 1 and 10
//      Returns true if OK 
// ********************************
function valNum1_10 (vfld,   // element to be validated
                     ifld,   // id of element to receive info/error msg
                     nfld)   // true if required
{
  var stat = commonCheckBus (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

//alert ("nfld: " + nfld);
//alert ("stat: " + stat);
if (stat != proceed) return stat;

  var tfld = trim(vfld.value);
  var nums = /[0-9]{1,4}/
  if (!nums.test(tfld)) {

//alert ("tfld: " + tfld);
    msg (ifld, "error", "digits only");
    setfocus(vfld);
    return false;
  }

  var tfld = trim(vfld.value);
  if (tfld <= 1 || tfld > 10) {
    msg (ifld, "error", 'Number must be a number, 1 to 10');
    setfocus(vfld);
    return false;
  }

msg (ifld, "okay", nfld);  
return true;
};


// ********************************
// validate number, and is 1 to 4 digits
//      Returns true if OK 
// ********************************
function valNum1_4 (vfld,   // element to be validated
                    ifld,   // id of element to receive info/error msg
                    nfld)   // true if required
{
  var stat = commonCheckBus (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

//alert ("nfld: " + nfld);
//alert ("stat: " + stat);

if (stat != proceed) return stat;

  var tfld = trim(vfld.value);
  var nums = /[0-9]{1,4}/
  if (!nums.test(tfld)) {

//alert ("tfld: " + tfld);
    msg (ifld, "error", "digits only");
    setfocus(vfld);
    return false;
  }

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  if (tfld<1) {
    msg (ifld, "error", 'must be at least 1 room');
    setfocus(vfld);
    return false;
  }

msg (ifld, "okay", nfld);  
return true;
};


// ********************************
// validate number, and is 1 to 4 digits
//      Returns true if OK 
// ********************************
function valNum1_200 (vfld,   // element to be validated
                      ifld,   // id of element to receive info/error msg
                      nfld)   // true if required
{
  var stat = commonCheckBus (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;
  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  var nums = /[0-9]/
  if (!nums.test(tfld)) {
  //alert ("tfld: " + tfld);
    msg (ifld, "error", "digits only");
    setfocus(vfld);
    return false;
  }

  if (tfld < 1 || tfld >200) {
    msg (ifld, "error", 'must be 1 to 200');
    setfocus(vfld);
    return false;
  }

msg (ifld, "okay", nfld);  
return true;
};

// ********************************
// validate number, and is 1 to 4 digits
//      Returns true if OK 
// ********************************
function valNum1_400 (vfld,   // element to be validated
                      ifld,   // id of element to receive info/error msg
                      nfld)   // true if required
{
  var stat = commonCheckBus (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

alert ("nfld: " + nfld);
alert ("stat: " + stat);

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  var nums = /[0-9]/
  if (!nums.test(tfld)) {
  //alert ("tfld: " + tfld);
    msg (ifld, "error", "digits only");
    setfocus(vfld);
    return false;
  }

  if (tfld < 1 || tfld >400) {
    msg (ifld, "error", 'must be 1 to 400');
    setfocus(vfld);
    return false;
  }

msg (ifld, "okay", nfld);  
return true;
};

// ********************************
// validate number, and is 1 to 4 digits
//      Returns true if OK 
// ********************************
function valNum1_12 (vfld,   // element to be validated
                      ifld,   // id of element to receive info/error msg
                      nfld)   // true if required
{
  var stat = commonCheckBus (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

alert ("nfld: " + nfld);
alert ("stat: " + stat);

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  var nums = /[0-9]/
  if (!nums.test(tfld)) {
  //alert ("tfld: " + tfld);
    msg (ifld, "error", "digits only");
    setfocus(vfld);
    return false;
  }

  if (tfld <= 4 || tfld >=12) {
    msg (ifld, "error", 'must be 1 to 12');
    setfocus(vfld);
    return false;
  }

msg (ifld, "okay", nfld);  
return true;
};

// ********************************
// validate number, and is 1 to 4 digits
//      Returns true if OK 
// ********************************
function valNum5_1000 (vfld,   // element to be validated
                      ifld,   // id of element to receive info/error msg
                      nfld)   // true if required
{
  var stat = commonCheckBus (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

alert ("nfld: " + nfld);
alert ("stat: " + stat);

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  var nums = /[0-9]/
  if (!nums.test(tfld)) {
  //alert ("tfld: " + tfld);
    msg (ifld, "error", "digits only");
    setfocus(vfld);
    return false;
  }

  if (tfld <= 5 || tfld >=1000) {
    msg (ifld, "error", 'must be 1 to 12');
    setfocus(vfld);
    return false;
  }

msg (ifld, "okay", nfld);  
return true;
};

// ****************************************************************************
//         validate First Name
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valBusWebAddress (vfld,   // element to be validated
                        ifld,   // id of element to receive info/error msg
                        nfld )  // name of field
{
//alert ("vfld: " + vfld.name); alert ("ifld: " + ifld); alert ("nfld: " + nfld);
//  var stat = commonCheckBus (vfld, ifld, true, nfld);
//  if (stat != proceed) return stat;
  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  var illChars = /[^a-zA-Z0-9_\.\#]/;
  if (illChars.test(tfld)) {
    msg (ifld, "error", "Illegal characters");
    setfocus(vfld);
    return false;
  } else {
	if (tfld.length != 0 && (tfld.length < 5 || tfld.length >= 40)) {
    msg (ifld, "error", "Must be 5 to 40 chars");
    setfocus(vfld);
    return false;
    }
  }
  // alert ("checkpoint 1: " + nfld);
  msg (ifld, "okay", nfld);  
  return true;
};

// ****************************************************************************
// validate Street Address
// ****************************************************************************
function valBusStreetAddress (vfld,   // element to be validated
                              ifld,   // id of element to receive info/error msg
                              nfld )  // name of field
{
//alert ("vfld: " + vfld.name); alert ("ifld: " + ifld); alert ("nfld: " + nfld);
  var stat = commonCheckBus (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
//  var illChars = /[^a-zA-Z0-9 _\-\/\,\.\#]/;
  var illChars = /[\!\@\$\%\|\*\"\=\;\?]/;
  if (illChars.test(tfld)) {
    msg (ifld, "error", "Illegal characters");
    setfocus(vfld);
    return false;
  } else {
	if (tfld.length < 5 || tfld.length >= 50) {
    msg (ifld, "error", "Must be 5 to 50 chars");
    setfocus(vfld);
    return false;
    }
  }
  // alert ("checkpoint 1: " + nfld);
  msg (ifld, "okay", nfld);  
  return true;
};


// ****************************************************************************
// validate Street Address
// ****************************************************************************
function valBusStreetAddress_new (vfld,   // element to be validated
                                  ifld,   // id of element to receive info/error msg
                                  reqd,   // true or false - field has required input
                                  nfld )  // name of field
{
//alert ("vfld: " + vfld.name); alert ("ifld: " + ifld); alert ("nfld: " + nfld);
  var stat = commonCheckBus (vfld, ifld, reqd, nfld);
  if (stat != proceed) return stat;

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
//  var illChars = /[^a-zA-Z0-9 _\-\/\,\.\#]/;
  var illChars = /[\!\@\$\%\|\*\"\=\;\?]/;
  if (illChars.test(tfld)) {
    msg (ifld, "error", "Illegal characters");
    setfocus(vfld);
    return false;
  } else {
	if (tfld.length < 2 || tfld.length >= 50) {
    msg (ifld, "error", "Must be 2 to 50 chars");
    setfocus(vfld);
    return false;
    }
  }
  // alert ("checkpoint 1: " + nfld);
  msg (ifld, "okay", nfld);  
  return true;
};

// ****************************************************************************
// validate 100 Character Input
// ****************************************************************************
function valInput2_100 (vfld,   // element to be validated
                      ifld,   // id of element to receive info/error msg
                      reqd,   // true or false - field has required input
                      nfld )  // name of field
{
//alert ("vfld: " + vfld.name); alert ("ifld: " + ifld); alert ("nfld: " + nfld);
  var stat = commonCheckBus (vfld, ifld, reqd, nfld);
  if (stat != proceed) return stat;

  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
//  var illChars = /[^a-zA-Z0-9 _\-\/\,\.\#]/;
  var illChars = /[\!\@\$\%\|\*\"\=\;\?]/;
  if (illChars.test(tfld)) {
    msg (ifld, "error", "Illegal characters");
    setfocus(vfld);
    return false;
  } else {
	if (tfld.length < 2 || tfld.length >= 100) {
    msg (ifld, "error", "Must be 2 to 100 chars");
    setfocus(vfld);
    return false;
    }
  }
  // alert ("checkpoint 1: " + nfld);
  msg (ifld, "okay", nfld);  
  return true;
};

// ****************************************************************************
// validate 1 to 99 Number Input
// ****************************************************************************
function valNum1_99 (vfld,   // element to be validated
                      ifld,   // id of element to receive info/error msg
                      nfld )  // name of field
{
  var stat = commonCheck (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;
  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  var nums = /[0-9]/
if (!nums.test(tfld)) {
    msg (ifld, "error", "Illegal characters");
    setfocus(vfld);
    return false;
  } else {
	if (tfld < 1 || tfld >= 99) {
    msg (ifld, "error", "Must be 1 to 99");
    setfocus(vfld);
    return false;
    }
  }
  msg (ifld, "okay", nfld);  
  return true;
};

// ****************************************************************************
//         validate First Name
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valBusZip (vfld,   // element to be validated
                    ifld,   // id of element to receive info/error msg
                    nfld )  // name of field
{
//alert ("vfld: " + vfld.name); alert ("ifld: " + ifld); alert ("nfld: " + nfld);
//  var stat = commonCheckBus (vfld, ifld, true, nfld);
//  if (stat != proceed) return stat;
  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
  var illChars = /[^a-zA-Z0-9 _\#\+\-\.]/;
  if (illChars.test(tfld)) {
    msg (ifld, "error", "Illegal characters in code");
    setfocus(vfld);
    return false;
  }
  // alert ("checkpoint 1: " + nfld);
  msg (ifld, "okay", "");  
  return true;
};

// ****************************************************************************
//         validate First Name
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valBusZipNoSp (vfld,   // element to be validated
                        ifld,   // id of element to receive info/error msg
                        nfld )  // name of field
{
//alert ("vfld: " + vfld.name); alert ("vfld: " + vfld.value);
  var stat = commonCheckBus (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;
  var tfld = trim(vfld.value);  // value of field with whitespace trimmed off
//  var illChars = /\b/;
//  if (illChars.test(tfld)) {
//    msg (ifld, "error", "Space is not allowed, Must use a '-' in place of any spaces");
//    setfocus(vfld);
//    return false;
//  }
  var illChars = /[^a-zA-Z0-9 _\#\+\-\.]/;
  if (illChars.test(tfld)) {
    msg (ifld, "error", "Illegal characters in code");
    setfocus(vfld);
    return false;
  }
  // alert ("checkpoint 1: " + nfld);
  msg (ifld, "okay", "");  
  return true;
};

// ****************************************************************************
//         validate Title
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valBusStar (vfld,   // element to be validated
                     ifld,   // id of element to receive info/error msg
                     nfld )  // name of field
{
  var stat = commonCheckBus (vfld, ifld, true, nfld);
  if (stat != proceed) return stat;

//alert("vfld: "+vfld); //alert("ifld: "+ifld); //alert("nfld: "+nfld);  //alert("stat: "+stat);
//alert("vfld.value: "+vfld.value); 

  if (vfld == 0 || vfld.value == 0) {
  //alert("vfld==0: "+vfld); 
    msg (ifld, "error", "Required");
    setfocus(vfld);
    return false;
  }
  //alert ("vfld: "+vfld);

  msg (ifld, "okay", "");  
  return true;
};

// ****************************************************************************
//     convert PHP date to Javascript
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function datePHPtoJS (datePHP){
  //alert ("date: "+datePHP);
  arrayDate = datePHP.split("-");
  var Yr = parseInt(arrayDate[0]);
  var Mo = parseInt(arrayDate[1]);
  var Da = parseInt(arrayDate[2]);
  //alert ("yr: " + Yr); 
  //alert ("mo: " + Mo); 
  //alert ("da: " + Da); 
dateJS = new Date(Yr, Mo-1, Da); 
//alert ("dateJS:" + dateJS);
return dateJS;
};

// ****************************************************************************
//       validate beginning room date 
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valRoomDateBeg (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;
//---------------------------------------------------------------------------
    var jRoomType = document.forms['formRooms'].elements['roomTypeId'];
    //alert ("roomType: " + document.forms.formRooms.roomTypeId.value);
      for (var i = 0; i < jRoomType.length; i++)  {
      if (jRoomType[i].checked == true)	 {
	  jRoomType = jRoomType[i].value;
	  }
    }  
  var jRoomName = document.forms['formRooms'].elements['roomNameId'].value;
  //alert ("Room Type: "+jRoomType); 
  //alert ("roomName: " + jRoomName);
  var jDateBeg = document.forms['formRooms'].elements['cal11'].value;
  var jDateEnd = document.forms['formRooms'].elements['cal11END'].value;
    jArrayName = jArrayNamesDates();  
    for (var j in jArrayName)  {
      if (jArrayName[j][0] == jRoomType && jArrayName[j][1] == jRoomName){
      //   alert ("jArrayName0: " + jArrayName[j][0]);
      //   alert ("jRoomType: "  + jRoomType);
      //   alert ("jArrayName1: " + jArrayName[j][1]);
      //   alert ("jRoomName: " + jRoomName);
      //  alert ("1: " + datePHPtoJS(jDateEnd)); 
      //  alert ("2: " + datePHPtoJS(jArrayName[j][2])); 
      //  alert ("3: " + datePHPtoJS(jDateBeg));
      //  alert ("4: " + datePHPtoJS(jArrayName[j][3]));
        if (!(datePHPtoJS(jDateEnd) < datePHPtoJS(jArrayName[j][2]) || datePHPtoJS(jDateBeg) > datePHPtoJS(jArrayName[j][3]))) {
          if (datePHPtoJS(jDateBeg) >= datePHPtoJS(jArrayName[j][2]) && datePHPtoJS(jDateBeg) <= datePHPtoJS(jArrayName[j][3])) {
       //alert (" should see error message");  
          msg (ifld, "error", "The Beginning Date cannot be between "+jArrayName[j][2]+" and "+jArrayName[j][3]);
          setfocus(vfld);
          return false;
          }
        //alert ("test 5");
        msg (ifld, "error", "The Beginning and End Dates cannot overlap dates already chosen");
        setfocus(vfld);
        return false;
        }
      }
    }
  msg (ifld, "error", "");
  return true;
  };

// ****************************************************************************
//       validate ending room date 
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valRoomDateEnd (vfld,   // element to be validated
                         ifld )  // id of element to receive info/error msg
  {
  //alert ("test end date");
  var stat = commonCheck (vfld, ifld, true);
    if (stat != proceed) return stat;
  //---------------------------------------------------------------------------
  var jRoomType = document.forms['formRooms'].elements['roomTypeId'];

  for (var i = 0; i < jRoomType.length; i++)  {
      if (jRoomType[i].checked == true)	 {
	  jRoomType = jRoomType[i].value;
	  }
    }  
  var jRoomName = document.forms['formRooms'].elements['roomNameId'].value;
  //   var jNumRooms = document.forms['formRooms'].elements['numRooms'].value;
  //   var jNumPersons = document.forms['formRooms'].elements['numPersons'].value;
  var jDateBeg = document.forms['formRooms'].elements['cal11'].value;
  var jDateEnd = document.forms['formRooms'].elements['cal11END'].value;
//  alert (jDateBeg);
//  alert (jDateEnd);
  jArrayName = jArrayNamesDates();  
    for (var j in jArrayName)  {
      if (jArrayName[j][0] == jRoomType && jArrayName[j][1] == jRoomName){
        if (!(datePHPtoJS(jDateEnd) < datePHPtoJS(jArrayName[j][2]) || datePHPtoJS(jDateBeg) > datePHPtoJS(jArrayName[j][3]))) {
          if (datePHPtoJS(jDateEnd) >= datePHPtoJS(jArrayName[j][2]) && datePHPtoJS(jDateEnd) <= datePHPtoJS(jArrayName[j][3])) {
       //alert (" should see error message");  
          msg (ifld, "error", "The End Date cannot be between "+jArrayName[j][2]+" and "+jArrayName[j][3]);
          setfocus(vfld);
          return false;
          }
        //alert ("test 5");
        msg (ifld, "error", "The Beginning and End Dates cannot overlap dates already chosen");
        setfocus(vfld);
        return false;
        }
      }
    }
  msg (ifld, "error", "");
  return true;
  };
  //    alert("NE1: "+jArrayName[j][0]+"=="+jRoomType+"AND"+jArrayName[j][1]+"=="+jRoomName);
  //    alert("NE2 "+jArrayName[j][0]+"=="+jRoomType+"AND"+jArrayName[j][1]+"=="+jRoomName);

// ****************************************************************************
//    sub routine for date validation 
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valDates(qtyRooms) {
  var testQty = qtyRooms.value
  //   alert (testQty)
};


// ****************************************************************************
//    sub routine for date validation 
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valRadioChecked (vfld,   // element to be validated
                          ifld,   // id of element to receive info/error msg
                          nfld )  // name of field
  {
  //alert ("test");
    for (var i = 0; i < vfld.length; i++)  {
      if (vfld[i].checked) break 
	}
    if (i==vfld.length) {
    msg (ifld, "error", "Required");
    setfocus(vfld);
    return false;
    }
msg (ifld, "okay", "");
setfocus(vfld);
return true;
  };

// ****************************************************************************
//    sub routine for date validation 
// Validate if something has been entered
// Returns true if so 
// ****************************************************************************
function valacceptTC (vfld,   // element to be validated
                      ifld,   // id of element to receive info/error msg
                      nfld)   // name of field
  {
  //alert ("vfld.chkd:" + vfld.checked);
    if (vfld.checked == false) {
    msg (ifld, "error", "Must Accept Terms and Conditions to Continue");
    setfocus(vfld);
    return false;
	}
msg (ifld, "okay", "");
setfocus(vfld);
return true;
  };

// *******************************************
//         radio Button
// Validate if something has been entered
// Returns true if so 
// *******************************************
// -------------------------------------------

function radioButton (vfld,   // element to be validated
                      ifld,   // id of element to receive info/error msg
                      nfld )  // name of field
{
  var stat = commonCheck (vfld, ifld, true, nfld);
  alert ("stat: "+stat);
  //  if (stat != proceed) return stat;
  var i = 0;
  var test1 = false;
  for(i=0; i<3; i++) {
   if (document.forms.nonMemberLogin.travelerTitle[i].checked) test1=true;
  }
  msg (vfld, "okay", nfld);  
  return false;
//  return true;
};

// -----------------------------------------
//            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, "warn", "");  
  return true;
};




function viewTC() {
  var features = "width=500, height=600, resizable=1, status=1, scrollbars=1"
  TC = window.open("/affiliates/termsConditions.html", "TC", features)
  TC.focus()
  }
