

var reWhitespace = /^\s+$/ ;



var reLetter = /^[a-zA-Z]$/ ;



var reAlphabetic = /^[a-zA-Z]+$/ ;



var reAlphanumeric = /^[a-zA-Z0-9]+$/ ;



var reDigit = /^\d/ ;



var reLetterOrDigit = /^([a-zA-Z]|\d)$/ ;



var reInteger = /^\d+$/ ;



var reSignedInteger = /^(\+|-)?\d+$/ ;



var reFloat = /^((\d+(\.\d*)?)|((\d*\.)?\d+))$/ ;



var reSignedFloat = /^(((\+|-)?\d+(\.\d*)?)|((\+|-)?(\d*\.)?\d+))$/ ;



var reEmail = /^.+\@.+\..+$/ ;




var digits = "0123456789" ;

var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz" ;

var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;


var whitespace = " \t\n\r" ;


var phoneNumberDelimiters = "()- " ;


var validUSPhoneChars = digits + phoneNumberDelimiters ;


var validWorldPhoneChars = digits + phoneNumberDelimiters + "+" ;


var SSNDelimiters = "- " ;


var validSSNChars = digits + SSNDelimiters;



var digitsInSocialSecurityNumber = 9;



var digitsInUSPhoneNumber = 10;



var ZIPCodeDelimiters = "-";



var ZIPCodeDelimeter = "-"


var validZIPCodeChars = digits + ZIPCodeDelimiters



var digitsInZIPCode1 = 5
var digitsInZIPCode2 = 9


var creditCardDelimiters = " "


var mPrefix = "You did not enter a value into the "
var mSuffix = " field. This is a required field. Please enter it now."


var sUSLastName = "Last Name"
var sUSFirstName = "First Name"
var sWorldLastName = "Family Name"
var sWorldFirstName = "Given Name"
var sTitle = "Title"
var sCompanyName = "Company Name"
var sUSAddress = "Street Address"
var sWorldAddress = "Address"
var sCity = "City"
var sStateCode = "State Code"
var sWorldState = "State, Province, or Prefecture"
var sCountry = "Country"
var sZIPCode = "ZIP Code"
var sWorldPostalCode = "Postal Code"
var sPhone = "Phone Number"
var sFax = "Fax Number"
var sDateOfBirth = "Date of Birth"
var sExpirationDate = "Expiration Date"
var sEmail = "Email"
var sSSN = "Social Security Number"
var sCreditCardNumber = "Credit Card Number"
var sOtherInfo = "Other Information"




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 iWorldPhone = "This field must be a valid international phone number. Please reenter it now."
var iSSN = "This field must be a 9 digit U.S. social security number (like 123 45 6789). Please reenter it now."
var iTIN = "This field must be a 9 digit U.S. tax identification number (like 12 3456789). Please reenter it now."
var iEmail = "This field must be a valid email address (like someone@somewhere.com). Please reenter it now."
var iCreditCardPrefix = "This is not a valid "
var iCreditCardSuffix = " credit card number. (Click the link on this form to see a list of sample numbers.) 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 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 iDateNotInRange = " is too far in past or is in future. Please reenter it now."
var iDateNotInRange2 = " is not in future or too far in the future. Please reenter it now."


var pEntryPrompt = "Please enter a "
var pStateCode = "2 character code (like CA)."
var pZIPCode = "5 or 9 digit U.S. ZIP Code (like 94043)."
var pUSPhone = "10 digit U.S. phone number (like 415 555 1212)."
var pWorldPhone = "international phone number."
var pSSN = "9 digit U.S. social security number (like 123 45 6789)."
var pTIN = "9 digit U.S. tax identification number (like 12 3456789)."
var pEmail = "valid email address (like foo@bar.com)."
var pCreditCard = "valid credit card number."
var pDay = "day number between 1 and 31."
var pMonth = "month number between 1 and 12."
var pYear = "2 or 4 digit year number."


var defaultEmptyOK = false



var daysInMonth = new Array(12);
daysInMonth[1] = 31;
daysInMonth[2] = 29;   // must programmatically check this
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 minDate = new Date(1880, 1, 1);
var maxDate = new Date(2100, 1, 1);


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"




