var timerID = null;
var resizeTimerID = null;
var timerRunning = false;
var t0, t1;
var tscore = parseInt(0);
var ttime = parseInt(0);
var tprobs = parseInt(0);
var tMoreProbs = parseInt(0);	// for use in moreProblems
var focusTimerID = null;
var submitHwTimerID = null;
var INVALID = -9999;
var focusElemP, focusElemN;
var B_NN4  = 140;
var B_NN6  = 160;
var B_IE4  = 240;
var B_IE5  = 250;
var B_IE55 = 255;
var B_IE6  = 260;
var B_STAN = 360;

var scrollMsgTimerID = null;
var numMsgs = 9;
var curMsg = 0;
var scrollMsg = new Array(numMsgs);
scrollMsg[0] = "There are <strong>86</strong> different problem levels.";
scrollMsg[1] = "Use the <strong>Select Problem Level</strong> menu to go to a different level.";
scrollMsg[2] = "Use the <strong>Show fewer levels</strong> menu to choose a problem group.";
scrollMsg[3] = "This reduces the levels shown in <strong>Select Problem Level</strong> menu.";
scrollMsg[4] = "There is <strong>help</strong> available for all but the simple levels.";
scrollMsg[5] = "When you click on <strong>Check Answers</strong>, your answers are graded.";
scrollMsg[6] = "On levels with help, a <strong>?</strong> is shown in the problem box when there is an error.";
scrollMsg[7] = "Clicking on this <strong>?</strong> brings up a help window where the solution is explained.";
scrollMsg[8] = "To explore all levels that have such help, choose group \"<strong>Those with Help</strong>\".";

function fillProbLevels(grp, $level) {
  fillGroupLevels(grp, document.ctrlFrm.problevel, $level);
}

function selectGroup(sel, platform, $AcctName, $AcctApwd, $level) {
  var val=sel.selectedIndex;
  fillProbLevels(val, $level);
  document.ctrlFrm.problevel.selectedIndex = $level;
  selectLevel(document.ctrlFrm.problevel, platform, $AcctName, $AcctApwd);
}

function initProbLevels($level, $platform, $AcctName, $AcctApwd) {
  var lev = parseInt($level);
  if (lev < 1)
    lev = 1;
  document.ctrlFrm.probgroup.selectedIndex = 0;
  selectGroup(document.ctrlFrm.probgroup, $platform, $AcctName, $AcctApwd, lev-1);
}

function setFocus2() {
   var ix = document.ctrlFrm.cursorJump.selectedIndex;
   if (focusTimerID) {
     if (ix == 0)	// Left jump
       focusElemP.focus();
     else if (ix == 1)	// Right Jump
       focusElemN.focus();
     clearTimeout(focusTimerID)
     focusTimerID = null;
   }
}

function doDebug() {
   window.status = 'test:';
}

function writeNN4Div(dObj, str)
{
    with (dObj) {
      document.open();
      document.write(str);
      document.close();
    }
    // We need to re-assign the z-index value
    dObj.zIndex = 10;
}

function setFocus(evt, elem, elemP, elemN, mlen) {
   var kcode;
   if (chkBrowser() == B_NN4)
     kcode = evt.which;
   else
     kcode = evt.keyCode;
   window.status = 'kcode:' + kcode;
   if (parseInt(mlen) <= 3 && kcode == 46)
     kcode = 0;
   if (kcode > 0) {
     var ttt = String.fromCharCode(kcode);
     //window.status = 'Key:' + kcode + ': ' + String.fromCharCode(kcode) + ' max:' + mlen;
     // window.status = 'val:' + elem.value + ' len: ' + elem.value.length + ' max:' + mlen;
     if (kcode == 13 || kcode == 45 || kcode == 46 ||
	 (ttt >= '0' && ttt <= '9')) {
       if (kcode == 13 || kcode == 9 ||
	   (1+elem.value.length) >= parseInt(mlen)) {
	 var ix = document.ctrlFrm.cursorJump.selectedIndex;
	 if (ix != 2) {
	   focusElemP = elemP;
	   focusElemN = elemN;
	   focusTimerID = setTimeout("setFocus2()",50);
           window.status = 'Jump:val:' + ttt + ' len: ' + elem.value.length + ' max:' + mlen;
	 }
       }
       else
         window.status = 'val:' + ttt + ' len: ' + elem.value.length + ' max:' + mlen;
     }
     else if (kcode != 9)
     {
       elem.value = '';
       if (chkBrowser() == B_NN4)
         evt.which = 32;
       else
         evt.keyCode = 32;
       window.status = 'Illegal kcode:' + kcode;
     }
   }
}

