// BASED ON FORM GUARD:
// 	Form Guard
// 	Copyright Xin Yang 2003, 2004
// 	Web Site: www.yxScripts.com
// 	EMail: m_yangxin@hotmail.com
// 	Last Updated: Sep-01-2004
// 	This script is free as long as the copyright notice remains intact.
// WITH SOME ADDITIONS/CHANGES BY GERARD GLEESON
// to consolidate all error messages
var totalAlert="";
// form submit counter
var submitCounter=0;
// regular expressions used by checking functions
var reNonBlank=/[\S]/;
var reHexColor=/^#[0-9a-fA-F]{6}$/;
var reInt=/^\d+$/;
var reSignedInt=/^(\+|-)?\d+$/;
var reFloat=/^\d+(\.\d+)?$/;
var reSignedFloat=/^(\+|-)?\d+(\.\d+)?$/;
var reChar=/^[\w\-]+$/;
// GG Note: This is not the reEmail expression from the original Form Guard
// script, instead I used the expression from "JavaScript & DHTML Cookbook",
// by Danny Goodman (pub. O'Reilly, 2003). The original rejected single
// character names (e.g. a@domain.com) which are valid.
var reEMail=/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;
var reIP=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
var rePostalCA=/^(\w\d){3}$/;
var reURL=/^http(s)?\:\/\/\w[\w\-]+(\.\w[\w\-]+)+([\/\%\?\&\+\#\.\w\-]+)*$/;
function rpChar(f) {
  var df=f;
  df=df.replace(/\\/g, '\\\\');
  df=df.replace(/\//g, '\\\/');
  df=df.replace(/\[/g, '\\\[');
  df=df.replace(/\]/g, '\\\]');
  df=df.replace(/\(/g, '\\\(');
  df=df.replace(/\)/g, '\\\)');
  df=df.replace(/\{/g, '\\\{');
  df=df.replace(/\}/g, '\\\}');
  df=df.replace(/\</g, '\\\<');
  df=df.replace(/\>/g, '\\\>');
  df=df.replace(/\|/g, '\\\|');
  df=df.replace(/\*/g, '\\\*');
  df=df.replace(/\?/g, '\\\?');
  df=df.replace(/\+/g, '\\\+');
  df=df.replace(/\^/g, '\\\^');
  df=df.replace(/\$/g, '\\\$');
  return df;
}
function rePhone(f) {
  var df=rpChar(f);
  df=df.replace(/d/gi, '\\d');
  df=df.replace(/w/gi, '(\\w|\\d)');
  return new RegExp('^'+df+'$');
}
function reDate(f) {
  var df=rpChar(f);
  df=df.replace(/dd/gi, '\\d\\d');
  df=df.replace(/mm/gi, '\\d\\d');
  df=df.replace(/yyyy/gi, '\\d\\d\\d\\d');
  return new RegExp('^'+df+'$');
}
function reCharNM(n,m) {
  return new RegExp("\^[\\w\\-]{"+n+","+m+"}\$");
}
function reNumberN(n,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{1,"+n+"}\$");
}
function reNumberN2(n,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{"+n+"}\$");
}
function reNumberNM(n,m,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{1,"+n+"}(\\.\\d{1,"+m+"})?\$");
}
function reNumberNM2(n,m,mode) {
  return new RegExp("\^"+(mode!=0?"(\\+\|-)?":"")+"\\d{"+n+"}\\.\\d{"+m+"}\$");
}
// wrapper functions
function _checkValue(re, value, msg, mode) {
  if (!re.test(value)) {
    _alertIt(msg, mode);
    return (mode && mode==1)?true:false;
  }
  return true;
}
function _alertIt(msg, mode) {
  if (mode) {
    totalAlert+=msg+"\n";
  }
  else {
    totalAlert="";
    alert(msg);
  }
}
function _checkIt(re, field, msg, mode) {
  if (!re.test(field.value)) {
    _alertIt(msg, mode);
    if (field.select) {
      field.select();
    }
    if (field.focus) {
      field.focus();
    }
    return (mode && mode==1)?true:false;
  }
  return true;
}
function noErrors() {
  if (totalAlert=="") {
    return true;
  }
  else {
    alert(totalAlert);
    totalAlert="";
    return false;
  }
}
// the checking functions
function goodPasswords(field1, field2, msg1, msg2, mode) {
  if (nonBlank(field1, msg1, mode?2:0) && nonBlank(field2, msg1, mode?2:0)) {
    if (field1.value == field2.value) {
      return true;
    }
    else {
      _alertIt(msg2, mode);
    }
  }
  return (mode && mode==1)?true:false;
}
function goodPasswordsLen(field1, field2, n, m, msg1, msg2, msg3, mode) {
  if (nonBlank(field1, msg1, mode?2:0) && nonBlank(field2, msg1, mode?2:0)) {
    if (field1.value == field2.value) {
      if (goodCharLen(n, m, field1, msg3, mode?2:0)) {
        return true;
      }
    }
    else {
      _alertIt(msg2, mode);
    }
  }
  return (mode && mode==1)?true:false;
}
function goodEMails(field1, field2, msg1, msg2, mode) {
  if (goodEMail(field1, msg1, mode?2:0) && goodEMail(field2, msg1, mode?2:0)) {
    if (field1.value == field2.value) {
      return true;
    }
    else {
      _alertIt(msg2, mode);
    }
  }
  return (mode && mode==1)?true:false;
}
function goodEMail2(value, msg, mode) {
  return _checkValue(reEMail, value, msg, mode);
}
function goodMultiEMails(field, msg, mode) {
  var values = field.value.split(/\s*[,;]\s*/), allGood = reNonBlank.test(field.value);
  if (!allGood) {
    _alertIt(msg, mode);
  }
  for (var i = 0; i < values.length && allGood; i++) {
    if (reNonBlank.test(values[i])) {
      allGood = goodEMail2(values[i], msg, mode?2:0);
    }
  }
  return allGood?true:(mode && mode==1)?true:false;
}
function goodPhone(pf, field, msg, mode) {
  return _checkIt(rePhone(pf), field, msg, mode);
}
function goodPostalCA(field, msg, mode) {
  return _checkIt(rePostalCA, field, msg, mode);
}
function goodDate(df, field, msg, mode) {
  if (_checkIt(reDate(df), field, msg, mode?2:0)) {
    var di=field.value;
    var y4=df.search(/yyyy/i), y=di.substring(y4, y4+4)-0;
    var m2=df.search(/mm/i), m=di.substring(m2, m2+2)-1;
    var d2=df.search(/dd/i), d=di.substring(d2, d2+2)-0;
    var dd=new Date(y, m, d);
    if (y==dd.getFullYear() && m==dd.getMonth() && d==dd.getDate()) {
      return true;
    }
    else {
      _alertIt(msg, mode);
      field.select();
      field.focus();
    }
  }
  return (mode && mode==1)?true:false;
}
function goodIP(field, msg, mode) {
  return _checkIt(reIP, field, msg, mode);
}
function goodChar(field, msg, mode) {
  return _checkIt(reChar, field, msg, mode);
}
function goodEMail(field, msg, mode) {
  return _checkIt(reEMail, field, msg, mode);
}
function goodInt(field, msg, mode) {
  return _checkIt(reInt, field, msg, mode);
}
function goodSignedInt(field, msg, mode) {
  return _checkIt(reSignedInt, field, msg, mode);
}
function goodFloat(field, msg, mode) {
  return _checkIt(reFloat, field, msg, mode);
}
function goodSignedFloat(field, msg, mode) {
  return _checkIt(reSignedFloat, field, msg, mode);
}
function goodIntLen(n, field, msg, mode) {
  return _checkIt(reNumberN(n,0), field, msg, mode);
}
function goodSignedIntLen(n, field, msg, mode) {
  return _checkIt(reNumberN(n,1), field, msg, mode);
}
function goodIntLen2(n, field, msg, mode) {
  return _checkIt(reNumberN2(n,0), field, msg, mode);
}
function goodSignedIntLen2(n, field, msg, mode) {
  return _checkIt(reNumberN2(n,1), field, msg, mode);
}
function goodCharLen(n, m, field, msg, mode) {
  return _checkIt(reCharNM(n,m), field, msg, mode);
}
function goodFloatLen(n, m, field, msg, mode) {
  return _checkIt(reNumberNM(n,m,0), field, msg, mode);
}
function goodSignedFloatLen(n, m, field, msg, mode) {
  return _checkIt(reNumberNM(n,m,1), field, msg, mode);
}
function goodFloatLen2(n, m, field, msg, mode) {
  return _checkIt(reNumberNM2(n,m,0), field, msg, mode);
}
function goodSignedFloatLen2(n, m, field, msg, mode) {
  return _checkIt(reNumberNM2(n,m,1), field, msg, mode);
}
function _rangeIt(field, r1, r2, msg, mode) {
  if (field.value>=r1 && field.value<=r2) {
    return true;
  }
  else {
    _alertIt(msg, mode);
    field.select();
    field.focus();
    return (mode && mode==1)?true:false;
  }
}
function rangeInt(field, r1, r2, msg, mode) {
  if (goodInt(field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }
  return (mode && mode==1)?true:false;
}
function rangeSignedInt(field, r1, r2, msg, mode) {
  if (goodSignedInt(field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }
  return (mode && mode==1)?true:false;
}
function rangeFloat(field, r1, r2, msg, mode) {
  if (goodFloat(field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }
  return (mode && mode==1)?true:false;
}
function rangeSignedFloat(field, r1, r2, msg, mode) {
  if (goodSignedFloat(field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }
  return (mode && mode==1)?true:false;
}
function rangeIntLen(n, field, r1, r2, msg, mode) {
  if (goodIntLen(n, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }
  return (mode && mode==1)?true:false;
}
function rangeSignedIntLen(n, field, r1, r2, msg, mode) {
  if (goodSignedIntLen(n, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }
  return (mode && mode==1)?true:false;
}
function rangeIntLen2(n, field, r1, r2, msg, mode) {
  if (goodIntLen2(n, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }
  return (mode && mode==1)?true:false;
}
function rangeSignedIntLen2(n, field, r1, r2, msg, mode) {
  if (goodSignedIntLen2(n, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }
  return (mode && mode==1)?true:false;
}
function rangeFloatLen(n, m, field, r1, r2, msg, mode) {
  if (goodFloatLen(n, m, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }
  return (mode && mode==1)?true:false;
}
function rangeSignedFloatLen(n, m, field, r1, r2, msg, mode) {
  if (goodSignedFloatLen(n, m, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }
  return (mode && mode==1)?true:false;
}
function rangeFloatLen2(n, m, field, r1, r2, msg, mode) {
  if (goodFloatLen2(n, m, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }
  return (mode && mode==1)?true:false;
}
function rangeSignedFloatLen2(n, m, field, r1, r2, msg, mode) {
  if (goodSignedFloatLen2(n, m, field, msg, mode?2:0)) {
    return _rangeIt(field, r1, r2, msg, mode);
  }
  return (mode && mode==1)?true:false;
}
function _dd(n) {
  return (n<10)?"0"+n:""+n;
}
function _getOffset(n) {
  var d=new Date();
  if (n!=0) {
    d.setTime(d.getTime()+n*86400000);
  }
  return d.getFullYear()+""+_dd(d.getMonth()+1)+""+_dd(d.getDate())+"";
}
function _stringIt(df, d) {
  var y4=df.search(/yyyy/i), m2=df.search(/mm/i), d2=df.search(/dd/i);
  return d.substring(y4, y4+4)+d.substring(m2, m2+2)+d.substring(d2, d2+2);
}
function rangeDate(df, field, r1, r2, msg, mode) {
  if (goodDate(df, field, msg, mode?2:0)) {
    var d=_stringIt(df, field.value);
    var r1x="", r2x="";
    if (r1.search(/^\d+$/)!=-1) {
      r1x=_getOffset(r1-0);
    }
    else {
      r1x=_stringIt(df, r1);
    }
    if (r2.search(/^\d+$/)!=-1) {
      r2x=_getOffset(r2-0);
    }
    else {
      r2x=_stringIt(df, r2);
    }
    if (d<r1x || d>r2x) {
      _alertIt(msg, mode);
      field.select();
      field.focus();
    }
    else {
      return true;
    }
  }
  return (mode && mode==1)?true:false;
}
function goodDateRange(df, field1, field2, msg, mode) {
  if (goodDate(df, field1, msg, mode?2:0) && goodDate(df, field2, msg, mode?2:0)) {
    if (_stringIt(df, field1.value)>_stringIt(df, field2.value)) {
      _alertIt(msg, mode);
      field1.focus();
    }
    else {
      return true;
    }
  }
  return (mode && mode==1)?true:false;
}
function goodDateRange2(df, field1, field2, msg, mode) {
  if (goodDate(df, field1, msg, mode?2:0) && goodDate(df, field2, msg, mode?2:0)) {
    if (_stringIt(df, field1.value)>=_stringIt(df, field2.value)) {
      _alertIt(msg, mode);
      field1.focus();
    }
    else {
      return true;
    }
  }
  return (mode && mode==1)?true:false;
}
function goodHexColor(field, msg, mode) {
  return _checkIt(reHexColor, field, msg, mode);
}
function nonBlank(field, msg, mode) {
  if (field.type) {
    if (/file|select|text|password/.test(field.type)) {
      return _checkIt(reNonBlank, field, msg, mode);
    }
    else if (/radio|checkbox/.test(field.type)) {
      if (field.checked) {
        return true;
      }
      else {
        _alertIt(msg, mode);
        field.focus();
        return (mode && mode==1)?true:false;
      }
    }
    else {
      _alertIt("Invalid field for nonBlank() checking", mode);
      return (mode && mode==1)?true:false;
    }
  }
  else if (field.length && field[0].type && /radio|checkbox/.test(field[0].type)) {
    for (var i=0; i<field.length; i++) {
      if (field[i].checked) { return true; }
    }
    _alertIt(msg, mode);
    field[0].focus();
    return (mode && mode==1)?true:false;
  }
  else {
    _alertIt("Invalid field for nonBlank() checking", mode);
    return (mode && mode==1)?true:false;
  }
}
function goodRadioedFields(form, fn, re, msgs, msg, mode) {
  for (var i=0; i<form[fn].length; i++) {
    if (form[fn][i].checked) {
      return _checkIt(re, form[form[fn][i].value], msgs[i], mode);
    }
  }
  _alertIt(msg, mode);
  return (mode && mode==1)?true:false;
}
function goodRadioedFields2(form, fn, re, msgs, msg, mode) {
  for (var i=0; i<form[fn].length; i++) {
    if (form[fn][i].checked) {
      return _checkIt(re[i], form[form[fn][i].value], msgs[i], mode);
    }
  }
  _alertIt(msg, mode);
  return (mode && mode==1)?true:false;
}
function noBadWords(field, strict, words, msg, mode) {
  var lw=[], nwb=strict?'':'\\b';
  for (var i=0; i<words.length; i++) {
    lw[i]=nwb+words[i].toLowerCase()+nwb;
  }
  var re=new RegExp(lw.join("|"), "i");
  if (re.test(field.value)) {
    _alertIt(msg, mode);
    return (mode && mode==1)?true:false;
  }
  else {
    return true;
  }
}
// credit card checking codes taken from Netscape LivePayment samples codes and modified to fit Form Guard
function goodCreditCard(field, msg, mode) {
  var sum=0, mul=1, l=field.value.length;
  var digit, tproduct;
  if (_checkIt(reInt, field, msg, mode?2:0)) {
    for (var i=0; i<l; i++) {
      digit=field.value.substring(l-i-1,l-i);
      tproduct=parseInt(digit ,10)*mul;
      if (tproduct>=10) {
        sum+=(tproduct%10)+1;
      }
      else {
        sum+=tproduct;
      }
      if (mul==1) {
        mul++;
      }
      else {
        mul--;
      }
    }
    if ((sum%10)==0) {
      return true;
    }
    else {
      _alertIt(msg, mode);
      return (mode && mode==1)?true:false;
    }
  }
}
function goodVisa(field, msg, mode) {
  if ((field.value.length==16 || field.value.length==13) && field.value.substring(0,1)==4) {
    return goodCreditCard(field, msg, mode);
  }
  else {
    _alertIt(msg, mode);
    return (mode && mode==1)?true:false;
  }
}
function goodMasterCard(field, msg, mode) {
  var firstdig=field.value.substring(0,1), seconddig=field.value.substring(1,2);
  if (field.value.length==16 && firstdig==5 && (seconddig>=1 && seconddig<=5)) {
    return goodCreditCard(field, msg, mode);
  }
  else {
    _alertIt(msg, mode);
    return (mode && mode==1)?true:false;;
  }
}
function goodAmericanExpress(field, msg, mode) {
  var firstdig=field.value.substring(0,1), seconddig=field.value.substring(1,2);
  if (field.value.length==15 && firstdig==3 && (seconddig==4 || seconddig==7)) {
    return goodCreditCard(field, msg, mode);
  }
  else {
    _alertIt(msg, mode);
    return (mode && mode==1)?true:false;;
  }
}
function goodDinersClub(field, msg, mode) {
  var firstdig=field.value.substring(0,1), seconddig=field.value.substring(1,2);
  if (field.value.length==14 && firstdig==3 && (seconddig==0 || seconddig==6 || seconddig==8)) {
    return goodCreditCard(field, msg, mode);
  }
  else {
    _alertIt(msg, mode);
    return (mode && mode==1)?true:false;;
  }
}
function goodCarteBlanche(field, msg, mode) {
  return goodDinersClub(field, msg, mode);
}
function goodDiscover(field, msg, mode) {
  var first4digs=field.value.substring(0,4);
  if (field.value.length==16 && first4digs=="6011") {
    return goodCreditCard(field, msg, mode);
  }
  else {
    _alertIt(msg, mode);
    return (mode && mode==1)?true:false;;
  }
}
function goodEnRoute(field, msg, mode) {
  var first4digs=field.value.substring(0,4);
  if (field.value.length==15 && (first4digs=="2014" || first4digs=="2149")) {
    return goodCreditCard(field, msg, mode);
  }
  else {
    _alertIt(msg, mode);
    return (mode && mode==1)?true:false;;
  }
}
function goodJCB(field, msg, mode) {
  var first4digs=field.value.substring(0,4);
  if (field.value.length==16 && (first4digs=="3088" || first4digs=="3096" || first4digs=="3112" || first4digs=="3158" || first4digs=="3337" || first4digs=="3528")) {
    return goodCreditCard(field, msg, mode);
  }
  else {
    _alertIt(msg, mode);
    return (mode && mode==1)?true:false;;
  }
}
function notSubmitted(msg) {
  if (submitCounter==0) {
    submitCounter=1;
    return true;
  }
  else {
    alert(msg);
    return false;
  }
}
function goodURL(field, msg, mode) {
  return _checkIt(reURL, field, msg, mode);
}
function validRequired(formField,fieldLabel)
{
  var result = true;

  if (formField.value == "")
  {
    alert('Please enter a value for the "' + fieldLabel +'" field.');
    formField.focus();
    result = false;
  }

  return result;
}
function goodStringLen(n, m, field, msg) {
  var str = field.value;
  if ((str == null) || (str.length < n) || (str.length > m)) {
    alert(msg);
    return false;
  } else {
    return true;
  }
}
function mygoodPhone(field, msg) {
  // hard-coded to "(ddd) ddd-dddd" format, but allow trailing information such as ext. or comment
  var str = field.value;
  if ((str == null) || (str.length < 14)) {
    alert(msg);
    field.focus();
    return false;
  }
  if (field.value.substring(0,1) != "(") {
    alert(msg);
    field.focus();
    return false;
  }
  if (field.value.substring(4,6) != ") ") {
    alert(msg);
    field.focus();
    return false;
  }
  if (field.value.substring(9,10) != "-") {
    alert(msg);
    field.focus();
    return false;
  }
  var d1 = field.value.substring(1,4);
  var d2 = field.value.substring(6,9);
  var d3 = field.value.substring(10,14);
  var nums = d1 + d2 + d3;
  nums = nums.toString();
  if (!nums.match(reInt)) {
    alert(msg);
    field.focus();
    return false;
  }
  return true;
}

function validateChangePasswordForm(theForm)
{
  // Customize these calls for your form
  // Start ------->
  if (!validRequired(theForm.password,"Old Password"))
    return false;
  if (!goodPasswordsLen(theForm.password1, theForm.password2, 8, 16, "Please input both New Password fields", "New Passwords do not match, please try again", "Passwords must be between 8 and 16 characters in length."))
    return false;
  // <--------- End

  return true;
}


function validateContactForm()
{
  // In order to be XHTML 1.0 Strict compliant we can't use the name attribute on a form	
  var theForm = document.getElementById("contactForm");
  
  // Customize these calls for your form
  // Start ------->

  if (!validRequired(theForm.contactpurpose, "Contact Purpose"))
    return false;

  if (!validRequired(theForm.first_name, "First Name"))
    return false;
    
  if (!validRequired(theForm.last_name, "Last Name"))
    return false;
    
  if (!validRequired(theForm.address, "Street Address"))
    return false;
    
  if (!validRequired(theForm.town, "Town/City"))
    return false;

  if (!validRequired(theForm.email, "Email Address"))
    return false;

  if (theForm.email.value) {
    if (!goodEMail(theForm.email, "Invalid Email address, format should be user@sitename.type"))
      return false;
  }
  
  if (!validRequired(theForm.questionsandcomments, "Message"))
    return false;
    
  // <--------- End

  return true;
}

function validatetripForm ()
{
  // In order to be XHTML 1.0 Strict compliant we can't use the name attribute on a form
  var theForm = document.getElementById("edit_trip");

  // Customize these calls for your form
  // Start ------->

  if ((theForm.rider_id.value == "") && (theForm.rider_first_name.value == "") && (theForm.rider_last_name.value == "")) {
    alert ("Select an existing rider or enter a new rider.")
    theForm.rider_id.focus();
    return false;
  }
  if (theForm.rider_id.value == "") {
    
    if (!validRequired(theForm.rider_first_name, "First Name"))
      return false;
    
    if (!validRequired(theForm.rider_last_name, "Last Name"))
      return false;
    
    if (!validRequired(theForm.rider_primary_phone, "Primary Phone"))
      return false;
    
    if (theForm.rider_email.value) {
      if (!goodEMail(theForm.rider_email, "Invalid Email address, format should be user@sitename.type"))
        return false;
    }
    
    if (!validRequired(theForm.rider_home_street_address, "Home Street Address"))
      return false;
    
    if (!validRequired(theForm.rider_home_zip, "Home ZIP"))
      return false;
    
  }

  if ((theForm.destination_same_as_home.value == "No") && (theForm.destination_id.value == "") && (theForm.destination_name.value == "") && (theForm.destination_street_address.value == "")) {
    alert ("Select an existing destination or enter a new destination.")
    theForm.destination_id.focus();
    return false;
  }

  if ((theForm.destination_same_as_home.value == "No") && (theForm.destination_id.value == "")) {
    // entering a new destination

    if (!validRequired(theForm.destination_name, "Destination Name"))
      return false;

    if (!validRequired(theForm.destination_street_address, "Destination Street Address"))
      return false;

    if (!validRequired(theForm.destination_zip, "Destination ZIP"))
      return false;

  }

  if (theForm.recurring.value == "no") {

    if (!validRequired(theForm.trip_month, "Date of Trip"))
      return false;

    if (!validRequired(theForm.trip_day, "Date of Trip"))
      return false;

    if (!validRequired(theForm.trip_year, "Date of Trip"))
      return false;

  } else {

    if (!validRequired(theForm.from_month, "From Date"))
      return false;

    if (!validRequired(theForm.from_day, "From Date"))
      return false;

    if (!validRequired(theForm.from_year, "From Date"))
      return false;

    if (!validRequired(theForm.to_month, "To Date"))
      return false;

    if (!validRequired(theForm.to_day, "To Date"))
      return false;

    if (!validRequired(theForm.to_year, "To Date"))
      return false;

  }

  if (!validRequired(theForm.estimated_total_hours, "Total estimated time for Trip"))
    return false;

  if (!goodFloat(theForm.estimated_total_hours, "Total estimated time for Trip should be a decimal number"))
    return false;

  if ((theForm.driver_user_id.value != "") && (theForm.other_provider_id.value != "")) {
    alert ("Select an existing driver or another provider, but not both.")
    return false;
  }

}


function validatetripFormMin ()
{
  // In order to be XHTML 1.0 Strict compliant we can't use the name attribute on a form
  var theForm = document.getElementById("edit_trip");

  // Customize these calls for your form
  // Start ------->

  if ((theForm.rider_id.value == "") && (theForm.rider_first_name.value == "") && (theForm.rider_last_name.value == "")) {
    alert ("Select an existing rider or enter a new rider.")
    theForm.rider_id.focus();
    return false;
  }
  if (theForm.rider_id.value == "") {

    if (!validRequired(theForm.rider_first_name, "First Name"))
      return false;

    if (!validRequired(theForm.rider_last_name, "Last Name"))
      return false;

    if (theForm.rider_email.value) {
      if (!goodEMail(theForm.rider_email, "Invalid Email address, format should be user@sitename.type"))
        return false;
    }

  }

  if ((theForm.destination_same_as_home.value == "No") && (theForm.destination_id.value == "") && (theForm.destination_name.value == "") && (theForm.destination_street_address.value == "")) {
    alert ("Select an existing destination or enter a new destination.")
    theForm.destination_id.focus();
    return false;
  }

  if ((theForm.destination_same_as_home.value == "No") && (theForm.destination_id.value == "")) {
    // entering a new destination

    if (!validRequired(theForm.destination_name, "Destination Name"))
      return false;

    if (!validRequired(theForm.destination_street_address, "Destination Street Address"))
      return false;

    if (!validRequired(theForm.destination_zip, "Destination ZIP"))
      return false;

  }

  if (theForm.recurring.value == "no") {

    if (!validRequired(theForm.trip_month, "Date of Trip"))
      return false;

    if (!validRequired(theForm.trip_day, "Date of Trip"))
      return false;

    if (!validRequired(theForm.trip_year, "Date of Trip"))
      return false;

  } else {

    if (!validRequired(theForm.from_month, "From Date"))
      return false;

    if (!validRequired(theForm.from_day, "From Date"))
      return false;

    if (!validRequired(theForm.from_year, "From Date"))
      return false;

    if (!validRequired(theForm.to_month, "To Date"))
      return false;

    if (!validRequired(theForm.to_day, "To Date"))
      return false;

    if (!validRequired(theForm.to_year, "To Date"))
      return false;

  }

  if (theForm.estimated_total_hours.value) {
    if (!goodFloat(theForm.estimated_total_hours, "Total estimated time for Trip should be a decimal number"))
      return false;
  }

  if ((theForm.driver_user_id.value != "") && (theForm.other_provider_id.value != "")) {
    alert ("Select an existing driver or another provider, but not both.")
    return false;
  }

}



function validatedriverUpdate ()
{
  // In order to be XHTML 1.0 Strict compliant we can't use the name attribute on a form
  var theForm = document.getElementById("driver_update");

  // Customize these calls for your form
  // Start ------->
  //alert ("Validate Driver Update");

  if (theForm.miles_travelled_this_leg) {
    if (!goodFloat(theForm.miles_travelled_this_leg, "Miles Travelled this Leg should be a decimal number"))
      return false;
  }

  if (theForm.ret_miles_travelled_this_leg) {
    if (!goodFloat(theForm.ret_miles_travelled_this_leg, "Miles Travelled this Leg should be a decimal number"))
      return false;
  }

  if (theForm.total_miles_driven) {
    if (!goodFloat(theForm.total_miles_driven, "Total Miles Driven should be a decimal number"))
      return false;
  }

  if (theForm.total_hours_spent) {
    if (!goodFloat(theForm.total_hours_spent, "Total Hours Spent should be a decimal number"))
      return false;
  }
}