
  var a, b, c;

  function getReaction() {
    try {
      a = document.getElementById("reaction");
      if ( a.value != "0.0000" ) return a.value;
    }
    catch (e) {
      return document.censusform.reaction.value;
    }
  }

  function setReaction(v) {
    try {
      a = document.getElementById("reaction");
      a.value = v;
    }
    catch (e) { 
      document.censusform.reaction.value = v;
    }
  }

  function setButton(t) {
    try {
      c.value = t;
    }
    catch (e) {
      document.censusform.reactionc.value = t;
    }
  }
  function setButtons(state)
  {
    try {
      b = document.getElementById("reactionb");
      c = document.getElementById("reactionc");
    }
    catch (e) {
      return;
    }

    switch (state)
    {
    case 0:
      // this is the default: "Click to start" X
      b.style.display = "inline";
      c.style.display = "none";
      c.className = "startbutton";
      break;
    case 1:
      // while running: X "Wait ..."
      b.style.display = "none";
      c.style.display = "inline";
      c.className = "startbutton";
      setButton("Wait for the change ...");
      break;
    case 2:
      // wait for click: X "Click now"
      b.style.display = "none";
      c.style.display = "inline";
      c.className = "stopbutton";
      setButton("Click to stop");
      break;
    case 3:
      // finished: X "Finished (0.02)"
      b.style.display = "none";
      c.style.display = "inline";
      c.className = "donebutton";
      var t = "Finished (%.3f seconds)";
      var re = /([^%]*)%(\.\d+f)(.*)/;
      var tb = []; // don't catch this
      tb = re.exec(t);
      t = tb[1] + getReaction() + tb[3];
      setButton(t);
      break;
    }
  }

  var startTime=new Date();
  var endTime=new Date();
  var startPressed=false;
  var bgChangeStarted=false;
  var maxWait=20;
  var timerID;

  function reaction_start()
  {
    if ( getReaction() )
    {
      alert("You only get one attempt at this question");
      return;
    }

    if ( !startPressed ) 
    {
      // Not started
      setButtons(1);
      startPressed   =true;
      bgChangeStarted=false;

      timerID=setTimeout('startTest()', 10000*randNumber() + 5000);
    }
  }

  function startTest() {
    setButtons(2);
    //startPress   =true;
    bgChangeStarted=true;

    startTime=new Date();
  }

  function reaction_stop() {
    if ( getReaction() )
    {
      alert("You only get one attempt at this question");
      return;
    }

    if (!bgChangeStarted) {
      // premature
      // restart
      setButtons(0);
      startPressed   =false;
      bgChangeStarted=false;
      
      clearTimeout(timerID);
      alert("Wait until you are told to click");
    }
    else
    if (bgChangeStarted) {
      // right on time
      endTime=new Date();
      var responseTime=(endTime.getTime()-startTime.getTime())/1000;
      setReaction(responseTime);

      setButtons(3); // must come after setReaction
      startPressed   =false;
      bgChangeStarted=false;
    }
  }

  var today=new Date();
  var randSeed=today.getSeconds();

  function randNumber() {
    randSeed = (0x015a4e35 * randSeed + 1) % (1 << 31);
    return((randSeed >> 15) & 0x7fff) / 32767;
  }