function stopclock(){
   if(timerRunning)
      clearTimeout(timerID)
   timerRunning = false
}

function initSpans() {
  if (document.layers)
  {
    // alert('Browser is layers');
    document.clock.left  = document.clockMarker.x;
    document.clock.top   = document.clockMarker.y - 12;
    document.cscore.left = document.csMarker.x;
    document.cscore.top  = document.csMarker.y;
    document.tscore.left = document.tsMarker.x;
    document.tscore.top  = document.tsMarker.y;
    document.ctime.left  = document.ctMarker.x;
    document.ctime.top   = document.ctMarker.y;
    document.ttime.left  = document.ttMarker.x;
    document.ttime.top   = document.ttMarker.y;
    document.chksub.left = document.chkMarker.x;
    document.chksub.top  = document.chkMarker.y - 16;
    document.hlpdv.left = document.hlpMarker.x;
    document.hlpdv.top  = document.hlpMarker.y - 16;
    document.scrollMsgdv.left = document.scrollMsgMarker.x;
    document.scrollMsgdv.top  = document.scrollMsgMarker.y - 16;
    document.problems.left = document.probMarker.x;
    document.problems.top  = document.probMarker.y;
    window.status = 'Prob left:' + document.problems.left + '  top: ' + document.problems.top;
  }
  else if (chkBrowser() == B_IE4)
  {
    // alert('Browser is IE4');
    //document.all.clock.style.left = document.clockImage.offsetLeft;  
    //document.all.clock.style.top  = document.clockImage.offsetTop;  
  }
  else
  {
    // alert('Browser is STANDARDS');
    // var chksubElem = document.getElementById("chksub");
    // var chkMarkerElem = document.getElementById("chkMarker");
    // chksubElem.left = chkMarkerElem.x;
    // chksubElem.top  = chkMarkerElem.y;
    // var probElem  = document.getElementById("problems");
    // var probMarkerElem = document.getElementById("probMarker");
    // probElem.left = probMarkerElem.x;
    // probElem.top  = probMarkerElem.y;
  }
}

function startclock(){
   // Make sure the clock is stopped
   stopclock();
   var d0 = new Date();
   var ds0 =d0.toLocaleString();
   t0=Date.parse(ds0);
   showtime();
}

function setClock(val0) {
  var val = '&nbsp;&nbsp;' + val0 + '&nbsp;';
  if (chkBrowser() == B_NN4)
  {
    var str =	'<body bgcolor="blue">' +
		'<strong><font color="white"> ' + val + ' </font></strong>' +
		'</body>';
    writeNN4Div(document.clock, str);
  }
  else if (chkBrowser() == B_IE4)
    document.all.clock.innerHTML = val;
  else
  {
    var clkElem = document.getElementById("clock");
    clkElem.innerHTML = val;
  }
}