function isEmpty(s)
{   return ((s == null) || (s.length == 0))
}



function isWhitespace (s)

{   // Is s empty?
    return (isEmpty(s) || reWhitespace.test(s));
}



function stripCharsInRE (s, bag)

{       return s.replace(bag, "")
}



function stripCharsInBag (s, bag)

{   var i;
    var returnString = "";

    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }

    return returnString;
}



function stripCharsNotInBag (s, bag)

{   var i;
    var returnString = "";

    // Search through string's characters one by one.
    // If character is in bag, append to returnString.

    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        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)
{   
	
	if ( s.indexOf( c ) != -1 ) 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 reLetter.test(c)
}



function isDigit (c)
{   return reDigit.test(c)
}



function isLetterOrDigit (c)
{   return reLetterOrDigit.test(c)
}



function isInteger (s)

{   var i;

    if (isEmpty(s)) 
       if (isInteger.arguments.length == 1) return defaultEmptyOK;
       else return (isInteger.arguments[1] == true);

    return reInteger.test(s)
}







function isSignedInteger (s)

{   if (isEmpty(s)) 
       if (isSignedInteger.arguments.length == 1) return defaultEmptyOK;
       else return (isSignedInteger.arguments[1] == true);

    
    else {
       return reSignedInteger.test(s)
    }
}




function isPositiveInteger (s)
{   var secondArg = defaultEmptyOK;

    if (isPositiveInteger.arguments.length > 1)
        secondArg = isPositiveInteger.arguments[1];

    // The next line is a bit byzantine.  What it means is:
    // a) s must be a signed integer, AND
    // b) one of the following must be true:
    //    i)  s is empty and we are supposed to return true for
    //        empty strings
    //    ii) this is a positive, not negative, number

    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) > 0) ) );
}






function isNonnegativeInteger (s)
{   var secondArg = defaultEmptyOK;

    if (isNonnegativeInteger.arguments.length > 1)
        secondArg = isNonnegativeInteger.arguments[1];

    // The next line is a bit byzantine.  What it means is:
    // a) s must be a signed integer, AND
    // b) one of the following must be true:
    //    i)  s is empty and we are supposed to return true for
    //        empty strings
    //    ii) this is a number >= 0

    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) >= 0) ) );
}






function isNegativeInteger (s)
{   var secondArg = defaultEmptyOK;

    if (isNegativeInteger.arguments.length > 1)
        secondArg = isNegativeInteger.arguments[1];

    // The next line is a bit byzantine.  What it means is:
    // a) s must be a signed integer, AND
    // b) one of the following must be true:
    //    i)  s is empty and we are supposed to return true for
    //        empty strings
    //    ii) this is a negative, not positive, number

    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) < 0) ) );
}






function isNonpositiveInteger (s)
{   var secondArg = defaultEmptyOK;

    if (isNonpositiveInteger.arguments.length > 1)
        secondArg = isNonpositiveInteger.arguments[1];

    // The next line is a bit byzantine.  What it means is:
    // a) s must be a signed integer, AND
    // b) one of the following must be true:
    //    i)  s is empty and we are supposed to return true for
    //        empty strings
    //    ii) this is a number <= 0

    return (isSignedInteger(s, secondArg)
         && ( (isEmpty(s) && secondArg)  || (parseInt (s) <= 0) ) );
}





function isFloat (s)

{   if (isEmpty(s)) 
       if (isFloat.arguments.length == 1) return defaultEmptyOK;
       else return (isFloat.arguments[1] == true);

    return reFloat.test(s)
}







function isSignedFloat (s)

{   if (isEmpty(s)) 
       if (isSignedFloat.arguments.length == 1) return defaultEmptyOK;
       else return (isSignedFloat.arguments[1] == true);

    else {
       return reSignedFloat.test(s)
    }
}




function isAlphabetic (s)

{   var i;

    if (isEmpty(s)) 
       if (isAlphabetic.arguments.length == 1) return defaultEmptyOK;
       else return (isAlphabetic.arguments[1] == true);

    else {
       return reAlphabetic.test(s)
    }
}




function isAlphanumeric (s)

