//Change these values every year
relayYear = 2011;
relayMonth = 4;
relayDay = 16;
lastChangeMonth = 4;
lastChangeDay = 9;
lateCharge = 5;

awards = new Array(7, 3, 7, 3, 7, 3, 3, 3, 3);
//Open, Women, Mixed, Masters, Hcap, Wom-Mas, Mix-Mas, Corp, Corp_Hcap

var summary = "";
var lastSummary = "";
var teamHcap = 0;
var teamSum = 0;
var lastDivision = 0;
var males = 0
var females = 0;
var young = 0;
var numberX = 0;
numberPref = new Array(0,0,0,0,0,0,0);

//Original team data prior to changes
mals = new Array("","","","","","","","","","");
fems = new Array("","","","","","","","","","");
mons = new Array("","","","","","","","","","");
days = new Array("","","","","","","","","","");
years = new Array("","","","","","","","","","");
mins = new Array("","","","","","","","","","");
secs = new Array("","","","","","","","","","");
shrts = new Array("","","","","","","","","","");

function nextSValue() {
//Generates successive fields from the data base when old data are retrieved
    n = summary.indexOf("^,^");
    summary = summary.substring(3 + n, summary.length);
    n = summary.indexOf("^,^");
    return summary.substring(0, n) 
}

var shirts = "SMLX"
//Generates t-shirt field from the data base when old data are retrieved
function shirt() {
    s = nextSValue()
    return shirts.indexOf(s) + 1 
}

function searchData(form) {
//Search for team in data base. Data are in "summary". Returns false if not found. 
  terms = " .-/,;:";
  summary = "";
  i = -1;
  p = form.entry.value;
  m = form.lastname.value.toUpperCase();
  found = false;
  EndData = (p == "") || (m == "");
  if (EndData) {
    alert("Enter last name and roster number")
    return}
  while (!EndData && !found) {
    i++;
    summary = Rosters[i];
    EndData = summary.substring(0, 1) == "#";
    if (EndData) {
      alert("Cannot find this roster")
      return}
    else {
      n = summary.indexOf("^,^");
      id = summary.substring(1, n);
      if (id == p) {
        summary = summary.substring(n + 3, summary.length)
        n = summary.indexOf("^,^");
        manager = summary.substring(0, n);
        k = manager.toUpperCase().indexOf(m);
        if ((k == manager.length - m.length) && 
          ((manager.length == m.length) || (terms.indexOf(manager.substring(k - 1, k)) > -1)))
            {found = true}
      }
    }
  }
  return found
}

function searchNumber(form) {
//Search for team numberin data base. Returns false if not found. 
  terms = " .-/,;:";
  summary = "";
  i = -1;
  p = form.entry.value;
  found = false;
  EndData = (p == "") 
  if (EndData) {
    alert("Enter roster number")
    return}
  while (!EndData && !found) {
    i++;
    summary = Rosters[i];
    EndData = summary.substring(0, 1) == "#";
    if (EndData) {
      alert("Cannot find this roster")
      return}
    else {
      n = summary.indexOf("^,^");
      id = summary.substring(1, n);
      if (id == p) {found = true}
    }
  }
  return found
}

function saveOriginals(form, i) {
//Save original runner information
  var n = (10 * i) + RformStart   //RformStart is starting field for Runner 1
  if (i == 9) n++			//10 fields per runner
  mals[i] = form[n + 1].checked;
  fems[i] = form[n + 2].checked;
  mons[i] = form[n + 3].value;
  days[i] = form[n + 4].value;
  years[i] = form[n + 5].value;
  mins[i] = form[n + 6].value;
  secs[i] = form[n + 7].value;
  shrts[i] = form[n + 8].value;
}

