
//Main validation routine for calling each check (for HEAD of document)
	function verifyform() {
	  msg = "";
	  error = 0;
	  // Verify that dollar amount is valid
	  if(error==0){checkExists(document.forms[0].DATA3,'Amount')}
	  if(error==0){checkDollarFormat(document.forms[0].DATA3,'Amount')}
	  if(error==0){stripBadchs(document.forms[0].DATA3,'dollar value')}
	  if(error==0){checkWhole(document.forms[0].DATA3,'Amount')}
	  if(error==0){checkMinMax(document.forms[0].DATA3,'Amount','1','1000000')}
	  // Veridy that date is valid
	  if(error==0 && flag=="true"){checkDDExists(document.forms[0].DATA5,'Month')}
	  if(error==0 && flag=="true"){checkDDExists(document.forms[0].DATA6,'Date')}
	  if(error==0 && flag=="true"){checkDDExists(document.forms[0].DATA7,'Year')}
	  if(error!=0){
	    alert(msg)
		return false
	  } else {
	      return true
	  }
	}


//Checking that a number is whole (has no decimal points)
	// Expects to receive the name or the indentifier for a form object
	function checkWhole(id){
	  if((parseFloat(id.value)-parseInt(id.value))!=0){
	    error=1
		msg="Dollar amount must be in whole dollars."
	  }
	}

//Strip unwanted characters from input
	// Expects to receive the name or the identifier for a form object (id)
	// and a string (status) indicating what characters are permissible.
	function stripBadchs(id,status) {
	  var bad = 0
	  for (i = 0; i < id.value.length; i++) {
	    ch = id.value.substring(i, i + 1);
	    if ( status == "letters or numbers" ) { if ( (ch < "a" || "z" < ch) && (ch < "A" || "Z" < ch) && (ch < "0" || "9" < ch) ) { bad = 1; } }
	    if ( status == "letters" ) { if ( (ch < "a" || "z" < ch) && (ch < "A" || "Z" < ch) ) { bad = 1; } }
	    if ( status == "dollar value" ) { if ((ch == "$") || (ch == ",")) { bad = 1 } }
	    if ( status == "numbers" ) { if (ch < "0" || "9" < ch) { bad = 1 } }
		if ( bad == 1 ) {	
	      id.value = id.value.substring(0,i)+id.value.substring(i+1,id.value.length)
	      i=i-1
	      bad = 0
	    }
	  }
	}

//Check that character input is valid
	// Expects to receive the name or the identifier for a form object (id)
	// and a string (status) indicating what characters are permissible.
	function checkBadchs(id,status) {
	  var bad = 0;
	  for (i = 0; i < id.value.length; i++) {
	    ch = id.value.substring(i, i + 1);
        if ( status == "a date in the format MM/DD/YY" ) { if (( ch < "0" || "9" < ch ) && (ch !="/" )) { bad = 1; } }
	    if ( status == "letters or numbers" ) { if ( (ch < "a" || "z" < ch) && (ch < "A" || "Z" < ch) && (ch < "0" || "9" < ch) ) { bad = 1; } }
	    if ( status == "letters" ) { if ( (ch < "a" || "z" < ch) && (ch < "A" || "Z" < ch) ) { bad = 1; } }
	    if ( status == "names" ) { if ( (ch < "a" || "z" < ch) && (ch < "A" || "Z" < ch) && (ch != "-") && (ch != " ") ) { bad = 1; } }
	    if ( status == "numbers" ) { if (ch < "0" || "9" < ch) { bad = 1; } }
	  }
	  if (bad==1) {
	    error = 1;
	    msg = "Input should contain only " + status + ".\n";
	  }  
	}

//Check that character input is valid, method #2
	// Expects to receive the name or the identifier for a form object (id)
	// and a string (descriptor) with the label of the form field.
	// To check on different characters, customize the string below "validchars"
	function checkValidChars(id,descriptor){
	  validchars = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.'-& "
	  for (i = 0; i < id.value.length; i++) {
	    ch = id.value.substring(i, i + 1);
	    if (validchars.indexOf(ch,0) == -1) {
	      error = 1
	      msg = descriptor + " contains invalid characters. '" + ch + "' is not permitted."
	    }
	  }
	}

