function highlight( element, value )
{ element.className = value; return true;
}

function displayDate()
{ var months = new Array ( "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" );
  var days   = new Array ( "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" );
  var now = new Date();
  var year = now.getYear();
  if ( year < 1000 ) year += 1900;
  document.writeln ( days[now.getDay()] + ", " + months[now.getMonth()] + " " + now.getDate() + ", " + year );
}

var daysInMonth=new Array(12);
daysInMonth[1]=31;
daysInMonth[2]=29;
daysInMonth[3]=31;
daysInMonth[4]=30;
daysInMonth[5]=31;
daysInMonth[6]=30;
daysInMonth[7]=31;
daysInMonth[8]=31;
daysInMonth[9]=30;
daysInMonth[10]=31;
daysInMonth[11]=30;
daysInMonth[12]=31;
var whitespace = " \t\n\r";
var phoneNumberDelimiters = "()- ";

var iStateCode = "This field must be a valid two character U.S. state abbreviation (like CA for California). Please reenter it now."
var iZIPCode = "This field must be a 5 or 9 digit U.S. ZIP Code (like 94043). Please reenter it now."
var iUSPhone = "This field must be a 10 digit U.S. phone number (like 415 555 1212). Please reenter it now."
var iEmail = "This field must be a valid email address (like foo@bar.com). Please reenter it now."
var iDay = "This field must be a day number between 1 and 31.  Please reenter it now."
var iMonth = "This field must be a month number between 1 and 12.  Please reenter it now."
var iYear = "This field must be a 2 or 4 digit year number.  Please reenter it now."
var iDatePrefix = "The Day, Month, and Year for "
var iDateSuffix = " do not form a valid date.  Please reenter them now."
var defaultEmptyOK = false

var USStateCodeDelimiter = "|";
var USStateCodes = "AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY|AE|AA|AE|AE|AP|al|ak|as|az|ar|ca|co|ct|de|dc|fm|fl|ga|gu|hi|id|il|in|ia|ks|ky|la|me|mh|md|ma|mi|mn|ms|mo|mt|ne|nv|nh|nj|nm|ny|nc|nd|mp|oh|ok|or|pw|pa|pr|ri|sc|sd|tn|tx|ut|vt|vi|va|wa|wv|wi|wy|ae|aa|ae|ae|ap";

function isEmpty(s)
{ return ((s == null) || (s.length == 0))
}

function isWhitespace (s)
{ var i;
  if (isEmpty(s)) return true;
  for (i=0; i<s.length; i++)
  {   var c = s.charAt(i);
    if (whitespace.indexOf(c)==-1) return false;
  }
  return true;
}

function stripCharsInBag (s, bag)
{ var i;
  var returnString = "";
  for (i=0; i<s.length; i++)
  {   var c=s.charAt(i);
    if (bag.indexOf(c)==-1) returnString += c;
  }
  return returnString;
}

function stripCharsNotInBag (s, bag)
{ var i;
  var returnString = "";
  for (i=0; i<s.length; i++)
  {   var c=s.charAt(i);
    if (bag.indexOf(c)!=-1) returnString += c;
  }
  return returnString;
}

function stripWhitespace (s)
{ return stripCharsInBag (s, whitespace)
}

function charInString (c, s)
{ for (i=0; i<s.length; i++)
  {   if (s.charAt(i)==c) return true;
  }
  return false
}

function stripInitialWhitespace (s)
{ var i = 0;
  while ((i<s.length) && charInString (s.charAt(i),whitespace))
   i++;
  return s.substring (i,s.length);
}

function isLetter (c)
{ return (((c>="a") && (c<="z")) || ((c>="A") && (c<="Z")))
}

function isDigit (c)
{ return ((c>="0") && (c<="9"))
}

function isLetterOrDigit (c)
{ return (isLetter(c) || isDigit(c))
}

function isInteger (s)
{ var i;
  if (isEmpty(s)) 
   if (isInteger.arguments.length == 1) return defaultEmptyOK;
   else return (isInteger.arguments[1] == true);
  for (i=0; i<s.length; i++)
  {   var c=s.charAt(i);
    if (!isDigit(c)) return false;
  }
  return true;
}