function findData(form) {
//Retrieve exisiting data from the data base when "Retrieve data" button is pressed
  if (searchData(form)) {
    form.manager.value = manager;
    lastSummary = summary;
    form.raceNumber.value = nextSValue()
    form.startTime.value = nextSValue()
    form.status.value = nextSValue()
    form.teamname.value = nextSValue()
    form.fromcity.value = nextSValue()
    form.fromstate.value = nextSValue()
    form.division.selectedIndex = nextSValue()
    form.division.selectedIndex++
    lastDivision = form.division.selectedIndex 
    form.special.selectedIndex = nextSValue()
    form.special.selectedIndex++
    form.dayphone.value = nextSValue()
    form.evngphone.value = nextSValue()
    form.street.value = nextSValue()
    form.city.value = nextSValue()
    form.state.value = nextSValue()
    form.zip.value = nextSValue()
    form.announce.value = nextSValue()
    form.e_mail.value = nextSValue()
  
    for (var i = 0; i < 10; i++) {   //cycle through the runners and alternates
      var n = (10 * i) + RformStart   //RformStart is starting field for Runner 1
      if (i == 9) n++			//10 fields per runner
      form[n].value = nextSValue()
      s = nextSValue()
      form[n+1].checked = (s == "M") 
      form[n+2].checked = (s == "F") 
      form[n+5].value = nextSValue()  //year
      form[n+3].value = nextSValue()  //month
      form[n+4].value = nextSValue()  //day
      form[n+6].selectedIndex = shirt()
      s = nextSValue()
      form[n+9].checked = (s == "1")  //waiver
      form[n+7].value = nextSValue()
      if (i < 10) {form[n+8].value = nextSValue()}
    }
    form.secB.value = summary.substring(0, summary.length - 1);	//last value
    for (var i = 0; i < 10; i++) {saveOriginals(form, i)}
    form.teamname.focus()
  }
}

function findNames(form) {
//Retrieve exisiting data from the data base for waiver form
  if (searchData(form)) {
    for (var i = 0; i < 3; i++) { //delete irrelevant data
      nextSValue()} 
    form.teamname.value = nextSValue()
    form.number.value = form.entry.value
    for (var i = 0; i < 12; i++) { //delete irrelevant data
      nextSValue()} 
    for (var i = 0; i < 10; i++) { //runners and alternates
      var n = nextSValue()
      nextSValue() 
      var y = nextSValue()
      var m = nextSValue()
      var d = nextSValue()
      var a = computeAge(y, m, d)
      if (a > 0 && a < 18) {form[2 * i + 2].value = "* " + n}
      else {form[2 * i + 2].value = n}
      s = nextSValue()	//t-shirt
      s = nextSValue()
      form[2 * i + 3].checked = (s == "1")  //waiver
      s = nextSValue()	//5K time
      s = nextSValue()
    }
  }
}

function findMinor(form) {
//Retrieve team name from the data base for minor waiver form
  if (searchNumber(form)) {
    for (var i = 0; i < 4; i++) { //delete irrelevant data
      nextSValue()} 
    form.teamname.value = nextSValue()
  }
}

function checkNumber(str, min, max) {
//General routine for making sure that an entry is numerical within the limits min and max
  while (str.length > 0 && str.indexOf(' ', 0) == 0)
    {str = str.substring(1, str.length)}
  while (str.length > 0 && str.indexOf(' ', str.length - 1) == str.length - 1)
    {str = str.substring(0, str.length - 1)}
  for (var i = 0; i < str.length; i++) {
    var ch = str.substring(i, i + 1)
    if ((ch < "0" || "9" < ch) && ch != '.') return false;
  }
  var num = 0 + str
  if (num < min || max < num) return false;
  return true;
}

function timeString(sec) {
//Converts a time in seconds to a string
  var s = sec % 60;
  var m = (sec % 3600  - s) / 60;
  var h = (sec - (60 * m) - s) / 3600;
  if (s < 10) s = "0" + s;
  if (m < 10) m = "0" + m;
  if (h == 0) return m + ":" + s;
  else return h + ":" + m + ":" + s
}

function seconds(min, sec) {
//Converts a string to number of seconds
  if (min == "") m = "0"; else m = min;
  if (sec == "") s = "0"; else s = sec;
  return 60*eval(m) + eval(s)
}

function plural(n, s) {
  if (n == 1) {return n + s}
  else {return n + s + "s"}
}

function changetext(box, initial, item) {
//Look for left-over '_' characters in a text box
  OK = (box.value.substring(0, 1) != "_" || box.value == initial);
  if (!OK) {
    alert("Please remove the initial text from " + item)
    box.focus();
    return true
  }
  else {return false}
}

function textNotSet(box, str) {
//Make sure text in a text box has been entered (OK = not entered)
  OK = ((box.value == str) || (box.value == ""))
  if (OK) {box.focus()}
  return OK
}