//Check the formatting of a dollar amount
	// Expects to receive the name or the identifier for a form object (id)
	// and a string (name) with the label of the form field being verified.
	// Works in conjunction with two more functions included below, isDollar
	// and isDigit.

	function checkDollarFormat(id,name) {
	  // makes sure a dollar sign is the first character (you can delete this check if you don't want it)
	  if( 0 < id.value.indexOf('$') ) {
	    error=1
		msg="The dollar sign must be the first character in " + name + "."
	    return
	  }
	  // makes sure that if there's a decimal point, it's followed by two digits
	  dot=id.value.indexOf('.')
	  lastdot=id.value.lastIndexOf('.')
	  if((dot!=-1) && ((dot!=(id.value.length-3)) || (dot!=lastdot))) {
	    error=1
		msg="Decimal points must be followed by two digits in " + name + "."
	    return
	  }
	  // Makes sure that only numbers or '$' or '.' or ',' are present.
	  for (i = 0; i < id.value.length; i++) {
	    ch = id.value.substring(i, i + 1)
		if(!isDollar(ch)){
		  error=1
	      msg=name + " must only contain a dollar value."
	      return
		} else {
		  if(ch==","){
		    // Makes sure that if there's a comma, it only occurs to divide groups of 1000s
			// (i.e. 1,000 or 10,000 or 100,000 or 1,000,000 but NOT 10,00,00)
			if((!isDigit(id.value.substring(i-1,i))) || (!isDigit(id.value.substring(i+1,i+2))) ||(!isDigit(id.value.substring(i+2,i+3))) ||(!isDigit(id.value.substring(i+3,i+4)))) {
	          error=1
			  msg="Commas in " + name + " must be followed by three digits and preceeded by at least one digit."
			  return
	        }
		  }
		}
	  }
	}

// Expects any single character, and returns true if it's a number and false if not.
	function isDigit(n){
	  if( (n < "0") || ("9" < n) ){
	    return false
	  } else {
	    return true
	  }
	}
	// Expects any single character, and returns true if it's valid input
	// for a dollar amount and false if not.
	function isDollar(n){
	  if( ((n < "0") || ("9" < n)) && (n!=".") && (n!=",") && (n!="$") ) {
	    return false
	  } else {
	    return true
	  }
	}

//Strip a dollar amount down to just the numbers
	// Expects an object identifier for a form field that contains a dollar amount.
	// Removes the dollar sign and any commas.
	function stripDollarSign(id) {
	  for (i = 0; i < id.value.length; i++) {
	    ch = id.value.substring(i, i + 1);
	    if ((ch == "$") || (ch == ",")) {
	      id.value = id.value.substring(0,i)+id.value.substring(i+1,id.value.length)
	      i=i-1
		}
	  }
	}

//Check that a number falls within a specified range
	// Expects to receive the name or the identifier for a form object (id),
	// a string (name) with the label of the form field being verified,
	// and the minimum and maximum acceptable value.
	// The parseFloat function turns a string into a number
	// (i.e. "17" becomes 17 (no more quotes, ready for numerical comparisons))
	function checkMinMax(id,name,min,max){
	  if((parseFloat(id.value)>parseFloat(max)) || (parseFloat(id.value)<parseFloat(min))) {
	    error=1
		msg=name + " must be greater than $" + min + " and less than $" + max + "."
	  }
	}

//Check that a value exists
	// Expects to receive the name or the identifier for a form object (id),
	// and a string (name) with the label of the form field being verified
	function checkExists(id,name) {
	  if ((id.value == "") || (id.value == "$")) {
		error = 1
	    msg = name + " is missing.\n"
	  }
	}

//Check that something was selected in a dropdown menu
	// Expects to receive the name or the identifier for a select object (id),
	// and a string (name) with the label of the select box being verified.
	// This assumes that the dropdown box has options where the value is set to "" (nothing).
	function checkDDExists(id,name) {
	  if ( id[id.selectedIndex].value == "" ) {
		error = 1
	    msg = name + " is missing.\n"
	  }
	}