{   var i;

    if (isEmpty(s)) 
       if (isAlphanumeric.arguments.length == 1) return defaultEmptyOK;
       else return (isAlphanumeric.arguments[1] == true);

    else {
       return reAlphanumeric.test(s)
    }
}




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 isSSN (s)
{   if (isEmpty(s)) 
       if (isSSN.arguments.length == 1) return defaultEmptyOK;
       else return (isSSN.arguments[1] == true);
    return (isInteger(s) && s.length == digitsInSocialSecurityNumber)
}




function isUSPhoneNumber (s)
{   if (isEmpty(s)) 
       if (isUSPhoneNumber.arguments.length == 1) return defaultEmptyOK;
       else return (isUSPhoneNumber.arguments[1] == true);
    return (isInteger(s) && s.length >= digitsInUSPhoneNumber)
}




function isInternationalPhoneNumber (s)
{   if (isEmpty(s)) 
       if (isInternationalPhoneNumber.arguments.length == 1) return defaultEmptyOK;
       else return (isInternationalPhoneNumber.arguments[1] == true);
    return (isPositiveInteger(s))
}




function isZIPCode (s)
{  if (isEmpty(s)) 
       if (isZIPCode.arguments.length == 1) return defaultEmptyOK;
       else return (isZIPCode.arguments[1] == true);
   return (isInteger(s) && 
            ((s.length == digitsInZIPCode1) ||
             (s.length == digitsInZIPCode2)))
}





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);
    
    else {
       return reEmail.test(s)
    }
}



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 == 4) || (s.length == 4));
}



function isIntegerInRange (s, a, b)
{   if (isEmpty(s)) 
       if (isIntegerInRange.arguments.length == 1) return defaultEmptyOK;
       else return (isIntegerInRange.arguments[1] == true);

    var num = parseInt (s, 10);
    return ((num >= a) && (num <= b));
}

var mFloatRangeP = " must a be a number (like 2.43) between ";
var mFloatRangeS = ". Please reenter it now!";
function checkFloatInRange (theField, a, b, s, emptyOK)
{   // Next line is needed on NN3 to avoid "undefined is not a number" error
    // in equality comparison below.
    if (checkFloatInRange.arguments.length == 2) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if ( !isFloat(theField.value) ) return warnInvalid (theField, s + mFloatRangeP + a + " and " + b + mFloatRangeS );
	var num = parseFloat (theField.value);
    if ((num < a) || (num > b)) return warnInvalid (theField, s + mFloatRangeP + a + " and " + b + mFloatRangeS );
	
	return true;
}



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)
{   // February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );
}



function isDate (year, month, day)
{   // catch invalid years (not 2- or 4-digit) and invalid months and days.
    if (! (isYear(year, false) && isMonth(month, false) && isDay(day, false))) return false;

    // Explicitly change type to integer to make code work in both
    // JavaScript 1.1 and JavaScript 1.2.
    var intYear = parseInt(year, 10);
    var intMonth = parseInt(month, 10);
    var intDay = parseInt(day, 10);

    // catch invalid days, except for February
    if (intDay > daysInMonth[intMonth]) return false; 

    if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;

    return true;
}





function prompt (s)
{   window.status = s
}



function promptEntry (s)
{   window.status = pEntryPrompt + s
}




function warnEmpty (theField, s)
{   theField.focus();
    alert(mPrefix + s + mSuffix);
    return false;
}



function warnInvalid (theField, s)
{   theField.focus();
    theField.select();
    alert(s);
    return false;
}





function checkString (theField, s, emptyOK)
{   // Next line is needed on NN3 to avoid "undefined is not a number" error
    // in equality comparison below.
    if (checkString.arguments.length == 2) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    if (isWhitespace(theField.value)) 
       return warnEmpty (theField, s);
    else return true;
}