function dateOK(month, day, year) {
//Check for validity of a date. All zero entries is considered OK.
  return ((month.value == 0) && (day.value == 0) && (year.value == 0)) || 
     month.value == "" ||
       ( checkNumber(month.value, 1, 12) &&
         (day.value == "" || checkNumber(day.value, 1, 31)) &&
         (year.value == "" || 
           checkNumber(year.value, 0, 99) || checkNumber(year.value, relayYear - 105, relayYear - 2) ) ) 
  }

function NoPhone(box, str) {
//Checks phone numbers for suitable format
  if (textNotSet(box, str)) {return false}
  nlist = "0123456789"
  var n = 0
  for (var i = 0; i < box.value.length; i++) {
    var ch = box.value.substring(i, i + 1)
    if (nlist.indexOf(ch) > -1) {n++}
  }
  if (n == 0 || n == 7 || n > 9) {return false}
  else {
    alert("There is an error in your phone number")
    box.focus()
    return true
  }
}

function NoZip(box) {
//Checks zip code entry for correct format
  nlist = "0123456789"
  llist = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  var l = 0
  var n = 0
  for (var i = 0; i < box.value.length; i++) {
    var ch = box.value.substring(i, i + 1).toUpperCase()
    if (nlist.indexOf(ch) > -1) {n++}
    else {if (llist.indexOf(ch) > -1) {l++}
          else {if (ch != '-' && ch!= ' ') {n = 100}}}
  }
  if (n == 5 || n == 9  || (n == 3 && l > 2)) {return false}
  else {
    alert("There is an error in your zip code")
    box.focus()
    return true
  }
}

function testEmail(m) {
//Make sure that e-mail address conforms to normal syntax
  OK = false;
  if (m.value == "") {
    m.focus()
    alert("Please provide an E-mail address")
    return true
  }
  invalid = "/:,;"
  for (i=0; i<invalid.length; i++) {
    b = invalid.charAt(i)
    if (m.value.indexOf(b, 0) > -1) {OK = true}
  }
  p = m.value.indexOf("@", 1)
  if ((p == -1) || (m.value.indexOf("@", p + 1) > -1)) {OK = true}
  q = m.value.indexOf(".", p)
  if ((q == -1) || (q + 2 > m.value.length)) {OK = true}
  if (OK) {
    alert("Please make sure that your e-mail address is valid")
    m.focus()
  }
  return OK
}

function onNoChange(form) {
//Attempted change to read-only field
  alert('You cannot change this field from the roster page') 
  summary = lastSummary;
  form.raceNumber.value = nextSValue()
  form.startTime.value = nextSValue()
  form.status.value = nextSValue()
}

function runnerChange(form, i) {
//Has data for runner i been changed. Exclude trades of alternate
  var n = (10 * i) + RformStart   //RformStart is starting field for Runner 1
  if (i == 9) n++			//10 fields per runner
  change = form[n].value != "[Alternate A]" && form[n].value != "[Alternate B]" && 
   (mals[i] != form[n + 1].checked || fems[i] != form[n + 2].checked ||
    mons[i] != form[n + 3].value || days[i] != form[n + 4].value || 
    years[i] != form[n + 5].value || mins[i] != form[n + 6].value || 
    secs[i] != form[n + 7].value || shrts[i] != form[n + 8].value)
  return change
}

function lateChanges(form) {
//change if Sex, Born, K5Time, or Shirt change
  now = new Date
  M = "Do you want to submit the roster now?"
  n = 0;
  i = 0;
  for (var i = 0; i < 10; i++) { if (runnerChange(form, i))  {n++}  }
  lastChange = new Date(relayYear, lastChangeMonth - 1, lastChangeDay - 1)
  if (now > lastChange && n != 0) {
    alert("You have made " + plural(n, " change") + ". A charge of $" + n * lateCharge + " will be assessed unless you cancel the changes")
    M = M + ' To cancel the changes, press "Cancel", then retrieve the data again.'
  }
  return M
}

function noClick(box) {
//Attempted change to read-only field
  box.checked = !box.checked
  alert('You cannot change this field from the roster page') 
}

function Allowed(d1, d2) {
//Allowable division changes after cutoff date (see checkDivision) 
  if (d1 == 0) {return true}
  if (d2 == 1) {return true}
  if ((d1 == 5) && ((d2 == 2) || (d2 == 4))) {return true}
  if ((d1 == 6) && ((d2 == 3) || (d2 == 4))) {return true}
  {return false}
}