function selAppmodeHtml($appmode, $AcctName, $AcctApwd, $teacher, $hwork, $pass) {
    var chkSubStr, csStr, ctStr, tsStr, ttStr;
    var chkBrw = chkBrowser();
    if ($appmode == 0) {
      chkSubStr = '<a href="#" OnClick="checkAnswers(\'' + $AcctName + '\',\'' + $AcctApwd +'\');return false;">' +
		  '<img src="images/check-ready.gif" border=0 alt="Check Answers"></a>&nbsp;&nbsp;';
      csStr     = '<body> <font size="-1">' +
		    'Current Score = ' +
		  '</font> </body>';
      ctStr     = '<body> <font size="-1">' +
		    'Time per problem = ' +
		  '</font> </body>';
      tsStr     = '<body> <font size="-1">' +
		    'Total Score = ' +
		  '</font> </body>';
      ttStr     = '<body> <font size="-1">' +
		    'Time per problem = ' +
		  '</font> </body>';
    }
    else {
      chkSubStr = '<body> &nbsp;&nbsp;&nbsp;&nbsp;' +
		  '<a href="#" OnClick="submitAnswers(\'' + $AcctName + '\',\'' + $AcctApwd +'\');return false;">' +
		  '<img src="images/submit-ready.gif" border=0 alt="Submit Answers"></a>' +
		  '</body>';
      if (chkBrw == B_NN4)
      {
        csStr     = '<body><FORM NAME="hworkFrm"> ' +
		     '<strong>Teacher </strong>' +
		     '  <input TYPE=text SIZE=6 name="teacher" value="' + $teacher + '">' +
		     '&nbsp;&nbsp;&nbsp;&nbsp;<strong>Homework# </strong>' +
		     '  <input TYPE=text SIZE=4 name="hwork" value="' + $hwork + '">' +
		     '&nbsp;&nbsp;&nbsp;&nbsp;<strong>Password </strong>' +
		     '  <input TYPE=text SIZE=6 name="passwd">' +
		     '  <input TYPE=hidden name="needpass" value="' + $pass + '">' +
		     '</FORM></body>';
        tsStr     = '<body></body>';
        ttStr     = '<body></body>';
      }
      else {
        csStr     = '<body bgcolor="#ffaaaa"><FORM NAME="teachFrm"> <font size="-1">' +
		     '<strong>Teacher </strong>' +
		     '  <input TYPE=text SIZE=10 name="teacher" value="' + $teacher + '">' +
		     '</font></FORM></body>';
        tsStr     = '<body bgcolor="#aaaaff"><FORM NAME="hworkFrm"> <font size="-1">' +
		     '<strong>Homework# </strong>' +
		     '  <input TYPE=text SIZE=4 name="hwork" value="' + $hwork + '">' +
		     '&nbsp;&nbsp;&nbsp;&nbsp;<strong>Password </strong>' +
		     '  <input TYPE=text SIZE=6 name="passwd">' +
		     '  <input TYPE=hidden name="needpass" value="' + $pass + '">' +
		     '</font></FORM></body>';
      }
      ctStr     = '<body></body>';
      ttStr     = '<body></body>';
    }
    if (chkBrw == B_NN4)
    {
      writeNN4Div(document.chksub, chkSubStr);
      writeNN4Div(document.cscore, csStr);
      writeNN4Div(document.ctime,  ctStr);
      writeNN4Div(document.tscore, tsStr);
      writeNN4Div(document.ttime,  ttStr);
    }
    else if (chkBrw == B_IE4)
    {
      document.all.chksub.innerHTML = chkSubStr;
      document.all.cscore.innerHTML = csStr;
      document.all.ctime.innerHTML  = ctStr;
      document.all.tscore.innerHTML = tsStr;
      document.all.ttime.innerHTML  = ttStr;
    }
    else
    {
      var chksubElem = document.getElementById("chksub");
      chksubElem.innerHTML = chkSubStr;

      var cscoreElem = document.getElementById("cscore");
      cscoreElem.innerHTML = csStr;

      var ctimeElem = document.getElementById("ctime");
      ctimeElem.innerHTML = ctStr;

      var tscoreElem = document.getElementById("tscore");
      tscoreElem.innerHTML = tsStr;

      var ttimeElem = document.getElementById("ttime");
      ttimeElem.innerHTML = ttStr;
    }

    startclock();
    doScrollMsg();
}

function setCScore(val0) {
  var val = '<font size="-1"> Current Score = ' + val0 + '</font>';
  if (chkBrowser() == B_NN4)
    writeNN4Div(document.cscore, val);
  else if (chkBrowser() == B_IE4)
    document.all.cscore.innerHTML = val;
  else
  {
    var cscoreElem = document.getElementById("cscore");
    cscoreElem.innerHTML = val;
  }
}

function setTScore(val0) {
  var val = '<font size="-1"> Total Score = ' + val0 + '</font>';
  if (chkBrowser() == B_NN4)
    writeNN4Div(document.tscore, val);
  else if (chkBrowser() == B_IE4)
    document.all.tscore.innerHTML = val;
  else
  {
    var tscoreElem = document.getElementById("tscore");
    tscoreElem.innerHTML = val;
  }
}