function checkSelect (theField, s, zeroOK, emptyOK)
{   // Next line is needed on NN3 to avoid "undefined is not a number" error
    // in equality comparison below.
    if ( checkSelect.arguments.length < 4 ) emptyOK = defaultEmptyOK;
    if ( checkSelect.arguments.length < 3 ) zeroOK = false;
	
	var v = theField.selectedIndex;
    if ((emptyOK == true) && ( -1 == v ) ) return true;
	
	if ((zeroOK == true) && ( 0 == v ) ) return true;
	
    if ( 1 > v ) {
		theField.focus();
		alert( s );
    	return false;
	}       

	return true
}


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, ZIPCodeDelimiters)
      if (!isZIPCode(normalizedZIP, false)) 
         return warnInvalid (theField, iZIPCode);
      else 
      {  // if you don't want to insert a hyphen, comment next line out
         theField.value = reformatZIPCode(normalizedZIP)
         return true;
      }
    }
}


function checkZIPCode2 ( theField, emptyOK ) 
{
	if (checkZIPCode2.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) 
		return true;
    else
    { 
		var normalizedZIP = stripCharsInBag(theField.value, ZIPCodeDelimiters)
		if ( !isZIPCode( normalizedZIP, false)) 
			return warnInvalid (theField, iZIPCode);
		else 
			theField.value = normalizedZIP;
			return true;
		}
}




function reformatUSPhone (USPhone)
{   
	if (USPhone.length == digitsInUSPhoneNumber)
		return (reformat (USPhone, "(", 3, ") ", 3, "-", 4))
	else if (USPhone.length > digitsInUSPhoneNumber)
	{
		var extLength =  USPhone.length - digitsInUSPhoneNumber;
		return (reformat (USPhone, "(", 3, ") ", 3, "-", 4, "-", extLength))
	}	
}



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 checkUSPhone2 (f1, f2, f3, emptyOK)
{   
	if (checkUSPhone2.arguments.length == 3) emptyOK = defaultEmptyOK;
	var v;
	v = f1.value + f2.value + f3.value;
    if ((emptyOK == true) && (isEmpty(v))) 
		return true;
    else
    {  
	   var normalizedPhone = v;
       if (!isUSPhoneNumber(normalizedPhone, false)) 
          return warnInvalid (f1, iUSPhone);
       else 
          return true;
    }
}