//Check that two strings are identical (i.e. password and confirm password)
	// Expects to receive the name or the identifier for two objects (element1, element2),
	// and two strings (name1, name2) with the labels of the text boxes being verified.
	function compareValues(element1,element2,name1,name2) {
	  if ( element1.value != element2.value ) {
	    msg = name1 + " does not match " + name2 + ".\n";
		error = 1;
	  }
	}

//Check that input length falls with specified range (i.e. if password must be 7 to 20 chars)
	// Expects to receive the name or the identifier for a form object (id),
	// a string (name) with the label of the form field being verified,
	// and the minimum and maximum acceptable length.
	function checkLength(id,name,min,max) {
	  if (id.value.length < min) {
	    msg = name + " must be at least " + min + " characters in length.\n";
	    error = 1;
	  }
	  if (id.value.length > max) {
	    msg = name + " must be less than " + max + " characters in length.\n";
	    error = 1;
	  }
	}

//Check that input is a precise length
	// Expects to receive the name or the identifier for a form object (id),
	// a string (name) with the label of the form field being verified,
	// and the precise acceptable length (size).
	function checkPreciseLength(id,name,size) {
	  if ((id.value.length != size) && (id.value.length != 0)) {
	    msg = name + " must be " + size + " characters in length.\n"
	    error = 1
	  }
	}

//Calling date functions
//There's lots of functions involved with making sure a date is acceptable. Here's the recommended order
//for calling each function:

    // DATE
//    with(document.forms[0]){
//		if(error==0){checkExists(DATA2,'From Date')}
//	    if(error==0){checkBadchs(DATA2,'From Date','a date in the format MM/DD/YY')}
//	    if(error==0){checkDateFormat(DATA2,'From Date')}
//	    if(error==0){checkNonDates(DATA2,'From Date')}
//	    if(error==0){checkExists(DATA3,'To Date')}
//	    if(error==0){checkBadchs(DATA3,'To Date','a date in the format MM/DD/YY')}
//	    if(error==0){checkDateFormat(DATA3,'To Date')}
//	    if(error==0){checkNonDates(DATA3,'To Date')}
//	    if(error==0){lessThan(fixDate(DATA2.value),fixDate(DATA3.value),'The date for FROM cannot be later than the date for TO.')}
//	    if(error==0){checkDates(DATA2,DATA3)}
//	}



//Check that dates fall in an acceptable range
	// Expects values of dates in format mm/dd/yy or mmddyy or mm/dd/yyyy or mmddyyyy
	// Works in conjunction with fixDate(), included below
	// Expects newfrom and newto to be object identifiers for form fields with dates.
	// Expects acceptableFrom and acceptableTo to be date strings.

	function checkDates(newfrom,newto,acceptableFrom,acceptableTo) {
	  if ( fixDate(newfrom.value) < fixDate(acceptableFrom) ) {
	    error = 1;
		msg = "From Date cannot be earlier than " + acceptableFrom;
	  } else {
	    if ( fixDate(newto.value) > fixDate(acceptableTo) ) {
	      error = 1;
	      msg = "To Date cannot be later than " + acceptableTo;
	    }
	  }
	}

	function fixDate(date) {
	  // Removes slashes
	  for (i = 0; i < date.length; i++) {
	    ch = date.substring(i, i + 1);
	    if (ch == "/") {
	      date = date.substring(0,i)+date.substring(i+1,date.length)
	      i=i-1
	    }
	  }
	  if(date.length==8) {
	    year=date.substring(6,8)
	  } else {
	    year=date.substring(4,6)
	  }
	  monthdate=date.substring(0,4)
	  if(year<90) {  // I wonder if there should be a parseFloat here??
	    year="20"+year
	  } else {
	    year="19"+year
	  }
	  newdate=year+monthdate
	  returndate=parseFloat(newdate)
	  return returndate
	}

