<!--Define JavaScript functions.-->

function sign(y){
 return ((y < 0) ? -1 : 1);
}  //End of function sign.

function f(par1, par2, par3, tm, Per){
 var dummy = 2*Math.PI*tm/Per;
 var cM = Math.cos(dummy), sM = Math.sin(dummy);
 return (par1 + par2*cM)*cM*sM*sM + par3;
}//End of function f

function f1Zero(dataForm){
var b = parseFloat(dataForm.b.value);
var c = parseFloat(dataForm.c.value);
var T = parseFloat(dataForm.Period.value);
var k1 = parseFloat(dataForm.a1.value);
var k2 = parseFloat(dataForm.a2.value);
var k3 = parseFloat(dataForm.a3.value);

if ((k3 == 0) && ((k1 != 0) || (k2 != 0)))
 alert("The function has roots whenever M = m*pi/2, where m is a non-zero integer. The time corresponding to the input   interval will be calculated.");

if ((k1 == 0) && (k2 == 0) && (k3 != 0)){
 alert("The function is a constant straight line; it does not have any roots. No further action taken.");
 return;
}

var z = (c + b)/2;
var fz = f(k1, k2, k3, z, T);
var fc = fz, t = b, kount = 2;
var fb = f(k1, k2, k3, b, T);

if (fb == 0){
 dataForm.t.value = b;
 dataForm.erCode.value = 2;
 dataForm.funcEval.value = kount;
 return;
}

if (fz == 0){
 dataForm.t.value = z;
 dataForm.erCode.value = 2;
 dataForm.funcEval.value = kount;
 return;
}

if (sign(fz) == sign(fb))
{t = c;
 fc = f(k1, k2, k3, c, T);
 kount = 3;

 if (fc == 0){
  dataForm.t.value = c;
  dataForm.erCode.value = 2;
  dataForm.funcEval.value = kount;
  return;
 }

 if (sign(fz) != sign(fc))
 {b = z;
  fb = fz;
 }  //End if sign(fz) != sign(fc).
 else {//Sign is the same on this interval as well; no zero on input interval
  alert("The function does not change sign over the input interval. Please select another interval. No further action         taken.");
  return;
 }//End else if sign(fc) == sign(fz)
}  //End if sign(fz) == sign(fb).
else c = z;

var a = c, fa = fc, acmb, ic = 0, tol, p, q, acbs = Math.abs(-b + c), MAXIT = 200, ae, cmb;

acmb = 1.0;
do {
  ae = acmb;
  acmb /= 2.0;
  cmb = 1.0 + acmb;
} while (cmb > 1.0);
// At this point, ae should equal the machine epsilon
dataForm.epmch.value = ae;

do {
 if (Math.abs(fc) < Math.abs(fb))  //Interchange if necessary.
 {a = b;
  fa = fb;
  b = c;
  fb = fc;
  c = a;
  fc = fa
 }  //End if abs(fc) < abs(fb)
 cmb = (-b + c)/2;
 acmb = Math.abs(cmb);
 tol = Math.abs(b);
 tol++;
 tol *= ae;

 if (acmb <= tol)
 {dataForm.erCode.value = 1;
  break;
 }  //End if acmb <= tol.

 if (fb == 0)
 {dataForm.erCode.value = 2;
  break;
 }  //End if fb == 0.

/* Calculate new iterate implicitly as b + p/q, where p is arranged to be >= 0. This implicit form is used to prevent overflow. */

 p = (-a + b)*fb;
 q = -fb + fa;
 if (p < 0)
 {p = -p;
  q = -q;
 }  //End if p < 0.

/* Update a and check for satisfactory reduction in the size of the bracketing interval. If not, perform bisection. */

 a = b;
 fa = fb;
 ic++;

 if ((ic >= 4) && (8*acmb >= acbs))
  b = (c + b)/2;  //Use bisection
 else
 {if (ic >= 4)
  {ic = 0;
   acbs = acmb;
  }  //End if ic >= 4
  if (p <= tol*Math.abs(q))  //Test for too small a change
   b += tol*sign(cmb);
  else    //Root between b and (b + c)/2
  {if (p < cmb*q)  //Use secant rule
    b += p/q;
   else            //Use bisection
    b = (c + b)/2;
  }  //End else
 }  //End else.

// Have now computed new iterate, b.

 fb = f(k1, k2, k3, b, T);
 kount++;

 if (fb == 0){
  dataForm.t.value = b;
  dataForm.erCode.value = 2;
  dataForm.funcEval.value = kount;
  return;
 }

//Decide if next step interpolation or extrapolation

 if (sign(fb) == sign(fc))
 {c = a;
  fc = fa;
 }  //End sign(fb) == sign(fc).

} while (kount < MAXIT); //End do-while loop
if (kount >= MAXIT) dataForm.erCode.value = 3;

dataForm.t.value = b;
dataForm.funcEval.value = kount;

return;
}  //End of f1Zero

// end of JavaScript function definitions -->