function checkInternationalPhone (theField, emptyOK)
{   if (checkInternationalPhone.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    {  if (!isInternationalPhoneNumber(theField.value, false)) 
          return warnInvalid (theField, iWorldPhone);
       else 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 reformatSSN (SSN)
{   return (reformat (SSN, "", 3, "-", 2, "-", 4))
}


function checkSSN (theField, emptyOK)
{   if (checkSSN.arguments.length == 1) emptyOK = defaultEmptyOK;
    if ((emptyOK == true) && (isEmpty(theField.value))) return true;
    else
    {  var normalizedSSN = stripCharsInBag(theField.value, SSNDelimiters)
       if (!isSSN(normalizedSSN, false)) 
          return warnInvalid (theField, iSSN);
       else 
       {  // if you don't want to reformats as 123-456-7890, comment next line out
          theField.value = reformatSSN(normalizedSSN)
          return true;
       }
    }
}

function checkSSN2 (f1, f2, f3, emptyOK)
{   
	if (checkSSN2.arguments.length == 3) emptyOK = defaultEmptyOK;
	var v;
	v = f1.value + f2.value + f3.value;
	
    if ((emptyOK == true) && (isEmpty(v))) 
		return true;
    else
    {  
	   var normalizedSSN = v;
       if ( !isSSN(normalizedSSN, false) ) 
          return warnInvalid (f1, iSSN);
       else 
          return true;
    }
}

function checkTIN2 (f1, f2, emptyOK)
{   
	if (checkTIN2.arguments.length == 2) emptyOK = defaultEmptyOK;
	var v;
	v = f1.value + f2.value;
	
    if ((emptyOK == true) && (isEmpty(v))) 
		return true;
    else
    {  
	   var normalizedSSN = v;
       if ( !isSSN(normalizedSSN, false) ) 
          return warnInvalid (f1, iTIN);
       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)
{   // Next line is needed on NN3 to avoid "undefined is not a number" error
    // in equality comparison below.
    if (checkDate.arguments.length == 4) OKtoOmitDay = false;

    if (!isMonth(monthField.value)) return warnInvalid (monthField, iMonth);
 	if ( (OKtoOmitDay == false) && !isDay(dayField.value) ) return warnInvalid (dayField, iDay);
    if (!isYear(yearField.value)) return warnInvalid (yearField, iYear);
    if ( (OKtoOmitDay == true) && isEmpty(dayField.value) ) return true;
	
    if (isDate (yearField.value, monthField.value, dayField.value))
       return true;
    else {
		alert (iDatePrefix + labelString + iDateSuffix)
		monthField.focus()

		dayField.select()
		yearField.select()
		monthField.select()
		return false
	}	
    
}



function getRadioButtonValue (radio)
{   
	var bChecked = false;
	for (var i = 0; i < radio.length; i++)
    {   if (radio[i].checked) { bChecked = true ; break }
    }
	if ( bChecked ) return radio[i].value  
}


function getFieldValue(field)
{
   switch(field.type)
   {
      case "text" :
      case "textarea" :
      case "password" :
      case "hidden" :
         return field.value;

      case "select-one" :
         var i = field.selectedIndex;
         if (i == -1)   return "";
         else   return (field.options[i].value == "") ? field.options[i].text : field.options[i].value;

      case "select-multiple" :
         var allChecked = new Array();
         for(i = 0; i < field.options.length; i++)
            if(field.options[i].selected)
               allChecked[allChecked.length] = (field.options[i].value == "") ? field.options[i].text : field.options[i].value;
         return allChecked;

      case "button" :
      case "reset" :
      case "submit" :
         return "";

      case "radio" :
      case "checkbox" :
         if (field.checked) { return field.value; } else { return ""; }
      default :
         if(field[0].type == "radio")
         {
            for (i = 0; i < field.length; i++)
               if (field[i].checked)
                  return field[i].value;

            return "";
         }
         else if(field[0].type == "checkbox")
         {
            var allChecked = new Array();
            for(i = 0; i < field.length; i++)
               if(field[i].checked)
                  allChecked[allChecked.length] = field[i].value;

            return allChecked;
         }
         else
            var str = "";
            for (x in field) { str += x + "n"; }
            alert("I couldn't figure out what type this field is...nn" + field.name + ": ???nnn" + str + "nnlength = " + field.length);
         break;
   }
   
   return "";
}


function isDateInRange( d, a , b ) 
{
   	if ( isEmpty(d) ) return false;
	return ( (d>=a) && (d<=b) );
}


function checkDate2 (yearField, monthField, dayField, labelString )
{
	// Next line is needed on NN3 to avoid "undefined is not a number" error
	// in equality comparison below.
	if (!isMonth(monthField.value)) return warnInvalid (monthField, iMonth);
	if (!isDay(dayField.value))     return warnInvalid (dayField, iDay);
	if (!isYear(yearField.value))   return warnInvalid (yearField, iYear);
	
	

	if (!isDate (yearField.value, monthField.value, dayField.value)) {
	   	return warnInvalid( monthField, iDatePrefix + labelString + iDateSuffix );
	}
	var dt = new Date(yearField.value, monthField.value - 1, dayField.value);
	//alert( dt );

	var now = new Date();
	var nowDate = new Date( now.getYear(), now.getMonth(), now.getDate() );

	if ( !isDateInRange( dt, minDate, nowDate ) ) {
		return warnInvalid( monthField, labelString + iDateNotInRange );
	}

	return true;
}


function checkDate3 (yearField, monthField, dayField, labelString )
{
	// Next line is needed on NN3 to avoid "undefined is not a number" error
	// in equality comparison below.
	if (!isMonth(monthField.value)) return warnInvalid (monthField, iMonth);
	if (!isDay(dayField.value))     return warnInvalid (dayField, iDay);
	if (!isYear(yearField.value))   return warnInvalid (yearField, iYear);

	if (!isDate (yearField.value, monthField.value, dayField.value)) {
	   	return warnInvalid( monthField, iDatePrefix + labelString + iDateSuffix );
	}
	var dt = new Date(yearField.value, monthField.value - 1, dayField.value);
	//alert( dt );

	var now = new Date();
	var nowDate = new Date( now.getYear(), now.getMonth(), now.getDate() );

	if ( !isDateInRange( dt, nowDate, maxDate ) ) {
		return warnInvalid( monthField, labelString + iDateNotInRange2 );
	}

	return true;
}			