//Format a date
	// Expects the object identifier for a form field containing a date (date), plus
	// the text label for the form field (item). Makes sure that date is correct length,
	// and makes sure that months, dates and years fall in acceptable ranges.

	function checkDateFormat(date,item) {
	  if (date.value=="") { return } // Makes sure there's something to evaluate. Doesn't error out if not--just returns.
	  doubledigits = makeDoubleDigits(date.value)
	  date.value = doubledigits
	  evaldate = stripDate(doubledigits)
	  if (evaldate.length > 6) { error=1; msg=item+" contains too many characters. Dates must be in the format MM/DD/YY."; return }
	  if (evaldate.length < 6) { error=1; msg=item+" does not contain enough characters. Dates must be in the format MM/DD/YY."; return }
	  if ( (1 > parseFloat(evaldate.substring(0,2))) || (parseFloat(evaldate.substring(0,2)) > 12)) { error=1; msg="The month in "+item+" must be from 01 to 12."; return }
	  if ( (1 > parseFloat(evaldate.substring(2,4))) || (parseFloat(evaldate.substring(2,4)) > 31)) { error=1; msg="The day in "+item+" must be from 01 to 31."; return }
	  if ( ( parseFloat(evaldate.substring(4,6)) > 20 ) && (parseFloat(evaldate.substring(4,6))!=96) && (parseFloat(evaldate.substring(4,6))!=97) && (parseFloat(evaldate.substring(4,6))!=98) && (parseFloat(evaldate.substring(4,6))!=99) ) { error=1; msg="The year in "+item+" must be in two-digit format between 1996 and 2020."; return }
	}
    // Expects a date in any of the following formats: m/d/yy, mm/d/yy, m/dd/yy, m/d/yyyy, mm/d/yyyy, m/dd/yyyy.
	// Returns any date with slashes as mm/dd/yy or mm/dd/yyyy. Returns date without slashes untouched.
	function makeDoubleDigits(thisdate){
	  if(thisdate.indexOf('/')==1) {
	    thisdate = "0" + thisdate
	  }
	  if(thisdate.lastIndexOf('/')==4) {
	    thisdate = thisdate.substring(0,3) + "0" + thisdate.substring(3,7)
	  }
	  return thisdate
	}
	// Expects a date, and strips its parantheses for evaluation purposes.
	function stripDate(stripThis) {
	  for (i = 0; i < stripThis.length; i++) {
	    ch = stripThis.substring(i, i + 1);
	    if (ch == "/") {
	      stripThis = stripThis.substring(0,i)+stripThis.substring(i+1,stripThis.length)
	      i=i-1
	    }
	  }
	  return stripThis
	}

//Checks that the date exists, given short and long months and leap years.
	// Expects an object identifier for a field containing a date, and the text label for the field.
	function checkNonDates(date,name){
	  leapyear=false
	  longmonths = "01,03,05,07,08,10,12"
	  evaldate = stripDate(date.value)
	  month=evaldate.substring(0,2)
	  day=evaldate.substring(2,4)
	  year=evaldate.substring(4,6)
	  if( ((year%4)==0) || (year=="00") ){leapyear=true}
	  if(   ((longmonths.indexOf(month)==-1)&&(day>30))  ||  ( (month=="02")&& ((day>29)||((day>28)&&(leapyear==false)) ) )  ) {
	    error=1
		msg=name + " is invalid. There are not " + day + " days in month " + month + "."
	  }
	}

//Check that a FROM date is not later than a TO date
	// Expects a FROM and a TO date that have already been passed through the
	// fixDates function, and an errorMessage

	function lessThan(value1,value2,errorMessage) {
	  if ( ( value1 != "" ) && ( value2 != "" ) && ( parseInt(value1) != 0 ) && ( parseInt(value2) != 0 ) && ( parseFloat(value1) > parseFloat(value2) ) ) {
	    msg = errorMessage;
		error = 1;
	  }
	}

//Format a Social Security Number
	// Expects an object identifier that refers to the form field containing the SSN.
	// Requires the stripBadchs and checkLength routine, elsewhere in this document.
	// After it strips and checks the length, it inserts the hyphens in the format xxx-xx-xxxx.

	function formatSSN(id) {
	  if (id.value != "") {
	    stripBadchs(id,'numbers')
	    msg = checkLength(id,'Social Security Number',9,20)
	    if (msg != "") {
		} else {
		  id.value = id.value.substring(0,3) + "-" + id.value.substring(3,5) + "-" + id.value.substring(5,9)
		}
	  }
	}