function checkDivision(form) {
/*
  Tests division changes to see if they are legitimate, and tests roster composition to make
    sure it is consistent with division.
*/
  now = new Date
  lastChange = new Date(relayYear, lastChangeMonth - 1, lastChangeDay - 1)
  if ((now > lastChange) && !(form.division.selectedIndex == lastDivision)
    && !(Allowed(lastDivision, form.division.selectedIndex))) {
      alert("Sorry, it's too late to make such a change in division")
      form.division.selectedIndex = lastDivision
      form.division.focus()
      return true
  }  
  else {
    countRunners(form)
    if (checkRunners(form.division.selectedIndex)) {return false}
    else {
      alert("Your current roster does not qualify for your chosen division")
      return true
    }
  }
}

function countRunners(form) {
//Counts males, females, and under-40 runners 
  males = 0
  females = 0
  young = 0
  if (form.sex1[0].checked) males++
  if (form.sex2[0].checked) males++
  if (form.sex3[0].checked) males++
  if (form.sex4[0].checked) males++
  if (form.sex5[0].checked) males++
  if (form.sex6[0].checked) males++
  if (form.sex7[0].checked) males++
  if (form.sex8[0].checked) males++
  if (form.sex1[1].checked) females++
  if (form.sex2[1].checked) females++
  if (form.sex3[1].checked) females++
  if (form.sex4[1].checked) females++
  if (form.sex5[1].checked) females++
  if (form.sex6[1].checked) females++
  if (form.sex7[1].checked) females++
  if (form.sex8[1].checked) females++
  var a = computeAge(form.year1.value, form.month1.value, form.day1.value)
  if (a < 40 && a > 0) young++
  a = computeAge(form.year2.value, form.month2.value, form.day2.value)
  if (a < 40 && a > 0) young++
  a = computeAge(form.year3.value, form.month3.value, form.day3.value)
  if (a < 40 && a > 0) young++
  a = computeAge(form.year4.value, form.month4.value, form.day4.value)
  if (a < 40 && a > 0) young++
  a = computeAge(form.year5.value, form.month5.value, form.day5.value)
  if (a < 40 && a > 0) young++
  a = computeAge(form.year6.value, form.month6.value, form.day6.value)
  if (a < 40 && a > 0) young++
  a = computeAge(form.year7.value, form.month7.value, form.day7.value)
  if (a < 40 && a > 0) young++
  a = computeAge(form.year8.value, form.month8.value, form.day8.value)
  if (a < 40 && a > 0) young++
}

function checkRunners(d) {
//Checks legitimacy of roster composition 
  var s = "Your roster contains "
  if (young > 0) {s = s + plural(young, " runner") + " under 40, "}
  s = s + plural(males, " male") + " and " + plural(females, " female")
  if (males + females > 0) {alert(s)}
  if (d == 2) {return males == 0}					  //women
  if (d == 3) {return males < 6 && females < 6} 		  //mixed
  if (d == 4) {return young == 0}				   	  //masters
  if (d == 5) {return males == 0 && young == 0}			  //women masters
  if (d == 6) {return males < 6 && females < 6 && young == 0} //mixed masters
  return true								  //others
}

function handicap(age, female) {
//Calculates handicap for a runner by table look-up. Tables are minutes and seconds.
  var minM = "1715131109070503020101000000000000000000000000000101010202020303030404050506060707080809091010111112121314151617181920212223242627293032";
  var minF = "1917161514131211101009090808080807070808080809091010111112121313141415151617171819192021212223242526272829303233353739414345485154576063";
  var secM = "0000000000000030303000300000000000000000000020400020400020400020400030003000300030003000300030003000453015000000000000000000300030003000";
  var secF = "3030303030303030300030004520100050500010204000200030003000300030003000302000402000402000453015000000000000300030000000000030000000000000";
  var i = (age - 10) * 2;
  s = 0;
  if (i < 0) {
    if (female) m = 19.5 - i; else m = 17 - i
  }
  else if (i > 134) {
    if (female) m = 63 + (1.5 * (i - 134)); else m = 32 + (.75 * (i - 134))
  }
  else if (female) {
    m = 1 * minF.substring(i, i + 2);
    s = 1 * secF.substring(i, i + 2);
  }
  else {
    m = 1 * minM.substring(i, i + 2);
    s = 1 * secM.substring(i, i + 2);
  }
  return 60 * m + s
}