function setCTime(val0) {
  var val = '<font size="-1">Time per problem = ' + val0 + '</font>';
  if (chkBrowser() == B_NN4)
    writeNN4Div(document.ctime, val);
  else if (chkBrowser() == B_IE4)
    document.all.ctime.innerHTML = val;
  else
  {
    var ctimeElem = document.getElementById("ctime");
    ctimeElem.innerHTML = val;
  }
}

function setTTime(val0) {
  var val = '<font size="-1">Time per problem = ' + val0 + '</font>';
  if (chkBrowser() == B_NN4)
    writeNN4Div(document.ttime, val);
  else if (chkBrowser() == B_IE4)
    document.all.ttime.innerHTML = val;
  else
  {
    var ttimeElem = document.getElementById("ttime");
    ttimeElem.innerHTML = val;
  }
}

function getTimeStr(msecs) {
   var secs = (msecs) / 1000;
   var hours = Math.floor(secs / 3600);
   var minutes = Math.floor((secs - hours*3600) / 60);
   var seconds = Math.floor(secs - hours*3600 - minutes*60);
   var timeValue = ((hours < 10) ? "0" : "") + hours;
   timeValue += ((minutes < 10) ? ":0" : ":") + minutes;
   timeValue += ((seconds < 10) ? ":0" : ":") + seconds;
   return timeValue;
}

function showtime() {
   var d1 = new Date();
   var ds1 = d1.toLocaleString();
   t1 = Date.parse(ds1) - t0;
   var timeValue = getTimeStr(t1);
   setClock(timeValue );
   timerID = setTimeout("showtime()",1000)
   timerRunning = true
}

function doScrollMsg() {
  var msgDivStr = scrollMsg[curMsg];
  if (++curMsg >= numMsgs)
     curMsg = 0;
  var chkBrw = chkBrowser();
  if (chkBrw == B_NN4)
    writeNN4Div(document.scrollMsgdv, msgDivStr);
  else if (chkBrw == B_IE4)
    document.all.scrollMsgdv.innerHTML = msgDivStr;
  else
  {
    var msgDivElem = document.getElementById("scrollMsgdv");
    msgDivElem.innerHTML = msgDivStr;
  }

  scrollMsgTimerID = setTimeout("doScrollMsg()",5000)
}

function getProbLevel()
{
  var ix = document.ctrlFrm.problevel.selectedIndex;
  if (ix < 0 || isNaN(ix))
  {
    document.ctrlFrm.problevel.selectedIndex = 0;
    ix = 0;
  }
  var val = document.ctrlFrm.problevel.options[ix].value;
  return parseInt(val);
}

function initProb()
{
  var frm = document.ctrlFrm;
  initProbs(getProbLevel());	// do this from the choice control handler later
}

function initProbs(pType)
{
  if (chkBrowser() == B_NN4)
    frm = document.problems.document.probFrm0;
  else
    frm = document.probFrm0;
  self.status = 'Ptype:' + pType + ' #elems:' + frm.elements.length;
  document.MathControl.setMathObj(pType);
  document.MathControl.setNumElems(frm.elements.length);
}

function getVal(frm, i)
{
  typ = frm.elements[i].type;
  if (typ == 'radio')
  {
    chk = frm.elements[i].checked;
    val = (chk == true) ? '1' : '0';
  }
  else
    val = frm.elements[i].value;
  return val;
}

function test1(j)
{
    if (chkBrowser() == B_NN4)
      frm = document.problems.document.forms[j];
    else
      frm = document.forms[j];
    var vals = new Array(frm.elements.length);
    var msg = 'Prob#' + (j-off) + '('+frm.name+')' + ' :'  + frm.elements.length + ' elems';
    for (i=0; i<frm.elements.length; i++)
    {
      val = getVal(frm, i);
      nam = frm.elements[i].name;
      typ = frm.elements[i].type;
      msg = msg + '\n  ' + (i+1) + '[' + nam + ' : ' + typ + '] = ' + val;
    }
    alert(msg);
}