function isSignedInteger (s)
{ if (isEmpty(s)) 
   if (isSignedInteger.arguments.length == 1) return defaultEmptyOK;
   else return (isSignedInteger.arguments[1] == true);
  else {
    var startPos = 0;
    var secondArg = defaultEmptyOK;
    if (isSignedInteger.arguments.length > 1)
      secondArg = isSignedInteger.arguments[1];
    if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
      startPos = 1;    
    return (isInteger(s.substring(startPos, s.length), secondArg))
  }
}

function isNonnegativeInteger (s)
{ var secondArg = defaultEmptyOK;
  if (isNonnegativeInteger.arguments.length > 1)
    secondArg = isNonnegativeInteger.arguments[1];
  return (isSignedInteger(s, secondArg)
    && ( (isEmpty(s) && secondArg)  || (parseInt (s) >= 0) ) );
}

function reformat (s)
{ var arg;
  var sPos = 0;
  var resultString = "";
  for (var i = 1; i < reformat.arguments.length; i++) {
    arg = reformat.arguments[i];
    if (i % 2 == 1) resultString += arg;
    else {
      resultString += s.substring(sPos, sPos + arg);
      sPos += arg;
    }
  }
  return resultString;
}

function isUSPhoneNumber (s)
{ if (isEmpty(s)) 
     if (isUSPhoneNumber.arguments.length == 1) return defaultEmptyOK;
     else return (isUSPhoneNumber.arguments[1] == true);
  return (isInteger(s) && s.length == 10)
}


function isZIPCode (s)
{ if (isEmpty(s)) 
    if (isZIPCode.arguments.length == 1) return defaultEmptyOK;
    else return (isZIPCode.arguments[1] == true);
  return (isInteger(s) && ((s.length == 5) || (s.length == 9)))
}

function isStateCode(s)
{ if (isEmpty(s)) 
    if (isStateCode.arguments.length == 1) return defaultEmptyOK;
    else return (isStateCode.arguments[1] == true);
  return ( (USStateCodes.indexOf(s) != -1) && (s.indexOf(USStateCodeDelimiter) == -1) )
}

function isEmail (s)
{ if (isEmpty(s)) 
    if (isEmail.arguments.length == 1) return defaultEmptyOK;
    else return (isEmail.arguments[1] == true);
   
  if (isWhitespace(s)) return false;
  var i = 1;
  var sLength = s.length;
  while ((i < sLength) && (s.charAt(i) != "@"))
  { i++
  }
  if ((i >= sLength) || (s.charAt(i) != "@")) return false;
  else i += 2;
  while ((i < sLength) && (s.charAt(i) != "."))
  { i++
  }
  if ((i >= sLength - 1) || (s.charAt(i) != ".")) return false;
  else return true;
}

function isYear (s)
{ if (isEmpty(s)) 
   if (isYear.arguments.length == 1) return defaultEmptyOK;
   else return (isYear.arguments[1] == true);
  if (!isNonnegativeInteger(s)) return false;
  return ((s.length == 2) || (s.length == 4));
}

function isIntegerInRange (s, a, b)
{ if (isEmpty(s)) 
   if (isIntegerInRange.arguments.length == 1) return defaultEmptyOK;
   else return (isIntegerInRange.arguments[1] == true);
  if (!isInteger(s, false)) return false;
  var num = parseInt (s);
  return ((num >= a) && (num <= b));
}

function isMonth (s)
{ if (isEmpty(s)) 
   if (isMonth.arguments.length == 1) return defaultEmptyOK;
   else return (isMonth.arguments[1] == true);
  return isIntegerInRange (s, 1, 12);
}

function isDay (s)
{ if (isEmpty(s)) 
   if (isDay.arguments.length == 1) return defaultEmptyOK;
   else return (isDay.arguments[1] == true);   
  return isIntegerInRange (s, 1, 31);
}

function daysInFebruary (year)
{ return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
}