//Verify that an email address is valid
	// Expects the object identifier of a form field containing an email address.
	// Checks that there's exactly one @ symbol, and that it occurs before at least one dot.
	// Also makes sure that there's at least one letter after the last dot.
	// (An even better email validator is to use a back-end script to make sure
	// that the specified domain actually exists, such as with an nslookup.)

	function verifyEmail(id) {
	  at=id.value.indexOf('@')
	  lastat=id.value.lastIndexOf('@')
	  dot=id.value.indexOf('.')
	  lastdot=id.value.lastIndexOf('.')
	  if ( !( (0 < at) && (at < (lastdot-1)) && (lastdot < (id.value.length-1)) && (at == lastat) ) ) {
	    error = 1;
	    msg = "Email address is not formatted properly.\n";
	  }
	}

//Format a phone number
//	To verify a phone number, you might use the following routines, already included above:
//		if(error==0){checkExists(document.forms[0].homephone,'Home Phone')}
//		if(error==0){stripBadchs(document.forms[0].homephone,'numbers')}
//		if(error==0){checkPreciseLength(document.forms[0].homephone,'Home Phone',10)}
//		if(error==0){formatPhone(document.forms[0].homephone)}

	// Expects an object identifier that points to a form field that contains exactly
	// 10 digits of a phone number. Formats the number in the format (xxx)xxx-xxxx.
	function formatPhone(id) {
	  if (id.value != "") {
	    stripBadchs(id,'numbers')
	    id.value = "(" + id.value.substring(0,3) + ") " + id.value.substring(3,6) + "-" + id.value.substring(6,10)
	  }
	}

//Validate a phone number
	// Expects a phone number. Makes sure the user doesn't just enter sequential numbers or
	// information (555-1212).
	function checkPhoneSpecial(phone){
	  if ((phone.substring(3,10)=="5551212") || (phone.substring(0,10)=="1234567890") || (phone.substring(3,10)=="4567890")){
	    error=1
		msg=formatPhone(phone)+" is an acceptable phone number."
	  }
	}
	// Expects a phone number. Makes sure the user doesn't just enter identical characters
	// (i.e. 111-1111)
	function checkDigitsIdentical(phone){
	  lastpart=phone.substring(3,10)
	  sample=lastpart.substring(0,1)
	  for(i=1;i<lastpart.length;i++){
	    if ((lastpart.substring(i,i+1))!=sample){
		  return
		}
	  }
	  error=1
	  msg=formatPhone(phone)+" is not an acceptable phone number."
	}
	// Expects a phone number. Makes sure the user doesn't just enter sequential characters
	// (i.e. 234-5678)
	function checkDigitsSequential(phone){
	  shortphone=phone.substring(3,10)
	  first=shortphone.substring(0,1)
	  second=shortphone.substring(1,2)
	  diff=parseInt(first)-parseInt(second)
	  if(Math.abs(diff)!=1) return
	  if (diff == -1){  //ascending order
	    for(i=0; i<shortphone.length-1; i++){
	      if ((parseInt(shortphone.substring(i,i+1)))!=(parseInt(shortphone.substring(i+1,i+2))-1)) return
	    }
	  }
	  if (diff == 1){   //descending order
	    for(i=0;i<shortphone.length-1;i++){
	      if ((parseInt(shortphone.substring(i,i+1)))!=(parseInt(shortphone.substring(i+1,i+2))+1)) return
	    }
	  }
	  error=1
	  msg=formatPhone(phone)+" is not an acceptable phone number."
	}