function test0()
{
  if (chkBrowser() == B_NN4)
    frm = document.problems.document.probFrm0;
  else
    frm = document.probFrm0;

  var msg = 'Prob: ';
  for (i=0; i<frm.elements.length; i++)
  {
    val = getVal(frm, i);
    nam = frm.elements[i].name;
    typ = frm.elements[i].type;
    msg = msg + '\n  ' + (i+1) + '[' + nam + ' : ' + typ + '] = ' + val;
  }
  alert(msg);
}

function reduce() {
   if (resizeTimerID) {
	 window.resizeBy(-1, 0);
     clearTimeout(resizeTimerID)
     resizeTimerID = null;
   }
}

function timerResize() {
	window.resizeBy(1, 0);
    resizeTimerID = setTimeout("reduce()",50)
}

function writeProbSpan2(htmlStr) {
  if (chkBrowser() == B_NN4)
    writeNN4Div(document.problems, htmlStr);
  else if (chkBrowser() == B_IE4)
  {
    document.all.problems.innerHTML = htmlStr;
	timerResize();
  }
  else
  {
    var problemsElem = document.getElementById("problems");
    problemsElem.innerHTML = htmlStr;
  }
}

function htmlPre()
{
   return '<body>\n' +
	  '<table BGCOLOR="#E8E8C8" align="center" border="0" cellspacing="1" cellpadding="10">' +
	  '<tr>';
}

function htmlPost(doc)
{
   return  '</tr>' +
		 '</table>' +
	   '<hr>\n</body>\n';
}

function moreProblems(platform, $AcctName, $AcctApwd, $problevel)
{
  var nprobs = parseInt(document.ctrlFrm.nprobs.value);
  var ncols  = parseInt(document.ctrlFrm.ncols.value);

  window.status = 'Platform:' + platform;
  if ($problevel == 0)
    $problevel = getProbLevel();
  document.MathControl.setMathObj($problevel);
  var str = htmlPre();
  for (i=0; i<nprobs;)
  {
    str += '<td>' + document.MathControl.doProb((i+nprobs-1)%nprobs, i, (i+1)%nprobs) + '</td>';
    if ((++i)%ncols == 0)
       str += '</tr>\n<tr>';
  }
  str += htmlPost();
  // Some people still having problem. Hence remove this check.
  // document.MathControl.check_acct(platform);

  if (document.mathFrm.appMode[1].checked)
  {
    writeProbSpan(str, $problevel, 1);
    chkSubStr = '<body> &nbsp;&nbsp;&nbsp;&nbsp;' +
		'<a href="#" OnClick="submitAnswers(\'' + $AcctName + '\',\'' + $AcctApwd + '\');return false;">' +
		'<img src="images/submit-ready.gif" border=0 alt="Submit Answers"></a>' +
		'</body>';
  }
  else
  {
    writeProbSpan(str, $problevel, 0);
    chkSubStr = '<body>' +
		'<a href="#" OnClick="checkAnswers(\'' + $AcctName + '\',\'' + $AcctApwd + '\');return false;">' +
		'<img src="images/check-ready.gif" border=0 alt="Check Answers"></a>' +
		'</body>';
  }

  if (chkBrowser() == B_NN4)
    writeNN4Div(document.chksub, chkSubStr);
  else if (chkBrowser() == B_IE4)
      document.all.chksub.innerHTML = chkSubStr;
  else
  {
    var chksubElem = document.getElementById("chksub");
    chksubElem.innerHTML = chkSubStr;
  }

  startclock();
}

function beforeGradeAnswers()
{
  initProb();
  if (chkBrowser() == B_NN4)
  {
    nForms = document.problems.document.forms.length;
    off = 0;
	// alert('NN4 nForms = ' + nForms);
	// var fstr = '';
	// for (j=0; j<nForms; j++) {
    //   fstr += 'form#' + j + ' : ' + document.problems.document.forms[j].name + '\n';
	// }
	// alert(fstr);
  }
  else
  {
    nForms = document.forms.length;
    if (document.mathFrm.appMode[1].checked)
      off = 4;
    else
      off = 2;
	off++;		// add one for google search
  }
}

