function GetInt(Wert) {
   var num=0;
   num = parseInt(Wert);
   if (isNaN(num) == true) num = 0;
   if(num < 0) alert("Bitte verwenden Sie nur Zahlen größer als Null!");
   return num;
}


function GetFloat(Wert) {
   var lensep, lentot, mant, num;
   var digi=0, dezi=0;

   Wert = Wert.toLowerCase();

   /* check separator */
   lensep = Wert.indexOf(",");
   if (lensep > -1) {
     lentot = Wert.length;
     mant = parseInt(Wert);
     dezi = Wert.substring(lensep+1,lentot);
     digi = lentot-lensep-1;
     num = mant + dezi/Math.pow(10., digi);
   }
   else if (Wert.indexOf("ma") > -1) num = 42.195;
   else if (Wert.indexOf("half") > -1) num = 21.0975;
   else if (Wert.indexOf("halb") > -1) num = 21.0975;
   else if (Wert.indexOf("hm") > -1) num = 21.0975;
   else num = parseFloat(Wert);
   if(num < 0) alert("Bitte keine negativen Zahlen verwenden!");
   return num;
}

function Auswertung() {
  var faktor1, faktor2, det, K = 0, lnK, eps = 0, xlg, tlg, maxdata = 7;
  var mint0, hzeit0, mzeit0, szeit0, weight, chi2, errmint0, errK, erreps;
  var sum = 0, sumx = 0, sumt = 0, sumx2 = 0, sumxt = 0, sumt2 = 0, pace0 = 0;

  hzeit = new Array(maxdata);
  mzeit = new Array(maxdata);
  szeit = new Array(maxdata);
  dist = new Array(maxdata);

  with (document.forms[0]) {
    dist0 = GetFloat(strecke0.value);
    if(isNaN(dist0) == true || dist0 <= 0) {
      alert("Bitte geben Sie eine gültige Zieldistanz an!");
      strecke0.focus();
      return;
	  //break;
    }
    hzeit[0] = GetInt(hzeit1.value);
    mzeit[0] = GetInt(mzeit1.value);
    szeit[0] = GetInt(szeit1.value);
    dist[0] = GetFloat(strecke1.value);
    hzeit[1] = GetInt(hzeit2.value);
    mzeit[1] = GetInt(mzeit2.value);
    szeit[1] = GetInt(szeit2.value);
    dist[1] = GetFloat(strecke2.value);
    hzeit[2] = GetInt(hzeit3.value);
    mzeit[2] = GetInt(mzeit3.value);
    szeit[2] = GetInt(szeit3.value);
    dist[2] = GetFloat(strecke3.value);
    hzeit[3] = GetInt(hzeit4.value);
    mzeit[3] = GetInt(mzeit4.value);
    szeit[3] = GetInt(szeit4.value);
    dist[3] = GetFloat(strecke4.value);
    hzeit[4] = GetInt(hzeit5.value);
    mzeit[4] = GetInt(mzeit5.value);
    szeit[4] = GetInt(szeit5.value);
    dist[4] = GetFloat(strecke5.value);
    hzeit[5] = GetInt(hzeit6.value);
    mzeit[5] = GetInt(mzeit6.value);
    szeit[5] = GetInt(szeit6.value);
    dist[5] = GetFloat(strecke6.value);
    hzeit[6] = GetInt(hzeit7.value);
    mzeit[6] = GetInt(mzeit7.value);
    szeit[6] = GetInt(szeit7.value);
    dist[6] = GetFloat(strecke7.value);

    K = GetFloat(konstante.value);
    eps = GetFloat(epsilon.value);

    /* time in minutes */
    mint = new Array(maxdata);

    /* evaluate the sums */
    ionly = 0;
    sum = 0; sumx = 0; sumt = 0; sumx2 = 0; sumxt = 0; sumt2 = 0;
    for (i=0; i < maxdata; i++) {
      mint[i] = 60*hzeit[i] + mzeit[i] + szeit[i]/60;
      if(isNaN(dist[i]) != true && dist[i] > 0) {
        //if(mint[i] == 0) alert("Zero Time!?!");
        xlg = Math.log(dist[i]);
        tlg = Math.log(mint[i]);
        sum++;
        sumx = sumx + xlg;
        sumt = sumt + tlg;
        sumx2 = sumx2 + xlg * xlg;
        sumt2 = sumt2 + tlg * tlg;
        sumxt = sumxt + tlg * xlg;
        /* just one value, which one? */
        ionly = i;
      }
    }

    /* evaluate the constants */
    if(sum > 1) {
      faktor1 = sum * sumxt - sumx * sumt;
      faktor2 = sumx2 * sumt - sumx * sumxt;
      det = sum * sumx2 - sumx * sumx;
      //if(det == 0) alert("Not enough or incompatible data points!");
      eps = faktor1 / det;
      lnK = faktor2 / det;
      K = Math.exp(lnK);
    } else if(sum == 1) {
      /* Parameter eps according to World Record Data or already given */
       if(isNaN(eps) == true || eps <= 0.) eps = 1.0759;
       K = mint[ionly] / Math.pow( dist[ionly] , eps ) ;
    } else {
      alert("Sie müssen wenigstens eine Referenzstrecke angeben!");
      strecke1.focus();
    }
    if(eps < 1) alert("Sie laufen mit zunehmender Distanz schneller.");

    /* now predict the time and its error */
    mint0 = K * Math.pow( dist0 , eps );
    if (dist0 > 0) pace0 = mint0 / dist0;

    /* average deviaton of data points from function ist sqrt(chi2/ndf) if weight=1/errors=1 !*/
    if(sum > 2) {
      chi2 = (sumt2 - lnK * sumt - eps * sumxt ) / (sum - 2);
      /* renormalize errors, so that chi2/ndf becomes 1 !!!*/
      weight = 1 / chi2;
      xlg = Math.log(dist0);
      errmint0 = Math.sqrt( (sumx2 - 2 * xlg * sumx + xlg * xlg * sum) / det / weight ) * mint0;
      errK = Math.sqrt( sumx2 / det / weight ) * K;
      erreps = Math.sqrt( sum / det / weight );
      /* BUT: Correlation between parameters will decrease errors !!! correpsK = ? */
    } else {
      chi2 = 0.;
      errmint0 = 0.;
    }

    /* convert time to HMS format */
    hzeit0 = (mint0 - ( mint0 % 60 )) / 60;
    mzeit0 = Math.floor( mint0 % 60 );
    szeit0 = Math.round((( mint0 % 60 ) - Math.floor( mint0 % 60 )) * 60 );
    if (szeit0 > 59) { szeit0 = szeit0 - 60; mzeit0 = mzeit0 + 1 }
    if (mzeit0 > 59) { mzeit0 = mzeit0 - 60; hzeit0 = hzeit0 + 1 }
    if (szeit0 < 10) szeit0 = "0" + szeit0;
    if (mzeit0 < 10) mzeit0 = "0" + mzeit0;
    if (hzeit0 < 10) hzeit0 = "0" + hzeit0;

    mpace0 = Math.floor( pace0 % 60 );
    space0 = Math.round((( pace0 % 60 ) - Math.floor( pace0 % 60 )) * 60 );
    if (space0 > 59) { space0 = space0 - 60; mpace0 = mpace0 + 1 }
    if (mpace0 > 59) { mpace0 = mpace0 - 60; hpace0 = hpace0 + 1 }
    if (space0 < 10) space0 = "0" + space0;
    if (mpace0 < 10) mpace0 = "0" + mpace0;

    /* output variables (rounded & leading zero added) */
    zeit.value = hzeit0 + ":" + mzeit0 + ":" + szeit0;
    error.value = Math.round(errmint0*1000)/1000;
    pace.value = mpace0 + ":" + space0;
    konstante.value = Math.round(K*1000)/1000;
    epsilon.value = Math.round(eps*10000)/10000;
    abweichung.value = Math.round( Math.sqrt( chi2 )*10000)/100;
    /*
    #Dkonstante.value = errK;
    #Depsilon.value =  erreps;
    */
    if (error.value > .1 && error.value < 1) error.value = "0" + error.value;
    if (konstante.value > .1 && konstante.value < 1) konstante.value = "0" + konstante.value;
    if (epsilon.value > .1 && epsilon.value < 1) epsilon.value = "0" + epsilon.value;
    if (abweichung.value > .1 && abweichung.value < 1) abweichung.value = "0" + abweichung.value;
  }
}