function computeAge(yr, m, d) {
/*
  Calculate { based on date of relay }
  Note: Relay date is defined at top of form 
*/
  y = yr * 1;
  if ((checkNumber(y, 0, 99) || checkNumber(y, relayYear - 105, relayYear - 2)) &&
       checkNumber(m, 1, 12) &&
       checkNumber(d, 1, 31)) {
    var age = relayYear - y;
    if (y < 100) {
      if (2000 + y < relayYear - 2) {age = age - 2000}
      else {age = age - 1900}
    }
    if (m > relayMonth) age = age - 1;
    else if (m == relayMonth && d > relayDay) age = age - 1;
    return age;
  }
  else return 0
}

function computeHcap(year, month, day, sex) {
//Calculate handicap for a runner
  var a = computeAge(year.value, month.value, day.value);
  if (a == 0) return 0;
  h = handicap(a, sex.checked);
  return h;
}

function computeHandicap(form) {
//Calculate handicap for a team
  teamHcap = computeHcap(form.year1, form.month1, form.day1, form.sex1[1])
  + computeHcap(form.year2, form.month2, form.day2, form.sex2[1])
  + computeHcap(form.year3, form.month3, form.day3, form.sex3[1])
  + computeHcap(form.year4, form.month4, form.day4, form.sex4[1])
  + computeHcap(form.year5, form.month5, form.day5, form.sex5[1])
  + computeHcap(form.year6, form.month6, form.day6, form.sex6[1])
  + computeHcap(form.year7, form.month7, form.day7, form.sex7[1])
  + computeHcap(form.year8, form.month8, form.day8, form.sex8[1]);
  form.teamHcap.value = timeString(teamHcap);
  if (teamSum != 0) form.adjusted.value = timeString(teamSum - teamHcap);
}

function has5K(min, sec, runner) {
  if (!(min.value == "") && (bestOK(min, sec))) return true
  alert("Need valid 5K time for Runner #" + runner)
}

function computePredict(form) {
//Calculate predicted time for a team
  if (has5K(form.min1, form.sec1, 1)
   && has5K(form.min2, form.sec2, 2)
   && has5K(form.min3, form.sec3, 3)
   && has5K(form.min4, form.sec4, 4)
   && has5K(form.min5, form.sec5, 5)
   && has5K(form.min6, form.sec6, 6)
   && has5K(form.min7, form.sec7, 7)
   && has5K(form.min8, form.sec8, 8)) {
  teamSum = (seconds(form.min1.value, form.sec1.value)
           + seconds(form.min2.value, form.sec2.value)
           + seconds(form.min3.value, form.sec3.value)
           + seconds(form.min4.value, form.sec4.value)
           + seconds(form.min5.value, form.sec5.value)
           + seconds(form.min6.value, form.sec6.value)
           + seconds(form.min7.value, form.sec7.value)
           + seconds(form.min8.value, form.sec8.value));
  teamSum = Math.exp(0.6 * Math.log(teamSum * 3.5)) * 102 - 19500;
  teamSum = teamSum - (teamSum % 1);
  form.result.value = timeString(teamSum);
  if (teamHcap != 0) form.adjusted.value = timeString(teamSum - teamHcap)
  }
  else {
    form.result.value = "";
    form.adjusted.value = "";
  }
}

function noPref(box) {
//Checks preference box and records values for later testing
  if (box.value == "x" || box.value == "X") {numberX++}
  for (var i = 1; i < 7; i++) {
    if (checkNumber(box.value, i, i)) {numberPref[i]++}
  }
  NotOK = !(checkNumber(box.value, 1, 6) || (box.value == "x") || (box.value == "X"))
  if (NotOK) {box.focus()}
  return NotOK
}

function checkPref(form) {
//Checks preferences to make sure each box has an entry (Entry forms only)
  numberX = 0
  for (var i = 1; i < 7; i++) {numberPref[i] = 0}
  if (noPref(form.pref1) ||
      noPref(form.pref2) ||
      noPref(form.pref3) ||
      noPref(form.pref4) ||
      noPref(form.pref5) ||
      noPref(form.pref6)) {
    alert("Please enter preferences for each starting time")
    return true
  }
}