function checkAnswers($AcctName, $AcctApwd)
{
  beforeGradeAnswers();
  var nprobs = nForms - off;

  gradeAnswers();

  var cscore = document.MathControl.getScore();
  var timStr = new String(getTimeStr(t1));
  var rcode = document.MathControl.updDB($AcctName, $AcctApwd, timStr);
  window.status = 'Chk:' + rcode;
  var csperc = Math.floor(cscore * 100 / nprobs);
  setCScore('' + cscore + ' / ' + nprobs + ' (' + csperc + ' %)');
  var ctimeStr = getTimeStr((cscore > 0) ? t1 / cscore : 0);
  setCTime(ctimeStr);

  tprobs += nprobs;
  tscore += cscore;
  var tsperc = Math.floor(tscore * 100 / tprobs);
  setTScore('' + tscore + ' / ' + tprobs + ' (' + tsperc + ' %)');
  ttime  += t1;
  var ttimeStr = getTimeStr((tscore > 0) ? ttime / tscore : 0);
  setTTime(ttimeStr);

  var chkSubStr = '<body>' +
		  '<a href="#" OnClick="return false;">' +
		  '<img src="images/check-unarmed.gif" border=0 alt="Check Answers"></a>' +
		  '</body>';

  if (chkBrowser() == B_NN4)
    writeNN4Div(document.chksub, chkSubStr);
  else if (chkBrowser() == B_IE4)
      document.all.chksub.innerHTML = chkSubStr;
  else
  {
    var chksubElem = document.getElementById("chksub");
    chksubElem.innerHTML = chkSubStr;
  }
}

function submitAnswers($AcctName, $AcctApwd)
{
  beforeGradeAnswers();
  var nprobs = nForms - off;

  var teacher, hwork, needpw, passwd;
  if (chkBrowser() == B_NN4)
  {
    teacher = document.cscore.document.hworkFrm.teacher.value;
    hwork   = document.cscore.document.hworkFrm.hwork.value;
    needpw  = document.cscore.document.hworkFrm.needpass.value;
    passwd  = document.cscore.document.hworkFrm.passwd.value;
  }
  else
  {
    teacher = document.teachFrm.teacher.value;
    hwork   = document.hworkFrm.hwork.value;
    needpw  = document.hworkFrm.needpass.value;
    passwd  = document.hworkFrm.passwd.value;
  }

  var str = '';
  if (hwork == '')
    str += 'Homework#';
  if (needpw != '' && needpw != '0' && passwd == '')
  {
    if (str != '')
      str += ', ';
    str += 'Password';
  }
  if (str != '')
    alert(str + ' needed!');
  else
  {
    var str = 'Hw#' + hwork + ' NP:' + needpw + ' PW:' + passwd;
    window.status = str;

    gradeAnswers();

    var secs = (t1) / 1000;
    var timStr = "" + secs;
    var rcode = document.MathControl.submitHW($AcctName, $AcctApwd, teacher, hwork, passwd, timStr);

    if (rcode == -1)
    {
      // Netscape 6 may return a -1 here implying that we need to call getUrlRcode()
      // after a small interval to get the real rcode.
      submitHwTimerID = setTimeout("submitAnswers2()",100);
    }
    else
    {
      // We already have the correct rcode. Just do the rest of steps
      submitAnswers3(rcode);
    }
  }
}

function submitAnswers2()
{
    // Called only in Netscape 6.

    clearTimeout(submitHwTimerID);
    submitHwTimerID = null;
    var rcode = document.MathControl.getUrlRcode();
    submitAnswers3(rcode);
}

function submitAnswers3(rcode)
{
    window.status = 'Submit:' + rcode;
    var rcodeS;
    switch (rcode) {
      case 1: rcodeS = "homework submitted";      break;
      case 2: rcodeS = "Invalid homework# or level or # of problems.";    break;
      case 3: rcodeS = "Invalid account!";        break;
      case 4: rcodeS = "Invalid password!";       break;
      case 5: rcodeS = "Only one submission allowed!";    break;
      case 6: rcodeS = "No improvement over last submission.";    break;
      case 7: rcodeS = "Past due date!";          break;
      default: rcodeS = "unknown error [" + rcode + "]";         break;
    }
    alert(rcodeS);
    window.status = rcodeS;

    var chkSubStr = '<body> &nbsp;&nbsp;&nbsp;&nbsp;' +
		  '<a href="#" OnClick="return false;">' +
		  '<img src="images/submit-unarmed.gif" border=0 alt="Submit Answers"></a>' +
		  '</body>';

    if (chkBrowser() == B_NN4)
      writeNN4Div(document.chksub, chkSubStr);
    else if (chkBrowser() == B_IE4)
      document.all.chksub.innerHTML = chkSubStr;
    else
    {
      var chksubElem = document.getElementById("chksub");
      chksubElem.innerHTML = chkSubStr;
    }
}