function Delete() {
  with (document.forms[0]) {
    strecke0.value = "";
    strecke1.value = "";
    strecke2.value = "";
    strecke3.value = "";
    strecke4.value = "";
    strecke5.value = "";
    strecke6.value = "";
    strecke7.value = "";
        
    hzeit1.value = "";
    hzeit2.value = "";
    hzeit3.value = "";
    hzeit4.value = "";
    hzeit5.value = "";
    hzeit6.value = "";
    hzeit7.value = "";
        
    mzeit1.value = "";
    mzeit2.value = "";
    mzeit3.value = "";
    mzeit4.value = "";
    mzeit5.value = "";
    mzeit6.value = "";
    mzeit7.value = "";
        
    szeit1.value = "";
    szeit2.value = "";
    szeit3.value = "";
    szeit4.value = "";
    szeit5.value = "";
    szeit6.value = "";
    szeit7.value = "";
        
    zeit.value = "";
    error.value = "";
    pace.value = "";
    konstante.value = "";
    epsilon.value = "";
    abweichung.value = "";
  }
}

function Weltrekord() {
  with (document.forms[0]) {
    strecke0.value = 100;
    strecke1.value = 1.5; hzeit1.value = 0; mzeit1.value = 3;  szeit1.value = 26;
    strecke2.value = 3;   hzeit2.value = 0; mzeit2.value = 7;  szeit2.value = 21;
    strecke3.value = 5;   hzeit3.value = 0; mzeit3.value = 12; szeit3.value = 39;
    strecke4.value = 10;  hzeit4.value = 0; mzeit4.value = 26; szeit4.value = 23;
    strecke5.value = 21.0975; hzeit5.value = 0; mzeit5.value = 59; szeit5.value = 5;
    strecke6.value = 42.195; hzeit6.value = 2; mzeit6.value = 4; szeit6.value = 55;
    Auswertung();
  }
}