function checkOrder(box) {
//Checks preferences to make sure they are rank ordered correctly
  NotOK = false
  for (var i = 1; i < 7 - numberX; i++) {
    if (!(numberPref[i] == 1)) {NotOK = true}
  }
  if (NotOK) {
    box.focus()
    alert("Please make sure starting times are rank ordered correctly")
  }
  return NotOK
}

function testAward(form) {
//Checks to see if award winner has entered relevant information
  if (form.award.checked &&
     (form.winner.selectedIndex == 0 || form.place.selectedIndex == 0 ))
  {
    alert("Please enter division and place of award")
    form.winner.focus()
    return true
  }
  else {if (form.place.selectedIndex > awards[form.winner.selectedIndex - 1]) {
    alert("Please enter correct place of award")
    form.winner.focus()
    return true
    }
    else {return false}
  }
}

function testVolunteer(form) {
//Checks to see if volunteer winner has entered stage information
  if (form.volunteer.checked && form.stage.value == "" )
  {
    alert("Please enter stage where you volunteered")
    form.stage.focus()
    return true
  }
  else {return false}
}

function testPredict(form) {
//Checks to see if a predicted time is legitimate, between 5 and 15 hours
  if (checkNumber(form.mins.value, 0, 60) && checkNumber(form.hrs.value, 5, 15)) 
    return false;
  else {
    alert("Please make sure predicted time is correct")
    form.hrs.focus()
    return true
  }
}

function bestOK(min, sec) {
//Check for validity of a 5K time (> 12 min. and < 60 min.)
  return ((min.value == 0) && (sec.value == 0)) || min.value == "" || 
     ( checkNumber(min.value, 12, 59) &&
       (sec.value == "" || checkNumber(sec.value, 0, 59)) )
}

function testAlt(form, alt) {
//Check validity of data for an alternate if substituted
  if (alt == "A") {a = RformStart + 80} else {a = RformStart + 91}
  if (!form[a+1].checked && !form[a+2].checked) {
    form[a].focus()
    alert("Information for Alternate " + alt + " is missing");
    return true
  }
  if (dateOK(form[a+3], form[a+4], form[a+5]) && bestOK(form[a+7], form[a+8])) 
    {return false}
  else {
    form[a+3].focus()
    alert("Please make sure the information for Alternate " + alt + " is correct");
    return true
  }
}

function addAlternate(form, alt) {
//Substitute an alternate for another runner
  if (testAlt(form, alt)) {return}
  r = window.prompt("Substitute for which runner (1 - 8)?","")
  if ((r == null) || !checkNumber(r, 1, 8)) {return}
  n = RformStart + ((r - 1) * 10)
  if (alt == "A") {a = RformStart + 80} else {a = RformStart + 91}
  if (alt == "A") {form[n].value = "[Alternate A]"}
  else {form[n].value = "[Alternate B]"}
  form[n+1].checked = form[a+1].checked
  form[n+2].checked = form[a+2].checked
  form[n+3].value = form[a+3].value 
  form[n+4].value = form[a+4].value 
  form[n+5].value = form[a+5].value
  form[n+6].selectedIndex = form[a+6].selectedIndex 
  form[n+7].value = form[a+7].value 
  form[n+8].value = form[a+8].value 
}

function testRunner(month, day, year, min, sec, runner) {
//Check date and 5K time for a runner. Returns false if OK.
  if (dateOK(month, day, year)) {
    if (min == null) return false
    if (bestOK(min, sec)) return false
    else {
      alert("Please make sure the 5K time is correct for Runner #" + runner + ' (The time must be greater than 12 minutes and less than one hour)');
      min.focus()
      return true
    } 
  }
  else {
    alert("Please make sure the date is correct for Runner #" + runner + " (Use month/day/year format)");
    month.focus()
    return true
  }
}