function gradeAnswers()
{
  var ansStrs = new Array(nForms);
  var chkCode = new Array(nForms);
  for (j=off; j<nForms; j++)
  {
    if (chkBrowser() == B_NN4)
    {
      frm = document.problems.document.forms[j];
      // test1(j);
    }
    else
      frm = document.forms[j];
    var vals = new Array(frm.elements.length);
    for (i=0; i<frm.elements.length; i++)
    {
      aval = getVal(frm, i);
      // aval = frm.elements[i].value;
      document.MathControl.setUserSval(i, aval);
      if (aval == '' || isNaN(aval))
        document.MathControl.setUserVal(i, INVALID);
      else {
        fval = parseFloat(aval);
        if (isNaN(fval))
          document.MathControl.setUserVal(i, INVALID);
        else {
          nval = parseInt(aval);
          document.MathControl.setUserVal(i, nval); 
        }
      }
    }
    chkCode[j] = document.MathControl.doCheck();
    ansStrs[j] = document.MathControl.getAnswer();
  }

  var ncols  = parseInt(document.ctrlFrm.ncols.value);
  var str = htmlPre();
  for (j=off; j<nForms;)
  {
    str += '<td>' + ansStrs[j] + '</td>';
    ++j;
    if ((j-off)%ncols == 0)
      str += '</tr>\n<tr>';
  }
  str += htmlPost();
  writeProbSpan(str, getProbLevel(), 2);
  stopclock();
}

function initNumCols(val) {
  switch (val) {
    case  6: // Word Addition 1
    case  7: // Word Addition 2
    case 12: // Word Subtraction 1
    case 13: // Word Subtraction 2
    case 16: // Word Multiplication
    case 20: // Word Division
    case 35: // Mixed Word Problems
    case 40: // Word Fraction Problems
    case 53: // Linear Eq Word Problems
    case 54: // Expanded numbers
    case 76: // Word Percent
    case 81: // Word Addition (Extra Info)
    case 82: // Word Subtraction (Extra)
    case 83: // Word Multiplication (Extra)
    case 84: // Word Division (Extra Info)
      document.ctrlFrm.ncols.value = '1';
      break;
    case 23: // Identify Fractions
    case 48: // Algebraic Expressions 1
    case 49: // Algebraic Expressions 2
    case 50: // Linear Equations 1
    case 51: // Linear Equations 2
    case 52: // Linear Equations 3
    case 55: // Standard Numbers
    case 56: // Number Position/Value
    case 57: // Number to Word
    case 58: // Word to Number
    case 59: // Clock with Numbers
    case 60: // Clock without Numbers
    case 61: // Clock Add/Sub
    case 62: // Time Add/Sub
    case 65: // RoundNum
    case 66: // GeomPeriGrid
    case 67: // GeomPeri
    case 68: // GeomAreaGrid
    case 69: // GeomArea
    case 70: // Triangle
    case 71: // Simple Algebra
      document.ctrlFrm.ncols.value = '2';
      break;
    case 47: // Decimal Division 2
      document.ctrlFrm.ncols.value = '3';
      break;
    default:
      document.ctrlFrm.ncols.value = '4';
      break;
  }
}