function isDate (year, month, day)
{ if (! (isYear(year, false) && isMonth(month, false) && isDay(day, false))) return false;
  var intYear = parseInt(year);
  var intMonth = parseInt(month);
  var intDay = parseInt(day);
  if (intDay > daysInMonth[intMonth]) return false; 
  if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;
  return true;
}

function warnInvalid (theField, s)
{ theField.focus()
  theField.select()
  alert(s)
  return false
}

function checkStateCode (theField, emptyOK)
{ if (checkStateCode.arguments.length == 1) emptyOK = defaultEmptyOK;
  if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  else
  {  theField.value = theField.value.toUpperCase();
     if (!isStateCode(theField.value, false)) 
        return warnInvalid (theField, iStateCode);
     else return true;
  }
}

function reformatZIPCode (ZIPString)
{ if (ZIPString.length == 5) return ZIPString;
  else return (reformat (ZIPString, "", 5, "-", 4));
}

function checkZIPCode (theField, emptyOK)
{ if (checkZIPCode.arguments.length == 1) emptyOK = defaultEmptyOK;
  if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  else
  { var normalizedZIP = stripCharsInBag(theField.value, "-")
    if (!isZIPCode(normalizedZIP, false)) 
       return warnInvalid (theField, iZIPCode);
    else 
    { theField.value = reformatZIPCode(normalizedZIP)
      return true;
    }
  }
}

function reformatUSPhone (USPhone)
{return (reformat (USPhone, "(", 3, ") ", 3, "-", 4)) }

function checkUSPhone (theField, emptyOK)
{ if (checkUSPhone.arguments.length == 1) emptyOK = defaultEmptyOK;
  if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  else
  {  var normalizedPhone = stripCharsInBag(theField.value, phoneNumberDelimiters)
   if (!isUSPhoneNumber(normalizedPhone, false)) 
    return warnInvalid (theField, iUSPhone);
   else 
   {  // if you don't want to reformat as (123) 456-789, comment next line out
    theField.value = reformatUSPhone(normalizedPhone)
    return true;
   }
  }
}

function checkEmail (theField, emptyOK)
{ if (checkEmail.arguments.length == 1) emptyOK = defaultEmptyOK;
  if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  else if (!isEmail(theField.value, false)) 
   return warnInvalid (theField, iEmail);
  else return true;
}

function checkYear (theField, emptyOK)
{ if (checkYear.arguments.length == 1) emptyOK = defaultEmptyOK;
  if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  if (!isYear(theField.value, false)) 
   return warnInvalid (theField, iYear);
  else return true;
}

function checkMonth (theField, emptyOK)
{ if (checkMonth.arguments.length == 1) emptyOK = defaultEmptyOK;
  if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  if (!isMonth(theField.value, false)) 
   return warnInvalid (theField, iMonth);
  else return true;
}

function checkDay (theField, emptyOK)
{ if (checkDay.arguments.length == 1) emptyOK = defaultEmptyOK;
  if ((emptyOK == true) && (isEmpty(theField.value))) return true;
  if (!isDay(theField.value, false)) 
   return warnInvalid (theField, iDay);
  else return true;
}

function checkDate (yearField, monthField, dayField, labelString, OKtoOmitDay)
{if (checkDate.arguments.length == 4) OKtoOmitDay = false;
 if (!isYear(yearField.value)) return warnInvalid (yearField, iYear);
 if (!isMonth(monthField.value)) return warnInvalid (monthField, iMonth);
 if ( (OKtoOmitDay == true) && isEmpty(dayField.value) ) return true;
 else if (!isDay(dayField.value)) 
    return warnInvalid (dayField, iDay);
 if (isDate (yearField.value, monthField.value, dayField.value))
    return true;
 alert (iDatePrefix + labelString + iDateSuffix)
 return false
}

function isAlphanumeric (s)
{ var i;
  if (isEmpty(s)) 
     if (isAlphanumeric.arguments.length == 1) return defaultEmptyOK;
     else return (isAlphanumeric.arguments[1] == true);
  for (i = 0; i < s.length; i++)
  {   
    var c = s.charAt(i);
    if (! (isLetter(c) || isDigit(c) ) )
    return false;
  }
  return true;
}