//Validate a zip code
	// Expects a 5-digit zip code. Prevents user from entering 5 identical digits, as in 44444.
	function checkZipDigitsIdentical(zip){
	  sample=zip.substring(0,1)
	  for(i=1;i<zip.length;i++){
	    if ((zip.substring(i,i+1))!=sample){
		  return
		}
	  }
	  error=1
	  msg=zip+" is not an acceptable zip code."
	}
	// Expects digits only, and checks that they aren't sequential, i.e. 23456 or 65432
	function checkZipDigitsSequential(zip){
	  first=zip.substring(0,1)
	  second=zip.substring(1,2)
	  diff=parseInt(first)-parseInt(second)
	  if(Math.abs(diff)!=1) return
	  if (diff == -1){  //ascending order
	    for(i=0; i<zip.length-1; i++){
	      if ((parseInt(zip.substring(i,i+1)))!=(parseInt(zip.substring(i+1,i+2))-1)) return
	    }
	  }
	  if (diff == 1){   //descending order
	    for(i=0;i<zip.length-1;i++){
	      if ((parseInt(zip.substring(i,i+1)))!=(parseInt(zip.substring(i+1,i+2))+1)) return
	    }
	  }
	  error=1
	  msg=zip+" is not an acceptable zip code."
	}
	// This one might be overkill, and it requires that you maintain the list of acceptable
	// zip codes in the country. Anyway, expects 2 object identifiers that refer to the form fields
	// with the 5-digit zip code and the state. It checks that the zip code is valid for the state.
	function checkIllegalZip(myzip,state) {
	  var ZipAA = "340";
	  var ZipAE = "090,091,092,093,094,095,096,097,098";
	  var ZipAK = "995,996,997,998,999";
	  var ZipAL = "350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,393";
	  var ZipAP = "962,963,964,965,966,968";
	  var ZipAR = "381,716,717,718,719,720,721,722,723,724,725,726,727,728,729,755";
	  var ZipAS = "967";
	  var ZipAZ = "850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,873,879,880";
	  var ZipCA = "895,900,901,902,903,904,905,906,907,908,910,911,912,913,914,915,916,917,918,918,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966";
	  var ZipCO = "800,801,802,803,805,806,807,808,809,810,811,812,813,814,815,816";
	  var ZipCT = "060,061,062,063,064,065,066,067,068,069";
	  var ZipDC = "200,201,202,203,204,205";
	  var ZipDE = "197,198,199,216,218";
	  var ZipFL = "315,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349";
	  var ZipGA = "298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,374,399";
	  var ZipHI = "967,968,969";
	  var ZipIA = "500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,612,681";
	  var ZipID = "832,833,834,835,836,837,838,970,990";
	  var ZipIL = "527,528,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,631,634,635";
	  var ZipIN = "400,420,423,424,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479";
	  var ZipKS = "641,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,678,679,739";
	  var ZipKY = "400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,452,471,476";
	  var ZipLA = "700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,717";
	  var ZipMA = "010,011,012,013,014,015,016,017,018,019,020,021,022,023,024,025,026,027,055";
	  var ZipMD = "203,206,207,208,209,210,211,212,213,214,215,216,217,218,219,267";
	  var ZipME = "038,039,040,041,042,043,044,045,046,047,048,049";
	  var ZipMI = "480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499";
	  var ZipMN = "550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,540,581";
	  var ZipMO = "621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658";
	  var ZipMS = "369,381,386,387,388,389,390,391,392,393,394,395,396,397";
	  var ZipMT = "590,591,592,593,594,595,596,597,598,599,821";
	  var ZipNC = "270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,297";
	  var ZipND = "565,557,580,581,582,583,584,585,586,587,588";
	  var ZipNE = "515,516,680,681,682,683,684,685,686,687,688,689,690,691,692,693";
	  var ZipNH = "030,031,032,033,034,035,036,036,037,038,039,050";
	  var ZipNJ = "070,071,072,073,074,075,076,077,078,079,080,081,082,083,084,085,086,087,088,089";
	  var ZipNM = "865,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884";
	  var ZipNV = "889,890,891,892,893,894,895,896,897,898,961";
	  var ZipNY = "003,004,005,090,091,092,093,094,095,096,097,098,099,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149";
	  var ZipOH = "410,430,431,432,433,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,470";
	  var ZipOK = "730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,748,749,679";
	  var ZipOR = "836,970,971,972,973,974,975,976,977,978,979,986";
	  var ZipPA = "150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,213,260";
	  var ZipPR = "006,007,008,009";
	  var ZipRI = "027,028,029";
	  var ZipSC = "282,290,291,292,293,294,295,296,297,298,299,309,314";
	  var ZipSD = "570,571,572,573,574,575,576,577";
	  var ZipTN = "307,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,723";
	  var ZipTX = "718,733,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,885";
	  var ZipUT = "840,841,842,843,844,845,846,847,893,898";
	  var ZipVA = "201,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246";
	  var ZipVI = "008";
	  var ZipVT = "050,051,052,053,054,055,056,057,058,059,035,036,037";
	  var ZipWA = "835,838,972,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994";
	  var ZipWI = "498,499,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,551";
	  var ZipWV = "246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268";
	  var ZipWY = "591,820,821,823,824,825,826,827,828,829,830,831";
	  var zip3 = myzip.value.substring(0,3)
	  if( eval("Zip" + state.value.toUpperCase()).indexOf(zip3,0) == -1 ) {
	    error = 1
		msg = "'" + myzip.value + "' is not a valid zip code for state " + state.value.toUpperCase() + "."
	  }
	}