function showHelpBtn(val)
{
    var chkBrw = chkBrowser();

    // This is the DIV body that displays a help image and displays helpStr on mouseover.
    var helpDivStr = '';

    // This contains a little help string for a specific level.
	var helpStr = '';

	var mouseOverStr = '';

    switch (val) {
      case 21: // Long Division 1
      case 22: // Long Division 2
	    helpStr = longDivHelpStr;
        break;
      case 34: // Numerals and Fractions
	    helpStr = mixFracHelpStr;
        break;
      default:
        helpStr = GenericHelpStr;
        break;
    }

    switch (val) {
      case 17: // Multiplication 2x1
      case 18: // Multiplication 2x2
      case 21: // Long Division 1
      case 22: // Long Division 2
      case 23: // Identify Fraction
      case 24: // Order Fractions 1
      case 25: // Order Fractions 2
      case 26: // Equivalent Fractions
      case 27: // Decimals vs Fractions 1
      case 28: // Decimals vs Fractions 2
      case 29: // Add Fractions 1
      case 30: // Add Fractions 2
      case 31: // Add Fractions 3
      case 32: // Subtract Fractions 1
      case 33: // Subtract Fractions 2
      case 34: // Numerals and Fractions
      // case 35: // Mixed Word Problems
      case 36: // Multiply Fractions 1
      case 37: // Multiply Fractions 2
      case 38: // Divide Fractions 1
      case 39: // Divide Fractions 2
      case 41: // Compare Decimals
      case 42: // Decimal Addition
      case 43: // Decimal Subtraction
      case 44: // Decimal Multiplication1
      case 45: // Decimal Multiplication2
      case 46: // Decimal Division1
      case 47: // Decimal Division2
      case 59: // Clock with Numbers
      case 60: // Clock without Numbers
      case 61: // Clock Add/Subtract
      case 62: // Time  Add/Subtract
      case 63: // LCM Least Common Multiple
      case 64: // GCF Greatest Common Factor
      case 65: // Round Up Numbers
      // case 70: // Triangles
      case 71: // Simple Algebra
	  case 72: // Simple Percent
	  case 73: // Fraction as Percent
	  case 74: // Decimal as Percent
	  case 75: // Percent of Number
        // show help button as help IS available
        mouseOverStr = "return overlib('" + helpStr + "');";
        helpDivStr = '<a href="#" onmouseover="' + mouseOverStr + '" onmouseout="return nd();">' +
		             '<img src="images/explain.gif" border=0></a>&nbsp;&nbsp;';
        break;
      default:
        // hide help button as help is NOT yet available for these levels.
        break;
    }

    if (chkBrw == B_NN4)
      writeNN4Div(document.hlpdv, helpDivStr);
    else if (chkBrw == B_IE4)
      document.all.hlpdv.innerHTML = helpDivStr;
    else
    {
      var helpDivElem = document.getElementById("hlpdv");
      helpDivElem.innerHTML = helpDivStr;
    }
}

function selectLevel(sel, platform, $AcctName, $AcctApwd) {
  var ix=sel.selectedIndex;
  window.status = 'selectLevel:';
  if (ix == -1 || isNaN(ix))
    ix = 0;
  var txt=sel.options[ix].text;  
  var ixArr = txt.split(":");
  var val = parseInt(ixArr[0]);
  initNumCols(val);
  showHelpBtn(val);    // show the help button if help is available for this level
  moreProblems(platform, $AcctName, $AcctApwd, val);
}

function doNothing(txtfield) {
   txtfield.value = 1;
}

function increment(txtfield) {
   var val = parseInt(txtfield.value);
   txtfield.value = val + 1 ;
}

function decrement(txtfield) {
   var val = parseInt(txtfield.value);
   if (val > 1)
      txtfield.value = val - 1;
}

function chkMin(txtfield, min) {
   var val = parseInt(txtfield.value);
   if (val < min)
      txtfield.value = min;
}

function chkBrowser() {
  switch(navigator.family)
  {
  case 'nn4':
    return B_NN4;
    break;

  case 'ie4':
    // IE 4/5 code fork...
    if (navigator.version >= 6)
    {
      // IE 6.0+
      return B_STAN;
    }
    else if (navigator.version >= 5.5)
    {
      // IE 5.5
      return B_IE4;
    }
    else if (navigator.version >= 5)
    {
      // IE 5.x
      return B_IE4;
    }
    else
    {
      // IE 4.x
      return B_IE4;
    }
    break;

  case 'gecko':
    // Standards Compliant code fork...
    if (navigator.org == 'netscape')
    {
      // Netscape 6.x and higher
      return B_STAN;
    }
    else if (navigator.org == 'mozilla')
    {
      // Mozilla browsers
      return B_STAN;
    }
    else
    {
      // other Mozilla based browsers
      return B_STAN;
    }
    break;
  }
}
