<!--Define JavaScript functions.-->

function numInt1(dataForm){
var a = parseFloat(dataForm.b.value);
var b = parseFloat(dataForm.c.value);

if (a == b){
 dataForm.defInt.value = dataForm.funcEval.value = dataForm.erCode.value = dataForm.eVal.value = 0;
 return;
}

var c, iroff = 0, kf = 30, loc, nint = 1, mxtry = NMAX/2;
var e, eb, erReq = 1.0e-12, fmin, fmax, r, rabs, t, te, te1, te2, tr, tr1, tr2, xm;

var w = new Array(NMAX);
for (var i = 0; i < NMAX; i++) {
 w[i] = new Array(6);
 w[i][2] = 0.0;
} // End for i loop

eb = 1.0;
do {
  e = eb;
  eb /= 2.0;
  r = 1.0 + eb;
} while (r > 1.0);
// At this point, e should equal the machine epsilon

if (Math.abs((-a + b)%(2*Math.PI)) <= e){
 dataForm.defInt.value = dataForm.funcEval.value = dataForm.erCode.value = dataForm.eVal.value = 0;
 return;
}

var qPar = new Object();
qPar.fx = qPar.fm = qPar.rasc = qPar.ra = qPar.ae = qPar.q = 0.0;
qPar.epsMch = e;

w[1][4] = w[0][4] = w[0][0] = a;
w[1][5] = w[0][5] = w[1][1] = b;

// Select first subdivision randomly. 0.618 is golden section, so use it.
w[1][0] = w[0][1] = 0.382*a + 0.618*b;

gl15t(a, w[0][1], a, b, qPar);
r = w[0][3] = qPar.q;  e = w[0][2] = qPar.ae;
rabs = qPar.ra;  fmin = qPar.fm;  fmax = qPar.fx;

gl15t(w[1][0], b, a, b, qPar);
w[1][3] = qPar.q;
r += w[1][3];
w[1][2] = qPar.ae;
e += w[1][2];
rabs += qPar.ra;

fmax = Math.max(fmax, qPar.fx);
fmin = Math.min(fmin , qPar.fm);

t = 100.0*qPar.epsMch*rabs;

for (var i = 0; i < 2*NMAX; i++){

 if ((t >= Math.abs(r))  && (e < erReq)) break;

 eb = Math.abs(r)*Math.max(erReq, (50.0*qPar.epsMch));
 eb = Math.max(eb, 100.0*Number.MIN_VALUE);

 if (e <= eb) break;

 if (nint < (NMAX - 1))  c = ++nint;
 else  {
  c = -1;
  do{
   if ((mxtry <= 0) || (c == (NMAX - 1))) {
    dataForm.erCode.value = 5;
    dataForm.defInt.value = dataForm.eVal.value = "N/A";
    dataForm.funcEval.value = kf;
    return;
   }
   c++;
  } while (w[c][2] > 0.0);
//Found an interval to throw out.
  mxtry--;
 } // End else nint >= (NMAX - 1)

 loc = isamax(w, nint);

 xm = w[loc][0] + (-w[loc][0] + w[loc][1])/2;

 if (Math.max(Math.abs(w[loc][0]), Math.abs(w[loc][1])) > (1.0 + 100.0*qPar.epsMch)*(Math.abs(xm) + 1000.0*Number.MIN_VALUE)) {
  gl15t(w[loc][0], xm, w[loc][4], w[loc][5], qPar);
  tr1 = qPar.q; te1 = qPar.ae;
  fmin = Math.min(fmin, qPar.fm);
  fmax = Math.max(fmax, qPar.fx);

  if (te1 < eb*(-w[loc][0] + xm)/(-a + b))
   te1 = -te1;

  gl15t(xm, w[loc][1], w[loc][4], w[loc][5], qPar);
  tr2 = qPar.q; te2 = qPar.ae;
  kf += 30;

  fmin = Math.min(fmin, qPar.fm);
  fmax = Math.max(fmax, qPar.fx);

  if (te2 < eb*(-xm + w[loc][1])/(-a + b))
   te2 = -te2;

  te = Math.abs(w[loc][2]);
  tr = w[loc][3];
  w[c][2] = te2; w[c][3] = tr2; w[c][0] = xm;

  w[c][1] = w[loc][1]; w[c][4] = w[loc][4];
  w[c][5] = w[loc][5]; w[loc][2] = te1;
  w[loc][3] = tr1; w[loc][1] = xm;

  e += -te + Math.abs(te1) + Math.abs(te2);
  r += -tr + tr1 + tr2;

  if (Math.abs(-te + Math.abs(te1) + Math.abs(te2)) < 0.001*te) {
   iroff++;
   if (iroff >= 10) {
    dataForm.erCode.value = 4;
    dataForm.funcEval.value = kf;
    dataForm.defInt.value = dataForm.eVal.value = "N/A";
    return;
   } //End if (iroff >= 10)
  }//End if (Math.abs(Math.abs(te1) + Math.abs(te2) - te) < 0.001*te)
 } //End if max
 else {
  if (eb > w[loc][2]) 
   w[loc][2] = 0;
  else { 
   dataForm.erCode.value = 6;
   dataForm.funcEval.value = kf;
   dataForm.defInt.value = dataForm.eVal.value = "N/A";
   return;
  } //End else.
 }       // End else.

}//End for i loop

if (i >= 2*NMAX){
 dataForm.erCode.value = 7;
 dataForm.funcEval.value = kf;
 dataForm.defInt.value = dataForm.eVal.value = "N/A";
 return;
}

dataForm.funcEval.value = kf;
dataForm.erCode.value = 3;
dataForm.defInt.value = r;
dataForm.eVal.value = e;

t = erReq*Math.abs(r);
if ((e > erReq) && (e > t))    return;
dataForm.erCode.value = 2;
if ((e > erReq) && (e < t))    return;
dataForm.erCode.value = 1;
if ((e < erReq) && (e > t))    return;
dataForm.erCode.value = 0;

return;
}  //End of numInt1

// end of JavaScript function definitions -->