//Validate state
	// Expects a string containing a two-letter state code. Makes sure it's a valid code.
	function validateState(state) {
	  state = state.toUpperCase()
	  validstate = "AA,AE,AK,AL,AP,AR,AS,AZ,CA,CO,CT,DC,DE,FL,GA,HI,IA,ID,IL,IN,KS,KY,LA,MA,MD,ME,MI,MN,MO,MS,MT,NC,ND,NE,NH,NJ,NM,NV,NY,OH,OK,OR,PA,PR,RI,SC,SD,TN,TX,UT,VA,VI,VT,WA,WI,WV,WY";
	  if (validstate.indexOf(state,0) == -1) {
	    error = 1
		msg = state + " is not a valid US state."
	  }
	}


///===================== FRom Head ==============


function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_nbGroup(event, grpName) { //v6.0
  var i,img,nbArr,args=MM_nbGroup.arguments;
  if (event == "init" && args.length > 2) {
    if ((img = MM_findObj(args[2])) != null && !img.MM_init) {
      img.MM_init = true; img.MM_up = args[3]; img.MM_dn = img.src;
      if ((nbArr = document[grpName]) == null) nbArr = document[grpName] = new Array();
      nbArr[nbArr.length] = img;
      for (i=4; i < args.length-1; i+=2) if ((img = MM_findObj(args[i])) != null) {
        if (!img.MM_up) img.MM_up = img.src;
        img.src = img.MM_dn = args[i+1];
        nbArr[nbArr.length] = img;
    } }
  } else if (event == "over") {
    document.MM_nbOver = nbArr = new Array();
    for (i=1; i < args.length-1; i+=3) if ((img = MM_findObj(args[i])) != null) {
      if (!img.MM_up) img.MM_up = img.src;
      img.src = (img.MM_dn && args[i+2]) ? args[i+2] : ((args[i+1])? args[i+1] : img.MM_up);
      nbArr[nbArr.length] = img;
    }
  } else if (event == "out" ) {
    for (i=0; i < document.MM_nbOver.length; i++) {
      img = document.MM_nbOver[i]; img.src = (img.MM_dn) ? img.MM_dn : img.MM_up; }
  } else if (event == "down") {
    nbArr = document[grpName];
    if (nbArr)
      for (i=0; i < nbArr.length; i++) { img=nbArr[i]; img.src = img.MM_up; img.MM_dn = 0; }
    document[grpName] = nbArr = new Array();
    for (i=2; i < args.length-1; i+=2) if ((img = MM_findObj(args[i])) != null) {
      if (!img.MM_up) img.MM_up = img.src;
      img.src = img.MM_dn = (args[i+1])? args[i+1] : img.MM_up;
      nbArr[nbArr.length] = img;
  } }
}

function MM_validateForm() { //v4.0
  var i,p,q,nm,test,num,min,max,errors='',args=MM_validateForm.arguments;
  for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; val=MM_findObj(args[i]);
    if (val) { nm=val.name; if ((val=val.value)!="") {
      if (test.indexOf('isEmail')!=-1) { p=val.indexOf('@');
        if (p<1 || p==(val.length-1)) errors+='- '+nm+' must contain an e-mail address.\n';
      } else if (test!='R') { num = parseFloat(val);
        if (isNaN(val)) errors+='- '+nm+' must contain a number.\n';
        if (test.indexOf('inRange') != -1) { p=test.indexOf(':');
          min=test.substring(8,p); max=test.substring(p+1);
          if (num<min || max<num) errors+='- '+nm+' must contain a number between '+min+' and '+max+'.\n';
    } } } else if (test.charAt(0) == 'R') errors += '- '+nm+' is required.\n'; }
  } if (errors) alert('Please correct the following...\n'+errors);
  document.MM_returnValue = (errors == '');
}