function checkForm(form) {
//Check validity of a roster form prior to submission
  if (textNotSet(form.teamname, "_Team_Name") ||
      textNotSet(form.manager, "_Manager")) {
    alert("Please provide both team name and manager's name");
    return false;
  }
  if (!textNotSet(form.zip, "_Zip") && NoZip(form.zip)) {return false}
  if (!textNotSet(form.e_mail, "_E-mail") && testEmail(form.e_mail)) {return false}
  if (NoPhone(form.dayphone, "_Phone_(Day)")) {
    form.dayphone.focus()
    return false;
  }
  if (NoPhone(form.evngphone, "_(Evening)")) {
    form.evngphone.focus()
    return false;
  }

  if (checkDivision(form)) {return false}

  for (var i = 0; i < 10; i++) { //test each runners and alternate
    var n = (10 * i) + RformStart //RformStart is starting field for Runner 1
    runner = i + 1;
    if (i == 8) {runner = "A"}   
    if (i == 9) {
      runner = "B"
      n++   
    }
    if (testRunner(form[n+3], form[n+4], form[n+5], form[n+7], form[n+8], runner))
      {return false} 
  }
  if (textNotSet(form.employer, "") &&
    form.division.selectedIndex > 7 && form.division.selectedIndex < 9) {
    alert("Please provide name of employer for Corporate teams");
    return false;
  }

  if (changetext(form.teamname, "_Team_Name", "Team name") ||
      changetext(form.fromcity, "_From_(City)", "Team's city") ||
      changetext(form.fromstate, "_(State)", "Team's state") ||
      changetext(form.manager, "_Manager", "Manager's name") ||
      changetext(form.dayphone, "_Phone_(Day)", "Day phone") ||
      changetext(form.evngphone, "_(Evening)", "Evening phone") ||
      changetext(form.street, "_Street", "Manager's address") ||
      changetext(form.city, "_City", "Manager's address") ||
      changetext(form.state, "_State", "Manager's address") ||
      changetext(form.zip, "_Zip", "Zip code") ||
      changetext(form.e_mail, "_E-mail", "E-mail") )
    return false;
  return confirm(lateChanges(form))
}

function checkSurvey(form) {
//Check validity of a survey form prior to submission
  if (!textNotSet(form.zip, "_Zip") && NoZip(form.zip)) {return false}
  if (changetext(form.zip, "_Zip", "Zip code")) {return false};
  return confirm("Do you want to submit the survey now?")
}

function checkEntryForm(form) {
//Check validity of an entry form prior to submission
  if (textNotSet(form.teamname, "_Team_Name") ||
      textNotSet(form.fromcity, "_From_(City)") ||
      textNotSet(form.manager, "_Manager") ||
      textNotSet(form.street, "_Street") ||
      textNotSet(form.city, "_City") ||
      textNotSet(form.state, "_State") ||
      textNotSet(form.zip, "_Zip")) {
    alert("Please provide team name and location, together with manager's name and address");
    return false;
  }
  if (textNotSet(form.employer, "") &&
    form.division.selectedIndex > 7) {
    alert("Please provide name of employer for Corporate teams");
    return false;
  }
  if (NoPhone(form.dayphone, "_Phone_(Day)")) {
    form.dayphone.focus()
    return false;
  }
  if (NoPhone(form.evngphone, "_(Evening)")) {
    form.evngphone.focus()
    return false;
  }
  if (NoZip(form.zip)) {
    return false;
  }
  if (testEmail(form.e_mail)) {return false}
  if (checkPref(form)) {return false}
  if (checkOrder(form.pref1)) {return false}
  if (testPredict(form)) {return false}
  if (testAward(form)) {return false}
  if (testVolunteer(form)) {return false}

  if (changetext(form.teamname, "_Team_Name", "Team name") ||
      changetext(form.fromcity, "_From_(City)", "Team's city") ||
      changetext(form.fromstate, "_(State)", "Team's state") ||
      changetext(form.manager, "_Manager", "Manager's name") ||
      changetext(form.dayphone, "_Phone_(Day)", "Day phone") ||
      changetext(form.evngphone, "_(Evening)", "Evening phone") ||
      changetext(form.street, "_Street", "Manager's address") ||
      changetext(form.city, "_City", "Manager's address") ||
      changetext(form.state, "_State", "Manager's address") ||
      changetext(form.zip, "_Zip", "Zip code") ||
      changetext(form.e_mail, "_E-mail", "E-mail") ) {
    return false
  }
  if (form.division.selectedIndex == 0) {
    form.division.focus() 
    return confirm("No division has been entered. Do you want to submit the entry form anyway?")
  }
  else {return confirm("Do you want to submit the entry form now?")}
}


